FLTK logo

[master] e52a358 - FLUID: Improve usability of Declaration Blocks

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] e52a358 - FLUID: Improve usability of Declaration Blocks "Matthias Melcher" 09:02 Apr 25  
 
commit e52a358e8538151423a52b71ed5cca1f0fe1b15b
Author:     Matthias Melcher <github@matthiasm.com>
AuthorDate: Thu Apr 25 17:52:32 2024 +0200
Commit:     Matthias Melcher <github@matthiasm.com>
CommitDate: Thu Apr 25 17:52:38 2024 +0200

    FLUID: Improve usability of Declaration Blocks
    
    Decl Blocks can now output code around static code
    in source and header files.

 fluid/Fl_Function_Type.cxx                        | 155 +++++++++++++++++-----
 fluid/Fl_Function_Type.h                          |  12 +-
 fluid/Fl_Type.cxx                                 |   3 +
 fluid/Fl_Type.h                                   |   1 +
 fluid/autodoc.cxx                                 |   4 +-
 fluid/code.cxx                                    |  37 ++++--
 fluid/code.h                                      |   1 +
 fluid/documentation/src/page_functional_nodes.dox |  42 ++++--
 fluid/function_panel.cxx                          | 125 ++++++++++-------
 fluid/function_panel.fl                           |  90 ++++++++-----
 fluid/function_panel.h                            |  13 +-
 11 files changed, 340 insertions(+), 143 deletions(-)

diff --git fluid/Fl_Function_Type.cxx fluid/Fl_Function_Type.cxx
index 22bcf72..2f26a2a 100644
--- fluid/Fl_Function_Type.cxx
+++ fluid/Fl_Function_Type.cxx
@@ -331,10 +331,10 @@ void Fl_Function_Type::open() {
     }
     c = f_comment_input->buffer()->text();
     if (c && *c) {
-      if (!comment() || strcmp(c, comment())) redraw_browser();
+      if (!comment() || strcmp(c, comment()))  { set_modflag(1); redraw_browser(); }
       comment(c);
     } else {
-      if (comment()) redraw_browser();
+      if (comment())  { set_modflag(1); redraw_browser(); }
       comment(0);
     }
     if (c) free((void*)c);
@@ -993,10 +993,10 @@ void Fl_Decl_Type::open() {
     }
     c = decl_comment_input->buffer()->text();
     if (c && *c) {
-      if (!comment() || strcmp(c, comment())) redraw_browser();
+      if (!comment() || strcmp(c, comment()))  { set_modflag(1); redraw_browser(); }
       comment(c);
     } else {
-      if (comment()) redraw_browser();
+      if (comment())  { set_modflag(1); redraw_browser(); }
       comment(0);
     }
     if (c) free((void*)c);
@@ -1253,10 +1253,10 @@ void Fl_Data_Type::open() {
     // store the comment
     c = data_comment_input->buffer()->text();
     if (c && *c) {
-      if (!comment() || strcmp(c, comment())) redraw_browser();
+      if (!comment() || strcmp(c, comment()))  { set_modflag(1); redraw_browser(); }
       comment(c);
     } else {
-      if (comment()) redraw_browser();
+      if (comment())  { set_modflag(1); redraw_browser(); }
       comment(0);
     }
     if (c) free((void*)c);
@@ -1423,7 +1423,8 @@ Fl_DeclBlock_Type Fl_DeclBlock_type;
  */
 Fl_DeclBlock_Type::Fl_DeclBlock_Type() :
   Fl_Type(),
-  after(NULL)
+  after(NULL),
+  write_map_(CODE_IN_SOURCE)
 { }
 
 /**
@@ -1431,13 +1432,15 @@ Fl_DeclBlock_Type::Fl_DeclBlock_Type() :
  */
 Fl_DeclBlock_Type::~Fl_DeclBlock_Type() {
   if (after)
-    free((void*)after);
+    ::free((void*)after);
 }
 
 /**
  Return 1 if this block is public.
  */
-int Fl_DeclBlock_Type::is_public() const {return public_;}
+int Fl_DeclBlock_Type::is_public() const {
+  return ((write_map_&CODE_IN_HEADER) != 0);
+}
 
 /**
  Create a new declaration block.
@@ -1449,7 +1452,7 @@ Fl_Type *Fl_DeclBlock_Type::make(Strategy strategy) {
   while (p && !p->is_decl_block()) p = p->parent;
   Fl_DeclBlock_Type *o = new Fl_DeclBlock_Type();
   o->name("#if 1");
-  o->public_ = 0;
+  o->write_map_ = CODE_IN_SOURCE;
   o->after = fl_strdup("#endif");
   o->add(p, strategy);
   o->factory = this;
@@ -1463,10 +1466,11 @@ Fl_Type *Fl_DeclBlock_Type::make(Strategy strategy) {
  */
 void Fl_DeclBlock_Type::write_properties(Fd_Project_Writer &f) {
   Fl_Type::write_properties(f);
-  switch (public_) {
-    case 1: f.write_string("public"); break;
-    case 2: f.write_string("protected"); break;
-  }
+  // deprecated
+  if (is_public()) f.write_string("public");
+  // new way to map declaration block to various parts of the generated code
+  if (write_map_ != CODE_IN_SOURCE)
+    f.write_string("map %d", write_map_);
   f.write_string("after");
   f.write_word(after);
 }
@@ -1476,9 +1480,11 @@ void Fl_DeclBlock_Type::write_properties(Fd_Project_Writer &f) {
  */
 void Fl_DeclBlock_Type::read_property(Fd_Project_Reader &f, const char *c) {
   if(!strcmp(c,"public")) {
-    public_ = 1;
+    write_map_ |= CODE_IN_HEADER;
   } else if(!strcmp(c,"protected")) {
-    public_ = 2;
+    //
+  } else if(!strcmp(c,"map")) {
+    write_map_ = (int)atol(f.read_word());
   } else  if (!strcmp(c,"after")) {
     storestring(f.read_word(),after);
   } else {
@@ -1490,10 +1496,18 @@ void Fl_DeclBlock_Type::read_property(Fd_Project_Reader &f, const char *c) {
  Open the declblock_panel to edit this node.
  */
 void Fl_DeclBlock_Type::open() {
+  // build dialog box
   if (!declblock_panel) make_declblock_panel();
-  decl_before_input->value(name());
-  declblock_public_choice->value((public_>0));
-  decl_after_input->value(after);
+  // preset all values
+  declblock_before_input->value(name());
+  declblock_after_input->value(after);
+  declblock_static_header->value(write_map_ & STATIC_IN_HEADER);
+  declblock_static_source->value(write_map_ & STATIC_IN_SOURCE);
+  declblock_code_header->value(write_map_ & CODE_IN_HEADER);
+  declblock_code_source->value(write_map_ & CODE_IN_SOURCE);
+  const char *c = comment();
+  declblock_comment_input->buffer()->text(c?c:"");
+  // show modal dialog and loop until satisfied
   declblock_panel->show();
   const char* message = 0;
   for (;;) { // repeat as long as there are errors
@@ -1503,9 +1517,10 @@ void Fl_DeclBlock_Type::open() {
       else if (w == declblock_panel_ok) break;
       else if (!w) Fl::wait();
     }
-    const char* a = decl_before_input->value();
+    // verify user input
+    const char* a = declblock_before_input->value();
     while (isspace(*a)) a++;
-    const char* b = decl_after_input->value();
+    const char* b = declblock_after_input->value();
     while (isspace(*b)) b++;
     message = c_check(a&&a[0]=='#' ? a+1 : a);
     if (!message)
@@ -1516,13 +1531,62 @@ void Fl_DeclBlock_Type::open() {
       if (v==0) continue;     // Continue Editing
       //if (v==1) { }         // Ignore Error and close dialog
     }
+    // store user choices in data structure
     name(a);
     storestring(b, after);
-    if (public_ != declblock_public_choice->value()) {
-      set_modflag(1);
-      public_ = declblock_public_choice->value();
-      redraw_browser();
+    if (write_map_ & STATIC_IN_HEADER) {
+      if (declblock_static_header->value()==0) {
+        write_map_ &= ~STATIC_IN_HEADER;
+        set_modflag(1);
+      }
+    } else {
+      if (declblock_static_header->value()) {
+        write_map_ |= STATIC_IN_HEADER;
+        set_modflag(1);
+      }
+    }
+    if (write_map_ & STATIC_IN_SOURCE) {
+      if (declblock_static_source->value()==0) {
+        write_map_ &= ~STATIC_IN_SOURCE;
+        set_modflag(1);
+      }
+    } else {
+      if (declblock_static_source->value()) {
+        write_map_ |= STATIC_IN_SOURCE;
+        set_modflag(1);
+      }
+    }
+    if (write_map_ & CODE_IN_HEADER) {
+      if (declblock_code_header->value()==0) {
+        write_map_ &= ~CODE_IN_HEADER;
+        set_modflag(1);
+      }
+    } else {
+      if (declblock_code_header->value()) {
+        write_map_ |= CODE_IN_HEADER;
+        set_modflag(1);
+      }
+    }
+    if (write_map_ & CODE_IN_SOURCE) {
+      if (declblock_code_source->value()==0) {
+        write_map_ &= ~CODE_IN_SOURCE;
+        set_modflag(1);
+      }
+    } else {
+      if (declblock_code_source->value()) {
+        write_map_ |= CODE_IN_SOURCE;
+        set_modflag(1);
+      }
+    }
+    c = declblock_comment_input->buffer()->text();
+    if (c && *c) {
+      if (!comment() || strcmp(c, comment())) { set_modflag(1); redraw_browser(); }
+      comment(c);
+    } else {
+      if (comment()) { set_modflag(1); redraw_browser(); }
+      comment(0);
     }
+    if (c) free((void*)c);
     break;
   }
 BREAK2:
@@ -1530,15 +1594,43 @@ BREAK2:
 }
 
 /**
+ Write the \b before static code to the source file, and to the header file if declared public.
+ The before code is stored in the name() field.
+ */
+void Fl_DeclBlock_Type::write_static(Fd_Code_Writer& f) {
+  const char* c = name();
+  if (c && *c) {
+    if (write_map_ & STATIC_IN_HEADER)
+      f.write_h("%s\n", c);
+    if (write_map_ & STATIC_IN_SOURCE)
+      f.write_c("%s\n", c);
+  }
+}
+
+/**
+ Write the \b after static code to the source file, and to the header file if declared public.
+ */
+void Fl_DeclBlock_Type::write_static_after(Fd_Code_Writer& f) {
+  const char* c = after;
+  if (c && *c) {
+    if (write_map_ & STATIC_IN_HEADER)
+      f.write_h("%s\n", c);
+    if (write_map_ & STATIC_IN_SOURCE)
+      f.write_c("%s\n", c);
+  }
+}
+
+/**
  Write the \b before code to the source file, and to the header file if declared public.
  The before code is stored in the name() field.
  */
 void Fl_DeclBlock_Type::write_code1(Fd_Code_Writer& f) {
   const char* c = name();
   if (c && *c) {
-    if (public_)
+    if (write_map_ & CODE_IN_HEADER)
       f.write_h("%s\n", c);
-    f.write_c("%s\n", c);
+    if (write_map_ & CODE_IN_SOURCE)
+      f.write_c("%s\n", c);
   }
 }
 
@@ -1548,9 +1640,10 @@ void Fl_DeclBlock_Type::write_code1(Fd_Code_Writer& f) {
 void Fl_DeclBlock_Type::write_code2(Fd_Code_Writer& f) {
   const char* c = after;
   if (c && *c) {
-    if (public_)
+    if (write_map_ & CODE_IN_HEADER)
       f.write_h("%s\n", c);
-    f.write_c("%s\n", c);
+    if (write_map_ & CODE_IN_SOURCE)
+      f.write_c("%s\n", c);
   }
 }
 
@@ -1962,10 +2055,10 @@ void Fl_Class_Type::open() {
     }
     c = c_comment_input->buffer()->text();
     if (c && *c) {
-      if (!comment() || strcmp(c, comment())) redraw_browser();
+      if (!comment() || strcmp(c, comment()))  { set_modflag(1); redraw_browser(); }
       comment(c);
     } else {
-      if (comment()) redraw_browser();
+      if (comment())  { set_modflag(1); redraw_browser(); }
       comment(0);
     }
     if (c) free((void*)c);
diff --git fluid/Fl_Function_Type.h fluid/Fl_Function_Type.h
index 06026af..740792c 100644
--- fluid/Fl_Function_Type.h
+++ fluid/Fl_Function_Type.h
@@ -172,13 +172,21 @@ public:
 class Fl_DeclBlock_Type : public Fl_Type
 {
   typedef Fl_Type super;
-  const char* after;
-  char public_;
+  enum {
+    CODE_IN_HEADER = 1,
+    CODE_IN_SOURCE = 2,
+    STATIC_IN_HEADER = 4,
+    STATIC_IN_SOURCE = 8
+  };
+  const char* after; ///< code after all children of this block
+  int write_map_;     ///< see enum above
 
 public:
   Fl_DeclBlock_Type();
   ~Fl_DeclBlock_Type();
   Fl_Type *make(Strategy strategy) FL_OVERRIDE;
+  void write_static(Fd_Code_Writer& f) FL_OVERRIDE;
+  void write_static_after(Fd_Code_Writer& f) FL_OVERRIDE;
   void write_code1(Fd_Code_Writer& f) FL_OVERRIDE;
   void write_code2(Fd_Code_Writer& f) FL_OVERRIDE;
   void open() FL_OVERRIDE;
diff --git fluid/Fl_Type.cxx fluid/Fl_Type.cxx
index a649ea3..1654bfd 100644
--- fluid/Fl_Type.cxx
+++ fluid/Fl_Type.cxx
@@ -1044,6 +1044,9 @@ bool Fl_Type::is_in_class() const {
 void Fl_Type::write_static(Fd_Code_Writer&) {
 }
 
+void Fl_Type::write_static_after(Fd_Code_Writer&) {
+}
+
 void Fl_Type::write_code1(Fd_Code_Writer& f) {
   f.write_h("// Header for %s\n", title());
   f.write_c("// Code for %s\n", title());
diff --git fluid/Fl_Type.h fluid/Fl_Type.h
index 67e7c89..7a3a5fc 100644
--- fluid/Fl_Type.h
+++ fluid/Fl_Type.h
@@ -218,6 +218,7 @@ public:
 
   // write code, these are called in order:
   virtual void write_static(Fd_Code_Writer& f); // write static stuff to .c file
+  virtual void write_static_after(Fd_Code_Writer& f); // write static stuff after children
   virtual void write_code1(Fd_Code_Writer& f); // code and .h before children
   virtual void write_code2(Fd_Code_Writer& f); // code and .h after children
   void write_comment_h(Fd_Code_Writer& f, const char *ind=""); // write the commentary text into the header file
diff --git fluid/autodoc.cxx fluid/autodoc.cxx
index 63818d8..b34dcc9 100644
--- fluid/autodoc.cxx
+++ fluid/autodoc.cxx
@@ -504,8 +504,8 @@ void run_autodoc(const Fl_String &target_dir) {
 
   // -- ID_DeclBlock
   Fl_Window *adoc_declblock_panel = make_declblock_panel();
-  decl_before_input->value("#ifdef NDEBUG");
-  decl_after_input->value("#endif // NDEBUG");
+  declblock_before_input->value("#ifdef NDEBUG");
+  declblock_after_input->value("#endif // NDEBUG");
   fl_snapshot((target_dir + "declblock_panel.png").c_str(), adoc_declblock_panel, win_margin, win_blend);
   adoc_declblock_panel->hide();
 
diff --git fluid/code.cxx fluid/code.cxx
index b49951c..873b9d7 100644
--- fluid/code.cxx
+++ fluid/code.cxx
@@ -682,7 +682,29 @@ bool is_comment_before_class_member(Fl_Type *q) {
 }
 
 /**
- Recursively dump code, putting children between the two parts of the parent code.
+ Recursively write static code and declarations
+ \param[in] p write this type and all its children
+ \return pointer to the next sibling
+ */
+Fl_Type* Fd_Code_Writer::write_static(Fl_Type* p) {
+  if (write_codeview) p->header_static_start = (int)ftell(header_file);
+  if (write_codeview) p->code_static_start = (int)ftell(code_file);
+  p->write_static(*this);
+  if (write_codeview) p->code_static_end = (int)ftell(code_file);
+  if (write_codeview) p->header_static_end = (int)ftell(header_file);
+
+  Fl_Type* q;
+  for (q = p->next; q && q->level > p->level;) {
+    q = write_static(q);
+  }
+
+  p->write_static_after(*this);
+
+  return q;
+}
+
+/**
+ Recursively write code, putting children between the two parts of the parent code.
  \param[in] p write this type and all its children
  \return pointer to the next sibling
  */
@@ -879,18 +901,7 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_codeview) {
   }
   for (Fl_Type* p = first_type; p;) {
     // write all static data for this & all children first
-    if (write_codeview) p->header_static_start = (int)ftell(header_file);
-    if (write_codeview) p->code_static_start = (int)ftell(code_file);
-    p->write_static(*this);
-    if (write_codeview) p->code_static_end = (int)ftell(code_file);
-    if (write_codeview) p->header_static_end = (int)ftell(header_file);
-    for (Fl_Type* q = p->next; q && q->level > p->level; q = q->next) {
-      if (write_codeview) q->header_static_start = (int)ftell(header_file);
-      if (write_codeview) q->code_static_start = (int)ftell(code_file);
-      q->write_static(*this);
-      if (write_codeview) q->code_static_end = (int)ftell(code_file);
-      if (write_codeview) q->header_static_end = (int)ftell(header_file);
-    }
+    write_static(p);
     // then write the nested code:
     p = write_code(p);
   }
diff --git fluid/code.h fluid/code.h
index 8581c90..dba552e 100644
--- fluid/code.h
+++ fluid/code.h
@@ -99,6 +99,7 @@ public:
   void write_h(const char*, ...) __fl_attr((__format__ (__printf__, 2, 3)));
   void write_hc(const char *, int, const char*, const char*);
   void write_c_indented(const char *textlines, int inIndent, char inTrailwWith);
+  Fl_Type* write_static(Fl_Type* p);
   Fl_Type* write_code(Fl_Type* p);
   int write_code(const char *cfile, const char *hfile, bool to_codeview=false);
   void write_public(int state); // writes pubic:/private: as needed
diff --git fluid/documentation/src/page_functional_nodes.dox fluid/documentation/src/page_functional_nodes.dox
index 4407f0e..fa4262e 100644
--- fluid/documentation/src/page_functional_nodes.dox
+++ fluid/documentation/src/page_functional_nodes.dox
@@ -279,15 +279,39 @@
  \image html declblock_panel.png "Declaration Block Properties"
  \image latex declblock_panel.png "Declaration Block Properties" width=7cm
 
- Users can select if the block is generated in the source file only, or in the
- header file as well. The two input fields are used to enter the line of code
- before and after the child nodes. Two consecutive Declaration Blocks can be
- used to generate `#else`/`#elif` style code by leaving the second field of
- the first node empty.
-
- \note Declaration Blocks are not smart, and child nodes may still generate
- unexpected code outside the scope of this block. This may change in future
- versions of FLUID.
+ The C++ code in the "Start" field is output before the code of
+ all children of this node is written to the source file. The text in the "End"
+ field is written after code for all children was generated.
+
+ The following check boxes enable code generation for different locations in
+ header and source code files. The first two boxes modify the C++ source code
+ file.
+ If the first check box, "implementations", is ticked, all C++ code that
+ implements the children of this declaration block will be enclosed with the
+ code from the "Start" and "End" fields. This check box is marked by default.
+
+ The second check box, "static initializations and callbacks", will enclose
+ callbacks that may be created by child widgets, menu item arrays, and code
+ as well as data for images. This box should be ticked in most cases, but
+ may be harmful if one image is used more than once and outside of this
+ declaration block.
+
+ The next two boxes modify the C++ code in the header file. Ticking "forward
+ declarations" will wrap the code that declares functions, methods, and menus.
+ The last box ensure that code declaring widgets is wrapped with yet another
+ copy of from the "Start" and "End" fields. This will also wrap
+ `#include` statements and declarations from widget "Code" fields.
+
+ FLUID optimizes header files by removing duplicate include statements and
+ certain declarations. Declaration blocks are commonly used for conditional
+ compilation and may effectively "optimize away" include statements that are
+ still needed elsewhere. This can be litigated by explicitly creating
+ Declaration nodes outside of the declaration block.
+
+ The "Start" and "End" code may appear multiple times per file if more than
+ one of the check boxes above is ticked. The code should not have any side
+ effects or cause conflicts when compiled more than once. It's not safe to rely
+ on a specific order of the generated blocks.
 
  <!-- ---------------------------------------------------------------------- -->
 
diff --git fluid/function_panel.cxx fluid/function_panel.cxx
index aeb3124..856a1dd 100644
--- fluid/function_panel.cxx
+++ fluid/function_panel.cxx
@@ -66,6 +66,7 @@ Fl_Button *f_panel_cancel=(Fl_Button *)0;
 
 Fl_Double_Window* make_function_panel() {
   { function_panel = new Fl_Double_Window(343, 232, "Function/Method Properties");
+    function_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
     { Fl_Group* o = new Fl_Group(10, 10, 270, 20);
       { f_public_member_choice = new Fl_Choice(10, 10, 75, 20);
         f_public_member_choice->tooltip("Change member access attribute.");
@@ -254,79 +255,109 @@ Fl_Double_Window* make_codeblock_panel() {
 
 Fl_Double_Window *declblock_panel=(Fl_Double_Window *)0;
 
-Fl_Choice *declblock_public_choice=(Fl_Choice *)0;
+Fl_Input *declblock_before_input=(Fl_Input *)0;
 
-Fl_Menu_Item menu_declblock_public_choice[] = {
- {"in source code only", 0,  0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {"in header and source", 0,  0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
- {0,0,0,0,0,0,0,0,0}
-};
+Fl_Input *declblock_after_input=(Fl_Input *)0;
+
+Fl_Check_Button *declblock_code_source=(Fl_Check_Button *)0;
 
-Fl_Light_Button *declblock_public_button_x=(Fl_Light_Button *)0;
+Fl_Check_Button *declblock_static_source=(Fl_Check_Button *)0;
 
-Fl_Input *decl_before_input=(Fl_Input *)0;
+Fl_Check_Button *declblock_code_header=(Fl_Check_Button *)0;
 
-Fl_Input *decl_after_input=(Fl_Input *)0;
+Fl_Check_Button *declblock_static_header=(Fl_Check_Button *)0;
+
+Fl_Text_Editor *declblock_comment_input=(Fl_Text_Editor *)0;
 
 Fl_Return_Button *declblock_panel_ok=(Fl_Return_Button *)0;
 
 Fl_Button *declblock_panel_cancel=(Fl_Button *)0;
 
 Fl_Double_Window* make_declblock_panel() {
-  { Fl_Double_Window* o = declblock_panel = new Fl_Double_Window(300, 135, "Declaration Block Properties");
+  { Fl_Double_Window* o = declblock_panel = new Fl_Double_Window(300, 355, "Declaration Block Properties");
     declblock_panel->labelsize(11);
-    { Fl_Group* o = new Fl_Group(10, 10, 280, 20);
-      { declblock_public_choice = new Fl_Choice(10, 10, 140, 20);
-        declblock_public_choice->tooltip("Change widget accessibility.");
-        declblock_public_choice->down_box(FL_BORDER_BOX);
-        declblock_public_choice->labelsize(11);
-        declblock_public_choice->textsize(11);
-        declblock_public_choice->when(FL_WHEN_NEVER);
-        declblock_public_choice->menu(menu_declblock_public_choice);
-      } // Fl_Choice* declblock_public_choice
-      { declblock_public_button_x = new Fl_Light_Button(10, 10, 60, 20, "public");
-        declblock_public_button_x->tooltip("Make the declaration publicly accessible.");
-        declblock_public_button_x->labelsize(11);
-        declblock_public_button_x->when(FL_WHEN_NEVER);
-        declblock_public_button_x->hide();
-      } // Fl_Light_Button* declblock_public_button_x
-      { Fl_Box* o = new Fl_Box(155, 10, 135, 20);
+    declblock_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
+    { declblock_before_input = new Fl_Input(10, 23, 280, 20, "Start Code:");
+      declblock_before_input->tooltip("#ifdef or similar conditional declaration block.");
+      declblock_before_input->labelfont(1);
+      declblock_before_input->labelsize(11);
+      declblock_before_input->textfont(4);
+      declblock_before_input->textsize(11);
+      declblock_before_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+      declblock_before_input->when(FL_WHEN_NEVER);
+    } // Fl_Input* declblock_before_input
+    { Fl_Box* o = new Fl_Box(10, 48, 280, 20, "\"\\n...child code...\\n\" is inserted here");
+      o->labelsize(11);
+    } // Fl_Box* o
+    { declblock_after_input = new Fl_Input(10, 80, 280, 20, "End Code:");
+      declblock_after_input->tooltip("#endif or similar declaration code block.");
+      declblock_after_input->labelfont(1);
+      declblock_after_input->labelsize(11);
+      declblock_after_input->textfont(4);
+      declblock_after_input->textsize(11);
+      declblock_after_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+      declblock_after_input->when(FL_WHEN_NEVER);
+    } // Fl_Input* declblock_after_input
+    { Fl_Group* o = new Fl_Group(10, 105, 280, 120);
+      { Fl_Box* o = new Fl_Box(10, 105, 270, 20, "Enclose code generated by children in source file:");
+        o->labelsize(11);
+        o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+      } // Fl_Box* o
+      { declblock_code_source = new Fl_Check_Button(20, 125, 260, 20, "implementations");
+        declblock_code_source->down_box(FL_DOWN_BOX);
+        declblock_code_source->labelsize(11);
+      } // Fl_Check_Button* declblock_code_source
+      { declblock_static_source = new Fl_Check_Button(20, 145, 260, 20, "static initializations and callbacks");
+        declblock_static_source->down_box(FL_DOWN_BOX);
+        declblock_static_source->labelsize(11);
+      } // Fl_Check_Button* declblock_static_source
+      { Fl_Box* o = new Fl_Box(10, 165, 270, 20, "Enclose code in header file:");
+        o->labelsize(11);
+        o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
+      } // Fl_Box* o
+      { declblock_code_header = new Fl_Check_Button(20, 185, 260, 20, "forward declarations");
+        declblock_code_header->down_box(FL_DOWN_BOX);
+        declblock_code_header->labelsize(11);
+      } // Fl_Check_Button* declblock_code_header
+      { declblock_static_header = new Fl_Check_Button(20, 205, 260, 20, "preprecessor and callback declarations");
+        declblock_static_header->down_box(FL_DOWN_BOX);
+        declblock_static_header->labelsize(11);
+      } // Fl_Check_Button* declblock_static_header
+      { Fl_Box* o = new Fl_Box(280, 105, 10, 120);
+        o->labelsize(11);
+        o->hide();
         Fl_Group::current()->resizable(o);
       } // Fl_Box* o
       o->end();
     } // Fl_Group* o
-    { decl_before_input = new Fl_Input(10, 40, 280, 20);
-      decl_before_input->tooltip("#ifdef or similar conditional declaration block.");
-      decl_before_input->labelsize(11);
-      decl_before_input->textfont(4);
-      decl_before_input->textsize(11);
-      decl_before_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-      decl_before_input->when(FL_WHEN_NEVER);
-      Fl_Group::current()->resizable(decl_before_input);
-    } // Fl_Input* decl_before_input
-    { decl_after_input = new Fl_Input(10, 75, 280, 20, "\"\\n...child code...\\n\" is inserted here");
-      decl_after_input->tooltip("#endif or similar declaration code block.");
-      decl_after_input->labelsize(11);
-      decl_after_input->textfont(4);
-      decl_after_input->textsize(11);
-      decl_after_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
-      decl_after_input->when(FL_WHEN_NEVER);
-    } // Fl_Input* decl_after_input
-    { Fl_Group* o = new Fl_Group(10, 105, 280, 20);
-      { declblock_panel_ok = new Fl_Return_Button(160, 105, 60, 20, "OK");
+    { declblock_comment_input = new Fl_Text_Editor(10, 242, 280, 65, "Comment:");
+      declblock_comment_input->tooltip("Declaration comment in Doxygen format");
+      declblock_comment_input->box(FL_DOWN_BOX);
+      declblock_comment_input->labelfont(1);
+      declblock_comment_input->labelsize(11);
+      declblock_comment_input->textfont(4);
+      declblock_comment_input->textsize(11);
+      declblock_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+      Fl_Group::current()->resizable(declblock_comment_input);
+      declblock_comment_input->buffer(new Fl_Text_Buffer());
+      declblock_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);
+    } // Fl_Text_Editor* declblock_comment_input
+    { Fl_Group* o = new Fl_Group(10, 321, 280, 20);
+      { declblock_panel_ok = new Fl_Return_Button(160, 321, 60, 20, "OK");
         declblock_panel_ok->labelsize(11);
         declblock_panel_ok->window()->hotspot(declblock_panel_ok);
       } // Fl_Return_Button* declblock_panel_ok
-      { declblock_panel_cancel = new Fl_Button(230, 105, 60, 20, "Cancel");
+      { declblock_panel_cancel = new Fl_Button(230, 321, 60, 20, "Cancel");
         declblock_panel_cancel->shortcut(0xff1b);
         declblock_panel_cancel->labelsize(11);
       } // Fl_Button* declblock_panel_cancel
-      { Fl_Box* o = new Fl_Box(10, 105, 140, 20);
+      { Fl_Box* o = new Fl_Box(10, 321, 140, 20);
         Fl_Group::current()->resizable(o);
       } // Fl_Box* o
       o->end();
     } // Fl_Group* o
     declblock_panel->set_modal();
+    declblock_panel->size_range(300, 355);
     o->size_range(o->w(), o->h(), Fl::w(), o->h());
     declblock_panel->end();
   } // Fl_Double_Window* declblock_panel
diff --git fluid/function_panel.fl fluid/function_panel.fl
index a83018d..6e153de 100644
--- fluid/function_panel.fl
+++ fluid/function_panel.fl
@@ -2,6 +2,11 @@
 version 1.0400
 header_name {.h}
 code_name {.cxx}
+snap {
+  ver 1
+  current_suite FLTK
+  current_preset 1
+}
 comment {//
 // Code dialogs for the Fast Light Tool Kit (FLTK).
 //
@@ -51,7 +56,7 @@ Function {make_function_panel()} {open
 } {
   Fl_Window function_panel {
     label {Function/Method Properties}
-    xywh {540 418 343 232} type Double resizable modal visible
+    xywh {540 418 343 232} type Double align 80 resizable modal visible
   } {
     Fl_Group {} {open
       xywh {10 10 270 20}
@@ -207,55 +212,72 @@ Function {make_codeblock_panel()} {open
 Function {make_declblock_panel()} {open
 } {
   Fl_Window declblock_panel {
-    label {Declaration Block Properties}
-    xywh {806 564 300 135} type Double labelsize 11 hide resizable
-    code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal
+    label {Declaration Block Properties} open
+    xywh {645 452 300 355} type Double labelsize 11 align 80 resizable
+    code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal size_range {300 355 0 0} visible
   } {
+    Fl_Input declblock_before_input {
+      label {Start Code:}
+      tooltip {\#ifdef or similar conditional declaration block.} xywh {10 23 280 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11
+    }
+    Fl_Box {} {
+      label {"\\n...child code...\\n" is inserted here}
+      xywh {10 48 280 20} labelsize 11
+    }
+    Fl_Input declblock_after_input {
+      label {End Code:}
+      tooltip {\#endif or similar declaration code block.} xywh {10 80 280 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11
+    }
     Fl_Group {} {open
-      xywh {10 10 280 20}
+      xywh {10 105 280 120}
     } {
-      Fl_Choice declblock_public_choice {open
-        tooltip {Change widget accessibility.} xywh {10 10 140 20} down_box BORDER_BOX labelsize 11 when 0 textsize 11
-      } {
-        MenuItem {} {
-          label {in source code only}
-          user_data 0 user_data_type long
-          xywh {25 25 100 20} labelsize 11
-        }
-        MenuItem {} {
-          label {in header and source}
-          user_data 1 user_data_type long
-          xywh {25 25 100 20} labelsize 11
-        }
+      Fl_Box {} {
+        label {Enclose code generated by children in source file:}
+        xywh {10 105 270 20} labelsize 11 align 20
       }
-      Fl_Light_Button declblock_public_button_x {
-        label public
-        tooltip {Make the declaration publicly accessible.} xywh {10 10 60 20} labelsize 11 when 0 hide
+      Fl_Check_Button declblock_code_source {
+        label implementations
+        xywh {20 125 260 20} down_box DOWN_BOX labelsize 11
+      }
+      Fl_Check_Button declblock_static_source {
+        label {static initializations and callbacks}
+        xywh {20 145 260 20} down_box DOWN_BOX labelsize 11
       }
       Fl_Box {} {
-        xywh {155 10 135 20} resizable
+        label {Enclose code in header file:}
+        xywh {10 165 270 20} labelsize 11 align 20
+      }
+      Fl_Check_Button declblock_code_header {
+        label {forward declarations}
+        xywh {20 185 260 20} down_box DOWN_BOX labelsize 11
+      }
+      Fl_Check_Button declblock_static_header {
+        label {preprecessor and callback declarations}
+        xywh {20 205 260 20} down_box DOWN_BOX labelsize 11
+      }
+      Fl_Box {} {
+        xywh {280 105 10 120} labelsize 11 hide resizable
       }
     }
-    Fl_Input decl_before_input {
-      tooltip {\#ifdef or similar conditional declaration block.} xywh {10 40 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11 resizable
-    }
-    Fl_Input decl_after_input {
-      label {"\\n...child code...\\n" is inserted here}
-      tooltip {\#endif or similar declaration code block.} xywh {10 75 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11
+    Fl_Text_Editor declblock_comment_input {
+      label {Comment:}
+      tooltip {Declaration comment in Doxygen format} xywh {10 242 280 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
+      code0 {declblock_comment_input->buffer(new Fl_Text_Buffer());}
+      code1 {declblock_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);}
     }
-    Fl_Group {} {open
-      xywh {10 105 280 20}
+    Fl_Group {} {
+      xywh {10 321 280 20}
     } {
       Fl_Return_Button declblock_panel_ok {
         label OK
-        xywh {160 105 60 20} labelsize 11 hotspot
+        xywh {160 321 60 20} labelsize 11 hotspot
       }
       Fl_Button declblock_panel_cancel {
         label Cancel
-        xywh {230 105 60 20} shortcut 0xff1b labelsize 11
+        xywh {230 321 60 20} shortcut 0xff1b labelsize 11
       }
       Fl_Box {} {
-        xywh {10 105 140 20} resizable
+        xywh {10 321 140 20} resizable
       }
     }
   }
@@ -264,7 +286,7 @@ Function {make_declblock_panel()} {open
 Function {make_decl_panel()} {open
 } {
   Fl_Window decl_panel {
-    label {Declaration Properties} open selected
+    label {Declaration Properties}
     xywh {497 618 343 262} type Double align 80 resizable size_range {343 262 0 0} visible
   } {
     Fl_Group {} {
diff --git fluid/function_panel.h fluid/function_panel.h
index 71a5d51..34cb9fd 100644
--- fluid/function_panel.h
+++ fluid/function_panel.h
@@ -53,14 +53,17 @@ extern Fl_Return_Button *codeblock_panel_ok;
 extern Fl_Button *codeblock_panel_cancel;
 Fl_Double_Window* make_codeblock_panel();
 extern Fl_Double_Window *declblock_panel;
-extern Fl_Choice *declblock_public_choice;
-extern Fl_Light_Button *declblock_public_button_x;
-extern Fl_Input *decl_before_input;
-extern Fl_Input *decl_after_input;
+extern Fl_Input *declblock_before_input;
+extern Fl_Input *declblock_after_input;
+#include <FL/Fl_Check_Button.H>
+extern Fl_Check_Button *declblock_code_source;
+extern Fl_Check_Button *declblock_static_source;
+extern Fl_Check_Button *declblock_code_header;
+extern Fl_Check_Button *declblock_static_header;
+extern Fl_Text_Editor *declblock_comment_input;
 extern Fl_Return_Button *declblock_panel_ok;
 extern Fl_Button *declblock_panel_cancel;
 Fl_Double_Window* make_declblock_panel();
-extern Fl_Menu_Item menu_declblock_public_choice[];
 extern Fl_Double_Window *decl_panel;
 extern Fl_Choice *decl_choice;
 extern Fl_Choice *decl_class_choice;
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.