00001
00002
00003
00004
00005 #ifndef __GTREE2_H
00006 #define __GTREE2_H
00007
00008 #include "GList.h"
00009
00010 enum GTreeItemRect
00011 {
00012 TreeItemPos,
00013 TreeItemThumb,
00014 TreeItemText,
00015 TreeItemIcon
00016 };
00017
00018 class GTreeItem;
00019
00020 class LgiClass GTreeNode
00021 {
00022 protected:
00023 GTree *Tree;
00024 GTreeItem *Parent;
00025 List<GTreeItem> Items;
00026
00027 virtual GTreeItem *Item() { return 0; }
00028 virtual GRect *Pos() { return 0; }
00029
00030 public:
00031 GTreeNode();
00032 virtual ~GTreeNode();
00033
00035 GTreeItem *Insert(GTreeItem *Obj = NULL, int Pos = -1);
00037 void Remove();
00039 void Detach();
00041 GTreeItem *GetNext();
00043 GTreeItem *GetPrev();
00045 GTreeItem *GetChild();
00047 GTreeItem *GetParent() { return Parent; }
00049 GTree *GetTree() { return Tree; }
00051 bool IsRoot();
00053 int IndexOf();
00054 };
00055
00057 class LgiClass GTreeItem : public GItem, public GTreeNode
00058 {
00059 friend class GTree;
00060 friend class GTreeNode;
00061
00062 protected:
00063 class GTreeItemPrivate *d;
00064
00065
00066 void _RePour();
00067 void _Pour(GdcPt2 *Limit, int Depth, bool Visible);
00068 void _Remove();
00069 void _MouseClick(GMouse &m);
00070 void _SetTreePtr(GTree *t);
00071 GTreeItem *_HitTest(int x, int y);
00072 GRect *_GetRect(GTreeItemRect Which);
00073 GdcPt2 _ScrollPos();
00074 GTreeItem *Item() { return this; }
00075 GRect *Pos();
00076
00077 virtual void _PourText(GdcPt2 &Size);
00078 virtual void _PaintText(GSurface *pDC, COLOUR Fore, COLOUR Back);
00079
00080 protected:
00081 char *Str;
00082 int Sys_Image;
00083
00084 public:
00085 GTreeItem();
00086 virtual ~GTreeItem();
00087
00094 char *GetText(int i=0);
00098 bool SetText(char *s, int i=0);
00100 int GetImage(int Flags = 0);
00102 void SetImage(int i);
00105 void Update();
00107 bool Select();
00109 void Select(bool b);
00111 bool Expanded();
00113 void Expanded(bool b);
00115 void ScrollTo();
00116
00118 virtual void OnExpand(bool b) {}
00119
00121 virtual void OnPaint(GSurface *pDC, GRect &r, COLOUR Back);
00122 };
00123
00125 class LgiClass GTree :
00126 public GLayout,
00127 public ResObject,
00128 public GItemContainer,
00129 public GTreeNode
00130 {
00131 friend class GTreeItem;
00132 friend class GTreeNode;
00133
00134 class GTreePrivate *d;
00135
00136
00137 void _Pour();
00138 void _OnSelect(GTreeItem *Item);
00139 GdcPt2 _ScrollPos();
00140 void _Update(GRect *r = 0, bool Now = false);
00141 void _UpdateBelow(int y, bool Now = false);
00142 void _UpdateScrollBars();
00143
00144 protected:
00145
00146 bool Lines;
00147 bool Buttons;
00148 bool LinesAtRoot;
00149 bool EditLabels;
00150 bool MultipleSelect;
00151
00152 GTreeItem *GetAdjacent(GTreeItem *From, bool Down);
00153
00154 public:
00155 GTree(int id, int x, int y, int cx, int cy, char *name = 0);
00156 ~GTree();
00157
00159 virtual void OnItemClick(GTreeItem *Item, GMouse &m);
00161 virtual void OnItemBeginDrag(GTreeItem *Item, int Flags);
00163 virtual void OnItemExpand(GTreeItem *Item, bool Expand);
00165 virtual void OnItemSelect(GTreeItem *Item);
00166
00167
00168 void OnMouseClick(GMouse &m);
00169 void OnMouseMove(GMouse &m);
00170 void OnMouseWheel(double Lines);
00171 void OnPaint(GSurface *pDC);
00172 void OnFocus(bool b);
00173 void OnPosChange();
00174 bool OnKey(GKey &k);
00175 int OnNotify(GViewI *Ctrl, int Flags);
00176 int OnEvent(GMessage *Msg);
00177
00179 GTreeItem *Insert(GTreeItem *Obj = 0, int Pos = -1);
00181 bool Delete(GTreeItem *Obj);
00183 bool Remove(GTreeItem *Obj);
00185 GTreeItem *ItemAt(int Pos) { return Items.ItemAt(Pos); }
00186
00188 bool Select(GTreeItem *Obj);
00190 GTreeItem *Selection();
00192 GTreeItem *ItemAtPoint(int x, int y);
00195 void SelectDropTarget(GTreeItem *Item);
00196
00198 void Empty();
00200 void RemoveAll();
00201 };
00202
00203 #endif
00204