Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TNZ_TREEVIEW_INCLUDED
Toshihiro Shimizu 890ddd
#define TNZ_TREEVIEW_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tw/tw.h"
Toshihiro Shimizu 890ddd
#include "tw/dragdrop.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <set></set>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TWIN_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
#ifdef WIN32
Toshihiro Shimizu 890ddd
#pragma warning(disable : 4251)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TTreeView;
Toshihiro Shimizu 890ddd
class TTreeViewItem;
Toshihiro Shimizu 890ddd
class TTreeViewItemParent;
Toshihiro Shimizu 890ddd
class TScrollbar;
Toshihiro Shimizu 890ddd
class TTextField;
Toshihiro Shimizu 890ddd
class TContextMenu;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TTreeViewItemUpdater
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	virtual bool done() const = 0;
Toshihiro Shimizu 890ddd
	virtual void next() = 0;
Toshihiro Shimizu 890ddd
	virtual bool matchItem(const TTreeViewItem *) const = 0;
Toshihiro Shimizu 890ddd
	virtual TTreeViewItem *createItem(TTreeViewItemParent *parent) const = 0;
Toshihiro Shimizu 890ddd
	virtual ~TTreeViewItemUpdater() {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TTreeViewItemParent
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TTreeView *m_treeView;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	bool m_valid;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	typedef vector<ttreeviewitem *=""> ItemContainer;</ttreeviewitem>
Toshihiro Shimizu 890ddd
	ItemContainer m_children;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TTreeViewItemParent()
Toshihiro Shimizu 890ddd
		: m_treeView(0), m_valid(true)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	virtual ~TTreeViewItemParent();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void clearItems();
Toshihiro Shimizu 890ddd
	int getItemCount() const;
Toshihiro Shimizu 890ddd
	TTreeViewItem *getItem(int index) const;
Toshihiro Shimizu 890ddd
	TTreeViewItem *getItem(wstring name) const;
Toshihiro Shimizu 890ddd
	TTreeViewItem *getItem(string name) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void addItem(TTreeViewItem *item);
Toshihiro Shimizu 890ddd
	void removeItem(TTreeViewItem *item);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void updateItems(TTreeViewItemUpdater &updater);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool hasChild(TTreeViewItem *item) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void onItemChange();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setTreeView(TTreeView *treeView) { m_treeView = treeView; }
Toshihiro Shimizu 890ddd
	TTreeView *getTreeView() const { return m_treeView; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TTreeViewItemParent(const TTreeViewItemParent &);
Toshihiro Shimizu 890ddd
	TTreeViewItemParent &operator=(const TTreeViewItemParent &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TTreeViewItem : public TTreeViewItemParent
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	unsigned char m_status;
Toshihiro Shimizu 890ddd
	TTreeViewItemParent *m_parent;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TTreeViewItem(TTreeViewItemParent *parent);
Toshihiro Shimizu 890ddd
	virtual ~TTreeViewItem();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TTreeViewItemParent *getParent() const { return m_parent; }
Toshihiro Shimizu 890ddd
	void setParent(TTreeViewItemParent *parent);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void clearParent() { m_parent = 0; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void onOpen() {}
Toshihiro Shimizu 890ddd
	virtual void onClose() {}
Toshihiro Shimizu 890ddd
	virtual void onDoubleClick();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TTreeViewItem *getSon(string sonName) { return 0; }
Toshihiro Shimizu 890ddd
	virtual TTreeViewItem *getSon(wstring sonName) { return 0; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isLeaf() const;
Toshihiro Shimizu 890ddd
	bool isEmpty() const;
Toshihiro Shimizu 890ddd
	bool isOpen() const;
Toshihiro Shimizu 890ddd
	bool isSelected() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void open();
Toshihiro Shimizu 890ddd
	void close();
Toshihiro Shimizu 890ddd
	virtual void refresh();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setIsLeaf(bool isLeaf);
Toshihiro Shimizu 890ddd
	void select(bool on);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool unselectDescendents(); // ritorna true se ce n'era uno selezionato
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// "origin" sono le coordinate del punto in basso a sinistra dell'icona
Toshihiro Shimizu 890ddd
	virtual void drawIcon(TTreeView *w, const TPoint &origin);
Toshihiro Shimizu 890ddd
	virtual void drawName(TTreeView *w, const TPoint &origin);
Toshihiro Shimizu 890ddd
	virtual void draw(TTreeView *w, const TPoint &origin);
Toshihiro Shimizu 890ddd
	virtual int getWidth(TTreeView *w);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual wstring getName() const { return L"noname"; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TDimension getIconSize() const;
Toshihiro Shimizu 890ddd
	virtual wstring getTooltipString() { return wstring(); }
Toshihiro Shimizu 890ddd
	virtual string getContextHelpReference() { return string(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual bool isRenameEnabled() const { return false; }
Toshihiro Shimizu 890ddd
	virtual void rename(wstring name){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TContextMenu *createContextMenu()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual bool acceptDrop(const TData *data) const { return false; }
Toshihiro Shimizu 890ddd
	virtual bool drop(const TData *data) { return false; }
Toshihiro Shimizu 890ddd
	virtual bool click(const TPoint &p) { return false; }
Toshihiro Shimizu 890ddd
	virtual bool drag(const TPoint &p) { return false; }
Toshihiro Shimizu 890ddd
	virtual bool rightClick(const TPoint &p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TTreeViewItem(const TTreeViewItem &);
Toshihiro Shimizu 890ddd
	TTreeViewItem &operator=(const TTreeViewItem &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TTreeView
Toshihiro Shimizu 890ddd
	: public TWidget,
Toshihiro Shimizu 890ddd
	  public TTreeViewItemParent,
Toshihiro Shimizu 890ddd
	  public TDragDropListener
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	class Listener
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	public:
Toshihiro Shimizu 890ddd
		virtual void onTreeViewSelect(TTreeView *treeView) = 0;
Toshihiro Shimizu 890ddd
		virtual ~Listener() {}
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	struct VisibleItem {
Toshihiro Shimizu 890ddd
		TPoint m_pos;
Toshihiro Shimizu 890ddd
		// m_pos e' la coordinata del punto in basso a sinistra dell'icona
Toshihiro Shimizu 890ddd
		// (l'origine e' il punto in alto a sinistra della prima icona)
Toshihiro Shimizu 890ddd
		int m_height;
Toshihiro Shimizu 890ddd
		// m_height == getIconSize().ly
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TTreeViewItem *m_item;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		enum {
Toshihiro Shimizu 890ddd
			LastSiblingFlag = 0x1,
Toshihiro Shimizu 890ddd
			RootFlag = 0x2,
Toshihiro Shimizu 890ddd
			SonFlag = 0x4
Toshihiro Shimizu 890ddd
		};
Toshihiro Shimizu 890ddd
		int m_status;
Toshihiro Shimizu 890ddd
		//int m_siblingLinkLength;
Toshihiro Shimizu 890ddd
		//int m_childLinkLength;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		VisibleItem();
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_xMargin,
Toshihiro Shimizu 890ddd
		m_yMargin,
Toshihiro Shimizu 890ddd
		m_iconMargin; // distanza orizzontale fra il bottone "+/-" e l'icona
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<visibleitem> m_visibleItems;</visibleitem>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef MACOSX
Toshihiro Shimizu 890ddd
	//togliere l'ifdef con il gcc3.3.2
Toshihiro Shimizu 890ddd
	bool m_valid;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	int m_height;
Toshihiro Shimizu 890ddd
	int m_yoffset;
Toshihiro Shimizu 890ddd
	int m_xoffset;
Toshihiro Shimizu 890ddd
	//int m_selectedItemIndex;
Toshihiro Shimizu 890ddd
	std::set<int> m_selectedItemIndices;</int>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TScrollbar *m_vScb, *m_hScb;
Toshihiro Shimizu 890ddd
	TTextField *m_renameTextField;
Toshihiro Shimizu 890ddd
	bool m_multiSelectionEnabled;
Toshihiro Shimizu 890ddd
	int m_dropIndex;
Toshihiro Shimizu 890ddd
	vector<listener *=""> m_listeners;</listener>
Toshihiro Shimizu 890ddd
	TPoint m_lastMousePos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// costruttore/distruttore
Toshihiro Shimizu 890ddd
	TTreeView(TWidget *parent, string name = "treeView");
Toshihiro Shimizu 890ddd
	~TTreeView();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// listeners
Toshihiro Shimizu 890ddd
	void addListener(Listener *listener);
Toshihiro Shimizu 890ddd
	void removeListener(Listener *listener);
Toshihiro Shimizu 890ddd
	void notifyListeners();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// configure
Toshihiro Shimizu 890ddd
	void setScrollbars(TScrollbar *h, TScrollbar *v);
Toshihiro Shimizu 890ddd
	void enableMultiSelection(bool on);
Toshihiro Shimizu 890ddd
	bool isMultiSelectionEnabled() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_multiSelectionEnabled;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// resize
Toshihiro Shimizu 890ddd
	void configureNotify(const TDimension &s);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// draw
Toshihiro Shimizu 890ddd
	void repaint();
Toshihiro Shimizu 890ddd
	virtual void drawButton(const TPoint &p, bool open);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// event handlers
Toshihiro Shimizu 890ddd
	void leftButtonDown(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
	void leftButtonDrag(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
	void leftButtonUp(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void rightButtonDown(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
	void rightButtonDrag(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
	void rightButtonUp(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void middleButtonDown(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
	void middleButtonDrag(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
	void middleButtonUp(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void mouseWheel(const TMouseEvent &, int wheel);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void leftButtonDoubleClick(const TMouseEvent &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDropSource::DropEffect onEnter(const TDragDropListener::Event &event);
Toshihiro Shimizu 890ddd
	TDropSource::DropEffect onOver(const TDragDropListener::Event &event);
Toshihiro Shimizu 890ddd
	TDropSource::DropEffect onDrop(const TDragDropListener::Event &event);
Toshihiro Shimizu 890ddd
	void onLeave();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// to override
Toshihiro Shimizu 890ddd
	virtual void onSelect(TTreeViewItem *item){};
Toshihiro Shimizu 890ddd
	virtual bool startDragDrop(TTreeViewItem *item) { return false; }
Toshihiro Shimizu 890ddd
	virtual void onExpand(TTreeViewItem *item){};
Toshihiro Shimizu 890ddd
	virtual void onCollapse(TTreeViewItem *item){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// queries
Toshihiro Shimizu 890ddd
	int getSelectedItemCount() const;
Toshihiro Shimizu 890ddd
	TTreeViewItem *getSelectedItem(int index = 0) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// selection
Toshihiro Shimizu 890ddd
	void selectNone();
Toshihiro Shimizu 890ddd
	void select(TTreeViewItem *item);
Toshihiro Shimizu 890ddd
	void selectParent();
Toshihiro Shimizu 890ddd
	void selectSon(string sonName);
Toshihiro Shimizu 890ddd
	void selectItem(int index); // provvisorio
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// refresh
Toshihiro Shimizu 890ddd
	void refreshCurrentItem();
Toshihiro Shimizu 890ddd
	void refresh();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// tooltips &helps
Toshihiro Shimizu 890ddd
	wstring getTooltipString(const TPoint &);
Toshihiro Shimizu 890ddd
	string getContextHelpReference(const TPoint &p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef MACOSX
Toshihiro Shimizu 890ddd
	//togliere l'ifdef con il gcc3.3.2
Toshihiro Shimizu 890ddd
	void onItemChange();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// misc
Toshihiro Shimizu 890ddd
	void scrollToX(int x);
Toshihiro Shimizu 890ddd
	void scrollToY(int y);
Toshihiro Shimizu 890ddd
	void renameCurrentItem(wstring s);
Toshihiro Shimizu 890ddd
	void updateVisibleItems();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	void getPlacement(int index, TRect &rect);
Toshihiro Shimizu 890ddd
	int getIndexFromY(int y);
Toshihiro Shimizu 890ddd
	void addItemAndSons(TTreeViewItem *item, int indentation);
Toshihiro Shimizu 890ddd
	void updateScrollbars();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif