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 void _Visible(bool v);
00030
00031 public:
00032 GTreeNode();
00033 virtual ~GTreeNode();
00034
00036 GTreeItem *Insert(GTreeItem *Obj = NULL, int Pos = -1);
00038 void Remove();
00040 void Detach();
00042 GTreeItem *GetNext();
00044 GTreeItem *GetPrev();
00046 GTreeItem *GetChild();
00048 GTreeItem *GetParent() { return Parent; }
00050 GTree *GetTree() { return Tree; }
00052 bool IsRoot();
00054 int IndexOf();
00056 int GetItems();
00057
00058 virtual bool Expanded() { return false; }
00059 virtual void Expanded(bool b) {}
00060 virtual void OnVisible(bool v) {}
00061 };
00062
00064 class LgiClass GTreeItem : public GItem, public GTreeNode
00065 {
00066 friend class GTree;
00067 friend class GTreeNode;
00068
00069 protected:
00070 class GTreeItemPrivate *d;
00071
00072
00073 void _RePour();
00074 void _Pour(GdcPt2 *Limit, int Depth, bool Visible);
00075 void _Remove();
00076 void _MouseClick(GMouse &m);
00077 void _SetTreePtr(GTree *t);
00078 GTreeItem *_HitTest(int x, int y);
00079 GRect *_GetRect(GTreeItemRect Which);
00080 GdcPt2 _ScrollPos();
00081 GTreeItem *Item() { return this; }
00082 GRect *Pos();
00083
00084 virtual void _PourText(GdcPt2 &Size);
00085 virtual void _PaintText(GSurface *pDC, COLOUR Fore, COLOUR Back);
00086
00087 protected:
00088 char *Str;
00089 int Sys_Image;
00090
00091 public:
00092 GTreeItem();
00093 virtual ~GTreeItem();
00094
00101 char *GetText(int i=0);
00105 bool SetText(const char *s, int i=0);
00107 int GetImage(int Flags = 0);
00109 void SetImage(int i);
00112 void Update();
00114 bool Select();
00116 void Select(bool b);
00118 bool Expanded();
00120 void Expanded(bool b);
00122 void ScrollTo();
00123
00125 virtual void OnExpand(bool b);
00126
00128 void OnPaint(ItemPaintCtx &Ctx);
00129 void OnPaint(GSurface *pDC) { LgiAssert(0); }
00130 };
00131
00133 class LgiClass GTree :
00134 public GLayout,
00135 public ResObject,
00136 public GItemContainer,
00137 public GTreeNode
00138 {
00139 friend class GTreeItem;
00140 friend class GTreeNode;
00141
00142 class GTreePrivate *d;
00143
00144
00145 void _Pour();
00146 void _OnSelect(GTreeItem *Item);
00147 void _Update(GRect *r = 0, bool Now = false);
00148 void _UpdateBelow(int y, bool Now = false);
00149 void _UpdateScrollBars();
00150
00151 protected:
00152
00153 bool Lines;
00154 bool Buttons;
00155 bool LinesAtRoot;
00156 bool EditLabels;
00157 bool MultipleSelect;
00158
00159 GdcPt2 _ScrollPos();
00160 GTreeItem *GetAdjacent(GTreeItem *From, bool Down);
00161 void OnDragEnter();
00162 void OnDragExit();
00163
00164 public:
00165 GTree(int id, int x, int y, int cx, int cy, const char *name = 0);
00166 ~GTree();
00167
00168 const char *GetClass() { return "GTree"; }
00169
00171 virtual void OnItemClick(GTreeItem *Item, GMouse &m);
00173 virtual void OnItemBeginDrag(GTreeItem *Item, int Flags);
00175 virtual void OnItemExpand(GTreeItem *Item, bool Expand);
00177 virtual void OnItemSelect(GTreeItem *Item);
00178
00179
00180 void OnMouseClick(GMouse &m);
00181 void OnMouseMove(GMouse &m);
00182 void OnMouseWheel(double Lines);
00183 void OnPaint(GSurface *pDC);
00184 void OnFocus(bool b);
00185 void OnPosChange();
00186 bool OnKey(GKey &k);
00187 int OnNotify(GViewI *Ctrl, int Flags);
00188 int OnEvent(GMessage *Msg);
00189 void OnPulse();
00190
00192 GTreeItem *Insert(GTreeItem *Obj = 0, int Pos = -1);
00194 bool Delete(GTreeItem *Obj);
00196 bool Remove(GTreeItem *Obj);
00198 GTreeItem *ItemAt(int Pos) { return Items.ItemAt(Pos); }
00199
00201 bool Select(GTreeItem *Obj);
00203 GTreeItem *Selection();
00205 GTreeItem *ItemAtPoint(int x, int y);
00208 void SelectDropTarget(GTreeItem *Item);
00209
00211 void Empty();
00213 void RemoveAll();
00215 void UpdateAllItems();
00216 };
00217
00218 #endif
00219