Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef DOCKLAYOUT_H
Toshihiro Shimizu 890ddd
#define DOCKLAYOUT_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qwidget></qwidget>
Toshihiro Shimizu 890ddd
#include <qaction></qaction>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <deque></deque>
Toshihiro Shimizu 890ddd
#include <vector></vector>
Toshihiro Shimizu 890ddd
#include <qlayout></qlayout>
Toshihiro Shimizu 890ddd
#include <qframe></qframe>
Toshihiro Shimizu 890ddd
#include "docklayout.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TOONZQT_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//Forward Declarations
Toshihiro Shimizu 890ddd
class DockLayout;
Toshihiro Shimizu 890ddd
class DockWidget;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DockPlaceholder;
Toshihiro Shimizu 890ddd
class DockSeparator;
Toshihiro Shimizu 890ddd
class DockDecoAllocator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Region;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------
Toshihiro Shimizu 890ddd
//    Docking Lock Check
Toshihiro Shimizu 890ddd
//--------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!Singleton for docking system lock.
Toshihiro Shimizu 890ddd
class DVAPI DockingCheck
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool m_enabled;
Toshihiro Shimizu 890ddd
	QAction *m_toggle;
Toshihiro Shimizu 890ddd
	DockingCheck() : m_enabled(false), m_toggle(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	static DockingCheck *instance();
Toshihiro Shimizu 890ddd
	void setToggle(QAction *toggle);
Toshihiro Shimizu 890ddd
	bool isEnabled() const { return m_enabled; }
Toshihiro Shimizu 890ddd
	void setIsEnabled(bool on);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------
Toshihiro Shimizu 890ddd
//    Dock Layout
Toshihiro Shimizu 890ddd
//-------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!DockLayout inherits the abstract QLayout to provide a docking system for widgets.
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \b IMPORTANT NOTE: Observe that the addWidget() method expects only widgets of type DockWidget, so any other
Toshihiro Shimizu 890ddd
  widget type added to this kind of Layout will cause a run-time error.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa DockWidget and DockSeparator classes.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI DockLayout : public QLayout
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::vector<qlayoutitem *=""> m_items;</qlayoutitem>
Toshihiro Shimizu 890ddd
	std::deque<region *=""> m_regions;</region>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DockWidget *m_maximizedDock; //Let the layout know if there is a maximized widget
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Decoration-related allocator (separators)
Toshihiro Shimizu 890ddd
	DockDecoAllocator *m_decoAllocator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DockLayout();
Toshihiro Shimizu 890ddd
	virtual ~DockLayout();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//QLayout item handling (see Qt reference)
Toshihiro Shimizu 890ddd
	int count(void) const;
Toshihiro Shimizu 890ddd
	void addItem(QLayoutItem *item);
Toshihiro Shimizu 890ddd
	QSize sizeHint() const;
Toshihiro Shimizu 890ddd
	QSize minimumSize() const;
Toshihiro Shimizu 890ddd
	QSize maximumSize() const;
Toshihiro Shimizu 890ddd
	QLayoutItem *itemAt(int) const;
Toshihiro Shimizu 890ddd
	QWidget *widgetAt(int) const;
Toshihiro Shimizu 890ddd
	QLayoutItem *takeAt(int);
Toshihiro Shimizu 890ddd
	void setGeometry(const QRect &rect);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void update();									  //Re-applies partition found
Toshihiro Shimizu 890ddd
	void redistribute();							  //Calculates partition
Toshihiro Shimizu 890ddd
	void applyTransform(const QTransform &transform); //Applies tranformation to known parition - Da rimuovere, non serve...
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DockWidget *getMaximized() { return m_maximizedDock; }
Toshihiro Shimizu 890ddd
	void setMaximized(DockWidget *item, bool state = true); //Let DockLayout handle maximization requests
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Docking and undocking methods.
Toshihiro Shimizu 890ddd
	Region *dockItem(DockWidget *item, Region *r = 0, int idx = 0);
Toshihiro Shimizu 890ddd
	void dockItem(DockWidget *item, DockPlaceholder *place);
Toshihiro Shimizu 890ddd
	void dockItem(DockWidget *item, DockWidget *target, int regionSide);
Toshihiro Shimizu 890ddd
	bool undockItem(DockWidget *item);
Toshihiro Shimizu 890ddd
	void calculateDockPlaceholders(DockWidget *item);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Query methods
Toshihiro Shimizu 890ddd
	Region *rootRegion() const { return m_regions.size() ? m_regions.front() : 0; }
Toshihiro Shimizu 890ddd
	const std::deque<region *=""> ®ions() const { return m_regions; }</region>
Toshihiro Shimizu 890ddd
	Region *region(int i) const { return m_regions[i]; }
Toshihiro Shimizu 890ddd
	Region *find(DockWidget *item) const;
Toshihiro Shimizu 890ddd
	QWidget *containerOf(QPoint point) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Save and load DockLayout states
Toshihiro Shimizu 890ddd
	typedef std::pair<std::vector<qrect>, QString> State;</std::vector<qrect>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	State saveState();
Toshihiro Shimizu 890ddd
	bool restoreState(const State &state);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Decorations allocator
Toshihiro Shimizu 890ddd
	void setDecoAllocator(DockDecoAllocator *decoAllocator);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	void applyGeometry();
Toshihiro Shimizu 890ddd
	inline void updateSeparatorCursors();
Toshihiro Shimizu 890ddd
	Region *dockItemPrivate(DockWidget *item, Region *r, int idx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Insertion and removal check - called internally by dock/undockItem
Toshihiro Shimizu 890ddd
	bool isPossibleInsertion(DockWidget *item, Region *parentRegion, int insertionIdx);
Toshihiro Shimizu 890ddd
	bool isPossibleRemoval(DockWidget *item, Region *parentRegion, int removalIdx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Internal save function
Toshihiro Shimizu 890ddd
	void writeRegion(Region *r, QString &hierarchy);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------
Toshihiro Shimizu 890ddd
//    Dock Widget
Toshihiro Shimizu 890ddd
//-----------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!Dockable widgets are widget containers handled by DockLayout class.
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  DockLayouts accept only dock widgets of this class; so if you want to
Toshihiro Shimizu 890ddd
  place a given widget under this kind of layout, a DockWidget shell for
Toshihiro Shimizu 890ddd
  it must be allocated first. The following class implements base dock
Toshihiro Shimizu 890ddd
  widgets, with native floating decorations and no docked title bar.
Toshihiro Shimizu 890ddd
  It is encouraged to reimplement all the essential functions for custom aspect
Toshihiro Shimizu 890ddd
  and behaviour.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa DockLayout and DockPlaceholder classes.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI DockWidget : public QWidget
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	friend class DockLayout;	  //DockLayout is granted access to placeholders' privates
Toshihiro Shimizu 890ddd
	friend class DockPlaceholder; //As above.
Toshihiro Shimizu 890ddd
								  //friend Region;          //Regions need access to m_saveIndex field.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	//Private attributes for dragging purposes
Toshihiro Shimizu 890ddd
	bool m_floating;  //Whether this window is floating or docked
Toshihiro Shimizu 890ddd
	bool m_dragging;  //Whether this window is being dragged
Toshihiro Shimizu 890ddd
	bool m_undocking; //Still docked, but after a mouse button press on a title bar.
Toshihiro Shimizu 890ddd
	//NOTE: m_dragging ==> !m_undocking; m_dragging=>m_floating.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Private infos for resizing purposes
Toshihiro Shimizu 890ddd
	bool m_resizing;  //Whether this window is being resized
Toshihiro Shimizu 890ddd
	int m_marginType; //Type of resize to consider
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Maximization
Toshihiro Shimizu 890ddd
	bool m_maximized;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	QPoint m_dragInitialPos;
Toshihiro Shimizu 890ddd
	QPoint m_dragMouseInitialPos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Widget and Layout links
Toshihiro Shimizu 890ddd
	DockLayout *m_parentLayout;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Decoration-related allocator (placeholders)
Toshihiro Shimizu 890ddd
	DockDecoAllocator *m_decoAllocator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_saveIndex;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	//Protected infos for docking purposes
Toshihiro Shimizu 890ddd
	std::vector<dockplaceholder *=""> m_placeholders;</dockplaceholder>
Toshihiro Shimizu 890ddd
	DockPlaceholder *m_selectedPlace;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DockWidget(QWidget *parent = 0, Qt::WindowFlags flags = Qt::Tool);
Toshihiro Shimizu 890ddd
	virtual ~DockWidget();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Returns the DockLayout owning \b this dock widget
Toshihiro Shimizu 890ddd
	DockLayout *parentLayout() const { return m_parentLayout; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isFloating() const { return m_floating; }
Toshihiro Shimizu 890ddd
	bool isMaximized() const { return m_maximized; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Query functions
Toshihiro Shimizu 890ddd
	QWidget *hoveredWidget(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	DockPlaceholder *placeAdjacentTo(DockWidget *dockWidget, int boundary);
Toshihiro Shimizu 890ddd
	DockPlaceholder *placeOfSeparator(DockSeparator *);
Toshihiro Shimizu 890ddd
	const std::vector<dockplaceholder *=""> &placeholders() const { return m_placeholders; }</dockplaceholder>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Re-implementable functions for custom dock widgets.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the minimum size of the dock widget when docked. This function should be
Toshihiro Shimizu 890ddd
	//!reimlemented whenever minimum size changes between floating and docked appearance.
Toshihiro Shimizu 890ddd
	virtual QSize getDockedMinimumSize() { return minimumSize(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the maximum size of the dock widget when docked. This function should be
Toshihiro Shimizu 890ddd
	//!reimlemented whenever minimum size changes between floating and docked appearance.
Toshihiro Shimizu 890ddd
	virtual QSize getDockedMaximumSize() { return maximumSize(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!This function is called in order to show the dock widget in its floating status. No show() or update()
Toshihiro Shimizu 890ddd
	//!is needed in its body.
Toshihiro Shimizu 890ddd
	//!It can be reimplemented to build custom-styled dock widgets.
Toshihiro Shimizu 890ddd
	virtual void setFloatingAppearance() { setWindowFlags(Qt::Tool); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!This function is called in order to show the dock widget in its docked status. No show() or update()
Toshihiro Shimizu 890ddd
	//!is needed in its body.
Toshihiro Shimizu 890ddd
	//!It can be reimplemented to build custom-styled dock widgets.
Toshihiro Shimizu 890ddd
	virtual void setDockedAppearance() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual bool isDragGrip(QPoint p);
Toshihiro Shimizu 890ddd
	virtual int isResizeGrip(QPoint)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return 0; //Native deco widgets handle margins and resizes on their own
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	enum { leftMargin = 0x1,
Toshihiro Shimizu 890ddd
		   rightMargin = 0x2,
Toshihiro Shimizu 890ddd
		   topMargin = 0x4,
Toshihiro Shimizu 890ddd
		   bottomMargin = 0x8 };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Placeholders-related methods
Toshihiro Shimizu 890ddd
	virtual void selectDockPlaceholder(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void clearDockPlaceholders();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Decorations allocator
Toshihiro Shimizu 890ddd
	void setDecoAllocator(DockDecoAllocator *decoAllocator);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//reimpremented in FlipbookPanel
Toshihiro Shimizu 890ddd
	virtual void onDock(bool docked) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	//Event handling
Toshihiro Shimizu 890ddd
	//Basic events
Toshihiro Shimizu 890ddd
	bool event(QEvent *e);
Toshihiro Shimizu 890ddd
	void mousePressEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void mouseReleaseEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void mouseMoveEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void hoverMoveEvent(QHoverEvent *he);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	//Customizable events
Toshihiro Shimizu 890ddd
	virtual void wheelEvent(QWheelEvent *we);
Toshihiro Shimizu 890ddd
	virtual void mouseDoubleClickEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	virtual void windowTitleEvent(QEvent *) {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------
Toshihiro Shimizu 890ddd
//    DockSeparator
Toshihiro Shimizu 890ddd
//---------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!Separators are interposition widgets among docked DockWidgets of a DockLayout.
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  A DockSeparator has the role of separating sister Regions; it is always owned by a parent
Toshihiro Shimizu 890ddd
  Region and inherits its subdivision (here separation) direction. It also provides basical
Toshihiro Shimizu 890ddd
  interaction with the user, allowing itself to be shifted along separation direction until
Toshihiro Shimizu 890ddd
  geometric constraints are met.
Toshihiro Shimizu 890ddd
  DockSeparator class can be inherited to build custom separators - in that case, a
Toshihiro Shimizu 890ddd
  heir of DockDecoAllocator class allocating the new separator class must be assigned to
Toshihiro Shimizu 890ddd
  the DockLayout.
Toshihiro Shimizu 890ddd
  It is also possible to specify the Separators' thickness used in a DockLayout through the
Toshihiro Shimizu 890ddd
  QLayout::setSpacing(int) method.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \b NOTE: Observe that Separators' geometry is owned by the DockLayout to which it belongs; it
Toshihiro Shimizu 890ddd
  is discouraged (but not forbidden) to manually modify it. You may, for example, modify the
Toshihiro Shimizu 890ddd
  geometry of a DockSeparator when dragging a dock widget over it.
Toshihiro Shimizu 890ddd
  In any case, the layout will automatically regenerate Separators' geometry at each update of
Toshihiro Shimizu 890ddd
  the layout.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa DockLayout and DockWidget classes.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DockSeparator : public QWidget
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	friend class DockLayout; //Layout updates each DockSeparator during DockLayout::applyGeometry()
Toshihiro Shimizu 890ddd
	friend class Region;	 //Region may update a DockSeparator's parent during removeItem()
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DockLayout *m_owner;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Event-related infos
Toshihiro Shimizu 890ddd
	bool m_pressed;
Toshihiro Shimizu 890ddd
	QPoint m_oldOrigin;
Toshihiro Shimizu 890ddd
	QPoint m_oldPos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Structural infos
Toshihiro Shimizu 890ddd
	Region *m_parentRegion;
Toshihiro Shimizu 890ddd
	int m_index;
Toshihiro Shimizu 890ddd
	bool m_orientation;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Constraint infos
Toshihiro Shimizu 890ddd
	double m_leftBound;
Toshihiro Shimizu 890ddd
	double m_rightBound;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DockSeparator(DockLayout *owner, bool orientation, Region *parentRegion);
Toshihiro Shimizu 890ddd
	virtual ~DockSeparator() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Structural getters
Toshihiro Shimizu 890ddd
	bool getOrientation() const { return m_orientation; }
Toshihiro Shimizu 890ddd
	Region *getParentRegion() const { return m_parentRegion; }
Toshihiro Shimizu 890ddd
	int getIndex() const { return m_index; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Public setters
Toshihiro Shimizu 890ddd
	void shift(int dx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	void calculateBounds();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void mousePressEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void mouseReleaseEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void mouseMoveEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------
Toshihiro Shimizu 890ddd
//    Dock Placeholder
Toshihiro Shimizu 890ddd
//---------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!A dock placeholder contains the necessary informations about a possible
Toshihiro Shimizu 890ddd
//!docking solution.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Dock placeholders are top-level widgets used by a DockLayout to draw docking
Toshihiro Shimizu 890ddd
  solutions for a dragged DockWidget. They are actually generated when
Toshihiro Shimizu 890ddd
  dragging of a DockWidget begins: if it belongs to a parent DockLayout, docking
Toshihiro Shimizu 890ddd
  possibilities are calculated and stored into the layout.
Toshihiro Shimizu 890ddd
  Placeholders selection and activation depend on the dragged dock window and therefore
Toshihiro Shimizu 890ddd
  are of its own responsibility.
Toshihiro Shimizu 890ddd
  You may, however, inherit this class to provide custom placeholders; in this case,
Toshihiro Shimizu 890ddd
  a DockDecoAllocator class reimplementing allocation of placeholders must be assigned to
Toshihiro Shimizu 890ddd
  the owner dock widget.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa DockLayout and DockWidget classes
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DockPlaceholder : public QWidget
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	friend class DockLayout; //DockLayout is granted access to placeholders' privates
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Docking informations - private
Toshihiro Shimizu 890ddd
	Region *m_region;
Toshihiro Shimizu 890ddd
	int m_idx;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Docking informations - public
Toshihiro Shimizu 890ddd
	int m_attributes;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Owner
Toshihiro Shimizu 890ddd
	DockSeparator *m_separator;
Toshihiro Shimizu 890ddd
	DockWidget *m_owner;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DockPlaceholder(DockWidget *owner, Region *r, int idx, int attributes = 0);
Toshihiro Shimizu 890ddd
	virtual ~DockPlaceholder() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Member access methods
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns DockSeparator on which docking takes place (if any)
Toshihiro Shimizu 890ddd
	DockSeparator *getSeparator() const;
Toshihiro Shimizu 890ddd
	//!Returns dockWidget owner
Toshihiro Shimizu 890ddd
	DockWidget *getDockWidget() const { return m_owner; }
Toshihiro Shimizu 890ddd
	//!Returns Region owner
Toshihiro Shimizu 890ddd
	Region *getParentRegion() const { return m_region; }
Toshihiro Shimizu 890ddd
	//!Returns insertion index into parent region
Toshihiro Shimizu 890ddd
	int getInsertionIdx() const { return m_idx; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	enum { left = 0,
Toshihiro Shimizu 890ddd
		   right = 1,
Toshihiro Shimizu 890ddd
		   top = 2,
Toshihiro Shimizu 890ddd
		   bottom = 3,
Toshihiro Shimizu 890ddd
		   sepHor = 4,
Toshihiro Shimizu 890ddd
		   sepVert = 5,
Toshihiro Shimizu 890ddd
		   root = 6 };
Toshihiro Shimizu 890ddd
	int getAttribute() const { return m_attributes; }
Toshihiro Shimizu 890ddd
	void setAttribute(int attribute) { m_attributes = attribute; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Geometry functions
Toshihiro Shimizu 890ddd
	QRect parentGeometry() const;
Toshihiro Shimizu 890ddd
	virtual void buildGeometry();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Query functions
Toshihiro Shimizu 890ddd
	//!A root placeholder is passed only if no item is currently docked (special case)
Toshihiro Shimizu 890ddd
	bool isRoot() const { return m_attributes == root; }
Toshihiro Shimizu 890ddd
	DockPlaceholder *parentPlaceholder();
Toshihiro Shimizu 890ddd
	DockPlaceholder *greatestPlaceholder();
Toshihiro Shimizu 890ddd
	DockPlaceholder *childPlaceholder(QPoint p);
Toshihiro Shimizu 890ddd
	DockPlaceholder *smallestPlaceholder(QPoint p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	//!Let wheel events also be propagated to owner dock widget
Toshihiro Shimizu 890ddd
	void wheelEvent(QWheelEvent *we) { m_owner->wheelEvent(we); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------
Toshihiro Shimizu 890ddd
//    Class Region
Toshihiro Shimizu 890ddd
//--------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!Regions represent any rectangular space inside a DockLayout.
Toshihiro Shimizu 890ddd
//!Normally there is no reason to deal with Regions, unless you want to
Toshihiro Shimizu 890ddd
//!build complex docking systems or manually dock widgets into your code.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Regions are rectangular areas of the DockLayout's contentsRect() which
Toshihiro Shimizu 890ddd
  can be either subdiveded into subRegions (all in a given \b subdivision
Toshihiro Shimizu 890ddd
  \b direction) or contain a DockWidget.
Toshihiro Shimizu 890ddd
  Every subRegion, if present, has opposite subdivision direction with
Toshihiro Shimizu 890ddd
  respect to parent one. In addition, regions possess lists of separators
Toshihiro Shimizu 890ddd
  and placeholders found along its subdivision direction.
Toshihiro Shimizu 890ddd
  Region informations are owned by the DockLayout who allocates it; however,
Toshihiro Shimizu 890ddd
  they are read-only accessible by the user.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa DockLayout, DockWidget, DockSeparator and DockPlaceholder classes.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Region
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	friend class DockLayout;	//Layout is the main operating class over rectangular regions - need full access
Toshihiro Shimizu 890ddd
	friend class DockSeparator; //Separators need access to extremal sizes methods when moving themselves
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DockLayout *m_owner;
Toshihiro Shimizu 890ddd
	DockWidget *m_item;
Toshihiro Shimizu 890ddd
	Region *m_parent;
Toshihiro Shimizu 890ddd
	std::deque<region *=""> m_childList;</region>
Toshihiro Shimizu 890ddd
	std::deque<dockseparator *=""> m_separators;</dockseparator>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::vector<dockplaceholder *=""> m_placeholders;</dockplaceholder>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QRectF m_rect;
Toshihiro Shimizu 890ddd
	bool m_orientation;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_minimumSize[2];
Toshihiro Shimizu 890ddd
	int m_maximumSize[2];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_saveIndex;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	Region(DockLayout *owner, DockWidget *item = 0)
Toshihiro Shimizu 890ddd
		: m_owner(owner), m_item(item), m_parent(0), m_orientation(0) {}
Toshihiro Shimizu 890ddd
	~Region();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	enum { inf = 1000000 };
Toshihiro Shimizu 890ddd
	enum { horizontal = 0,
Toshihiro Shimizu 890ddd
		   vertical = 1 };
Toshihiro Shimizu 890ddd
	enum { left = 0x1,
Toshihiro Shimizu 890ddd
		   right = 0x2,
Toshihiro Shimizu 890ddd
		   top = 0x4,
Toshihiro Shimizu 890ddd
		   bottom = 0x8 };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Getters - public
Toshihiro Shimizu 890ddd
	bool getOrientation() const { return m_orientation; }
Toshihiro Shimizu 890ddd
	QRectF getGeometry() const { return m_rect; }
Toshihiro Shimizu 890ddd
	QSizeF getSize() const { return QSizeF(m_rect.width(), m_rect.height()); }
Toshihiro Shimizu 890ddd
	Region *getParent() const { return m_parent; }
Toshihiro Shimizu 890ddd
	DockWidget *getItem() const { return m_item; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const std::deque<region *=""> &getChildList() const { return m_childList; }</region>
Toshihiro Shimizu 890ddd
	Region *childRegion(int i) const { return m_childList[i]; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const std::deque<dockseparator *=""> &separators() const { return m_separators; }</dockseparator>
Toshihiro Shimizu 890ddd
	DockSeparator *separator(int i) const { return m_separators[i]; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::vector<dockplaceholder *=""> &placeholders() { return m_placeholders; }</dockplaceholder>
Toshihiro Shimizu 890ddd
	DockPlaceholder *placeholder(int i) const { return m_placeholders[i]; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	unsigned int find(const Region *subRegion) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	//Setters - private
Toshihiro Shimizu 890ddd
	void setOrientation(bool orientation) { m_orientation = orientation; }
Toshihiro Shimizu 890ddd
	void setGeometry(const QRectF &rect) { m_rect = rect; }
Toshihiro Shimizu 890ddd
	void setSize(const QSizeF &size) { m_rect.setSize(size); }
Toshihiro Shimizu 890ddd
	void setParent(Region *parent) { m_parent = parent; }
Toshihiro Shimizu 890ddd
	void setItem(DockWidget *item) { m_item = item; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Insertion and removal methods
Toshihiro Shimizu 890ddd
	void insertSubRegion(Region *subregion, int idx);
Toshihiro Shimizu 890ddd
	Region *insertItem(DockWidget *item, int idx);
Toshihiro Shimizu 890ddd
	void removeItem(DockWidget *item);
Toshihiro Shimizu 890ddd
	void insertSeparator(DockSeparator *sep);
Toshihiro Shimizu 890ddd
	void removeSeparator();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Extremal region sizes
Toshihiro Shimizu 890ddd
	//!Returns cached occupied space in \b this region along given \b direction.
Toshihiro Shimizu 890ddd
	inline int getMaximumSize(bool direction) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_maximumSize[direction];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	//!Returns cached occupied space in \b this region along given \b direction.
Toshihiro Shimizu 890ddd
	inline int getMinimumSize(bool direction) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_minimumSize[direction];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool addItemSize(DockWidget *item);
Toshihiro Shimizu 890ddd
	bool subItemSize(DockWidget *item);
Toshihiro Shimizu 890ddd
	void calculateExtremalSizes();
Toshihiro Shimizu 890ddd
	int calculateMinimumSize(bool direction, bool recalcChildren);
Toshihiro Shimizu 890ddd
	int calculateMaximumSize(bool direction, bool recalcChildren);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Redistribution function.
Toshihiro Shimizu 890ddd
	//The main feature of a Region consists of the redistribute() method, which
Toshihiro Shimizu 890ddd
	//extracts the optimal layout among the branching regions with \b this
Toshihiro Shimizu 890ddd
	//root. However, only the full redistribute() method in DockLayout is made public.
Toshihiro Shimizu 890ddd
	void redistribute();
Toshihiro Shimizu 890ddd
	void restoreGeometry();
Toshihiro Shimizu 890ddd
	//void updateSeparators();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------
Toshihiro Shimizu 890ddd
//    Dock Allocator
Toshihiro Shimizu 890ddd
//----------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!DockDecoAllocator class handles the allocation of decoration elements used
Toshihiro Shimizu 890ddd
//!by our dock manager.
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  In order to implement custom appearances for the docking system, it
Toshihiro Shimizu 890ddd
  is possible to customize both DockSeparator and DockPlaceholder classes. Since
Toshihiro Shimizu 890ddd
  allocation of such objects is handled internally by the docking system,
Toshihiro Shimizu 890ddd
  it is necessary to reimplement allocator functions whenever decoration
Toshihiro Shimizu 890ddd
  classes change.
Toshihiro Shimizu 890ddd
  In order to assign a DockDecoAllocator to a DockLayout or DockWidget, the
Toshihiro Shimizu 890ddd
  respective 'setDecoAllocator' methods are provided.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa DockLayout, DockWidget, DockSeparator and DockPlaceholder classes.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DockDecoAllocator
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	friend class DockLayout;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DockDecoAllocator() {}
Toshihiro Shimizu 890ddd
	virtual ~DockDecoAllocator() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Customizabile allocators
Toshihiro Shimizu 890ddd
	virtual DockSeparator *newSeparator(DockLayout *owner, bool orientation, Region *parentRegion);
Toshihiro Shimizu 890ddd
	virtual DockPlaceholder *newPlaceholder(DockWidget *owner, Region *r, int idx, int attributes);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	DockPlaceholder *newPlaceBuilt(DockWidget *owner, Region *r, int idx, int attributes);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif // SIMPLEQTTEST_H