| // |
| // "$Id: Fl_Tree_Item.H 8340 2011-01-30 20:22:06Z greg.ercolano $" |
| // |
| |
| #ifndef FL_TREE_ITEM_H |
| #define FL_TREE_ITEM_H |
| |
| #include <FL/Fl.H> |
| #include <FL/Fl_Widget.H> |
| #include <FL/Fl_Image.H> |
| #include <FL/fl_draw.H> |
| |
| #include <FL/Fl_Tree_Item_Array.H> |
| #include <FL/Fl_Tree_Prefs.H> |
| |
| ////////////////////// |
| // FL/Fl_Tree_Item.H |
| ////////////////////// |
| // |
| // Fl_Tree -- This file is part of the Fl_Tree widget for FLTK |
| // Copyright (C) 2009-2010 by Greg Ercolano. |
| // |
| // This library is free software; you can redistribute it and/or |
| // modify it under the terms of the GNU Library General Public |
| // License as published by the Free Software Foundation; either |
| // version 2 of the License, or (at your option) any later version. |
| // |
| // This library is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| // Library General Public License for more details. |
| // |
| // You should have received a copy of the GNU Library General Public |
| // License along with this library; if not, write to the Free Software |
| // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
| // USA. |
| // |
| |
| /// |
| /// \file |
| /// \brief This file contains the definitions for Fl_Tree_Item |
| /// |
| |
| /// \brief Tree item |
| /// |
| /// This class is a single tree item, and manages all of the item's attributes. |
| /// Fl_Tree_Item is used by Fl_Tree, which is comprised of many instances of Fl_Tree_Item. |
| /// |
| /// Fl_Tree_Item is hierarchical; it dynamically manages an Fl_Tree_Item_Array of children |
| /// that are themselves instances of Fl_Tree_Item. Each item can have zero or more children. |
| /// When an item has children, close() and open() can be used to hide or show them. |
| /// |
| /// Items have their own attributes; font size, face, color. |
| /// Items maintain their own hierarchy of children. |
| /// |
| /// When you make changes to items, you'll need to tell the tree to redraw() |
| /// for the changes to show up. |
| /// |
| class FL_EXPORT Fl_Tree_Item { |
| const char *_label; // label (memory managed) |
| Fl_Font _labelfont; // label's font face |
| Fl_Fontsize _labelsize; // label's font size |
| Fl_Color _labelfgcolor; // label's fg color |
| Fl_Color _labelbgcolor; // label's bg color |
| char _open; // item is open? |
| char _visible; // item is visible? |
| char _active; // item activated? |
| char _selected; // item selected? |
| int _xywh[4]; // xywh of this widget (if visible) |
| int _collapse_xywh[4]; // xywh of collapse icon (if any) |
| int _label_xywh[4]; // xywh of label |
| Fl_Widget *_widget; // item's label widget (optional) |
| Fl_Image *_usericon; // item's user-specific icon (optional) |
| Fl_Tree_Item_Array _children; // array of child items |
| Fl_Tree_Item *_parent; // parent item (=0 if root) |
| void *_userdata; // user data that can be associated with an item |
| protected: |
| void show_widgets(); |
| void hide_widgets(); |
| void draw_vertical_connector(int x, int y1, int y2, const Fl_Tree_Prefs &prefs); |
| void draw_horizontal_connector(int x1, int x2, int y, const Fl_Tree_Prefs &prefs); |
| public: |
| Fl_Tree_Item(const Fl_Tree_Prefs &prefs); // CTOR |
| ~Fl_Tree_Item(); // DTOR |
| Fl_Tree_Item(const Fl_Tree_Item *o); // COPY CTOR |
| int x() const { return(_xywh[0]); } |
| int y() const { return(_xywh[1]); } |
| int w() const { return(_xywh[2]); } |
| int h() const { return(_xywh[3]); } |
| void draw(int X, int &Y, int W, Fl_Widget *tree, Fl_Tree_Item *itemfocus, const Fl_Tree_Prefs &prefs, int lastchild=1); |
| void show_self(const char *indent = "") const; |
| void label(const char *val); |
| const char *label() const; |
| |
| /// Set a user-data value for the item. |
| inline void user_data( void* data ) { _userdata = data; } |
| |
| /// Retrieve the user-data value that has been assigned to the item. |
| inline void* user_data() const { return _userdata; } |
| |
| /// Set item's label font face. |
| void labelfont(Fl_Font val) { |
| _labelfont = val; |
| } |
| /// Get item's label font face. |
| Fl_Font labelfont() const { |
| return(_labelfont); |
| } |
| /// Set item's label font size. |
| void labelsize(Fl_Fontsize val) { |
| _labelsize = val; |
| } |
| /// Get item's label font size. |
| Fl_Fontsize labelsize() const { |
| return(_labelsize); |
| } |
| /// Set item's label foreground text color. |
| void labelfgcolor(Fl_Color val) { |
| _labelfgcolor = val; |
| } |
| /// Set item's label text color. |
| void labelcolor(Fl_Color val) { |
| _labelfgcolor = val; |
| } |
| /// Return item's label text color. |
| Fl_Color labelcolor() const { |
| return(_labelfgcolor); |
| } |
| /// Return item's label foreground text color. |
| Fl_Color labelfgcolor() const { |
| return(_labelfgcolor); |
| } |
| /// Set item's label background color. |
| void labelbgcolor(Fl_Color val) { |
| _labelbgcolor = val; |
| } |
| /// Return item's background text color. |
| Fl_Color labelbgcolor() const { |
| return(_labelbgcolor); |
| } |
| /// Assign an FLTK widget to this item. |
| void widget(Fl_Widget *val) { |
| _widget = val; |
| } |
| /// Return FLTK widget assigned to this item. |
| Fl_Widget *widget() const { |
| return(_widget); |
| } |
| /// Return the number of children this item has. |
| int children() const { |
| return(_children.total()); |
| } |
| /// Return the child item for the given 'index'. |
| Fl_Tree_Item *child(int index) { |
| return(_children[index]); |
| } |
| /// Return the const child item for the given 'index'. |
| const Fl_Tree_Item *child(int t) const; |
| /// See if this item has children. |
| int has_children() const { |
| return(children()); |
| } |
| int find_child(const char *name); |
| int find_child(Fl_Tree_Item *item); |
| int remove_child(Fl_Tree_Item *item); |
| int remove_child(const char *new_label); |
| void clear_children(); |
| void swap_children(int ax, int bx); |
| int swap_children(Fl_Tree_Item *a, Fl_Tree_Item *b); |
| const Fl_Tree_Item *find_child_item(char **arr) const; // const |
| Fl_Tree_Item *find_child_item(char **arr); // non-const |
| const Fl_Tree_Item *find_item(char **arr) const; // const |
| Fl_Tree_Item *find_item(char **arr); // non-const |
| ////////////////// |
| // Adding items |
| ////////////////// |
| Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs, const char *new_label); |
| Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs, char **arr); |
| Fl_Tree_Item *insert(const Fl_Tree_Prefs &prefs, const char *new_label, int pos=0); |
| Fl_Tree_Item *insert_above(const Fl_Tree_Prefs &prefs, const char *new_label); |
| int depth() const; |
| Fl_Tree_Item *prev(); |
| Fl_Tree_Item *next(); |
| Fl_Tree_Item *next_sibling(); |
| Fl_Tree_Item *prev_sibling(); |
| Fl_Tree_Item *next_displayed(Fl_Tree_Prefs &prefs); |
| Fl_Tree_Item *prev_displayed(Fl_Tree_Prefs &prefs); |
| |
| /// Return the parent for this item. Returns NULL if we are the root. |
| Fl_Tree_Item *parent() { |
| return(_parent); |
| } |
| /// Return the const parent for this item. Returns NULL if we are the root. |
| const Fl_Tree_Item *parent() const { |
| return(_parent); |
| } |
| /// Set the parent for this item. |
| /// Should only be used by Fl_Tree's internals. |
| /// |
| void parent(Fl_Tree_Item *val) { |
| _parent = val; |
| } |
| ////////////////// |
| // State |
| ////////////////// |
| void open(); |
| void close(); |
| /// See if the item is 'open'. |
| int is_open() const { |
| return(_open?1:0); |
| } |
| /// See if the item is 'closed'. |
| int is_close() const { |
| return(_open?0:1); |
| } |
| /// Toggle the item's open/closed state. |
| void open_toggle() { |
| _open?close():open(); |
| } |
| /// Change the item's selection state to the optionally specified 'val'. |
| /// If 'val' is not specified, the item will be selected. |
| /// |
| void select(int val=1) { |
| _selected = val; |
| } |
| /// Toggle the item's selection state. |
| void select_toggle() { |
| if ( is_selected() ) { |
| deselect(); // deselect if selected |
| } else { |
| select(); // select if deselected |
| } |
| } |
| /// Select self and all children |
| /// Returns count of how many items were in the 'deselected' state, |
| /// ie. how many items were "changed". |
| /// |
| int select_all() { |
| int count = 0; |
| if ( ! is_selected() ) { |
| select(); |
| ++count; |
| } |
| for ( int t=0; t<children(); t++ ) { |
| count += child(t)->select_all(); |
| } |
| return(count); |
| } |
| /// Disable the item's selection state. |
| void deselect() { |
| _selected = 0; |
| } |
| /// Deselect self and all children |
| /// Returns count of how many items were in the 'selected' state, |
| /// ie. how many items were "changed". |
| /// |
| int deselect_all() { |
| int count = 0; |
| if ( is_selected() ) { |
| deselect(); |
| ++count; |
| } |
| for ( int t=0; t<children(); t++ ) { |
| count += child(t)->deselect_all(); |
| } |
| return(count); |
| } |
| /// See if the item is selected. |
| char is_selected() const { |
| return(_selected); |
| } |
| /// Change the item's activation state to the optionally specified 'val'. |
| /// |
| /// When deactivated, the item will be 'grayed out'; the callback() |
| /// won't be invoked if the user clicks on the label. If the item |
| /// has a widget() associated with the item, its activation state |
| /// will be changed as well. |
| /// |
| /// If 'val' is not specified, the item will be activated. |
| /// |
| void activate(int val=1) { |
| _active = val; |
| if ( _widget && val != (int)_widget->active() ) { |
| if ( val ) { |
| _widget->activate(); |
| } else { |
| _widget->deactivate(); |
| } |
| _widget->redraw(); |
| } |
| } |
| /// Deactivate the item; the callback() won't be invoked when clicked. |
| /// Same as activate(0) |
| /// |
| void deactivate() { |
| activate(0); |
| } |
| /// See if the item is activated. |
| char is_activated() const { |
| return(_active); |
| } |
| /// See if the item is activated. |
| char is_active() const { |
| return(_active); |
| } |
| /// See if the item is visible. |
| int visible() const { |
| return(_visible ? 1 : 0); |
| } |
| int visible_r() const; |
| |
| /// Set the user icon's image. '0' will disable. |
| void usericon(Fl_Image *val) { |
| _usericon = val; |
| } |
| /// Get the user icon. Returns '0' if disabled. |
| Fl_Image *usericon() const { |
| return(_usericon); |
| } |
| ////////////////// |
| // Events |
| ////////////////// |
| const Fl_Tree_Item *find_clicked(const Fl_Tree_Prefs &prefs) const; |
| Fl_Tree_Item *find_clicked(const Fl_Tree_Prefs &prefs); |
| int event_on_collapse_icon(const Fl_Tree_Prefs &prefs) const; |
| int event_on_label(const Fl_Tree_Prefs &prefs) const; |
| /// Is this item the root of the tree? |
| int is_root() const { |
| return(_parent==0?1:0); |
| } |
| }; |
| |
| #endif /*FL_TREE_ITEM_H*/ |
| |
| // |
| // End of "$Id: Fl_Tree_Item.H 8340 2011-01-30 20:22:06Z greg.ercolano $". |
| // |