You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1307 lines
50KB

  1. // generated by Fast Light User Interface Designer (fluid) version 1.0300
  2. #include "tree.h"
  3. /**
  4. // Global callback event counter
  5. */
  6. static int G_cb_counter = 0;
  7. /**
  8. Return an Fl_Tree_Reason as a text string name
  9. */
  10. const char* reason_as_name(Fl_Tree_Reason reason) {
  11. switch ( reason ) {
  12. case FL_TREE_REASON_NONE: return("none");
  13. case FL_TREE_REASON_SELECTED: return("selected");
  14. case FL_TREE_REASON_DESELECTED: return("deselected");
  15. case FL_TREE_REASON_OPENED: return("opened");
  16. case FL_TREE_REASON_CLOSED: return("closed");
  17. default: return("???");
  18. }
  19. }
  20. void Button_CB(Fl_Widget*w, void*data) {
  21. fprintf(stderr, "'%s' button pushed\n", w->label());
  22. }
  23. /**
  24. Assign user icons to the items
  25. */
  26. void AssignUserIcons() {
  27. static const char *L_folder_xpm[] = {
  28. "11 11 3 1",
  29. ". c None",
  30. "x c #d8d833",
  31. "@ c #808011",
  32. "...........",
  33. ".....@@@@..",
  34. "....@xxxx@.",
  35. "@@@@@xxxx@@",
  36. "@xxxxxxxxx@",
  37. "@xxxxxxxxx@",
  38. "@xxxxxxxxx@",
  39. "@xxxxxxxxx@",
  40. "@xxxxxxxxx@",
  41. "@xxxxxxxxx@",
  42. "@@@@@@@@@@@"};
  43. static Fl_Pixmap L_folderpixmap(L_folder_xpm);
  44. static const char *L_document_xpm[] = {
  45. "11 11 3 1",
  46. ". c None",
  47. "x c #d8d8f8",
  48. "@ c #202060",
  49. ".@@@@@@@@@.",
  50. ".@xxxxxxx@.",
  51. ".@xxxxxxx@.",
  52. ".@xxxxxxx@.",
  53. ".@xxxxxxx@.",
  54. ".@xxxxxxx@.",
  55. ".@xxxxxxx@.",
  56. ".@xxxxxxx@.",
  57. ".@xxxxxxx@.",
  58. ".@xxxxxxx@.",
  59. ".@@@@@@@@@."};
  60. static Fl_Pixmap L_documentpixmap(L_document_xpm);
  61. // Assign user icons to tree items
  62. for ( Fl_Tree_Item *item = tree->first(); item; item=item->next())
  63. if ( usericon_radio->value() )
  64. // Assign custom icons
  65. item->usericon(item->has_children() ? &L_folderpixmap : &L_documentpixmap);
  66. else
  67. // Don't assign custom icons
  68. item->usericon(0);
  69. tree->redraw();
  70. }
  71. /**
  72. Rebuild the 'example tree' from scratch
  73. */
  74. void RebuildTree() {
  75. // REBUILD THE TREE TO MAKE CURRENT "DEFAULT" PREFS TAKE EFFECT
  76. tree->clear();
  77. tree->add("Aaa");
  78. tree->add("Bbb");
  79. tree->add("Ccc");
  80. tree->add("Ddd");
  81. tree->add("Bbb/child-01");
  82. tree->add("Bbb/child-01/111");
  83. tree->add("Bbb/child-01/222");
  84. tree->add("Bbb/child-01/333");
  85. tree->add("Bbb/child-02");
  86. tree->add("Bbb/child-03");
  87. tree->add("Bbb/child-04");
  88. {
  89. static Fl_Button *but = 0;
  90. // Assign an FLTK widget to one of the items
  91. Fl_Tree_Item *i;
  92. if ( ( i = tree->find_item("Bbb/child-03") ) != NULL ) {
  93. if ( !but ) { // only do this once at program startup
  94. tree->begin();
  95. but = new Fl_Button(1,1,140,1,"ccc button"); // we control w() only
  96. but->labelsize(10);
  97. but->callback(Button_CB);
  98. }
  99. i->widget(but);
  100. tree->end();
  101. }
  102. }
  103. {
  104. // Assign an FLTK group to one of the items with widgets
  105. Fl_Tree_Item *i;
  106. if ( ( i = tree->find_item("Bbb/child-04") ) != NULL ) {
  107. static Fl_Group *grp = 0;
  108. if ( !grp ) { // only do this once at program startup
  109. tree->begin();
  110. grp = new Fl_Group(100,100,140,18); // build group.. tree handles position
  111. grp->color(FL_WHITE);
  112. grp->begin();
  113. Fl_Button *abut = new Fl_Button(grp->x()+0 ,grp->y()+2,65,15,"D1");
  114. abut->labelsize(10);
  115. abut->callback(Button_CB);
  116. Fl_Button *bbut = new Fl_Button(grp->x()+75,grp->y()+2,65,15,"D2");
  117. bbut->labelsize(10);
  118. bbut->callback(Button_CB);
  119. grp->end();
  120. grp->resizable(grp);
  121. tree->end();
  122. }
  123. i->widget(grp);
  124. }
  125. }
  126. // Add an 'Ascending' node, and create it sorted
  127. tree->sortorder(FL_TREE_SORT_NONE);
  128. tree->add("Ascending")->close();
  129. tree->sortorder(FL_TREE_SORT_ASCENDING);
  130. tree->add("Ascending/Zzz");
  131. tree->add("Ascending/Xxx");
  132. tree->add("Ascending/Aaa");
  133. tree->add("Ascending/Bbb");
  134. tree->add("Ascending/Yyy");
  135. tree->add("Ascending/Ccc");
  136. // Add a 'Descending' node, and create it sorted
  137. tree->sortorder(FL_TREE_SORT_NONE);
  138. tree->add("Descending")->close();
  139. tree->sortorder(FL_TREE_SORT_DESCENDING);
  140. tree->add("Descending/Zzz");
  141. tree->add("Descending/Xxx");
  142. tree->add("Descending/Aaa");
  143. tree->add("Descending/Bbb");
  144. tree->add("Descending/Yyy");
  145. tree->add("Descending/Ccc");
  146. // Add 500 items in numerical order
  147. tree->sortorder(FL_TREE_SORT_NONE);
  148. for ( int t=0; t<500; t++ ) {
  149. static char s[80];
  150. sprintf(s, "500 Items/item %04d", t);
  151. tree->add(s);
  152. }
  153. tree->close("500 Items"); // close the 500 items by default
  154. AssignUserIcons();
  155. tree->redraw();
  156. }
  157. /**
  158. Prompt the user to change the specified color
  159. */
  160. Fl_Color EditColor(Fl_Color val) {
  161. uchar r,g,b;
  162. // Get the current color
  163. Fl::get_color(val,r,g,b);
  164. // Bring up a color chooser to edit it
  165. fl_color_chooser("Choose Color",r,g,b);
  166. // Return the new color the user picked
  167. return(fl_rgb_color(r,g,b));
  168. }
  169. Fl_Double_Window *window=(Fl_Double_Window *)0;
  170. Fl_Tree *tree=(Fl_Tree *)0;
  171. static void cb_tree(Fl_Tree*, void*) {
  172. G_cb_counter++; // Increment callback counter whenever tree callback is invoked
  173. Fl_Tree_Item *item = tree->callback_item();
  174. if ( item ) {
  175. fprintf(stderr, "TREE CALLBACK: label='%s' userdata=%ld reason=%s\n",
  176. item->label(),
  177. (long)(fl_intptr_t)tree->user_data(),
  178. reason_as_name(tree->callback_reason()));
  179. } else {
  180. fprintf(stderr, "TREE CALLBACK: reason=%s item=(no item -- probably multiple items were changed at once)\n",
  181. reason_as_name(tree->callback_reason()));
  182. };
  183. }
  184. Fl_Value_Slider *margintop_slider=(Fl_Value_Slider *)0;
  185. static void cb_margintop_slider(Fl_Value_Slider*, void*) {
  186. int val = (int)margintop_slider->value();
  187. tree->margintop(val);
  188. tree->redraw();
  189. }
  190. Fl_Value_Slider *marginleft_slider=(Fl_Value_Slider *)0;
  191. static void cb_marginleft_slider(Fl_Value_Slider*, void*) {
  192. int val = (int)marginleft_slider->value();
  193. tree->marginleft(val);
  194. tree->redraw();
  195. }
  196. Fl_Value_Slider *openchild_marginbottom_slider=(Fl_Value_Slider *)0;
  197. static void cb_openchild_marginbottom_slider(Fl_Value_Slider*, void*) {
  198. int val = (int)openchild_marginbottom_slider->value();
  199. tree->openchild_marginbottom(val);
  200. tree->redraw();
  201. }
  202. Fl_Choice *collapseicons_chooser=(Fl_Choice *)0;
  203. static void cb_collapseicons_chooser(Fl_Choice*, void*) {
  204. static const char *L_open_xpm[] = {
  205. #ifdef __APPLE__
  206. "11 11 3 1",
  207. ". c #fefefe",
  208. "# c #444444",
  209. "@ c #000000",
  210. "###########",
  211. "#.........#",
  212. "#.........#",
  213. "#....@....#",
  214. "#....@....#",
  215. "#..@@@@@..#",
  216. "#....@....#",
  217. "#....@....#",
  218. "#.........#",
  219. "#.........#",
  220. "###########"
  221. #else
  222. "11 11 2 1",
  223. ". c None",
  224. "@ c #000000",
  225. "...@.......",
  226. "...@@......",
  227. "...@@@.....",
  228. "...@@@@....",
  229. "...@@@@@...",
  230. "...@@@@@@..",
  231. "...@@@@@...",
  232. "...@@@@....",
  233. "...@@@.....",
  234. "...@@......",
  235. "...@......."
  236. #endif
  237. };
  238. static Fl_Pixmap L_openpixmap(L_open_xpm);
  239. static const char *L_close_xpm[] = {
  240. #ifdef __APPLE__
  241. "11 11 3 1",
  242. ". c #fefefe",
  243. "# c #444444",
  244. "@ c #000000",
  245. "###########",
  246. "#.........#",
  247. "#.........#",
  248. "#.........#",
  249. "#.........#",
  250. "#..@@@@@..#",
  251. "#.........#",
  252. "#.........#",
  253. "#.........#",
  254. "#.........#",
  255. "###########"
  256. #else
  257. "11 11 2 1",
  258. ". c None",
  259. "@ c #000000",
  260. "...........",
  261. "...........",
  262. "...........",
  263. "...........",
  264. "...........",
  265. "@@@@@@@@@@@",
  266. ".@@@@@@@@@.",
  267. "..@@@@@@@..",
  268. "...@@@@@...",
  269. "....@@@....",
  270. ".....@....."
  271. #endif
  272. };
  273. static Fl_Pixmap L_closepixmap(L_close_xpm);
  274. switch ( collapseicons_chooser->value() ) {
  275. case 0:
  276. tree->showcollapse(1);
  277. tree->openicon(0);
  278. tree->closeicon(0);
  279. break;
  280. case 1:
  281. tree->showcollapse(1);
  282. tree->openicon(&L_openpixmap);
  283. tree->closeicon(&L_closepixmap);
  284. break;
  285. case 2:
  286. tree->showcollapse(0);
  287. break;
  288. };
  289. }
  290. Fl_Menu_Item menu_collapseicons_chooser[] = {
  291. {"Normal", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  292. {"Custom", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  293. {"Off", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  294. {0,0,0,0,0,0,0,0,0}
  295. };
  296. Fl_Choice *connectorstyle_chooser=(Fl_Choice *)0;
  297. static void cb_connectorstyle_chooser(Fl_Choice*, void*) {
  298. // CHANGE COLLAPSESTYLE
  299. switch ( connectorstyle_chooser->value() ) {
  300. case 0: tree->connectorstyle(FL_TREE_CONNECTOR_NONE); break;
  301. case 1: tree->connectorstyle(FL_TREE_CONNECTOR_DOTTED); break;
  302. case 2: tree->connectorstyle(FL_TREE_CONNECTOR_SOLID); break;
  303. };
  304. }
  305. Fl_Menu_Item menu_connectorstyle_chooser[] = {
  306. {"None", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  307. {"Dotted", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  308. {"Solid", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  309. {0,0,0,0,0,0,0,0,0}
  310. };
  311. Fl_Choice *selectmode_chooser=(Fl_Choice *)0;
  312. static void cb_selectmode_chooser(Fl_Choice*, void*) {
  313. // Set selection mode
  314. switch ( selectmode_chooser->value() ) {
  315. case 0: tree->selectmode(FL_TREE_SELECT_NONE); break; // None
  316. case 1: tree->selectmode(FL_TREE_SELECT_SINGLE); break; // Single
  317. case 2: tree->selectmode(FL_TREE_SELECT_MULTI); break; // Multi
  318. default: tree->selectmode(FL_TREE_SELECT_SINGLE); break; // Single
  319. };
  320. }
  321. Fl_Menu_Item menu_selectmode_chooser[] = {
  322. {"None", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  323. {"Single", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  324. {"Multi", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  325. {0,0,0,0,0,0,0,0,0}
  326. };
  327. Fl_Choice *whenmode_chooser=(Fl_Choice *)0;
  328. static void cb_whenmode_chooser(Fl_Choice*, void*) {
  329. // Set when mode
  330. switch ( whenmode_chooser->value() ) {
  331. case 0: tree->when(FL_WHEN_RELEASE); break;
  332. case 1: tree->when(FL_WHEN_CHANGED); break;
  333. case 2: tree->when(FL_WHEN_NEVER); break;
  334. default: tree->when(FL_WHEN_RELEASE); break;
  335. };
  336. }
  337. Fl_Menu_Item menu_whenmode_chooser[] = {
  338. {"Changed", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  339. {"Released", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  340. {"Never", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  341. {0,0,0,0,0,0,0,0,0}
  342. };
  343. Fl_Check_Button *usericon_radio=(Fl_Check_Button *)0;
  344. static void cb_usericon_radio(Fl_Check_Button*, void*) {
  345. AssignUserIcons();
  346. }
  347. Fl_Check_Button *showroot_radio=(Fl_Check_Button *)0;
  348. static void cb_showroot_radio(Fl_Check_Button*, void*) {
  349. int onoff = showroot_radio->value();
  350. tree->showroot(onoff);
  351. }
  352. Fl_Check_Button *visiblefocus_checkbox=(Fl_Check_Button *)0;
  353. static void cb_visiblefocus_checkbox(Fl_Check_Button*, void*) {
  354. int onoff = visiblefocus_checkbox->value();
  355. tree->visible_focus(onoff);
  356. }
  357. Fl_Button *selection_color_button=(Fl_Button *)0;
  358. static void cb_selection_color_button(Fl_Button*, void*) {
  359. Fl_Color val = EditColor(tree->selection_color()); // Get color of first item in tree
  360. selection_color_button->color(val); // update modified color to button
  361. tree->selection_color(val);
  362. tree->redraw();
  363. }
  364. Fl_Box *showitem_box=(Fl_Box *)0;
  365. static void cb_Show(Fl_Button*, void*) {
  366. Fl_Tree_Item *item = tree->next_selected_item();
  367. tree->show_item(item);
  368. }
  369. static void cb_Top(Fl_Button*, void*) {
  370. Fl_Tree_Item *item = tree->next_selected_item();
  371. tree->show_item_top(item);
  372. }
  373. static void cb_Mid(Fl_Button*, void*) {
  374. Fl_Tree_Item *item = tree->next_selected_item();
  375. tree->show_item_middle(item);
  376. }
  377. static void cb_Bot(Fl_Button*, void*) {
  378. Fl_Tree_Item *item = tree->next_selected_item();
  379. tree->show_item_bottom(item);
  380. }
  381. Fl_Button *loaddb_button=(Fl_Button *)0;
  382. static void cb_loaddb_button(Fl_Button*, void*) {
  383. const char *filename = fl_file_chooser("Select a Preferences style Database", "Preferences(*.prefs)", 0L);
  384. if (filename) {
  385. tree->clear();
  386. Fl_Preferences prefs(filename, 0L, 0L);
  387. tree->load(prefs);
  388. tree->redraw();
  389. };
  390. }
  391. Fl_Button *insertabove_button=(Fl_Button *)0;
  392. static void cb_insertabove_button(Fl_Button*, void*) {
  393. Fl_Tree_Item *item=tree->first();
  394. while (item) {
  395. if ( item->is_selected() ) {
  396. tree->insert_above(item, "AaaAaa");
  397. tree->insert_above(item, "BbbBbb");
  398. tree->insert_above(item, "CccCcc");
  399. }
  400. item = item->next();
  401. }
  402. tree->redraw();
  403. }
  404. Fl_Button *rebuildtree_button=(Fl_Button *)0;
  405. static void cb_rebuildtree_button(Fl_Button*, void*) {
  406. RebuildTree();
  407. }
  408. Fl_Button *showpathname_button=(Fl_Button *)0;
  409. static void cb_showpathname_button(Fl_Button*, void*) {
  410. Fl_Tree_Item *item = tree->first_selected_item();
  411. if ( !item ) { fl_message("No item was selected"); return; }
  412. char pathname[256];
  413. switch ( tree->item_pathname(pathname, sizeof(pathname), item) ) {
  414. case 0: fl_message("Pathname for '%s' is: \"%s\"", (item->label() ? item->label() : "???"), pathname); break;
  415. case -1: fl_message("item_pathname() returned -1 (NOT FOUND)"); break;
  416. case -2: fl_message("item_pathname() returned -2 (STRING TOO LONG)"); break;
  417. };
  418. }
  419. Fl_Button *clearall_button=(Fl_Button *)0;
  420. static void cb_clearall_button(Fl_Button*, void*) {
  421. tree->clear();
  422. tree->redraw();
  423. }
  424. Fl_Button *testcallbackflag_button=(Fl_Button *)0;
  425. static void cb_testcallbackflag_button(Fl_Button*, void*) {
  426. Fl_Tree_Item *root = tree->root();
  427. fprintf(stderr, "--- Checking docallback off\n");
  428. if (!root) return;
  429. //// "OFF" TEST
  430. // open/close: Make sure these methods don't trigger cb
  431. G_cb_counter = 0; tree->close(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n close(item) triggered cb!");
  432. G_cb_counter = 0; tree->open(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n open(item) triggered cb!");
  433. G_cb_counter = 0; tree->open_toggle(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n open_toggle(item) triggered cb!");
  434. G_cb_counter = 0; tree->open("ROOT", 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n open(path) triggered cb!");
  435. G_cb_counter = 0; tree->close("ROOT", 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n close(path) triggered cb!");
  436. tree->open(root,0); // leave root open
  437. // select/deselect: Make sure these methods don't trigger cb
  438. G_cb_counter = 0; tree->select(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n select(item) triggered cb!");
  439. G_cb_counter = 0; tree->deselect(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n deselect(item) triggered cb!");
  440. G_cb_counter = 0; tree->select_toggle(root, 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n select_toggle(item) triggered cb!");
  441. G_cb_counter = 0; tree->deselect("ROOT", 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n deselect(path) triggered cb!");
  442. G_cb_counter = 0; tree->select("ROOT", 0); if ( G_cb_counter ) fl_alert("FAILED 'OFF' TEST\n select(path) triggered cb!");
  443. tree->deselect("ROOT"); // leave deselected
  444. //// "ON" TEST
  445. // open/close: Make sure these methods don't trigger cb
  446. G_cb_counter = 0; tree->close(root, 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n close(item) cb wasn't triggered!");
  447. G_cb_counter = 0; tree->open(root, 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n open(item) cb wasn't triggered!");
  448. 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!");
  449. 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!");
  450. 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!");
  451. G_cb_counter = 0; tree->open("ROOT", 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n open(path) cb wasn't triggered!");
  452. G_cb_counter = 0; tree->close("ROOT", 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n close(path) cb wasn't triggered!");
  453. tree->open(root,0); // leave root open
  454. // select/deselect: Make sure these methods don't trigger cb
  455. G_cb_counter = 0; tree->select(root, 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n select(item) cb wasn't triggered!");
  456. G_cb_counter = 0; tree->deselect(root, 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n deselect(item) cb wasn't triggered!");
  457. 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!");
  458. G_cb_counter = 0; tree->deselect("ROOT", 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n deselect(path) cb wasn't triggered!");
  459. G_cb_counter = 0; tree->select("ROOT", 1); if ( !G_cb_counter ) fl_alert("FAILED 'ON' TEST\n select(path) cb wasn't triggered!");
  460. tree->deselect("ROOT"); // leave deselected
  461. //// "default" TEST (should be same as 'on'
  462. // open/close: Make sure these methods don't trigger cb
  463. G_cb_counter = 0; tree->close(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: close(item) cb wasn't triggered!");
  464. G_cb_counter = 0; tree->open(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: open(item) cb wasn't triggered!");
  465. G_cb_counter = 0; tree->open_toggle(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: open_toggle(item) cb wasn't triggered!");
  466. G_cb_counter = 0; tree->open("ROOT"); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: open(path) cb wasn't triggered!");
  467. G_cb_counter = 0; tree->close("ROOT"); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST: close(path) cb wasn't triggered!");
  468. tree->open(root,0); // leave root open
  469. // select/deselect: Make sure these methods don't trigger cb
  470. G_cb_counter = 0; tree->select(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\n select(item) cb wasn't triggered!");
  471. G_cb_counter = 0; tree->deselect(root); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\n deselect(item) cb wasn't triggered!");
  472. 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!");
  473. G_cb_counter = 0; tree->deselect("ROOT"); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\n deselect(path) cb wasn't triggered!");
  474. G_cb_counter = 0; tree->select("ROOT"); if ( !G_cb_counter ) fl_alert("FAILED 'DEFAULT' TEST\n select(path) cb wasn't triggered!");
  475. tree->deselect("ROOT"); // leave deselected
  476. fl_alert("TEST COMPLETED\n If you didn't see any error dialogs, test PASSED.");
  477. }
  478. Fl_Choice *all_font_choice=(Fl_Choice *)0;
  479. static void cb_all_font_choice(Fl_Choice*, void*) {
  480. // Find first item in tree
  481. Fl_Tree_Item *item = tree->first();
  482. if ( !item ) return;
  483. // Get first item's font.
  484. Fl_Font val = (Fl_Font)all_font_choice->value(); // Get font value
  485. // Do selected items
  486. int count = 0;
  487. for ( item=tree->first(); item; item = tree->next(item) ) {
  488. if ( item->is_selected() ) {
  489. item->labelfont(val);
  490. count++;
  491. }
  492. }
  493. // No items selected? Do all..
  494. if ( ! count ) {
  495. for ( item=tree->first(); item; item = tree->next(item) ) {
  496. item->labelfont(val);
  497. }
  498. }
  499. tree->redraw();
  500. }
  501. Fl_Menu_Item menu_all_font_choice[] = {
  502. {"Helvetica", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  503. {"Helvetica Bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  504. {"Helvetica Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  505. {"Helvetica Bold Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  506. {"Courier", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  507. {"Courier Bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  508. {"Courier Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  509. {"Courier Bold Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  510. {"Times", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  511. {"Times Bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  512. {"Times Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  513. {"Times Bold Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  514. {"Symbol", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  515. {"Screen", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  516. {"Screen bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  517. {"Zapf Dingbats", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  518. {0,0,0,0,0,0,0,0,0}
  519. };
  520. Fl_Value_Slider *labelsize_slider=(Fl_Value_Slider *)0;
  521. static void cb_labelsize_slider(Fl_Value_Slider*, void*) {
  522. int size = (int)labelsize_slider->value();
  523. // DO SELECTED ITEMS
  524. int count = 0;
  525. Fl_Tree_Item *item;
  526. for ( item=tree->first(); item; item = tree->next(item) ) {
  527. if ( item->is_selected() ) {
  528. item->labelsize(size);
  529. count++;
  530. }
  531. }
  532. // NO ITEMS SELECTED? DO ALL
  533. if ( ! count ) {
  534. for ( item=tree->first(); item; item = tree->next(item) ) {
  535. item->labelsize(size);
  536. }
  537. }
  538. tree->redraw();
  539. }
  540. Fl_Button *all_labelfgcolor_button=(Fl_Button *)0;
  541. static void cb_all_labelfgcolor_button(Fl_Button*, void*) {
  542. // Find first item in tree
  543. Fl_Tree_Item *item = tree->first();
  544. if ( !item ) return;
  545. // Get first item's color
  546. Fl_Color val = EditColor(item->labelfgcolor()); // Get color of first item in tree
  547. all_labelfgcolor_button->color(val); // update modified color to button
  548. // Do selected items
  549. int count = 0;
  550. for ( item=tree->first(); item; item = tree->next(item) ) {
  551. if ( item->is_selected() ) {
  552. item->labelfgcolor(val);
  553. count++;
  554. }
  555. }
  556. // No items selected? Do all..
  557. if ( ! count ) {
  558. for ( item=tree->first(); item; item = tree->next(item) ) {
  559. item->labelfgcolor(val);
  560. }
  561. }
  562. tree->redraw();
  563. }
  564. Fl_Button *all_labelbgcolor_button=(Fl_Button *)0;
  565. static void cb_all_labelbgcolor_button(Fl_Button*, void*) {
  566. // Find first item in tree
  567. Fl_Tree_Item *item = tree->first();
  568. if ( !item ) return;
  569. // Get first item's color
  570. Fl_Color val = EditColor(item->labelbgcolor()); // Get color of first item in tree
  571. all_labelbgcolor_button->color(val); // update modified color to button
  572. // Do selected items
  573. int count = 0;
  574. for ( item=tree->first(); item; item = tree->next(item) ) {
  575. if ( item->is_selected() ) {
  576. item->labelbgcolor(val);
  577. count++;
  578. }
  579. }
  580. // No items selected? Do all..
  581. if ( ! count ) {
  582. for ( item=tree->first(); item; item = tree->next(item) ) {
  583. item->labelbgcolor(val);
  584. }
  585. }
  586. tree->redraw();
  587. }
  588. Fl_Value_Slider *connectorwidth_slider=(Fl_Value_Slider *)0;
  589. static void cb_connectorwidth_slider(Fl_Value_Slider*, void*) {
  590. tree->connectorwidth((int)connectorwidth_slider->value());
  591. }
  592. Fl_Light_Button *deactivate_toggle=(Fl_Light_Button *)0;
  593. static void cb_deactivate_toggle(Fl_Light_Button*, void*) {
  594. int onoff = deactivate_toggle->value() ? 0 : 1;
  595. Fl_Tree_Item *item;
  596. int count = 0;
  597. for ( item=tree->first(); item; item = tree->next(item) ) {
  598. if ( item->is_selected() ) {
  599. item->activate(onoff);
  600. ++count;
  601. }
  602. }
  603. if ( count == 0 ) {
  604. for ( item=tree->first(); item; item = tree->next(item) ) {
  605. item->activate(onoff);
  606. }
  607. }
  608. tree->redraw();
  609. }
  610. Fl_Light_Button *bold_toggle=(Fl_Light_Button *)0;
  611. static void cb_bold_toggle(Fl_Light_Button*, void*) {
  612. int face = bold_toggle->value() ? FL_HELVETICA_BOLD : FL_HELVETICA;
  613. // DO SELECTED ITEMS
  614. int count = 0;
  615. Fl_Tree_Item *item;
  616. for ( item=tree->first(); item; item = tree->next(item) ) {
  617. if ( item->is_selected() ) {
  618. item->labelfont(face);
  619. count++;
  620. }
  621. }
  622. // NO ITEMS SELECTED? DO ALL
  623. if ( ! count ) {
  624. for ( item=tree->first(); item; item = tree->next(item) ) {
  625. item->labelfont(face);
  626. }
  627. }
  628. tree->redraw();
  629. }
  630. Fl_Button *showselected_button=(Fl_Button *)0;
  631. static void cb_showselected_button(Fl_Button*, void*) {
  632. fprintf(stderr, "--- SELECTED ITEMS\n");
  633. for ( Fl_Tree_Item *item = tree->first_selected_item();
  634. item;
  635. item = tree->next_selected_item(item) ) {
  636. fprintf(stderr, "\t%s\n", item->label() ? item->label() : "???");
  637. };
  638. }
  639. Fl_Button *clearselected_button=(Fl_Button *)0;
  640. static void cb_clearselected_button(Fl_Button*, void*) {
  641. Fl_Tree_Item *item=tree->first();
  642. while (item) {
  643. if ( item->is_selected() ) {
  644. if ( tree->remove(item) == -1 ) break;
  645. item = tree->first();
  646. } else {
  647. item = item->next();
  648. }
  649. }
  650. tree->redraw();
  651. }
  652. Fl_Button *selectall_button=(Fl_Button *)0;
  653. static void cb_selectall_button(Fl_Button*, void*) {
  654. tree->select_all(0);
  655. tree->redraw();
  656. }
  657. Fl_Button *deselectall_button=(Fl_Button *)0;
  658. static void cb_deselectall_button(Fl_Button*, void*) {
  659. tree->deselect_all(0);
  660. tree->redraw();
  661. }
  662. Fl_Light_Button *bbbselect_toggle=(Fl_Light_Button *)0;
  663. static void cb_bbbselect_toggle(Fl_Light_Button*, void*) {
  664. // Toggle select of just the Bbb item (not children)
  665. Fl_Tree_Item *bbb = tree->find_item("/Bbb");
  666. if ( !bbb) {
  667. fl_alert("FAIL: Couldn't find item '/Bbb'???");
  668. return;
  669. }
  670. int onoff = bbbselect_toggle->value();
  671. if ( onoff ) tree->select(bbb); // select /Bbb
  672. else tree->deselect(bbb); // deselect /Bbb;
  673. }
  674. Fl_Light_Button *bbbselect2_toggle=(Fl_Light_Button *)0;
  675. static void cb_bbbselect2_toggle(Fl_Light_Button*, void*) {
  676. // Toggle select of just the Bbb item and its immediate children
  677. Fl_Tree_Item *bbb = tree->find_item("/Bbb");
  678. if ( !bbb) {
  679. fl_alert("FAIL: Couldn't find item '/Bbb'???");
  680. return;
  681. }
  682. int onoff = bbbselect2_toggle->value();
  683. if ( onoff ) tree->select_all(bbb); // select /Bbb and its children
  684. else tree->deselect_all(bbb); // deselect /Bbb and its children;
  685. }
  686. Fl_Light_Button *bbbchild02select_toggle=(Fl_Light_Button *)0;
  687. static void cb_bbbchild02select_toggle(Fl_Light_Button*, void*) {
  688. // Toggle select of just the /Bbb/child-02 item
  689. const char *pathname = "/Bbb/child-02";
  690. int onoff = bbbchild02select_toggle->value();
  691. int err = 0;
  692. if ( onoff ) err = tree->select(pathname);
  693. else err = tree->deselect(pathname);
  694. if ( err == -1 ) {
  695. fl_alert("FAIL: Couldn't find item '%s'",pathname);
  696. return;
  697. };
  698. }
  699. Fl_Light_Button *rootselect_toggle=(Fl_Light_Button *)0;
  700. static void cb_rootselect_toggle(Fl_Light_Button*, void*) {
  701. // Toggle select of ROOT item and its children
  702. Fl_Tree_Item *item = tree->find_item("/ROOT");
  703. if ( !item) {
  704. fl_alert("FAIL: Couldn't find item '/ROOT'???");
  705. return;
  706. }
  707. int onoff = rootselect_toggle->value();
  708. if ( onoff ) tree->select(item); // select /ROOT and its children
  709. else tree->deselect(item); // deselect /ROOT and its children;
  710. }
  711. Fl_Light_Button *rootselect2_toggle=(Fl_Light_Button *)0;
  712. static void cb_rootselect2_toggle(Fl_Light_Button*, void*) {
  713. // Toggle select of ROOT item and its children
  714. Fl_Tree_Item *item = tree->find_item("/ROOT");
  715. if ( !item) {
  716. fl_alert("FAIL: Couldn't find item '/ROOT'???");
  717. return;
  718. }
  719. int onoff = rootselect2_toggle->value();
  720. if ( onoff ) tree->select_all(item); // select /ROOT and its children
  721. else tree->deselect_all(item); // deselect /ROOT and its children;
  722. }
  723. Fl_Button *item_labelfgcolor_button=(Fl_Button *)0;
  724. static void cb_item_labelfgcolor_button(Fl_Button*, void*) {
  725. Fl_Color val = EditColor(tree->item_labelfgcolor()); // Let user edit the color
  726. tree->item_labelfgcolor(val); // apply modified color to tree
  727. item_labelfgcolor_button->color(val); // update modified color to button;
  728. }
  729. Fl_Button *item_labelbgcolor_button=(Fl_Button *)0;
  730. static void cb_item_labelbgcolor_button(Fl_Button*, void*) {
  731. Fl_Color val = EditColor(tree->item_labelbgcolor()); // Let user edit the color
  732. tree->item_labelbgcolor(val); // apply modified color to tree
  733. item_labelbgcolor_button->color(val); // update modified color to button;
  734. }
  735. Fl_Choice *item_font_choice=(Fl_Choice *)0;
  736. static void cb_item_font_choice(Fl_Choice*, void*) {
  737. Fl_Font val = (Fl_Font)item_font_choice->value(); // get chooser's current font value
  738. tree->item_labelfont(val); // change font in tree;
  739. }
  740. Fl_Menu_Item menu_item_font_choice[] = {
  741. {"Helvetica", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  742. {"Helvetica Bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  743. {"Helvetica Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  744. {"Helvetica Bold Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  745. {"Courier", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  746. {"Courier Bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  747. {"Courier Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  748. {"Courier Bold Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  749. {"Times", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  750. {"Times Bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  751. {"Times Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  752. {"Times Bold Italic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  753. {"Symbol", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  754. {"Screen", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  755. {"Screen bold", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  756. {"Zapf Dingbats", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 12, 0},
  757. {0,0,0,0,0,0,0,0,0}
  758. };
  759. Fl_Value_Slider *item_labelsize_slider=(Fl_Value_Slider *)0;
  760. static void cb_item_labelsize_slider(Fl_Value_Slider*, void*) {
  761. tree->item_labelsize((int)item_labelsize_slider->value());
  762. }
  763. Fl_Box *resizer_box=(Fl_Box *)0;
  764. int main(int argc, char **argv) {
  765. { window = new Fl_Double_Window(1015, 445, "tree");
  766. { tree = new Fl_Tree(15, 22, 280, 411, "Tree");
  767. tree->tooltip("Test tree");
  768. tree->box(FL_DOWN_BOX);
  769. tree->color((Fl_Color)55);
  770. tree->selection_color(FL_SELECTION_COLOR);
  771. tree->labeltype(FL_NORMAL_LABEL);
  772. tree->labelfont(0);
  773. tree->labelsize(14);
  774. tree->labelcolor(FL_FOREGROUND_COLOR);
  775. tree->callback((Fl_Callback*)cb_tree, (void*)(1234));
  776. tree->align(Fl_Align(FL_ALIGN_TOP));
  777. tree->when(FL_WHEN_RELEASE);
  778. tree->end();
  779. } // Fl_Tree* tree
  780. { Fl_Group* o = new Fl_Group(300, 5, 705, 427);
  781. { Fl_Box* o = new Fl_Box(311, 23, 335, 263, "Tree Globals");
  782. o->tooltip("These controls only affect the selected items. If no items are selected, all \
  783. existing items in tree are modified.");
  784. o->box(FL_DOWN_BOX);
  785. o->color(FL_DARK1);
  786. o->labelsize(12);
  787. o->align(Fl_Align(FL_ALIGN_TOP));
  788. } // Fl_Box* o
  789. { Fl_Value_Slider* o = margintop_slider = new Fl_Value_Slider(486, 31, 140, 16, "margintop()");
  790. margintop_slider->tooltip("Changes the top margin for the tree widget");
  791. margintop_slider->type(1);
  792. margintop_slider->labelsize(12);
  793. margintop_slider->textsize(12);
  794. margintop_slider->callback((Fl_Callback*)cb_margintop_slider, (void*)(tree));
  795. margintop_slider->align(Fl_Align(FL_ALIGN_LEFT));
  796. o->value(tree->margintop());
  797. o->range(0.0, 100.0);
  798. o->step(1.0);
  799. o->color(46); o->selection_color(FL_RED);
  800. } // Fl_Value_Slider* margintop_slider
  801. { Fl_Value_Slider* o = marginleft_slider = new Fl_Value_Slider(486, 51, 140, 16, "marginleft()");
  802. marginleft_slider->tooltip("Changes the left margin for the tree widget");
  803. marginleft_slider->type(1);
  804. marginleft_slider->labelsize(12);
  805. marginleft_slider->textsize(12);
  806. marginleft_slider->callback((Fl_Callback*)cb_marginleft_slider, (void*)(tree));
  807. marginleft_slider->align(Fl_Align(FL_ALIGN_LEFT));
  808. o->value(tree->marginleft());
  809. o->range(0.0, 100.0);
  810. o->step(1.0);
  811. o->color(46); o->selection_color(FL_RED);
  812. } // Fl_Value_Slider* marginleft_slider
  813. { Fl_Value_Slider* o = openchild_marginbottom_slider = new Fl_Value_Slider(486, 71, 140, 16, "openchild_marginbottom()");
  814. openchild_marginbottom_slider->tooltip("Changes the vertical space below an open child tree");
  815. openchild_marginbottom_slider->type(1);
  816. openchild_marginbottom_slider->labelsize(12);
  817. openchild_marginbottom_slider->textsize(12);
  818. openchild_marginbottom_slider->callback((Fl_Callback*)cb_openchild_marginbottom_slider, (void*)(tree));
  819. openchild_marginbottom_slider->align(Fl_Align(FL_ALIGN_LEFT));
  820. o->value(tree->openchild_marginbottom());
  821. o->range(0.0, 100.0);
  822. o->step(1.0);
  823. o->color(46); o->selection_color(FL_RED);
  824. } // Fl_Value_Slider* openchild_marginbottom_slider
  825. { collapseicons_chooser = new Fl_Choice(486, 96, 140, 21, "Collapse icons");
  826. collapseicons_chooser->tooltip("Tests Fl_Tree::openicon() and Fl_Tree::closeicon()");
  827. collapseicons_chooser->down_box(FL_BORDER_BOX);
  828. collapseicons_chooser->labelsize(12);
  829. collapseicons_chooser->textsize(11);
  830. collapseicons_chooser->callback((Fl_Callback*)cb_collapseicons_chooser);
  831. collapseicons_chooser->menu(menu_collapseicons_chooser);
  832. } // Fl_Choice* collapseicons_chooser
  833. { connectorstyle_chooser = new Fl_Choice(486, 120, 140, 21, "Line style");
  834. connectorstyle_chooser->tooltip("Tests connectorstyle() bit flags");
  835. connectorstyle_chooser->down_box(FL_BORDER_BOX);
  836. connectorstyle_chooser->labelsize(12);
  837. connectorstyle_chooser->textsize(11);
  838. connectorstyle_chooser->callback((Fl_Callback*)cb_connectorstyle_chooser);
  839. connectorstyle_chooser->menu(menu_connectorstyle_chooser);
  840. 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; }
  841. } // Fl_Choice* connectorstyle_chooser
  842. { selectmode_chooser = new Fl_Choice(486, 144, 140, 21, "Selection Mode");
  843. selectmode_chooser->tooltip("Sets how Fl_Tree handles mouse selection of tree items");
  844. selectmode_chooser->down_box(FL_BORDER_BOX);
  845. selectmode_chooser->labelsize(12);
  846. selectmode_chooser->textsize(11);
  847. selectmode_chooser->callback((Fl_Callback*)cb_selectmode_chooser);
  848. selectmode_chooser->menu(menu_selectmode_chooser);
  849. selectmode_chooser->value(1);
  850. cb_selectmode_chooser(selectmode_chooser, (void*)0);
  851. } // Fl_Choice* selectmode_chooser
  852. { whenmode_chooser = new Fl_Choice(486, 168, 140, 21, "When");
  853. whenmode_chooser->tooltip("Sets when() the tree\'s callback is invoked");
  854. whenmode_chooser->down_box(FL_BORDER_BOX);
  855. whenmode_chooser->labelsize(12);
  856. whenmode_chooser->textsize(11);
  857. whenmode_chooser->callback((Fl_Callback*)cb_whenmode_chooser);
  858. whenmode_chooser->menu(menu_whenmode_chooser);
  859. whenmode_chooser->value(1);
  860. cb_whenmode_chooser(whenmode_chooser, (void*)0);
  861. } // Fl_Choice* whenmode_chooser
  862. { usericon_radio = new Fl_Check_Button(486, 194, 20, 16, "Enable user icons?");
  863. usericon_radio->tooltip("Tests Fl_Tree_Item::usericon()");
  864. usericon_radio->down_box(FL_DOWN_BOX);
  865. usericon_radio->labelsize(12);
  866. usericon_radio->callback((Fl_Callback*)cb_usericon_radio, (void*)(tree));
  867. usericon_radio->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  868. usericon_radio->value(1);
  869. } // Fl_Check_Button* usericon_radio
  870. { showroot_radio = new Fl_Check_Button(486, 211, 20, 16, "Show root?");
  871. showroot_radio->tooltip("Tests tree->showroot();");
  872. showroot_radio->down_box(FL_DOWN_BOX);
  873. showroot_radio->labelsize(12);
  874. showroot_radio->callback((Fl_Callback*)cb_showroot_radio, (void*)(tree));
  875. showroot_radio->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  876. int onoff = tree->showroot(); showroot_radio->value(onoff);
  877. } // Fl_Check_Button* showroot_radio
  878. { visiblefocus_checkbox = new Fl_Check_Button(486, 228, 20, 16, "Visible focus?");
  879. visiblefocus_checkbox->tooltip("Toggles the tree\'s visible_focus() box");
  880. visiblefocus_checkbox->down_box(FL_DOWN_BOX);
  881. visiblefocus_checkbox->labelsize(12);
  882. visiblefocus_checkbox->callback((Fl_Callback*)cb_visiblefocus_checkbox, (void*)(tree));
  883. visiblefocus_checkbox->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  884. int onoff = tree->visible_focus(); visiblefocus_checkbox->value(onoff);
  885. } // Fl_Check_Button* visiblefocus_checkbox
  886. { Fl_Button* o = selection_color_button = new Fl_Button(486, 251, 16, 16, "Selection Color");
  887. selection_color_button->tooltip("Changes the tree widget\'s selection color. Tests Fl_Tree::selection_color()");
  888. selection_color_button->box(FL_DOWN_BOX);
  889. selection_color_button->labelsize(12);
  890. selection_color_button->callback((Fl_Callback*)cb_selection_color_button);
  891. selection_color_button->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  892. o->color(tree->selection_color());
  893. } // Fl_Button* selection_color_button
  894. { Fl_Box* o = new Fl_Box(311, 312, 335, 120, "Test Operations");
  895. o->tooltip("These controls only affect the defaults for new items that are created. These\
  896. test the Fl_Tree_Prefs methods.");
  897. o->box(FL_DOWN_BOX);
  898. o->color(FL_DARK1);
  899. o->labelsize(12);
  900. o->align(Fl_Align(FL_ALIGN_TOP));
  901. } // Fl_Box* o
  902. { showitem_box = new Fl_Box(331, 335, 70, 82, "show_item()\n");
  903. showitem_box->box(FL_DOWN_BOX);
  904. showitem_box->labelsize(11);
  905. showitem_box->align(Fl_Align(FL_ALIGN_TOP));
  906. } // Fl_Box* showitem_box
  907. { Fl_Button* o = new Fl_Button(346, 344, 40, 17, "Show");
  908. o->tooltip("Tests show_item() with no position specified.\nMakes the selected item visibl\
  909. e IF it is off-screen.\nNo change made if it is not off-screen.");
  910. o->labelsize(11);
  911. o->callback((Fl_Callback*)cb_Show);
  912. } // Fl_Button* o
  913. { Fl_Button* o = new Fl_Button(346, 361, 40, 16, "Top");
  914. o->tooltip("Test show_item_top().\nScrolls selected item to the top of the display\n(only\
  915. works if scrollbar showing)\nTo use:\n1) open \'500 items\'\n2) select item 0\
  916. 010\n3) Hit Top/Mid/Bot");
  917. o->labelsize(11);
  918. o->callback((Fl_Callback*)cb_Top);
  919. } // Fl_Button* o
  920. { Fl_Button* o = new Fl_Button(346, 377, 40, 16, "Mid");
  921. o->tooltip("Tests show_item_middle().\nScrolls the selected item to the middle of the dis\
  922. play\nTo use:\n 1) open \'500 items\'\n 2) select \'item 0010\'\n 3) Hit To\
  923. p/Mid/Bot");
  924. o->labelsize(11);
  925. o->callback((Fl_Callback*)cb_Mid);
  926. } // Fl_Button* o
  927. { Fl_Button* o = new Fl_Button(346, 393, 40, 16, "Bot");
  928. o->tooltip("Tests show_item_bottom().\nScrolls the selected item to the bottom of the dis\
  929. play\nTo use:\n 1) open \'500 items\'\n 2) select \'item 0010\'\n 3) Hit To\
  930. p/Mid/Bot");
  931. o->labelsize(11);
  932. o->callback((Fl_Callback*)cb_Bot);
  933. } // Fl_Button* o
  934. { loaddb_button = new Fl_Button(431, 338, 95, 16, "Load Database...");
  935. loaddb_button->tooltip("Load the contents of an Fl_Preferences database into the tree view");
  936. loaddb_button->labelsize(9);
  937. loaddb_button->callback((Fl_Callback*)cb_loaddb_button);
  938. } // Fl_Button* loaddb_button
  939. { insertabove_button = new Fl_Button(431, 358, 95, 16, "Insert Above");
  940. insertabove_button->tooltip("Inserts three items above the selected items");
  941. insertabove_button->labelsize(9);
  942. insertabove_button->callback((Fl_Callback*)cb_insertabove_button);
  943. } // Fl_Button* insertabove_button
  944. { rebuildtree_button = new Fl_Button(431, 378, 95, 16, "Rebuild Tree");
  945. rebuildtree_button->tooltip("Rebuilds the tree with defaults");
  946. rebuildtree_button->labelsize(9);
  947. rebuildtree_button->callback((Fl_Callback*)cb_rebuildtree_button);
  948. } // Fl_Button* rebuildtree_button
  949. { showpathname_button = new Fl_Button(431, 398, 95, 16, "Show Pathname");
  950. showpathname_button->tooltip("Show the pathname for the selected item. Tests the Fl_Tree::item_pathname() m\
  951. ethod.");
  952. showpathname_button->labelsize(9);
  953. showpathname_button->callback((Fl_Callback*)cb_showpathname_button);
  954. } // Fl_Button* showpathname_button
  955. { clearall_button = new Fl_Button(531, 338, 95, 16, "Clear All");
  956. clearall_button->tooltip("Clears all items\nTests Fl_Tree::clear()");
  957. clearall_button->labelsize(9);
  958. clearall_button->callback((Fl_Callback*)cb_clearall_button);
  959. } // Fl_Button* clearall_button
  960. { testcallbackflag_button = new Fl_Button(531, 358, 95, 16, "Test Callback Flag");
  961. testcallbackflag_button->tooltip("Test the \'docallback\' argument can disable callbacks.");
  962. testcallbackflag_button->labelsize(9);
  963. testcallbackflag_button->callback((Fl_Callback*)cb_testcallbackflag_button);
  964. } // Fl_Button* testcallbackflag_button
  965. { Fl_Box* o = new Fl_Box(661, 23, 335, 263, "Selected Items");
  966. o->tooltip("These controls only affect the selected items. If no items are selected, all \
  967. existing items in tree are modified.");
  968. o->box(FL_DOWN_BOX);
  969. o->color(FL_DARK1);
  970. o->labelsize(12);
  971. o->align(Fl_Align(FL_ALIGN_TOP));
  972. } // Fl_Box* o
  973. { Fl_Choice* o = all_font_choice = new Fl_Choice(828, 31, 140, 21, "Label Font");
  974. all_font_choice->tooltip("Changes the font for the selected items\'s labels. If none selected, all are \
  975. changed. Tests Fl_Tree_Item::labelfont();");
  976. all_font_choice->down_box(FL_BORDER_BOX);
  977. all_font_choice->labelsize(12);
  978. all_font_choice->textsize(11);
  979. all_font_choice->callback((Fl_Callback*)cb_all_font_choice);
  980. all_font_choice->menu(menu_all_font_choice);
  981. o->value((int)tree->item_labelfont()); // get tree's current font, assign to chooser
  982. } // Fl_Choice* all_font_choice
  983. { Fl_Value_Slider* o = labelsize_slider = new Fl_Value_Slider(828, 55, 140, 16, "Label Size");
  984. labelsize_slider->tooltip("Changes the font size of the selected items\'s labels. If none selected, all \
  985. are changed. Tests Fl_Tree_Item::labelsize();");
  986. labelsize_slider->type(1);
  987. labelsize_slider->labelsize(12);
  988. labelsize_slider->textsize(12);
  989. labelsize_slider->callback((Fl_Callback*)cb_labelsize_slider, (void*)(tree));
  990. labelsize_slider->align(Fl_Align(FL_ALIGN_LEFT));
  991. o->value(tree->item_labelsize());
  992. o->range(5.0, 200.0);
  993. o->step(1.0);
  994. o->color(46); o->selection_color(FL_RED);
  995. } // Fl_Value_Slider* labelsize_slider
  996. { Fl_Button* o = all_labelfgcolor_button = new Fl_Button(828, 81, 16, 16, "Label FG Color");
  997. all_labelfgcolor_button->tooltip("Changes the label fg color for the selected items. If none selected, all are \
  998. changed. Tests Fl_Tree_Item::labelfgcolor();");
  999. all_labelfgcolor_button->box(FL_DOWN_BOX);
  1000. all_labelfgcolor_button->labelsize(12);
  1001. all_labelfgcolor_button->callback((Fl_Callback*)cb_all_labelfgcolor_button);
  1002. all_labelfgcolor_button->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  1003. o->color(tree->item_labelfgcolor());
  1004. } // Fl_Button* all_labelfgcolor_button
  1005. { Fl_Button* o = all_labelbgcolor_button = new Fl_Button(828, 99, 16, 16, "Label BG Color");
  1006. all_labelbgcolor_button->tooltip("Changes the label bg color for the selected items. If none selected, all are \
  1007. changed. Tests Fl_Tree_Item::labelbgcolor();");
  1008. all_labelbgcolor_button->box(FL_DOWN_BOX);
  1009. all_labelbgcolor_button->labelsize(12);
  1010. all_labelbgcolor_button->callback((Fl_Callback*)cb_all_labelbgcolor_button);
  1011. all_labelbgcolor_button->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  1012. o->color(tree->item_labelbgcolor());
  1013. } // Fl_Button* all_labelbgcolor_button
  1014. { Fl_Value_Slider* o = connectorwidth_slider = new Fl_Value_Slider(828, 126, 140, 16, "Connector Width");
  1015. connectorwidth_slider->tooltip("Tests Fl_Tree::connectorwidth()");
  1016. connectorwidth_slider->type(1);
  1017. connectorwidth_slider->labelsize(12);
  1018. connectorwidth_slider->textsize(12);
  1019. connectorwidth_slider->callback((Fl_Callback*)cb_connectorwidth_slider, (void*)(tree));
  1020. connectorwidth_slider->align(Fl_Align(FL_ALIGN_LEFT));
  1021. o->value(tree->connectorwidth());
  1022. o->range(1.0, 100.0);
  1023. o->step(1.0);
  1024. o->color(46); o->selection_color(FL_RED);
  1025. } // Fl_Value_Slider* connectorwidth_slider
  1026. { deactivate_toggle = new Fl_Light_Button(734, 154, 95, 16, " Deactivate");
  1027. deactivate_toggle->tooltip("Toggle the deactivation state of the selected items.\nIf none are selected, a\
  1028. ll are set.");
  1029. deactivate_toggle->selection_color((Fl_Color)1);
  1030. deactivate_toggle->labelsize(9);
  1031. deactivate_toggle->callback((Fl_Callback*)cb_deactivate_toggle);
  1032. } // Fl_Light_Button* deactivate_toggle
  1033. { bold_toggle = new Fl_Light_Button(734, 174, 95, 16, " Bold Font");
  1034. bold_toggle->tooltip("Toggles bold font for selected items\nIf nothing selected, all are changed");
  1035. bold_toggle->selection_color((Fl_Color)1);
  1036. bold_toggle->labelsize(9);
  1037. bold_toggle->callback((Fl_Callback*)cb_bold_toggle);
  1038. } // Fl_Light_Button* bold_toggle
  1039. { showselected_button = new Fl_Button(829, 154, 95, 16, "Show Selected");
  1040. showselected_button->tooltip("Clears the selected items");
  1041. showselected_button->labelsize(9);
  1042. showselected_button->callback((Fl_Callback*)cb_showselected_button);
  1043. } // Fl_Button* showselected_button
  1044. { clearselected_button = new Fl_Button(829, 174, 95, 16, "Remove Selected");
  1045. clearselected_button->tooltip("Removes the selected items");
  1046. clearselected_button->labelsize(9);
  1047. clearselected_button->callback((Fl_Callback*)cb_clearselected_button);
  1048. } // Fl_Button* clearselected_button
  1049. { selectall_button = new Fl_Button(689, 201, 95, 16, "Select All");
  1050. selectall_button->tooltip("Selects all items in the tree");
  1051. selectall_button->labelsize(9);
  1052. selectall_button->callback((Fl_Callback*)cb_selectall_button);
  1053. } // Fl_Button* selectall_button
  1054. { deselectall_button = new Fl_Button(689, 221, 95, 16, "Deselect All");
  1055. deselectall_button->tooltip("Deselects all items in the tree");
  1056. deselectall_button->labelsize(9);
  1057. deselectall_button->callback((Fl_Callback*)cb_deselectall_button);
  1058. } // Fl_Button* deselectall_button
  1059. { bbbselect_toggle = new Fl_Light_Button(784, 201, 95, 16, " Select Bbb");
  1060. bbbselect_toggle->tooltip("Toggle selection of just the /Bbb item\n(Not children)");
  1061. bbbselect_toggle->selection_color((Fl_Color)1);
  1062. bbbselect_toggle->labelsize(9);
  1063. bbbselect_toggle->callback((Fl_Callback*)cb_bbbselect_toggle);
  1064. } // Fl_Light_Button* bbbselect_toggle
  1065. { bbbselect2_toggle = new Fl_Light_Button(784, 221, 95, 16, " Select Bbb+");
  1066. bbbselect2_toggle->tooltip("Toggle selection of the /Bbb item and its children");
  1067. bbbselect2_toggle->selection_color((Fl_Color)1);
  1068. bbbselect2_toggle->labelsize(9);
  1069. bbbselect2_toggle->callback((Fl_Callback*)cb_bbbselect2_toggle);
  1070. } // Fl_Light_Button* bbbselect2_toggle
  1071. { bbbchild02select_toggle = new Fl_Light_Button(784, 241, 95, 16, " Toggle child-02");
  1072. bbbchild02select_toggle->tooltip("Toggle the single item \"/Bbb/child-02\" using the item\'s \"pathname\".");
  1073. bbbchild02select_toggle->selection_color((Fl_Color)1);
  1074. bbbchild02select_toggle->labelsize(9);
  1075. bbbchild02select_toggle->callback((Fl_Callback*)cb_bbbchild02select_toggle);
  1076. } // Fl_Light_Button* bbbchild02select_toggle
  1077. { rootselect_toggle = new Fl_Light_Button(879, 201, 95, 16, "Select ROOT");
  1078. rootselect_toggle->tooltip("Toggle selection of the ROOT item");
  1079. rootselect_toggle->selection_color((Fl_Color)1);
  1080. rootselect_toggle->labelsize(9);
  1081. rootselect_toggle->callback((Fl_Callback*)cb_rootselect_toggle);
  1082. } // Fl_Light_Button* rootselect_toggle
  1083. { rootselect2_toggle = new Fl_Light_Button(879, 221, 95, 16, "Select ROOT+");
  1084. rootselect2_toggle->tooltip("Toggle selection of the ROOT item and all children");
  1085. rootselect2_toggle->selection_color((Fl_Color)1);
  1086. rootselect2_toggle->labelsize(9);
  1087. rootselect2_toggle->callback((Fl_Callback*)cb_rootselect2_toggle);
  1088. } // Fl_Light_Button* rootselect2_toggle
  1089. { Fl_Box* o = new Fl_Box(661, 312, 335, 120, "New Item Defaults");
  1090. o->tooltip("These controls only affect the defaults for new items that are created. These\
  1091. test the Fl_Tree_Prefs methods.");
  1092. o->box(FL_DOWN_BOX);
  1093. o->color(FL_DARK1);
  1094. o->labelsize(12);
  1095. o->align(Fl_Align(FL_ALIGN_TOP));
  1096. } // Fl_Box* o
  1097. { Fl_Button* o = item_labelfgcolor_button = new Fl_Button(828, 327, 16, 16, "item_labelfgcolor");
  1098. item_labelfgcolor_button->tooltip("Sets the *default* label foreground color for new items created. Does NOT aff\
  1099. ect existing items.");
  1100. item_labelfgcolor_button->box(FL_DOWN_BOX);
  1101. item_labelfgcolor_button->labelsize(12);
  1102. item_labelfgcolor_button->callback((Fl_Callback*)cb_item_labelfgcolor_button);
  1103. item_labelfgcolor_button->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  1104. o->color(tree->item_labelfgcolor());
  1105. } // Fl_Button* item_labelfgcolor_button
  1106. { item_labelbgcolor_button = new Fl_Button(828, 345, 16, 16, "item_labelbgcolor");
  1107. item_labelbgcolor_button->tooltip("Sets the *default* label background color for new items created. Does NOT aff\
  1108. ect existing items.");
  1109. item_labelbgcolor_button->box(FL_DOWN_BOX);
  1110. item_labelbgcolor_button->labelsize(12);
  1111. item_labelbgcolor_button->callback((Fl_Callback*)cb_item_labelbgcolor_button);
  1112. item_labelbgcolor_button->align(Fl_Align(FL_ALIGN_LEFT_TOP));
  1113. item_labelbgcolor_button->color(tree->item_labelbgcolor());
  1114. } // Fl_Button* item_labelbgcolor_button
  1115. { Fl_Choice* o = item_font_choice = new Fl_Choice(828, 371, 140, 21, "Item label font");
  1116. item_font_choice->tooltip("Sets the default font used for new items created. Does NOT affect existing it\
  1117. ems.");
  1118. item_font_choice->down_box(FL_BORDER_BOX);
  1119. item_font_choice->labelsize(12);
  1120. item_font_choice->textsize(12);
  1121. item_font_choice->callback((Fl_Callback*)cb_item_font_choice);
  1122. item_font_choice->menu(menu_item_font_choice);
  1123. o->value((int)tree->item_labelfont()); // get tree's current font, assign to chooser
  1124. } // Fl_Choice* item_font_choice
  1125. { Fl_Value_Slider* o = item_labelsize_slider = new Fl_Value_Slider(828, 396, 140, 16, "item_labelsize");
  1126. item_labelsize_slider->tooltip("Sets the default labelsize used for new items. Does NOT affect existing items\
  1127. .");
  1128. item_labelsize_slider->type(1);
  1129. item_labelsize_slider->labelsize(12);
  1130. item_labelsize_slider->textsize(12);
  1131. item_labelsize_slider->callback((Fl_Callback*)cb_item_labelsize_slider, (void*)(tree));
  1132. item_labelsize_slider->align(Fl_Align(FL_ALIGN_LEFT));
  1133. o->value((int)tree->item_labelsize());
  1134. o->range(1.0, 50.0);
  1135. o->step(1.0);
  1136. o->color(46); o->selection_color(FL_RED);
  1137. } // Fl_Value_Slider* item_labelsize_slider
  1138. o->resizable(0);
  1139. o->end();
  1140. } // Fl_Group* o
  1141. { resizer_box = new Fl_Box(0, 263, 15, 14);
  1142. } // Fl_Box* resizer_box
  1143. window->end();
  1144. } // Fl_Double_Window* window
  1145. // Initialize Tree
  1146. tree->root_label("ROOT");
  1147. RebuildTree();
  1148. /*tree->show_self();*/
  1149. // FLTK stuff
  1150. //Fl::scheme("gtk+");
  1151. window->resizable(tree);
  1152. window->size_range(window->w(), window->h(), 0, 0);
  1153. if ( tree->when() == FL_WHEN_CHANGED ) whenmode_chooser->value(0);
  1154. else if ( tree->when() == FL_WHEN_RELEASE ) whenmode_chooser->value(1);
  1155. else if ( tree->when() == FL_WHEN_NEVER ) whenmode_chooser->value(2);
  1156. window->show(argc, argv);
  1157. return Fl::run();
  1158. }