#ifndef BRANCHITEM_H
#define BRANCHITEM_H

#include "mapitem.h"
#include "task.h"

#include <QList>

class QString;
class QGraphicsScene;
class BranchObj;
class Link;
class XLinkItem;

class BranchItem:public MapItem
{
public:
    enum LayoutHint {AutoPositioning, FreePositioning};

    BranchItem(const QList<QVariant> &data, TreeItem *parent = 0);
    virtual ~BranchItem();
    virtual void clear();
    virtual void copy (BranchItem *item);
    virtual BranchItem* parentBranch();

    virtual void insertBranch (int pos,BranchItem *branch);

    virtual QString saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset,QList <Link*> &tmpLinks);

    virtual void updateVisibility();

    virtual void setHeadingColor (QColor color); //!Overloaded from TreeItem to update QGraphicsView

protected:  
    bool scrolled;	// true if all children are scrolled and thus invisible
    bool tmpUnscrolled;	    // can only be true (temporary) for a scrolled subtree

public:
    void updateTaskFlag();
    void setTask (Task* t);
    Task* getTask();
private:
    Task* task;

public:
    virtual void unScroll();		
    virtual bool toggleScroll();	// scroll or unscroll
    virtual bool isScrolled();		// returns scroll state
    virtual bool hasScrolledParent(BranchItem* start=NULL);    // true, if any of the parents is scrolled
    virtual bool tmpUnscroll(BranchItem* start=NULL);		// unscroll scrolled parents temporary e.g. during "find" process
    virtual bool resetTmpUnscroll();	    // scroll all tmp scrolled parents again e.g. when unselecting
    virtual void sortChildren(bool inverse=false);  //! Sort children 
    virtual void setChildrenLayout(BranchItem::LayoutHint layoutHint);
    virtual BranchItem::LayoutHint getChildrenLayout();

protected:
    bool includeImagesVer;	//! include floatimages in bbox vertically
    bool includeImagesHor;	//! include floatimages in bbox horizontally
    bool includeChildren;	//! include children in frame
    LayoutHint childrenLayout;  //! should children be positioned freely?

public:
    void setIncludeImagesVer(bool);
    bool getIncludeImagesVer();
    void setIncludeImagesHor(bool);
    bool getIncludeImagesHor();
    QString getIncludeImageAttr();
    BranchItem* getFramedParentBranch(BranchItem *start);
    void setFrameIncludeChildren(bool);
    bool getFrameIncludeChildren();

protected:
    int lastSelectedBranchNum;
    int lastSelectedBranchNumAlt;
public:
    virtual void setLastSelectedBranch();	//! Set myself as last selected in parent
    virtual void setLastSelectedBranch(int i);	    //! Set last selected branch directly
    virtual BranchItem* getLastSelectedBranch();    //! Returns last selected branch usually
    virtual BranchItem* getLastSelectedBranchAlt(); //! Used to return last selected branch left of a mapcenter

public:
    TreeItem* findMapItem (QPointF p,TreeItem* excludeTI);  //! search map for branches or images. Ignore excludeTI, where search is started 

    virtual void updateStyles (const bool &keepFrame=false);	    //! update related fonts, parObjects, links, ...
    virtual BranchObj* getBranchObj();	
    virtual BranchObj* createMapObj(QGraphicsScene *scene); //! Create classic object in GraphicsView
};

#endif
