diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /lib/kofficecore/KoDocument.h | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'lib/kofficecore/KoDocument.h')
-rw-r--r-- | lib/kofficecore/KoDocument.h | 1158 |
1 files changed, 1158 insertions, 0 deletions
diff --git a/lib/kofficecore/KoDocument.h b/lib/kofficecore/KoDocument.h new file mode 100644 index 00000000..1e8f1f83 --- /dev/null +++ b/lib/kofficecore/KoDocument.h @@ -0,0 +1,1158 @@ +// -*- c-basic-offset: 4 -*- +/* This file is part of the KDE project + Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> + Copyright (C) 2000-2005 David Faure <faure@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#ifndef __ko_document_h__ +#define __ko_document_h__ + +class KoTextDocument; +namespace std { } +using namespace std; +#include <qwmatrix.h> + +#include <kparts/part.h> +#include <kurl.h> +#include <kservice.h> +#include <KoGlobal.h> +#include <KoUnit.h> +#include <KoPageLayout.h> +#include <koffice_export.h> + +class QDomElement; +class QDomDocument; +class QXmlSimpleReader; + +class KoStore; +class KoMainWindow; + +class KoChild; +class KoDocumentChild; +class KoView; +class KoDocumentInfo; +class DCOPObject; +class KoOasisStyles; +class KoXmlWriter; +class KoOpenPane; + +/** + * The %KOffice document class + * + * This class provides some functionality each %KOffice document should have. + * + * @short The %KOffice document class + */ +class KOFFICECORE_EXPORT KoDocument : public KParts::ReadWritePart +{ + Q_OBJECT + Q_PROPERTY( QCString dcopObjectId READ dcopObjectId) + Q_PROPERTY( bool backupFile READ backupFile WRITE setBackupFile ) + +public: + + /** + * Constructor. + * The first 4 arguments are the same as the ones passed to KParts::Factory::createPart. + * + * @param parentWidget the parent widget, in case we create a wrapper widget + * (in single view mode). + * Usually the first argument passed by KParts::Factory::createPart. + * @param widgetName name of the widget. + * @param parent may be another KoDocument, or anything else. + * Usually the third argument of KParts::Factory::createPart. + * @param name is used to identify this document via DCOP so you may want to + * pass a meaningful name here which matches the pattern [A-Za-z_][A-Za-z_0-9]*. + * @param singleViewMode determines whether the document may only have one view. In this case + * the @p parent must be a QWidget derived class. KoDocument will then create a wrapper widget + * (KoViewWrapperWidget) which is a child of @p parentWidget. + * This widget can be retrieved by calling widget(). + * + * @todo explain what the purpose of widgetName is. + */ + KoDocument( QWidget* parentWidget, + const char* widgetName, + QObject* parent, + const char* name, + bool singleViewMode = false ); + + /** + * Destructor. + * + * The destructor does not delete any attached KoView objects and it does not + * delete the attached widget as returned by widget(). + */ + virtual ~KoDocument(); + + /** + * Tells whether this document is in singleview mode. This mode can only be set + * in the constructor. + */ + bool isSingleViewMode() const; + + /** + * Is the document embedded? + */ + bool isEmbedded() const; + + /** + * Returns the action described action object. In fact only the "name" attribute + * of @p element is of interest here. The method searches first in the + * KActionCollection of the first view and then in the KActionCollection of this + * document. + * This allows %KOffice applications to define actions in both the view and the document. + * They should only define view-actions (like zooming and stuff) in the view. + * Every action which changes the document should be defined in the document. + * + * Please notice that KoDocument indirectly inherits KXMLGUIClient. + * + * @see KXMLGUIClient + * @see KXMLGUIClient::actionCollection + * @see KoView::action + */ + virtual KAction *action( const QDomElement &element ) const; + + /** + * Returns the DOM document which describes the GUI of the + * first view. + */ + virtual QDomDocument domDocument() const; + + /** + * @internal + */ + virtual void setManager( KParts::PartManager *manager ); + + /** + * Reimplemented from KParts::ReadWritePart for internal reasons + * (for the autosave functionality) + */ + virtual bool openURL( const KURL & url ); + + /** + * Opens the document given by @p url, without storing the URL + * in the KoDocument. + * Call this instead of openURL() to implement KoMainWindow's + * File --> Import feature. + * + * @note This will call openURL(). To differentiate this from an ordinary + * Open operation (in any reimplementation of openURL() or openFile()) + * call isImporting(). + */ + bool import( const KURL &url ); + + /** + * Saves the document as @p url without changing the state of the + * KoDocument (URL, modified flag etc.). Call this instead of + * KParts::ReadWritePart::saveAs() to implement KoMainWindow's + * File --> Export feature. + * + * @note This will call KoDocument::saveAs(). To differentiate this + * from an ordinary Save operation (in any reimplementation of + * saveFile()) call isExporting(). + */ + bool exp0rt( const KURL &url ); + + /** + * @brief Sets whether the document can be edited or is read only. + * + * This recursively applied to all child documents and + * KoView::updateReadWrite is called for every attached + * view. + */ + virtual void setReadWrite( bool readwrite = true ); + + /** + * @brief Used by KoApplication, and by KoMainWindow, when no document exists yet. + * + * With the help of @p instance or KApplication::instance() this + * method figures out which .desktop file matches this application. In this + * file it searches for the "X-KDE-NativeMimeType" entry and returns it. + * + * @see KService + * @see KDesktopFile + */ + static QCString readNativeFormatMimeType( KInstance *instance = 0 ); + + /** + * Used by KoMainWindow, when no document exists yet. + * + * With the help of @p instance or KApplication::instance() this + * method figures out which .desktop file matches this application. In this + * file it searches for the "X-KDE-ExtraNativeMimeTypes" entry and returns it. + * + * @see KService + * @see KDesktopFile + */ + static QStringList readExtraNativeMimeTypes( KInstance *instance = 0 ); + + /** + * With the help of @p instance or KApplication::instance() this + * method figures out which .desktop file matches this application, + * and returns the KService instance for it. + */ + static KService::Ptr readNativeService( KInstance *instance = 0 ); + + /** + * setup the XML reader, so that we don't have to duplicate the code. + */ + static void setupXmlReader( QXmlSimpleReader& reader, bool namespaceProcessing = false ); + + /** + * To be preferred when a document exists. It is fast when calling + * it multiple times since it caches the result that readNativeFormatMimeType() + * delivers. + * This comes from the X-KDE-NativeMimeType key in the .desktop file + * You do NOT have to reimplement this (it is only virtual for kounavail). + */ + virtual QCString nativeFormatMimeType() const; + + /** + * Returns the OASIS OpenDocument mimetype of the document, if supported + * This comes from the X-KDE-NativeOasisMimeType key in the .desktop file + */ + QCString nativeOasisMimeType() const; + + /// Checks whether a given mimetype can be handled natively. + bool isNativeFormat( const QCString& mimetype ) const; + + /// Returns a list of the mimetypes considered "native", i.e. which can + /// be saved by KoDocument without a filter, in *addition* to the main one + virtual QStringList extraNativeMimeTypes() const; + + /// Enum values used by specialOutputFlag - note that it's a bitfield for supportedSpecialFormats + enum { /*SaveAsKOffice1dot1 = 1,*/ // old and removed + SaveAsDirectoryStore = 2, + SaveAsFlatXML = 4 + // bitfield! next value is 8 + }; + + /** + * Return the set of SupportedSpecialFormats that the application wants to + * offer in the "Save" file dialog. + */ + virtual int supportedSpecialFormats() const; + + /** + * Returns the actual mimetype of the document + */ + QCString mimeType() const; + + /** + * @brief Sets the mime type for the document. + * + * When choosing "save as" this is also the mime type + * selected by default. + */ + void setMimeType( const QCString & mimeType ); + + /** + * @brief Set the format in which the document should be saved. + * + * This is called on loading, and in "save as", so you shouldn't + * have to call it. + * + * @param mimeType the mime type (format) to use. + * @param specialOutputFlag is for "save as older version" etc. + */ + void setOutputMimeType( const QCString & mimeType, int specialOutputFlag = 0 ); + QCString outputMimeType() const; + int specialOutputFlag() const; + + /** + * Returns true if this document was the result of opening a foreign + * file format and if the user hasn't yet saved the document (in any + * format). + * + * Used by KoMainWindow to warn the user when s/he lazily presses + * CTRL+S to save in the same foreign format, putting all his/her + * formatting at risk (normally an export confirmation only comes up + * with Save As). + * + * @param exporting specifies whether this is the setting for a + * File --> Export or File --> Save/Save As operation. + */ + bool confirmNonNativeSave( const bool exporting ) const; + void setConfirmNonNativeSave( const bool exporting, const bool on ); + + virtual bool wantExportConfirmation() const; + + /** + * Sets the error message to be shown to the user (use i18n()!) + * when loading or saving fails. + * If you asked the user about something and he chose "Cancel", + * set the message to the magic string "USER_CANCELED", to skip the error dialog. + */ + void setErrorMessage( const QString& errMsg ); + + /** + * Return the last error message. Usually KoDocument takes care of + * showing it; this method is mostly provided for non-interactive use. + * @since 1.4 + */ + QString errorMessage() const; + + /** + * Show the last error message in a message box. + * The dialog box will mention a saving problem. + * Note that save/saveFile takes care of doing it. + * @since 1.4 + */ + void showSavingErrorDialog(); + + /** + * Show the last error message in a message box. + * The dialog box will mention a loading problem. + * openURL/openFile takes care of doing it, but not loadNativeFormat itself, + * so this is often called after loadNativeFormat returned false. + * @since 1.4 + */ + void showLoadingErrorDialog(); + + /** + * Create a new view for the document. + */ + KoView *createView( QWidget *parent = 0, const char *name = 0 ); + + /** + * Adds a view to the document. + * + * This calls KoView::updateReadWrite to tell the new view + * whether the document is readonly or not. + */ + virtual void addView( KoView *view ); + + /** + * Removes a view of the document. + */ + virtual void removeView( KoView *view ); + + /** + * @return a list of views this document is displayed in + */ + const QPtrList<KoView> & views() const; + + /** + * @return number of views this document is displayed in + */ + int viewCount() const; + + /** + * Reimplemented from KParts::Part + */ + virtual KParts::Part *hitTest( QWidget *widget, const QPoint &globalPos ); + + /** + * Find the most nested child document which contains the + * requested point. The point is in the coordinate system + * of this part. If no child document contains this point, then + * a pointer to this document is returned. + * + * This function has to be overloaded if the document features child documents. + * + * @param pos is in (unzoomed) document coordinates + * @param matrix transforms points from the documents coordinate system + * to the coordinate system of the requested point. This is used by + * transformed child documents, see KoDocumentChild/KoChild. + * + * @return Pointer to the document under the mouse at that position + */ + virtual KoDocument *hitTest( const QPoint &pos, const QWMatrix& matrix = QWMatrix() ); + /// Temporary API for accessing the view that calls hitTest. + /// Will be passed to hitTest() in 2.x. + /// Only call this from within hitTest()! + KoView* hitTestView(); + + /** + * Paints the whole document into the given painter object. + * + * @param painter The painter object onto which will be drawn. + * @param rect The rect that should be used in the painter object. + * @param transparent If true then the entire rectangle is erased before painting. + * @param view The KoView is needed to fiddle about with the active widget, when painting children. + * @param zoomX The zoom value to be applied to X coordinates when painting. + * @param zoomY The zoom value to be applied to Y coordinates when painting. + */ + virtual void paintEverything( QPainter &painter, const QRect &rect, bool transparent = false, + KoView *view = 0L, double zoomX = 1.0, double zoomY = 1.0 ); + + /** + * @brief Generates a preview picture of the document + * @note The preview is used in the File Dialog and also to create the Thumbnail + */ + virtual QPixmap generatePreview( const QSize& size ); + + /** + * Paints all of the documents children into the given painter object. + * + * @param painter The painter object onto which will be drawn. + * @param rect The rect that should be used in the painter object. + * @param view The KoView is needed to fiddle about with the active widget. + * @param zoomX The zoom value to be applied to X coordinates when painting. + * @param zoomY The zoom value to be applied to Y coordinates when painting. + * + * @see #paintChild #paintEverything #paintContent + */ + virtual void paintChildren( QPainter &painter, const QRect &rect, KoView *view, double zoomX = 1.0, double zoomY = 1.0 ); + + /** + * Paint a given child. Normally called by paintChildren(). + * + * @param child The child to be painted. + * @param painter The painter object onto which will be drawn. + * @param view The KoView is needed to fiddle about with the active widget. + * @param zoomX The zoom value to be applied to X coordinates when painting. + * @param zoomY The zoom value to be applied to Y coordinates when painting. + * + * @see #paintEverything #paintChildren #paintContent + */ + virtual void paintChild( KoDocumentChild *child, QPainter &painter, KoView *view, + double zoomX = 1.0, double zoomY = 1.0 ); + + /** + * Paints the data itself. Normally called by paintEverything(). It does not + * paint the children. + * It's this method that %KOffice Parts have to implement. + * + * @param painter The painter object onto which will be drawn. + * @param rect The rect that should be used in the painter object. + * @param transparent If false the implementing method should fill the background. + * @param zoomX The zoom value to be applied to X coordinates when painting. + * @param zoomY The zoom value to be applied to Y coordinates when painting. + * + * @see #paintEverything + */ + virtual void paintContent( QPainter &painter, const QRect &rect, bool transparent = false, + double zoomX = 1.0, double zoomY = 1.0 ) = 0; + + /** + * Called by koApplication to check for an autosave file in $HOME + */ + bool checkAutoSaveFile(); + + /** + * This setting indicates who is calling initDoc. + * Usually the app will want to + * - show the template dialog with 'everything' if InitDocAppStarting, InitDocFileClose or InitDocEmbedded + * - show the template dialog with 'templates only' if InitDocFileNew + * - create an empty document with default settings if InitDocEmpty + */ + enum InitDocFlags { InitDocAppStarting, InitDocFileNew, InitDocFileClose, InitDocEmbedded, InitDocEmpty }; + + /** + * Initializes an empty document (display the template dialog!). + * You have to overload this method to initialize all your document variables. + * @param flags see InitDocFlags + * @param parentWidget the widget this document belongs with + */ + virtual bool initDoc(InitDocFlags flags, QWidget* parentWidget=0) = 0; + + /** + * Creates and shows the start up widget. + * @param parent the KoMainWindow used as parent for the widget. + * @param alwaysShow always show the widget even if the user has configured it to not show. + * @since 1.5 + */ + virtual void showStartUpWidget(KoMainWindow* parent, bool alwaysShow = false); + + /** + * Sets the modified flag on the document. This means that it has + * to be saved or not before deleting it. + */ + virtual void setModified( bool _mod ); + + /** + * Tells the document that its title has been modified, either because + * the modified status changes (this is done by setModified() ) or + * because the URL or the document-info's title changed. + */ + virtual void setTitleModified(); + + /** + * @return true if the document is empty. + */ + virtual bool isEmpty() const { return m_bEmpty; } + + /** + * @brief Sets the document to empty. + * + * Used after loading a template + * (which is not empty, but not the user's input). + * + * @see isEmpty() + */ + virtual void setEmpty() { m_bEmpty = true; } + + /** + * @brief Loads a document from a store. + * + * You should never have to reimplement. + * + * @param store The store to load from + * @param url An internal url, like tar:/1/2 + */ + virtual bool loadFromStore( KoStore* store, const QString& url ); + + /** + * @brief Loads an OASIS document from a store. + * This is used for both the main document and embedded objects. + */ + virtual bool loadOasisFromStore( KoStore* store ); + + /** + * @brief Saves a document to a store. + * + * You should not have to reimplement this - but call it in saveChildren(). + */ + virtual bool saveToStore( KoStore* store, const QString& path ); + + /** + * Reimplement this method to load the contents of your %KOffice document, + * from the XML document. This is for the pre-Oasis file format (maindoc.xml). + * + * You are supposed to use the QDomDocument. The QIODevice is provided only + * for the cases where some pre-processing is needed, like kpresenter's kprconverter. + * Note that the QIODevice could be 0L, when called from an import filter. + */ + virtual bool loadXML( QIODevice *, const QDomDocument & doc ) = 0; + + /** + * Reimplement this method to load the contents of your %KOffice document, + * from the XML document ("content.xml"). The styles have been parsed already, + * you can find them in the oasisStyles parameter. The store can be used + * to load images and embedded documents. + */ + virtual bool loadOasis( const QDomDocument & doc, KoOasisStyles& oasisStyles, + const QDomDocument & settings, KoStore* store ) = 0; + + /** + * Reimplement this method to save the contents of your %KOffice document, + * using the OASIS format. + */ + virtual bool saveOasis( KoStore* store, KoXmlWriter* manifestWriter ) = 0; + + /** + * Reimplement this to save the contents of the %KOffice document into + * a QDomDocument. The framework takes care of saving it to the store. + */ + virtual QDomDocument saveXML(); + + /** + * Return a correctly created QDomDocument for this KoDocument, + * including processing instruction, complete DOCTYPE tag (with systemId and publicId), and root element. + * @param tagName the name of the tag for the root element + * @param version the DTD version (usually the application's version). + * @deprecated use createOasisXmlWriter instead + */ + QDomDocument createDomDocument( const QString& tagName, const QString& version ) const; + + /** + * Return an XML writer for saving Oasis XML into the device @p dev, + * including the XML processing instruction, + * and the root element with all its namespaces. + * You can add more namespaces afterwards with addAttribute. + * + * @param dev the device into which the XML will be written. + * @param rootElementName the tag name of the root element. + * This is either office:document, office:document-content, + * office:document-styles, office:document-meta or office:document-settings + * @return the KoXmlWriter instance. It becomes owned by the caller, which + * must delete it at some point. + * + * Once done with writing the contents of the root element, you + * will need to call endElement(); endDocument(); before destroying the KoXmlWriter. + * @note OASIS-specific + */ + static KoXmlWriter* createOasisXmlWriter( QIODevice* dev, const char* rootElementName ); + + /** + * Return a correctly created QDomDocument for an old (1.3-style) %KOffice document, + * including processing instruction, complete DOCTYPE tag (with systemId and publicId), and root element. + * This static method can be used e.g. by filters. + * @param appName the app's instance name, e.g. kword, kspread, kpresenter etc. + * @param tagName the name of the tag for the root element, e.g. DOC for kword/kpresenter. + * @param version the DTD version (usually the application's version). + */ + static QDomDocument createDomDocument( const QString& appName, const QString& tagName, const QString& version ); + + /** + * The first thing to do in loadOasis is get hold of the office:body tag, then its child. + * If the child isn't the expected one, the error message can indicate what it is instead. + * This method returns a translated name for the type of document, + * e.g. i18n("Word Processing") for office:text. + */ + static QString tagNameToDocumentType( const QString& localName ); + + /** + * Save the document. The default implementation is to call + * saveXML(). This method exists only for applications that + * don't use QDomDocument for saving, i.e. kword and kpresenter. + */ + virtual bool saveToStream( QIODevice * dev ); + + /** + * Loads a document in the native format from a given URL. + * Reimplement if your native format isn't XML. + * + * @param file the file to load - usually KReadOnlyPart::m_file or the result of a filter + */ + virtual bool loadNativeFormat( const QString & file ); + + /** + * Saves the document in native format, to a given file + * You should never have to reimplement. + * Made public for writing templates. + */ + virtual bool saveNativeFormat( const QString & file ); + + /** + * Activate/deactivate/configure the autosave feature. + * @param delay in seconds, 0 to disable + */ + void setAutoSave( int delay ); + + /** + * Checks whether the document is currently in the process of autosaving + */ + bool isAutosaving() const; + + /** + * Set whether the next openURL call should check for an auto-saved file + * and offer to open it. This is usually true, but can be turned off + * (e.g. for the preview module). + */ + void setCheckAutoSaveFile( bool b ); + + /** + * Set whether the next openURL call should show error message boxes in case + * of errors. This is usually the case, but e.g. not when generating thumbnail + * previews. + */ + void setAutoErrorHandlingEnabled( bool b ); + + /** + * Checks whether error message boxes should be shown. + * @since 1.3.1 + */ + bool isAutoErrorHandlingEnabled() const; + + /** + * Retrieve the default value for autosave in seconds. + * Called by the applications to use the correct default in their config + */ + static int defaultAutoSave() { return s_defaultAutoSave; } + + /** + * @return the list of all children. Do not modify the + * returned list. + */ + const QPtrList<KoDocumentChild>& children() const; + + /** + * @return the KoDocumentChild associated with the given Document, but only if + * @p doc is a direct child of this document. + * + * This is a convenience function. You could get the same result + * by traversing the list returned by children(). + */ + KoDocumentChild *child( KoDocument *doc ); + + /** + * @return the information concerning this document. + * @see KoDocumentInfo + */ + KoDocumentInfo *documentInfo() const; + + void setViewBuildDocument( KoView *view, const QDomDocument &doc ); + QDomDocument viewBuildDocument( KoView *view ); + + /** + * Appends the shell to the list of shells which show this + * document as their root document. + * + * This method is automatically called from KoMainWindow::setRootDocument, + * so you dont need to call it. + */ + virtual void addShell( KoMainWindow *shell ); + + /** + * Removes the shell from the list. That happens automatically if the shell changes its + * root document. Usually you dont need to call this method. + */ + virtual void removeShell( KoMainWindow *shell ); + + /** + * @return the list of shells for the main window + */ + const QPtrList<KoMainWindow>& shells() const; + + /** + * @return the number of shells for the main window + */ + int shellCount() const; + + /** + * @return the list of all the currently opened documents + */ + static QPtrList<KoDocument> *documentList() { return s_documentList; } + + /** + * @brief Return a DCOP interface for this document + * + * %KOffice parts are strongly recommended to reimplement this method, + * so that their DCOP interface provides more functionality than the basic KoDocumentIface + */ + virtual DCOPObject * dcopObject(); + + /** + * @return the ID of the DCOP interface for this document. + **/ + QCString dcopObjectId() const; + + /** + * Signal the progress of operations such as loading or saving. + */ + void emitProgress( int value ) { emit sigProgress( value ); } + + bool isInOperation() const; + virtual void emitBeginOperation(); + virtual void emitEndOperation(); + + /** + * Return true if url() is a real filename, false if url() is + * an internal url in the store, like "tar:/..." + */ + virtual bool isStoredExtern() const; + + /** + * @return the page layout associated with this document (margins, pageSize, etc). + * Override this if you want to provide different sized pages. + * + * @see KoPageLayout + */ + virtual KoPageLayout pageLayout(int pageNumber = 0) const; + + /** + * Performs a cleanup of unneeded backup files + */ + void removeAutoSaveFiles(); + + void setBackupFile( bool _b ); + + bool backupFile()const; + + /** + * Returns true if this document or any of its internal child documents are modified. + */ + bool isModified() const; + + /** + * Returns true during loading (openURL can be asynchronous) + */ + bool isLoading() const; + + int queryCloseExternalChildren(); + int queryCloseDia(); + + /** + * @brief Set when we do not want to save external children when saving our 'main' doc. + * + * This makes it possible to save 'main' doc + all its internal children first, then + * go on to save external children. Typically used by query close. + * Use: + * @code + * doc->setDoNotSaveExtDoc(); + * doc->save(); // saves doc and its internal children, + * //also calls saveExternalChildren() which sets setDoNotSaveExtDoc(false) + * doc->saveExternalChildren(); + * @endcode + */ + void setDoNotSaveExtDoc( bool on = true ); + + /** + * Sets the backup path of the document + */ + void setBackupPath( const QString & _path ); + + /** + * @return path to the backup document + */ + QString backupPath()const; + + /** + * Indicates that this document is currently viewed + * and thus should control the title caption. + * Also resets current flag for all parents. + */ + void setCurrent( bool on = true ); + + /** + * Sets current flag for this document and all its parents + */ + void forceCurrent( bool on ); + bool isCurrent() const; + + void setTitleModified( const QString caption, bool mod ); + + /** + * Sets the document URL to empty URL + * KParts doesn't allow this, but %KOffice apps have e.g. templates + * After using loadNativeFormat on a template, one wants + * to set the url to KURL() + */ + void resetURL() { m_url = KURL(); m_file = QString::null; } + + /** + * Set when you want an external embedded document to be stored internally + */ + void setStoreInternal( bool i ); + + /** + * @return true when external embedded documents are stored internally + */ + bool storeInternal() const; + + bool hasExternURL() const; + + /** + * Sets the document URL to @p url + * KParts doesn't really allow this, but it is needed for undo of setStoreInternal() + */ + void setURL( const KURL& url ) { m_url = url; } + + /** + * _Only_ use these functions to restore m_file (in KoMainWindow) after a + * failed save (remember to use setURL() to restore the URL as well). + * + * @warning Do _not_ use these functions for any other purpose. + * + * @internal + */ + QString &file() { return m_file; } + + /** + * _Only_ use these functions to restore m_file (in KoMainWindow) after a + * failed save (remember to use setURL() to restore the URL as well). + * + * @warning Do _not_ use these functions for any other purpose. + * + * @internal + */ + void setFile( const QString &file ) { m_file = file; } + + /** + * @internal (public for KoMainWindow) + */ + void setMimeTypeAfterLoading( const QString& mimeType ); + + /** + * @return returns the number of pages in the document. + */ + virtual int pageCount() const { return 1; } + + /** + * @return all kotext-based text objects in the document + * This is used by some text-analyzer plugins. + * @since 1.5 + */ + virtual QValueList<KoTextDocument *> allTextDocuments() const; + + /** + * Returns the unit used to display all measures/distances. + * @since 1.5 + */ + KoUnit::Unit unit() const; + + /** + * Sets the unit used to display all measures/distances. + * @since 1.5 + */ + void setUnit( KoUnit::Unit u ); + + /** + * Returns the name of the unit used to display all measures/distances. + * Use this method for displaying it in the user interface, but use + * unit() for everything else (conversions etc.) + * @since 1.5 + */ + QString unitName() const; + + /** + * Set the template type used. This is used by the start up widget to show + * the correct templates. + * @since 1.5 + */ + void setTemplateType(const QString& _templateType); + /** + * Template type used. This is used by the start up widget to show + * the correct templates. + * @since 1.5 + */ + QString templateType() const; + + /** + * Shows the init dialog when embeding + * @param parent the parent widget + * @since 1.5 + */ + virtual bool showEmbedInitDialog(QWidget* parent); + +public slots: + /** + * Initialize an empty document using default values + * @since 1.5 + */ + virtual void initEmpty(); + +signals: + + /** + * This signal is emitted when the unit is changed by setUnit() + * It is common to connect views to it, in order to change the displayed units + * (e.g. in the rulers) + */ + void unitChanged(KoUnit::Unit); + + /** + * This signal is emitted when a direct or indirect child document changes + * and needs to be updated in all views. + * + * If one of your child documents emits the childChanged signal, then you may + * usually just want to redraw this child. In this case you can ignore the parameter + * passed by the signal. + */ + void childChanged( KoDocumentChild *child ); + + /** + * Progress info while loading or saving. The value is in percents (i.e. a number between 0 and 100) + * Your KoDocument-derived class should emit the signal now and then during load/save. + * KoMainWindow will take care of displaying a progress bar automatically. + */ + void sigProgress( int value ); + + /** + * Emitted e.g. at the beginning of a save operation + * This is emitted by KoDocument and used by KoView to display a statusbar message + */ + void sigStatusBarMessage( const QString& text ); + + /** + * Emitted e.g. at the end of a save operation + * This is emitted by KoDocument and used by KoView to clear the statusbar message + */ + void sigClearStatusBarMessage(); + + void sigBeginOperation(); + void sigEndOperation(); + + /** + * Emitted when the document is modified + */ + void modified( bool ); + + void closeEmbedInitDialog(); + +protected slots: + /** + * This slot loads an existing file and deletes the start up widget. + * @param file the file to load (including path) + * @since 1.5 + */ + virtual void openExistingFile( const QString& file ); + /** + * This slot loads a template and deletes the start up widget. + * @param file the template to load + * @since 1.5 + */ + virtual void openTemplate( const QString& file ); + + void deleteOpenPaneDelayed(); + +protected: + + QString autoSaveFile( const QString & path ) const; + + virtual KoView *createViewInstance( QWidget *parent, const char *name ) = 0; + + /** + * Loads a document from KReadOnlyPart::m_file (KParts takes care of downloading + * remote documents). + * Applies a filter if necessary, and calls loadNativeFormat in any case + * You should not have to reimplement, except for very special cases. + * + * This method is called from the KReadOnlyPart::openURL method. + */ + virtual bool openFile(); + + /** + * Saves a document to KReadOnlyPart::m_file (KParts takes care of uploading + * remote documents) + * Applies a filter if necessary, and calls saveNativeFormat in any case + * You should not have to reimplement, except for very special cases. + */ + virtual bool saveFile(); + + /** + * Override this method in your derived class to show a widget in the startup 'dialog'. + * This widget should allow the user to set settings for a custom document (i.e. one + * not based on a template). + * The returned widget should provide its own button (preferrably 'Create') and + * implement the logic to implement the document instance correctly. + * After initializing the widget should emit a signal called 'documentSelected()' which + * will remove the startupWidget and show the document. + * @param parent the parent of the to be created widget. + */ + virtual QWidget* createCustomDocumentWidget(QWidget *parent); + + /** + * OLD XML method. For OASIS just call KoDocumentChild::loadOasisDocument + * after KoDocumentChild::loadOasis. + * + * You need to overload this function if your document may contain + * embedded documents. This function is called to load embedded documents. + * + * An example implementation may look like this: + * @code + * QPtrListIterator<KoDocumentChild> it( children() ); + * for( ; it.current(); ++it ) + * { + * if ( !it.current()->loadDocument( _store ) ) + * { + * return false; + * } + * } + * return true; + * @endcode + */ + virtual bool loadChildren( KoStore* ); + + /** + * Saves all internal children (only!). + * @see saveExternalChildren if you have external children. + * Returns true on success. + */ + virtual bool saveChildren( KoStore* store ); + + /** + * Saves all internal children (only!), to the store, using the OASIS format. + * This is called automatically during saveNativeFormat. + * @see saveExternalChildren if you have external children. + * Returns true on success. + */ + virtual bool saveChildrenOasis( KoStore* store, KoXmlWriter* manifestWriter ); + + /** + * Overload this function if you have to load additional files + * from a store. This function is called after loadXML() + * and after loadChildren() have been called. + */ + virtual bool completeLoading( KoStore* store ); + + /** + * If you want to write additional files to a store, + * then you must do it here. + * In the implementation, you should prepend the document + * url (using url().url()) before the filename, so that everything is kept relative + * to this document. For instance it will produce urls such as + * tar:/1/pictures/picture0.png, if the doc url is tar:/1 + * But do this ONLY if the document is not stored extern (see isStoredExtern() ). + * If it is, then the pictures should be saved to tar:/pictures. + */ + virtual bool completeSaving( KoStore* store ); + + /** + * Inserts the new child in the list of children and emits the + * childChanged() signal. + * + * At the same time this method marks this document as modified. + * + * To remove a child, just delete it. KoDocument will detect this + * and remove the child from its lists. + * + * @see #isModified + */ + virtual void insertChild( KoDocumentChild *child ); + + /** @internal */ + virtual void setModified() { KParts::ReadWritePart::setModified(); } + + /** @internal */ + virtual void insertChild(QObject *o) { QObject::insertChild(o); } + + KoPageLayout m_pageLayout; + + /** + * Saves all externally stored children. + * Returns true on success. + * @see #saveChildren for internal children + */ + virtual bool saveExternalChildren(); + + /** + * Returns whether or not the current openURL() or openFile() call is + * actually an import operation (like File --> Import). + * This is for informational purposes only. + */ + bool isImporting() const; + + /** + * Returns whether or not the current saveFile() call is actually an export + * operation (like File --> Export). + * If this function returns true during saveFile() and you are changing + * some sort of state, you _must_ restore it before the end of saveFile(); + * otherwise, File --> Export will not work properly. + */ + bool isExporting() const; + + /** + * Creates the open widget showed at application start up. + * @param parent the parent widget + * @param instance the KInstance to be used for KConfig data + * @param templateType the template-type (group) that should be selected on creation. + * @since 1.5 + */ + KoOpenPane* createOpenPane( QWidget* parent, KInstance* instance, + const QString& templateType = QString::null); + +private slots: + void slotChildChanged( KoChild *c ); + void slotChildDestroyed(); + void slotAutoSave(); + void slotStarted( KIO::Job* ); + void startCustomDocument(); + /** + * Removes the open widget showed at application start up. + * @since 1.5 + */ + void deleteOpenPane(); + +private: + KService::Ptr nativeService(); + bool oldLoadAndParse( KoStore* store, const QString& filename, QDomDocument& doc ); + bool loadNativeFormatFromStore( const QString& file ); + bool savePreview( KoStore* store ); + bool saveOasisPreview( KoStore* store, KoXmlWriter* manifestWriter ); + class Private; + Private *d; + KService::Ptr m_nativeService; + bool m_bEmpty; + static QPtrList<KoDocument> *s_documentList; + static const int s_defaultAutoSave; +}; + +#endif |