FLUID: Adds Reveal button to SourceView
Position your text cursor in the source header, or .fl project file text preview and click reveal, and the corresponding node will be selected. Double will open the corresponding editor.
This commit is contained in:
parent
e8d218109e
commit
238b3a1be4
@ -348,7 +348,6 @@ void update_visibility_flag(Fl_Type *p) {
|
||||
Constructor and base for any node in the widget tree.
|
||||
*/
|
||||
Fl_Type::Fl_Type() :
|
||||
code_include_start(-1), code_include_end(-1),
|
||||
code_static_start(-1), code_static_end(-1),
|
||||
code1_start(-1), code1_end(-1),
|
||||
code2_start(-1), code2_end(-1),
|
||||
@ -1024,5 +1023,32 @@ void Fl_Type::write_code1(Fd_Code_Writer& f) {
|
||||
void Fl_Type::write_code2(Fd_Code_Writer&) {
|
||||
}
|
||||
|
||||
/** Find a type node by using the sourceview text positions.
|
||||
|
||||
\param[in] text_type 0=source file, 1=header, 2=.fl project file
|
||||
\param[in] crsr cursor position in text
|
||||
\return the node we found or NULL
|
||||
*/
|
||||
Fl_Type *Fl_Type::find_in_text(int text_type, int crsr) {
|
||||
for (Fl_Type *node = first; node; node = node->next) {
|
||||
switch (text_type) {
|
||||
case 0:
|
||||
if (crsr >= node->code1_start && crsr < node->code1_end) return node;
|
||||
if (crsr >= node->code2_start && crsr < node->code2_end) return node;
|
||||
if (crsr >= node->code_static_start && crsr < node->code_static_end) return node;
|
||||
break;
|
||||
case 1:
|
||||
if (crsr >= node->header_start && crsr < node->header_end) return node;
|
||||
if (crsr >= node->header_static_start && crsr < node->header_static_end) return node;
|
||||
break;
|
||||
case 2:
|
||||
if (crsr >= node->proj1_start && crsr < node->proj1_end) return node;
|
||||
if (crsr >= node->proj2_start && crsr < node->proj2_end) return node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// \}
|
||||
|
||||
|
@ -145,7 +145,6 @@ public: // things that should not be public:
|
||||
const char *callback_name(Fd_Code_Writer& f);
|
||||
|
||||
// text positions of this type in code, header, and project file (see SourceView)
|
||||
int code_include_start, code_include_end;
|
||||
int code_static_start, code_static_end;
|
||||
int code1_start, code1_end;
|
||||
int code2_start, code2_end;
|
||||
@ -248,6 +247,8 @@ public:
|
||||
bool is_in_class() const;
|
||||
|
||||
int has_function(const char*, const char*) const;
|
||||
|
||||
static Fl_Type *find_in_text(int text_type, int crsr);
|
||||
};
|
||||
|
||||
#endif // _FLUID_FL_TYPE_H
|
||||
|
@ -26,6 +26,8 @@ static char *sv_source_filename = NULL;
|
||||
static char *sv_header_filename = NULL;
|
||||
static char *sv_design_filename = NULL;
|
||||
int sv_code_choice;
|
||||
extern void select_only(Fl_Type *o);
|
||||
extern void reveal_in_browser(Fl_Type *t);
|
||||
|
||||
/**
|
||||
Update the header and source code highlighting depending on the
|
||||
@ -261,6 +263,24 @@ TextViewer *sv_strings=(TextViewer *)0;
|
||||
|
||||
TextViewer *sv_project=(TextViewer *)0;
|
||||
|
||||
static void cb_Reveal(Fl_Button*, void*) {
|
||||
if (sourceview_panel && sourceview_panel->visible()) {
|
||||
Fl_Type *node = NULL;
|
||||
if (sv_source->visible_r())
|
||||
node = Fl_Type::find_in_text(0, sv_source->insert_position());
|
||||
else if (sv_header->visible_r())
|
||||
node = Fl_Type::find_in_text(1, sv_header->insert_position());
|
||||
else if (sv_project->visible_r())
|
||||
node = Fl_Type::find_in_text(2, sv_project->insert_position());
|
||||
if (node) {
|
||||
select_only(node);
|
||||
reveal_in_browser(node);
|
||||
if (Fl::event_clicks()==1) // double click
|
||||
node->open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Fl_Light_Button *sv_autorefresh=(Fl_Light_Button *)0;
|
||||
|
||||
Fl_Light_Button *sv_autoposition=(Fl_Light_Button *)0;
|
||||
@ -282,7 +302,7 @@ Fl_Menu_Item menu_sv_code_choice_w[] = {
|
||||
};
|
||||
|
||||
Fl_Double_Window* make_sourceview() {
|
||||
{ sourceview_panel = new Fl_Double_Window(520, 490, "Code View");
|
||||
{ sourceview_panel = new Fl_Double_Window(520, 515, "Code View");
|
||||
sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb);
|
||||
sourceview_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
|
||||
{ sv_tab = new Fl_Tabs(10, 10, 500, 440);
|
||||
@ -291,7 +311,8 @@ Fl_Double_Window* make_sourceview() {
|
||||
sv_tab->callback((Fl_Callback*)update_sourceview_position_cb);
|
||||
{ Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Source");
|
||||
o->labelsize(13);
|
||||
{ CodeViewer* o = sv_source = new CodeViewer(20, 50, 480, 390);
|
||||
o->hide();
|
||||
{ CodeViewer* o = sv_source = new CodeViewer(10, 40, 500, 410);
|
||||
sv_source->box(FL_DOWN_FRAME);
|
||||
sv_source->color(FL_BACKGROUND2_COLOR);
|
||||
sv_source->selection_color(FL_SELECTION_COLOR);
|
||||
@ -313,7 +334,7 @@ Fl_Double_Window* make_sourceview() {
|
||||
{ Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Header");
|
||||
o->labelsize(13);
|
||||
o->hide();
|
||||
{ CodeViewer* o = sv_header = new CodeViewer(20, 50, 480, 390);
|
||||
{ CodeViewer* o = sv_header = new CodeViewer(10, 40, 500, 410);
|
||||
sv_header->box(FL_DOWN_FRAME);
|
||||
sv_header->color(FL_BACKGROUND2_COLOR);
|
||||
sv_header->selection_color(FL_SELECTION_COLOR);
|
||||
@ -334,7 +355,7 @@ Fl_Double_Window* make_sourceview() {
|
||||
{ Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Strings");
|
||||
o->labelsize(13);
|
||||
o->hide();
|
||||
{ TextViewer* o = sv_strings = new TextViewer(20, 50, 480, 390);
|
||||
{ TextViewer* o = sv_strings = new TextViewer(10, 40, 500, 410);
|
||||
sv_strings->box(FL_DOWN_FRAME);
|
||||
sv_strings->color(FL_BACKGROUND2_COLOR);
|
||||
sv_strings->selection_color(FL_SELECTION_COLOR);
|
||||
@ -354,8 +375,7 @@ Fl_Double_Window* make_sourceview() {
|
||||
} // Fl_Group* o
|
||||
{ Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Project");
|
||||
o->labelsize(13);
|
||||
o->hide();
|
||||
{ TextViewer* o = sv_project = new TextViewer(20, 50, 480, 390);
|
||||
{ TextViewer* o = sv_project = new TextViewer(10, 40, 500, 410);
|
||||
sv_project->box(FL_DOWN_FRAME);
|
||||
sv_project->color(FL_BACKGROUND2_COLOR);
|
||||
sv_project->selection_color(FL_SELECTION_COLOR);
|
||||
@ -376,29 +396,52 @@ Fl_Double_Window* make_sourceview() {
|
||||
sv_tab->end();
|
||||
Fl_Group::current()->resizable(sv_tab);
|
||||
} // Fl_Tabs* sv_tab
|
||||
{ Fl_Group* o = new Fl_Group(10, 460, 500, 22);
|
||||
{ Fl_Button* o = new Fl_Button(10, 460, 61, 20, "Refresh");
|
||||
{ Fl_Group* o = new Fl_Group(10, 460, 500, 20);
|
||||
{ Fl_Button* o = new Fl_Button(244, 460, 25, 20, "aA");
|
||||
o->labelsize(11);
|
||||
} // Fl_Button* o
|
||||
{ Fl_Button* o = new Fl_Button(273, 460, 25, 20, "<<");
|
||||
o->labelsize(11);
|
||||
} // Fl_Button* o
|
||||
{ Fl_Button* o = new Fl_Button(298, 460, 25, 20, ">>");
|
||||
o->labelsize(11);
|
||||
} // Fl_Button* o
|
||||
{ Fl_Button* o = new Fl_Button(327, 460, 61, 20, "Reveal");
|
||||
o->labelsize(11);
|
||||
o->callback((Fl_Callback*)cb_Reveal);
|
||||
} // Fl_Button* o
|
||||
{ Fl_Input* o = new Fl_Input(40, 460, 200, 20, "Find:");
|
||||
o->labelsize(11);
|
||||
o->textsize(11);
|
||||
} // Fl_Input* o
|
||||
{ Fl_Box* o = new Fl_Box(490, 460, 20, 20);
|
||||
Fl_Group::current()->resizable(o);
|
||||
} // Fl_Box* o
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
{ Fl_Group* o = new Fl_Group(10, 485, 500, 20);
|
||||
{ Fl_Button* o = new Fl_Button(10, 485, 61, 20, "Refresh");
|
||||
o->labelsize(11);
|
||||
o->callback((Fl_Callback*)update_sourceview_cb);
|
||||
} // Fl_Button* o
|
||||
{ Fl_Light_Button* o = sv_autorefresh = new Fl_Light_Button(77, 460, 91, 20, "Auto-Refresh");
|
||||
{ Fl_Light_Button* o = sv_autorefresh = new Fl_Light_Button(77, 485, 91, 20, "Auto-Refresh");
|
||||
sv_autorefresh->labelsize(11);
|
||||
o->callback((Fl_Callback*)update_sourceview_cb);
|
||||
} // Fl_Light_Button* sv_autorefresh
|
||||
{ sv_autoposition = new Fl_Light_Button(172, 460, 89, 20, "Auto-Position");
|
||||
{ sv_autoposition = new Fl_Light_Button(172, 485, 89, 20, "Auto-Position");
|
||||
sv_autoposition->labelsize(11);
|
||||
} // Fl_Light_Button* sv_autoposition
|
||||
{ sv_code_choice_w = new Fl_Choice(265, 460, 70, 20);
|
||||
{ sv_code_choice_w = new Fl_Choice(265, 485, 70, 20);
|
||||
sv_code_choice_w->down_box(FL_BORDER_BOX);
|
||||
sv_code_choice_w->labelsize(11);
|
||||
sv_code_choice_w->textsize(11);
|
||||
sv_code_choice_w->callback((Fl_Callback*)cb_sv_code_choice_w);
|
||||
sv_code_choice_w->menu(menu_sv_code_choice_w);
|
||||
} // Fl_Choice* sv_code_choice_w
|
||||
{ Fl_Box* o = new Fl_Box(375, 460, 80, 20);
|
||||
{ Fl_Box* o = new Fl_Box(375, 485, 80, 20);
|
||||
Fl_Group::current()->resizable(o);
|
||||
} // Fl_Box* o
|
||||
{ Fl_Button* o = new Fl_Button(460, 460, 50, 20, "Close");
|
||||
{ Fl_Button* o = new Fl_Button(460, 485, 50, 20, "Close");
|
||||
o->labelsize(11);
|
||||
o->callback((Fl_Callback*)toggle_sourceview_b_cb);
|
||||
} // Fl_Button* o
|
||||
|
@ -47,6 +47,12 @@ decl {char *sv_design_filename = NULL;} {private local
|
||||
decl {int sv_code_choice;} {public local
|
||||
}
|
||||
|
||||
decl {extern void select_only(Fl_Type *o);} {private global
|
||||
}
|
||||
|
||||
decl {extern void reveal_in_browser(Fl_Type *t);} {private global
|
||||
}
|
||||
|
||||
Function {update_sourceview_position()} {
|
||||
comment {Update the header and source code highlighting depending on the
|
||||
currently selected object
|
||||
@ -272,18 +278,18 @@ Function {make_sourceview()} {open
|
||||
Fl_Window sourceview_panel {
|
||||
label {Code View}
|
||||
callback toggle_sourceview_cb open
|
||||
xywh {400 569 520 490} type Double align 80 resizable size_range {384 120 0 0} visible
|
||||
xywh {389 507 520 515} type Double align 80 resizable size_range {384 120 0 0} visible
|
||||
} {
|
||||
Fl_Tabs sv_tab {
|
||||
callback update_sourceview_position_cb open selected
|
||||
callback update_sourceview_position_cb open
|
||||
xywh {10 10 500 440} selection_color 4 labelcolor 7 resizable
|
||||
} {
|
||||
Fl_Group {} {
|
||||
label Source open
|
||||
xywh {10 35 500 415} labelsize 13 resizable
|
||||
xywh {10 35 500 415} labelsize 13 hide resizable
|
||||
} {
|
||||
Fl_Text_Editor sv_source {
|
||||
xywh {20 50 480 390} textfont 4 textsize 11 resizable
|
||||
xywh {10 40 500 410} textfont 4 textsize 11 resizable
|
||||
code0 {\#include "CodeEditor.h"}
|
||||
code1 {o->linenumber_width(60);}
|
||||
code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
|
||||
@ -295,7 +301,7 @@ Function {make_sourceview()} {open
|
||||
xywh {10 35 500 415} labelsize 13 hide
|
||||
} {
|
||||
Fl_Text_Editor sv_header {
|
||||
xywh {20 50 480 390} textfont 4 textsize 11 resizable
|
||||
xywh {10 40 500 410} textfont 4 textsize 11 resizable
|
||||
code0 {\#include "CodeEditor.h"}
|
||||
code1 {o->linenumber_width(60);}
|
||||
code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
|
||||
@ -307,7 +313,7 @@ Function {make_sourceview()} {open
|
||||
xywh {10 35 500 415} labelsize 13 hide
|
||||
} {
|
||||
Fl_Text_Display sv_strings {
|
||||
xywh {20 50 480 390} textfont 4 textsize 11 resizable
|
||||
xywh {10 40 500 410} textfont 4 textsize 11 resizable
|
||||
code1 {o->linenumber_width(60);}
|
||||
code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
|
||||
class TextViewer
|
||||
@ -315,10 +321,10 @@ Function {make_sourceview()} {open
|
||||
}
|
||||
Fl_Group {} {
|
||||
label Project open
|
||||
xywh {10 35 500 415} labelsize 13 hide
|
||||
xywh {10 35 500 415} labelsize 13
|
||||
} {
|
||||
Fl_Text_Display sv_project {
|
||||
xywh {20 50 480 390} textfont 4 textsize 11 resizable
|
||||
xywh {10 40 500 410} textfont 4 textsize 11 resizable
|
||||
code1 {o->linenumber_width(60);}
|
||||
code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
|
||||
class TextViewer
|
||||
@ -326,26 +332,68 @@ Function {make_sourceview()} {open
|
||||
}
|
||||
}
|
||||
Fl_Group {} {open
|
||||
xywh {10 460 500 22}
|
||||
xywh {10 460 500 20}
|
||||
} {
|
||||
Fl_Button {} {
|
||||
label aA
|
||||
xywh {244 460 25 20} labelsize 11
|
||||
}
|
||||
Fl_Button {} {
|
||||
label {<<}
|
||||
xywh {273 460 25 20} labelsize 11
|
||||
}
|
||||
Fl_Button {} {
|
||||
label {>>}
|
||||
xywh {298 460 25 20} labelsize 11
|
||||
}
|
||||
Fl_Button {} {
|
||||
label Reveal
|
||||
callback {if (sourceview_panel && sourceview_panel->visible()) {
|
||||
Fl_Type *node = NULL;
|
||||
if (sv_source->visible_r())
|
||||
node = Fl_Type::find_in_text(0, sv_source->insert_position());
|
||||
else if (sv_header->visible_r())
|
||||
node = Fl_Type::find_in_text(1, sv_header->insert_position());
|
||||
else if (sv_project->visible_r())
|
||||
node = Fl_Type::find_in_text(2, sv_project->insert_position());
|
||||
if (node) {
|
||||
select_only(node);
|
||||
reveal_in_browser(node);
|
||||
if (Fl::event_clicks()==1) // double click
|
||||
node->open();
|
||||
}
|
||||
}} selected
|
||||
xywh {327 460 61 20} labelsize 11
|
||||
}
|
||||
Fl_Input {} {
|
||||
label {Find:}
|
||||
xywh {40 460 200 20} labelsize 11 textsize 11
|
||||
}
|
||||
Fl_Box {} {
|
||||
xywh {490 460 20 20} resizable
|
||||
}
|
||||
}
|
||||
Fl_Group {} {open
|
||||
xywh {10 485 500 20}
|
||||
} {
|
||||
Fl_Button {} {
|
||||
label Refresh
|
||||
callback update_sourceview_cb
|
||||
xywh {10 460 61 20} labelsize 11
|
||||
xywh {10 485 61 20} labelsize 11
|
||||
}
|
||||
Fl_Light_Button sv_autorefresh {
|
||||
label {Auto-Refresh}
|
||||
xywh {77 460 91 20} labelsize 11
|
||||
xywh {77 485 91 20} labelsize 11
|
||||
code0 {o->callback((Fl_Callback*)update_sourceview_cb);}
|
||||
}
|
||||
Fl_Light_Button sv_autoposition {
|
||||
label {Auto-Position}
|
||||
xywh {172 460 89 20} labelsize 11
|
||||
xywh {172 485 89 20} labelsize 11
|
||||
}
|
||||
Fl_Choice sv_code_choice_w {
|
||||
callback {sv_code_choice = (int)o->mvalue()->argument();
|
||||
update_sourceview_position();} open
|
||||
xywh {265 460 70 20} down_box BORDER_BOX labelsize 11 textsize 11
|
||||
xywh {265 485 70 20} down_box BORDER_BOX labelsize 11 textsize 11
|
||||
} {
|
||||
MenuItem {} {
|
||||
label prolog
|
||||
@ -374,12 +422,12 @@ update_sourceview_position();} open
|
||||
}
|
||||
}
|
||||
Fl_Box {} {
|
||||
xywh {375 460 80 20} resizable
|
||||
xywh {375 485 80 20} resizable
|
||||
}
|
||||
Fl_Button {} {
|
||||
label Close
|
||||
callback toggle_sourceview_b_cb
|
||||
xywh {460 460 50 20} labelsize 11
|
||||
xywh {460 485 50 20} labelsize 11
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -38,12 +38,13 @@ extern CodeViewer *sv_header;
|
||||
extern TextViewer *sv_strings;
|
||||
extern TextViewer *sv_project;
|
||||
#include <FL/Fl_Button.H>
|
||||
#include <FL/Fl_Input.H>
|
||||
#include <FL/Fl_Box.H>
|
||||
#include <FL/Fl_Light_Button.H>
|
||||
extern Fl_Light_Button *sv_autorefresh;
|
||||
extern Fl_Light_Button *sv_autoposition;
|
||||
#include <FL/Fl_Choice.H>
|
||||
extern Fl_Choice *sv_code_choice_w;
|
||||
#include <FL/Fl_Box.H>
|
||||
extern void toggle_sourceview_b_cb(Fl_Button*, void*);
|
||||
Fl_Double_Window* make_sourceview();
|
||||
extern Fl_Menu_Item menu_sv_code_choice_w[];
|
||||
|
Loading…
Reference in New Issue
Block a user