// // Browser test program for the Fast Light Tool Kit (FLTK). // // Copyright 1998-2010 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this // file is missing or damaged, see the license at: // // https://www.fltk.org/COPYING.php // // Please see the following page on how to report bugs and issues: // // https://www.fltk.org/bugs.php // /* This is a test of how the browser draws lines. This is a second line. This is a third. That was a blank line above this. @r@_Right justify @c@_Center justify @_Left justify @bBold text @iItalic text @b@iBold Italic @fFixed width @f@bBold Fixed @f@iItalic Fixed @f@i@bBold Italic Fixed @lLarge @l@bLarge bold @sSmall @s@bSmall bold @s@iSmall italic @s@i@bSmall italic bold @uunderscore @C1RED @C2Green @C4Blue @N@.Inactive @@ start line with '@' @.@ alternative start line with '@' @l@@ start tall line with '@' @s@@ start small line with '@' #s## start line with '#' #s#.# alternative start line with '#' You should try different browser types: Fl_Browser Fl_Select_Browser Fl_Hold_Browser Fl_Multi_Browser */ #include #include #include #include #include #include #include #include #include #include #include #include Fl_Select_Browser *browser; Fl_Button *top, *bottom, *middle, *visible, *swap, *sort; Fl_Choice *btype; Fl_Choice *wtype; Fl_Int_Input *field; Fl_Terminal *tty = 0; typedef struct { const char *name; Fl_When wvalue; } WhenItem; // FL_WHEN chooser.. WhenItem when_items[] = { { "FL_WHEN_NEVER", FL_WHEN_NEVER }, { "FL_WHEN_CHANGED", FL_WHEN_CHANGED }, { "FL_WHEN_NOT_CHANGED", FL_WHEN_NOT_CHANGED }, { "FL_WHEN_RELEASE", FL_WHEN_RELEASE }, { "FL_WHEN_RELEASE_ALWAYS", FL_WHEN_RELEASE_ALWAYS }, { "FL_WHEN_ENTER_KEY", FL_WHEN_ENTER_KEY }, { "FL_WHEN_ENTER_KEY_ALWAYS", FL_WHEN_ENTER_KEY_ALWAYS }, { "FL_WHEN_ENTER_KEY_CHANGED", FL_WHEN_ENTER_KEY_CHANGED }, { "FL_WHEN_ENTER_KEY + FL_WHEN_RELEASE_ALWAYS", Fl_When(int(FL_WHEN_ENTER_KEY_CHANGED)+int(FL_WHEN_RELEASE_ALWAYS)) } // TODO: Perhaps other FL_WHEN_* combos are relevant }; void b_cb(Fl_Widget* o, void*) { tty->printf("callback, selection = \033[31m%d\033[0m, event_clicks = \033[32m%d\033[0m\n", ((Fl_Browser*)o)->value(), Fl::event_clicks()); } void show_cb(Fl_Widget *o, void *) { int line = atoi(field->value()); if (!line) { fl_alert("Please enter a number in the text field\n" "before clicking on the buttons."); return; } if (o == top) browser->topline(line); else if (o == bottom) browser->bottomline(line); else if (o == middle) browser->middleline(line); else browser->make_visible(line); } void swap_cb(Fl_Widget *, void *) { int a = -1, b = -1; for ( int t=0; tsize(); t++ ) { // find two selected items if ( browser->selected(t) ) { if ( a < 0 ) { a = t; } else { b = t; break; } } } browser->swap(a, b); // swap them } void sort_cb(Fl_Widget *, void *) { browser->sort(FL_SORT_ASCENDING); } void btype_cb(Fl_Widget *, void *) { for ( int t=1; t<=browser->size(); t++ ) browser->select(t,0); browser->select(1,0); // leave focus box on first line if ( strcmp(btype->text(),"Normal")==0) browser->type(FL_NORMAL_BROWSER); else if ( strcmp(btype->text(),"Select")==0) browser->type(FL_SELECT_BROWSER); else if ( strcmp(btype->text(),"Hold" )==0) browser->type(FL_HOLD_BROWSER); else if ( strcmp(btype->text(),"Multi" )==0) browser->type(FL_MULTI_BROWSER); browser->redraw(); } void wtype_cb(Fl_Widget *, void *) { if ( wtype->value() < 0 ) return; browser->when( when_items[wtype->value()].wvalue ); // when value based on array } int main(int argc, char **argv) { int i; Fl::args_to_utf8(argc, argv); // for MSYS2/MinGW if (!Fl::args(argc, argv, i)) Fl::fatal(Fl::help); const char *fname = (i < argc) ? argv[i] : "browser.cxx"; Fl_Double_Window window(720, 520, fname); browser = new Fl_Select_Browser(0, 0, window.w(), 350, 0); browser->type(FL_MULTI_BROWSER); browser->callback(b_cb); if (!browser->load(fname)) { fl_message("Can't load '%s'\n%s\n", fname, strerror(errno)); browser->add("This is a test of how the browser draws lines."); browser->add("This is a second line."); browser->add("This is a third."); browser->add("@bBold text"); browser->add("@iItalic text"); } browser->vposition(0); field = new Fl_Int_Input(55, 350, window.w()-55, 25, "Line #:"); field->callback(show_cb); top = new Fl_Button(0, 375, 80, 25, "Top"); top->callback(show_cb); bottom = new Fl_Button(80, 375, 80, 25, "Bottom"); bottom->callback(show_cb); middle = new Fl_Button(160, 375, 80, 25, "Middle"); middle->callback(show_cb); visible = new Fl_Button(240, 375, 80, 25, "Make Vis."); visible->callback(show_cb); swap = new Fl_Button(320, 375, 80, 25, "Swap"); swap->callback(swap_cb); swap->tooltip("Swaps two selected lines\n(Use CTRL-click to select two lines)"); sort = new Fl_Button(400, 375, 80, 25, "Sort"); sort->callback(sort_cb); btype = new Fl_Choice(480, 375, 80, 25); btype->add("Normal"); btype->add("Select"); btype->add("Hold"); btype->add("Multi"); btype->callback(btype_cb); btype->value(3); btype->tooltip("Changes the browser type()"); wtype = new Fl_Choice(560, 375, 160, 25); wtype->textsize(8); // Append items from when_items[] array { int len = sizeof(when_items) / sizeof(WhenItem); for ( int i=0; iadd(when_items[i].name); } wtype->callback(wtype_cb); wtype->value(4); // FL_WHEN_RELEASE_ALWAYS is Fl_Browser's default // Small terminal window for callback messages tty = new Fl_Terminal(0,400,720,120); tty->history_lines(50); tty->ansi(true); window.resizable(browser); window.show(argc,argv); return Fl::run(); }