00001
00002
00003
00004
00005 #ifndef FL_TREE_H
00006 #define FL_TREE_H
00007
00008 #include <FL/Fl.H>
00009 #include <FL/Fl_Group.H>
00010 #include <FL/Fl_Scrollbar.H>
00011 #include <FL/fl_draw.H>
00012
00013 #include <FL/Fl_Tree_Item.H>
00014 #include <FL/Fl_Tree_Prefs.H>
00015
00017
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00043
00121
00125 enum Fl_Tree_Reason {
00126 FL_TREE_REASON_NONE=0,
00127 FL_TREE_REASON_SELECTED,
00128 FL_TREE_REASON_DESELECTED,
00129 FL_TREE_REASON_OPENED,
00130 FL_TREE_REASON_CLOSED
00131 };
00132
00133
00134 class FL_EXPORT Fl_Tree : public Fl_Group {
00135 Fl_Tree_Item *_root;
00136 Fl_Tree_Item *_item_focus;
00137 Fl_Tree_Item *_callback_item;
00138 Fl_Tree_Reason _callback_reason;
00139 Fl_Tree_Prefs _prefs;
00140 int _scrollbar_size;
00141
00142 protected:
00144 Fl_Scrollbar *_vscroll;
00145
00146 protected:
00147 void item_clicked(Fl_Tree_Item* val);
00149 void do_callback_for_item(Fl_Tree_Item* item, Fl_Tree_Reason reason) {
00150 callback_reason(reason);
00151 callback_item(item);
00152 do_callback((Fl_Widget*)this, user_data());
00153 }
00154 Fl_Tree_Item *next_visible_item(Fl_Tree_Item *start, int dir);
00155
00156 public:
00157 Fl_Tree(int X, int Y, int W, int H, const char *L=0);
00158 ~Fl_Tree();
00159 int handle(int e);
00160 void draw();
00161
00163
00165
00170 void root_label(const char *new_label) {
00171 if ( ! _root ) return;
00172 _root->label(new_label);
00173 }
00175 Fl_Tree_Item* root() {
00176 return(_root);
00177 }
00178
00180
00182 Fl_Tree_Item *add(const char *path);
00183 Fl_Tree_Item* add(Fl_Tree_Item *item, const char *name);
00184 Fl_Tree_Item *insert_above(Fl_Tree_Item *above, const char *name);
00185 Fl_Tree_Item* insert(Fl_Tree_Item *item, const char *name, int pos);
00186
00191 int remove(Fl_Tree_Item *item) {
00192 if ( !item ) return(0);
00193 if ( item == _root ) {
00194 clear();
00195 } else {
00196 Fl_Tree_Item *parent = item->parent();
00197 if ( ! parent ) return(-1);
00198 parent->remove_child(item);
00199 }
00200 return(0);
00201 }
00205 void clear() {
00206 if ( ! _root ) return;
00207 _root->clear_children();
00208 delete _root; _root = 0;
00209 }
00211 void clear_children(Fl_Tree_Item *item) {
00212 if ( item->has_children() ) {
00213 item->clear_children();
00214 redraw();
00215 }
00216 }
00217
00219
00221 Fl_Tree_Item *find_item(const char *path);
00222 const Fl_Tree_Item *find_item(const char *path) const;
00223 int item_pathname(char *pathname, int pathnamelen, const Fl_Tree_Item *item) const;
00224
00225 const Fl_Tree_Item *find_clicked() const;
00226
00236 Fl_Tree_Item *item_clicked() {
00237 return(_callback_item);
00238 }
00239 Fl_Tree_Item *first();
00240 Fl_Tree_Item *next(Fl_Tree_Item *item=0);
00241 Fl_Tree_Item *prev(Fl_Tree_Item *item=0);
00242 Fl_Tree_Item *last();
00243 Fl_Tree_Item *first_selected_item();
00244 Fl_Tree_Item *next_selected_item(Fl_Tree_Item *item=0);
00245
00247
00249
00270 int open(Fl_Tree_Item *item, int docallback=1) {
00271 if ( item->is_open() ) return(0);
00272 item->open();
00273 redraw();
00274 if ( docallback ) {
00275 do_callback_for_item(item, FL_TREE_REASON_OPENED);
00276 }
00277 return(1);
00278 }
00300 int open(const char *path, int docallback=1) {
00301 Fl_Tree_Item *item = find_item(path);
00302 if ( ! item ) return(-1);
00303 return(open(item, docallback));
00304 }
00320 void open_toggle(Fl_Tree_Item *item, int docallback=1) {
00321 if ( item->is_open() ) {
00322 close(item, docallback);
00323 } else {
00324 open(item, docallback);
00325 }
00326 }
00346 int close(Fl_Tree_Item *item, int docallback=1) {
00347 if ( item->is_close() ) return(0);
00348 item->close();
00349 redraw();
00350 if ( docallback ) {
00351 do_callback_for_item(item, FL_TREE_REASON_CLOSED);
00352 }
00353 return(1);
00354 }
00375 int close(const char *path, int docallback=1) {
00376 Fl_Tree_Item *item = find_item(path);
00377 if ( ! item ) return(-1);
00378 return(close(item, docallback));
00379 }
00391 int is_open(Fl_Tree_Item *item) const {
00392 return(item->is_open()?1:0);
00393 }
00406 int is_open(const char *path) const {
00407 const Fl_Tree_Item *item = find_item(path);
00408 if ( ! item ) return(-1);
00409 return(item->is_open()?1:0);
00410 }
00419 int is_close(Fl_Tree_Item *item) const {
00420 return(item->is_close());
00421 }
00431 int is_close(const char *path) const {
00432 const Fl_Tree_Item *item = find_item(path);
00433 if ( ! item ) return(-1);
00434 return(item->is_close()?1:0);
00435 }
00436
00454 int select(Fl_Tree_Item *item, int docallback=1) {
00455 if ( ! item->is_selected() ) {
00456 item->select();
00457 set_changed();
00458 if ( docallback ) {
00459 do_callback_for_item(item, FL_TREE_REASON_SELECTED);
00460 }
00461 redraw();
00462 return(1);
00463 }
00464 return(0);
00465 }
00484 int select(const char *path, int docallback=1) {
00485 Fl_Tree_Item *item = find_item(path);
00486 if ( ! item ) return(-1);
00487 return(select(item, docallback));
00488 }
00502 void select_toggle(Fl_Tree_Item *item, int docallback=1) {
00503 item->select_toggle();
00504 set_changed();
00505 if ( docallback ) {
00506 do_callback_for_item(item, item->is_selected() ? FL_TREE_REASON_SELECTED
00507 : FL_TREE_REASON_DESELECTED);
00508 }
00509 redraw();
00510 }
00528 int deselect(Fl_Tree_Item *item, int docallback=1) {
00529 if ( item->is_selected() ) {
00530 item->deselect();
00531 set_changed();
00532 if ( docallback ) {
00533 do_callback_for_item(item, FL_TREE_REASON_DESELECTED);
00534 }
00535 redraw();
00536 return(1);
00537 }
00538 return(0);
00539 }
00558 int deselect(const char *path, int docallback=1) {
00559 Fl_Tree_Item *item = find_item(path);
00560 if ( ! item ) return(-1);
00561 return(deselect(item, docallback));
00562 }
00563
00564 int deselect_all(Fl_Tree_Item *item=0, int docallback=1);
00565 int select_only(Fl_Tree_Item *selitem, int docallback=1);
00566 int select_all(Fl_Tree_Item *item=0, int docallback=1);
00567 void set_item_focus(Fl_Tree_Item *o);
00568
00577 int is_selected(Fl_Tree_Item *item) const {
00578 return(item->is_selected()?1:0);
00579 }
00589 int is_selected(const char *path) {
00590 Fl_Tree_Item *item = find_item(path);
00591 if ( ! item ) return(-1);
00592 return(is_selected(item));
00593 }
00597 void show_self() {
00598 if ( ! _root ) return;
00599 _root->show_self();
00600 }
00601
00603
00605
00607 int labelsize() const {
00608 return(_prefs.labelsize());
00609 }
00613 void labelsize(int val) {
00614 _prefs.labelsize(val);
00615 }
00616
00622 int labelfont() const {
00623 return(_prefs.labelfont());
00624 }
00630 void labelfont(int val) {
00631 _prefs.labelfont(val);
00632 }
00636 int marginleft() const {
00637 return(_prefs.marginleft());
00638 }
00642 void marginleft(int val) {
00643 _prefs.marginleft(val);
00644 redraw();
00645 }
00649 int margintop() const {
00650 return(_prefs.margintop());
00651 }
00655 void margintop(int val) {
00656 _prefs.margintop(val);
00657 redraw();
00658 }
00662 int openchild_marginbottom() const {
00663 return(_prefs.openchild_marginbottom());
00664 }
00668 void openchild_marginbottom(int val) {
00669 _prefs.openchild_marginbottom(val);
00670 redraw();
00671 }
00675 int connectorwidth() const {
00676 return(_prefs.connectorwidth());
00677 }
00681 void connectorwidth(int val) {
00682 _prefs.connectorwidth(val);
00683 redraw();
00684 }
00688 Fl_Image *usericon() const {
00689 return(_prefs.usericon());
00690 }
00700 void usericon(Fl_Image *val) {
00701 _prefs.usericon(val);
00702 redraw();
00703 }
00708 Fl_Image *openicon() const {
00709 return(_prefs.openicon());
00710 }
00716 void openicon(Fl_Image *val) {
00717 _prefs.openicon(val);
00718 redraw();
00719 }
00724 Fl_Image *closeicon() const {
00725 return(_prefs.closeicon());
00726 }
00732 void closeicon(Fl_Image *val) {
00733 _prefs.closeicon(val);
00734 redraw();
00735 }
00737 int showcollapse() const {
00738 return(_prefs.showcollapse());
00739 }
00748 void showcollapse(int val) {
00749 _prefs.showcollapse(val);
00750 redraw();
00751 }
00753 int showroot() const {
00754 return(_prefs.showroot());
00755 }
00760 void showroot(int val) {
00761 _prefs.showroot(val);
00762 redraw();
00763 }
00765 Fl_Tree_Connector connectorstyle() const {
00766 return(_prefs.connectorstyle());
00767 }
00769 void connectorstyle(Fl_Tree_Connector val) {
00770 _prefs.connectorstyle(val);
00771 redraw();
00772 }
00776 Fl_Tree_Sort sortorder() const {
00777 return(_prefs.sortorder());
00778 }
00780 void sortorder(Fl_Tree_Sort val) {
00781 _prefs.sortorder(val);
00782
00783 }
00788 Fl_Boxtype selectbox() const {
00789 return(_prefs.selectbox());
00790 }
00795 void selectbox(Fl_Boxtype val) {
00796 _prefs.selectbox(val);
00797 redraw();
00798 }
00800 Fl_Tree_Select selectmode() const {
00801 return(_prefs.selectmode());
00802 }
00804 void selectmode(Fl_Tree_Select val) {
00805 _prefs.selectmode(val);
00806 }
00807 int displayed(Fl_Tree_Item *item);
00808 void show_item(Fl_Tree_Item *item, int yoff);
00809 void show_item(Fl_Tree_Item *item);
00810 void show_item_bottom(Fl_Tree_Item *item);
00811 void show_item_middle(Fl_Tree_Item *item);
00812 void show_item_top(Fl_Tree_Item *item);
00813 void display(Fl_Tree_Item *item);
00814 int vposition() const;
00815 void vposition(int ypos);
00816
00829 int is_scrollbar(Fl_Widget *w) {
00830 return( ( w == _vscroll ) ? 1 : 0 );
00831 }
00840 int scrollbar_size() const {
00841 return(_scrollbar_size);
00842 }
00861 void scrollbar_size(int size) {
00862 _scrollbar_size = size;
00863 int scrollsize = _scrollbar_size ? _scrollbar_size : Fl::scrollbar_size();
00864 if ( _vscroll->w() != scrollsize ) {
00865 _vscroll->resize(x()+w()-scrollsize, h(), scrollsize, _vscroll->h());
00866 }
00867 }
00868
00870
00872
00876 void callback_item(Fl_Tree_Item* item) {
00877 _callback_item = item;
00878 }
00882 Fl_Tree_Item* callback_item() {
00883 return(_callback_item);
00884 }
00888 void callback_reason(Fl_Tree_Reason reason) {
00889 _callback_reason = reason;
00890 }
00907 Fl_Tree_Reason callback_reason() const {
00908 return(_callback_reason);
00909 }
00910
00912 void load(class Fl_Preferences&);
00913 };
00914
00915 #endif
00916
00917
00918
00919