insilmaril@0: #ifndef MAPEDITOR_H insilmaril@0: #define MAPEDITOR_H insilmaril@0: insilmaril@74: #include insilmaril@74: #include insilmaril@0: insilmaril@74: #include "attribute.h" insilmaril@74: #include "file.h" insilmaril@0: #include "misc.h" insilmaril@74: #include "parser.h" insilmaril@74: #include "ornamentedobj.h" insilmaril@74: #include "selection.h" insilmaril@74: #include "settings.h" insilmaril@74: #include "vymmodel.h" insilmaril@0: insilmaril@74: class VymModel; insilmaril@74: class Selection; insilmaril@74: insilmaril@74: /*! \brief Main widget in vym to display and edit a map */ insilmaril@74: insilmaril@74: class MapEditor : public QGraphicsView, public XMLObj { insilmaril@0: Q_OBJECT insilmaril@0: insilmaril@0: public: insilmaril@74: /*! \brief State of the mapeditor insilmaril@74: insilmaril@74: While a heading is edited, the state has to change, so insilmaril@74: that e.g. no other object might get selected. This is done insilmaril@74: in Main by calling setStateEditHeading insilmaril@74: */ insilmaril@74: enum State { insilmaril@74: Idle, //!< Idle, waiting for user event insilmaril@74: EditHeading //!< Editing heading (dont't select another branch now) insilmaril@74: }; insilmaril@74: /*! \brief Networking states insilmaril@74: insilmaril@74: In Network modus we want to switch of saveState, autosave, ... insilmaril@74: */ insilmaril@74: enum NetState { insilmaril@74: Offline, //!< Offline insilmaril@74: Client, //!< I am the client and connected to server insilmaril@74: Server //!< I am the server insilmaril@74: }; insilmaril@74: MapEditor(QWidget* parent=0); insilmaril@0: ~MapEditor(); insilmaril@74: VymModel* getModel(); insilmaril@74: QGraphicsScene * getScene(); insilmaril@74: State getState(); //!< Return State of MapEditor insilmaril@74: void setStateEditHeading (bool); //!< If set to true, State will change to EditHeading insilmaril@74: bool isRepositionBlocked(); //!< While load or undo there is no need to update graphicsview insilmaril@74: bool isSaveStateBlocked(); //!< block while undo/redo or while running scripts insilmaril@74: void setSaveStateBlocked(bool); //!< block saving the undo/redo state insilmaril@74: bool isSelectBlocked(); //!< true, if no change of selection is possible, e.g. while editing the heading of abranch insilmaril@0: insilmaril@74: protected: insilmaril@74: /*! \brief Get name of object insilmaril@74: insilmaril@74: Returns heading of a branch or name of an object for use in comment insilmaril@74: of undo/redo history insilmaril@74: */ insilmaril@74: QString getName(const LinkableMapObj*); // Get e.g. heading or filename insilmaril@74: void makeTmpDirs(); // create temporary directories insilmaril@74: insilmaril@74: /*! This function saves all information of the map to disc. insilmaril@74: saveToDir also calls the functions for all BranchObj and other objects in the map. insilmaril@74: The structure of the map itself is returned as QString and passed back to Main, insilmaril@74: where saveToDir is called initially insilmaril@74: */ insilmaril@74: QString saveToDir (const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, LinkableMapObj *saveSel); insilmaril@74: insilmaril@74: /*! \brief Get directory, where current step in history is save insilmaril@74: insilmaril@74: saveState creates a directory for each step in history. This function returns the insilmaril@74: path of the current directory insilmaril@74: */ insilmaril@74: QString getHistoryDir(); insilmaril@74: insilmaril@74: /*! \brief Save the current changes in map insilmaril@74: insilmaril@74: Two commands and selections are saved: insilmaril@74: insilmaril@74: - undocommand and undoselection to undo the change insilmaril@74: - redocommand and redoselection to redo the action after an undo insilmaril@74: insilmaril@74: Additionally a comment is logged. insilmaril@74: insilmaril@74: */ insilmaril@74: void saveState( insilmaril@74: const SaveMode& savemode, insilmaril@74: const QString &undoSelection, insilmaril@74: const QString &undoCommand, insilmaril@74: const QString &redoSelection, insilmaril@74: const QString &redoCommand, insilmaril@74: const QString &comment, insilmaril@74: LinkableMapObj *saveSelection); insilmaril@74: /*! Overloaded for convenience */ insilmaril@74: void saveStateChangingPart( insilmaril@74: LinkableMapObj *undoSelection, insilmaril@74: LinkableMapObj* redoSelection, insilmaril@74: const QString &redoCommand, insilmaril@74: const QString &comment); insilmaril@74: /*! Overloaded for convenience */ insilmaril@74: void saveStateRemovingPart( insilmaril@74: LinkableMapObj *redoSelection, insilmaril@74: const QString &comment); insilmaril@74: /*! Overloaded for convenience */ insilmaril@74: void saveState( insilmaril@74: LinkableMapObj *undoSelection, insilmaril@74: const QString &undoCommand, insilmaril@74: LinkableMapObj *redoSelection, insilmaril@74: const QString &redoCommand, insilmaril@74: const QString &comment); insilmaril@74: /*! Overloaded for convenience */ insilmaril@74: void saveState( insilmaril@74: const QString &undoSelection, insilmaril@74: const QString &undoCommand, insilmaril@74: const QString &redoSelection, insilmaril@74: const QString &redoCommand, insilmaril@74: const QString &comment) ; insilmaril@74: void saveState( insilmaril@74: const QString &undoCommand, insilmaril@74: const QString &redoCommand, insilmaril@74: const QString &comment) ; insilmaril@74: insilmaril@74: public: insilmaril@74: insilmaril@74: /* \brief Process one command and its parameters */ insilmaril@74: void parseAtom (const QString &atom); insilmaril@74: insilmaril@74: /* \brief Runs the script */ insilmaril@74: void runScript (QString script); insilmaril@0: private: insilmaril@74: void addFloatImageInt(const QPixmap &img); insilmaril@0: insilmaril@0: public: insilmaril@74: bool isDefault(); //!< true, if map is still the empty default map insilmaril@74: bool hasChanged(); //!< true, if something has changed and is not saved yet insilmaril@74: void setChanged(); //!< called from TextEditor via LinkableMapObj insilmaril@74: void closeMap(); //!< Closes the map insilmaril@74: insilmaril@74: /*! \brief Sets filepath, filename and mapname insilmaril@74: insilmaril@74: If the filepath is "/home/tux/map.xml", then the filename will be set insilmaril@74: to map.xml. The destname is needed for vymLinks, pointing to another map. insilmaril@74: The destname holds the real name of the file, after it has been compressed, e.g. "map.vym" insilmaril@74: */ insilmaril@74: insilmaril@74: /*! \brief Set File path insilmaril@74: insilmaril@74: The destname is needed to construct the references between maps insilmaril@74: */ insilmaril@74: void setFilePath (QString filepath,QString destname); insilmaril@74: void setFilePath (QString); //!< Overloaded for convenience insilmaril@74: QString getFilePath (); //!< Full path e.g. "/home/tux/map.xml" insilmaril@74: QString getFileName (); //!< e.g. "map.xml" insilmaril@74: QString getMapName (); //!< e.g. "map" insilmaril@74: QString getDestPath (); //!< e.g. "/home/tux/map.vym" insilmaril@74: insilmaril@74: /*! \brief Load map insilmaril@74: insilmaril@74: The data is read from file. Depending on LoadMode the current insilmaril@74: selection gets replaced by data or the data is appended. insilmaril@74: */ insilmaril@74: ErrorCode load (QString, const LoadMode &, const FileType& ); // newmap, import/replace selection insilmaril@74: public: insilmaril@74: /*! \brief Save the map to file */ insilmaril@74: ErrorCode save(const SaveMode &); insilmaril@74: /* FIXME no needed any longer insilmaril@74: void setZipped(bool); //!< Set or unset compression of map with zip save map zipped insilmaril@74: bool saveZipped(); //!< True, if file will be saved zipped insilmaril@74: */ insilmaril@74: void print(); //!< Print the map insilmaril@74: void setAntiAlias (bool); //!< Set or unset antialiasing insilmaril@74: void setSmoothPixmap(bool); //!< Set or unset smoothing of pixmaps insilmaril@0: private: insilmaril@0: QPixmap getPixmap(); insilmaril@74: void setHideTmpMode (HideTmpMode); // temporary hide stuff insilmaril@74: HideTmpMode getHideTmpMode(); // temporary hide stuff insilmaril@0: public: insilmaril@74: /*! Set or unset temporary hiding of objects during export */ insilmaril@74: void setExportMode (bool); insilmaril@74: insilmaril@74: /*! Export as ASCII text to file */ insilmaril@74: void exportASCII (QString fname="",bool askForName=true); insilmaril@74: insilmaril@74: /*! Save as image */ insilmaril@74: void exportImage (QString fname="",bool askForName=true,QString format="PNG"); insilmaril@74: insilmaril@74: /*! Export as OpenOfficeOrg presentation */ insilmaril@74: void exportOOPresentation(const QString &,const QString &); insilmaril@74: insilmaril@74: /*! Export as XHTML to directory */ insilmaril@74: void exportXHTML(const QString& dir="", bool askForName=true); insilmaril@74: insilmaril@74: /*! Export as XTML to directory */ insilmaril@74: void exportXML(QString dir="", bool askForName=true); insilmaril@74: insilmaril@74: void clear(); //!< Clear map insilmaril@74: void copy(); //!< Copy to clipboard insilmaril@74: void redo(); //!< Redo last action insilmaril@74: bool isRedoAvailable(); //!< True, if redo is available insilmaril@74: void undo(); //!< Undo last action insilmaril@74: bool isUndoAvailable(); //!< True, if undo is available insilmaril@74: void gotoHistoryStep (int); //!< Goto a specifig step in history insilmaril@0: private: insilmaril@74: void addMapReplaceInt(const QString & undoSel, const QString & path); insilmaril@74: bool addMapInsertInt (const QString & path); insilmaril@74: bool addMapInsertInt (const QString & path, int pos); insilmaril@74: void pasteNoSave(const int &n); //!< paste clipboard to branch insilmaril@0: public: insilmaril@74: void paste(); //!< Paste clipboard to branch and backup insilmaril@74: void cut(); //!< Cut to clipboard (and copy) insilmaril@74: /*! \brief Move absolutly insilmaril@74: insilmaril@74: Move absolutly to (x,y). insilmaril@74: */ insilmaril@74: void move (const double &x, const double &y); insilmaril@74: /*! \brief Move relativly insilmaril@74: insilmaril@74: Move relativly to (x,y). insilmaril@74: */ insilmaril@74: void moveRel (const double &x, const double &y); insilmaril@74: void moveBranchUp(); //!< Move branch up insilmaril@74: void moveBranchDown(); //!< Move branch down insilmaril@74: void sortChildren(); //!< Sort children lexically insilmaril@0: private: insilmaril@74: void linkTo(const QString &); insilmaril@74: public: insilmaril@74: QString getHeading (bool &ok,QPoint &p); //!< Get heading, ok if selection is branch insilmaril@74: void setHeading(const QString &); //!< Set heading of branch insilmaril@74: private: insilmaril@74: void setHeadingInt(const QString &); insilmaril@74: void setVymLinkInt(const QString &); // Set vymLink for selection insilmaril@74: /*! \brief Add new mapcenter insilmaril@74: insilmaril@74: Disclaimer: Still experimental, not fully supported. insilmaril@74: */ insilmaril@74: public: insilmaril@74: BranchObj* addMapCenter(); insilmaril@74: insilmaril@74: /*! \brief Add new branch insilmaril@74: insilmaril@74: Depending on num the new branch is created insilmaril@74: insilmaril@74: -3 above selection as child of selections parent insilmaril@74: -2 as child of selection insilmaril@74: -1 below selection as child of selections parent insilmaril@74: 0..n insert at a specific position in selections parent insilmaril@74: (needed for free relinking) insilmaril@74: */ insilmaril@74: private: insilmaril@74: BranchObj* addNewBranchInt(int); // pos allows to add above/below selection insilmaril@74: public: insilmaril@74: /*! \Add new branch insilmaril@74: insilmaril@74: Depending on num the new branch is created insilmaril@74: -1 above selection insilmaril@74: 0 as child of selection insilmaril@74: 1 below selection insilmaril@74: */ insilmaril@74: BranchObj* addNewBranch(int pos); insilmaril@74: BranchObj* addNewBranchBefore(); //!< Insert branch between selection and its parent insilmaril@74: void deleteSelection(); //!< Delete selection insilmaril@74: LinkableMapObj* getSelection(); //!< Returns selection insilmaril@74: BranchObj* getSelectedBranch(); // returns selected branch or NULL insilmaril@74: FloatImageObj* getSelectedFloatImage(); // returns selected branch or NULL insilmaril@74: void unselect(); // before changing current noteedit insilmaril@74: void reselect(); // after changing current noteedit insilmaril@74: bool select(const QString &); // Select by string insilmaril@74: bool select(LinkableMapObj *lmo); // Select by pointer insilmaril@74: QString getSelectString(); insilmaril@74: private: insilmaril@74: void selectInt(LinkableMapObj*); insilmaril@74: void selectNextBranchInt(); // Increment number of branch insilmaril@74: void selectPrevBranchInt(); // Decrement number of branch insilmaril@0: public: insilmaril@0: void selectUpperBranch(); insilmaril@0: void selectLowerBranch(); insilmaril@0: void selectLeftBranch(); insilmaril@0: void selectRightBranch(); insilmaril@0: void selectFirstBranch(); insilmaril@0: void selectLastBranch(); insilmaril@74: void selectMapBackgroundImage(); insilmaril@74: void setMapBackgroundImage(const QString &); insilmaril@74: void selectMapBackgroundColor(); insilmaril@74: void setMapBackgroundColor(QColor); insilmaril@74: QColor getMapBackgroundColor(); insilmaril@74: QColor getCurrentHeadingColor(); insilmaril@74: void colorBranch(QColor); insilmaril@74: void colorSubtree(QColor); insilmaril@0: void toggleStandardFlag(QString); insilmaril@0: BranchObj* findText(QString,bool); // Find object insilmaril@0: void findReset(); // Reset Find insilmaril@74: void setURL(const QString &); // set URL insilmaril@74: void editURL(); // edit URL insilmaril@74: void editLocalURL(); // edit URL to local file insilmaril@74: QString getURL(); // returns URL of selection or "" insilmaril@74: QStringList getURLs(); // returns URLs of subtree insilmaril@0: void editHeading2URL(); // copy heading to URL insilmaril@0: void editBugzilla2URL(); // create URL to Bugzilla insilmaril@74: void editFATE2URL(); // create URL to FATE insilmaril@0: void editVymLink(); // edit link to another map insilmaril@0: void deleteVymLink(); // delete link to another map insilmaril@0: QString getVymLink(); // return path to map insilmaril@74: QStringList getVymLinks(); // return paths in subtree insilmaril@74: void setHideExport(bool); // toggle the export flag insilmaril@74: void toggleHideExport(); // toggle the export flag insilmaril@74: void deleteKeepChilds(); // remove but keep childs insilmaril@74: void deleteChilds(); // remove childs insilmaril@0: void editMapInfo(); // dialog to enter author, ... insilmaril@74: void ensureSelectionVisible(); insilmaril@74: void updateSelection(); // update geometry of selection insilmaril@0: void updateActions(); // update e.g. format buttons insilmaril@74: void updateNoteFlag(); // when TextEditor changes insilmaril@74: void setMapAuthor (const QString &); insilmaril@74: void setMapComment(const QString &); insilmaril@74: void setMapLinkStyle (const QString &); // Set style of link insilmaril@74: LinkableMapObj::Style getMapLinkStyle (); // requested in LMO insilmaril@74: void setMapDefLinkColor(QColor); // default color of links insilmaril@74: void setMapLinkColorHintInt(); // color of links insilmaril@74: void setMapLinkColorHint(LinkableMapObj::ColorHint);// color of links insilmaril@74: LinkableMapObj::ColorHint getMapLinkColorHint(); insilmaril@74: QColor getMapDefLinkColor(); insilmaril@74: void setMapDefXLinkColor(QColor); insilmaril@74: QColor getMapDefXLinkColor(); insilmaril@74: void setMapDefXLinkWidth (int); insilmaril@74: int getMapDefXLinkWidth(); insilmaril@74: void toggleMapLinkColorHint(); // after changing linkStyles insilmaril@74: void selectMapLinkColor(); insilmaril@74: void selectMapSelectionColor(); insilmaril@74: private: insilmaril@74: void setSelectionColorInt(QColor); insilmaril@74: public: insilmaril@74: void setSelectionColor(QColor); insilmaril@74: QColor getSelectionColor(); insilmaril@74: bool scrollBranch(BranchObj*); insilmaril@74: bool unscrollBranch(BranchObj*); insilmaril@0: void toggleScroll(); insilmaril@74: void unscrollChilds(); insilmaril@74: private: insilmaril@74: FloatImageObj* loadFloatImageInt (QString); insilmaril@74: public: insilmaril@0: void loadFloatImage (); insilmaril@0: private: insilmaril@74: void saveFloatImageInt (FloatImageObj*, const QString &, const QString &); insilmaril@74: public: insilmaril@74: void saveFloatImage (); insilmaril@74: void setFrameType(const FrameObj::FrameType &); insilmaril@74: void setFrameType(const QString &); insilmaril@74: void setFramePenColor (const QColor &); insilmaril@74: void setFrameBrushColor (const QColor &); insilmaril@74: void setFramePadding (const int &); insilmaril@74: void setFrameBorderWidth (const int &); insilmaril@74: void setIncludeImagesVer(bool); insilmaril@74: void setIncludeImagesHor(bool); insilmaril@74: void setHideLinkUnselected (bool); insilmaril@74: bool getHideLinkUnselected (); insilmaril@74: private: insilmaril@74: void importDirInt(BranchObj *,QDir); insilmaril@74: void importDirInt(const QString&); insilmaril@0: public: insilmaril@0: void importDir(); insilmaril@74: void followXLink (int); insilmaril@74: void editXLink (int); insilmaril@74: AttributeTable* attributeTable(); insilmaril@74: void testFunction1(); // just testing new stuff insilmaril@74: void testFunction2(); // just testing new stuff insilmaril@74: // set /mainwindo/showTestMenu=true... insilmaril@0: insilmaril@0: protected: insilmaril@74: virtual void contextMenuEvent ( QContextMenuEvent *e ); insilmaril@74: virtual void keyPressEvent(QKeyEvent*); insilmaril@74: virtual void keyReleaseEvent(QKeyEvent*); insilmaril@74: virtual void mousePressEvent(QMouseEvent*); insilmaril@74: virtual void mouseMoveEvent(QMouseEvent*); insilmaril@74: virtual void mouseReleaseEvent(QMouseEvent*); insilmaril@74: virtual void mouseDoubleClickEvent(QMouseEvent*); insilmaril@74: virtual void resizeEvent( QResizeEvent * ); insilmaril@74: insilmaril@74: void dragEnterEvent (QDragEnterEvent *); insilmaril@74: void dragMoveEvent (QDragMoveEvent *); insilmaril@74: void dragLeaveEvent (QDragLeaveEvent *); insilmaril@74: void dropEvent (QDropEvent *); insilmaril@74: insilmaril@74: insilmaril@74: protected: insilmaril@74: void sendSelection(); insilmaril@74: insilmaril@74: public: insilmaril@74: void newServer(); insilmaril@74: void connectToServer(); insilmaril@74: insilmaril@74: private slots: insilmaril@74: void newClient(); insilmaril@74: void sendData(const QString &s); insilmaril@74: void readData(); insilmaril@74: void displayNetworkError (QAbstractSocket::SocketError); insilmaril@74: insilmaril@74: void autosave (); insilmaril@74: void fileChanged(); insilmaril@0: insilmaril@0: private: insilmaril@74: State state; // State of MapEditor insilmaril@74: QGraphicsScene *mapScene; insilmaril@74: VymModel *model; // Vym Map, includding several mapCenters insilmaril@74: QTimer *autosaveTimer; insilmaril@74: QTimer *fileChangedTimer; insilmaril@74: QDateTime fileChangedTime; insilmaril@0: insilmaril@0: bool adjustCanvasRequested; // collect requests until end of user event insilmaril@0: BranchObj *editingBO; // entering Text into BO insilmaril@0: insilmaril@74: QColor defLinkColor; // default color for links insilmaril@74: QColor defXLinkColor; // default color for xlinks insilmaril@74: int defXLinkWidth; // default width for xlinks insilmaril@74: LinkableMapObj::ColorHint linkcolorhint;// use heading color or own color insilmaril@74: LinkableMapObj::Style linkstyle; // default style for links insilmaril@0: insilmaril@74: QCursor HandOpenCursor; // cursor while moving canvas view insilmaril@74: QCursor PickColorCursor; // cursor while picking color insilmaril@74: QCursor CopyCursor; // cursor while picking color insilmaril@74: QCursor XLinkCursor; // cursor while picking color insilmaril@74: bool pickingColor; insilmaril@74: bool drawingLink; // true while creating a link insilmaril@74: bool copyingObj; // true while creating a link insilmaril@74: XLinkObj* tmpXLink; insilmaril@74: insilmaril@74: Selection xelection; insilmaril@74: insilmaril@74: QString latestSelection; // select string of latest added object insilmaril@74: insilmaril@0: MapObj* movingObj; // moving a MapObj insilmaril@74: MapObj* linkingObj_src; // part of a link insilmaril@74: QPointF movingObj_orgPos; // org. pos of mouse before move insilmaril@74: QPointF movingObj_orgRelPos; // org. relative pos of mouse before move insilmaril@74: QPointF movingObj_start; // rel. pos of mouse to absPos insilmaril@74: QPointF movingCont_start; // inital pos of moving Content or insilmaril@74: QPointF movingVec; // how far has Content moved insilmaril@74: insilmaril@74: QPointF contextMenuPos; // position where context event was triggered insilmaril@74: insilmaril@0: QPrinter* printer; // Printing insilmaril@0: insilmaril@0: bool mapDefault; // Flag if map is untouched insilmaril@0: bool mapChanged; // Flag if undo is possible insilmaril@0: bool mapUnsaved; // Flag if map should be saved insilmaril@74: insilmaril@74: Parser parser; // Parser stuff for scripting insilmaril@74: insilmaril@74: AttributeTable *attrTable; insilmaril@0: insilmaril@0: bool printFrame; // Print frame around map insilmaril@0: bool printFooter; // Print footer below map insilmaril@0: insilmaril@0: bool zipped; // should map be zipped insilmaril@74: static int mapNum; // unique number for Editor insilmaril@74: FileType fileType; // type of file, e.g. vym, freemind... insilmaril@0: QString fileName; // short name of file (for tab) insilmaril@0: QString filePath; // path to file which will be saved insilmaril@0: QString fileDir; // dir where file is saved insilmaril@0: QString destPath; // path to .vym file (needed for vymlinks) insilmaril@0: QString mapName; // fileName without ".vym" insilmaril@0: insilmaril@74: QString tmpMapDir; // tmp directory with undo history insilmaril@74: QString histPath; // Path to history file insilmaril@74: SimpleSettings undoSet; // undo/redo commands, saved in histPath insilmaril@74: int stepsTotal; // total number of steps (undos+redos) insilmaril@74: int curStep; // Current step in history (ring buffer) insilmaril@74: int curClipboard; // number of history step, which is the current clipboard insilmaril@74: int redosAvail; // Available number of redo steps insilmaril@74: int undosAvail; // Available number of undo steps insilmaril@74: bool blockReposition; // block while load or undo insilmaril@74: bool blockSaveState; // block while load or undo insilmaril@0: insilmaril@0: BranchObj* itFind; // next object in find process insilmaril@0: bool EOFind; // true, if search failed insilmaril@0: insilmaril@0: QPoint exportOffset; // set before export, used in save insilmaril@74: HideTmpMode hidemode; // true while exporting to hide some stuff insilmaril@74: insilmaril@74: // Network connections **Experimental** insilmaril@74: NetState netstate; // offline, client, server insilmaril@74: QTcpServer *tcpServer; // Act as server in conference mode (experimental) insilmaril@74: QList clientList; // List of connected clients insilmaril@74: quint16 sendCounter; // Increased with every sent command insilmaril@74: insilmaril@74: QTcpSocket *clientSocket; // socket of this client insilmaril@74: QString server; // server address of this client insilmaril@74: int port; // server port of this client insilmaril@74: void displayClientError(QAbstractSocket::SocketError socketError); insilmaril@74: insilmaril@0: }; insilmaril@0: #endif insilmaril@0: