insilmaril@725: #ifndef TREEITEM_H insilmaril@725: #define TREEITEM_H insilmaril@725: insilmaril@758: #include insilmaril@725: #include insilmaril@725: #include insilmaril@725: insilmaril@766: #include "flagrow.h" insilmaril@746: #include "noteobj.h" insilmaril@746: #include "xmlobj.h" insilmaril@746: insilmaril@726: class LinkableMapObj; insilmaril@750: class BranchObj; insilmaril@750: class BranchItem; insilmaril@776: class FloatImageObj; insilmaril@776: class ImageItem; insilmaril@746: class VymModel; insilmaril@790: class XLinkItem; insilmaril@790: class XLinkObj; insilmaril@726: insilmaril@779: class TreeItem:public XMLObj insilmaril@725: { insilmaril@725: public: insilmaril@790: enum Type {Undefined,MapCenter,Branch,Image,Attribute,XLink}; //FIXME-3 MapCenter still needed? insilmaril@753: enum HideTmpMode {HideNone, HideExport}; insilmaril@753: insilmaril@776: TreeItem(); insilmaril@725: TreeItem(const QList &data, TreeItem *parent = 0); insilmaril@791: virtual ~TreeItem(); insilmaril@756: void init(); insilmaril@756: insilmaril@727: // General housekeeping insilmaril@759: virtual void setModel (VymModel *m); insilmaril@759: virtual VymModel* getModel(); insilmaril@746: insilmaril@776: insilmaril@776: /*! Return number of item, as it would be after it would have been appended. insilmaril@776: This is used to notify view about layout changes before model is modified. */ insilmaril@776: virtual int getRowNumAppend (TreeItem *child); insilmaril@776: insilmaril@759: virtual void appendChild (TreeItem *child); insilmaril@759: virtual void removeChild (int row); insilmaril@788: // virtual void clear(); insilmaril@725: insilmaril@759: virtual TreeItem *child(int row); insilmaril@759: virtual int childCount() const; insilmaril@759: virtual int childNumber() const; insilmaril@759: virtual int columnCount() const; insilmaril@759: virtual int branchCount() const; insilmaril@759: virtual int imageCount() const; insilmaril@759: virtual int xlinkCount() const; insilmaril@786: virtual int attributeCount() const; insilmaril@727: insilmaril@759: virtual int row() const; insilmaril@759: virtual int depth() ; insilmaril@759: virtual TreeItem *parent(); insilmaril@749: insilmaril@749: /*! Return number of item in parent by type, insilmaril@749: e.g. first branch has number 0 */ insilmaril@758: virtual int childNum(); //! Return number of item in list of all children insilmaril@758: virtual int num(); //! Return number of item by type insilmaril@758: virtual int num (TreeItem *item); //! Return number of item by type insilmaril@727: insilmaril@766: protected: insilmaril@766: Type type; insilmaril@766: public: insilmaril@766: virtual void setType (const Type t); insilmaril@766: virtual Type getType (); insilmaril@766: virtual bool isBranchLikeType() const; insilmaril@766: virtual QString getTypeName (); insilmaril@766: insilmaril@766: // Accessing data insilmaril@758: virtual QVariant data(int column) const; insilmaril@758: insilmaril@767: insilmaril@758: protected: insilmaril@758: QColor headingColor; insilmaril@758: public: insilmaril@758: virtual void setHeading (const QString s); insilmaril@758: virtual QString getHeading() const; insilmaril@758: virtual std::string getHeadingStd() const; //! convenience function used for debugging insilmaril@758: virtual void setHeadingColor(QColor color); //! Set color of heading. In BranchItem overloaded to update QGraphicsView insilmaril@758: virtual QColor getHeadingColor(); //! Returns color of heading insilmaril@746: insilmaril@767: insilmaril@767: protected: insilmaril@767: QString url; insilmaril@767: public: insilmaril@767: void setURL (const QString &url); //! Set URL insilmaril@767: QString getURL (); //! Get URL insilmaril@767: insilmaril@767: insilmaril@767: protected: insilmaril@767: QString vymLink; insilmaril@767: public: insilmaril@767: void setVymLink (const QString &url); //! Set URL insilmaril@767: QString getVymLink (); //! Get URL insilmaril@767: insilmaril@767: insilmaril@746: protected: insilmaril@746: NoteObj note; insilmaril@746: public: insilmaril@767: virtual void setNote(const QString &s); insilmaril@767: virtual void clearNote(); insilmaril@758: virtual QString getNote(); insilmaril@768: virtual bool hasEmptyNote(); insilmaril@791: virtual void setNoteObj(const NoteObj &); //FIXME-3 setNoteObj is called for every select or so??? insilmaril@776: insilmaril@746: virtual NoteObj getNoteObj(); insilmaril@746: virtual QString getNoteASCII(const QString &indent, const int &width); // returns note (ASCII) insilmaril@746: virtual QString getNoteASCII(); // returns note (ASCII) insilmaril@746: virtual QString getNoteOpenDoc(); // returns note (OpenDoc) insilmaril@746: insilmaril@767: insilmaril@746: protected: insilmaril@766: FlagRow standardFlags; insilmaril@767: FlagRow systemFlags; insilmaril@746: public: insilmaril@766: virtual void activateStandardFlag(const QString &flag); insilmaril@766: virtual void deactivateStandardFlag(const QString &flag); insilmaril@767: virtual void deactivateAllStandardFlags(); insilmaril@767: insilmaril@767: /*! \brief Toggle a Flag insilmaril@767: If master is not NULL,, only one Flag from FlagRow master may insilmaril@767: be active simultanously, the others get deactivated. insilmaril@767: */ insilmaril@767: virtual void toggleStandardFlag(const QString &flag, FlagRow *master=NULL); insilmaril@766: virtual bool isActiveStandardFlag (const QString &flag); insilmaril@767: virtual QStringList activeStandardFlagNames(); insilmaril@770: virtual FlagRow* getStandardFlagRow (); insilmaril@770: insilmaril@767: virtual QStringList activeSystemFlagNames(); insilmaril@766: insilmaril@767: virtual bool canMoveDown(); insilmaril@767: virtual bool canMoveUp(); insilmaril@738: insilmaril@754: protected: insilmaril@754: QString objID; //! id set during load/save currently used for xLinks insilmaril@754: public: insilmaril@754: virtual void setID (const QString &s); insilmaril@754: virtual QString getID (); insilmaril@754: insilmaril@738: // Navigation and selection insilmaril@758: virtual TreeItem* getChildNum(const int &n); insilmaril@758: virtual BranchItem* getFirstBranch(); insilmaril@758: virtual BranchItem* getLastBranch(); insilmaril@763: insilmaril@763: /*! Get next branch after current branch. Return NULL if there is no insilmaril@763: next branch */ insilmaril@763: virtual BranchItem* getNextBranch(BranchItem* currentBranch); insilmaril@763: insilmaril@758: virtual BranchItem* getBranchNum(const int &n); insilmaril@758: virtual BranchObj* getBranchObjNum(const int &n); insilmaril@738: insilmaril@776: virtual ImageItem* getImageNum(const int &n); insilmaril@776: virtual FloatImageObj* getImageObjNum(const int &n); insilmaril@779: insilmaril@790: virtual XLinkItem* getXLinkNum(const int &n); insilmaril@790: virtual XLinkObj* getXLinkObjNum(const int &n); insilmaril@790: insilmaril@768: protected: insilmaril@791: bool hideExport; //! Hide this item in export insilmaril@791: bool hidden; //! Hidden in export if true insilmaril@768: public: insilmaril@753: virtual void setHideTmp (HideTmpMode); insilmaril@753: virtual bool hasHiddenExportParent (); insilmaril@753: virtual void setHideInExport(bool); // set export of object (and children) insilmaril@753: virtual bool hideInExport(); insilmaril@753: virtual bool isHidden (); insilmaril@791: virtual void updateVisibility(); //! Sets visibility in LinkableMapObj, if existing insilmaril@753: insilmaril@779: virtual QString getGeneralAttr(); insilmaril@726: insilmaril@741: protected: insilmaril@746: VymModel *model; insilmaril@746: insilmaril@725: QList childItems; insilmaril@725: QList itemData; insilmaril@725: TreeItem *parentItem; insilmaril@773: insilmaril@773: /*! Set rootItem (does not change, needed for quick check insilmaril@773: if some branch is mapCenter */ insilmaril@773: TreeItem *rootItem; insilmaril@726: insilmaril@738: int branchOffset; insilmaril@741: int branchCounter; insilmaril@763: int imageOffset; insilmaril@763: int imageCounter; insilmaril@763: insilmaril@786: int attributeOffset; insilmaril@786: int attributeCounter; insilmaril@786: insilmaril@790: int xlinkOffset; insilmaril@790: int xlinkCounter; insilmaril@790: insilmaril@725: }; insilmaril@725: insilmaril@725: #endif