Author: matt Date: 2012-04-22 06:09:19 -0700 (Sun, 22 Apr 2012) New Revision: 9376 Log: Restored Workspace support in FLTK 3 Fluid.
Modified: branches/branch-3.0/fluid/CodeEditor.cxx branches/branch-3.0/fluid/CodeEditor.h branches/branch-3.0/fluid/Fl_Type.cxx branches/branch-3.0/src/fltk3/arg.cxx Modified: branches/branch-3.0/fluid/CodeEditor.cxx =================================================================== --- branches/branch-3.0/fluid/CodeEditor.cxx 2012-04-22 03:09:31 UTC (rev 9375) +++ branches/branch-3.0/fluid/CodeEditor.cxx 2012-04-22 13:09:19 UTC (rev 9376) @@ -3,7 +3,7 @@ // // Code editor widget for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2010 by Bill Spitzak and others. +// Copyright 1998-2012 by Bill Spitzak and others. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -370,7 +370,8 @@ // Create a CodeEditor widget... CodeEditor::CodeEditor(int X, int Y, int W, int H, const char *L) : - fltk3::TextEditor(X, Y, W, H, L) { + fltk3::TextEditor(X, Y, W, H, L) +{ buffer(new fltk3::TextBuffer); char *style = new char[mBuffer->length() + 1]; Modified: branches/branch-3.0/fluid/CodeEditor.h =================================================================== --- branches/branch-3.0/fluid/CodeEditor.h 2012-04-22 03:09:31 UTC (rev 9375) +++ branches/branch-3.0/fluid/CodeEditor.h 2012-04-22 13:09:19 UTC (rev 9376) @@ -3,7 +3,7 @@ // // Code editor widget for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2010 by Bill Spitzak and others. +// Copyright 1998-2012 by Bill Spitzak and others. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -37,7 +37,6 @@ # include <string.h> # include <ctype.h> # include <fltk3/run.h> -# include <fltk3/TextBuffer.h> # include <fltk3/TextEditor.h> Modified: branches/branch-3.0/fluid/Fl_Type.cxx =================================================================== --- branches/branch-3.0/fluid/Fl_Type.cxx 2012-04-22 03:09:31 UTC (rev 9375) +++ branches/branch-3.0/fluid/Fl_Type.cxx 2012-04-22 13:09:19 UTC (rev 9376) @@ -17,35 +17,47 @@ // // 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: +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. // -// http://www.fltk.org/COPYING.php +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. // +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // -#include <FL/Fl.H> -#include <FL/Fl_Browser_.H> -#include <FL/fl_draw.H> +#include <fltk3/run.h> +#include <fltk3/ask.h> +#include <fltk3/Browser_.h> +#include <fltk3/draw.h> +#include <fltk3/filename.h> #include <stdlib.h> #include "../src/fltk3/flstring.h" #include <stdio.h> #include "Fl_Type.h" +#include "workspace_panel.h" #include "undo.h" -#include <FL/Fl_Pixmap.H> +#include <fltk3/Pixmap.h> #include "pixmaps/lock.xpm" #include "pixmaps/protected.xpm" //#include "pixmaps/unlock.xpm" -static Fl_Pixmap lock_pixmap(lock_xpm); -static Fl_Pixmap protected_pixmap(protected_xpm); -//static Fl_Pixmap unlock_pixmap(unlock_xpm); +static fltk3::Pixmap lock_pixmap(lock_xpm); +static fltk3::Pixmap protected_pixmap(protected_xpm); +//static fltk3::Pixmap unlock_pixmap(unlock_xpm); #include "pixmaps/flWindow.xpm" #include "pixmaps/flButton.xpm" @@ -98,60 +110,84 @@ #include "pixmaps/flWidgetClass.xpm" #include "pixmaps/flTree.xpm" #include "pixmaps/flTable.xpm" +#include "pixmaps/flAppTarget.xpm" +#include "pixmaps/flLibTarget.xpm" +#include "pixmaps/flFile.xpm" +#include "pixmaps/flFolder.xpm" +#include "pixmaps/flFluidFile.xpm" +#include "pixmaps/flCodeFile.xpm" +#include "pixmaps/flMenuNone.xpm" +#include "pixmaps/flMenuMulti.xpm" +#include "pixmaps/flMenuAll.xpm" +#include "pixmaps/flWorkspace.xpm" +#include "pixmaps/flDependency.xpm" +#include "pixmaps/flOption.xpm" -static Fl_Pixmap window_pixmap(flWindow_xpm); -static Fl_Pixmap button_pixmap(flButton_xpm); -static Fl_Pixmap checkbutton_pixmap(flCheckButton_xpm); -static Fl_Pixmap roundbutton_pixmap(flRoundButton_xpm); -static Fl_Pixmap box_pixmap(flBox_xpm); -static Fl_Pixmap group_pixmap(flGroup_xpm); -static Fl_Pixmap function_pixmap(flFunction_xpm); -static Fl_Pixmap code_pixmap(flCode_xpm); -static Fl_Pixmap codeblock_pixmap(flCodeBlock_xpm); -static Fl_Pixmap comment_pixmap(flComment_xpm); -static Fl_Pixmap declaration_pixmap(flDeclaration_xpm); -static Fl_Pixmap declarationblock_pixmap(flDeclarationBlock_xpm); -static Fl_Pixmap class_pixmap(flClass_xpm); -static Fl_Pixmap tabs_pixmap(flTabs_xpm); -static Fl_Pixmap input_pixmap(flInput_xpm); -static Fl_Pixmap choice_pixmap(flChoice_xpm); -static Fl_Pixmap menuitem_pixmap(flMenuitem_xpm); -static Fl_Pixmap menubar_pixmap(flMenubar_xpm); -static Fl_Pixmap submenu_pixmap(flSubmenu_xpm); -static Fl_Pixmap scroll_pixmap(flScroll_xpm); -static Fl_Pixmap tile_pixmap(flTile_xpm); -static Fl_Pixmap wizard_pixmap(flWizard_xpm); -static Fl_Pixmap pack_pixmap(flPack_xpm); -static Fl_Pixmap returnbutton_pixmap(flReturnButton_xpm); -static Fl_Pixmap lightbutton_pixmap(flLightButton_xpm); -static Fl_Pixmap repeatbutton_pixmap(flRepeatButton_xpm); -static Fl_Pixmap menubutton_pixmap(flMenuButton_xpm); -static Fl_Pixmap output_pixmap(flOutput_xpm); -static Fl_Pixmap textdisplay_pixmap(flTextDisplay_xpm); -static Fl_Pixmap textedit_pixmap(flTextEdit_xpm); -static Fl_Pixmap fileinput_pixmap(flFileInput_xpm); -static Fl_Pixmap browser_pixmap(flBrowser_xpm); -static Fl_Pixmap checkbrowser_pixmap(flCheckBrowser_xpm); -static Fl_Pixmap filebrowser_pixmap(flFileBrowser_xpm); -static Fl_Pixmap clock_pixmap(flClock_xpm); -static Fl_Pixmap help_pixmap(flHelp_xpm); -static Fl_Pixmap progress_pixmap(flProgress_xpm); -static Fl_Pixmap slider_pixmap(flSlider_xpm); -static Fl_Pixmap scrollbar_pixmap(flScrollBar_xpm); -static Fl_Pixmap valueslider_pixmap(flValueSlider_xpm); -static Fl_Pixmap adjuster_pixmap(flAdjuster_xpm); -static Fl_Pixmap counter_pixmap(flCounter_xpm); -static Fl_Pixmap dial_pixmap(flDial_xpm); -static Fl_Pixmap roller_pixmap(flRoller_xpm); -static Fl_Pixmap valueinput_pixmap(flValueInput_xpm); -static Fl_Pixmap valueoutput_pixmap(flValueOutput_xpm); -static Fl_Pixmap spinner_pixmap(flSpinner_xpm); -static Fl_Pixmap widgetclass_pixmap(flWidgetClass_xpm); -static Fl_Pixmap data_pixmap(flData_xpm); -static Fl_Pixmap tree_pixmap(flTree_xpm); -static Fl_Pixmap table_pixmap(flTable_xpm); +static fltk3::Pixmap window_pixmap(flWindow_xpm); +static fltk3::Pixmap button_pixmap(flButton_xpm); +static fltk3::Pixmap checkbutton_pixmap(flCheckButton_xpm); +static fltk3::Pixmap roundbutton_pixmap(flRoundButton_xpm); +static fltk3::Pixmap box_pixmap(flBox_xpm); +static fltk3::Pixmap group_pixmap(flGroup_xpm); +static fltk3::Pixmap function_pixmap(flFunction_xpm); +static fltk3::Pixmap code_pixmap(flCode_xpm); +static fltk3::Pixmap codeblock_pixmap(flCodeBlock_xpm); +static fltk3::Pixmap comment_pixmap(flComment_xpm); +static fltk3::Pixmap declaration_pixmap(flDeclaration_xpm); +static fltk3::Pixmap declarationblock_pixmap(flDeclarationBlock_xpm); +static fltk3::Pixmap class_pixmap(flClass_xpm); +static fltk3::Pixmap tabs_pixmap(flTabs_xpm); +static fltk3::Pixmap input_pixmap(flInput_xpm); +static fltk3::Pixmap choice_pixmap(flChoice_xpm); +static fltk3::Pixmap menuitem_pixmap(flMenuitem_xpm); +static fltk3::Pixmap menubar_pixmap(flMenubar_xpm); +static fltk3::Pixmap submenu_pixmap(flSubmenu_xpm); +static fltk3::Pixmap scroll_pixmap(flScroll_xpm); +static fltk3::Pixmap tile_pixmap(flTile_xpm); +static fltk3::Pixmap wizard_pixmap(flWizard_xpm); +static fltk3::Pixmap pack_pixmap(flPack_xpm); +static fltk3::Pixmap returnbutton_pixmap(flReturnButton_xpm); +static fltk3::Pixmap lightbutton_pixmap(flLightButton_xpm); +static fltk3::Pixmap repeatbutton_pixmap(flRepeatButton_xpm); +static fltk3::Pixmap menubutton_pixmap(flMenuButton_xpm); +static fltk3::Pixmap output_pixmap(flOutput_xpm); +static fltk3::Pixmap textdisplay_pixmap(flTextDisplay_xpm); +static fltk3::Pixmap textedit_pixmap(flTextEdit_xpm); +static fltk3::Pixmap fileinput_pixmap(flFileInput_xpm); +static fltk3::Pixmap browser_pixmap(flBrowser_xpm); +static fltk3::Pixmap checkbrowser_pixmap(flCheckBrowser_xpm); +static fltk3::Pixmap filebrowser_pixmap(flFileBrowser_xpm); +static fltk3::Pixmap clock_pixmap(flClock_xpm); +static fltk3::Pixmap help_pixmap(flHelp_xpm); +static fltk3::Pixmap progress_pixmap(flProgress_xpm); +static fltk3::Pixmap slider_pixmap(flSlider_xpm); +static fltk3::Pixmap scrollbar_pixmap(flScrollBar_xpm); +static fltk3::Pixmap valueslider_pixmap(flValueSlider_xpm); +static fltk3::Pixmap adjuster_pixmap(flAdjuster_xpm); +static fltk3::Pixmap counter_pixmap(flCounter_xpm); +static fltk3::Pixmap dial_pixmap(flDial_xpm); +static fltk3::Pixmap roller_pixmap(flRoller_xpm); +static fltk3::Pixmap valueinput_pixmap(flValueInput_xpm); +static fltk3::Pixmap valueoutput_pixmap(flValueOutput_xpm); +static fltk3::Pixmap spinner_pixmap(flSpinner_xpm); +static fltk3::Pixmap widgetclass_pixmap(flWidgetClass_xpm); +static fltk3::Pixmap data_pixmap(flData_xpm); +static fltk3::Pixmap tree_pixmap(flTree_xpm); +static fltk3::Pixmap table_pixmap(flTable_xpm); +static fltk3::Pixmap app_target_pixmap(flAppTarget_xpm); +static fltk3::Pixmap lib_target_pixmap(flLibTarget_xpm); +static fltk3::Pixmap file_pixmap(flFile_xpm); +static fltk3::Pixmap folder_pixmap(flFolder_xpm); +static fltk3::Pixmap fluid_file_pixmap(flFluidFile_xpm); +static fltk3::Pixmap code_file_pixmap(flCodeFile_xpm); +static fltk3::Pixmap workspace_pixmap(flWorkspace_xpm); +static fltk3::Pixmap dependency_pixmap(flDependency_xpm); +static fltk3::Pixmap option_pixmap(flOption_xpm); +fltk3::Pixmap menu_none_pixmap(flMenuNone_xpm); +fltk3::Pixmap menu_multi_pixmap(flMenuMulti_xpm); +fltk3::Pixmap menu_all_pixmap(flMenuAll_xpm); -Fl_Pixmap *pixmap[] = { 0, &window_pixmap, &button_pixmap, &checkbutton_pixmap, &roundbutton_pixmap, /* 0..4 */ +fltk3::Pixmap *pixmap[] = { 0, &window_pixmap, &button_pixmap, &checkbutton_pixmap, &roundbutton_pixmap, /* 0..4 */ &box_pixmap, &group_pixmap, &function_pixmap, &code_pixmap, &codeblock_pixmap, &declaration_pixmap, /* 5..10 */ &declarationblock_pixmap, &class_pixmap, &tabs_pixmap, &input_pixmap, &choice_pixmap, /* 11..15 */ &menuitem_pixmap, &menubar_pixmap, &submenu_pixmap, &scroll_pixmap, &tile_pixmap, &wizard_pixmap, /* 16..21 */ @@ -160,16 +196,20 @@ &checkbrowser_pixmap, &filebrowser_pixmap, &clock_pixmap, &help_pixmap, &progress_pixmap, /* 33..36 */ &slider_pixmap, &scrollbar_pixmap, &valueslider_pixmap, &adjuster_pixmap, &counter_pixmap, /* 37..41 */ &dial_pixmap, &roller_pixmap, &valueinput_pixmap, &valueoutput_pixmap, &comment_pixmap, /* 42..46 */ - &spinner_pixmap, &widgetclass_pixmap, &data_pixmap, &tree_pixmap, &table_pixmap }; /* 47..51 */ + &spinner_pixmap, &widgetclass_pixmap, &data_pixmap, &tree_pixmap, &table_pixmap, /* 47..51 */ + &app_target_pixmap, &file_pixmap, &folder_pixmap, &fluid_file_pixmap, &code_file_pixmap, /* 52..56 */ + &lib_target_pixmap, &workspace_pixmap, &dependency_pixmap, &option_pixmap}; /* 57..60 */ extern int show_comments; +extern Fl_Panel *the_file_panel; +extern char *get_temporary_return_buffer(int size); //////////////////////////////////////////////////////////////// -class Widget_Browser : public Fl_Browser_ { +class Widget_Browser : public fltk3::Browser_ { friend class Fl_Type; - // required routines for Fl_Browser_ subclass: + // required routines for fltk3::Browser_ subclass: void *item_first() const ; void *item_next(void *) const ; void *item_prev(void *) const ; @@ -188,7 +228,7 @@ }; static Widget_Browser *widget_browser; -Fl_Widget *make_widget_browser(int x,int y,int w,int h) { +fltk3::Widget *make_widget_browser(int x,int y,int w,int h) { return (widget_browser = new Widget_Browser(x,y,w,h)); } @@ -209,15 +249,15 @@ Fl_Type *Fl_Type::first; Fl_Type *Fl_Type::last; -static void Widget_Browser_callback(Fl_Widget *o,void *) { +static void Widget_Browser_callback(fltk3::Widget *o,void *) { ((Widget_Browser *)o)->callback(); } Widget_Browser::Widget_Browser(int X,int Y,int W,int H,const char*l) -: Fl_Browser_(X,Y,W,H,l) { - type(FL_MULTI_BROWSER); - Fl_Widget::callback(Widget_Browser_callback); - when(FL_WHEN_RELEASE); +: fltk3::Browser_(X,Y,W,H,l) { + type(fltk3::MULTI_BROWSER); + Widget::callback(Widget_Browser_callback); + when(fltk3::WHEN_RELEASE); } void *Widget_Browser::item_first() const {return Fl_Type::first;} @@ -249,7 +289,9 @@ // Generate a descriptive text for this item, to put in browser & window titles const char* Fl_Type::title() { - const char* c = name(); if (c) return c; + const char* c = name(); + if (c) + return c; return type_name(); } @@ -269,63 +311,65 @@ } *d = 0; comment_incr = textsize()-1; - if (l->new_selected) fl_color(fl_contrast(FL_DARK_GREEN,FL_SELECTION_COLOR)); - else fl_color(fl_contrast(FL_DARK_GREEN,color())); - fl_font(textfont()+FL_ITALIC, textsize()-2); - fl_draw(buf, (l->is_parent())?X+12:X, Y+12); + if (l->new_selected) fltk3::color(fltk3::contrast(fltk3::DARK_GREEN,fltk3::SELECTION_COLOR)); + else fltk3::color(fltk3::contrast(fltk3::DARK_GREEN,color())); + fltk3::font(textfont()+fltk3::ITALIC, textsize()-2); + fltk3::draw(buf, X+12, Y+12); Y += comment_incr/2; comment_incr -= comment_incr/2; } - if (l->new_selected) fl_color(fl_contrast(FL_FOREGROUND_COLOR,FL_SELECTION_COLOR)); - else fl_color(FL_FOREGROUND_COLOR); - Fl_Pixmap *pm = pixmap[l->pixmapID()]; - if (pm) pm->draw(X-18, Y); + if (l->new_selected) fltk3::color(fltk3::contrast(fltk3::FOREGROUND_COLOR,fltk3::SELECTION_COLOR)); + else fltk3::color(fltk3::FOREGROUND_COLOR); + fltk3::Pixmap *pm = pixmap[l->pixmapID()]; + if (pm) pm->draw(X-18+11, Y); switch (l->is_public()) { - case 0: lock_pixmap.draw(X - 17, Y); break; - case 2: protected_pixmap.draw(X - 17, Y); break; + case 0: lock_pixmap.draw(X-17+11, Y); break; + case 2: protected_pixmap.draw(X-17+11, Y); break; } + X -= 18; if (l->is_parent()) { if (!l->next || l->next->level <= l->level) { if (l->open_!=(l==pushedtitle)) { - fl_loop(X,Y+7,X+5,Y+12,X+10,Y+7); + fltk3::loop(X,Y+7,X+5,Y+12,X+10,Y+7); } else { - fl_loop(X+2,Y+2,X+7,Y+7,X+2,Y+12); + fltk3::loop(X+2,Y+2,X+7,Y+7,X+2,Y+12); } } else { if (l->open_!=(l==pushedtitle)) { - fl_polygon(X,Y+7,X+5,Y+12,X+10,Y+7); + fltk3::polygon(X,Y+7,X+5,Y+12,X+10,Y+7); } else { - fl_polygon(X+2,Y+2,X+7,Y+7,X+2,Y+12); + fltk3::polygon(X+2,Y+2,X+7,Y+7,X+2,Y+12); } } - X += 10; } + X += 10; + X += 18; Y += comment_incr; if (l->is_widget() || l->is_class()) { const char* c = subclassname(l); - if (!strncmp(c,"Fl_",3)) c += 3; - fl_font(textfont(), textsize()); - fl_draw(c, X, Y+13); - X += int(fl_width(c)+fl_width('n')); + if (!strncmp(c,"fltk3::",7)) c += 7; + fltk3::font(textfont(), textsize()); + fltk3::draw(c, X, Y+13); + X += int(fltk3::width(c)+fltk3::width('n')); c = l->name(); if (c) { - fl_font(textfont()|FL_BOLD, textsize()); - fl_draw(c, X, Y+13); + fltk3::font(textfont()|fltk3::BOLD, textsize()); + fltk3::draw(c, X, Y+13); } else if ((c=l->label())) { - char buf[100]; char* p = buf; + char buf[50]; char* p = buf; *p++ = '"'; int b,l=strlen(c); // size in bytes for (int i = 20; i>0;i--) { // maximum 20 characters if (*c==0) break; // end of string - fl_utf8decode(c, c+l, &b); // b=size of char in bytes + fltk3::utf8decode(c, c+l, &b); // b=size of char in bytes if (b==-1) break; // some error - leave l-=b; // l = bytes left in string while (b--)*p++ = *c++; // copy that character into the buffer } - if (*c) {strcpy(p,"..."); p+=3;} // there would be more to this string + if (*c) {strcpy(p,"..."); p+=3;} *p++ = '"'; *p = 0; - fl_draw(buf, X, Y+13); + fltk3::draw(buf, X, Y+13); } } else { const char* c = l->title(); @@ -336,8 +380,8 @@ } if (*c) {strcpy(p,"..."); p+=3;} *p = 0; - fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize()); - fl_draw(buf, X, Y+13); + fltk3::font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:fltk3::BOLD), textsize()); + fltk3::draw(buf, X, Y+13); } } @@ -351,13 +395,13 @@ if (l->is_widget() || l->is_class()) { const char* c = l->type_name(); - if (!strncmp(c,"Fl_",3)) c += 3; - fl_font(textfont(), textsize()); - W += int(fl_width(c) + fl_width('n')); + if (!strncmp(c,"fltk3::",7)) c += 7; + fltk3::font(textfont(), textsize()); + W += int(fltk3::width(c) + fltk3::width('n')); c = l->name(); if (c) { - fl_font(textfont()|FL_BOLD, textsize()); - W += int(fl_width(c)); + fltk3::font(textfont()|fltk3::BOLD, textsize()); + W += int(fltk3::width(c)); } else if ((c=l->label())) { char buf[50]; char* p = buf; *p++ = '"'; @@ -368,7 +412,7 @@ if (*c) {strcpy(p,"..."); p+=3;} *p++ = '"'; *p = 0; - W += int(fl_width(buf)); + W += int(fltk3::width(buf)); } } else { const char* c = l->title(); @@ -379,8 +423,8 @@ } if (*c) {strcpy(p,"..."); p+=3;} *p = 0; - fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize()); - W += int(fl_width(buf)); + fltk3::font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:fltk3::BOLD), textsize()); + W += int(fltk3::width(buf)); } return W; @@ -399,63 +443,79 @@ Fl_Type *l; int X,Y,W,H; bbox(X,Y,W,H); switch (e) { - case FL_PUSH: - if (!Fl::event_inside(X,Y,W,H)) break; - l = (Fl_Type*)find_item(Fl::event_y()); - if (l) { - X += 12*l->level + 18 - hposition(); - if (l->is_parent() && Fl::event_x()>X && Fl::event_x()<X+13) { - title = pushedtitle = l; - redraw_line(l); - return 1; + case fltk3::PUSH: + if (!fltk3::event_inside(X,Y,W,H)) break; + l = (Fl_Type*)find_item(fltk3::event_y()); + if (l) { + X += 12*l->level + 18 - hposition(); + if (l->is_parent() && fltk3::event_x()>X-18 && fltk3::event_x()<X+13-18) { + title = pushedtitle = l; + redraw_line(l); + return 1; + } } - } - break; - case FL_DRAG: - if (!title) break; - l = (Fl_Type*)find_item(Fl::event_y()); - if (l) { - X += 12*l->level + 18 - hposition(); - if (l->is_parent() && Fl::event_x()>X && Fl::event_x()<X+13) ; - else l = 0; - } - if (l != pushedtitle) { - if (pushedtitle) redraw_line(pushedtitle); - if (l) redraw_line(l); - pushedtitle = l; - } - return 1; - case FL_RELEASE: - if (!title) { - l = (Fl_Type*)find_item(Fl::event_y()); - if (l && l->new_selected && (Fl::event_clicks() || Fl::event_state(FL_CTRL))) - l->open(); break; - } - l = pushedtitle; - title = pushedtitle = 0; - if (l) { - if (l->open_) { - l->open_ = 0; - for (Fl_Type*k = l->next; k&&k->level>l->level; k = k->next) - k->visible = 0; + case fltk3::DRAG: + if (!title) break; + l = (Fl_Type*)find_item(fltk3::event_y()); + if (l) { + X += 12*l->level + 18 - hposition(); + if (l->is_parent() && fltk3::event_x()>X-18 && fltk3::event_x()<X+13-18) ; + else l = 0; + } + if (l != pushedtitle) { + if (pushedtitle) redraw_line(pushedtitle); + if (l) redraw_line(l); + pushedtitle = l; + } + return 1; + case fltk3::RELEASE: + if (!title) { + l = (Fl_Type*)find_item(fltk3::event_y()); + if (l && l->new_selected && (fltk3::event_clicks() || fltk3::event_state(fltk3::CTRL))) + l->open(); + break; + } + l = pushedtitle; + title = pushedtitle = 0; + if (l) { + if (l->open_) { + l->open_ = 0; + for (Fl_Type*k = l->next; k&&k->level>l->level; k = k->next) + k->visible = 0; + } else { + l->open_ = 1; + for (Fl_Type*k=l->next; k&&k->level>l->level;) { + k->visible = 1; + if (k->is_parent() && !k->open_) { + Fl_Type *j; + for (j = k->next; j && j->level>k->level; j = j->next); + k = j; + } else + k = k->next; + } + } + redraw(); + } + return 1; + case fltk3::DND_ENTER: + case fltk3::DND_DRAG: + case fltk3::DND_RELEASE: + if (!fltk3::event_inside(X,Y,W,H)) break; + l = (Fl_Type*)find_item(fltk3::event_y()); + if (l && l->dnd_available()) { + title = l; + return 1; } else { - l->open_ = 1; - for (Fl_Type*k=l->next; k&&k->level>l->level;) { - k->visible = 1; - if (k->is_parent() && !k->open_) { - Fl_Type *j; - for (j = k->next; j && j->level>k->level; j = j->next); - k = j; - } else - k = k->next; - } + title = 0; + return 0; } - redraw(); - } - return 1; + case fltk3::PASTE: + if (title && title->dnd_available()) + title->dnd_paste(); + return 1; } - return Fl_Browser_::handle(e); + return Browser_::handle(e); } Fl_Type::Fl_Type() { @@ -594,9 +654,9 @@ undo_checkpoint(); int length = 0; if (n) { // see if blank, strip leading & trailing blanks - if (!nostrip) while (isspace((int) *n)) n++; + if (!nostrip) while (isspace(*n)) n++; const char *e = n + strlen(n); - if (!nostrip) while (e > n && isspace((int)*(e-1))) e--; + if (!nostrip) while (e > n && isspace(*(e-1))) e--; length = e-n; if (!length) n = 0; } @@ -691,7 +751,7 @@ Fl_Type *in_this_only; // set if menu popped-up in window -void select_all_cb(Fl_Widget *,void *) { +void select_all_cb(fltk3::Widget *,void *) { Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0; if (in_this_only) { Fl_Type *t = p; @@ -715,7 +775,7 @@ selection_changed(p); } -void select_none_cb(Fl_Widget *,void *) { +void select_none_cb(fltk3::Widget *,void *) { Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0; if (in_this_only) { Fl_Type *t = p; @@ -788,7 +848,7 @@ } // move selected widgets in their parent's list: -void earlier_cb(Fl_Widget*,void*) { +void earlier_cb(fltk3::Widget*,void*) { Fl_Type *f; int mod = 0; for (f = Fl_Type::first; f; ) { @@ -806,7 +866,7 @@ if (mod) set_modflag(1); } -void later_cb(Fl_Widget*,void*) { +void later_cb(fltk3::Widget*,void*) { Fl_Type *f; int mod = 0; for (f = Fl_Type::last; f; ) { @@ -880,7 +940,7 @@ if (selected) write_word("selected"); } -void Fl_Type::read_property(const char *c) { +char Fl_Type::read_property(const char *c) { if (!strcmp(c,"label")) label(read_word()); else if (!strcmp(c,"user_data")) @@ -895,12 +955,13 @@ open_ = 1; else if (!strcmp(c,"selected")) select(this,1); - else + else { read_error("Unknown property \"%s\"", c); + return 0; + } + return 1; } -int Fl_Type::read_fdesign(const char*, const char*) {return 0;} - /** * Return 1 if the list contains a function with the given signature at the top level */ @@ -917,7 +978,7 @@ } /** - * Write a comment inot the header file. + * Write a comment into the header file. */ void Fl_Type::write_comment_h(const char *pre) { @@ -986,7 +1047,7 @@ * \return a widget pointer that the live mode initiator can 'show()' * \see leave_live_mode() */ -Fl_Widget *Fl_Type::enter_live_mode(int) { +fltk3::Widget *Fl_Type::enter_live_mode(int) { return 0L; } @@ -1021,6 +1082,775 @@ } +extern const char *filename; +extern void set_filename(const char*); +extern char project_is_workspace(); + +// ------------ Tool ----------------------------------------------------------- + +Fl_Tool_Type::Fl_Tool_Type() +: Fl_Type(), + pBuildEnv(FL_ENV_ALL), + pListEnv(FL_ENV_ALL), + pNUUID(0), pnUUID(0), + pUUIDName(0L), pUUID(0), + pFlags(0) +{ +} + +Fl_Tool_Type::~Fl_Tool_Type() { + int i; + for (i=0; i<pnUUID; i++) { + free(pUUIDName[i]); + free(pUUID[i]); + } + if (pNUUID) { + free(pUUIDName); + free(pUUID); + } +} + +int Fl_Tool_Type::find_UUID(const char *name) { + int i; + for (i=0; i<pnUUID; i++) { + if (strcmp(pUUIDName[i], name)==0) + return i; + } + return -1; +} + +void Fl_Tool_Type::set_UUID(int i, const char *uuid) { + if (pUUID[i]) + free(pUUID[i]); + pUUID[i] = 0; + pUUID[i] = strdup(verify_UUID(uuid)); +} + +void Fl_Tool_Type::set_UUID(const char *name, const char *uuid) { + int i = find_UUID(name); + if (i==-1) { + if (pNUUID==pnUUID) { + pNUUID += 4; + pUUIDName = (char**)realloc(pUUIDName, pNUUID*sizeof(char*)); + pUUID = (char**)realloc(pUUID, pNUUID*sizeof(char*)); + } + pUUIDName[pnUUID] = strdup(name); + pUUID[pnUUID] = strdup(verify_UUID(uuid)); + pnUUID++; + } else { + set_UUID(i, uuid); + } +} + +/* + Verify that a Uniqe ID is truly unique. + */ +const char *Fl_Tool_Type::verify_UUID(const char *uuid) { + Fl_Type *t; + for (t = first; t; t = t->next) { + if (t->is_tool()) { + Fl_Tool_Type *wt = (Fl_Tool_Type*)t; + int j, n = wt->pnUUID; + for (j=0; j<n; j++) { + if (wt->pUUID[j] && strcmp(wt->pUUID[j], uuid)==0) { + printf("Replacing duplicate UUIDin %s!\n", wt->name()); + return fltk3::Preferences::newUUID(); + } + } + } + } + return uuid; +} + +const char *Fl_Tool_Type::get_UUID(const char *name) { + int i = find_UUID(name); + if (i==-1) { + i = pnUUID; + const char *uuid = fltk3::Preferences::newUUID(); + set_UUID(name, uuid); + } + return pUUID[i]; +} + +const char *Fl_Tool_Type::get_UUID_Xcode(const char *name) { + char *buf = get_temporary_return_buffer(25); + const char *uuid = get_UUID(name); + // 937C4900-51AA-4C11-8DD3-7AB5 9944F03E + unsigned int a, b, c, d, e, f; + sscanf(uuid, "%08X-%04X-%04X-%04X-%04X%08X", &a, &b, &c, &d, &e, &f); + sprintf(buf, "%08X%04X%04X%08X", a, b^c, d^e, f); + return buf; +} + +void Fl_Tool_Type::write_properties() { + Fl_Type::write_properties(); + int i; + for (i=0; i<pnUUID; i++) { + char buf[80]; + strcpy(buf, "uuid_"); + strcat(buf, pUUIDName[i]); + write_indent(level+1); + write_word(buf); + write_word(pUUID[i]); + } + if (build_env()!=FL_ENV_ALL) { + write_indent(level+1); + write_string("build_env %d", build_env()); + } + if (list_env()!=FL_ENV_ALL) { + write_indent(level+1); + write_string("list_env %d", list_env()); + } +} + +char Fl_Tool_Type::read_property(const char *name) { + if (strncmp(name, "uuid_", 5)==0) { + char buf[80]; + strcpy(buf, name+5); + set_UUID(buf, read_word()); + } else if (!strcmp(name,"environments")) { // FIXME: delete this + int v = atoi(read_word()); + build_env(v); list_env(v); + } else if (!strcmp(name,"build_env")) { + build_env(atoi(read_word())); + } else if (!strcmp(name,"list_env")) { + list_env(atoi(read_word())); + } else { + return Fl_Type::read_property(name); + } + return 1; +} + +int Fl_Tool_Type::dnd_available() { + // FIXME: we should maybe test if the objects dropped are actually valid file names + if (filename && *filename && (is_target() || is_folder())) + return 1; + return 0; +} + +int Fl_Tool_Type::dnd_paste() { + if (filename && *filename && (is_target() || is_folder())) { + if (fltk3::event_text() && *fltk3::event_text()) { + char *basedir = strdup(filename); // global name of workspace file! + char *fn = (char*)fltk3::filename_name(basedir); + if (fn) *fn = 0; + char *files = strdup(fltk3::event_text()), *s = files, *e = s; + char done = 0; + for (;!done;) { + // find the end of the line + for (;;) { + if (*e==0) { done = 1; break; } + if (*e=='\n') { *e++ = 0; break; } + e++; + } + // add the file 's' to this item + if (e!=s) { + char buf[FLTK3_PATH_MAX]; + fltk3::filename_relative(buf, FLTK3_PATH_MAX, s, basedir); + Fl_File_Type *o = new Fl_File_Type(); + o->filename(buf); + o->add(this); + o->factory = this; + } + s = e; + } + free(files); + free(basedir); + } + } + return 1; +} + +// ------------ Workspace ------------------------------------------------------ + +Fl_Workspace_Type Fl_Workspace_type; + +Fl_Type *Fl_Workspace_Type::make() { + // A workspace must be the first entry + if (Fl_Type::first) { + fltk3::message("A Workspace can only be added to an empty project."); + return 0; + } + // add the workspace to the file + Fl_Workspace_Type *o = new Fl_Workspace_Type(); + o->name("myWorkspace"); + o->add(0L); + o->factory = this; + return o; +} + +void Fl_Workspace_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + + +// ------------ Workspace Option ----------------------------------------------- + +Fl_Option_Type Fl_Option_type; + +Fl_Type *Fl_Option_Type::make() { + // A workspace must be the first entry + if (!project_is_workspace()) { + fltk3::message("This element can only be added into a workspace."); + return 0; + } + Fl_Type *p = Fl_Type::current; + while (p && !p->is_folder() && !p->is_target() && !p->is_workspace()) + p = p->parent; + if (!p) { + fltk3::message("This element can only be added to a Target, Folder, or Workspace!"); + return 0; + } + // add the workspace to the file + Fl_Option_Type *o = new Fl_Option_Type(); + o->name("myOption"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_Option_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + +void Fl_Option_Type::value(const char *v) { + if (pValue) { + free(pValue); + pValue = 0L; + } + if (v) { + pValue = strdup(v); + } else { + pValue = strdup(""); + } +} + +char Fl_Option_Type::read_property(const char *c) { + if (!strcmp(c,"value")) { + value(read_word()); + } else if (!strcmp(c,"valuetype")) { + value_type(atoi(read_word())); + } else { + return Fl_Tool_Type::read_property(c); + } + return 1; +} + +void Fl_Option_Type::write_properties() { + Fl_Tool_Type::write_properties(); + if (value() && *value()) { + write_indent(level+1); + write_string("value"); + write_word(value()); + } + if (value_type()!=FL_OPTION_OTHER) { + write_indent(level+1); + write_string("valuetype %d", value_type()); + } +} + + +// ------------ Target Dependency ---------------------------------------------- + +Fl_Target_Dependency_Type Fl_Target_Dependency_type; + +Fl_Type *Fl_Target_Dependency_Type::make() { + // A workspace must be the first entry + if (!project_is_workspace()) { + fltk3::message("A Target Dependency can only be added to another Target in a Workspace."); + return 0; + } + // add the dependency to the target + Fl_Type *p = Fl_Type::current; + while (p && !p->is_folder() && !p->is_target()) + p = p->parent; + if (!p) { + fltk3::message("A Target Dependency reference can only be added to a Target or Folder!"); + return 0; + } + Fl_Target_Dependency_Type *o = new Fl_Target_Dependency_Type(); + o->name("otherTarget"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_Target_Dependency_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + + +// ------------ Target --------------------------------------------------------- + +Fl_Target_Type Fl_Target_type; + +Fl_Type *Fl_Target_Type::make() { + // no generic targets! + return 0L; +} + +// Note: we do not deal with UTF8 chracters here! +const char *Fl_Target_Type::caps_name() { + const char *s = name(); + char *buf = get_temporary_return_buffer(strlen(s)+1); + char *d = buf; + while (*s) { + *d++ = toupper(*s++); + } + *d++ = 0; + return buf; +} + +// Note: we do not deal with UTF8 chracters here! +const char *Fl_Target_Type::lowercase_name() { + const char *s = name(); + char *buf = get_temporary_return_buffer(strlen(s)+1); + char *d = buf; + while (*s) { + *d++ = tolower(*s++); + } + *d++ = 0; + return buf; +} + +Fl_Target_Type *Fl_Target_Type::find(const char *name, char end) { + // find a partial string, if 'end' is set to a character + char buf[FLTK3_PATH_MAX]; + strcpy(buf, name); + if (end) { + char *sep = strchr(buf, end); + if (sep) *sep = 0; + } + // now find the target by name (stored in 'buf') + Fl_Type *tgt = first; + while (tgt) { + if (tgt->is_target() && strcmp(tgt->name(), buf)==0) + return (Fl_Target_Type*)tgt; + tgt = tgt->next; + } + return 0; +} + +Fl_Target_Type *Fl_Target_Type::first_target(Fl_Type *base) { + Fl_Type *src = base->next; + while (src && src->level>base->level) { + if (src->is_target()) + return (Fl_Target_Type*)src; + src = src->next; + } + return 0; +} + +Fl_Target_Type *Fl_Target_Type::next_target(Fl_Type *base) { + Fl_Type *src = this->next; + while (src && src->level>base->level) { + if (src->is_target()) + return (Fl_Target_Type*)src; + src = src->next; + } + return 0; +} + +void Fl_Target_Type::target_path(const char *path) { + if (pTargetPath) { + free(pTargetPath); + pTargetPath = 0L; + } + if (path) { + pTargetPath = strdup(path); + } else { + pTargetPath = strdup(""); + } +} + +void Fl_Target_Type::makefile_path(const char *path) { + if (pMakefilePath) { + free(pMakefilePath); + pMakefilePath = 0L; + } + if (path) { + pMakefilePath = strdup(path); + } else { + pMakefilePath = strdup(""); + } +} + +char Fl_Target_Type::read_property(const char *c) { + if (!strcmp(c,"target_path")) { + target_path(read_word()); + } else if (!strcmp(c,"makefile_path")) { + makefile_path(read_word()); + } else { + return Fl_Tool_Type::read_property(c); + } + return 1; +} + +void Fl_Target_Type::write_properties() { + Fl_Tool_Type::write_properties(); + if (target_path() && *target_path()) { + write_indent(level+1); + write_string("target_path"); + write_word(target_path()); + } + if (makefile_path() && *makefile_path()) { + write_indent(level+1); + write_string("makefile_path"); + write_word(makefile_path()); + } +} + + +// ------------ Application Target --------------------------------------------- + +Fl_App_Target_Type Fl_App_Target_type; + +Fl_Type *Fl_App_Target_Type::make() { + // a target can only go into a workspace file + if (!project_is_workspace()) { + fltk3::message("A Target can only be added to a Workspace."); + return 0; + } + // find out where we can add this target + Fl_Type *p = Fl_Type::current; + while (p && !p->is_category() && !p->is_workspace()) + p = p->parent; + Fl_App_Target_Type *o = new Fl_App_Target_Type(); + o->name("myProgram"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_App_Target_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + +// ------------ Library Target ------------------------------------------------- + +Fl_Lib_Target_Type Fl_Lib_Target_type; + +Fl_Type *Fl_Lib_Target_Type::make() { + // a target con only go into a workspace file + // TODO: we can offer to create a workspace if this is currently a GUI file + if (!project_is_workspace()) { + fltk3::message("A Target can only be added to a Workspace."); + return 0; + } + // find out where we can add this target + Fl_Type *p = Fl_Type::current; + while (p && !p->is_category() && !p->is_workspace()) + p = p->parent; + Fl_Lib_Target_Type *o = new Fl_Lib_Target_Type(); + o->name("myLibrary"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_Lib_Target_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + +// ------------ Generic File --------------------------------------------------- + +Fl_File_Type Fl_File_type; + +Fl_Type *Fl_File_Type::make() { + // make sure that this is a workspace file + if (Fl_Type::first && !project_is_workspace()) { + fltk3::message("File references can only be used in Workspace files."); + return 0; + } + // files can be children of folders and children of targets + Fl_Type *p = Fl_Type::current; + while (p && !p->is_target() && !p->is_folder()) + p = p->parent; + if (!p) { + fltk3::message("A File reference can only be added to a Target or Folder!"); + return 0; + } + Fl_File_Type *o = new Fl_File_Type(); + o->name("readme.txt"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_File_Type::set_default_type() { + const char *fn = filename(); + if (fn) { + const char *ext = fltk3::filename_ext(fn); + filetype(FL_FILE_TEXT); + if (ext) { + if (strcmp(ext, ".cxx")==0 || strcmp(ext, ".cpp")==0) { + filetype(FL_FILE_CPP_SOURCE); + } else if (strcmp(ext, ".c")==0) { + filetype(FL_FILE_C_SOURCE); + } else if (strcmp(ext, ".H")==0) { + filetype(FL_FILE_CPP_HEADER); + } else if (strcmp(ext, ".h")==0) { + filetype(FL_FILE_C_HEADER); + } else if (strcmp(ext, ".mm")==0) { + filetype(FL_FILE_OBJC_SOURCE); + } else if (strcmp(ext, ".framework")==0) { + filetype(FL_FILE_FRAMEWORK); + } else if (strcmp(ext, ".fl")==0) { + filetype(FL_FILE_FLUID_UI); + } else if (strcmp(ext, ".lib")==0) { + filetype(FL_FILE_LIBRARY); + } + } + } +} + +void Fl_File_Type::filename(const char *fn) { + if (pFilename) { + free(pFilename); + pFilename = 0; + name(0); + } + if (fn) { + pFilename = strdup(fn); + name(fltk3::filename_name(fn)); + set_default_type(); + } +} + +char Fl_File_Type::read_property(const char *c) { + if (!strcmp(c,"filename_and_path")) { + filename(read_word()); + } else if (!strcmp(c,"filetype")) { + filetype(atoi(read_word())); + } else if (!strcmp(c,"location")) { + location(atoi(read_word())); + } else { + return Fl_Tool_Type::read_property(c); + } + return 1; +} + +void Fl_File_Type::write_properties() { + Fl_Tool_Type::write_properties(); + if (filename() && *filename()) { + write_indent(level+1); + write_string("filename_and_path"); + write_word(filename()); + } + if (filetype()&FL_FILE_EXPLICIT) { + write_indent(level+1); + write_string("filetype %d", filetype()); + } + if (location()!=FL_LOCATION_WORKSPACE) { + write_indent(level+1); + write_string("location %d", location()); + } +} + +Fl_File_Type *Fl_File_Type::first_file(Fl_Type *base) { + Fl_Type *src = base->next; + while (src && src->level>base->level) { + if (src->is_file()) + return (Fl_File_Type*)src; + src = src->next; + } + return 0; +} + +Fl_File_Type *Fl_File_Type::next_file(Fl_Type *base) { + Fl_Type *src = this->next; + while (src && src->level>base->level) { + if (src->is_file()) + return (Fl_File_Type*)src; + src = src->next; + } + return 0; +} + +Fl_Target_Dependency_Type *Fl_Target_Dependency_Type::first_dependency(Fl_Type *base) { + Fl_Type *src = base->next; + while (src && src->level>base->level) { + if (src->is_target_dependency()) + return (Fl_Target_Dependency_Type*)src; + src = src->next; + } + return 0; +} + +Fl_Target_Dependency_Type *Fl_Target_Dependency_Type::next_dependency(Fl_Type *base) { + Fl_Type *src = this->next; + while (src && src->level>base->level) { + if (src->is_target_dependency()) + return (Fl_Target_Dependency_Type*)src; + src = src->next; + } + return 0; +} + +char Fl_File_Type::file_is_cplusplus_code() { + return (pFileType==FL_FILE_CPP_SOURCE); +} + +char Fl_File_Type::file_is_cplusplus_header() { + return (pFileType==FL_FILE_CPP_HEADER); +} + +char Fl_File_Type::file_is_c_code() { + return (pFileType==FL_FILE_C_SOURCE); +} + +char Fl_File_Type::file_is_c_header() { + return (pFileType==FL_FILE_C_HEADER); +} + +char Fl_File_Type::file_is_objc_code() { + return (pFileType==FL_FILE_OBJC_SOURCE); +} + +char Fl_File_Type::file_is_objc_header() { + return (pFileType==FL_FILE_OBJC_HEADER); +} + +char Fl_File_Type::file_is_framework() { + return (pFileType==FL_FILE_FRAMEWORK); +} + +char Fl_File_Type::file_is_library() { + return (pFileType==FL_FILE_LIBRARY); +} + +char Fl_File_Type::file_is_fluid_ui() { + return (pFileType==FL_FILE_FLUID_UI); +} + +char Fl_File_Type::file_is_other() { + return (pFileType==FL_FILE_TEXT); +} + +char Fl_File_Type::file_is_code() { + return (pFileType==FL_FILE_CPP_SOURCE)||(pFileType==FL_FILE_C_SOURCE)||(pFileType==FL_FILE_OBJC_SOURCE); +} + +char Fl_File_Type::file_is_header() { + return (pFileType==FL_FILE_CPP_HEADER)||(pFileType==FL_FILE_C_HEADER)||(pFileType==FL_FILE_OBJC_HEADER); +} + +const char *Fl_File_Type::filename_name() { + const char *fn = filename(); + if (fn) { + return fltk3::filename_name(fn); + } + return 0; +} + +const char *Fl_File_Type::filename_relative(const char *fnbase, const char *tgtbase) { + char src_name[FLTK3_PATH_MAX]; + char *result = get_temporary_return_buffer(FLTK3_PATH_MAX); + const char *fn = filename(); + if (fn) { + strcpy(src_name, fnbase); + strcat(src_name, fn); + fltk3::filename_relative(result, FLTK3_PATH_MAX, src_name, tgtbase); + return result; + } else { + return 0; + } +} + +void Fl_File_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + +// ------------ Folder --------------------------------------------------------- + +Fl_Folder_Type Fl_Folder_type; + +Fl_Type *Fl_Folder_Type::make() { + // make sure that this is a workspace file + if (Fl_Type::first && !project_is_workspace()) { + fltk3::message("Folders can only be used in Workspace files."); + return 0; + } + // Folders can be inside folders of inside targets + // Categories can be at the top level or inside categories + Fl_Type *p = Fl_Type::current; + while (p && !p->is_category() && !p->is_folder() && !p->is_target() && !p->is_workspace()) + p = p->parent; + Fl_Folder_Type *o = new Fl_Folder_Type(); + o->name("Group"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_Folder_Type::open() { + if (!the_file_panel) the_file_panel = make_file_panel(); + the_file_panel->load(&Fl_Type::is_tool); + if (Fl_Panel::numselected) the_file_panel->show(); +} + +// ------------ Panel Base Class ----------------------------------------------- + +void *const Fl_Panel::LOAD = (void *)"LOAD"; // "magic" pointer to indicate that we need to load values into the dialog +int Fl_Panel::numselected = 0; +Fl_Type *Fl_Panel::current = 0L; + +Fl_Panel::Fl_Panel(int x, int y, int w, int h, const char *name) +: fltk3::DoubleWindow(w, h, name) { +} + +Fl_Panel::~Fl_Panel() { +} + +void Fl_Panel::propagate_load(fltk3::Group* g, void* v) { + if (v == Fl_Panel::LOAD) { + fltk3::Widget*const* a = g->array(); + for (int i=g->children(); i--;) { + fltk3::Widget* o = *a++; + o->do_callback(o,Fl_Panel::LOAD); + } + } +} + + +// FIXME: make this a method of Fl_Panel +// update the panel according to current widget set: +void Fl_Panel::load(RTTI_Query type_query) { + if (!this) return; + + // find all the fltk3::Widget subclasses currently selected: + numselected = 0; + current = 0; + if (Fl_Type::current) { + if ((Fl_Type::current->*type_query)()) + current = Fl_Type::current; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if ((o->*type_query)() && o->selected) { + numselected++; + if (!current) current = o; + } + } + } + if (numselected) + propagate_load(this); + else + hide(); +} + + + // // End of "$Id$". // Modified: branches/branch-3.0/src/fltk3/arg.cxx =================================================================== --- branches/branch-3.0/src/fltk3/arg.cxx 2012-04-22 03:09:31 UTC (rev 9375) +++ branches/branch-3.0/src/fltk3/arg.cxx 2012-04-22 13:09:19 UTC (rev 9376) @@ -182,9 +182,13 @@ #ifdef __APPLE__ // The Finder application in MacOS X passes the "-psn_N_NNNNN" option // to all apps... - else if (strncmp(s, "psn_", 4) == 0) { + else if (strcmp(s, "NSDocumentRevisionsDebugMode") == 0) { i++; + if (argv[i]) i++; return 1; + } else if (strncmp(s, "psn_", 4) == 0) { + i++; + return 1; } #endif // __APPLE__ _______________________________________________ fltk-commit mailing list fltk-commit@easysw.com http://lists.easysw.com/mailman/listinfo/fltk-commit