Author: matt
Date: 2011-07-28 13:49:46 -0700 (Thu, 28 Jul 2011)
New Revision: 8881
Log:
Fluid can accept cpp files for workspace targets via DND.

Modified:
   branches/branch-3.0/fluid/Fl_Type.cxx
   branches/branch-3.0/fluid/Fl_Type.h
   branches/branch-3.0/fluid/file_xcode.cxx

Modified: branches/branch-3.0/fluid/Fl_Type.cxx
===================================================================
--- branches/branch-3.0/fluid/Fl_Type.cxx       2011-07-28 18:03:37 UTC (rev 
8880)
+++ branches/branch-3.0/fluid/Fl_Type.cxx       2011-07-28 20:49:46 UTC (rev 
8881)
@@ -429,61 +429,77 @@
   Fl_Type *l;
   int X,Y,W,H; bbox(X,Y,W,H);
   switch (e) {
-  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;
+    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 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) {
+      break;
+    case fltk3::DRAG:
+      if (!title) break;
       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;
+      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 fltk3::Browser_::handle(e);
 }
@@ -1175,6 +1191,46 @@
   return 1;
 }
 
+int Fl_Workspace_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_Workspace_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[2048];
+          fltk3::filename_relative(buf, 2048, s, basedir);
+          Fl_Code_File_Type *o = new Fl_Code_File_Type();
+          o->filename(buf);
+          o->add(this);
+          o->factory = this;
+        }
+        s = e;
+      }
+      free(files);
+      free(basedir);
+    }
+  }
+  return 1;
+}
+
 // ------------ Target 
---------------------------------------------------------
 
 Fl_Target_Type Fl_Target_type;
@@ -1200,7 +1256,7 @@
 Fl_App_Target_Type Fl_App_Target_type;
 
 Fl_Type *Fl_App_Target_Type::make() {
-  // a target con only go into a workspace file
+  // a target can only go into a workspace file
   // TODO: we can offer to create a workspace if this is currently a GUI file
   if (Fl_Type::first && !is_workspace()) {
     fltk3::message("A Target can only be added to a Workspace.");

Modified: branches/branch-3.0/fluid/Fl_Type.h
===================================================================
--- branches/branch-3.0/fluid/Fl_Type.h 2011-07-28 18:03:37 UTC (rev 8880)
+++ branches/branch-3.0/fluid/Fl_Type.h 2011-07-28 20:49:46 UTC (rev 8881)
@@ -171,6 +171,9 @@
 
   virtual int pixmapID() { return 0; }
 
+  virtual int dnd_available() { return 0; }
+  virtual int dnd_paste() { return 0; }
+  
   const char* class_name(const int need_nest) const;
   const class Fl_Class_Type* is_in_class() const;
 };
@@ -191,6 +194,8 @@
   void write_properties();
   char read_property(const char *);
   virtual int is_workspace_type() const { return 1; }
+  virtual int dnd_available();
+  virtual int dnd_paste();
 };
 
 class Fl_Target_Type : public Fl_Workspace_Type {

Modified: branches/branch-3.0/fluid/file_xcode.cxx
===================================================================
--- branches/branch-3.0/fluid/file_xcode.cxx    2011-07-28 18:03:37 UTC (rev 
8880)
+++ branches/branch-3.0/fluid/file_xcode.cxx    2011-07-28 20:49:46 UTC (rev 
8881)
@@ -81,7 +81,6 @@
             if (f->is_cplusplus_code()) {
               char PBXBuildFile[32]; strcpy(PBXBuildFile, 
f->get_UUID_Xcode("Xcode4_PBXBuildFile"));
               char PBXFileRef[32]; strcpy(PBXFileRef, 
f->get_UUID_Xcode("Xcode4_PBXFileRef"));
-              // 836: DCB5F32CFF3DCFF6F2DA89E2 /* CodeEditor.cxx in Sources */ 
= {isa = PBXBuildFile; fileRef = CC0C80DA4DD31B6B2DB91096 /* CodeEditor.cxx */; 
};
               fprintf(out, "\t\t%s /* %s in %s */ = {isa = PBXBuildFile; 
fileRef = %s /* %s */; };\n", 
                       PBXBuildFile, 
                       f->filename_name(), 

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to