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

Reply via email to