| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624 | 
							- #ifndef _TREEWND_H
 
- #define _TREEWND_H
 
- // BU: lots of changes
 
- // - all items must be deletable, and will be deleted on destructor
 
- // - root items list not allocated w/ new
 
- // - items set sorting within their PtrListSorted instead of manually calling it
 
- // - setting an item to auto-sort does *not* make subitems autosort too
 
- #include <api/wnd/wndclass/scbkgwnd.h>
 
- #include <bfc/ptrlist.h>
 
- #include <api/wnd/wndclass/editwnd.h>
 
- #include <bfc/common.h>
 
- #include <tataki/color/skinclr.h>
 
- #define TREEWND_PARENT ScrlBkgWnd
 
- #define STATUS_EXPANDED  0
 
- #define STATUS_COLLAPSED 1
 
- #define HITTEST_BEFORE   0
 
- #define HITTEST_IN       1
 
- #define HITTEST_AFTER    2
 
- #define LINK_RIGHT       1
 
- #define LINK_TOP         2
 
- #define LINK_BOTTOM      4
 
- #define TAB_NO           FALSE
 
- #define TAB_YES          TRUE
 
- #define TAB_AUTO         2
 
- #define WM_SETITEMDEFERRED WM_USER+6546
 
- #define DC_SETITEM	10
 
- #define DC_DELITEM	20
 
- #define DC_EXPAND	30
 
- #define DC_COLLAPSE	40
 
- // Forward references
 
- class TreeItemList;
 
- class TreeItem;
 
- class TreeWnd;
 
- class FontSize;
 
- // classes & structs
 
- class CompareTreeItem {
 
- public:
 
-   static int compareItem(TreeItem *p1, TreeItem *p2);
 
- };
 
- class TreeItemList : public PtrListQuickSorted<TreeItem, CompareTreeItem> { };
 
- class TreeItem 
 
- {
 
- friend class TreeWnd;
 
- public:
 
-   TreeItem(const wchar_t *label=NULL);
 
-   virtual ~TreeItem();
 
-   virtual SkinBitmap *getIcon();
 
-   virtual void setIcon(SkinBitmap *newicon);
 
-   virtual void onTreeAdd() {}
 
-   virtual void onTreeRemove() {}
 
-   virtual void onChildItemRemove(TreeItem *item) {}
 
-   // override this to keep from being selected
 
-   virtual int isHitTestable() { return 1; }
 
-   virtual void onSelect() {}
 
-   virtual void onDeselect() {}
 
-   virtual int onLeftDoubleClick() { return 0; }
 
-   virtual int onRightDoubleClick() { return 0; }
 
-   virtual int onContextMenu(int x, int y);
 
-   virtual int onChar(UINT key) { return 0; }	// return 1 if you eat the key
 
-   // these are called after the expand/collapse happens
 
-   virtual void onExpand() {}
 
-   virtual void onCollapse() {}
 
-   virtual int onBeginLabelEdit();
 
-   virtual int onEndLabelEdit(const wchar_t *newlabel);
 
-   virtual void setLabel(const wchar_t *label);
 
-   virtual const wchar_t *getLabel();
 
-   void setTip(const wchar_t *tip);
 
-   const wchar_t *getTip();
 
-   // override to draw by yourself. Return the width of what you've drawn
 
-   virtual int customDraw(Canvas *canvas, const POINT &pt, int defaultTxtHeight, int indentation, const RECT &clientRect, const Wasabi::FontInfo *fontInfo); 
 
-   // return 0 to refuse being dragged
 
-   // else return 1 and install the droptype and dropitem
 
-   // also, write suggested title into suggestedTitle if any
 
-   virtual int onBeginDrag(wchar_t *suggestedTitle) { return 0; }
 
-   virtual int dragOver(ifc_window *sourceWnd) { return 0; }
 
-   virtual int dragLeave(ifc_window *sourceWnd) { return 0; }
 
-   virtual int dragDrop(ifc_window *sourceWnd) { return 0; }
 
-   virtual int dragComplete(int success) { return 0; }
 
-   void ensureVisible();
 
-   TreeItem *getNthChild(int nth); // enumerates children (zero based)
 
-   TreeItem *getChild();
 
-   TreeItem *getChildSibling(TreeItem *item);
 
-   TreeItem *getSibling();
 
-   TreeItem *getParent();
 
-   void editLabel();
 
- 	
 
-   int getNumChildren();
 
-   bool hasSubItems();
 
-   void setSorted(int issorted);
 
-   void setChildTab(int haschildtab);
 
-   bool isSorted();
 
-   bool isCollapsed();
 
-   bool isExpanded();
 
-   void invalidate();
 
-   bool isSelected();
 
-   bool isHilited();
 
-   void setHilited(bool ishilited);
 
-   int collapse();
 
-   int expand();
 
-   int getCurRect(RECT *r);
 
-   void setCurrent(bool tf);
 
-   TreeWnd *getTree() const;
 
- protected:
 
-   bool isHilitedDrop();
 
-   void setHilitedDrop(bool ishilitedDrop);
 
-   void linkTo(TreeItem *linkto);
 
- //  void childDeleted(TreeItem *child);
 
-   void setTree(TreeWnd *newtree);
 
-   void addSubItem(TreeItem *item);
 
-   void setCurRect(int x1, int y1, int x2, int y2, int z);
 
-   int getIndent();
 
-   bool needTab();
 
-   void sortItems(); // sorts the children of this item
 
-   void setEdition(bool isedited);
 
-   bool getEdition();
 
- private:
 
-   void setSelected(bool isselected, bool expandCollapse=false, bool editifselected=false);
 
-   // this really calls delete on the subitems
 
-   void deleteSubitems();
 
-   int removeSubitem(TreeItem *item);
 
-   int getItemWidth(int txtHeight, int indentation);
 
-   StringW label;
 
-   class TreeItem *parent;
 
-   TreeItemList subitems;	// children
 
-   RECT curRect;
 
-   int childTab;
 
-   TreeWnd *tree;
 
-   int expandStatus;
 
-   SkinBitmap *icon;
 
-   int _z;
 
-   StringW tooltip;	// if empty, falls back to livetip
 
-   bool selected:1;
 
-   bool hilitedDrop:1;
 
-   bool hilited:1;
 
-   bool being_edited:1;
 
- };
 
- /**
 
-   
 
-   
 
-   @short Tree-like view with leaf items.
 
-   @ver 1.0
 
-   @author Nullsoft
 
-   @see TreeItem
 
- */
 
- class TreeWnd : public TREEWND_PARENT {
 
- friend class TreeItem;
 
- public:
 
- 	
 
- 	/**
 
- 	  Sets up the default values for the TreeWnd. These defaults are 
 
- 	  auto collapse enabled and sets the TreeWnd bitmaps to the default Wasabi
 
- 	  values.
 
- 	*/
 
-   TreeWnd();
 
-   
 
-   /**
 
-     Deletes all the root items (including subitems).
 
-   */
 
-   virtual ~TreeWnd();
 
-   /**  
 
-     Event is triggered when the button is about to be initialized.
 
-     Override this event to implement your own behavior.
 
-   
 
-     @ret 1
 
-   */
 
-   virtual int onInit();
 
-   
 
-   /**
 
-     Paints the bitmap on canvas according 
 
- 	  to current options (centering, tiling, stretching, title).
 
-     @ret 0 for failure, 1 for success
 
-     @param canvas The canvas on which to paint.
 
-   */
 
-   virtual int onPaint(Canvas *canvas);
 
-   
 
-   /**
 
-     Notify a child window via a generic message system.
 
-     @see addChild()
 
-     @ret 
 
-     @param child A pointer to the child window which will receive the notify.
 
-     @param msg The message you want to send to the child.
 
-     @param p1 A user parameter.
 
-     @param p2 A user parameter.
 
-   */
 
-   virtual int childNotify(ifc_window *child, int msg, intptr_t param1=0, intptr_t param2=0);
 
-   /**
 
-     Event triggered when the left mouse
 
-     button is pressed over the TreeWnd.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     Default behavior is to stop editing a TreeItem label
 
-     (if editing was occuring). Also will cause a collapse
 
-     or expansion of the subitems if an item was previously
 
-     selected. 
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The Y coordinate of the mouse.
 
-   */
 
-   virtual int onLeftButtonDown(int x, int y);
 
-   
 
-   /**
 
-     Event is triggered when the left mouse button 
 
-     is released from a previously pressed state.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The Y coordinate of the mouse.
 
-   */
 
-   virtual int onLeftButtonUp(int x, int y);
 
-   
 
-   /**
 
-     Event is triggered when the right mouse button 
 
-     is released from a previously pressed state.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The Y coordinate of the mouse.
 
-   */
 
-   virtual int onRightButtonUp(int x, int y);
 
-   
 
-   /**
 
-     Event is triggered when the mouse is moved 
 
-     over the TreeWnd.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     Default is to handle drops (drag and drop).
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The Y coordinate of the mouse.
 
-   */
 
-   virtual int onMouseMove(int x, int y);
 
-   
 
-   /**
 
-     Do we want the context command menu to pop-up
 
-     on right clicks?
 
-     
 
-     Default is no.
 
-     
 
-     @see ContextCmdI
 
-     @ret 0, AutoContextMenu off; 1, AutoContextMenu on;
 
-   */
 
-   virtual int wantAutoContextMenu() { return 0; }
 
-   /**
 
-     Event is triggered when the left mouse button
 
-     is double clicked and the cursor is over the
 
-     TreeWnd.
 
-     
 
-     Default is to check if the doubleclick
 
-     happened over an item, if it did, it calls
 
-     the item's handler of this event.
 
-     
 
-     @ret 1, if you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The Y coordinate of the mouse.
 
-   */
 
-   virtual int onLeftButtonDblClk(int x, int y);
 
-   
 
-   /**
 
-     Event is triggered when the right mouse button
 
-     is double clicked and the cursor is over the
 
-     TreeWnd.
 
-     
 
-     Default is to check if the doubleclick
 
-     happened over an item, if it did, it calls
 
-     the item's handler of this event.
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The y coordinate of the mouse.
 
-   */
 
-   virtual int onRightButtonDblClk(int x, int y);
 
-   /**
 
-     Event is triggered when the mouse wheel 
 
-     is rolled up.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     Default is to scroll vertically as required.
 
-     When the wheel is clicked and rolled, the
 
-     TreeWnd is scrolled horizontally.
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param clicked The pushed state of the mouse wheel.
 
-     @param lines The number of lines to scroll (or columns if horizontally scrolling).
 
-   */
 
-   virtual int onMouseWheelUp(int clicked, int lines);
 
-   
 
-   /**
 
-     Event is triggered when the mouse wheel 
 
-     is rolled down.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     Default is to scroll vertically as required.
 
-     When the wheel is clicked and rolled, the
 
-     TreeWnd is scrolled horizontally.
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param clicked The pushed state of the mouse wheel.
 
-     @param lines The number of lines to scroll (or columns if horizontally scrolling).
 
-   */
 
-   virtual int onMouseWheelDown(int clicked, int lines);
 
-   
 
-   /**
 
-   */
 
-   virtual void timerCallback(int c);
 
-   /**
 
-     Event is triggered when the right click occurs over 
 
-     the TreeWnd, but not on a TreeItem.
 
-     
 
-     Override this to implement your own behavior.
 
-         
 
-     @ret 1, If you handle the event.
 
-     @param x The X coordinate of the mouse.
 
-     @param y The Y coordinate of the mouse.
 
-   */
 
-   virtual int onContextMenu(int x, int y);
 
-   // override and return 1 to abort calling context menu on item
 
-   virtual int onPreItemContextMenu(TreeItem *item, int x, int y) { return 0; }
 
-   // override to catch when item context menu complete
 
-   virtual void onPostItemContextMenu(TreeItem *item, int x, int y, int retval) { }
 
-   
 
-   /**
 
-     Event is triggered when a scheduled deferred callback
 
-     occurs.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     @ret 1, If you handle this event; 0, If you do not handle this event;
 
-     @param param1 Generic user paramater 1.
 
-     @param param2 Generic user paramater 2.
 
-   */
 
-   virtual int onDeferredCallback(intptr_t param1, intptr_t param2);
 
-   /**
 
-     Event is triggered when a key is pressed
 
-     and the TreeWnd has focus.
 
-     
 
-     Override this to implement your own behavior.
 
-     
 
-     @ret 1, If you handle the event.
 
-     @param c The key that was pressed.
 
-   */
 
-   virtual int onChar(unsigned int c);
 
-   
 
-   /**
 
-     Event is triggered when a key is pressed
 
-     and the TreeWnd has focus.
 
-     
 
-     This method handles extended keys.
 
-     
 
-     @ret 1, If you handle the event.
 
-   */
 
-   virtual int onKeyDown(int keycode);
 
-   
 
-   /**
 
-     
 
-   */
 
-   virtual void jumpToNext(wchar_t c);
 
-   
 
-   /**
 
-     Verifies if the item received is in the 
 
-     viewable area of the TreeWnd. If not, it
 
-     will make it visible by scrolling to the
 
-     appropriate position.
 
-     
 
-     @param item A pointer to the item to verify.
 
-   */
 
-   void ensureItemVisible(TreeItem *item);
 
-   // don't need to override this: just calls thru to the treeitem
 
-   virtual int onBeginDrag(TreeItem *treeitem);
 
-   virtual int dragEnter(ifc_window *sourceWnd);
 
-   virtual int dragOver(int x, int y, ifc_window *sourceWnd);
 
-   virtual int dragLeave(ifc_window *sourceWnd);
 
-   virtual int dragDrop(ifc_window *sourceWnd, int x, int y);
 
-   virtual int dragComplete(int success);
 
-   int wantFocus() { return 1; }
 
-   // override this if you want to control the item sort order
 
-   virtual int compareItem(TreeItem *p1, TreeItem *p2);
 
- protected:
 
-   // these will be called if the pointer is not over a treeitem
 
-   virtual int defaultDragOver(int x, int y, ifc_window *sourceWnd) { return 0; }
 
-   virtual int defaultDragDrop(ifc_window *sourceWnd, int x, int y) { return 0; }
 
-   // called with item that received a drop
 
-   virtual void onItemRecvDrop(TreeItem *item) {}
 
-   virtual void onLabelChange(TreeItem *item) {}
 
-   virtual void onItemSelected(TreeItem *item) {}
 
-   virtual void onItemDeselected(TreeItem *item) {}
 
-   virtual int onGetFocus();
 
-   virtual int onKillFocus();
 
- public:
 
-   virtual int getContentsWidth();
 
-   virtual int getContentsHeight();
 
-   void setRedraw(bool r);
 
-   TreeItem *addTreeItem(TreeItem *item, TreeItem *par=NULL, int sorted=TRUE, int haschildtab=FALSE);
 
-   // just removes a TreeItem from the tree, doesn't delete it... this is for
 
-   // ~TreeItem to call only
 
-   int removeTreeItem(TreeItem *item);
 
-   void moveTreeItem(TreeItem *item, TreeItem *newparent);
 
-   void deleteAllItems();
 
-   int expandItem(TreeItem *item);
 
-   void expandItemDeferred(TreeItem *item);
 
-   int collapseItem(TreeItem *item);
 
-   void collapseItemDeferred(TreeItem *item);
 
-   void selectItem(TreeItem *item);	// selects.
 
-   void selectItemDeferred(TreeItem *item);// selects. posted.
 
-   void delItemDeferred(TreeItem *item);
 
-   void hiliteItem(TreeItem *item);
 
-   void unhiliteItem(TreeItem *item);
 
-   void setHilitedColor(const wchar_t *colorname);
 
-   ARGB32 getHilitedColor();
 
-   TreeItem *getCurItem();
 
-   TreeItem *hitTest(POINT pos);
 
-   TreeItem *hitTest(int x, int y);
 
-   void editItemLabel(TreeItem *item);
 
-   void cancelEditLabel(int destroyit=0);
 
-   void setAutoEdit(int ae);
 
-   int getAutoEdit();
 
-   // use a NULL item to search all items. returns first item found
 
-   TreeItem *getByLabel(TreeItem *item, const wchar_t *name);
 
-   int getItemRect(TreeItem *item, RECT *r);
 
-   int ownerDraw();
 
-   int getNumRootItems();
 
-   TreeItem *enumRootItem(int which);
 
-   void setSorted(bool dosort);
 
-   bool getSorted();
 
-   void sortTreeItems();
 
-   TreeItem *getSibling(TreeItem *item);
 
-   TreeItem *getItemFromPoint(POINT *pt);
 
-   void setAutoCollapse(bool doautocollapse);
 
-   virtual int setFontSize(int newsize);
 
-   int getFontSize();
 
-   int getNumVisibleChildItems(TreeItem *c);
 
-   int getNumVisibleItems();
 
-   TreeItem *enumVisibleItems(int n);
 
-   TreeItem *enumVisibleChildItems(TreeItem *c, int n);
 
-   int findItem(TreeItem *i); // reverse
 
-   int findChildItem(TreeItem *c, TreeItem *i, int *n);
 
-   TreeItem *enumAllItems(int n);	// unsorted
 
-   void onSelectItem(TreeItem *i);
 
-   void onDeselectItem(TreeItem *i);
 
- protected:
 
-   void hiliteDropItem(TreeItem *item);  
 
-   void unhiliteDropItem(TreeItem *item);
 
-   void invalidateMetrics();
 
- private:
 
-   TreeItemList items;	// root-level stuff
 
-   PtrList<TreeItem> all_items;	// unsorted
 
-   TreeItem *curSelected;
 
- 	BltCanvas *dCanvas;
 
- 	void drawItems(Canvas *c, const Wasabi::FontInfo *fontInfo);
 
-   void setCurItem(TreeItem *item, bool expandCollapse=true, bool editifselected=false);
 
-   void countSubItems(PtrList<TreeItem> &drawlist, TreeItemList *list, int indent, int *c, int *m, int z);
 
-   void getMetrics(int *numItemsShow, int *maxWidth);
 
-   void ensureMetricsValid();
 
-   int getLinkLine(TreeItem *item, int level);
 
-   void endEditLabel(const wchar_t *newlabel);
 
-   void editUpdate();
 
-   int jumpToNextSubItems(TreeItemList *list, wchar_t c);
 
-   int itemHeight;
 
-   AutoSkinBitmap tabClosed, tabOpen;
 
-   AutoSkinBitmap linkTopRight, linkTopBottom, linkTopRightBottom;
 
-   AutoSkinBitmap linkTabTopRight, linkTabTopBottom, linkTabTopRightBottom;
 
-   
 
-   TreeItem *firstItemVisible;
 
-   TreeItem *lastItemVisible;
 
-   TreeItem *mousedown_item, *prevbdownitem;
 
-   POINT mousedown_anchor;
 
-   bool mousedown_dragdone;
 
-   TreeItem *hitItem,		// the dest item
 
-            *draggedItem;	// the source item
 
-   int inHitTest;
 
-   bool metrics_ok;
 
-   int maxWidth;
 
-   int maxHeight;
 
-   StringW defaultTip;
 
-   const wchar_t *getLiveTip();
 
-   void setLiveTip(const wchar_t *tip);
 
-   TreeItem *tipitem;
 
-   bool redraw;
 
-   PtrList<TreeItem> drawList;
 
-   TreeItem *edited;
 
-   EditWnd *editwnd;
 
-   wchar_t editbuffer[256];
 
-   int deleteItems;
 
-   bool firstFound;
 
-   TreeItem *currentItem;
 
-   StringW hilitedColorName;
 
-   SkinColor hilitedColor;
 
-   int autoedit;
 
-   int autocollapse;
 
-   int textsize;
 
-   StringW oldtip;
 
-   StringW accValue;
 
- };
 
- template<class T> class TreeItemParam : public TreeItem {
 
- public:
 
-   TreeItemParam(T _param, const wchar_t *label=NULL) : TreeItem(label) { param = _param; }
 
-   T getParam() { return param; }
 
-   operator T() { return getParam(); }
 
- private:
 
-   T param;
 
- };
 
- #endif
 
 
  |