# data file for the Fltk User Interface Designer (fluid)
version 1.0300 
header_name {.h} 
code_name {.cxx}
decl {\#include <stdio.h>} {public global
} 

decl {\#include <FL/Fl.H>} {public global
} 

decl {\#include <FL/Fl_Pixmap.H>} {public global
} 

decl {\#include <FL/Fl_Group.H>} {public global
} 

decl {\#include <FL/Fl_Tree.H>} {public global
} 

decl {\#include <FL/fl_ask.H>} {public global
} 

decl {\#include <FL/fl_message.H>} {public global
} 

decl {\#include <FL/Fl_File_Chooser.H>} {public global
} 

decl {\#include <FL/Fl_Preferences.H>} {public global
} 

decl {\#include <FL/Fl_Color_Chooser.H>} {public global
} 

decl {int G_cb_counter = 0;} {
  comment {// Global callback event counter} private local
} 

Function {reason_as_name(Fl_Tree_Reason reason)} {
  comment {Return an Fl_Tree_Reason as a text string name} return_type {const char*}
} {
  code {switch ( reason ) {
      case FL_TREE_REASON_NONE:       return("none");
      case FL_TREE_REASON_SELECTED:   return("selected");
      case FL_TREE_REASON_DESELECTED: return("deselected");
      case FL_TREE_REASON_OPENED:     return("opened");
      case FL_TREE_REASON_CLOSED:     return("closed");
      default:                        return("???");
    }} {}
} 

Function {Button_CB(Fl_Widget*w, void*data)} {return_type void
} {
  code {fprintf(stderr, "'%s' button pushed\\n", w->label());} {}
} 

Function {AssignUserIcons()} {
  comment {Assign user icons to the items} open
} {
  code {static const char *L_folder_xpm[] = {
    "11 11 3 1",
    ".  c None",
    "x  c \#d8d833",
    "@  c \#808011",
    "...........",
    ".....@@@@..",
    "....@xxxx@.",
    "@@@@@xxxx@@",
    "@xxxxxxxxx@",
    "@xxxxxxxxx@",
    "@xxxxxxxxx@",
    "@xxxxxxxxx@",
    "@xxxxxxxxx@",
    "@xxxxxxxxx@",
    "@@@@@@@@@@@"};
static Fl_Pixmap L_folderpixmap(L_folder_xpm);

static const char *L_document_xpm[] = {
    "11 11 3 1",
    ".  c None",
    "x  c \#d8d8f8",
    "@  c \#202060",
    ".@@@@@@@@@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@xxxxxxx@.",
    ".@@@@@@@@@."};
static Fl_Pixmap L_documentpixmap(L_document_xpm);

// Assign user icons to tree items
for ( Fl_Tree_Item *item = tree->first(); item; item=item->next())
    if ( usericon_radio->value() )
        // Assign custom icons
        item->usericon(item->has_children() ? &L_folderpixmap : &L_documentpixmap);
    else
    	// Don't assign custom icons
        item->usericon(0);

tree->redraw();} {}
} 

Function {RebuildTree()} {
  comment {Rebuild the 'example tree' from scratch} open
} {
  code {// REBUILD THE TREE TO MAKE CURRENT "DEFAULT" PREFS TAKE EFFECT
tree->clear();
tree->add("Aaa");
tree->add("Bbb");
tree->add("Ccc");
tree->add("Ddd");
tree->add("Bbb/child-01");
tree->add("Bbb/child-01/111");
tree->add("Bbb/child-01/222");
tree->add("Bbb/child-01/333");
tree->add("Bbb/child-02");
tree->add("Bbb/child-03");
tree->add("Bbb/child-04");

{
    static Fl_Button *but = 0;
    // Assign an FLTK widget to one of the items
    Fl_Tree_Item *i;
    if ( ( i = tree->find_item("Bbb/child-03") ) != NULL ) {
        if ( !but ) {		// only do this once at program startup
            tree->begin();
            but = new Fl_Button(1,1,140,1,"ccc button");     // we control w() only
            but->labelsize(10);
	    but->callback(Button_CB);
        }
        i->widget(but);
        tree->end();
    }
}
{
    // Assign an FLTK group to one of the items with widgets
    Fl_Tree_Item *i;
    if ( ( i = tree->find_item("Bbb/child-04") ) != NULL ) {
        static Fl_Group *grp = 0;
        if ( !grp ) {		// only do this once at program startup
            tree->begin();
              grp = new Fl_Group(100,100,140,18); // build group.. tree handles position
              grp->color(FL_WHITE);
              grp->begin();
                Fl_Button *abut = new Fl_Button(grp->x()+0 ,grp->y()+2,65,15,"D1");
                abut->labelsize(10);
		abut->callback(Button_CB);
                Fl_Button *bbut = new Fl_Button(grp->x()+75,grp->y()+2,65,15,"D2");
                bbut->labelsize(10);
		bbut->callback(Button_CB);
              grp->end();
              grp->resizable(grp);
            tree->end();
        }
        i->widget(grp);
    }
}

// Add an 'Ascending' node, and create it sorted
tree->sortorder(FL_TREE_SORT_NONE);
tree->add("Ascending")->close();
tree->sortorder(FL_TREE_SORT_ASCENDING);
tree->add("Ascending/Zzz");
tree->add("Ascending/Xxx");
tree->add("Ascending/Aaa");
tree->add("Ascending/Bbb");
tree->add("Ascending/Yyy");
tree->add("Ascending/Ccc");

// Add a 'Descending' node, and create it sorted
tree->sortorder(FL_TREE_SORT_NONE);
tree->add("Descending")->close();
tree->sortorder(FL_TREE_SORT_DESCENDING);
tree->add("Descending/Zzz");
tree->add("Descending/Xxx");
tree->add("Descending/Aaa");
tree->add("Descending/Bbb");
tree->add("Descending/Yyy");
tree->add("Descending/Ccc");

// Add 500 items in numerical order
tree->sortorder(FL_TREE_SORT_NONE);
for ( int t=0; t<500; t++ ) {
    static char s[80];
    sprintf(s, "500 Items/item %04d", t);
    tree->add(s);
}
tree->close("500 Items");	// close the 500 items by default

AssignUserIcons();

tree->redraw();} {selected
  }
} 

Function {EditColor(Fl_Color val)} {
  comment {Prompt the user to change the specified color} return_type Fl_Color
} {
  code {uchar r,g,b;
// Get the current color
Fl::get_color(val,r,g,b);

// Bring up a color chooser to edit it
fl_color_chooser("Choose Color",r,g,b);

// Return the new color the user picked
return(fl_rgb_color(r,g,b));} {}
} 

Function {} {open
} {
  Fl_Window window {
    label tree open
    xywh {800 102 1015 445} type Double visible
  } {
    Fl_Group tree {
      label Tree
      user_data 1234
      callback {G_cb_counter++; // Increment callback counter whenever tree callback is invoked

Fl_Tree_Item *item = tree->callback_item();
if ( item ) {
  fprintf(stderr, "TREE CALLBACK: label='%s' userdata=%ld reason=%s\\n",
          item->label(),
          (long)(fl_intptr_t)tree->user_data(),
	  reason_as_name(tree->callback_reason()));
} else {
  fprintf(stderr, "TREE CALLBACK: reason=%s item=(no item -- probably multiple items were changed at once)\\n",
          reason_as_name(tree->callback_reason()));
}} open
      tooltip {Test tree} xywh {15 22 280 411} box DOWN_BOX color 55 selection_color 15
      class Fl_Tree
    } {}
    Fl_Group {} {open
      xywh {300 5 705 427}
      code0 {o->resizable(0);}
    } {
      Fl_Box {} {
        label {Tree Globals}
        tooltip {These controls only affect the selected items. If no items are selected, all existing items in tree are modified.} xywh {311 23 335 263} box GTK_DOWN_BOX color 47 labelsize 12 align 1
      }
      Fl_Value_Slider margintop_slider {
        label {margintop()}
        user_data tree
        callback {int val = (int)margintop_slider->value();
tree->margintop(val);
tree->redraw();}
        tooltip {Changes the top margin for the tree widget} xywh {486 31 140 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
        code0 {o->value(tree->margintop());}
        code1 {o->range(0.0, 100.0);}
        code2 {o->step(1.0);}
        code3 {o->color(46); o->selection_color(FL_RED);}
      }
      Fl_Value_Slider marginleft_slider {
        label {marginleft()}
        user_data tree
        callback {int val = (int)marginleft_slider->value();
tree->marginleft(val);
tree->redraw();}
        tooltip {Changes the left margin for the tree widget} xywh {486 51 140 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
        code0 {o->value(tree->marginleft());}
        code1 {o->range(0.0, 100.0);}
        code2 {o->step(1.0);}
        code3 {o->color(46); o->selection_color(FL_RED);}
      }
      Fl_Value_Slider openchild_marginbottom_slider {
        label {openchild_marginbottom()}
        user_data tree
        callback {int val = (int)openchild_marginbottom_slider->value();
tree->openchild_marginbottom(val);
tree->redraw();}
        tooltip {Changes the vertical space below an open child tree} xywh {486 71 140 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
        code0 {o->value(tree->openchild_marginbottom());}
        code1 {o->range(0.0, 100.0);}
        code2 {o->step(1.0);}
        code3 {o->color(46); o->selection_color(FL_RED);}
      }
      Fl_Choice collapseicons_chooser {
        label {Collapse icons}
        callback {static const char *L_open_xpm[] = {
\#ifdef __APPLE__
  "11 11 3 1",
  ".	c \#fefefe",
  "\#	c \#444444",
  "@	c \#000000",
  "\#\#\#\#\#\#\#\#\#\#\#",
  "\#.........\#",
  "\#.........\#",
  "\#....@....\#",
  "\#....@....\#",
  "\#..@@@@@..\#",
  "\#....@....\#",
  "\#....@....\#",
  "\#.........\#",
  "\#.........\#",
  "\#\#\#\#\#\#\#\#\#\#\#"
\#else
    "11 11 2 1",
    ".  c None",
    "@  c \#000000",
    "...@.......",
    "...@@......",
    "...@@@.....",
    "...@@@@....",
    "...@@@@@...",
    "...@@@@@@..",
    "...@@@@@...",
    "...@@@@....",
    "...@@@.....",
    "...@@......",
    "...@......."
\#endif
    };
static Fl_Pixmap L_openpixmap(L_open_xpm);

static const char *L_close_xpm[] = {
\#ifdef __APPLE__
  "11 11 3 1",
  ".	c \#fefefe",
  "\#	c \#444444",
  "@	c \#000000",
  "\#\#\#\#\#\#\#\#\#\#\#",
  "\#.........\#",
  "\#.........\#",
  "\#.........\#",
  "\#.........\#",
  "\#..@@@@@..\#",
  "\#.........\#",
  "\#.........\#",
  "\#.........\#",
  "\#.........\#",
  "\#\#\#\#\#\#\#\#\#\#\#"
\#else
    "11 11 2 1",
    ".  c None",
    "@  c \#000000",
    "...........",
    "...........",
    "...........",
    "...........",
    "...........",
    "@@@@@@@@@@@",
    ".@@@@@@@@@.",
    "..@@@@@@@..",
    "...@@@@@...",
    "....@@@....",
    ".....@....."
\#endif
    };
static Fl_Pixmap L_closepixmap(L_close_xpm);

switch ( collapseicons_chooser->value() ) {
    case 0:
        tree->showcollapse(1);
        tree->openicon(0);
        tree->closeicon(0);
        break;
    case 1:
        tree->showcollapse(1);
        tree->openicon(&L_openpixmap);
        tree->closeicon(&L_closepixmap);
        break;
    case 2:
        tree->showcollapse(0);
        break;
}}
        tooltip {Tests Fl_Tree::openicon() and Fl_Tree::closeicon()} xywh {486 96 140 21} down_box BORDER_BOX labelsize 12 textsize 11
      } {
        MenuItem {} {
          label Normal
          xywh {10 10 36 21} labelsize 12
        }
        MenuItem {} {
          label Custom
          xywh {20 20 36 21} labelsize 12
        }
        MenuItem {} {
          label Off
          xywh {30 30 36 21} labelsize 12
        }
      }
      Fl_Choice connectorstyle_chooser {
        label {Line style}
        callback {// CHANGE COLLAPSESTYLE
switch ( connectorstyle_chooser->value() ) {
    case 0: tree->connectorstyle(FL_TREE_CONNECTOR_NONE);     break;
    case 1: tree->connectorstyle(FL_TREE_CONNECTOR_DOTTED);   break;
    case 2: tree->connectorstyle(FL_TREE_CONNECTOR_SOLID);    break;
}}
        tooltip {Tests connectorstyle() bit flags} xywh {486 120 140 21} down_box BORDER_BOX labelsize 12 textsize 11
        code0 {switch (tree->connectorstyle()) { case FL_TREE_CONNECTOR_NONE: connectorstyle_chooser->value(0); break; case FL_TREE_CONNECTOR_DOTTED: connectorstyle_chooser->value(1); break; case FL_TREE_CONNECTOR_SOLID: connectorstyle_chooser->value(2); break; }}
      } {
        MenuItem {} {
          label None
          xywh {40 40 36 21} labelsize 12
        }
        MenuItem {} {
          label Dotted
          xywh {20 20 36 21} labelsize 12
        }
        MenuItem {} {
          label Solid
          xywh {30 30 36 21} labelsize 12
        }
      }
      Fl_Choice selectmode_chooser {
        label {Selection Mode}
        callback {// Set selection mode
switch ( selectmode_chooser->value() ) {
    case 0:  tree->selectmode(FL_TREE_SELECT_NONE);   break;	// None
    case 1:  tree->selectmode(FL_TREE_SELECT_SINGLE); break;	// Single
    case 2:  tree->selectmode(FL_TREE_SELECT_MULTI);  break; 	// Multi
    default: tree->selectmode(FL_TREE_SELECT_SINGLE); break;	// Single
}}
        tooltip {Sets how Fl_Tree handles mouse selection of tree items} xywh {486 144 140 21} down_box BORDER_BOX labelsize 12 textsize 11
        code0 {selectmode_chooser->value(1);}
        code1 {cb_selectmode_chooser(selectmode_chooser, (void*)0);}
      } {
        MenuItem {} {
          label None
          xywh {40 40 36 21} labelsize 12
        }
        MenuItem {} {
          label Single
          xywh {50 50 36 21} labelsize 12
        }
        MenuItem {} {
          label Multi
          xywh {60 60 36 21} labelsize 12
        }
      }
      Fl_Choice whenmode_chooser {
        label When
        callback {// Set when mode
switch ( whenmode_chooser->value() ) {
  case 0:  tree->when(FL_WHEN_RELEASE);   break;
  case 1:  tree->when(FL_WHEN_CHANGED);   break;
  case 2:  tree->when(FL_WHEN_NEVER);     break;
  default: tree->when(FL_WHEN_RELEASE);   break;
}}
        tooltip {Sets when() the tree's callback is invoked} xywh {486 168 140 21} down_box BORDER_BOX labelsize 12 textsize 11
        code0 {whenmode_chooser->value(1);}
        code1 {cb_whenmode_chooser(whenmode_chooser, (void*)0);}
      } {
        MenuItem {} {
          label Changed
          xywh {50 50 36 21} labelsize 12
        }
        MenuItem {} {
          label Released
          xywh {60 60 36 21} labelsize 12
        }
        MenuItem {} {
          label Never
          xywh {70 70 36 21} labelsize 12
        }
      }
      Fl_Check_Button usericon_radio {
        label {Enable user icons?}
        user_data tree
        callback {AssignUserIcons();}
        tooltip {Tests Fl_Tree_Item::usericon()} xywh {486 194 20 16} down_box DOWN_BOX labelsize 12 align 7
        code0 {usericon_radio->value(1);}
      }
      Fl_Check_Button showroot_radio {
        label {Show root?}
        user_data tree
        callback {int onoff = showroot_radio->value();
tree->showroot(onoff);}
        tooltip {Tests tree->showroot();} xywh {486 211 20 16} down_box DOWN_BOX labelsize 12 align 7
        code0 {int onoff = tree->showroot(); showroot_radio->value(onoff);}
      }
      Fl_Check_Button visiblefocus_checkbox {
        label {Visible focus?}
        user_data tree
        callback {int onoff = visiblefocus_checkbox->value();
tree->visible_focus(onoff);}
        tooltip {Toggles the tree's visible_focus() box} xywh {486 228 20 16} down_box DOWN_BOX labelsize 12 align 7
        code0 {int onoff = tree->visible_focus(); visiblefocus_checkbox->value(onoff);}
      }
      Fl_Button selection_color_button {
        label {Selection Color}
        callback {Fl_Color val = EditColor(tree->selection_color());		// Get color of first item in tree
selection_color_button->color(val);	// update modified color to button
tree->selection_color(val);
tree->redraw();}
        tooltip {Changes the tree widget's selection color. Tests Fl_Tree::selection_color()} xywh {486 251 16 16} box DOWN_BOX labelsize 12 align 7
        code0 {o->color(tree->selection_color());}
      }
      Fl_Box {} {
        label {Test Operations}
        tooltip {These controls only affect the defaults for new items that are created. These test the Fl_Tree_Prefs methods.} xywh {311 312 335 120} box GTK_DOWN_BOX color 47 labelsize 12 align 1
      }
      Fl_Box showitem_box {
        label {show_item()
}
        xywh {331 335 70 82} box GTK_DOWN_BOX labelsize 11 align 1
      }
      Fl_Button {} {
        label Show
        callback {Fl_Tree_Item *item = tree->next_selected_item();
tree->show_item(item);}
        tooltip {Tests show_item() with no position specified.
Makes the selected item visible IF it is off-screen.
No change made if it is not off-screen.} xywh {346 344 40 17} labelsize 11
      }
      Fl_Button {} {
        label Top
        callback {Fl_Tree_Item *item = tree->next_selected_item();
tree->show_item_top(item);}
        tooltip {Test show_item_top().
Scrolls selected item to the top of the display
(only works if scrollbar showing)
To use:
1) open '500 items'
2) select item 0010
3) Hit Top/Mid/Bot} xywh {346 361 40 16} labelsize 11
      }
      Fl_Button {} {
        label Mid
        callback {Fl_Tree_Item *item = tree->next_selected_item();
tree->show_item_middle(item);}
        tooltip {Tests show_item_middle().
Scrolls the selected item to the middle of the display
To use:
  1) open '500 items'
  2) select 'item 0010'
  3) Hit Top/Mid/Bot} xywh {346 377 40 16} labelsize 11
      }
      Fl_Button {} {
        label Bot
        callback {Fl_Tree_Item *item = tree->next_selected_item();
tree->show_item_bottom(item);}
        tooltip {Tests show_item_bottom().
Scrolls the selected item to the bottom of the display
To use:
  1) open '500 items'
  2) select 'item 0010'
  3) Hit Top/Mid/Bot} xywh {346 393 40 16} labelsize 11
      }
      Fl_Button loaddb_button {
        label {Load Database...}
        callback {const char *filename = fl_file_chooser("Select a Preferences style Database", "Preferences(*.prefs)", 0L);
if (filename) {
  tree->clear();
  Fl_Preferences prefs(filename, 0L, 0L);
  tree->load(prefs);
  tree->redraw();
}}
        tooltip {Load the contents of an Fl_Preferences database into the tree view} xywh {431 338 95 16} labelsize 9
      }
      Fl_Button insertabove_button {
        label {Insert Above}
        callback {Fl_Tree_Item *item=tree->first();
while (item) {
    if ( item->is_selected() ) {
        tree->insert_above(item, "AaaAaa");
        tree->insert_above(item, "BbbBbb");
        tree->insert_above(item, "CccCcc");
    }
    item = item->next();
}

tree->redraw();}
        tooltip {Inserts three items above the selected items} xywh {431 358 95 16} labelsize 9
      }
      Fl_Button rebuildtree_button {
        label {Rebuild Tree}
        callback {RebuildTree();}
        tooltip {Rebuilds the tree with defaults} xywh {431 378 95 16} labelsize 9
      }
      Fl_Button showpathname_button {
        label {Show Pathname}
        callback {Fl_Tree_Item *item = tree->first_selected_item();
if ( !item ) { fl_message("No item was selected"); return; }

char pathname[256];
switch ( tree->item_pathname(pathname, sizeof(pathname), item) ) {
    case  0: fl_message("Pathname for '%s' is: \\"%s\\"", (item->label() ? item->label() : "???"), pathname); break;
    case -1: fl_message("item_pathname() returned -1 (NOT FOUND)"); break;
    case -2: fl_message("item_pathname() returned -2 (STRING TOO LONG)"); break;
}}
        tooltip {Show the pathname for the selected item. Tests the Fl_Tree::item_pathname() method.} xywh {431 398 95 16} labelsize 9
      }
      Fl_Button clearall_button {
        label {Clear All}
        callback {tree->clear();
tree->redraw();}
        tooltip {Clears all items
Tests Fl_Tree::clear()} xywh {531 338 95 16} labelsize 9
      }
      Fl_Button testcallbackflag_button {
        label {Test Callback Flag}
        callback {Fl_Tree_Item *root = tree->root();
fprintf(stderr, "--- Checking docallback off\\n");
if (!root) return;

//// "OFF" TEST

// open/close: Make sure these methods don't trigger cb
G_cb_counter = 0; tree->close(root, 0);       if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n close(item) triggered cb!");
G_cb_counter = 0; tree->open(root, 0);        if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n open(item) triggered cb!");
G_cb_counter = 0; tree->open_toggle(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n open_toggle(item) triggered cb!");
G_cb_counter = 0; tree->open("ROOT", 0);      if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n open(path) triggered cb!");
G_cb_counter = 0; tree->close("ROOT", 0);     if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n close(path) triggered cb!");
tree->open(root,0);	// leave root open

// select/deselect: Make sure these methods don't trigger cb
G_cb_counter = 0; tree->select(root, 0);        if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n select(item) triggered cb!");
G_cb_counter = 0; tree->deselect(root, 0);      if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n deselect(item) triggered cb!");
G_cb_counter = 0; tree->select_toggle(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n select_toggle(item) triggered cb!");
G_cb_counter = 0; tree->deselect("ROOT", 0);    if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n deselect(path) triggered cb!");
G_cb_counter = 0; tree->select("ROOT", 0);      if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\\n select(path) triggered cb!");
tree->deselect("ROOT"); // leave deselected

//// "ON" TEST

// open/close: Make sure these methods don't trigger cb
G_cb_counter = 0; tree->close(root, 1);       if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n close(item) cb wasn't triggered!");
G_cb_counter = 0; tree->open(root, 1);        if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n open(item) cb wasn't triggered!");
G_cb_counter = 0; tree->open_toggle(root, 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n open_toggle(item) cb wasn't triggered!");
G_cb_counter = 0; tree->open(root, 1);        if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n open(item)[2] cb wasn't triggered!");
G_cb_counter = 0; tree->close(root, 1);       if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n close(item)[2] cb wasn't triggered!");
G_cb_counter = 0; tree->open("ROOT", 1);      if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n open(path) cb wasn't triggered!");
G_cb_counter = 0; tree->close("ROOT", 1);     if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n close(path) cb wasn't triggered!");
tree->open(root,0);	// leave root open

// select/deselect: Make sure these methods don't trigger cb
G_cb_counter = 0; tree->select(root, 1);        if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n select(item) cb wasn't triggered!");
G_cb_counter = 0; tree->deselect(root, 1);      if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n deselect(item) cb wasn't triggered!");
G_cb_counter = 0; tree->select_toggle(root, 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n select_toggle(item) cb wasn't triggered!");
G_cb_counter = 0; tree->deselect("ROOT", 1);    if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n deselect(path) cb wasn't triggered!");
G_cb_counter = 0; tree->select("ROOT", 1);      if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\\n select(path) cb wasn't triggered!");
tree->deselect("ROOT"); // leave deselected

//// "default" TEST (should be same as 'on'

// open/close: Make sure these methods don't trigger cb
G_cb_counter = 0; tree->close(root);       if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: close(item) cb wasn't triggered!");
G_cb_counter = 0; tree->open(root);        if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: open(item) cb wasn't triggered!");
G_cb_counter = 0; tree->open_toggle(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: open_toggle(item) cb wasn't triggered!");
G_cb_counter = 0; tree->open("ROOT");      if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: open(path) cb wasn't triggered!");
G_cb_counter = 0; tree->close("ROOT");     if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: close(path) cb wasn't triggered!");
tree->open(root,0);	// leave root open

// select/deselect: Make sure these methods don't trigger cb
G_cb_counter = 0; tree->select(root);        if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\\n select(item) cb wasn't triggered!");
G_cb_counter = 0; tree->deselect(root);      if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\\n deselect(item) cb wasn't triggered!");
G_cb_counter = 0; tree->select_toggle(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\\n select_toggle(item) cb wasn't triggered!");
G_cb_counter = 0; tree->deselect("ROOT");    if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\\n deselect(path) cb wasn't triggered!");
G_cb_counter = 0; tree->select("ROOT");      if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\\n select(path) cb wasn't triggered!");
tree->deselect("ROOT"); // leave deselected

fl_alert("TEST COMPLETED\\n If you didn't see any error dialogs, test PASSED.");}
        tooltip {Test the 'docallback' argument can disable callbacks.} xywh {531 358 95 16} labelsize 9
      }
      Fl_Box {} {
        label {Selected Items}
        tooltip {These controls only affect the selected items. If no items are selected, all existing items in tree are modified.} xywh {661 23 335 263} box GTK_DOWN_BOX color 47 labelsize 12 align 1
      }
      Fl_Choice all_font_choice {
        label {Label Font}
        callback {// Find first item in tree
Fl_Tree_Item *item = tree->first();
if ( !item ) return;

// Get first item's font.
Fl_Font val = (Fl_Font)all_font_choice->value(); // Get font value

// Do selected items
int count = 0;
for ( item=tree->first(); item; item = tree->next(item) ) {
    if ( item->is_selected() ) {
        item->labelfont(val);
        count++;
    }
}

// No items selected? Do all..
if ( ! count ) {
    for ( item=tree->first(); item; item = tree->next(item) ) {
        item->labelfont(val);
    }
}

tree->redraw();}
        tooltip {Changes the font for the selected items's labels. If none selected, all are changed. Tests Fl_Tree_Item::labelfont();} xywh {828 31 140 21} down_box BORDER_BOX labelsize 12 textsize 11
        code0 {o->value((int)tree->item_labelfont());   // get tree's current font, assign to chooser}
      } {
        MenuItem {} {
          label Helvetica
          xywh {30 30 36 21} labelsize 12
        }
        MenuItem {} {
          label {Helvetica Bold}
          xywh {40 40 36 21} labelsize 12
        }
        MenuItem {} {
          label {Helvetica Italic}
          xywh {55 55 36 21} labelsize 12
        }
        MenuItem {} {
          label {Helvetica Bold Italic}
          xywh {60 60 36 21} labelsize 12
        }
        MenuItem {} {
          label Courier
          xywh {70 70 36 21} labelsize 12
        }
        MenuItem {} {
          label {Courier Bold}
          xywh {80 80 36 21} labelsize 12
        }
        MenuItem {} {
          label {Courier Italic}
          xywh {65 65 36 21} labelsize 12
        }
        MenuItem {} {
          label {Courier Bold Italic}
          xywh {70 70 36 21} labelsize 12
        }
        MenuItem {} {
          label Times
          xywh {80 80 36 21} labelsize 12
        }
        MenuItem {} {
          label {Times Bold}
          xywh {90 90 36 21} labelsize 12
        }
        MenuItem {} {
          label {Times Italic}
          xywh {75 75 36 21} labelsize 12
        }
        MenuItem {} {
          label {Times Bold Italic}
          xywh {80 80 36 21} labelsize 12
        }
        MenuItem {} {
          label Symbol
          xywh {90 90 36 21} labelsize 12
        }
        MenuItem {} {
          label Screen
          xywh {100 100 36 21} labelsize 12
        }
        MenuItem {} {
          label {Screen bold}
          xywh {85 85 36 21} labelsize 12
        }
        MenuItem {} {
          label {Zapf Dingbats}
          xywh {90 90 36 21} labelsize 12
        }
      }
      Fl_Value_Slider labelsize_slider {
        label {Label Size}
        user_data tree
        callback {int size = (int)labelsize_slider->value();

// DO SELECTED ITEMS
int count = 0;
Fl_Tree_Item *item;
for ( item=tree->first(); item; item = tree->next(item) ) {
    if ( item->is_selected() ) {
        item->labelsize(size);
        count++;
    }
}

// NO ITEMS SELECTED? DO ALL
if ( ! count ) {
    for ( item=tree->first(); item; item = tree->next(item) ) {
        item->labelsize(size);
    }
}

tree->redraw();}
        tooltip {Changes the font size of the selected items's labels. If none selected, all are changed. Tests Fl_Tree_Item::labelsize();} xywh {828 55 140 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
        code0 {o->value(tree->item_labelsize());}
        code1 {o->range(5.0, 200.0);}
        code2 {o->step(1.0);}
        code3 {o->color(46); o->selection_color(FL_RED);}
      }
      Fl_Button all_labelfgcolor_button {
        label {Label FG Color}
        callback {// Find first item in tree
Fl_Tree_Item *item = tree->first();
if ( !item ) return;

// Get first item's color
Fl_Color val = EditColor(item->labelfgcolor());		// Get color of first item in tree
all_labelfgcolor_button->color(val);			// update modified color to button

// Do selected items
int count = 0;
for ( item=tree->first(); item; item = tree->next(item) ) {
    if ( item->is_selected() ) {
        item->labelfgcolor(val);
        count++;
    }
}

// No items selected? Do all..
if ( ! count ) {
    for ( item=tree->first(); item; item = tree->next(item) ) {
        item->labelfgcolor(val);
    }
}

tree->redraw();}
        tooltip {Changes the label fg color for the selected items. If none selected, all are changed. Tests Fl_Tree_Item::labelfgcolor();} xywh {828 81 16 16} box DOWN_BOX labelsize 12 align 7
        code0 {o->color(tree->item_labelfgcolor());}
      }
      Fl_Button all_labelbgcolor_button {
        label {Label BG Color}
        callback {// Find first item in tree
Fl_Tree_Item *item = tree->first();
if ( !item ) return;

// Get first item's color
Fl_Color val = EditColor(item->labelbgcolor());		// Get color of first item in tree
all_labelbgcolor_button->color(val);			// update modified color to button

// Do selected items
int count = 0;
for ( item=tree->first(); item; item = tree->next(item) ) {
    if ( item->is_selected() ) {
        item->labelbgcolor(val);
        count++;
    }
}

// No items selected? Do all..
if ( ! count ) {
    for ( item=tree->first(); item; item = tree->next(item) ) {
        item->labelbgcolor(val);
    }
}

tree->redraw();}
        tooltip {Changes the label bg color for the selected items. If none selected, all are changed. Tests Fl_Tree_Item::labelbgcolor();} xywh {828 99 16 16} box DOWN_BOX labelsize 12 align 7
        code0 {o->color(tree->item_labelbgcolor());}
      }
      Fl_Value_Slider connectorwidth_slider {
        label {Connector Width}
        user_data tree
        callback {tree->connectorwidth((int)connectorwidth_slider->value());}
        tooltip {Tests Fl_Tree::connectorwidth()} xywh {828 126 140 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
        code0 {o->value(tree->connectorwidth());}
        code1 {o->range(1.0, 100.0);}
        code2 {o->step(1.0);}
        code3 {o->color(46); o->selection_color(FL_RED);}
      }
      Fl_Light_Button deactivate_toggle {
        label { Deactivate}
        callback {int onoff = deactivate_toggle->value() ? 0 : 1;

Fl_Tree_Item *item;
int count = 0;
for ( item=tree->first(); item; item = tree->next(item) ) {
    if ( item->is_selected() ) {
        item->activate(onoff);
        ++count;
    }
}

if ( count == 0 ) {
    for ( item=tree->first(); item; item = tree->next(item) ) {
        item->activate(onoff);
    }
}

tree->redraw();}
        tooltip {Toggle the deactivation state of the selected items.
If none are selected, all are set.} xywh {734 154 95 16} selection_color 1 labelsize 9
      }
      Fl_Light_Button bold_toggle {
        label { Bold Font}
        callback {int face = bold_toggle->value() ? FL_HELVETICA_BOLD : FL_HELVETICA;

// DO SELECTED ITEMS
int count = 0;
Fl_Tree_Item *item;
for ( item=tree->first(); item; item = tree->next(item) ) {
    if ( item->is_selected() ) {
        item->labelfont(face);
        count++;
    }
}

// NO ITEMS SELECTED? DO ALL
if ( ! count ) {
    for ( item=tree->first(); item; item = tree->next(item) ) {
        item->labelfont(face);
    }
}

tree->redraw();}
        tooltip {Toggles bold font for selected items
If nothing selected, all are changed} xywh {734 174 95 16} selection_color 1 labelsize 9
      }
      Fl_Button showselected_button {
        label {Show Selected}
        callback {fprintf(stderr, "--- SELECTED ITEMS\\n");
for ( Fl_Tree_Item *item = tree->first_selected_item();
      item;
      item = tree->next_selected_item(item) ) {
  fprintf(stderr, "\\t%s\\n", item->label() ? item->label() : "???");
}}
        tooltip {Clears the selected items} xywh {829 154 95 16} labelsize 9
      }
      Fl_Button clearselected_button {
        label {Remove Selected}
        callback {Fl_Tree_Item *item=tree->first();
while (item) {
    if ( item->is_selected() ) {
    	if ( tree->remove(item) == -1 ) break;
    	item = tree->first();
    } else {
        item = item->next();
    }
}

tree->redraw();}
        tooltip {Removes the selected items} xywh {829 174 95 16} labelsize 9
      }
      Fl_Button selectall_button {
        label {Select All}
        callback {tree->select_all(0);
tree->redraw();}
        tooltip {Selects all items in the tree} xywh {689 201 95 16} labelsize 9
      }
      Fl_Button deselectall_button {
        label {Deselect All}
        callback {tree->deselect_all(0);
tree->redraw();}
        tooltip {Deselects all items in the tree} xywh {689 221 95 16} labelsize 9
      }
      Fl_Light_Button bbbselect_toggle {
        label { Select Bbb}
        callback {// Toggle select of just the Bbb item (not children)
Fl_Tree_Item *bbb = tree->find_item("/Bbb");
if ( !bbb) {
  fl_alert("FAIL: Couldn't find item '/Bbb'???");
  return;
}
int onoff = bbbselect_toggle->value();
if ( onoff ) tree->select(bbb);		// select /Bbb
else         tree->deselect(bbb);	// deselect /Bbb}
        tooltip {Toggle selection of just the /Bbb item
(Not children)} xywh {784 201 95 16} selection_color 1 labelsize 9
      }
      Fl_Light_Button bbbselect2_toggle {
        label { Select Bbb+}
        callback {// Toggle select of just the Bbb item and its immediate children
Fl_Tree_Item *bbb = tree->find_item("/Bbb");
if ( !bbb) {
  fl_alert("FAIL: Couldn't find item '/Bbb'???");
  return;
}
int onoff = bbbselect2_toggle->value();
if ( onoff ) tree->select_all(bbb);		// select /Bbb and its children
else         tree->deselect_all(bbb);	// deselect /Bbb and its children}
        tooltip {Toggle selection of the /Bbb item and its children} xywh {784 221 95 16} selection_color 1 labelsize 9
      }
      Fl_Light_Button bbbchild02select_toggle {
        label { Toggle child-02}
        callback {// Toggle select of just the /Bbb/child-02 item
const char *pathname = "/Bbb/child-02";
int onoff = bbbchild02select_toggle->value();
int err = 0;
if ( onoff ) err = tree->select(pathname);
else         err = tree->deselect(pathname);

if ( err == -1 ) {
  fl_alert("FAIL: Couldn't find item '%s'",pathname);
  return;
}}
        tooltip {Toggle the single item "/Bbb/child-02" using the item's "pathname".} xywh {784 241 95 16} selection_color 1 labelsize 9
      }
      Fl_Light_Button rootselect_toggle {
        label {Select ROOT}
        callback {// Toggle select of ROOT item and its children
Fl_Tree_Item *item = tree->find_item("/ROOT");
if ( !item) {
  fl_alert("FAIL: Couldn't find item '/ROOT'???");
  return;
}
int onoff = rootselect_toggle->value();
if ( onoff ) tree->select(item);	// select /ROOT and its children
else         tree->deselect(item);	// deselect /ROOT and its children}
        tooltip {Toggle selection of the ROOT item} xywh {879 201 95 16} selection_color 1 labelsize 9
      }
      Fl_Light_Button rootselect2_toggle {
        label {Select ROOT+}
        callback {// Toggle select of ROOT item and its children
Fl_Tree_Item *item = tree->find_item("/ROOT");
if ( !item) {
  fl_alert("FAIL: Couldn't find item '/ROOT'???");
  return;
}
int onoff = rootselect2_toggle->value();
if ( onoff ) tree->select_all(item);	// select /ROOT and its children
else         tree->deselect_all(item);	// deselect /ROOT and its children}
        tooltip {Toggle selection of the ROOT item and all children} xywh {879 221 95 16} selection_color 1 labelsize 9
      }
      Fl_Box {} {
        label {New Item Defaults}
        tooltip {These controls only affect the defaults for new items that are created. These test the Fl_Tree_Prefs methods.} xywh {661 312 335 120} box GTK_DOWN_BOX color 47 labelsize 12 align 1
      }
      Fl_Button item_labelfgcolor_button {
        label item_labelfgcolor
        callback {Fl_Color val = EditColor(tree->item_labelfgcolor());	// Let user edit the color
tree->item_labelfgcolor(val);				// apply modified color to tree
item_labelfgcolor_button->color(val);			// update modified color to button}
        tooltip {Sets the *default* label foreground color for new items created. Does NOT affect existing items.} xywh {828 327 16 16} box DOWN_BOX labelsize 12 align 7
        code0 {o->color(tree->item_labelfgcolor());}
      }
      Fl_Button item_labelbgcolor_button {
        label item_labelbgcolor
        callback {Fl_Color val = EditColor(tree->item_labelbgcolor());	// Let user edit the color
tree->item_labelbgcolor(val);				// apply modified color to tree
item_labelbgcolor_button->color(val);			// update modified color to button}
        tooltip {Sets the *default* label background color for new items created. Does NOT affect existing items.} xywh {828 345 16 16} box DOWN_BOX labelsize 12 align 7
        code0 {item_labelbgcolor_button->color(tree->item_labelbgcolor());}
      }
      Fl_Choice item_font_choice {
        label {Item label font}
        callback {Fl_Font val = (Fl_Font)item_font_choice->value(); // get chooser's current font value
tree->item_labelfont(val);			  // change font in tree}
        tooltip {Sets the default font used for new items created. Does NOT affect existing items.} xywh {828 371 140 21} down_box BORDER_BOX labelsize 12 textsize 12
        code0 {o->value((int)tree->item_labelfont());   // get tree's current font, assign to chooser}
      } {
        MenuItem {} {
          label Helvetica
          xywh {20 20 36 21} labelsize 12
        }
        MenuItem {} {
          label {Helvetica Bold}
          xywh {30 30 36 21} labelsize 12
        }
        MenuItem {} {
          label {Helvetica Italic}
          xywh {45 45 36 21} labelsize 12
        }
        MenuItem {} {
          label {Helvetica Bold Italic}
          xywh {50 50 36 21} labelsize 12
        }
        MenuItem {} {
          label Courier
          xywh {60 60 36 21} labelsize 12
        }
        MenuItem {} {
          label {Courier Bold}
          xywh {70 70 36 21} labelsize 12
        }
        MenuItem {} {
          label {Courier Italic}
          xywh {55 55 36 21} labelsize 12
        }
        MenuItem {} {
          label {Courier Bold Italic}
          xywh {60 60 36 21} labelsize 12
        }
        MenuItem {} {
          label Times
          xywh {70 70 36 21} labelsize 12
        }
        MenuItem {} {
          label {Times Bold}
          xywh {80 80 36 21} labelsize 12
        }
        MenuItem {} {
          label {Times Italic}
          xywh {65 65 36 21} labelsize 12
        }
        MenuItem {} {
          label {Times Bold Italic}
          xywh {70 70 36 21} labelsize 12
        }
        MenuItem {} {
          label Symbol
          xywh {80 80 36 21} labelsize 12
        }
        MenuItem {} {
          label Screen
          xywh {90 90 36 21} labelsize 12
        }
        MenuItem {} {
          label {Screen bold}
          xywh {75 75 36 21} labelsize 12
        }
        MenuItem {} {
          label {Zapf Dingbats}
          xywh {80 80 36 21} labelsize 12
        }
      }
      Fl_Value_Slider item_labelsize_slider {
        label item_labelsize
        user_data tree
        callback {tree->item_labelsize((int)item_labelsize_slider->value());}
        tooltip {Sets the default labelsize used for new items. Does NOT affect existing items.} xywh {828 396 140 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
        code0 {o->value((int)tree->item_labelsize());}
        code1 {o->range(1.0, 50.0);}
        code2 {o->step(1.0);}
        code3 {o->color(46); o->selection_color(FL_RED);}
      }
    }
    Fl_Box resizer_box {
      xywh {0 263 15 14}
    }
  }
  code {// Initialize Tree
tree->root_label("ROOT");
RebuildTree();
/*tree->show_self();*/} {}
  code {// FLTK stuff

//Fl::scheme("gtk+");

window->resizable(tree);
window->size_range(window->w(), window->h(), 0, 0);

     if ( tree->when() == FL_WHEN_CHANGED ) whenmode_chooser->value(0);
else if ( tree->when() == FL_WHEN_RELEASE ) whenmode_chooser->value(1);
else if ( tree->when() == FL_WHEN_NEVER   ) whenmode_chooser->value(2);} {}
} 
