home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / include / wx / generic / treectlg.h < prev    next >
C/C++ Source or Header  |  2003-01-03  |  21KB  |  501 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        wx/generic/treectlg.h
  3. // Purpose:     wxTreeCtrl class
  4. // Author:      Robert Roebling
  5. // Modified by:
  6. // Created:     01/02/97
  7. // RCS-ID:      $Id: treectlg.h,v 1.20.2.3 2002/12/29 07:48:10 RL Exp $
  8. // Copyright:   (c) 1997,1998 Robert Roebling
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifndef _GENERIC_TREECTRL_H_
  13. #define _GENERIC_TREECTRL_H_
  14.  
  15. #if defined(__GNUG__) && !defined(__APPLE__)
  16.     #pragma interface "treectlg.h"
  17. #endif
  18.  
  19. #if wxUSE_TREECTRL
  20.  
  21. #include "wx/scrolwin.h"
  22. #include "wx/pen.h"
  23. #include "wx/imaglist.h"
  24.  
  25. // -----------------------------------------------------------------------------
  26. // forward declaration
  27. // -----------------------------------------------------------------------------
  28.  
  29. class WXDLLEXPORT wxGenericTreeItem;
  30.  
  31. class WXDLLEXPORT wxTreeItemData;
  32.  
  33. class WXDLLEXPORT wxTreeRenameTimer;
  34. class WXDLLEXPORT wxTreeFindTimer;
  35. class WXDLLEXPORT wxTreeTextCtrl;
  36. class WXDLLEXPORT wxTextCtrl;
  37.  
  38. // -----------------------------------------------------------------------------
  39. // wxGenericTreeCtrl - the tree control
  40. // -----------------------------------------------------------------------------
  41.  
  42. class WXDLLEXPORT wxGenericTreeCtrl : public wxScrolledWindow
  43. {
  44. public:
  45.     // creation
  46.     // --------
  47.     wxGenericTreeCtrl() { Init(); }
  48.  
  49.     wxGenericTreeCtrl(wxWindow *parent, wxWindowID id = -1,
  50.                const wxPoint& pos = wxDefaultPosition,
  51.                const wxSize& size = wxDefaultSize,
  52.                long style = wxTR_DEFAULT_STYLE,
  53.                const wxValidator &validator = wxDefaultValidator,
  54.                const wxString& name = wxTreeCtrlNameStr)
  55.     {
  56.         Init();
  57.         Create(parent, id, pos, size, style, validator, name);
  58.     }
  59.  
  60.     virtual ~wxGenericTreeCtrl();
  61.  
  62.     bool Create(wxWindow *parent, wxWindowID id = -1,
  63.                 const wxPoint& pos = wxDefaultPosition,
  64.                 const wxSize& size = wxDefaultSize,
  65.                 long style = wxTR_DEFAULT_STYLE,
  66.                 const wxValidator &validator = wxDefaultValidator,
  67.                 const wxString& name = wxTreeCtrlNameStr);
  68.  
  69.     // accessors
  70.     // ---------
  71.  
  72.         // get the total number of items in the control
  73.     size_t GetCount() const;
  74.  
  75.         // indent is the number of pixels the children are indented relative to
  76.         // the parents position. SetIndent() also redraws the control
  77.         // immediately.
  78.     unsigned int GetIndent() const { return m_indent; }
  79.     void SetIndent(unsigned int indent);
  80.  
  81.         // spacing is the number of pixels between the start and the Text
  82.     unsigned int GetSpacing() const { return m_spacing; }
  83.     void SetSpacing(unsigned int spacing);
  84.  
  85.         // image list: these functions allow to associate an image list with
  86.         // the control and retrieve it. Note that when assigned with
  87.         // SetImageList, the control does _not_ delete
  88.         // the associated image list when it's deleted in order to allow image
  89.         // lists to be shared between different controls. If you use
  90.         // AssignImageList, the control _does_ delete the image list.
  91.         //
  92.         // The normal image list is for the icons which correspond to the
  93.         // normal tree item state (whether it is selected or not).
  94.         // Additionally, the application might choose to show a state icon
  95.         // which corresponds to an app-defined item state (for example,
  96.         // checked/unchecked) which are taken from the state image list.
  97.     wxImageList *GetImageList() const;
  98.     wxImageList *GetStateImageList() const;
  99.     wxImageList *GetButtonsImageList() const;
  100.  
  101.     void SetImageList(wxImageList *imageList);
  102.     void SetStateImageList(wxImageList *imageList);
  103.     void SetButtonsImageList(wxImageList *imageList);
  104.     void AssignImageList(wxImageList *imageList);
  105.     void AssignStateImageList(wxImageList *imageList);
  106.     void AssignButtonsImageList(wxImageList *imageList);
  107.  
  108.     // Functions to work with tree ctrl items.
  109.  
  110.     // accessors
  111.     // ---------
  112.  
  113.         // retrieve item's label
  114.     wxString GetItemText(const wxTreeItemId& item) const;
  115.         // get one of the images associated with the item (normal by default)
  116.     int GetItemImage(const wxTreeItemId& item,
  117.                      wxTreeItemIcon which = wxTreeItemIcon_Normal) const;
  118.         // get the data associated with the item
  119.     wxTreeItemData *GetItemData(const wxTreeItemId& item) const;
  120.  
  121.         // get the item's text colour
  122.     wxColour GetItemTextColour(const wxTreeItemId& item) const;
  123.  
  124.         // get the item's background colour
  125.     wxColour GetItemBackgroundColour(const wxTreeItemId& item) const;
  126.  
  127.         // get the item's font
  128.     wxFont GetItemFont(const wxTreeItemId& item) const;
  129.  
  130.     // modifiers
  131.     // ---------
  132.  
  133.         // set item's label
  134.     void SetItemText(const wxTreeItemId& item, const wxString& text);
  135.         // get one of the images associated with the item (normal by default)
  136.     void SetItemImage(const wxTreeItemId& item, int image,
  137.                       wxTreeItemIcon which = wxTreeItemIcon_Normal);
  138.         // associate some data with the item
  139.     void SetItemData(const wxTreeItemId& item, wxTreeItemData *data);
  140.  
  141.         // force appearance of [+] button near the item. This is useful to
  142.         // allow the user to expand the items which don't have any children now
  143.         // - but instead add them only when needed, thus minimizing memory
  144.         // usage and loading time.
  145.     void SetItemHasChildren(const wxTreeItemId& item, bool has = TRUE);
  146.  
  147.         // the item will be shown in bold
  148.     void SetItemBold(const wxTreeItemId& item, bool bold = TRUE);
  149.  
  150.         // set the item's text colour
  151.     void SetItemTextColour(const wxTreeItemId& item, const wxColour& col);
  152.  
  153.         // set the item's background colour
  154.     void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col);
  155.  
  156.         // set the item's font (should be of the same height for all items)
  157.     void SetItemFont(const wxTreeItemId& item, const wxFont& font);
  158.  
  159.         // set the window font
  160.     virtual bool SetFont( const wxFont &font );
  161.  
  162.        // set the styles.  No need to specify a GetWindowStyle here since
  163.        // the base wxWindow member function will do it for us
  164.     void SetWindowStyle(const long styles);
  165.  
  166.     // item status inquiries
  167.     // ---------------------
  168.  
  169.         // is the item visible (it might be outside the view or not expanded)?
  170.     bool IsVisible(const wxTreeItemId& item) const;
  171.         // does the item has any children?
  172.     bool HasChildren(const wxTreeItemId& item) const
  173.       { return ItemHasChildren(item); }
  174.     bool ItemHasChildren(const wxTreeItemId& item) const;
  175.         // is the item expanded (only makes sense if HasChildren())?
  176.     bool IsExpanded(const wxTreeItemId& item) const;
  177.         // is this item currently selected (the same as has focus)?
  178.     bool IsSelected(const wxTreeItemId& item) const;
  179.         // is item text in bold font?
  180.     bool IsBold(const wxTreeItemId& item) const;
  181.         // does the layout include space for a button?
  182.  
  183.     // number of children
  184.     // ------------------
  185.  
  186.         // if 'recursively' is FALSE, only immediate children count, otherwise
  187.         // the returned number is the number of all items in this branch
  188.     size_t GetChildrenCount(const wxTreeItemId& item, bool recursively = TRUE);
  189.  
  190.     // navigation
  191.     // ----------
  192.  
  193.     // wxTreeItemId.IsOk() will return FALSE if there is no such item
  194.  
  195.         // get the root tree item
  196.     wxTreeItemId GetRootItem() const { return m_anchor; }
  197.  
  198.         // get the item currently selected (may return NULL if no selection)
  199.     wxTreeItemId GetSelection() const { return m_current; }
  200.  
  201.         // get the items currently selected, return the number of such item
  202.     size_t GetSelections(wxArrayTreeItemIds&) const;
  203.  
  204.         // get the parent of this item (may return NULL if root)
  205.     wxTreeItemId GetItemParent(const wxTreeItemId& item) const;
  206.  
  207. #if WXWIN_COMPATIBILITY_2_2
  208.         // deprecated:  Use GetItemParent instead.
  209.     wxTreeItemId GetParent(const wxTreeItemId& item) const
  210.         { return GetItemParent( item ); }
  211.  
  212.         // Expose the base class method hidden by the one above.
  213.     wxWindow *GetParent() const { return wxScrolledWindow::GetParent(); }
  214. #endif  // WXWIN_COMPATIBILITY_2_2
  215.  
  216.         // for this enumeration function you must pass in a "cookie" parameter
  217.         // which is opaque for the application but is necessary for the library
  218.         // to make these functions reentrant (i.e. allow more than one
  219.         // enumeration on one and the same object simultaneously). Of course,
  220.         // the "cookie" passed to GetFirstChild() and GetNextChild() should be
  221.         // the same!
  222.  
  223.         // get the first child of this item
  224.     wxTreeItemId GetFirstChild(const wxTreeItemId& item, long& cookie) const;
  225.         // get the next child
  226.     wxTreeItemId GetNextChild(const wxTreeItemId& item, long& cookie) const;
  227.         // get the last child of this item - this method doesn't use cookies
  228.     wxTreeItemId GetLastChild(const wxTreeItemId& item) const;
  229.  
  230.         // get the next sibling of this item
  231.     wxTreeItemId GetNextSibling(const wxTreeItemId& item) const;
  232.         // get the previous sibling
  233.     wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const;
  234.  
  235.         // get first visible item
  236.     wxTreeItemId GetFirstVisibleItem() const;
  237.         // get the next visible item: item must be visible itself!
  238.         // see IsVisible() and wxTreeCtrl::GetFirstVisibleItem()
  239.     wxTreeItemId GetNextVisible(const wxTreeItemId& item) const;
  240.         // get the previous visible item: item must be visible itself!
  241.     wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const;
  242.  
  243.         // Only for internal use right now, but should probably be public
  244.     wxTreeItemId GetNext(const wxTreeItemId& item) const;
  245.  
  246.     // operations
  247.     // ----------
  248.  
  249.         // add the root node to the tree
  250.     wxTreeItemId AddRoot(const wxString& text,
  251.                          int image = -1, int selectedImage = -1,
  252.                          wxTreeItemData *data = NULL);
  253.  
  254.         // insert a new item in as the first child of the parent
  255.     wxTreeItemId PrependItem(const wxTreeItemId& parent,
  256.                              const wxString& text,
  257.                              int image = -1, int selectedImage = -1,
  258.                              wxTreeItemData *data = NULL);
  259.  
  260.         // insert a new item after a given one
  261.     wxTreeItemId InsertItem(const wxTreeItemId& parent,
  262.                             const wxTreeItemId& idPrevious,
  263.                             const wxString& text,
  264.                             int image = -1, int selectedImage = -1,
  265.                             wxTreeItemData *data = NULL);
  266.  
  267.         // insert a new item before the one with the given index
  268.     wxTreeItemId InsertItem(const wxTreeItemId& parent,
  269.                             size_t index,
  270.                             const wxString& text,
  271.                             int image = -1, int selectedImage = -1,
  272.                             wxTreeItemData *data = NULL);
  273.  
  274.         // insert a new item in as the last child of the parent
  275.     wxTreeItemId AppendItem(const wxTreeItemId& parent,
  276.                             const wxString& text,
  277.                             int image = -1, int selectedImage = -1,
  278.                             wxTreeItemData *data = NULL);
  279.  
  280.         // delete this item and associated data if any
  281.     void Delete(const wxTreeItemId& item);
  282.         // delete all children (but don't delete the item itself)
  283.         // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
  284.     void DeleteChildren(const wxTreeItemId& item);
  285.         // delete all items from the tree
  286.         // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
  287.     void DeleteAllItems();
  288.  
  289.         // expand this item
  290.     void Expand(const wxTreeItemId& item);
  291.         // expand this item and all subitems recursively
  292.     void ExpandAll(const wxTreeItemId& item);
  293.         // collapse the item without removing its children
  294.     void Collapse(const wxTreeItemId& item);
  295.         // collapse the item and remove all children
  296.     void CollapseAndReset(const wxTreeItemId& item);
  297.         // toggles the current state
  298.     void Toggle(const wxTreeItemId& item);
  299.  
  300.         // remove the selection from currently selected item (if any)
  301.     void Unselect();
  302.     void UnselectAll();
  303.         // select this item
  304.     void SelectItem(const wxTreeItemId& item, bool unselect_others=TRUE, bool extended_select=FALSE);
  305.         // make sure this item is visible (expanding the parent item and/or
  306.         // scrolling to this item if necessary)
  307.     void EnsureVisible(const wxTreeItemId& item);
  308.         // scroll to this item (but don't expand its parent)
  309.     void ScrollTo(const wxTreeItemId& item);
  310.     void AdjustMyScrollbars();
  311.  
  312.         // The first function is more portable (because easier to implement
  313.         // on other platforms), but the second one returns some extra info.
  314.     wxTreeItemId HitTest(const wxPoint& point)
  315.         { int dummy; return HitTest(point, dummy); }
  316.     wxTreeItemId HitTest(const wxPoint& point, int& flags);
  317.  
  318.         // get the bounding rectangle of the item (or of its label only)
  319.     bool GetBoundingRect(const wxTreeItemId& item,
  320.                          wxRect& rect,
  321.                          bool textOnly = FALSE) const;
  322.  
  323.         // Start editing the item label: this (temporarily) replaces the item
  324.         // with a one line edit control. The item will be selected if it hadn't
  325.         // been before.
  326.     void EditLabel( const wxTreeItemId& item ) { Edit( item ); }
  327.     void Edit( const wxTreeItemId& item );
  328.         // returns a pointer to the text edit control if the item is being
  329.         // edited, NULL otherwise (it's assumed that no more than one item may
  330.         // be edited simultaneously)
  331.     wxTextCtrl* GetEditControl() const;
  332.  
  333.     // sorting
  334.         // this function is called to compare 2 items and should return -1, 0
  335.         // or +1 if the first item is less than, equal to or greater than the
  336.         // second one. The base class version performs alphabetic comparaison
  337.         // of item labels (GetText)
  338.     virtual int OnCompareItems(const wxTreeItemId& item1,
  339.                                const wxTreeItemId& item2);
  340.         // sort the children of this item using OnCompareItems
  341.         //
  342.         // NB: this function is not reentrant and not MT-safe (FIXME)!
  343.     void SortChildren(const wxTreeItemId& item);
  344.  
  345.     // deprecated functions: use Set/GetItemImage directly
  346.         // get the selected item image
  347.     int GetItemSelectedImage(const wxTreeItemId& item) const
  348.         { return GetItemImage(item, wxTreeItemIcon_Selected); }
  349.         // set the selected item image
  350.     void SetItemSelectedImage(const wxTreeItemId& item, int image)
  351.         { SetItemImage(item, image, wxTreeItemIcon_Selected); }
  352.  
  353.     // implementation only from now on
  354.  
  355.     // overridden base class virtuals
  356.     virtual bool SetBackgroundColour(const wxColour& colour);
  357.     virtual bool SetForegroundColour(const wxColour& colour);
  358.  
  359.     // callbacks
  360.     void OnPaint( wxPaintEvent &event );
  361.     void OnSetFocus( wxFocusEvent &event );
  362.     void OnKillFocus( wxFocusEvent &event );
  363.     void OnChar( wxKeyEvent &event );
  364.     void OnMouse( wxMouseEvent &event );
  365.     void OnIdle( wxIdleEvent &event );
  366.  
  367.     // implementation helpers
  368. protected:
  369.     friend class wxGenericTreeItem;
  370.     friend class wxTreeRenameTimer;
  371.     friend class wxTreeFindTimer;
  372.     friend class wxTreeTextCtrl;
  373.  
  374.     wxFont               m_normalFont;
  375.     wxFont               m_boldFont;
  376.  
  377.     wxGenericTreeItem   *m_anchor;
  378.     wxGenericTreeItem   *m_current,
  379.                         *m_key_current;
  380.     unsigned short       m_indent;
  381.     unsigned short       m_spacing;
  382.     int                  m_lineHeight;
  383.     wxPen                m_dottedPen;
  384.     wxBrush             *m_hilightBrush,
  385.                         *m_hilightUnfocusedBrush;
  386.     bool                 m_hasFocus;
  387.     bool                 m_dirty;
  388.     bool                 m_ownsImageListNormal,
  389.                          m_ownsImageListState,
  390.                          m_ownsImageListButtons;
  391.     bool                 m_isDragging; // true between BEGIN/END drag events
  392.     bool                 m_lastOnSame;  // last click on the same item as prev
  393.     wxImageList         *m_imageListNormal,
  394.                         *m_imageListState,
  395.                         *m_imageListButtons;
  396.  
  397.     int                  m_dragCount;
  398.     wxPoint              m_dragStart;
  399.     wxGenericTreeItem   *m_dropTarget;
  400.     wxCursor             m_oldCursor;  // cursor is changed while dragging
  401.     wxGenericTreeItem   *m_oldSelection;
  402.     wxTreeTextCtrl      *m_textCtrl;
  403.  
  404.     wxTimer             *m_renameTimer;
  405.  
  406.     wxBitmap            *m_arrowRight,
  407.                         *m_arrowDown;
  408.  
  409.     // incremental search data
  410.     wxString             m_findPrefix;
  411.     wxTimer             *m_findTimer;
  412.  
  413.     // the common part of all ctors
  414.     void Init();
  415.  
  416.     // misc helpers
  417.     void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted);
  418.  
  419.     void DrawBorder(const wxTreeItemId& item);
  420.     void DrawLine(const wxTreeItemId& item, bool below);
  421.     void DrawDropEffect(wxGenericTreeItem *item);
  422.  
  423.     wxTreeItemId DoInsertItem(const wxTreeItemId& parent,
  424.                               size_t previous,
  425.                               const wxString& text,
  426.                               int image, int selectedImage,
  427.                               wxTreeItemData *data);
  428.  
  429.     // called by wxTextTreeCtrl when it marks itself for deletion
  430.     void ResetTextControl();
  431.  
  432.     // find the first item starting with the given prefix after the given item
  433.     wxTreeItemId FindItem(const wxTreeItemId& id, const wxString& prefix) const;
  434.  
  435.     bool HasButtons(void) const
  436.         { return (m_imageListButtons != NULL)
  437.               || HasFlag(wxTR_TWIST_BUTTONS|wxTR_HAS_BUTTONS); }
  438.  
  439.     void CalculateLineHeight();
  440.     int  GetLineHeight(wxGenericTreeItem *item) const;
  441.     void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y );
  442.     void PaintItem( wxGenericTreeItem *item, wxDC& dc);
  443.  
  444.     void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y );
  445.     void CalculatePositions();
  446.     void CalculateSize( wxGenericTreeItem *item, wxDC &dc );
  447.  
  448.     void RefreshSubtree( wxGenericTreeItem *item );
  449.     void RefreshLine( wxGenericTreeItem *item );
  450.  
  451.     // redraw all selected items
  452.     void RefreshSelected();
  453.  
  454.     // RefreshSelected() recursive helper
  455.     void RefreshSelectedUnder(wxGenericTreeItem *item);
  456.  
  457.     void OnRenameTimer();
  458.     bool OnRenameAccept(wxGenericTreeItem *item, const wxString& value);
  459.     void OnRenameCancelled(wxGenericTreeItem *item);
  460.  
  461.     void FillArray(wxGenericTreeItem*, wxArrayTreeItemIds&) const;
  462.     void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 );
  463.     bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
  464.     bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
  465.     void UnselectAllChildren( wxGenericTreeItem *item );
  466.  
  467. private:
  468.     DECLARE_EVENT_TABLE()
  469.     DECLARE_DYNAMIC_CLASS(wxGenericTreeCtrl)
  470. };
  471.  
  472. #if !defined(__WXMSW__) || defined(__WIN16__) || defined(__WXUNIVERSAL__)
  473. /*
  474.  * wxTreeCtrl has to be a real class or we have problems with
  475.  * the run-time information.
  476.  */
  477.  
  478. class WXDLLEXPORT wxTreeCtrl: public wxGenericTreeCtrl
  479. {
  480.     DECLARE_DYNAMIC_CLASS(wxTreeCtrl)
  481.  
  482. public:
  483.     wxTreeCtrl() {}
  484.  
  485.     wxTreeCtrl(wxWindow *parent, wxWindowID id = -1,
  486.                const wxPoint& pos = wxDefaultPosition,
  487.                const wxSize& size = wxDefaultSize,
  488.                long style = wxTR_DEFAULT_STYLE,
  489.                const wxValidator &validator = wxDefaultValidator,
  490.                const wxString& name = wxTreeCtrlNameStr)
  491.     : wxGenericTreeCtrl(parent, id, pos, size, style, validator, name)
  492.     {
  493.     }
  494. };
  495. #endif // !__WXMSW__ || __WIN16__ || __WXUNIVERSAL__
  496.  
  497. #endif // wxUSE_TREECTRL
  498.  
  499. #endif // _GENERIC_TREECTRL_H_
  500.  
  501.