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