Fluid Source Code preview panel with automatic refresh and selected object code highlighting.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4630 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
5cdf984737
commit
1a5288e8fe
@ -67,6 +67,7 @@ class CodeEditor : public Fl_Text_Editor {
|
|||||||
|
|
||||||
CodeEditor(int X, int Y, int W, int H, const char *L=0);
|
CodeEditor(int X, int Y, int W, int H, const char *L=0);
|
||||||
~CodeEditor();
|
~CodeEditor();
|
||||||
|
int top_line() { return get_absolute_top_line_number(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !CodeEditor_h
|
#endif // !CodeEditor_h
|
||||||
|
@ -436,6 +436,8 @@ Fl_Type::Fl_Type() {
|
|||||||
callback_ = 0;
|
callback_ = 0;
|
||||||
rtti = 0;
|
rtti = 0;
|
||||||
level = 0;
|
level = 0;
|
||||||
|
code_line = header_line = -1;
|
||||||
|
code_line_end = header_line_end = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fixvisible(Fl_Type *p) {
|
static void fixvisible(Fl_Type *p) {
|
||||||
|
@ -72,6 +72,9 @@ public: // things that should not be public:
|
|||||||
Fl_Type *factory;
|
Fl_Type *factory;
|
||||||
const char *callback_name();
|
const char *callback_name();
|
||||||
|
|
||||||
|
int code_line, header_line;
|
||||||
|
int code_line_end, header_line_end;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual ~Fl_Type();
|
virtual ~Fl_Type();
|
||||||
@ -737,6 +740,7 @@ void write_indent(int n);
|
|||||||
void write_open(int);
|
void write_open(int);
|
||||||
void write_close(int n);
|
void write_close(int n);
|
||||||
extern int write_number;
|
extern int write_number;
|
||||||
|
extern int write_sourceview;
|
||||||
void write_public(int state); // writes pubic:/private: as needed
|
void write_public(int state); // writes pubic:/private: as needed
|
||||||
extern int indentation;
|
extern int indentation;
|
||||||
extern const char* indent();
|
extern const char* indent();
|
||||||
|
@ -1710,6 +1710,7 @@ Fl_Type *Fl_Type::current;
|
|||||||
|
|
||||||
extern void redraw_overlays();
|
extern void redraw_overlays();
|
||||||
extern void redraw_browser();
|
extern void redraw_browser();
|
||||||
|
extern void update_sourceview_position();
|
||||||
|
|
||||||
// Called when ui changes what objects are selected:
|
// Called when ui changes what objects are selected:
|
||||||
// p is selected object, null for all deletions (we must throw away
|
// p is selected object, null for all deletions (we must throw away
|
||||||
@ -1742,6 +1743,8 @@ void selection_changed(Fl_Type *p) {
|
|||||||
redraw_overlays();
|
redraw_overlays();
|
||||||
// load the panel with the new settings:
|
// load the panel with the new settings:
|
||||||
load_panel();
|
load_panel();
|
||||||
|
// update the source viewer to show the code for the selected object
|
||||||
|
update_sourceview_position();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
@ -263,13 +263,21 @@ void write_h(const char* format,...) {
|
|||||||
|
|
||||||
#include <FL/filename.H>
|
#include <FL/filename.H>
|
||||||
int write_number;
|
int write_number;
|
||||||
|
int write_sourceview;
|
||||||
|
|
||||||
// recursively dump code, putting children between the two parts
|
// recursively dump code, putting children between the two parts
|
||||||
// of the parent code:
|
// of the parent code:
|
||||||
static Fl_Type* write_code(Fl_Type* p) {
|
static Fl_Type* write_code(Fl_Type* p) {
|
||||||
// don't write the last comment until the very end
|
if (write_sourceview) {
|
||||||
|
p->code_line = (int)ftell(code_file);
|
||||||
|
if (p->header_line_end==-1)
|
||||||
|
p->header_line = (int)ftell(header_file);
|
||||||
|
}
|
||||||
|
// write all code that come before the children code
|
||||||
|
// (but don't write the last comment until the very end)
|
||||||
if (!(p==Fl_Type::last && p->is_comment()))
|
if (!(p==Fl_Type::last && p->is_comment()))
|
||||||
p->write_code1();
|
p->write_code1();
|
||||||
|
// recursively write the code of all children
|
||||||
Fl_Type* q;
|
Fl_Type* q;
|
||||||
if (p->is_widget() && p->is_class()) {
|
if (p->is_widget() && p->is_class()) {
|
||||||
// Handle widget classes specially
|
// Handle widget classes specially
|
||||||
@ -283,6 +291,7 @@ static Fl_Type* write_code(Fl_Type* p) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// write all code that come after the children
|
||||||
p->write_code2();
|
p->write_code2();
|
||||||
|
|
||||||
for (q = p->next; q && q->level > p->level;) {
|
for (q = p->next; q && q->level > p->level;) {
|
||||||
@ -298,27 +307,35 @@ static Fl_Type* write_code(Fl_Type* p) {
|
|||||||
write_h("};\n");
|
write_h("};\n");
|
||||||
} else {
|
} else {
|
||||||
for (q = p->next; q && q->level > p->level;) q = write_code(q);
|
for (q = p->next; q && q->level > p->level;) q = write_code(q);
|
||||||
|
// write all code that come after the children
|
||||||
p->write_code2();
|
p->write_code2();
|
||||||
}
|
}
|
||||||
|
if (write_sourceview) {
|
||||||
|
p->code_line_end = (int)ftell(code_file);
|
||||||
|
if (p->header_line_end==-1)
|
||||||
|
p->header_line_end = (int)ftell(header_file);
|
||||||
|
}
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern const char* header_file_name;
|
extern const char* header_file_name;
|
||||||
|
|
||||||
int write_code(const char *s, const char *t) {
|
int write_code(const char *s, const char *t) {
|
||||||
|
const char *filemode = "w";
|
||||||
|
if (write_sourceview)
|
||||||
|
filemode = "wb";
|
||||||
write_number++;
|
write_number++;
|
||||||
delete id_root; id_root = 0;
|
delete id_root; id_root = 0;
|
||||||
indentation = 0;
|
indentation = 0;
|
||||||
if (!s) code_file = stdout;
|
if (!s) code_file = stdout;
|
||||||
else {
|
else {
|
||||||
FILE *f = fopen(s,"w");
|
FILE *f = fopen(s, filemode);
|
||||||
if (!f) return 0;
|
if (!f) return 0;
|
||||||
code_file = f;
|
code_file = f;
|
||||||
}
|
}
|
||||||
if (!t) header_file = stdout;
|
if (!t) header_file = stdout;
|
||||||
else {
|
else {
|
||||||
FILE *f = fopen(t,"w");
|
FILE *f = fopen(t, filemode);
|
||||||
if (!f) {fclose(code_file); return 0;}
|
if (!f) {fclose(code_file); return 0;}
|
||||||
header_file = f;
|
header_file = f;
|
||||||
}
|
}
|
||||||
@ -326,8 +343,16 @@ int write_code(const char *s, const char *t) {
|
|||||||
// a copyright notice. We print that before anything else in the file!
|
// a copyright notice. We print that before anything else in the file!
|
||||||
Fl_Type* first_type = Fl_Type::first;
|
Fl_Type* first_type = Fl_Type::first;
|
||||||
if (first_type && first_type->is_comment()) {
|
if (first_type && first_type->is_comment()) {
|
||||||
// this is ok, because comments have no children or code2 blocks
|
if (write_sourceview) {
|
||||||
|
first_type->code_line = (int)ftell(code_file);
|
||||||
|
first_type->header_line = (int)ftell(header_file);
|
||||||
|
}
|
||||||
|
// it is ok to write non-recusive code here, because comments have no children or code2 blocks
|
||||||
first_type->write_code1();
|
first_type->write_code1();
|
||||||
|
if (write_sourceview) {
|
||||||
|
first_type->code_line_end = (int)ftell(code_file);
|
||||||
|
first_type->header_line_end = (int)ftell(header_file);
|
||||||
|
}
|
||||||
first_type = first_type->next;
|
first_type = first_type->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,9 +398,20 @@ int write_code(const char *s, const char *t) {
|
|||||||
}
|
}
|
||||||
for (Fl_Type* p = first_type; p;) {
|
for (Fl_Type* p = first_type; p;) {
|
||||||
// write all static data for this & all children first
|
// write all static data for this & all children first
|
||||||
|
if (write_sourceview) p->header_line = (int)ftell(header_file);
|
||||||
p->write_static();
|
p->write_static();
|
||||||
for (Fl_Type* q = p->next; q && q->level > p->level; q = q->next)
|
if (write_sourceview) {
|
||||||
|
p->header_line_end = (int)ftell(header_file);
|
||||||
|
if (p->header_line==p->header_line_end) p->header_line_end = -1;
|
||||||
|
}
|
||||||
|
for (Fl_Type* q = p->next; q && q->level > p->level; q = q->next) {
|
||||||
|
if (write_sourceview) q->header_line = (int)ftell(header_file);
|
||||||
q->write_static();
|
q->write_static();
|
||||||
|
if (write_sourceview) {
|
||||||
|
q->header_line_end = (int)ftell(header_file);
|
||||||
|
if (q->header_line==q->header_line_end) q->header_line_end = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
// then write the nested code:
|
// then write the nested code:
|
||||||
p = write_code(p);
|
p = write_code(p);
|
||||||
}
|
}
|
||||||
@ -388,7 +424,15 @@ int write_code(const char *s, const char *t) {
|
|||||||
|
|
||||||
Fl_Type* last_type = Fl_Type::last;
|
Fl_Type* last_type = Fl_Type::last;
|
||||||
if (last_type && last_type->is_comment()) {
|
if (last_type && last_type->is_comment()) {
|
||||||
|
if (write_sourceview) {
|
||||||
|
last_type->code_line = (int)ftell(code_file);
|
||||||
|
last_type->header_line = (int)ftell(header_file);
|
||||||
|
}
|
||||||
last_type->write_code1();
|
last_type->write_code1();
|
||||||
|
if (write_sourceview) {
|
||||||
|
last_type->code_line_end = (int)ftell(code_file);
|
||||||
|
last_type->header_line_end = (int)ftell(header_file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int x = fclose(code_file);
|
int x = fclose(code_file);
|
||||||
|
150
fluid/fluid.cxx
150
fluid/fluid.cxx
@ -381,6 +381,14 @@ void exit_cb(Fl_Widget *,void *) {
|
|||||||
save_position(widgetbin_panel,"widgetbin_pos");
|
save_position(widgetbin_panel,"widgetbin_pos");
|
||||||
delete widgetbin_panel;
|
delete widgetbin_panel;
|
||||||
}
|
}
|
||||||
|
if (sourceview_panel) {
|
||||||
|
Fl_Preferences svp(fluid_prefs, "sourceview");
|
||||||
|
svp.set("autorefresh", sv_autorefresh->value());
|
||||||
|
svp.set("autoposition", sv_autoposition->value());
|
||||||
|
svp.set("tab", sv_tab->find(sv_tab->value()));
|
||||||
|
save_position(sourceview_panel,"sourceview_pos");
|
||||||
|
delete sourceview_panel;
|
||||||
|
}
|
||||||
if (about_panel)
|
if (about_panel)
|
||||||
delete about_panel;
|
delete about_panel;
|
||||||
if (help_dialog)
|
if (help_dialog)
|
||||||
@ -1550,6 +1558,7 @@ void print_cb(Fl_Return_Button *, void *) {
|
|||||||
extern Fl_Menu_Item New_Menu[];
|
extern Fl_Menu_Item New_Menu[];
|
||||||
|
|
||||||
void toggle_widgetbin_cb(Fl_Widget *, void *);
|
void toggle_widgetbin_cb(Fl_Widget *, void *);
|
||||||
|
void toggle_sourceview_cb(Fl_Double_Window *, void *);
|
||||||
|
|
||||||
Fl_Menu_Item Main_Menu[] = {
|
Fl_Menu_Item Main_Menu[] = {
|
||||||
{"&File",0,0,0,FL_SUBMENU},
|
{"&File",0,0,0,FL_SUBMENU},
|
||||||
@ -1596,7 +1605,9 @@ Fl_Menu_Item Main_Menu[] = {
|
|||||||
{"Ung&roup", FL_F+8, ungroup_cb,0, FL_MENU_DIVIDER},
|
{"Ung&roup", FL_F+8, ungroup_cb,0, FL_MENU_DIVIDER},
|
||||||
{"Hide O&verlays",FL_CTRL+FL_SHIFT+'o',toggle_overlays},
|
{"Hide O&verlays",FL_CTRL+FL_SHIFT+'o',toggle_overlays},
|
||||||
#define WIDGETBIN_ITEM 41
|
#define WIDGETBIN_ITEM 41
|
||||||
{"Show Widget &Bin...",FL_ALT+'b',toggle_widgetbin_cb, 0, FL_MENU_DIVIDER},
|
{"Show Widget &Bin...",FL_ALT+'b',toggle_widgetbin_cb},
|
||||||
|
#define SOURCEVIEW_ITEM 42
|
||||||
|
{"Show Source Code...",FL_ALT+FL_SHIFT+'s', (Fl_Callback*)toggle_sourceview_cb, 0, FL_MENU_DIVIDER},
|
||||||
{"Pro&ject Settings...",FL_ALT+'p',show_project_cb},
|
{"Pro&ject Settings...",FL_ALT+'p',show_project_cb},
|
||||||
{"GU&I Settings...",FL_ALT+FL_SHIFT+'p',show_settings_cb},
|
{"GU&I Settings...",FL_ALT+FL_SHIFT+'p',show_settings_cb},
|
||||||
{0},
|
{0},
|
||||||
@ -1688,6 +1699,37 @@ void toggle_widgetbin_cb(Fl_Widget *, void *) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void toggle_sourceview_cb(Fl_Double_Window *, void *) {
|
||||||
|
if (!sourceview_panel) {
|
||||||
|
make_sourceview();
|
||||||
|
sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb);
|
||||||
|
Fl_Preferences svp(fluid_prefs, "sourceview");
|
||||||
|
int autorefresh;
|
||||||
|
svp.get("autorefresh", autorefresh, 1);
|
||||||
|
sv_autorefresh->value(autorefresh);
|
||||||
|
int autoposition;
|
||||||
|
svp.get("autoposition", autoposition, 1);
|
||||||
|
sv_autoposition->value(autoposition);
|
||||||
|
int tab;
|
||||||
|
svp.get("tab", tab, 0);
|
||||||
|
if (tab>=0 && tab<sv_tab->children()) sv_tab->value(sv_tab->child(tab));
|
||||||
|
if (!position_window(sourceview_panel,"sourceview_pos", 0, 320, 120, 550, 500)) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sourceview_panel->visible()) {
|
||||||
|
sourceview_panel->hide();
|
||||||
|
Main_Menu[SOURCEVIEW_ITEM].label("Show Source Code...");
|
||||||
|
} else {
|
||||||
|
sourceview_panel->show();
|
||||||
|
Main_Menu[SOURCEVIEW_ITEM].label("Hide Source Code...");
|
||||||
|
update_sourceview_cb(0,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggle_sourceview_b_cb(Fl_Button*, void *) {
|
||||||
|
toggle_sourceview_cb(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
void make_main_window() {
|
void make_main_window() {
|
||||||
fluid_prefs.get("snap", snap, 1);
|
fluid_prefs.get("snap", snap, 1);
|
||||||
fluid_prefs.get("gridx", gridx, 5);
|
fluid_prefs.get("gridx", gridx, 5);
|
||||||
@ -1933,6 +1975,102 @@ void set_filename(const char *c) {
|
|||||||
set_modflag(modflag);
|
set_modflag(modflag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// The Source View system offers an immediate preview of the code
|
||||||
|
// files that will be generated by FLUID. It also marks the code
|
||||||
|
// generated for the last selected item in the header and the source
|
||||||
|
// file.
|
||||||
|
//
|
||||||
|
// Can we patent this? ;-) - Matt, mm@matthiasm.com
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update the header and source code highlighting depending on the
|
||||||
|
// currently selected object
|
||||||
|
//
|
||||||
|
void update_sourceview_position()
|
||||||
|
{
|
||||||
|
if (sv_autoposition->value()==0)
|
||||||
|
return;
|
||||||
|
if (sourceview_panel && sourceview_panel->visible() && Fl_Type::current) {
|
||||||
|
int pos0, pos1;
|
||||||
|
if (sv_source->visible_r()) {
|
||||||
|
pos0 = Fl_Type::current->code_line;
|
||||||
|
pos1 = Fl_Type::current->code_line_end;
|
||||||
|
if (pos0>=0) {
|
||||||
|
if (pos1<pos0)
|
||||||
|
pos1 = pos0;
|
||||||
|
sv_source->buffer()->highlight(pos0, pos1);
|
||||||
|
int line = sv_source->buffer()->count_lines(0, pos0);
|
||||||
|
sv_source->scroll(line, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sv_header->visible_r()) {
|
||||||
|
pos0 = Fl_Type::current->header_line;
|
||||||
|
pos1 = Fl_Type::current->header_line_end;
|
||||||
|
if (pos0>=0) {
|
||||||
|
if (pos1<pos0)
|
||||||
|
pos1 = pos0;
|
||||||
|
sv_header->buffer()->highlight(pos0, pos1);
|
||||||
|
int line = sv_header->buffer()->count_lines(0, pos0);
|
||||||
|
sv_header->scroll(line, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_sourceview_position_cb(Fl_Tabs*, void*)
|
||||||
|
{
|
||||||
|
update_sourceview_position();
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *sv_source_filename = 0;
|
||||||
|
static char *sv_header_filename = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Generate a header and source file in a temporary directory and
|
||||||
|
// load those into the Code Viewer widgets.
|
||||||
|
//
|
||||||
|
void update_sourceview_cb(Fl_Button*, void*)
|
||||||
|
{
|
||||||
|
// generate space for the source and header file filenames
|
||||||
|
if (!sv_source_filename) {
|
||||||
|
sv_source_filename = (char*)malloc(FL_PATH_MAX);
|
||||||
|
fluid_prefs.getUserdataPath(sv_source_filename, FL_PATH_MAX);
|
||||||
|
strlcat(sv_source_filename, "source_view_tmp.cxx", FL_PATH_MAX);
|
||||||
|
}
|
||||||
|
if (!sv_header_filename) {
|
||||||
|
sv_header_filename = (char*)malloc(FL_PATH_MAX);
|
||||||
|
fluid_prefs.getUserdataPath(sv_header_filename, FL_PATH_MAX);
|
||||||
|
strlcat(sv_header_filename, "source_view_tmp.h", FL_PATH_MAX);
|
||||||
|
}
|
||||||
|
// generate the code and load the files
|
||||||
|
if (sourceview_panel && sourceview_panel->visible())
|
||||||
|
{
|
||||||
|
write_sourceview = 1;
|
||||||
|
// generate files
|
||||||
|
if (write_code(sv_source_filename, sv_header_filename))
|
||||||
|
{
|
||||||
|
// load file into source editor
|
||||||
|
int pos = sv_source->top_line();
|
||||||
|
sv_source->buffer()->loadfile(sv_source_filename);
|
||||||
|
sv_source->scroll(pos, 0);
|
||||||
|
// load file into header editor
|
||||||
|
pos = sv_header->top_line();
|
||||||
|
sv_header->buffer()->loadfile(sv_header_filename);
|
||||||
|
sv_header->scroll(pos, 0);
|
||||||
|
// update the source code highlighting
|
||||||
|
update_sourceview_position();
|
||||||
|
}
|
||||||
|
write_sourceview = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_sourceview_timer(void*)
|
||||||
|
{
|
||||||
|
update_sourceview_cb(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
// Set the "modified" flag and update the title of the main window...
|
// Set the "modified" flag and update the title of the main window...
|
||||||
void set_modflag(int mf) {
|
void set_modflag(int mf) {
|
||||||
const char *basename;
|
const char *basename;
|
||||||
@ -1953,6 +2091,15 @@ void set_modflag(int mf) {
|
|||||||
main_window->label(title);
|
main_window->label(title);
|
||||||
} else main_window->label(basename);
|
} else main_window->label(basename);
|
||||||
}
|
}
|
||||||
|
// if the UI was modified in any way, update the Source View panel
|
||||||
|
if (sourceview_panel && sourceview_panel->visible() && sv_autorefresh->value())
|
||||||
|
{
|
||||||
|
// we will only update ealiest 0.5 seconds after the last change, and only
|
||||||
|
// if no other change was made, so dragging a widget will not generate any
|
||||||
|
// CPU load
|
||||||
|
Fl::remove_timeout(update_sourceview_timer, 0);
|
||||||
|
Fl::add_timeout(0.5, update_sourceview_timer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
// Enable/disable the Save menu item...
|
// Enable/disable the Save menu item...
|
||||||
if (modflag) Main_Menu[SAVE_ITEM].activate();
|
if (modflag) Main_Menu[SAVE_ITEM].activate();
|
||||||
@ -2030,6 +2177,7 @@ int main(int argc,char **argv) {
|
|||||||
position_window(main_window,"main_window_pos", 1, 10, 30, WINWIDTH, WINHEIGHT );
|
position_window(main_window,"main_window_pos", 1, 10, 30, WINWIDTH, WINHEIGHT );
|
||||||
main_window->show(argc,argv);
|
main_window->show(argc,argv);
|
||||||
toggle_widgetbin_cb(0,0);
|
toggle_widgetbin_cb(0,0);
|
||||||
|
toggle_sourceview_cb(0,0);
|
||||||
if (!c && openlast_button->value() && absolute_history[0][0]) {
|
if (!c && openlast_button->value() && absolute_history[0][0]) {
|
||||||
// Open previous file when no file specified...
|
// Open previous file when no file specified...
|
||||||
open_history_cb(0, absolute_history[0]);
|
open_history_cb(0, absolute_history[0]);
|
||||||
|
@ -839,6 +839,93 @@ Fl_Window* make_widgetbin() {
|
|||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Fl_Double_Window *sourceview_panel=(Fl_Double_Window *)0;
|
||||||
|
|
||||||
|
Fl_Tabs *sv_tab=(Fl_Tabs *)0;
|
||||||
|
|
||||||
|
CodeEditor *sv_source=(CodeEditor *)0;
|
||||||
|
|
||||||
|
CodeEditor *sv_header=(CodeEditor *)0;
|
||||||
|
|
||||||
|
Fl_Light_Button *sv_autorefresh=(Fl_Light_Button *)0;
|
||||||
|
|
||||||
|
Fl_Light_Button *sv_autoposition=(Fl_Light_Button *)0;
|
||||||
|
|
||||||
|
Fl_Double_Window* make_sourceview() {
|
||||||
|
Fl_Double_Window* w;
|
||||||
|
{ Fl_Double_Window* o = sourceview_panel = new Fl_Double_Window(544, 500, "Code View");
|
||||||
|
w = o;
|
||||||
|
o->callback((Fl_Callback*)toggle_sourceview_cb);
|
||||||
|
{ Fl_Tabs* o = sv_tab = new Fl_Tabs(20, 10, 500, 440);
|
||||||
|
o->callback((Fl_Callback*)update_sourceview_position_cb);
|
||||||
|
{ Fl_Group* o = new Fl_Group(20, 35, 500, 415, "Source");
|
||||||
|
o->labelsize(13);
|
||||||
|
{ CodeEditor* o = sv_source = new CodeEditor(25, 40, 490, 405);
|
||||||
|
o->box(FL_DOWN_FRAME);
|
||||||
|
o->color(FL_BACKGROUND2_COLOR);
|
||||||
|
o->selection_color(FL_SELECTION_COLOR);
|
||||||
|
o->labeltype(FL_NORMAL_LABEL);
|
||||||
|
o->labelfont(0);
|
||||||
|
o->labelsize(14);
|
||||||
|
o->labelcolor(FL_FOREGROUND_COLOR);
|
||||||
|
o->textfont(4);
|
||||||
|
o->textsize(11);
|
||||||
|
o->align(FL_ALIGN_TOP);
|
||||||
|
o->when(FL_WHEN_RELEASE);
|
||||||
|
Fl_Group::current()->resizable(o);
|
||||||
|
}
|
||||||
|
o->end();
|
||||||
|
Fl_Group::current()->resizable(o);
|
||||||
|
}
|
||||||
|
{ Fl_Group* o = new Fl_Group(20, 35, 500, 415, "Header");
|
||||||
|
o->labelsize(13);
|
||||||
|
o->hide();
|
||||||
|
{ CodeEditor* o = sv_header = new CodeEditor(25, 40, 490, 405);
|
||||||
|
o->box(FL_DOWN_FRAME);
|
||||||
|
o->color(FL_BACKGROUND2_COLOR);
|
||||||
|
o->selection_color(FL_SELECTION_COLOR);
|
||||||
|
o->labeltype(FL_NORMAL_LABEL);
|
||||||
|
o->labelfont(0);
|
||||||
|
o->labelsize(14);
|
||||||
|
o->labelcolor(FL_FOREGROUND_COLOR);
|
||||||
|
o->textfont(4);
|
||||||
|
o->textsize(11);
|
||||||
|
o->align(FL_ALIGN_TOP);
|
||||||
|
o->when(FL_WHEN_RELEASE);
|
||||||
|
Fl_Group::current()->resizable(o);
|
||||||
|
}
|
||||||
|
o->end();
|
||||||
|
}
|
||||||
|
o->end();
|
||||||
|
Fl_Group::current()->resizable(o);
|
||||||
|
}
|
||||||
|
{ Fl_Group* o = new Fl_Group(20, 460, 500, 25);
|
||||||
|
{ Fl_Button* o = new Fl_Button(20, 460, 80, 25, "refresh");
|
||||||
|
o->labelsize(11);
|
||||||
|
o->callback((Fl_Callback*)update_sourceview_cb);
|
||||||
|
}
|
||||||
|
{ Fl_Light_Button* o = sv_autorefresh = new Fl_Light_Button(105, 460, 80, 25, "autorefresh");
|
||||||
|
o->labelsize(11);
|
||||||
|
o->callback((Fl_Callback*)update_sourceview_cb);
|
||||||
|
}
|
||||||
|
{ Fl_Light_Button* o = sv_autoposition = new Fl_Light_Button(190, 460, 80, 25, "autoposition");
|
||||||
|
o->labelsize(11);
|
||||||
|
}
|
||||||
|
{ Fl_Button* o = new Fl_Button(440, 460, 80, 25, "close");
|
||||||
|
o->labelsize(11);
|
||||||
|
o->callback((Fl_Callback*)toggle_sourceview_b_cb);
|
||||||
|
}
|
||||||
|
{ Fl_Box* o = new Fl_Box(275, 460, 160, 25);
|
||||||
|
Fl_Group::current()->resizable(o);
|
||||||
|
}
|
||||||
|
o->end();
|
||||||
|
}
|
||||||
|
o->size_range(384, 120);
|
||||||
|
o->end();
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// End of "$Id$".
|
// End of "$Id$".
|
||||||
//
|
//
|
||||||
|
@ -28,7 +28,7 @@ comment {//
|
|||||||
//
|
//
|
||||||
// http://www.fltk.org/str.php
|
// http://www.fltk.org/str.php
|
||||||
//
|
//
|
||||||
} {selected in_source in_header
|
} {in_source in_header
|
||||||
}
|
}
|
||||||
|
|
||||||
decl {\#include <FL/Fl_Pixmap.H>} {}
|
decl {\#include <FL/Fl_Pixmap.H>} {}
|
||||||
@ -353,9 +353,9 @@ Function {make_widgetbin()} {open
|
|||||||
} {
|
} {
|
||||||
Fl_Window widgetbin_panel {
|
Fl_Window widgetbin_panel {
|
||||||
label {Widget Bin}
|
label {Widget Bin}
|
||||||
xywh {413 185 520 85} type Single hide non_modal
|
xywh {413 185 520 85} type Single non_modal visible
|
||||||
} {
|
} {
|
||||||
Fl_Group {} {open
|
Fl_Group {} {
|
||||||
xywh {3 3 79 79} box THIN_DOWN_BOX
|
xywh {3 3 79 79} box THIN_DOWN_BOX
|
||||||
} {
|
} {
|
||||||
Fl_Button {} {
|
Fl_Button {} {
|
||||||
@ -684,6 +684,67 @@ Function {make_widgetbin()} {open
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Function {make_sourceview()} {open
|
||||||
|
} {
|
||||||
|
Fl_Window sourceview_panel {
|
||||||
|
label {Code View}
|
||||||
|
callback toggle_sourceview_cb open
|
||||||
|
xywh {388 212 544 500} type Double resizable size_range {384 120 0 0} visible
|
||||||
|
} {
|
||||||
|
Fl_Tabs sv_tab {
|
||||||
|
callback update_sourceview_position_cb open
|
||||||
|
xywh {20 10 500 440} resizable
|
||||||
|
} {
|
||||||
|
Fl_Group {} {
|
||||||
|
label Source open
|
||||||
|
xywh {20 35 500 415} labelsize 13 resizable
|
||||||
|
} {
|
||||||
|
Fl_Text_Editor sv_source {
|
||||||
|
xywh {25 40 490 405} textfont 4 textsize 11 resizable
|
||||||
|
code0 {\#include "CodeEditor.h"}
|
||||||
|
class CodeEditor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Fl_Group {} {
|
||||||
|
label Header open
|
||||||
|
xywh {20 35 500 415} labelsize 13 hide
|
||||||
|
} {
|
||||||
|
Fl_Text_Editor sv_header {
|
||||||
|
xywh {25 40 490 405} textfont 4 textsize 11 resizable
|
||||||
|
code0 {\#include "CodeEditor.h"}
|
||||||
|
class CodeEditor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Fl_Group {} {open
|
||||||
|
xywh {20 460 500 25}
|
||||||
|
} {
|
||||||
|
Fl_Button {} {
|
||||||
|
label refresh
|
||||||
|
callback update_sourceview_cb
|
||||||
|
xywh {20 460 80 25} labelsize 11
|
||||||
|
}
|
||||||
|
Fl_Light_Button sv_autorefresh {
|
||||||
|
label autorefresh
|
||||||
|
xywh {105 460 80 25} labelsize 11
|
||||||
|
code0 {o->callback((Fl_Callback*)update_sourceview_cb);}
|
||||||
|
}
|
||||||
|
Fl_Light_Button sv_autoposition {
|
||||||
|
label autoposition
|
||||||
|
xywh {190 460 80 25} labelsize 11
|
||||||
|
}
|
||||||
|
Fl_Button {} {
|
||||||
|
label close
|
||||||
|
callback toggle_sourceview_b_cb selected
|
||||||
|
xywh {440 460 80 25} labelsize 11
|
||||||
|
}
|
||||||
|
Fl_Box {} {
|
||||||
|
xywh {275 460 160 25} resizable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
comment {
|
comment {
|
||||||
//
|
//
|
||||||
// End of "$Id$".
|
// End of "$Id$".
|
||||||
|
@ -92,6 +92,18 @@ void type_make_cb(Fl_Widget*w,void*d);
|
|||||||
extern Fl_Window *widgetbin_panel;
|
extern Fl_Window *widgetbin_panel;
|
||||||
extern void type_make_cb(Fl_Button*, void*);
|
extern void type_make_cb(Fl_Button*, void*);
|
||||||
Fl_Window* make_widgetbin();
|
Fl_Window* make_widgetbin();
|
||||||
|
extern void toggle_sourceview_cb(Fl_Double_Window*, void*);
|
||||||
|
extern Fl_Double_Window *sourceview_panel;
|
||||||
|
#include <FL/Fl_Tabs.H>
|
||||||
|
extern void update_sourceview_position_cb(Fl_Tabs*, void*);
|
||||||
|
extern Fl_Tabs *sv_tab;
|
||||||
|
extern CodeEditor *sv_source;
|
||||||
|
extern CodeEditor *sv_header;
|
||||||
|
extern void update_sourceview_cb(Fl_Button*, void*);
|
||||||
|
extern Fl_Light_Button *sv_autorefresh;
|
||||||
|
extern Fl_Light_Button *sv_autoposition;
|
||||||
|
extern void toggle_sourceview_b_cb(Fl_Button*, void*);
|
||||||
|
Fl_Double_Window* make_sourceview();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user