summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/tree.fl351
-rw-r--r--test/unittest_scrollbarsize.cxx56
2 files changed, 320 insertions, 87 deletions
diff --git a/test/tree.fl b/test/tree.fl
index 42d3c6d80..21382bc61 100644
--- a/test/tree.fl
+++ b/test/tree.fl
@@ -20,19 +20,37 @@ decl {\#include <FL/Fl_Tree.H>} {public global
decl {\#include <FL/fl_ask.H>} {public global
}
-decl {\#include <FL/Fl_File_Chooser.H>} {selected 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 {int G_cb_counter = 0;} {
+ comment {// Global callback event counter} private local
+}
+
+Function {reason_as_name(Fl_Tree_Reason reason)} {open 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 {RebuildTree()} {open
-} {
+Function {RebuildTree()} {} {
code {// REBUILD THE TREE TO MAKE CURRENT "DEFAULT" PREFS TAKE EFFECT
tree->clear();
tree->add("Aaa");
@@ -108,6 +126,15 @@ 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
+
tree->redraw();} {}
}
@@ -119,13 +146,17 @@ Function {} {open
} {
Fl_Group tree {
user_data 1234
- callback {Fl_Tree_Item *item = tree->item_clicked();
+ 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\\n",
+ fprintf(stderr, "TREE CALLBACK: label='%s' userdata=%ld reason=%s\\n",
item->label(),
- (long)tree->user_data());
+ (long)tree->user_data(),
+ reason_as_name(tree->callback_reason()));
} else {
- fprintf(stderr, "TREE CALLBACK: no item (probably multiple items were changed at once)\\n");
+ fprintf(stderr, "TREE CALLBACK: reason=%s item=(no item -- probably multiple items were changed at once)\\n",
+ reason_as_name(tree->callback_reason()));
}} open
xywh {15 15 550 390} box DOWN_BOX color 55
class Fl_Tree
@@ -136,7 +167,7 @@ if ( item ) {
callback {int val = (int)margintop_slider->value();
tree->margintop(val);
tree->redraw();}
- tooltip {Changes the top margin for the tree widget} xywh {190 414 240 16} type Horizontal labelsize 12 align 4 textsize 12
+ tooltip {Changes the top margin for the tree widget} xywh {190 414 240 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);}
@@ -148,7 +179,7 @@ tree->redraw();}
callback {int val = (int)marginleft_slider->value();
tree->marginleft(val);
tree->redraw();}
- tooltip {Changes the left margin for the tree widget} xywh {190 434 240 16} type Horizontal labelsize 12 align 4 textsize 12
+ tooltip {Changes the left margin for the tree widget} xywh {190 434 240 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);}
@@ -160,7 +191,7 @@ tree->redraw();}
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 {190 454 240 16} type Horizontal labelsize 12 align 4 textsize 12
+ tooltip {Changes the vertical space below an open child tree} xywh {190 454 240 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);}
@@ -173,7 +204,7 @@ tree->redraw();}
// DO SELECTED ITEMS
int count = 0;
-for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
+for ( Fl_Tree_Item *item=tree->first(); item; item = tree->next(item) ) {
if ( item->is_selected() ) {
item->labelsize(size);
count++;
@@ -182,14 +213,14 @@ for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
// NO ITEMS SELECTED? DO ALL
if ( ! count ) {
- for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
+ for ( Fl_Tree_Item *item=tree->first(); item; item = tree->next(item) ) {
item->labelsize(size);
}
}
tree->redraw();}
tooltip {Changes the font size of the selected items
-If none selected, all are changed} xywh {190 474 240 16} type Horizontal labelsize 12 align 4 textsize 12
+If none selected, all are changed} xywh {190 474 240 16} type Horizontal labelsize 12 align 4 step 0.01 textsize 12
code0 {o->value(tree->labelsize());}
code1 {o->range(5.0, 200.0);}
code2 {o->step(1.0);}
@@ -199,7 +230,7 @@ If none selected, all are changed} xywh {190 474 240 16} type Horizontal labelsi
label {Connector width}
user_data tree
callback {tree->connectorwidth((int)connectorwidth_slider->value());}
- tooltip {Tests Fl_Tree::connectorwidth()} xywh {190 494 240 16} type Horizontal labelsize 12 align 4 textsize 12
+ tooltip {Tests Fl_Tree::connectorwidth()} xywh {190 494 240 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);}
@@ -256,16 +287,25 @@ if ( usericon_radio->value() ) {
if ( ( i = tree->find_item("Bbb/bgb/222") ) != NULL ) i->usericon(0);
if ( ( i = tree->find_item("Bbb/bgb/333") ) != NULL ) i->usericon(0);
}}
- tooltip {Tests Fl_Tree_Item::usericon()} xywh {145 525 130 16} down_box DOWN_BOX labelsize 11
+ tooltip {Tests Fl_Tree_Item::usericon()} xywh {90 525 130 16} down_box DOWN_BOX labelsize 11
}
Fl_Check_Button showroot_radio {
label {Show root?}
user_data tree
callback {int onoff = showroot_radio->value();
tree->showroot(onoff);}
- tooltip {Tests Fl_Tree_Item::usericon()} xywh {145 544 130 16} down_box DOWN_BOX labelsize 11
+ tooltip {Tests Fl_Tree_Item::usericon()} xywh {90 542 130 16} down_box DOWN_BOX labelsize 11
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()
+This toggles the visible 'focus box'} xywh {90 559 130 16} down_box DOWN_BOX labelsize 11
+ code0 {int onoff = tree->visible_focus(); visiblefocus_checkbox->value(onoff);}
+ }
Fl_Choice collapseicons_chooser {
label {Collapse icons}
callback {static const char *L_open_xpm[] = {
@@ -355,7 +395,7 @@ switch ( collapseicons_chooser->value() ) {
tree->showcollapse(0);
break;
}} open
- tooltip {Tests Fl_Tree::openicon() and Fl_Tree::closeicon()} xywh {145 572 110 16} down_box BORDER_BOX labelsize 11 textsize 11
+ tooltip {Tests Fl_Tree::openicon() and Fl_Tree::closeicon()} xywh {115 589 110 16} down_box BORDER_BOX labelsize 11 textsize 11
} {
MenuItem {} {
label Normal
@@ -378,7 +418,7 @@ switch ( connectorstyle_chooser->value() ) {
case 1: tree->connectorstyle(FL_TREE_CONNECTOR_DOTTED); break;
case 2: tree->connectorstyle(FL_TREE_CONNECTOR_SOLID); break;
}} open
- tooltip {Tests connectorstyle() bit flags} xywh {145 592 110 16} down_box BORDER_BOX labelsize 11 textsize 11
+ tooltip {Tests connectorstyle() bit flags} xywh {115 609 110 16} down_box BORDER_BOX labelsize 11 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 {} {
@@ -408,7 +448,7 @@ switch ( labelcolor_chooser->value() ) {
// DO SELECTED ITEMS
int count = 0;
-for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
+ for ( Fl_Tree_Item *item=tree->first(); item; item = tree->next(item) ) {
if ( item->is_selected() ) {
item->labelcolor(c);
count++;
@@ -417,14 +457,14 @@ for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
// NO ITEMS SELECTED? DO ALL
if ( ! count ) {
- for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
+ for ( Fl_Tree_Item *item=tree->first(); item; item = tree->next(item) ) {
item->labelcolor(c);
}
}
tree->redraw();} open
tooltip {Changes the label color for the selected items
-If no items selected, all are changed} xywh {145 612 110 16} down_box BORDER_BOX labelsize 11 textsize 11
+If no items selected, all are changed} xywh {115 629 110 16} down_box BORDER_BOX labelsize 11 textsize 11
} {
MenuItem {} {
label Black
@@ -452,7 +492,7 @@ switch ( selectmode_chooser->value() ) {
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 {145 632 110 16} down_box BORDER_BOX labelsize 11 textsize 11
+ tooltip {Sets how Fl_Tree handles mouse selection of tree items} xywh {115 649 110 16} down_box BORDER_BOX labelsize 11 textsize 11
code0 {selectmode_chooser->value(1);}
code1 {cb_selectmode_chooser(selectmode_chooser, (void*)0);}
} {
@@ -477,8 +517,8 @@ switch ( whenmode_chooser->value() ) {
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 {145 652 110 16} down_box BORDER_BOX labelsize 11 textsize 11
+}} open
+ tooltip {Sets when() the tree's callback is invoked} xywh {115 669 110 16} down_box BORDER_BOX labelsize 11 textsize 11
code0 {whenmode_chooser->value(1);}
code1 {cb_whenmode_chooser(whenmode_chooser, (void*)0);}
} {
@@ -495,68 +535,96 @@ switch ( whenmode_chooser->value() ) {
xywh {60 60 36 21} labelsize 11
}
}
- Fl_Box docallback_box {
- xywh {280 521 285 81} box GTK_DOWN_BOX color 47
+ Fl_Box showitem_box {
+ label {show_item()
+}
+ xywh {468 423 60 77} box GTK_DOWN_BOX color 47 labelsize 11 align 1
+ }
+ Fl_Button {} {
+ label Top
+ callback {Fl_Tree_Item *item = tree->next_selected_item();
+tree->show_item_top(item);}
+ tooltip {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 {478 433 40 16} labelsize 11
+ }
+ Fl_Button {} {
+ label Mid
+ callback {Fl_Tree_Item *item = tree->next_selected_item();
+tree->show_item_middle(item);}
+ tooltip {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 {478 453 40 16} labelsize 11
+ }
+ Fl_Button {} {
+ label Bot
+ callback {Fl_Tree_Item *item = tree->next_selected_item();
+tree->show_item_bottom(item);}
+ tooltip {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 {478 473 40 16} labelsize 11
}
- Fl_Check_Button docallback_radio {
- label {Invoke callback on select changes?} user_data_type {void*}
- tooltip {Invokes the callback when one or more item's state changes.} xywh {310 529 230 16} down_box DOWN_BOX labelsize 11
+ Fl_Box docallback_box {
+ label {Selection State Changes}
+ xywh {245 527 320 77} box GTK_DOWN_BOX color 47 labelsize 12 align 1
}
Fl_Button selectall_button {
label {Select All}
- callback {int docallbacks = docallback_radio->value() ? 1 : 0;
-tree->select_all(0,docallbacks);
+ callback {tree->select_all(0);
tree->redraw();}
- tooltip {Selects all items in the tree} xywh {305 551 105 16} labelsize 11
+ tooltip {Selects all items in the tree} xywh {260 539 75 16} labelsize 9
}
Fl_Button deselectall_button {
label {Deselect All}
- callback {int docallbacks = docallback_radio->value() ? 1 : 0;
-tree->deselect_all(0,docallbacks);
+ callback {tree->deselect_all(0);
tree->redraw();}
- tooltip {Deselects all items in the tree} xywh {305 571 105 16} labelsize 11
+ tooltip {Deselects all items in the tree} xywh {260 559 75 16} labelsize 9
}
- Fl_Light_Button bbbselect_toggle {
- label { Select Bbb}
+ Fl_Light_Button bbbselect2_toggle {
+ label { Select Bbb+}
callback {// Toggle select of just the Bbb item and its immediate children
-int docallback = docallback_radio->value() ? 1 : 0;
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_all(bbb, docallback); // select /Bbb and its children
-else tree->deselect_all(bbb, docallback); // deselect /Bbb and its children
-
-tree->redraw();
-
-// Toggle select of just the Bbb item and its immediate children
-//int docallback = docallback_radio->value() ? 1 : 0;
-//int onoff = bbbselect_toggle->value();
-//
-//if ( onoff ) tree->select("/Bbb", docallback);
-//else tree->deselect("/Bbb", docallback);
-//
-//tree->redraw();}
- tooltip {Toggle selection of the /Bbb item and its children} xywh {430 552 115 15} labelsize 11
+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 {350 560 95 15} selection_color 1 labelsize 9
}
Fl_Light_Button bbbchild02select_toggle {
label { Toggle child-02}
callback {// Toggle select of just the /Bbb/child-02 item
-int docallback = docallback_radio->value() ? 1 : 0;
int onoff = bbbchild02select_toggle->value();
-if ( onoff ) tree->select("/Bbb/child-02", docallback);
-else tree->deselect("/Bbb/child-02", docallback);
-tree->redraw();}
- tooltip {Toggle the single item /Bbb/child-02} xywh {430 571 115 16} labelsize 11
+if ( onoff ) tree->select("/Bbb/child-02");
+else tree->deselect("/Bbb/child-02");}
+ tooltip {Toggle the single item /Bbb/child-02} xywh {350 579 95 16} selection_color 1 labelsize 9
+ }
+ 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 {380 614 90 16} labelsize 9
}
Fl_Light_Button deactivate_toggle {
label { Deactivate}
callback {int onoff = deactivate_toggle->value() ? 0 : 1;
int count = 0;
-for (Fl_Tree_Item *item=tree->first(); item; item = item->next()) {
+for ( Fl_Tree_Item *item=tree->first(); item; item = tree->next(item) ) {
if ( item->is_selected() ) {
item->activate(onoff);
++count;
@@ -564,14 +632,14 @@ for (Fl_Tree_Item *item=tree->first(); item; item = item->next()) {
}
if ( count == 0 ) {
- for (Fl_Tree_Item *item=tree->first(); item; item = item->next()) {
+ for ( Fl_Tree_Item *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 {280 633 90 16} labelsize 11
+If none are selected, all are set.} xywh {280 634 90 16} selection_color 1 labelsize 9
}
Fl_Light_Button bold_toggle {
label { Bold Font}
@@ -579,7 +647,7 @@ If none are selected, all are set.} xywh {280 633 90 16} labelsize 11
// DO SELECTED ITEMS
int count = 0;
-for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
+for ( Fl_Tree_Item *item=tree->first(); item; item = tree->next(item) ) {
if ( item->is_selected() ) {
item->labelfont(face);
count++;
@@ -588,14 +656,14 @@ for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
// NO ITEMS SELECTED? DO ALL
if ( ! count ) {
- for ( Fl_Tree_Item *item=tree->first(); item; item = item->next() ) {
+ for ( Fl_Tree_Item *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 {280 652 90 16} labelsize 11
+If nothing selected, all are changed} xywh {280 654 90 16} selection_color 1 labelsize 9
}
Fl_Button insertabove_button {
label {Insert Above}
@@ -610,15 +678,38 @@ while (item) {
}
tree->redraw();}
- tooltip {Inserts three items above the selected items} xywh {380 632 90 16} labelsize 11
+ tooltip {Inserts three items above the selected items} xywh {380 634 90 16} labelsize 9
}
Fl_Button rebuildtree_button {
label {Rebuild Tree}
callback {RebuildTree();}
- tooltip {Rebuilds the tree with defaults} xywh {380 652 90 16} labelsize 11
+ tooltip {Rebuilds the tree with defaults} xywh {380 654 90 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;
+}} selected
+ tooltip {Show the pathname for the selected item. Tests the Fl_Tree::item_pathname() method.} xywh {380 674 90 16} labelsize 8
+ }
+ 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 {475 614 90 16} labelsize 9
}
Fl_Button clearselected_button {
- label {Clear Selected}
+ label {Remove Selected}
callback {Fl_Tree_Item *item=tree->first();
while (item) {
if ( item->is_selected() ) {
@@ -630,34 +721,130 @@ while (item) {
}
tree->redraw();}
- tooltip {Clears the selected items} xywh {475 632 90 16} labelsize 11
+ tooltip {Removes the selected items} xywh {475 634 90 16} labelsize 9
}
Fl_Button clearall_button {
label {Clear All}
callback {tree->clear();
tree->redraw();}
tooltip {Clears all items
-Tests Fl_Tree::clear()} xywh {475 652 90 16} labelsize 11
+Tests Fl_Tree::clear()} xywh {475 654 90 16} labelsize 9
+ }
+ Fl_Button testcallbackflag_button {
+ label {Test Callback Flag}
+ callback {Fl_Tree_Item *root = tree->root();
+fprintf(stderr, "--- Checking docallback off\\n");
+
+//// "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 {475 674 90 16} labelsize 8
+ }
+ 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 {460 540 90 15} selection_color 1 labelsize 9
}
- 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 {380 612 90 16} labelsize 11
+ 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 {350 540 95 15} 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 {460 560 90 15} selection_color 1 labelsize 9
}
}
code {// Initialize Tree
tree->root_label("ROOT");
-docallback_radio->value(1); // enable docallbacks radio button
RebuildTree();
-tree->show_self();} {}
+/*tree->show_self();*/} {}
code {// FLTK stuff
Fl::scheme("gtk+");
window->resizable(window);
-window->size_range(window->w(), window->h(), 0, 0);} {}
+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);} {}
}
diff --git a/test/unittest_scrollbarsize.cxx b/test/unittest_scrollbarsize.cxx
index 2c2725e3e..babb82269 100644
--- a/test/unittest_scrollbarsize.cxx
+++ b/test/unittest_scrollbarsize.cxx
@@ -27,6 +27,7 @@
#include <FL/Fl_Group.H>
#include <FL/Fl_Browser.H>
+#include <FL/Fl_Tree.H>
#include <FL/Fl_Value_Slider.H>
//
@@ -34,10 +35,12 @@
//
class ScrollBarSizeTest : public Fl_Group {
Fl_Browser *brow_a, *brow_b, *brow_c;
+ Fl_Tree *tree_a, *tree_b, *tree_c;
Fl_Browser *makebrowser(int X,int Y,int W,int H,const char*L=0) {
Fl_Browser *b = new Fl_Browser(X,Y,W,H,L);
b->type(FL_MULTI_BROWSER);
+ b->align(FL_ALIGN_TOP);
b->add("Papa"); b->add("Delta"); b->add("Hotel");
b->add("Long entry will show h-bar");
b->add("Charlie"); b->add("Echo"); b->add("Foxtrot");
@@ -59,12 +62,29 @@ class ScrollBarSizeTest : public Fl_Group {
b->add("Whisky"); b->add("Zulu");
return(b);
}
+ Fl_Tree *maketree(int X,int Y,int W,int H,const char*L=0) {
+ Fl_Tree *b = new Fl_Tree(X,Y,W,H,L);
+ b->type(FL_TREE_SELECT_MULTI);
+ b->align(FL_ALIGN_TOP);
+ b->add("Papa"); b->add("Delta"); b->add("Hotel");
+ b->add("Long entry will show h-bar");
+ b->add("Charlie"); b->add("Echo"); b->add("Foxtrot");
+ b->add("Golf"); b->add("Lima"); b->add("Victor");
+ b->add("Alpha"); b->add("Xray"); b->add("Yankee");
+ b->add("Oscar"); b->add("India"); b->add("Juliet");
+ b->add("Kilo"); b->add("Mike"); b->add("Sierra");
+ b->add("November"); b->add("Tango"); b->add("Quebec");
+ b->add("Bravo"); b->add("Romeo"); b->add("Uniform");
+ b->add("Whisky"); b->add("Zulu");
+ return(b);
+ }
void slide_cb2(Fl_Value_Slider *in) {
const char *label = in->label();
int val = in->value();
//fprintf(stderr, "VAL='%d'\n",val);
if ( strcmp(label,"A: Scroll Size") == 0 ) {
brow_a->scrollbar_size(val);
+ tree_a->scrollbar_size(val);
} else {
Fl::scrollbar_size(val);
}
@@ -82,10 +102,36 @@ public:
// CTOR
ScrollBarSizeTest(int X, int Y, int W, int H) : Fl_Group(X,Y,W,H) {
begin();
- brow_a = makebrowser(X+ 10,Y+40,100,H-170,"Browser A");
- brow_b = makebrowser(X+120,Y+40,100,H-170,"Browser B");
- brow_c = makebrowser(X+240,Y+40,100,H-170,"Browser C");
- Fl_Value_Slider *slide_glob = new Fl_Value_Slider(X+100,Y+10,100,18,"Global Scroll Size");
+ // _____________ _______________
+ // |_____________| |_______________|
+ // --- ----- <-- tgrpy
+ // brow_a brow_b brow_c | 14 |
+ // ---------- ---------- ---------- --- | <-- browy
+ // | | | | | | | |
+ // | | | | | | |browh |
+ // | | | | | | | |
+ // ---------- ---------- ---------- --- tgrph
+ // | |
+ // tree_a tree_b tree_c | 20 |
+ // ---------- ---------- ---------- --- | <-- treey
+ // | | | | | | | |
+ // | | | | | | |treeh |
+ // | | | | | | | |
+ // ---------- ---------- ---------- --- ------
+ //
+ int tgrpy = Y+30;
+ int tgrph = H-130;
+ int browy = tgrpy+14;
+ int browh = tgrph/2 - 20;
+ int treey = browy + browh + 20;
+ int treeh = browh;
+ brow_a = makebrowser(X+ 10,browy,100,browh,"Browser A");
+ brow_b = makebrowser(X+120,browy,100,browh,"Browser B");
+ brow_c = makebrowser(X+240,browy,100,browh,"Browser C");
+ tree_a = maketree(X+ 10,treey,100,treeh,"Tree A");
+ tree_b = maketree(X+120,treey,100,treeh,"Tree B");
+ tree_c = maketree(X+240,treey,100,treeh,"Tree C");
+ Fl_Value_Slider *slide_glob = new Fl_Value_Slider(X+100,Y,100,18,"Global Scroll Size");
slide_glob->value(16);
slide_glob->type(FL_HORIZONTAL);
slide_glob->align(FL_ALIGN_LEFT);
@@ -93,7 +139,7 @@ public:
slide_glob->step(1.0);
slide_glob->callback(slide_cb, (void*)this);
slide_glob->labelsize(12);
- Fl_Value_Slider *slide_browa = new Fl_Value_Slider(X+350,Y+10,100,18,"A: Scroll Size");
+ Fl_Value_Slider *slide_browa = new Fl_Value_Slider(X+350,Y,100,18,"A: Scroll Size");
slide_browa->value(16);
slide_browa->type(FL_HORIZONTAL);
slide_browa->align(FL_ALIGN_LEFT);