summaryrefslogtreecommitdiff
path: root/fluid/Fl_Widget_Type.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2025-03-07 16:34:35 +0100
committerMatthias Melcher <github@matthiasm.com>2025-03-07 16:34:48 +0100
commit1985aefc0e502048f92b91beef87c0dfbe669fed (patch)
treeaf62874def4590e437a47784b4428d975ceb262f /fluid/Fl_Widget_Type.cxx
parent42a04c064d4b31c3a85210311f3ada163c406a25 (diff)
Restructuring Fluid source files.
Diffstat (limited to 'fluid/Fl_Widget_Type.cxx')
-rw-r--r--fluid/Fl_Widget_Type.cxx3937
1 files changed, 0 insertions, 3937 deletions
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
deleted file mode 100644
index b92ef53cc..000000000
--- a/fluid/Fl_Widget_Type.cxx
+++ /dev/null
@@ -1,3937 +0,0 @@
-//
-// Widget type code for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2024 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:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-#include "Fl_Widget_Type.h"
-
-#include "fluid.h"
-#include "Fl_Window_Type.h"
-#include "Fl_Group_Type.h"
-#include "Fl_Menu_Type.h"
-#include "Fl_Function_Type.h"
-#include "file.h"
-#include "code.h"
-#include "Fluid_Image.h"
-#include "settings_panel.h"
-#include "widget_panel.h"
-#include "undo.h"
-#include "mergeback.h"
-
-#include <FL/Fl.H>
-#include <FL/Fl_Group.H>
-#include <FL/Fl_Table.H>
-#include <FL/Fl_Input.H>
-#include <FL/fl_message.H>
-#include <FL/Fl_Slider.H>
-#include <FL/Fl_Spinner.H>
-#include <FL/Fl_Window.H>
-#include <FL/fl_show_colormap.H>
-#include "../src/flstring.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-// Make an Fl_Widget_Type subclass instance.
-// It figures out the automatic size and parent of the new widget,
-// creates the Fl_Widget (by calling the virtual function _make),
-// adds it to the Fl_Widget hierarchy, creates a new Fl_Type
-// instance, sets the widget pointers, and makes all the display
-// update correctly...
-
-int Fl_Widget_Type::is_widget() const {return 1;}
-int Fl_Widget_Type::is_public() const {return public_;}
-
-const char* subclassname(Fl_Type* l) {
- if (l->is_a(ID_Menu_Bar)) {
- Fl_Menu_Bar_Type *mb = static_cast<Fl_Menu_Bar_Type*>(l);
- if (mb->is_sys_menu_bar())
- return mb->sys_menubar_name();
- }
- if (l->is_widget()) {
- Fl_Widget_Type* p = (Fl_Widget_Type*)l;
- const char* c = p->subclass();
- if (c) return c;
- if (l->is_class()) return "Fl_Group";
- if (p->o->type() == FL_DOUBLE_WINDOW) return "Fl_Double_Window";
- if (p->id() == ID_Input) {
- if (p->o->type() == FL_FLOAT_INPUT) return "Fl_Float_Input";
- if (p->o->type() == FL_INT_INPUT) return "Fl_Int_Input";
- }
- }
- return l->type_name();
-}
-
-// Return the ideal widget size...
-void
-Fl_Widget_Type::ideal_size(int &w, int &h) {
- w = 120;
- h = 100;
- Fd_Snap_Action::better_size(w, h);
-}
-
-/**
- Make a new Widget node.
- \param[in] strategy is Strategy::AS_LAST_CHILD or Strategy::AFTER_CURRENT
- \return new node
- */
-Fl_Type *Fl_Widget_Type::make(Strategy strategy) {
- Fl_Type *anchor = Fl_Type::current, *pp = anchor;
- if (pp && (strategy.placement() == Strategy::AFTER_CURRENT))
- pp = pp->parent;
- while (pp && !pp->is_a(ID_Group)) {
- anchor = pp;
- strategy.placement(Strategy::AFTER_CURRENT);
- pp = pp->parent;
- }
- if (!pp || !pp->is_true_widget() || !anchor->is_true_widget()) {
- fl_message("Please select a group widget or window");
- return 0;
- }
-
- Fl_Widget_Type* p = (Fl_Widget_Type*)pp;
- Fl_Widget_Type* q = (Fl_Widget_Type*)anchor;
-
- // Figure out a border between widget and window:
- int B = p->o->w()/2; if (p->o->h()/2 < B) B = p->o->h()/2; if (B>25) B = 25;
-
- int ULX,ULY; // parent's origin in window
- if (!p->is_a(ID_Window)) { // if it is a group, add corner
- ULX = p->o->x(); ULY = p->o->y();
- } else {
- ULX = ULY = 0;
- }
-
- // Figure out a position and size for the widget
- int X,Y,W,H;
- if (is_a(ID_Group)) { // fill the parent with the widget
- X = ULX+B;
- W = p->o->w()-B;
- Y = ULY+B;
- H = p->o->h()-B;
- } else if (q != p) { // copy position and size of current widget
- W = q->o->w();
- H = q->o->h();
- X = q->o->x()+W;
- Y = q->o->y();
- if (X+W > ULX+p->o->w()) {
- X = q->o->x();
- Y = q->o->y()+H;
- if (Y+H > ULY+p->o->h()) Y = ULY+B;
- }
- } else { // just make it small and square...
- X = ULX+B;
- Y = ULY+B;
- W = H = B;
- }
-
- // Construct the Fl_Type:
- Fl_Widget_Type *t = _make();
- if (!o) o = widget(0,0,100,100); // create template widget
- t->factory = this;
- // Construct the Fl_Widget:
- t->o = widget(X,Y,W,H);
- if (strategy.source() == Strategy::FROM_FILE)
- t->o->label(0);
- else if (t->o->label()) t->label(t->o->label()); // allow editing
- t->o->user_data((void*)t);
- // Put it in the parent:
- // ((Fl_Group *)(p->o))->add(t->o); (done by Fl_Type::add())
- // add to browser:
- t->add(anchor, strategy);
- t->redraw();
- return t;
-}
-
-void Fl_Widget_Type::setimage(Fluid_Image *i) {
- if (i == image || is_a(ID_Window)) return;
- if (image) image->decrement();
- if (i) i->increment();
- image = i;
- if (i) {
- i->image(o);
- if (o->image() && (scale_image_w_ || scale_image_h_)) {
- int iw = scale_image_w_>0 ? scale_image_w_ : o->image()->data_w();
- int ih = scale_image_h_>0 ? scale_image_h_ : o->image()->data_h();
- o->image()->scale(iw, ih, 0, 1);
- }
- } else {
- o->image(0);
- //scale_image_w_ = scale_image_h_ = 0;
- }
- redraw();
-}
-
-void Fl_Widget_Type::setinactive(Fluid_Image *i) {
- if (i == inactive || is_a(ID_Window)) return;
- if (inactive) inactive->decrement();
- if (i) i->increment();
- inactive = i;
- if (i) {
- i->deimage(o);
- if (o->deimage()) {
- int iw = scale_deimage_w_>0 ? scale_deimage_w_ : o->deimage()->data_w();
- int ih = scale_deimage_h_>0 ? scale_deimage_h_ : o->deimage()->data_h();
- o->deimage()->scale(iw, ih, 0, 1);
- }
- } else {
- o->deimage(0);
- //scale_deimage_w_ = scale_deimage_h_ = 0;
- }
- redraw();
-}
-
-void Fl_Widget_Type::setlabel(const char *n) {
- o->label(n);
- redraw();
-}
-
-Fl_Widget_Type::Fl_Widget_Type()
-: override_visible_(0)
-{
- for (int n=0; n<NUM_EXTRA_CODE; n++) {extra_code_[n] = 0; }
- subclass_ = 0;
- hotspot_ = 0;
- tooltip_ = 0;
- image_name_ = 0;
- inactive_name_ = 0;
- image = 0;
- inactive = 0;
- o = 0;
- public_ = 1;
- bind_image_ = 0;
- compress_image_ = 1;
- bind_deimage_ = 0;
- compress_deimage_ = 1;
- scale_image_w_ = 0;
- scale_image_h_ = 0;
- scale_deimage_w_ = 0;
- scale_deimage_h_ = 0;
-}
-
-Fl_Widget_Type::~Fl_Widget_Type() {
- if (o) {
- Fl_Window *win = o->window();
- delete o;
- if (win)
- win->redraw();
- }
- if (subclass_) free((void*)subclass_);
- if (tooltip_) free((void*)tooltip_);
- if (image_name_) {
- free((void*)image_name_);
- if (image) image->decrement();
- }
- if (inactive_name_) {
- free((void*)inactive_name_);
- if (inactive) inactive->decrement();
- }
- for (int n=0; n<NUM_EXTRA_CODE; n++) {
- if (extra_code_[n]) free((void*) extra_code_[n]);
- }
-}
-
-void Fl_Widget_Type::extra_code(int m,const char *n) {
- storestring(n,extra_code_[m]);
-}
-
-extern void redraw_browser();
-void Fl_Widget_Type::subclass(const char *n) {
- if (storestring(n,subclass_) && visible)
- redraw_browser();
-}
-
-void Fl_Widget_Type::tooltip(const char *n) {
- storestring(n,tooltip_);
- o->tooltip(n);
-}
-
-void Fl_Widget_Type::image_name(const char *n) {
- setimage(Fluid_Image::find(n));
- storestring(n,image_name_);
-}
-
-void Fl_Widget_Type::inactive_name(const char *n) {
- setinactive(Fluid_Image::find(n));
- storestring(n,inactive_name_);
-}
-
-void Fl_Widget_Type::redraw() {
- Fl_Type *t = this;
- if (is_a(ID_Menu_Item)) {
- // find the menu button that parents this menu:
- do t = t->parent; while (t && t->is_a(ID_Menu_Item));
- // kludge to cause build_menu to be called again:
- if (t)
- t->add_child(0, 0);
- } else {
- while (t->parent && t->parent->is_widget()) t = t->parent;
- ((Fl_Widget_Type*)t)->o->redraw();
- }
-}
-
-// the recursive part sorts all children, returns pointer to next:
-Fl_Type *sort(Fl_Type *parent) {
- Fl_Type *f,*n=0;
- for (f = parent ? parent->next : Fl_Type::first; ; f = n) {
- if (!f || (parent && f->level <= parent->level)) break;
- n = sort(f);
- if (!f->selected || !f->is_true_widget()) continue;
- Fl_Widget* fw = ((Fl_Widget_Type*)f)->o;
- Fl_Type *g; // we will insert before this
- for (g = parent ? parent->next : Fl_Type::first; g != f; g = g->next) {
- if (!g->selected || g->level > f->level) continue;
- Fl_Widget* gw = ((Fl_Widget_Type*)g)->o;
- if (gw->y() > fw->y()) break;
- if (gw->y() == fw->y() && gw->x() > fw->x()) break;
- }
- if (g != f) f->move_before(g);
- }
- if (parent)
- parent->layout_widget();
- return f;
-}
-
-////////////////////////////////////////////////////////////////
-// The control panels!
-
-Fl_Window *the_panel;
-
-// All the callbacks use the argument to indicate whether to load or store.
-// This avoids the need for pointers to all the widgets, and keeps the
-// code localized in the callbacks.
-// A value of LOAD means to load. The hope is that this will not collide
-// with any actual useful values for the argument. I also use this to
-// initialized parts of the widget that are nyi by fluid.
-
-Fl_Widget_Type *current_widget; // one of the selected ones
-void* const LOAD = (void *)"LOAD"; // "magic" pointer to indicate that we need to load values into the dialog
-static int numselected; // number selected
-static int haderror;
-
-void name_cb(Fl_Input* o, void *v) {
- if (v == LOAD) {
- static char buf[1024];
- if (numselected != 1) {
- snprintf(buf, sizeof(buf), "Widget Properties (%d widgets)", numselected);
- o->hide();
- } else {
- o->value(current_widget->name());
- o->show();
- snprintf(buf, sizeof(buf), "%s Properties", current_widget->title());
- }
-
- the_panel->label(buf);
- } else {
- if (numselected == 1) {
- current_widget->name(o->value());
- // I don't update window title, as it probably is being closed
- // and wm2 (a window manager) barfs if you retitle and then
- // hide a window:
- // ((Fl_Window*)(o->parent()->parent()->parent()))->label(current_widget->title());
- }
- }
-}
-
-void name_public_member_cb(Fl_Choice* i, void* v) {
- if (v == LOAD) {
- i->value(current_widget->public_);
- if (current_widget->is_in_class()) i->show(); else i->hide();
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type *w = ((Fl_Widget_Type*)o);
- if (w->is_in_class()) {
- w->public_ = i->value();
- } else {
- // if this is not in a class, it can be only private or public
- w->public_ = (i->value()>0);
- }
- mod = 1;
- }
- }
- if (mod) {
- set_modflag(1);
- redraw_browser();
- }
- }
-}
-
-void name_public_cb(Fl_Choice* i, void* v) {
- if (v == LOAD) {
- i->value(current_widget->public_>0);
- if (current_widget->is_in_class()) i->hide(); else i->show();
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->public_ = i->value();
- mod = 1;
- }
- }
- if (mod) {
- set_modflag(1);
- redraw_browser();
- }
- }
-}
-
-/* Treating UNDO for text widget.
-
- Goal: we want to continuously update the UI while the user is typing text
- (changing the label, in this case). Code View does deferred updates, and
- the widget browser and widget panel update on every keystroke. At the same
- time, we want to limit undo actions to few and logical units.
-
- Caveats:
-
- 1: the text widget has its own undo handling for the text field, but we may want to do a global undo
- 2: every o->label() call will create an undo entry, but we want only one single event for all selected widgets
- 3: we want a single undo for the entire editing phase, but still propagate changes as they happen
-
- The edit process has these main states:
-
- 1: starting to edit [first_change==1 && !unfocus]; we must create a single undo checkpoint before anything changes
- 2: continue editing [first_change==0 && !unfocus]; we must suspend any undo checkpoints
- 3: done editing, unfocus [first_change==0 && unfocus]; we must make sure that undo checkpoints are enabled again
- 4: losing focus without editing [first_change==1 && unfocus]; don't create and checkpoints
-
- We must also check:
- 1: changing focus without changing text (works)
- 2: copy and paste, drag and drop operations (works)
- 3: save operation without unfocus event (works)
- */
-void label_cb(Fl_Input* i, void *v) {
- static int first_change = 1;
- if (v == LOAD) {
- i->value(current_widget->label());
- first_change = 1;
- } else {
- if (i->changed()) {
- undo_suspend();
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- if (!mod) {
- if (first_change) {
- undo_resume();
- undo_checkpoint();
- undo_suspend();
- first_change = 0;
- }
- mod = 1;
- }
- o->label(i->value());
- }
- }
- undo_resume();
- if (mod) set_modflag(1);
- }
- int r = (int)Fl::callback_reason();
- if ( (r == FL_REASON_LOST_FOCUS) || (r == FL_REASON_ENTER_KEY) )
- first_change = 1;
- }
-}
-
-static Fl_Input *image_input;
-
-void image_cb(Fl_Input* i, void *v) {
- if (v == LOAD) {
- image_input = i;
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
- i->activate();
- i->value(((Fl_Widget_Type*)current_widget)->image_name());
- } else i->deactivate();
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->image_name(i->value());
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void image_browse_cb(Fl_Button* b, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window))
- b->activate();
- else
- b->deactivate();
- } else {
- int mod = 0;
- if (ui_find_image(image_input->value())) {
- image_input->value(ui_find_image_name);
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->image_name(ui_find_image_name);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
- }
-}
-
-void bind_image_cb(Fl_Check_Button* b, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
- b->activate();
- b->value(current_widget->bind_image_);
- } else {
- b->deactivate();
- }
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->bind_image_ = b->value();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void compress_image_cb(Fl_Check_Button* b, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
- b->activate();
- b->value(!current_widget->compress_image_);
- } else {
- b->deactivate();
- }
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->compress_image_ = !b->value();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-static Fl_Input *inactive_input;
-
-void inactive_cb(Fl_Input* i, void *v) {
- if (v == LOAD) {
- inactive_input = i;
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
- i->activate();
- i->value(((Fl_Widget_Type*)current_widget)->inactive_name());
- } else i->deactivate();
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->inactive_name(i->value());
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void inactive_browse_cb(Fl_Button* b, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window))
- b->activate();
- else
- b->deactivate();
- } else {
- int mod = 0;
- if (ui_find_image(inactive_input->value())) {
- inactive_input->value(ui_find_image_name);
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->inactive_name(ui_find_image_name);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
- }
-}
-
-void bind_deimage_cb(Fl_Check_Button* b, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
- b->activate();
- b->value(current_widget->bind_deimage_);
- } else {
- b->deactivate();
- }
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->bind_deimage_ = b->value();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void compress_deimage_cb(Fl_Check_Button* b, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget() && !current_widget->is_a(ID_Window)) {
- b->activate();
- b->value(!current_widget->compress_deimage_);
- } else {
- b->deactivate();
- }
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->compress_deimage_ = !b->value();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void tooltip_cb(Fl_Input* i, void *v) {
- if (v == LOAD) {
- if (current_widget->is_widget()) {
- i->activate();
- i->value(((Fl_Widget_Type*)current_widget)->tooltip());
- } else i->deactivate();
- } else {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- ((Fl_Widget_Type*)o)->tooltip(i->value());
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-Fluid_Coord_Input *x_input, *y_input, *w_input, *h_input;
-
-static int widget_i = 0;
-
-static int vars_i_cb(const Fluid_Coord_Input*, void *v) {
- return widget_i;
-}
-
-static int vars_x_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = (Fl_Type*)v;
- if (t->is_widget())
- return ((Fl_Widget_Type*)t)->o->x();
- return 0;
-}
-
-static int vars_y_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = (Fl_Type*)v;
- if (t->is_widget())
- return ((Fl_Widget_Type*)t)->o->y();
- return 0;
-}
-
-static int vars_w_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = (Fl_Type*)v;
- if (t->is_widget())
- return ((Fl_Widget_Type*)t)->o->w();
- return 0;
-}
-
-static int vars_h_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = (Fl_Type*)v;
- if (t->is_widget())
- return ((Fl_Widget_Type*)t)->o->h();
- return 0;
-}
-
-static int vars_px_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->parent;
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->x();
- return 0;
-}
-
-static int vars_py_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->parent;
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->y();
- return 0;
-}
-
-static int vars_pw_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->parent;
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->w();
- return 0;
-}
-
-static int vars_ph_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->parent;
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->h();
- return 0;
-}
-
-static int vars_sx_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->prev_sibling();
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->x();
- return 0;
-}
-
-static int vars_sy_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->prev_sibling();
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->y();
- return 0;
-}
-
-static int vars_sw_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->prev_sibling();
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->w();
- return 0;
-}
-
-static int vars_sh_cb(const Fluid_Coord_Input*, void *v) {
- Fl_Type *t = ((Fl_Type*)v)->prev_sibling();
- if (t && t->is_widget())
- return ((Fl_Widget_Type*)t)->o->h();
- return 0;
-}
-
-static int bbox_x, bbox_y, bbox_r, bbox_b;
-static int bbox_min(int a, int b) { return (a<b) ? a : b; }
-static int bbox_max(int a, int b) { return (a>b) ? a : b; }
-
-static void calculate_bbox(Fl_Type *p) {
- char first = 1;
- bbox_x = bbox_y = bbox_r = bbox_b = 0;
- for (p=p->first_child(); p; p=p->next_sibling()) {
- if (p->is_widget()) {
- Fl_Widget *o = ((Fl_Widget_Type*)p)->o;
- if (first) {
- bbox_x = o->x(); bbox_y = o->y();
- bbox_r = o->x() + o->w(); bbox_b = o->y() + o->h();
- first = 0;
- } else {
- bbox_x = bbox_min(bbox_x, o->x());
- bbox_y = bbox_min(bbox_y, o->y());
- bbox_r = bbox_max(bbox_r, o->x() + o->w());
- bbox_b = bbox_max(bbox_b, o->y() + o->h());
- }
- }
- }
-}
-
-static int vars_cx_cb(const Fluid_Coord_Input*, void *v) {
- calculate_bbox((Fl_Type*)v);
- return bbox_x;
-}
-
-static int vars_cy_cb(const Fluid_Coord_Input*, void *v) {
- calculate_bbox((Fl_Type*)v);
- return bbox_y;
-}
-
-static int vars_cw_cb(const Fluid_Coord_Input*, void *v) {
- calculate_bbox((Fl_Type*)v);
- return bbox_r - bbox_x;
-}
-
-static int vars_ch_cb(const Fluid_Coord_Input*, void *v) {
- calculate_bbox((Fl_Type*)v);
- return bbox_b - bbox_y;
-}
-
-Fluid_Coord_Input_Vars widget_vars[] = {
- { "i", vars_i_cb }, // zero based counter of selected widgets
- { "x", vars_x_cb }, // position and size of current widget
- { "y", vars_y_cb },
- { "w", vars_w_cb },
- { "h", vars_h_cb },
- { "px", vars_px_cb }, // position and size of parent widget
- { "py", vars_py_cb },
- { "pw", vars_pw_cb },
- { "ph", vars_ph_cb },
- { "sx", vars_sx_cb }, // position and size of previous sibling
- { "sy", vars_sy_cb },
- { "sw", vars_sw_cb },
- { "sh", vars_sh_cb },
- { "cx", vars_cx_cb }, // position and size of bounding box of all children
- { "cy", vars_cy_cb },
- { "cw", vars_cw_cb },
- { "ch", vars_ch_cb },
- { 0 }
-};
-
-void x_cb(Fluid_Coord_Input *i, void *v) {
- if (v == LOAD) {
- x_input = i;
- if (current_widget->is_true_widget()) {
- i->value(((Fl_Widget_Type *)current_widget)->o->x());
- x_input->activate();
- } else x_input->deactivate();
- } else {
- undo_checkpoint();
- widget_i = 0;
- int mod = 0;
- int v = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget *w = ((Fl_Widget_Type *)o)->o;
- i->variables(widget_vars, o);
- v = i->value();
- w->resize(v, w->y(), w->w(), w->h());
- if (w->window()) w->window()->redraw();
- widget_i++;
- mod = 1;
- }
- }
- if (mod) {
- set_modflag(1);
- i->value(v); // change the displayed value to the result of the last
- // calculation. Keep the formula if it was not used.
- }
- }
-}
-
-void y_cb(Fluid_Coord_Input *i, void *v) {
- if (v == LOAD) {
- y_input = i;
- if (current_widget->is_true_widget()) {
- i->value(((Fl_Widget_Type *)current_widget)->o->y());
- y_input->activate();
- } else y_input->deactivate();
- } else {
- undo_checkpoint();
- widget_i = 0;
- int mod = 0;
- int v = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget *w = ((Fl_Widget_Type *)o)->o;
- i->variables(widget_vars, o);
- v = i->value();
- w->resize(w->x(), v, w->w(), w->h());
- if (w->window()) w->window()->redraw();
- widget_i++;
- mod = 1;
- }
- }
- if (mod) {
- set_modflag(1);
- i->value(v);
- }
- }
-}
-
-void w_cb(Fluid_Coord_Input *i, void *v) {
- if (v == LOAD) {
- w_input = i;
- if (current_widget->is_true_widget()) {
- i->value(((Fl_Widget_Type *)current_widget)->o->w());
- w_input->activate();
- } else w_input->deactivate();
- } else {
- undo_checkpoint();
- widget_i = 0;
- int mod = 0;
- int v = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget *w = ((Fl_Widget_Type *)o)->o;
- i->variables(widget_vars, o);
- v = i->value();
- w->resize(w->x(), w->y(), v, w->h());
- if (w->window()) w->window()->redraw();
- widget_i++;
- mod = 1;
- }
- }
- if (mod) {
- set_modflag(1);
- i->value(v);
- }
- }
-}
-
-void h_cb(Fluid_Coord_Input *i, void *v) {
- if (v == LOAD) {
- h_input = i;
- if (current_widget->is_true_widget()) {
- i->value(((Fl_Widget_Type *)current_widget)->o->h());
- h_input->activate();
- } else h_input->deactivate();
- } else {
- undo_checkpoint();
- widget_i = 0;
- int mod = 0;
- int v = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget *w = ((Fl_Widget_Type *)o)->o;
- i->variables(widget_vars, o);
- v = i->value();
- w->resize(w->x(), w->y(), w->w(), v);
- if (w->window()) w->window()->redraw();
- widget_i++;
- mod = 1;
- }
- }
- if (mod) {
- set_modflag(1);
- i->value(v);
- }
- }
-}
-
-void wc_relative_cb(Fl_Choice *i, void *v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Widget_Class)) {
- i->show();
- i->value(((Fl_Widget_Class_Type *)current_widget)->wc_relative);
- } else {
- i->hide();
- }
- } else {
- int mod = 0;
- undo_checkpoint();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && current_widget->is_a(ID_Widget_Class)) {
- Fl_Widget_Class_Type *t = (Fl_Widget_Class_Type *)o;
- t->wc_relative = i->value();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-// turn number to string or string to number for saving to file:
-// does not work for hierarchical menus!
-
-const char *item_name(Fl_Menu_Item* m, int i) {
- if (m) {
- while (m->label()) {
- if (m->argument() == i) return m->label();
- m++;
- }
- }
- static char buffer[20];
- sprintf(buffer, "%d", i);
- return buffer;
-}
-int item_number(Fl_Menu_Item* m, const char* i) {
- if (!i)
- return 0;
- if (m && i) {
- if (i[0]=='F' && i[1]=='L' && i[2]=='_') i += 3;
- while (m->label()) {
- if (!strcmp(m->label(), i)) return int(m->argument());
- m++;
- }
- }
- return atoi(i);
-}
-
-#define ZERO_ENTRY 1000
-
-Fl_Menu_Item boxmenu[] = {
-{"NO_BOX",0,0,(void *)ZERO_ENTRY},
-{"boxes",0,0,0,FL_SUBMENU},
-{"UP_BOX",0,0,(void *)FL_UP_BOX},
-{"DOWN_BOX",0,0,(void *)FL_DOWN_BOX},
-{"FLAT_BOX",0,0,(void *)FL_FLAT_BOX},
-{"BORDER_BOX",0,0,(void *)FL_BORDER_BOX},
-{"THIN_UP_BOX",0,0,(void *)FL_THIN_UP_BOX},
-{"THIN_DOWN_BOX",0,0,(void *)FL_THIN_DOWN_BOX},
-{"ENGRAVED_BOX",0,0,(void *)FL_ENGRAVED_BOX},
-{"EMBOSSED_BOX",0,0,(void *)FL_EMBOSSED_BOX},
-{"ROUND_UP_BOX",0,0,(void *)FL_ROUND_UP_BOX},
-{"ROUND_DOWN_BOX",0,0,(void *)FL_ROUND_DOWN_BOX},
-{"DIAMOND_UP_BOX",0,0,(void *)FL_DIAMOND_UP_BOX},
-{"DIAMOND_DOWN_BOX",0,0,(void *)FL_DIAMOND_DOWN_BOX},
-{"SHADOW_BOX",0,0,(void *)FL_SHADOW_BOX},
-{"ROUNDED_BOX",0,0,(void *)FL_ROUNDED_BOX},
-{"RSHADOW_BOX",0,0,(void *)FL_RSHADOW_BOX},
-{"RFLAT_BOX",0,0,(void *)FL_RFLAT_BOX},
-{"OVAL_BOX",0,0,(void *)FL_OVAL_BOX},
-{"OSHADOW_BOX",0,0,(void *)FL_OSHADOW_BOX},
-{"OFLAT_BOX",0,0,(void *)FL_OFLAT_BOX},
-{"PLASTIC_UP_BOX",0,0,(void *)FL_PLASTIC_UP_BOX},
-{"PLASTIC_DOWN_BOX",0,0,(void *)FL_PLASTIC_DOWN_BOX},
-{"PLASTIC_THIN_UP_BOX",0,0,(void *)FL_PLASTIC_THIN_UP_BOX},
-{"PLASTIC_THIN_DOWN_BOX",0,0,(void *)FL_PLASTIC_THIN_DOWN_BOX},
-{"PLASTIC_ROUND_UP_BOX",0,0,(void *)FL_PLASTIC_ROUND_UP_BOX},
-{"PLASTIC_ROUND_DOWN_BOX",0,0,(void *)FL_PLASTIC_ROUND_DOWN_BOX},
-{"GTK_UP_BOX",0,0,(void *)FL_GTK_UP_BOX},
-{"GTK_DOWN_BOX",0,0,(void *)FL_GTK_DOWN_BOX},
-{"GTK_THIN_UP_BOX",0,0,(void *)FL_GTK_THIN_UP_BOX},
-{"GTK_THIN_DOWN_BOX",0,0,(void *)FL_GTK_THIN_DOWN_BOX},
-{"GTK_ROUND_UP_BOX",0,0,(void *)FL_GTK_ROUND_UP_BOX},
-{"GTK_ROUND_DOWN_BOX",0,0,(void *)FL_GTK_ROUND_DOWN_BOX},
-{"GLEAM_UP_BOX",0,0,(void *)FL_GLEAM_UP_BOX},
-{"GLEAM_DOWN_BOX",0,0,(void *)FL_GLEAM_DOWN_BOX},
-{"GLEAM_THIN_UP_BOX",0,0,(void *)FL_GLEAM_THIN_UP_BOX},
-{"GLEAM_THIN_DOWN_BOX",0,0,(void *)FL_GLEAM_THIN_DOWN_BOX},
-{"GLEAM_ROUND_UP_BOX",0,0,(void *)FL_GLEAM_ROUND_UP_BOX},
-{"GLEAM_ROUND_DOWN_BOX",0,0,(void *)FL_GLEAM_ROUND_DOWN_BOX},
-{"OXY_UP_BOX",0,0,(void *)FL_OXY_UP_BOX},
-{"OXY_DOWN_BOX",0,0,(void *)FL_OXY_DOWN_BOX},
-{"OXY_THIN_UP_BOX",0,0,(void *)FL_OXY_THIN_UP_BOX},
-{"OXY_THIN_DOWN_BOX",0,0,(void *)FL_OXY_THIN_DOWN_BOX},
-{"OXY_ROUND_UP_BOX",0,0,(void *)FL_OXY_ROUND_UP_BOX},
-{"OXY_ROUND_DOWN_BOX",0,0,(void *)FL_OXY_ROUND_DOWN_BOX},
-{"OXY_BUTTON_UP_BOX",0,0,(void *)FL_OXY_BUTTON_UP_BOX},
-{"OXY_BUTTON_DOWN_BOX",0,0,(void *)FL_OXY_BUTTON_DOWN_BOX},
-{0},
-{"frames",0,0,0,FL_SUBMENU},
-{"UP_FRAME",0,0,(void *)FL_UP_FRAME},
-{"DOWN_FRAME",0,0,(void *)FL_DOWN_FRAME},
-{"THIN_UP_FRAME",0,0,(void *)FL_THIN_UP_FRAME},
-{"THIN_DOWN_FRAME",0,0,(void *)FL_THIN_DOWN_FRAME},
-{"ENGRAVED_FRAME",0,0,(void *)FL_ENGRAVED_FRAME},
-{"EMBOSSED_FRAME",0,0,(void *)FL_EMBOSSED_FRAME},
-{"BORDER_FRAME",0,0,(void *)FL_BORDER_FRAME},
-{"SHADOW_FRAME",0,0,(void *)FL_SHADOW_FRAME},
-{"ROUNDED_FRAME",0,0,(void *)FL_ROUNDED_FRAME},
-{"OVAL_FRAME",0,0,(void *)FL_OVAL_FRAME},
-{"PLASTIC_UP_FRAME",0,0,(void *)FL_PLASTIC_UP_FRAME},
-{"PLASTIC_DOWN_FRAME",0,0,(void *)FL_PLASTIC_DOWN_FRAME},
-{"GTK_UP_FRAME",0,0,(void *)FL_GTK_UP_FRAME},
-{"GTK_DOWN_FRAME",0,0,(void *)FL_GTK_DOWN_FRAME},
-{"GTK_THIN_UP_FRAME",0,0,(void *)FL_GTK_THIN_UP_FRAME},
-{"GTK_THIN_DOWN_FRAME",0,0,(void *)FL_GTK_THIN_DOWN_FRAME},
-{"GLEAM_UP_FRAME",0,0,(void *)FL_GLEAM_UP_FRAME},
-{"GLEAM_DOWN_FRAME",0,0,(void *)FL_GLEAM_DOWN_FRAME},
-{"OXY_UP_FRAME",0,0,(void *)FL_OXY_UP_FRAME},
-{"OXY_DOWN_FRAME",0,0,(void *)FL_OXY_DOWN_FRAME},
-{"OXY_THIN_UP_FRAME",0,0,(void *)FL_OXY_THIN_UP_FRAME},
-{"OXY_THIN_DOWN_FRAME",0,0,(void *)FL_OXY_THIN_DOWN_FRAME},
-{0},
-{0}};
-
-const char *boxname(int i) {
- if (!i) i = ZERO_ENTRY;
- for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++)
- if (boxmenu[j].argument() == i) return boxmenu[j].label();
- return 0;
-}
-
-int boxnumber(const char *i) {
- if (i[0]=='F' && i[1]=='L' && i[2]=='_') i += 3;
- for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++)
- if (boxmenu[j].label() && !strcmp(boxmenu[j].label(), i)) {
- return int(boxmenu[j].argument());
- }
- return 0;
-}
-
-void box_cb(Fl_Choice* i, void *v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- int n = current_widget->o->box(); if (!n) n = ZERO_ENTRY;
- for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++)
- if (boxmenu[j].argument() == n) {i->value(j); break;}
- } else {
- int mod = 0;
- int m = i->value();
- int n = int(boxmenu[m].argument());
- if (!n) return; // should not happen
- if (n == ZERO_ENTRY) n = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->box((Fl_Boxtype)n);
- q->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void down_box_cb(Fl_Choice* i, void *v) {
- if (v == LOAD) {
- int n;
- if (current_widget->is_a(ID_Button))
- n = ((Fl_Button*)(current_widget->o))->down_box();
- else if (current_widget->is_a(ID_Input_Choice))
- n = ((Fl_Input_Choice*)(current_widget->o))->down_box();
- else if (current_widget->is_a(ID_Menu_Manager_))
- n = ((Fl_Menu_*)(current_widget->o))->down_box();
- else {
- i->deactivate(); return;
- }
- i->activate();
- if (!n) n = ZERO_ENTRY;
- for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++)
- if (boxmenu[j].argument() == n) {i->value(j); break;}
- } else {
- int mod = 0;
- int m = i->value();
- int n = int(boxmenu[m].argument());
- if (!n) return; // should not happen
- if (n == ZERO_ENTRY) n = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected) {
- if (o->is_a(ID_Button)) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- ((Fl_Button*)(q->o))->down_box((Fl_Boxtype)n);
- if (((Fl_Button*)(q->o))->value()) q->redraw();
- } else if (o->is_a(ID_Input_Choice)) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- ((Fl_Input_Choice*)(q->o))->down_box((Fl_Boxtype)n);
- } else if (o->is_a(ID_Menu_Manager_)) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- ((Fl_Menu_*)(q->o))->down_box((Fl_Boxtype)n);
- }
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void compact_cb(Fl_Light_Button* i, void* v) {
- if (v == LOAD) {
- uchar n;
- if (current_widget->is_a(ID_Button) && !current_widget->is_a(ID_Menu_Item)) {
- n = ((Fl_Button*)(current_widget->o))->compact();
- i->value(n);
- i->show();
- } else {
- i->hide();
- }
- } else {
- int mod = 0;
- uchar n = (uchar)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Button) && !o->is_a(ID_Menu_Item)) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- uchar v = ((Fl_Button*)(q->o))->compact();
- if (n != v) {
- if (!mod) {
- mod = 1;
- undo_checkpoint();
- }
- ((Fl_Button*)(q->o))->compact(n);
- q->redraw();
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-
-
-////////////////////////////////////////////////////////////////
-
-Fl_Menu_Item whenmenu[] = {
- // set individual bits
- {"FL_WHEN_CHANGED",0,0,(void*)FL_WHEN_CHANGED, FL_MENU_TOGGLE},
- {"FL_WHEN_NOT_CHANGED",0,0,(void*)FL_WHEN_NOT_CHANGED, FL_MENU_TOGGLE},
- {"FL_WHEN_RELEASE",0,0,(void*)FL_WHEN_RELEASE, FL_MENU_TOGGLE},
- {"FL_WHEN_ENTER_KEY",0,0,(void*)FL_WHEN_ENTER_KEY, FL_MENU_TOGGLE},
- {"FL_WHEN_CLOSED",0,0,(void*)FL_WHEN_CLOSED, FL_MENU_TOGGLE|FL_MENU_DIVIDER},
- // set bit combinations
- {"FL_WHEN_NEVER",0,0,(void*)FL_WHEN_NEVER},
- {"FL_WHEN_RELEASE_ALWAYS",0,0,(void*)FL_WHEN_RELEASE_ALWAYS},
- {"FL_WHEN_ENTER_KEY_ALWAYS",0,0,(void*)FL_WHEN_ENTER_KEY_ALWAYS},
- {"FL_WHEN_ENTER_KEY_CHANGED",0,0,(void*)FL_WHEN_ENTER_KEY_CHANGED},
- {0}};
-
-
-static Fl_Menu_Item whensymbolmenu[] = {
- /* 0 */ {"FL_WHEN_NEVER",0,0,(void*)FL_WHEN_NEVER},
- /* 1 */ {"FL_WHEN_CHANGED",0,0,(void*)FL_WHEN_CHANGED},
- /* 2 */ {"FL_WHEN_NOT_CHANGED",0,0,(void*)FL_WHEN_NOT_CHANGED},
- /* 3 */ {"FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED",0,0,(void*)(FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED)},
- /* 4 */ {"FL_WHEN_RELEASE",0,0,(void*)FL_WHEN_RELEASE},
- /* 5 */ {"FL_WHEN_CHANGED | FL_WHEN_RELEASE",0,0,(void*)(FL_WHEN_CHANGED|FL_WHEN_RELEASE)},
- /* 6 */ {"FL_WHEN_RELEASE_ALWAYS",0,0,(void*)FL_WHEN_RELEASE_ALWAYS},
- /* 7 */ {"FL_WHEN_CHANGED | FL_WHEN_RELEASE_ALWAYS",0,0,(void*)(FL_WHEN_CHANGED|FL_WHEN_RELEASE_ALWAYS)},
- /* 8 */ {"FL_WHEN_ENTER_KEY",0,0,(void*)FL_WHEN_ENTER_KEY},
- /* 9 */ {"FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY",0,0,(void*)(FL_WHEN_CHANGED|FL_WHEN_ENTER_KEY)},
- /* 10 */ {"FL_WHEN_ENTER_KEY_ALWAYS",0,0,(void*)FL_WHEN_ENTER_KEY_ALWAYS},
- /* 11 */ {"FL_WHEN_ENTER_KEY_CHANGED",0,0,(void*)FL_WHEN_ENTER_KEY_CHANGED},
- /* 12 */ {"FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY",0,0,(void*)(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY)},
- /* 13 */ {"FL_WHEN_RELEASE | FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY",0,0,(void*)(FL_WHEN_RELEASE|FL_WHEN_CHANGED|FL_WHEN_ENTER_KEY)},
- /* 14 */ {"FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY_ALWAYS",0,0,(void*)(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY_ALWAYS)},
- /* 15 */ {"FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY_CHANGED",0,0,(void*)(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY_CHANGED)},
- {0}
-};
-
-// Return a text string representing the Fl_When value n
-const char* when_symbol_name(int n) {
- static char sym[128];
- if (n == FL_WHEN_CLOSED) {
- strcpy(sym, "FL_WHEN_CLOSED");
- } else {
- strcpy(sym, whensymbolmenu[n&15].label());
- if (n & FL_WHEN_CLOSED)
- strcat(sym, " | FL_WHEN_CLOSED");
- }
- return sym;
-}
-
-// Set the check marks in the "when()" menu according to the Fl_When value n
-void set_whenmenu(int n) {
- if (n&FL_WHEN_CHANGED) whenmenu[0].set(); else whenmenu[0].clear();
- if (n&FL_WHEN_NOT_CHANGED) whenmenu[1].set(); else whenmenu[1].clear();
- if (n&FL_WHEN_RELEASE) whenmenu[2].set(); else whenmenu[2].clear();
- if (n&FL_WHEN_ENTER_KEY) whenmenu[3].set(); else whenmenu[3].clear();
- if (n&FL_WHEN_CLOSED) whenmenu[4].set(); else whenmenu[4].clear();
-}
-
-void when_cb(Fl_Menu_Button* i, void *v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- int n = current_widget->o->when();
- set_whenmenu(n);
- w_when_box->copy_label(when_symbol_name(n));
- } else {
- int mod = 0;
- int n = 0;
- if (i->mvalue() && ((i->mvalue()->flags & FL_MENU_TOGGLE) == 0) ) {
- n = (int)i->mvalue()->argument();
- set_whenmenu(n);
- } else {
- if (whenmenu[0].value()) n |= FL_WHEN_CHANGED;
- if (whenmenu[1].value()) n |= FL_WHEN_NOT_CHANGED;
- if (whenmenu[2].value()) n |= FL_WHEN_RELEASE;
- if (whenmenu[3].value()) n |= FL_WHEN_ENTER_KEY;
- if (whenmenu[4].value()) n |= FL_WHEN_CLOSED;
- }
- w_when_box->copy_label(when_symbol_name(n));
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->when(n);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-uchar Fl_Widget_Type::resizable() const {
- if (is_a(ID_Window)) return ((Fl_Window*)o)->resizable() != 0;
- Fl_Group* p = (Fl_Group*)o->parent();
- if (p) return p->resizable() == o;
- else return 0;
-}
-
-void Fl_Widget_Type::resizable(uchar v) {
- if (v) {
- if (resizable()) return;
- if (is_a(ID_Window)) ((Fl_Window*)o)->resizable(o);
- else {
- Fl_Group* p = (Fl_Group*)o->parent();
- if (p) p->resizable(o);
- }
- } else {
- if (!resizable()) return;
- if (is_a(ID_Window)) {
- ((Fl_Window*)o)->resizable(0);
- } else {
- Fl_Group* p = (Fl_Group*)o->parent();
- if (p) p->resizable(0);
- }
- }
-}
-
-void resizable_cb(Fl_Light_Button* i,void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;}
- if (numselected > 1) {i->deactivate(); return;}
- i->activate();
- i->value(current_widget->resizable());
- } else {
- undo_checkpoint();
- current_widget->resizable(i->value());
- set_modflag(1);
- }
-}
-
-void hotspot_cb(Fl_Light_Button* i,void* v) {
- if (v == LOAD) {
- if (numselected > 1) {i->deactivate(); return;}
- if (current_widget->is_a(ID_Menu_Item)) i->label("divider");
- else i->label("hotspot");
- i->activate();
- i->value(current_widget->hotspot());
- } else {
- undo_checkpoint();
- current_widget->hotspot(i->value());
- if (current_widget->is_a(ID_Menu_Item)) {
- current_widget->redraw();
- return;
- }
- if (i->value()) {
- Fl_Type *p = current_widget->parent;
- if (!p || !p->is_widget()) return;
- while (!p->is_a(ID_Window)) p = p->parent;
- for (Fl_Type *o = p->next; o && o->level > p->level; o = o->next) {
- if (o->is_widget() && o != current_widget)
- ((Fl_Widget_Type*)o)->hotspot(0);
- }
- }
- set_modflag(1);
- }
-}
-
-void visible_cb(Fl_Light_Button* i, void* v) {
- if (v == LOAD) {
- i->value(current_widget->o->visible());
- if (current_widget->is_a(ID_Window)) i->deactivate();
- else i->activate();
- } else {
- int mod = 0;
- int n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- if (!mod) {
- mod = 1;
- undo_checkpoint();
- }
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- n ? q->o->show() : q->o->hide();
- q->redraw();
- if (n && q->parent && q->parent->type_name()) {
- if (q->parent->is_a(ID_Tabs)) {
- ((Fl_Tabs *)q->o->parent())->value(q->o);
- } else if (q->parent->is_a(ID_Wizard)) {
- ((Fl_Wizard *)q->o->parent())->value(q->o);
- }
- }
- }
- }
- if (mod) {
- set_modflag(1);
- redraw_browser();
- }
- }
-}
-
-void active_cb(Fl_Light_Button* i, void* v) {
- if (v == LOAD) {
- i->value(current_widget->o->active());
- if (current_widget->is_a(ID_Window)) i->deactivate();
- else i->activate();
- } else {
- int mod = 0;
- int n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- if (!mod) {
- mod = 1;
- undo_checkpoint();
- }
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- n ? q->o->activate() : q->o->deactivate();
- q->redraw();
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-Fl_Menu_Item fontmenu[] = {
- {"Helvetica"},
- {"Helvetica bold"},
- {"Helvetica italic"},
- {"Helvetica bold italic"},
- {"Courier"},
- {"Courier bold"},
- {"Courier italic"},
- {"Courier bold italic"},
- {"Times"},
- {"Times bold"},
- {"Times italic"},
- {"Times bold italic"},
- {"Symbol"},
- {"Terminal"},
- {"Terminal Bold"},
- {"Zapf Dingbats"},
- {NULL}
-};
-
-Fl_Menu_Item fontmenu_w_default[] = {
- {"<default>", 0, NULL, NULL, FL_MENU_DIVIDER},
- {"Helvetica"},
- {"Helvetica bold"},
- {"Helvetica italic"},
- {"Helvetica bold italic"},
- {"Courier"},
- {"Courier bold"},
- {"Courier italic"},
- {"Courier bold italic"},
- {"Times"},
- {"Times bold"},
- {"Times italic"},
- {"Times bold italic"},
- {"Symbol"},
- {"Terminal"},
- {"Terminal Bold"},
- {"Zapf Dingbats"},
- {NULL}
-};
-
-void labelfont_cb(Fl_Choice* i, void *v) {
- if (v == LOAD) {
- int n = current_widget->o->labelfont();
- if (n > 15) n = 0;
- i->value(n);
- } else {
- int mod = 0;
- int n = i->value();
- if (n <= 0) n = layout->labelfont;
- if (n <= 0) n = FL_HELVETICA;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->labelfont(n);
- q->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void labelsize_cb(Fl_Value_Input* i, void *v) {
- int n;
- if (v == LOAD) {
- n = current_widget->o->labelsize();
- } else {
- int mod = 0;
- n = int(i->value());
- if (n <= 0) n = layout->labelsize;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->labelsize(n);
- q->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
- i->value(n);
-}
-
-extern const char *ui_find_image_name;
-
-Fl_Menu_Item labeltypemenu[] = {
- {"NORMAL_LABEL",0,0,(void*)0},
- {"SHADOW_LABEL",0,0,(void*)FL_SHADOW_LABEL},
- {"ENGRAVED_LABEL",0,0,(void*)FL_ENGRAVED_LABEL},
- {"EMBOSSED_LABEL",0,0,(void*)FL_EMBOSSED_LABEL},
- {"NO_LABEL",0,0,(void*)(FL_NO_LABEL)},
-{0}};
-
-void labeltype_cb(Fl_Choice* i, void *v) {
- if (v == LOAD) {
- int n;
- n = current_widget->o->labeltype();
- i->when(FL_WHEN_RELEASE);
- for (int j = 0; j < int(sizeof(labeltypemenu)/sizeof(*labeltypemenu)); j++)
- if (labeltypemenu[j].argument() == n) {i->value(j); break;}
- } else {
- int mod = 0;
- int m = i->value();
- int n = int(labeltypemenu[m].argument());
- if (n<0) return; // should not happen
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* p = (Fl_Widget_Type*)o;
- p->o->labeltype((Fl_Labeltype)n);
- p->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-Fl_Menu_Item colormenu[] = {
- { "Foreground Color", 0, 0, (void*)(fl_intptr_t)FL_FOREGROUND_COLOR, 0, 0, FL_HELVETICA, 11},
- { "Background Color", 0, 0, (void*)(fl_intptr_t)FL_BACKGROUND_COLOR, 0, 0, FL_HELVETICA, 11},
- { "Background Color 2", 0, 0, (void*)(fl_intptr_t)FL_BACKGROUND2_COLOR, 0, 0, FL_HELVETICA, 11},
- { "Selection Color", 0, 0, (void*)(fl_intptr_t)FL_SELECTION_COLOR, 0, 0, FL_HELVETICA, 11},
- { "Inactive Color", 0, 0, (void*)(fl_intptr_t)FL_INACTIVE_COLOR, FL_MENU_DIVIDER, 0, FL_HELVETICA, 11},
- { "Black", 0, 0, (void*)(fl_intptr_t)FL_BLACK, 0, 0, FL_HELVETICA, 11},
- { "White", 0, 0, (void*)(fl_intptr_t)FL_WHITE, FL_MENU_DIVIDER, 0, FL_HELVETICA, 11},
- { "Gray 0", 0, 0, (void*)(fl_intptr_t)FL_GRAY0, 0, 0, FL_HELVETICA, 11},
- { "Dark 3", 0, 0, (void*)(fl_intptr_t)FL_DARK3, 0, 0, FL_HELVETICA, 11},
- { "Dark 2", 0, 0, (void*)(fl_intptr_t)FL_DARK2, 0, 0, FL_HELVETICA, 11},
- { "Dark 1", 0, 0, (void*)(fl_intptr_t)FL_DARK1, 0, 0, FL_HELVETICA, 11},
- { "Light 1", 0, 0, (void*)(fl_intptr_t)FL_LIGHT1, 0, 0, FL_HELVETICA, 11},
- { "Light 2", 0, 0, (void*)(fl_intptr_t)FL_LIGHT2, 0, 0, FL_HELVETICA, 11},
- { "Light 3", 0, 0, (void*)(fl_intptr_t)FL_LIGHT3, 0, 0, FL_HELVETICA, 11},
- { 0 }
-};
-
-void color_common(Fl_Color c) {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->color(c); q->o->redraw();
- if (q->parent && q->parent->is_a(ID_Tabs)) {
- if (q->o->parent()) q->o->parent()->redraw();
- }
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
-}
-
-void color_cb(Fl_Button* i, void *v) {
- Fl_Color c = current_widget->o->color();
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- } else {
- Fl_Color d = fl_show_colormap(c);
- if (d == c) return;
- c = d;
- color_common(c);
- }
- i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw();
-}
-
-void color_menu_cb(Fl_Menu_Button* i, void *v) {
- Fl_Color c = current_widget->o->color();
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- } else {
- Fl_Color d = (Fl_Color)(i->mvalue()->argument());
- if (d == c) return;
- c = d;
- color_common(c);
- w_color->color(c); w_color->labelcolor(fl_contrast(FL_BLACK,c)); w_color->redraw();
- }
-}
-
-void color2_common(Fl_Color c) {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->selection_color(c); q->o->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
-}
-
-void color2_cb(Fl_Button* i, void *v) {
- Fl_Color c = current_widget->o->selection_color();
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- } else {
- Fl_Color d = fl_show_colormap(c);
- if (d == c) return;
- c = d;
- color2_common(c);
- }
- i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw();
-}
-
-void color2_menu_cb(Fl_Menu_Button* i, void *v) {
- Fl_Color c = current_widget->o->selection_color();
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- } else {
- Fl_Color d = (Fl_Color)(i->mvalue()->argument());
- if (d == c) return;
- c = d;
- color2_common(c);
- w_selectcolor->color(c); w_selectcolor->labelcolor(fl_contrast(FL_BLACK,c)); w_selectcolor->redraw();
- }
-}
-
-void labelcolor_common(Fl_Color c) {
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->o->labelcolor(c); q->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
-}
-
-void labelcolor_cb(Fl_Button* i, void *v) {
- Fl_Color c = current_widget->o->labelcolor();
- if (v != LOAD) {
- Fl_Color d = fl_show_colormap(c);
- if (d == c) return;
- c = d;
- labelcolor_common(c);
- }
- i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw();
-}
-
-void labelcolor_menu_cb(Fl_Menu_Button* i, void *v) {
- Fl_Color c = current_widget->o->labelcolor();
- if (v != LOAD) {
- Fl_Color d = (Fl_Color)(i->mvalue()->argument());
- if (d == c) return;
- c = d;
- labelcolor_common(c);
- w_labelcolor->color(c); w_labelcolor->labelcolor(fl_contrast(FL_BLACK,c)); w_labelcolor->redraw();
- }
-}
-
-static Fl_Button* relative(Fl_Widget* o, int i) {
- Fl_Group* g = (Fl_Group*)(o->parent());
- return (Fl_Button*)(g->child(g->find(*o)+i));
-}
-
-static Fl_Menu_Item alignmenu[] = {
- {"FL_ALIGN_CENTER",0,0,(void*)(fl_intptr_t)(FL_ALIGN_CENTER)},
- {"FL_ALIGN_TOP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TOP)},
- {"FL_ALIGN_BOTTOM",0,0,(void*)(fl_intptr_t)(FL_ALIGN_BOTTOM)},
- {"FL_ALIGN_LEFT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_LEFT)},
- {"FL_ALIGN_RIGHT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_RIGHT)},
- {"FL_ALIGN_INSIDE",0,0,(void*)(fl_intptr_t)(FL_ALIGN_INSIDE)},
- {"FL_ALIGN_CLIP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_CLIP)},
- {"FL_ALIGN_WRAP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_WRAP)},
- {"FL_ALIGN_TEXT_OVER_IMAGE",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TEXT_OVER_IMAGE)},
- {"FL_ALIGN_TOP_LEFT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TOP_LEFT)},
- {"FL_ALIGN_TOP_RIGHT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TOP_RIGHT)},
- {"FL_ALIGN_BOTTOM_LEFT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_BOTTOM_LEFT)},
- {"FL_ALIGN_BOTTOM_RIGHT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_BOTTOM_RIGHT)},
- {"FL_ALIGN_LEFT_TOP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_LEFT_TOP)},
- {"FL_ALIGN_RIGHT_TOP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_RIGHT_TOP)},
- {"FL_ALIGN_LEFT_BOTTOM",0,0,(void*)(fl_intptr_t)(FL_ALIGN_LEFT_BOTTOM)},
- {"FL_ALIGN_RIGHT_BOTTOM",0,0,(void*)(fl_intptr_t)(FL_ALIGN_RIGHT_BOTTOM)},
-{0}};
-
-void align_cb(Fl_Button* i, void *v) {
- Fl_Align b = Fl_Align(fl_uintptr_t(i->user_data()));
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- i->value(current_widget->o->align() & b);
- } else {
- int mod = 0;
- undo_checkpoint();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- Fl_Align x = q->o->align();
- Fl_Align y;
- if (i->value()) {
- y = x | b;
- if (b == FL_ALIGN_LEFT || b == FL_ALIGN_TOP) {
- Fl_Button *b1 = relative(i,+1);
- b1->clear();
- y = y & ~(b1->argument());
- }
- if (b == FL_ALIGN_RIGHT || b == FL_ALIGN_BOTTOM) {
- Fl_Button *b1 = relative(i,-1);
- b1->clear();
- y = y & ~(b1->argument());
- }
- } else {
- y = x & ~b;
- }
- if (x != y) {
- q->o->align(y);
- q->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void align_position_cb(Fl_Choice *i, void *v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- Fl_Menu_Item *mi = (Fl_Menu_Item*)i->menu();
- Fl_Align b = current_widget->o->align() & FL_ALIGN_POSITION_MASK;
- for (;mi->text;mi++) {
- if ((Fl_Align)(mi->argument())==b)
- i->value(mi);
- }
- } else {
- const Fl_Menu_Item *mi = i->menu() + i->value();
- Fl_Align b = Fl_Align(fl_uintptr_t(mi->user_data()));
- int mod = 0;
- undo_checkpoint();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- Fl_Align x = q->o->align();
- Fl_Align y = (x & ~FL_ALIGN_POSITION_MASK) | b;
- if (x != y) {
- q->o->align(y);
- q->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void align_text_image_cb(Fl_Choice *i, void *v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- Fl_Menu_Item *mi = (Fl_Menu_Item*)i->menu();
- Fl_Align b = current_widget->o->align() & FL_ALIGN_IMAGE_MASK;
- for (;mi->text;mi++) {
- if ((Fl_Align)(mi->argument())==b)
- i->value(mi);
- }
- } else {
- const Fl_Menu_Item *mi = i->menu() + i->value();
- Fl_Align b = Fl_Align(fl_uintptr_t(mi->user_data()));
- int mod = 0;
- undo_checkpoint();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- Fl_Align x = q->o->align();
- Fl_Align y = (x & ~FL_ALIGN_IMAGE_MASK) | b;
- if (x != y) {
- q->o->align(y);
- q->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-void callback_cb(CodeEditor* i, void *v) {
- if (v == LOAD) {
- const char *cbtext = current_widget->callback();
- i->buffer()->text( cbtext ? cbtext : "" );
- } else {
- int mod = 0;
- char *c = i->buffer()->text();
- const char *d = c_check(c);
- if (d) {
- fl_message("Error in callback: %s",d);
- if (i->window()) i->window()->make_current();
- haderror = 1;
- }
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected) {
- o->callback(c);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- free(c);
- }
-}
-
-void comment_cb(Fl_Text_Editor* i, void *v) {
- if (v == LOAD) {
- const char *cmttext = current_widget->comment();
- i->buffer()->text( cmttext ? cmttext : "" );
- } else {
- int mod = 0;
- char *c = i->buffer()->text();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected) {
- o->comment(c);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- free(c);
- }
-}
-
-void user_data_cb(Fl_Input *i, void *v) {
- if (v == LOAD) {
- i->value(current_widget->user_data());
- } else {
- int mod = 0;
- const char *c = i->value();
- const char *d = c_check(c);
- if (d) {fl_message("Error in user_data: %s",d); haderror = 1; return;}
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected) {
- o->user_data(c);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void user_data_type_cb(Fl_Input_Choice *i, void *v) {
- static const char *dflt = "void*";
- if (v == LOAD) {
- const char *c = current_widget->user_data_type();
- if (!c) c = dflt;
- i->value(c);
- } else {
- int mod = 0;
- const char *c = i->value();
- const char *d = c_check(c);
- if (!*c) i->value(dflt);
- else if (!strcmp(c,dflt)) c = 0;
- if (!d) {
- if (c && *c && c[strlen(c)-1] != '*' && strcmp(c,"long"))
- d = "must be pointer or long";
- }
- if (d) {fl_message("Error in type: %s",d); haderror = 1; return;}
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected) {
- o->user_data_type(c);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-// "v_attributes" let user type in random code for attribute settings:
-
-void v_input_cb(Fl_Input* i, void* v) {
- int n = fl_int(i->user_data());
- if (v == LOAD) {
- i->value(current_widget->extra_code(n));
- } else {
- int mod = 0;
- const char *c = i->value();
- const char *d = c_check(c&&c[0]=='#' ? c+1 : c);
- if (d) {fl_message("Error in %s: %s",i->label(),d); haderror = 1; return;}
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type *t = (Fl_Widget_Type*)o;
- t->extra_code(n,c);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void subclass_cb(Fl_Input* i, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Menu_Item)) {i->deactivate(); return;} else i->activate();
- i->value(current_widget->subclass());
- } else {
- int mod = 0;
- const char *c = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type *t = (Fl_Widget_Type*)o;
- t->subclass(c);
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-// textstuff: set textfont, textsize, textcolor attributes:
-
-// default widget returns 0 to indicate not-implemented:
-// The first parameter specifies the operation:
-// 0: get all values
-// 1: set the text font
-// 2: set the text size
-// 3: set the text color
-// 4: get all default values for this type
-int Fl_Widget_Type::textstuff(int, Fl_Font&, int&, Fl_Color&) {
- return 0;
-}
-
-void textfont_cb(Fl_Choice* i, void* v) {
- Fl_Font n; int s; Fl_Color c;
- if (v == LOAD) {
- if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;}
- i->activate();
- if (n > 15) n = FL_HELVETICA;
- i->value(n);
- } else {
- int mod = 0;
- n = (Fl_Font)i->value();
- if (n <= 0) n = layout->textfont;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->textstuff(1,n,s,c);
- q->o->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void textsize_cb(Fl_Value_Input* i, void* v) {
- Fl_Font n; int s; Fl_Color c;
- if (v == LOAD) {
- if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;}
- i->activate();
- } else {
- int mod = 0;
- s = int(i->value());
- if (s <= 0) s = layout->textsize;
- if (s <= 0) s = layout->labelsize;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->textstuff(2,n,s,c);
- q->o->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
- i->value(s);
-}
-
-void textcolor_common(Fl_Color c) {
- Fl_Font n; int s;
- int mod = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- q->textstuff(3,n,s,c); q->o->redraw();
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
-}
-
-void textcolor_cb(Fl_Button* i, void* v) {
- Fl_Font n; int s; Fl_Color c;
- if (v == LOAD) {
- if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;}
- i->activate();
- } else {
- c = i->color();
- Fl_Color d = fl_show_colormap(c);
- if (d == c) return;
- c = d;
- textcolor_common(c);
- }
- i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw();
-}
-
-void textcolor_menu_cb(Fl_Menu_Button* i, void* v) {
- Fl_Font n; int s; Fl_Color c;
- if (v == LOAD) {
- if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;}
- i->activate();
- } else {
- c = i->color();
- Fl_Color d = (Fl_Color)(i->mvalue()->argument());
- if (d == c) return;
- c = d;
- textcolor_common(c);
- w_textcolor->color(c); w_textcolor->labelcolor(fl_contrast(FL_BLACK,c)); w_textcolor->redraw();
- }
-}
-
-void image_spacing_cb(Fl_Value_Input* i, void* v) {
- int s;
- if (v == LOAD) {
- if (!current_widget->is_true_widget()) {
- i->deactivate();
- i->value(0);
- } else {
- i->activate();
- i->value(((Fl_Widget_Type*)current_widget)->o->label_image_spacing());
- }
- } else {
- int mod = 0;
- s = int(i->value());
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->o->label_image_spacing() != s) {
- q->o->label_image_spacing(s);
- if (!(q->o->align() & FL_ALIGN_INSIDE) && q->o->window())
- q->o->window()->damage(FL_DAMAGE_EXPOSE); // outside labels
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void h_label_margin_cb(Fl_Value_Input* i, void* v) {
- int s;
- if (v == LOAD) {
- if (!current_widget->is_true_widget()) {
- i->deactivate();
- i->value(0);
- } else {
- i->activate();
- i->value(((Fl_Widget_Type*)current_widget)->o->horizontal_label_margin());
- }
- } else {
- int mod = 0;
- s = int(i->value());
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->o->horizontal_label_margin() != s) {
- q->o->horizontal_label_margin(s);
- if (!(q->o->align() & FL_ALIGN_INSIDE) && q->o->window())
- q->o->window()->damage(FL_DAMAGE_EXPOSE); // outside labels
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void v_label_margin_cb(Fl_Value_Input* i, void* v) {
- int s;
- if (v == LOAD) {
- if (!current_widget->is_true_widget()) {
- i->deactivate();
- i->value(0);
- } else {
- i->activate();
- i->value(((Fl_Widget_Type*)current_widget)->o->vertical_label_margin());
- }
- } else {
- int mod = 0;
- s = int(i->value());
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_true_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->o->vertical_label_margin() != s) {
- q->o->vertical_label_margin(s);
- if (!(q->o->align() & FL_ALIGN_INSIDE) && q->o->window())
- q->o->window()->damage(FL_DAMAGE_EXPOSE); // outside labels
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-// Kludges to the panel for subclasses:
-
-void min_w_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (!current_widget->is_a(ID_Window)) return;
- i->value(((Fl_Window_Type*)current_widget)->sr_min_w);
- } else {
- int mod = 0;
- undo_checkpoint();
- int n = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Window)) {
- ((Fl_Window_Type*)current_widget)->sr_min_w = n;
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void min_h_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (!current_widget->is_a(ID_Window)) return;
- i->value(((Fl_Window_Type*)current_widget)->sr_min_h);
- } else {
- int mod = 0;
- undo_checkpoint();
- int n = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Window)) {
- ((Fl_Window_Type*)current_widget)->sr_min_h = n;
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void max_w_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (!current_widget->is_a(ID_Window)) return;
- i->value(((Fl_Window_Type*)current_widget)->sr_max_w);
- } else {
- int mod = 0;
- undo_checkpoint();
- int n = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Window)) {
- ((Fl_Window_Type*)current_widget)->sr_max_w = n;
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void max_h_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (!current_widget->is_a(ID_Window)) return;
- i->value(((Fl_Window_Type*)current_widget)->sr_max_h);
- } else {
- int mod = 0;
- undo_checkpoint();
- int n = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Window)) {
- ((Fl_Window_Type*)current_widget)->sr_max_h = n;
- mod = 1;
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void set_min_size_cb(Fl_Button*, void* v) {
- if (v == LOAD) {
- } else {
- int mod = 0;
- undo_checkpoint();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Window)) {
- Fl_Window_Type *win = (Fl_Window_Type*)current_widget;
- win->sr_min_w = win->o->w();
- win->sr_min_h = win->o->h();
- mod = 1;
- }
- }
- propagate_load(the_panel, LOAD);
- if (mod) set_modflag(1);
- }
-}
-
-void set_max_size_cb(Fl_Button*, void* v) {
- if (v == LOAD) {
- } else {
- int mod = 0;
- undo_checkpoint();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Window)) {
- Fl_Window_Type *win = (Fl_Window_Type*)current_widget;
- win->sr_max_w = win->o->w();
- win->sr_max_h = win->o->h();
- mod = 1;
- }
- }
- propagate_load(the_panel, LOAD);
- if (mod) set_modflag(1);
- }
-}
-
-void slider_size_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (!current_widget->is_a(ID_Slider)) {i->deactivate(); return;}
- i->activate();
- i->value(((Fl_Slider*)(current_widget->o))->slider_size());
- } else {
- int mod = 0;
- undo_checkpoint();
- double n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->is_a(ID_Slider)) {
- ((Fl_Slider*)(q->o))->slider_size(n);
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void min_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Valuator_)) {
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->minimum());
- } else if (current_widget->is_a(ID_Spinner)) {
- i->activate();
- i->value(((Fl_Spinner*)(current_widget->o))->minimum());
- } else {
- i->deactivate();
- return;
- }
- } else {
- int mod = 0;
- undo_checkpoint();
- double n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->is_a(ID_Valuator_)) {
- ((Fl_Valuator*)(q->o))->minimum(n);
- q->o->redraw();
- mod = 1;
- } else if (q->is_a(ID_Spinner)) {
- ((Fl_Spinner*)(q->o))->minimum(n);
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void max_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Valuator_)) {
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->maximum());
- } else if (current_widget->is_a(ID_Spinner)) {
- i->activate();
- i->value(((Fl_Spinner*)(current_widget->o))->maximum());
- } else {
- i->deactivate();
- return;
- }
- } else {
- int mod = 0;
- undo_checkpoint();
- double n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->is_a(ID_Valuator_)) {
- ((Fl_Valuator*)(q->o))->maximum(n);
- q->o->redraw();
- mod = 1;
- } else if (q->is_a(ID_Spinner)) {
- ((Fl_Spinner*)(q->o))->maximum(n);
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void step_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Valuator_)) {
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->step());
- } else if (current_widget->is_a(ID_Spinner)) {
- i->activate();
- i->value(((Fl_Spinner*)(current_widget->o))->step());
- } else {
- i->deactivate();
- return;
- }
- } else {
- int mod = 0;
- undo_checkpoint();
- double n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->is_a(ID_Valuator_)) {
- ((Fl_Valuator*)(q->o))->step(n);
- q->o->redraw();
- mod = 1;
- } else if (q->is_a(ID_Spinner)) {
- ((Fl_Spinner*)(q->o))->step(n);
- q->o->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void value_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Valuator_)) {
- i->activate();
- i->value(((Fl_Valuator*)(current_widget->o))->value());
- } else if (current_widget->is_button()) {
- i->activate();
- i->value(((Fl_Button*)(current_widget->o))->value());
- } else if (current_widget->is_a(ID_Spinner)) {
- i->activate();
- i->value(((Fl_Spinner*)(current_widget->o))->value());
- } else
- i->deactivate();
- } else {
- int mod = 0;
- undo_checkpoint();
- double n = i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->is_a(ID_Valuator_)) {
- ((Fl_Valuator*)(q->o))->value(n);
- mod = 1;
- } else if (q->is_button()) {
- ((Fl_Button*)(q->o))->value(n != 0);
- if (q->is_a(ID_Menu_Item)) q->redraw();
- mod = 1;
- } else if (q->is_a(ID_Spinner)) {
- ((Fl_Spinner*)(q->o))->value(n);
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-// The following three callbacks cooperate, showing only one of the groups of
-// widgets that use the same space in the dialog.
-
-void values_group_cb(Fl_Group* g, void* v) {
- if (v == LOAD) {
- if ( current_widget->is_a(ID_Flex)
- || current_widget->is_a(ID_Grid)
- || current_widget->is_a(ID_Window))
- {
- g->hide();
- } else {
- g->show();
- }
- propagate_load(g, v);
- }
-}
-
-void flex_margin_group_cb(Fl_Group* g, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Flex)) {
- g->show();
- } else {
- g->hide();
- }
- propagate_load(g, v);
- }
-}
-
-void size_range_group_cb(Fl_Group* g, void* v) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Window)) {
- g->show();
- } else {
- g->hide();
- }
- propagate_load(g, v);
- }
-}
-
-
-static void flex_margin_cb(Fl_Value_Input* i, void* v,
- void (*load_margin)(Fl_Flex*,Fl_Value_Input*),
- int (*update_margin)(Fl_Flex*,int)) {
- if (v == LOAD) {
- if (current_widget->is_a(ID_Flex)) {
- load_margin((Fl_Flex*)current_widget->o, i);
- }
- } else {
- int mod = 0;
- int new_value = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_a(ID_Flex)) {
- Fl_Flex_Type* q = (Fl_Flex_Type*)o;
- Fl_Flex* w = (Fl_Flex*)q->o;
- if (update_margin(w, new_value)) {
- w->layout();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-static void load_left_margin(Fl_Flex *w, Fl_Value_Input* i)
-{
- int v;
- w->margin(&v, NULL, NULL, NULL);
- i->value((double)v);
-}
-
-static int update_left_margin(Fl_Flex *w, int new_value)
-{
- int l, t, r, b;
- w->margin(&l, &t, &r, &b);
- if (new_value!=l) {
- w->margin(new_value, t, r, b);
- return 1;
- } else {
- return 0;
- }
-}
-
-void flex_margin_left_cb(Fl_Value_Input* i, void* v) {
- flex_margin_cb(i, v, load_left_margin, update_left_margin);
-}
-
-static void load_top_margin(Fl_Flex *w, Fl_Value_Input* i)
-{
- int v;
- w->margin(NULL, &v, NULL, NULL);
- i->value((double)v);
-}
-
-static int update_top_margin(Fl_Flex *w, int new_value)
-{
- int l, t, r, b;
- w->margin(&l, &t, &r, &b);
- if (new_value!=t) {
- w->margin(l, new_value, r, b);
- return 1;
- } else {
- return 0;
- }
-}
-
-void flex_margin_top_cb(Fl_Value_Input* i, void* v) {
- flex_margin_cb(i, v, load_top_margin, update_top_margin);
-}
-
-static void load_right_margin(Fl_Flex *w, Fl_Value_Input* i)
-{
- int v;
- w->margin(NULL, NULL, &v, NULL);
- i->value((double)v);
-}
-
-static int update_right_margin(Fl_Flex *w, int new_value)
-{
- int l, t, r, b;
- w->margin(&l, &t, &r, &b);
- if (new_value!=r) {
- w->margin(l, t, new_value, b);
- return 1;
- } else {
- return 0;
- }
-}
-
-void flex_margin_right_cb(Fl_Value_Input* i, void* v) {
- flex_margin_cb(i, v, load_right_margin, update_right_margin);
-}
-
-static void load_bottom_margin(Fl_Flex *w, Fl_Value_Input* i)
-{
- int v;
- w->margin(NULL, NULL, NULL, &v);
- i->value((double)v);
-}
-
-static int update_bottom_margin(Fl_Flex *w, int new_value)
-{
- int l, t, r, b;
- w->margin(&l, &t, &r, &b);
- if (new_value!=b) {
- w->margin(l, t, r, new_value);
- return 1;
- } else {
- return 0;
- }
-}
-
-void flex_margin_bottom_cb(Fl_Value_Input* i, void* v) {
- flex_margin_cb(i, v, load_bottom_margin, update_bottom_margin);
-}
-
-static void load_gap(Fl_Flex *w, Fl_Value_Input* i)
-{
- int v = w->gap();
- i->value((double)v);
-}
-
-static int update_gap(Fl_Flex *w, int new_value)
-{
- int g = w->gap();
- if (new_value!=g) {
- w->gap(new_value);
- return 1;
- } else {
- return 0;
- }
-}
-
-void flex_margin_gap_cb(Fl_Value_Input* i, void* v) {
- flex_margin_cb(i, v, load_gap, update_gap);
-}
-
-void position_group_cb(Fl_Group* g, void* v) {
- if (v == LOAD) {
- if (Fl_Flex_Type::parent_is_flex(current_widget)) {
- g->hide();
- } else {
- g->show();
- }
- }
- propagate_load(g, v);
-}
-
-void flex_size_group_cb(Fl_Group* g, void* v) {
- if (v == LOAD) {
- if (Fl_Flex_Type::parent_is_flex(current_widget)) {
- g->show();
- } else {
- g->hide();
- }
- }
- propagate_load(g, v);
-}
-
-void flex_size_cb(Fl_Value_Input* i, void* v) {
- if (v == LOAD) {
- if (Fl_Flex_Type::parent_is_flex(current_widget)) {
- i->value(Fl_Flex_Type::size(current_widget));
- }
- } else {
- int mod = 0;
- int new_size = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget() && Fl_Flex_Type::parent_is_flex(o)) {
- Fl_Widget* w = (Fl_Widget*)((Fl_Widget_Type*)o)->o;
- Fl_Flex* f = (Fl_Flex*)((Fl_Flex_Type*)o->parent)->o;
- int was_fixed = f->fixed(w);
- if (new_size==0) {
- if (was_fixed) {
- f->fixed(w, 0);
- f->layout();
- widget_flex_fixed->value(0);
- mod = 1;
- }
- } else {
- int old_size = Fl_Flex_Type::size(o);
- if (old_size!=new_size || !was_fixed) {
- f->fixed(w, new_size);
- f->layout();
- widget_flex_fixed->value(1);
- mod = 1;
- }
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-void flex_fixed_cb(Fl_Check_Button* i, void* v) {
- if (v == LOAD) {
- if (Fl_Flex_Type::parent_is_flex(current_widget)) {
- i->value(Fl_Flex_Type::is_fixed(current_widget));
- }
- } else {
- int mod = 0;
- int new_fixed = (int)i->value();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget() && Fl_Flex_Type::parent_is_flex(o)) {
- Fl_Widget* w = (Fl_Widget*)((Fl_Widget_Type*)o)->o;
- Fl_Flex* f = (Fl_Flex*)((Fl_Flex_Type*)o->parent)->o;
- int was_fixed = f->fixed(w);
- if (new_fixed==0) {
- if (was_fixed) {
- f->fixed(w, 0);
- f->layout();
- mod = 1;
- }
- } else {
- if (!was_fixed) {
- f->fixed(w, Fl_Flex_Type::size(o));
- f->layout();
- mod = 1;
- }
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-// subtypes:
-
-Fl_Menu_Item *Fl_Widget_Type::subtypes() {return 0;}
-
-void subtype_cb(Fl_Choice* i, void* v) {
- static Fl_Menu_Item empty_type_menu[] = {
- {"Normal",0,0,(void*)0},
- {0}};
-
- if (v == LOAD) {
- Fl_Menu_Item* m = current_widget->subtypes();
- if (!m) {
- i->menu(empty_type_menu);
- i->value(0);
- i->deactivate();
- } else {
- i->menu(m);
- int j;
- for (j = 0;; j++) {
- if (!m[j].text) {j = 0; break;}
- if (current_widget->is_a(ID_Spinner)) {
- if (m[j].argument() == ((Fl_Spinner*)current_widget->o)->type()) break;
- } else {
- if (m[j].argument() == current_widget->o->type()) break;
- }
- }
- i->value(j);
- i->activate();
- }
- i->redraw();
- } else {
- int mod = 0;
- int n = int(i->mvalue()->argument());
- Fl_Menu_Item* m = current_widget->subtypes();
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->subtypes()==m) {
- if (q->is_a(ID_Spinner))
- ((Fl_Spinner*)q->o)->type(n);
- else if (q->is_a(ID_Flex))
- ((Fl_Flex_Type*)q)->change_subtype_to(n);
- else
- q->o->type(n);
- q->redraw();
- mod = 1;
- }
- }
- }
- if (mod) set_modflag(1);
- }
-}
-
-////////////////////////////////////////////////////////////////
-
-void propagate_load(Fl_Group* g, void* v) {
- if (v == LOAD) {
- Fl_Widget*const* a = g->array();
- for (int i=g->children(); i--;) {
- Fl_Widget* o = *a++;
- o->do_callback(o, LOAD, FL_REASON_USER);
- }
- }
-}
-
-void set_cb(Fl_Button*, void*) {
- haderror = 0;
- Fl_Widget*const* a = the_panel->array();
- for (int i=the_panel->children(); i--;) {
- Fl_Widget* o = *a++;
- if (o->changed()) {
- o->do_callback();
- if (haderror) return;
- o->clear_changed();
- }
- }
-}
-
-void ok_cb(Fl_Return_Button* o, void* v) {
- set_cb(o,v);
- if (!haderror) the_panel->hide();
-}
-
-void toggle_overlays(Fl_Widget *,void *); // in Fl_Window_Type.cxx
-void overlay_cb(Fl_Button*o,void *v) {
- toggle_overlays(o,v);
-}
-
-void leave_live_mode_cb(Fl_Widget*, void*);
-
-void live_mode_cb(Fl_Button*o,void *) {
- /// \todo live mode should end gracefully when the application quits
- /// or when the user closes the live widget
- static Fl_Type *live_type = 0L;
- static Fl_Widget *live_widget = 0L;
- static Fl_Window *live_window = 0L;
- // if 'o' is 0, we must quit live mode
- if (!o) {
- o = wLiveMode;
- o->value(0);
- }
- if (o->value()) {
- if (numselected == 1) {
- Fl_Group::current(0L);
- live_widget = current_widget->enter_live_mode(1);
- if (live_widget) {
- live_type = current_widget;
- Fl_Group::current(0);
- int w = live_widget->w();
- int h = live_widget->h();
- live_window = new Fl_Double_Window(w+20, h+55, "Fluid Live Resize");
- live_window->box(FL_FLAT_BOX);
- live_window->color(FL_GREEN);
- Fl_Group *rsz = new Fl_Group(0, h+20, 130, 35);
- rsz->box(FL_NO_BOX);
- Fl_Box *rsz_dummy = new Fl_Box(110, h+20, 1, 25);
- rsz_dummy->box(FL_NO_BOX);
- rsz->resizable(rsz_dummy);
- Fl_Button *btn = new Fl_Button(10, h+20, 100, 25, "Exit Live Resize");
- btn->labelsize(12);
- btn->callback(leave_live_mode_cb);
- rsz->end();
- live_window->add(live_widget);
- live_widget->position(10, 10);
- live_window->resizable(live_widget);
- live_window->set_modal(); // block all other UI
- live_window->callback(leave_live_mode_cb);
- if (current_widget->is_a(ID_Window)) {
- Fl_Window_Type *w = (Fl_Window_Type*)current_widget;
- int mw = w->sr_min_w; if (mw>0) mw += 20;
- int mh = w->sr_min_h; if (mh>0) mh += 55;
- int MW = w->sr_max_w; if (MW>0) MW += 20;
- int MH = w->sr_max_h; if (MH>2) MH += 55;
- if (mw || mh || MW || MH)
- live_window->size_range(mw, mh, MW, MH);
- }
- live_window->show();
- live_widget->show();
- } else o->value(0);
- } else o->value(0);
- } else {
- if (live_type)
- live_type->leave_live_mode();
- if (live_window) {
- live_window->hide();
- Fl::delete_widget(live_window);
- }
- live_type = 0L;
- live_widget = 0L;
- live_window = 0L;
- }
-}
-
-// update the panel according to current widget set:
-void load_panel() {
- if (!the_panel) return;
-
- // find all the Fl_Widget subclasses currently selected:
- numselected = 0;
- current_widget = 0;
- if (Fl_Type::current) {
- if (Fl_Type::current->is_widget())
- current_widget=(Fl_Widget_Type*)Fl_Type::current;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- if (o->is_widget() && o->selected) {
- numselected++;
- if (!current_widget) current_widget = (Fl_Widget_Type*)o;
- }
- }
- }
- if (current_widget && current_widget->is_a(ID_Grid)) {
- if (widget_tab_grid->parent()!=widget_tabs)
- widget_tabs->add(widget_tab_grid);
- } else {
- if (widget_tab_grid->parent()==widget_tabs) {
- widget_tabs_repo->add(widget_tab_grid);
- }
- }
- if (current_widget && current_widget->parent && current_widget->parent->is_a(ID_Grid)) {
- if (widget_tab_grid_child->parent()!=widget_tabs)
- widget_tabs->add(widget_tab_grid_child);
- } else {
- if (widget_tab_grid_child->parent()==widget_tabs) {
- widget_tabs_repo->add(widget_tab_grid_child);
- }
- }
- if (numselected)
- propagate_load(the_panel, LOAD);
- else
- the_panel->hide();
-}
-
-extern Fl_Window *widgetbin_panel;
-
-// This is called when user double-clicks an item, open or update the panel:
-void Fl_Widget_Type::open() {
- bool adjust_position = false;
- if (!the_panel) {
- the_panel = make_widget_panel();
- adjust_position = true;
- }
- load_panel();
- if (numselected) {
- the_panel->show();
- if (adjust_position) {
- if (widgetbin_panel && widgetbin_panel->visible()) {
- if ( (the_panel->x()+the_panel->w() > widgetbin_panel->x())
- && (the_panel->x() < widgetbin_panel->x()+widgetbin_panel->w())
- && (the_panel->y()+the_panel->h() > widgetbin_panel->y())
- && (the_panel->y() < widgetbin_panel->y()+widgetbin_panel->h()) )
- {
- if (widgetbin_panel->y()+widgetbin_panel->h()+the_panel->h() > Fl::h())
- the_panel->position(the_panel->x(), widgetbin_panel->y()-the_panel->h()-30);
- else
- the_panel->position(the_panel->x(), widgetbin_panel->y()+widgetbin_panel->h()+30);
- }
- }
- }
- }
-}
-
-extern void redraw_overlays();
-extern void check_redraw_corresponding_parent(Fl_Type*);
-extern void redraw_browser();
-extern void update_codeview_position();
-
-// Called when ui changes what objects are selected:
-// p is selected object, null for all deletions (we must throw away
-// old panel in that case, as the object may no longer exist)
-void selection_changed(Fl_Type *p) {
- // store all changes to the current selected objects:
- if (p && the_panel && the_panel->visible()) {
- set_cb(0,0);
- // if there was an error, we try to leave the selected set unchanged:
- if (haderror) {
- Fl_Type *q = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- o->new_selected = o->selected;
- if (!q && o->selected) q = o;
- }
- if (!p || !p->selected) p = q;
- Fl_Type::current = p;
- redraw_browser();
- return;
- }
- }
- // update the selected flags to new set:
- Fl_Type *q = 0;
- for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
- o->selected = o->new_selected;
- if (!q && o->selected) q = o;
- }
- if (!p || !p->selected) p = q;
- Fl_Type::current = p;
- check_redraw_corresponding_parent(p);
- redraw_overlays();
- // load the panel with the new settings:
- load_panel();
- // update the code viewer to show the code for the selected object
- update_codeview_position();
-}
-
-////////////////////////////////////////////////////////////////
-// Writing the C code:
-
-// test to see if user named a function, or typed in code:
-int is_name(const char *c) {
- for (; *c; c++)
- if ((ispunct(*c)||*c=='\n') && *c!='_' && *c!=':') return 0;
- return 1;
-}
-
-// Test to see if name() is an array entry. If so, and this is the
-// highest number, return name[num+1]. Return null if not the highest
-// number or a field or function. Return name() if not an array entry.
-const char *array_name(Fl_Widget_Type *o) {
- const char *c = o->name();
- if (!c) return 0;
- const char *d;
- for (d = c; *d != '['; d++) {
- if (!*d) return c;
- if (ispunct(*d) && *d!='_') return 0;
- }
- int num = atoi(d+1);
- int sawthis = 0;
- Fl_Type *t = o->prev;
- Fl_Type *tp = o;
- const char *cn = o->class_name(1);
- for (; t && t->class_name(1) == cn; tp = t, t = t->prev) {/*empty*/}
- for (t = tp; t && t->class_name(1) == cn; t = t->next) {
- if (t == o) {sawthis=1; continue;}
- const char *e = t->name();
- if (!e) continue;
- if (strncmp(c,e,d-c)) continue;
- int n1 = atoi(e+(d-c)+1);
- if (n1 > num || (n1==num && sawthis)) return 0;
- }
- static char buffer[128];
- // MRS: we want strncpy() here...
- strncpy(buffer,c,d-c+1);
- snprintf(buffer+(d-c+1),sizeof(buffer) - (d-c+1), "%d]",num+1);
- return buffer;
-}
-
-// Test to see if extra code is a declaration:
-int isdeclare(const char *c) {
- while (isspace(*c)) c++;
- if (*c == '#') return 1;
- if (!strncmp(c,"extern",6)) return 1;
- if (!strncmp(c,"typedef",7)) return 1;
- if (!strncmp(c,"using",5)) return 1;
- return 0;
-}
-
-void Fl_Widget_Type::write_static(Fd_Code_Writer& f) {
- const char* t = subclassname(this);
- if (!subclass() || (is_class() && !strncmp(t, "Fl_", 3))) {
- f.write_h_once("#include <FL/Fl.H>");
- f.write_h_once("#include <FL/%s.H>", t);
- }
- for (int n=0; n < NUM_EXTRA_CODE; n++) {
- if (extra_code(n) && isdeclare(extra_code(n)))
- f.write_h_once("%s", extra_code(n));
- }
- if (callback() && is_name(callback())) {
- int write_extern_declaration = 1;
- char buf[1024]; snprintf(buf, 1023, "%s(*)", callback());
- if (is_in_class()) {
- if (has_function("static void", buf))
- write_extern_declaration = 0;
- } else {
- if (has_toplevel_function(0L, buf))
- write_extern_declaration = 0;
- }
- if (write_extern_declaration)
- f.write_h_once("extern void %s(%s*, %s);", callback(), t,
- user_data_type() ? user_data_type() : "void*");
- }
- const char* k = class_name(1);
- const char* c = array_name(this);
- if (c && !k && !is_class()) {
- f.write_c("\n");
- if (!public_) f.write_c("static ");
- else f.write_h("extern %s *%s;\n", t, c);
- if (strchr(c, '[') == NULL) f.write_c("%s *%s=(%s *)0;\n", t, c, t);
- else f.write_c("%s *%s={(%s *)0};\n", t, c, t);
- }
- if (callback() && !is_name(callback())) {
- // see if 'o' or 'v' used, to prevent unused argument warnings:
- int use_o = 0;
- int use_v = 0;
- const char *d;
- for (d = callback(); *d;) {
- if (*d == 'o' && !is_id(d[1])) use_o = 1;
- if (*d == 'v' && !is_id(d[1])) use_v = 1;
- do d++; while (is_id(*d));
- while (*d && !is_id(*d)) d++;
- }
- const char* cn = callback_name(f);
- if (k) {
- f.write_c("\nvoid %s::%s_i(%s*", k, cn, t);
- } else {
- f.write_c("\nstatic void %s(%s*", cn, t);
- }
- if (use_o) f.write_c(" o");
- const char* ut = user_data_type() ? user_data_type() : "void*";
- f.write_c(", %s", ut);
- if (use_v) f.write_c(" v");
- f.write_c(") {\n");
- // Matt: disabled f.tag(FD_TAG_GENERIC, 0);
- f.write_c_indented(callback(), 1, 0);
- if (*(d-1) != ';' && *(d-1) != '}') {
- const char *p = strrchr(callback(), '\n');
- if (p) p ++;
- else p = callback();
- // Only add trailing semicolon if the last line is not a preprocessor
- // statement...
- if (*p != '#' && *p) f.write_c(";");
- }
- f.write_c("\n");
- // Matt: disabled f.tag(FD_TAG_WIDGET_CALLBACK, get_uid());
- f.write_c("}\n");
- if (k) {
- f.write_c("void %s::%s(%s* o, %s v) {\n", k, cn, t, ut);
- f.write_c("%s((%s*)(o", f.indent(1), k);
- Fl_Type *q = 0;
- for (Fl_Type* p = parent; p && p->is_widget(); q = p, p = p->parent)
- f.write_c("->parent()");
- if (!q || !q->is_a(ID_Widget_Class))
- f.write_c("->user_data()");
- f.write_c("))->%s_i(o,v);\n}\n", cn);
- }
- }
- if (image) {
- if (!f.c_contains(image))
- image->write_static(f, compress_image_);
- }
- if (inactive) {
- if (!f.c_contains(inactive))
- inactive->write_static(f, compress_deimage_);
- }
-}
-
-void Fl_Widget_Type::write_code1(Fd_Code_Writer& f) {
- const char* t = subclassname(this);
- const char *c = array_name(this);
- if (c) {
- if (class_name(1)) {
- f.write_public(public_);
- f.write_h("%s%s *%s;\n", f.indent(1), t, c);
- }
- }
- if (class_name(1) && callback() && !is_name(callback())) {
- const char* cn = callback_name(f);
- const char* ut = user_data_type() ? user_data_type() : "void*";
- f.write_public(0);
- f.write_h("%sinline void %s_i(%s*, %s);\n", f.indent(1), cn, t, ut);
- f.write_h("%sstatic void %s(%s*, %s);\n", f.indent(1), cn, t, ut);
- }
- // figure out if local variable will be used (prevent compiler warnings):
- int wused = !name() && is_a(ID_Window);
- const char *ptr;
-
- f.varused = wused;
-
- if (!name() && !f.varused) {
- f.varused |= can_have_children();
-
- if (!f.varused) {
- f.varused_test = 1;
- write_widget_code(f);
- f.varused_test = 0;
- }
- }
-
- if (!f.varused) {
- for (int n=0; n < NUM_EXTRA_CODE; n++)
- if (extra_code(n) && !isdeclare(extra_code(n)))
- {
- int instring = 0;
- int inname = 0;
- int incomment = 0;
- int incppcomment = 0;
- for (ptr = extra_code(n); *ptr; ptr ++) {
- if (instring) {
- if (*ptr == '\\') ptr++;
- else if (*ptr == '\"') instring = 0;
- } else if (inname && !isalnum(*ptr & 255)) {
- inname = 0;
- } else if (*ptr == '/' && ptr[1]=='*') {
- incomment = 1; ptr++;
- } else if (incomment) {
- if (*ptr == '*' && ptr[1]=='/') {
- incomment = 0; ptr++;
- }
- } else if (*ptr == '/' && ptr[1]=='/') {
- incppcomment = 1; ptr++;
- } else if (incppcomment) {
- if (*ptr == '\n')
- incppcomment = 0;
- } else if (*ptr == '\"') {
- instring = 1;
- } else if (isalnum(*ptr & 255) || *ptr == '_') {
- size_t len = strspn(ptr, "0123456789_"
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
- if (!strncmp(ptr, "o", len)) {
- f.varused = 1;
- break;
- } else {
- ptr += len - 1;
- }
- }
- }
- }
- }
-
- f.write_c("%s{ ", f.indent());
- write_comment_inline_c(f);
- if (f.varused) f.write_c("%s* o = ", t);
- if (name()) f.write_c("%s = ", name());
- if (is_a(ID_Window)) {
- // Handle special case where user is faking a Fl_Group type as a window,
- // there is no 2-argument constructor in that case:
- if (!strstr(t, "Window"))
- f.write_c("new %s(0, 0, %d, %d", t, o->w(), o->h());
- else
- f.write_c("new %s(%d, %d", t, o->w(), o->h());
- } else if (is_a(ID_Menu_Bar)
- && ((Fl_Menu_Bar_Type*)this)->is_sys_menu_bar()
- && is_in_class()) {
- f.write_c("(%s*)new %s(%d, %d, %d, %d",
- t, ((Fl_Menu_Bar_Type*)this)->sys_menubar_proxy_name(),
- o->x(), o->y(), o->w(), o->h());
- } else {
- f.write_c("new %s(%d, %d, %d, %d", t, o->x(), o->y(), o->w(), o->h());
- }
- if (label() && *label()) {
- f.write_c(", ");
- switch (g_project.i18n_type) {
- case FD_I18N_NONE : /* None */
- f.write_cstring(label());
- break;
- case FD_I18N_GNU : /* GNU gettext */
- f.write_c("%s(", g_project.i18n_gnu_function.c_str());
- f.write_cstring(label());
- f.write_c(")");
- break;
- case FD_I18N_POSIX : /* POSIX catgets */
- f.write_c("catgets(%s,%s,%d,",
- g_project.i18n_pos_file.empty() ? "_catalog" : g_project.i18n_pos_file.c_str(),
- g_project.i18n_pos_set.c_str(), msgnum());
- f.write_cstring(label());
- f.write_c(")");
- break;
- }
- }
- f.write_c(");\n");
-
- f.indentation++;
-
- // Avoid compiler warning for unused variable.
- // Also avoid quality control warnings about incorrect allocation error handling.
- if (wused) f.write_c("%sw = o; (void)w;\n", f.indent());
-
- write_widget_code(f);
-}
-
-void Fl_Widget_Type::write_color(Fd_Code_Writer& f, const char* field, Fl_Color color) {
- const char* color_name = 0;
- switch (color) {
- case FL_FOREGROUND_COLOR: color_name = "FL_FOREGROUND_COLOR"; break;
- case FL_BACKGROUND2_COLOR: color_name = "FL_BACKGROUND2_COLOR"; break;
- case FL_INACTIVE_COLOR: color_name = "FL_INACTIVE_COLOR"; break;
- case FL_SELECTION_COLOR: color_name = "FL_SELECTION_COLOR"; break;
- case FL_GRAY0: color_name = "FL_GRAY0"; break;
- case FL_DARK3: color_name = "FL_DARK3"; break;
- case FL_DARK2: color_name = "FL_DARK2"; break;
- case FL_DARK1: color_name = "FL_DARK1"; break;
- case FL_BACKGROUND_COLOR: color_name = "FL_BACKGROUND_COLOR"; break;
- case FL_LIGHT1: color_name = "FL_LIGHT1"; break;
- case FL_LIGHT2: color_name = "FL_LIGHT2"; break;
- case FL_LIGHT3: color_name = "FL_LIGHT3"; break;
- case FL_BLACK: color_name = "FL_BLACK"; break;
- case FL_RED: color_name = "FL_RED"; break;
- case FL_GREEN: color_name = "FL_GREEN"; break;
- case FL_YELLOW: color_name = "FL_YELLOW"; break;
- case FL_BLUE: color_name = "FL_BLUE"; break;
- case FL_MAGENTA: color_name = "FL_MAGENTA"; break;
- case FL_CYAN: color_name = "FL_CYAN"; break;
- case FL_DARK_RED: color_name = "FL_DARK_RED"; break;
- case FL_DARK_GREEN: color_name = "FL_DARK_GREEN"; break;
- case FL_DARK_YELLOW: color_name = "FL_DARK_YELLOW"; break;
- case FL_DARK_BLUE: color_name = "FL_DARK_BLUE"; break;
- case FL_DARK_MAGENTA: color_name = "FL_DARK_MAGENTA"; break;
- case FL_DARK_CYAN: color_name = "FL_DARK_CYAN"; break;
- case FL_WHITE: color_name = "FL_WHITE"; break;
- }
- const char *var = is_class() ? "this" : name() ? name() : "o";
- if (color_name) {
- f.write_c("%s%s->%s(%s);\n", f.indent(), var, field, color_name);
- } else {
- f.write_c("%s%s->%s((Fl_Color)%d);\n", f.indent(), var, field, color);
- }
-}
-
-// this is split from write_code1(Fd_Code_Writer& f) for Fl_Window_Type:
-void Fl_Widget_Type::write_widget_code(Fd_Code_Writer& f) {
- Fl_Widget* tplate = ((Fl_Widget_Type*)factory)->o;
- const char *var = is_class() ? "this" : name() ? name() : "o";
-
- if (tooltip() && *tooltip()) {
- f.write_c("%s%s->tooltip(",f.indent(), var);
- switch (g_project.i18n_type) {
- case FD_I18N_NONE : /* None */
- f.write_cstring(tooltip());
- break;
- case FD_I18N_GNU : /* GNU gettext */
- f.write_c("%s(", g_project.i18n_gnu_function.c_str());
- f.write_cstring(tooltip());
- f.write_c(")");
- break;
- case FD_I18N_POSIX : /* POSIX catgets */
- f.write_c("catgets(%s,%s,%d,",
- g_project.i18n_pos_file.empty() ? "_catalog" : g_project.i18n_pos_file.c_str(),
- g_project.i18n_pos_set.c_str(),
- msgnum() + 1);
- f.write_cstring(tooltip());
- f.write_c(")");
- break;
- }
- f.write_c(");\n");
- }
-
- if (is_a(ID_Spinner) && ((Fl_Spinner*)o)->type() != ((Fl_Spinner*)tplate)->type())
- f.write_c("%s%s->type(%d);\n", f.indent(), var, ((Fl_Spinner*)o)->type());
- else if (o->type() != tplate->type() && !is_a(ID_Window))
- f.write_c("%s%s->type(%d);\n", f.indent(), var, o->type());
- if (o->box() != tplate->box() || subclass())
- f.write_c("%s%s->box(FL_%s);\n", f.indent(), var, boxname(o->box()));
-
- // write shortcut command if needed
- int shortcut = 0;
- if (is_button()) shortcut = ((Fl_Button*)o)->shortcut();
- else if (is_a(ID_Input)) shortcut = ((Fl_Input_*)o)->shortcut();
- else if (is_a(ID_Value_Input)) shortcut = ((Fl_Value_Input*)o)->shortcut();
- else if (is_a(ID_Text_Display)) shortcut = ((Fl_Text_Display*)o)->shortcut();
- if (shortcut) {
- int s = shortcut;
- f.write_c("%s%s->shortcut(", f.indent(), var);
- if (g_project.use_FL_COMMAND) {
- if (s & FL_CTRL) { f.write_c("FL_CONTROL|"); s &= ~FL_CTRL; }
- if (s & FL_META) { f.write_c("FL_COMMAND|"); s &= ~FL_META; }
- } else {
- if (s & FL_CTRL) { f.write_c("FL_CTRL|"); s &= ~FL_CTRL; }
- if (s & FL_META) { f.write_c("FL_META|"); s &= ~FL_META; }
- }
- if (s & FL_SHIFT) { f.write_c("FL_SHIFT|"); s &= ~FL_SHIFT; }
- if (s & FL_ALT) { f.write_c("FL_ALT|"); s &= ~FL_ALT; }
- if ((s < 127) && isprint(s))
- f.write_c("'%c');\n", s);
- else
- f.write_c("0x%x);\n", s);
- }
-
- if (is_a(ID_Button)) {
- Fl_Button* b = (Fl_Button*)o;
- if (b->down_box()) f.write_c("%s%s->down_box(FL_%s);\n", f.indent(), var,
- boxname(b->down_box()));
- if (b->value()) f.write_c("%s%s->value(1);\n", f.indent(), var);
- if (b->compact()) f.write_c("%s%s->compact(%d);\n", f.indent(), var, b->compact());
- } else if (is_a(ID_Input_Choice)) {
- Fl_Input_Choice* b = (Fl_Input_Choice*)o;
- if (b->down_box()) f.write_c("%s%s->down_box(FL_%s);\n", f.indent(), var,
- boxname(b->down_box()));
- } else if (is_a(ID_Menu_Manager_)) {
- Fl_Menu_* b = (Fl_Menu_*)o;
- if (b->down_box()) f.write_c("%s%s->down_box(FL_%s);\n", f.indent(), var,
- boxname(b->down_box()));
- }
- if (o->color() != tplate->color() || subclass())
- write_color(f, "color", o->color());
- if (o->selection_color() != tplate->selection_color() || subclass())
- write_color(f, "selection_color", o->selection_color());
- if (image) {
- image->write_code(f, bind_image_, var);
- if (scale_image_w_ || scale_image_h_) {
- f.write_c("%s%s->image()->scale(", f.indent(), var);
- if (scale_image_w_>0)
- f.write_c("%d, ", scale_image_w_);
- else
- f.write_c("%s->image()->data_w(), ", var);
- if (scale_image_h_>0)
- f.write_c("%d, 0, 1);\n", scale_image_h_);
- else
- f.write_c("%s->image()->data_h(), 0, 1);\n", var);
- }
- }
- if (inactive) {
- inactive->write_code(f, bind_deimage_, var, 1);
- if (scale_deimage_w_ || scale_deimage_h_) {
- f.write_c("%s%s->deimage()->scale(", f.indent(), var);
- if (scale_deimage_w_>0)
- f.write_c("%d, ", scale_deimage_w_);
- else
- f.write_c("%s->deimage()->data_w(), ", var);
- if (scale_deimage_h_>0)
- f.write_c("%d, 0, 1);\n", scale_deimage_h_);
- else
- f.write_c("%s->deimage()->data_h(), 0, 1);\n", var);
- }
- }
- if (o->labeltype() != tplate->labeltype() || subclass())
- f.write_c("%s%s->labeltype(FL_%s);\n", f.indent(), var,
- item_name(labeltypemenu, o->labeltype()));
- if (o->labelfont() != tplate->labelfont() || subclass())
- f.write_c("%s%s->labelfont(%d);\n", f.indent(), var, o->labelfont());
- if (o->labelsize() != tplate->labelsize() || subclass())
- f.write_c("%s%s->labelsize(%d);\n", f.indent(), var, o->labelsize());
- if (o->labelcolor() != tplate->labelcolor() || subclass())
- write_color(f, "labelcolor", o->labelcolor());
- if (o->horizontal_label_margin() != tplate->horizontal_label_margin())
- f.write_c("%s%s->horizontal_label_margin(%d);\n", f.indent(), var, o->horizontal_label_margin());
- if (o->vertical_label_margin() != tplate->vertical_label_margin())
- f.write_c("%s%s->vertical_label_margin(%d);\n", f.indent(), var, o->vertical_label_margin());
- if (o->label_image_spacing() != tplate->label_image_spacing())
- f.write_c("%s%s->label_image_spacing(%d);\n", f.indent(), var, o->label_image_spacing());
- if (is_a(ID_Valuator_)) {
- Fl_Valuator* v = (Fl_Valuator*)o;
- Fl_Valuator* t = (Fl_Valuator*)(tplate);
- if (v->minimum()!=t->minimum())
- f.write_c("%s%s->minimum(%g);\n", f.indent(), var, v->minimum());
- if (v->maximum()!=t->maximum())
- f.write_c("%s%s->maximum(%g);\n", f.indent(), var, v->maximum());
- if (v->step()!=t->step())
- f.write_c("%s%s->step(%g);\n", f.indent(), var, v->step());
- if (v->value()) {
- if (is_a(ID_Scrollbar)) { // Fl_Scrollbar::value(double) is not available
- f.write_c("%s%s->Fl_Slider::value(%g);\n", f.indent(), var, v->value());
- } else {
- f.write_c("%s%s->value(%g);\n", f.indent(), var, v->value());
- }
- }
- if (is_a(ID_Slider)) {
- double x = ((Fl_Slider*)v)->slider_size();
- double y = ((Fl_Slider*)t)->slider_size();
- if (x != y) f.write_c("%s%s->slider_size(%g);\n", f.indent(), var, x);
- }
- }
- if (is_a(ID_Spinner)) {
- Fl_Spinner* v = (Fl_Spinner*)o;
- Fl_Spinner* t = (Fl_Spinner*)(tplate);
- if (v->minimum()!=t->minimum())
- f.write_c("%s%s->minimum(%g);\n", f.indent(), var, v->minimum());
- if (v->maximum()!=t->maximum())
- f.write_c("%s%s->maximum(%g);\n", f.indent(), var, v->maximum());
- if (v->step()!=t->step())
- f.write_c("%s%s->step(%g);\n", f.indent(), var, v->step());
- if (v->value()!=1.0f)
- f.write_c("%s%s->value(%g);\n", f.indent(), var, v->value());
- }
-
- {Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) {
- Fl_Font g; int s; Fl_Color c; textstuff(0,g,s,c);
- if (g != ff) f.write_c("%s%s->textfont(%d);\n", f.indent(), var, g);
- if (s != fs) f.write_c("%s%s->textsize(%d);\n", f.indent(), var, s);
- if (c != fc) write_color(f, "textcolor", c);
- }}
- const char* ud = user_data();
- if (class_name(1) && !parent->is_widget()) ud = "this";
- if (callback()) {
- f.write_c("%s%s->callback((Fl_Callback*)%s", f.indent(), var, callback_name(f));
- if (ud)
- f.write_c(", (void*)(%s));\n", ud);
- else
- f.write_c(");\n");
- } else if (ud) {
- f.write_c("%s%s->user_data((void*)(%s));\n", f.indent(), var, ud);
- }
- if (o->align() != tplate->align() || subclass()) {
- int i = o->align();
- f.write_c("%s%s->align(Fl_Align(%s", f.indent(), var,
- item_name(alignmenu, i & ~FL_ALIGN_INSIDE));
- if (i & FL_ALIGN_INSIDE) f.write_c("|FL_ALIGN_INSIDE");
- f.write_c("));\n");
- }
- Fl_When ww = o->when();
- if (ww != tplate->when() || subclass())
- f.write_c("%s%s->when(%s);\n", f.indent(), var, when_symbol_name(ww));
- if (!o->visible() && o->parent())
- f.write_c("%s%s->hide();\n", f.indent(), var);
- if (!o->active())
- f.write_c("%s%s->deactivate();\n", f.indent(), var);
- if (!is_a(ID_Group) && resizable())
- f.write_c("%sFl_Group::current()->resizable(%s);\n", f.indent(), var);
- if (hotspot()) {
- if (is_class())
- f.write_c("%shotspot(%s);\n", f.indent(), var);
- else if (is_a(ID_Window))
- f.write_c("%s%s->hotspot(%s);\n", f.indent(), var, var);
- else
- f.write_c("%s%s->window()->hotspot(%s);\n", f.indent(), var, var);
- }
-}
-
-void Fl_Widget_Type::write_extra_code(Fd_Code_Writer& f) {
- for (int n=0; n < NUM_EXTRA_CODE; n++)
- if (extra_code(n) && !isdeclare(extra_code(n)))
- f.write_c("%s%s\n", f.indent(), extra_code(n));
-}
-
-void Fl_Widget_Type::write_block_close(Fd_Code_Writer& f) {
- f.indentation--;
- f.write_c("%s} // %s* %s\n", f.indent(), subclassname(this),
- name() ? name() : "o");
-}
-
-void Fl_Widget_Type::write_code2(Fd_Code_Writer& f) {
- write_extra_code(f);
- write_block_close(f);
-}
-
-////////////////////////////////////////////////////////////////
-
-void Fl_Widget_Type::write_properties(Fd_Project_Writer &f) {
- Fl_Type::write_properties(f);
- f.write_indent(level+1);
- switch (public_) {
- case 0: f.write_string("private"); break;
- case 1: break;
- case 2: f.write_string("protected"); break;
- }
- if (tooltip() && *tooltip()) {
- f.write_string("tooltip");
- f.write_word(tooltip());
- }
- if (image_name() && *image_name()) {
- if (scale_image_w_ || scale_image_h_)
- f.write_string("scale_image {%d %d}", scale_image_w_, scale_image_h_);
- f.write_string("image");
- f.write_word(image_name());
- f.write_string("compress_image %d", compress_image_);
- }
- if (bind_image_) f.write_string("bind_image 1");
- if (inactive_name() && *inactive_name()) {
- if (scale_deimage_w_ || scale_deimage_h_)
- f.write_string("scale_deimage {%d %d}", scale_deimage_w_, scale_deimage_h_);
- f.write_string("deimage");
- f.write_word(inactive_name());
- f.write_string("compress_deimage %d", compress_deimage_);
- }
- if (bind_deimage_) f.write_string("bind_deimage 1");
- f.write_string("xywh {%d %d %d %d}", o->x(), o->y(), o->w(), o->h());
- Fl_Widget* tplate = ((Fl_Widget_Type*)factory)->o;
- if (is_a(ID_Spinner) && ((Fl_Spinner*)o)->type() != ((Fl_Spinner*)tplate)->type()) {
- f.write_string("type");
- f.write_word(item_name(subtypes(), ((Fl_Spinner*)o)->type()));
- } else if (subtypes() && (o->type() != tplate->type() || is_a(ID_Window))) {
- f.write_string("type");
- f.write_word(item_name(subtypes(), o->type()));
- }
- if (o->box() != tplate->box()) {
- f.write_string("box"); f.write_word(boxname(o->box()));}
- if (is_a(ID_Input)) {
- Fl_Input_* b = (Fl_Input_*)o;
- if (b->shortcut()) f.write_string("shortcut 0x%x", b->shortcut());
- }
- if (is_a(ID_Value_Input)) {
- Fl_Value_Input* b = (Fl_Value_Input*)o;
- if (b->shortcut()) f.write_string("shortcut 0x%x", b->shortcut());
- }
- if (is_a(ID_Text_Display)) {
- Fl_Text_Display* b = (Fl_Text_Display*)o;
- if (b->shortcut()) f.write_string("shortcut 0x%x", b->shortcut());
- }
- if (is_a(ID_Button)) {
- Fl_Button* b = (Fl_Button*)o;
- if (b->down_box()) {
- f.write_string("down_box"); f.write_word(boxname(b->down_box()));}
- if (b->shortcut()) f.write_string("shortcut 0x%x", b->shortcut());
- if (b->value()) f.write_string("value 1");
- } else if (is_a(ID_Input_Choice)) {
- Fl_Input_Choice* b = (Fl_Input_Choice*)o;
- if (b->down_box()) {
- f.write_string("down_box"); f.write_word(boxname(b->down_box()));}
- } else if (is_a(ID_Menu_)) {
- Fl_Menu_* b = (Fl_Menu_*)o;
- if (b->down_box()) {
- f.write_string("down_box"); f.write_word(boxname(b->down_box()));}
- }
- if (o->color()!=tplate->color())
- f.write_string("color %d", o->color());
- if (o->selection_color()!=tplate->selection_color())
- f.write_string("selection_color %d", o->selection_color());
- if (o->labeltype()!=tplate->labeltype()) {
- f.write_string("labeltype");
- f.write_word(item_name(labeltypemenu, o->labeltype()));
- }
- if (o->labelfont()!=tplate->labelfont())
- f.write_string("labelfont %d", o->labelfont());
- if (o->labelsize()!=tplate->labelsize())
- f.write_string("labelsize %d", o->labelsize());
- if (o->labelcolor()!=tplate->labelcolor())
- f.write_string("labelcolor %d", o->labelcolor());
- if (o->align()!=tplate->align())
- f.write_string("align %d", o->align());
- if (o->horizontal_label_margin()!=tplate->horizontal_label_margin())
- f.write_string("h_label_margin %d", o->horizontal_label_margin());
- if (o->vertical_label_margin()!=tplate->vertical_label_margin())
- f.write_string("v_label_margin %d", o->vertical_label_margin());
- if (o->label_image_spacing()!=tplate->label_image_spacing())
- f.write_string("image_spacing %d", o->label_image_spacing());
- if (o->when() != tplate->when())
- f.write_string("when %d", o->when());
- if (is_a(ID_Valuator_)) {
- Fl_Valuator* v = (Fl_Valuator*)o;
- Fl_Valuator* t = (Fl_Valuator*)(tplate);
- if (v->minimum()!=t->minimum()) f.write_string("minimum %g",v->minimum());
- if (v->maximum()!=t->maximum()) f.write_string("maximum %g",v->maximum());
- if (v->step()!=t->step()) f.write_string("step %g",v->step());
- if (v->value()!=0.0) f.write_string("value %g",v->value());
- if (is_a(ID_Slider)) {
- double x = ((Fl_Slider*)v)->slider_size();
- double y = ((Fl_Slider*)t)->slider_size();
- if (x != y) f.write_string("slider_size %g", x);
- }
- }
- if (is_a(ID_Spinner)) {
- Fl_Spinner* v = (Fl_Spinner*)o;
- Fl_Spinner* t = (Fl_Spinner*)(tplate);
- if (v->minimum()!=t->minimum()) f.write_string("minimum %g",v->minimum());
- if (v->maximum()!=t->maximum()) f.write_string("maximum %g",v->maximum());
- if (v->step()!=t->step()) f.write_string("step %g",v->step());
- if (v->value()!=1.0) f.write_string("value %g",v->value());
- }
- {Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) {
- Fl_Font ft; int s; Fl_Color c; textstuff(0,ft,s,c);
- if (ft != ff) f.write_string("textfont %d", ft);
- if (s != fs) f.write_string("textsize %d", s);
- if (c != fc) f.write_string("textcolor %d", c);
- }}
- if (!o->visible() && !override_visible_) f.write_string("hide");
- if (!o->active()) f.write_string("deactivate");
- if (resizable()) f.write_string("resizable");
- if (hotspot()) f.write_string(is_a(ID_Menu_Item) ? "divider" : "hotspot");
- for (int n=0; n < NUM_EXTRA_CODE; n++) if (extra_code(n)) {
- f.write_indent(level+1);
- f.write_string("code%d",n);
- f.write_word(extra_code(n));
- }
- if (subclass()) {
- f.write_indent(level+1);
- f.write_string("class");
- f.write_word(subclass());
- }
-}
-
-void Fl_Widget_Type::read_property(Fd_Project_Reader &f, const char *c) {
- int x,y,w,h; Fl_Font ft; int s; Fl_Color cc;
- if (!strcmp(c,"private")) {
- public_ = 0;
- } else if (!strcmp(c,"protected")) {
- public_ = 2;
- } else if (!strcmp(c,"xywh")) {
- if (sscanf(f.read_word(),"%d %d %d %d",&x,&y,&w,&h) == 4) {
- x += pasteoffset;
- y += pasteoffset;
- // FIXME temporary change!
- if (f.read_version>=2.0 && o->parent() && o->parent()!=o->window()) {
- x += o->parent()->x();
- y += o->parent()->y();
- }
- o->resize(x,y,w,h);
- }
- } else if (!strcmp(c,"tooltip")) {
- tooltip(f.read_word());
- } else if (!strcmp(c,"scale_image")) {
- if (sscanf(f.read_word(),"%d %d",&w,&h) == 2) {
- scale_image_w_ = w;
- scale_image_h_ = h;
- }
- } else if (!strcmp(c,"image")) {
- image_name(f.read_word());
- // starting in 2023, `image` is always followed by `compress_image`
- // the code below is for compatibility with older .fl files
- const char *ext = fl_filename_ext(image_name_);
- if ( strcmp(ext, ".jpg")
- && strcmp(ext, ".png")
- && strcmp(ext, ".svg")
- && strcmp(ext, ".svgz"))
- compress_image_ = 0; // if it is neither of those, default to uncompressed
- } else if (!strcmp(c,"bind_image")) {
- bind_image_ = (int)atol(f.read_word());
- } else if (!strcmp(c,"compress_image")) {
- compress_image_ = (int)atol(f.read_word());
- } else if (!strcmp(c,"scale_deimage")) {
- if (sscanf(f.read_word(),"%d %d",&w,&h) == 2) {
- scale_deimage_w_ = w;
- scale_deimage_h_ = h;
- }
- } else if (!strcmp(c,"deimage")) {
- inactive_name(f.read_word());
- // starting in 2023, `deimage` is always followed by `compress_deimage`
- // the code below is for compatibility with older .fl files
- const char *ext = fl_filename_ext(inactive_name_);
- if ( strcmp(ext, ".jpg")
- && strcmp(ext, ".png")
- && strcmp(ext, ".svg")
- && strcmp(ext, ".svgz"))
- compress_deimage_ = 0; // if it is neither of those, default to uncompressed
- } else if (!strcmp(c,"bind_deimage")) {
- bind_deimage_ = (int)atol(f.read_word());
- } else if (!strcmp(c,"compress_deimage")) {
- compress_deimage_ = (int)atol(f.read_word());
- } else if (!strcmp(c,"type")) {
- if (is_a(ID_Spinner))
- ((Fl_Spinner*)o)->type(item_number(subtypes(), f.read_word()));
- else
- o->type(item_number(subtypes(), f.read_word()));
- } else if (!strcmp(c,"box")) {
- const char* value = f.read_word();
- if ((x = boxnumber(value))) {
- if (x == ZERO_ENTRY) x = 0;
- o->box((Fl_Boxtype)x);
- } else if (sscanf(value,"%d",&x) == 1) o->box((Fl_Boxtype)x);
- } else if (is_a(ID_Button) && !strcmp(c,"down_box")) {
- const char* value = f.read_word();
- if ((x = boxnumber(value))) {
- if (x == ZERO_ENTRY) x = 0;
- ((Fl_Button*)o)->down_box((Fl_Boxtype)x);
- }
- } else if (is_a(ID_Input_Choice) && !strcmp(c,"down_box")) {
- const char* value = f.read_word();
- if ((x = boxnumber(value))) {
- if (x == ZERO_ENTRY) x = 0;
- ((Fl_Input_Choice*)o)->down_box((Fl_Boxtype)x);
- }
- } else if (is_a(ID_Menu_) && !strcmp(c,"down_box")) {
- const char* value = f.read_word();
- if ((x = boxnumber(value))) {
- if (x == ZERO_ENTRY) x = 0;
- ((Fl_Menu_*)o)->down_box((Fl_Boxtype)x);
- }
- } else if (is_button() && !strcmp(c,"value")) {
- const char* value = f.read_word();
- ((Fl_Button*)o)->value(atoi(value));
- } else if (!strcmp(c,"color")) {
- const char *cw = f.read_word();
- if (cw[0]=='0' && cw[1]=='x') {
- sscanf(cw,"0x%x",&x);
- o->color(x);
- } else {
- int n = sscanf(cw,"%d %d",&x,&y);
- if (n == 2) { // back compatibility...
- if (x != 47) o->color(x);
- o->selection_color(y);
- } else {
- o->color(x);
- }
- }
- } else if (!strcmp(c,"selection_color")) {
- if (sscanf(f.read_word(),"%d",&x)) o->selection_color(x);
- } else if (!strcmp(c,"labeltype")) {
- c = f.read_word();
- if (!strcmp(c,"image")) {
- Fluid_Image *i = Fluid_Image::find(label());
- if (!i) f.read_error("Image file '%s' not found", label());
- else setimage(i);
- image_name(label());
- label("");
- } else {
- o->labeltype((Fl_Labeltype)item_number(labeltypemenu,c));
- }
- } else if (!strcmp(c,"labelfont")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->labelfont(x);
- } else if (!strcmp(c,"labelsize")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->labelsize(x);
- } else if (!strcmp(c,"labelcolor")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->labelcolor(x);
- } else if (!strcmp(c,"align")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->align(x);
- } else if (!strcmp(c,"h_label_margin")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->horizontal_label_margin(x);
- } else if (!strcmp(c,"v_label_margin")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->vertical_label_margin(x);
- } else if (!strcmp(c,"image_spacing")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->label_image_spacing(x);
- } else if (!strcmp(c,"when")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) o->when(x);
- } else if (!strcmp(c,"minimum")) {
- if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->minimum(strtod(f.read_word(),0));
- if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->minimum(strtod(f.read_word(),0));
- } else if (!strcmp(c,"maximum")) {
- if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->maximum(strtod(f.read_word(),0));
- if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->maximum(strtod(f.read_word(),0));
- } else if (!strcmp(c,"step")) {
- if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->step(strtod(f.read_word(),0));
- if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->step(strtod(f.read_word(),0));
- } else if (!strcmp(c,"value")) {
- if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->value(strtod(f.read_word(),0));
- if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->value(strtod(f.read_word(),0));
- } else if ( (!strcmp(c,"slider_size") || !strcmp(c,"size")) && is_a(ID_Slider)) {
- ((Fl_Slider*)o)->slider_size(strtod(f.read_word(),0));
- } else if (!strcmp(c,"textfont")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) {ft=(Fl_Font)x; textstuff(1,ft,s,cc);}
- } else if (!strcmp(c,"textsize")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) {s=x; textstuff(2,ft,s,cc);}
- } else if (!strcmp(c,"textcolor")) {
- if (sscanf(f.read_word(),"%d",&x) == 1) {cc=(Fl_Color)x;textstuff(3,ft,s,cc);}
- } else if (!strcmp(c,"hide")) {
- o->hide();
- } else if (!strcmp(c,"deactivate")) {
- o->deactivate();
- } else if (!strcmp(c,"resizable")) {
- resizable(1);
- } else if (!strcmp(c,"hotspot") || !strcmp(c, "divider")) {
- hotspot(1);
- } else if (!strcmp(c,"class")) {
- subclass(f.read_word());
- } else if (!strcmp(c,"shortcut")) {
- int shortcut = (int)strtol(f.read_word(),0,0);
- if (is_button()) ((Fl_Button*)o)->shortcut(shortcut);
- else if (is_a(ID_Input)) ((Fl_Input_*)o)->shortcut(shortcut);
- else if (is_a(ID_Value_Input)) ((Fl_Value_Input*)o)->shortcut(shortcut);
- else if (is_a(ID_Text_Display)) ((Fl_Text_Display*)o)->shortcut(shortcut);
- } else {
- if (!strncmp(c,"code",4)) {
- int n = atoi(c+4);
- if (n >= 0 && n <= NUM_EXTRA_CODE) {
- extra_code(n,f.read_word());
- return;
- }
- } else if (!strcmp(c,"extra_code")) {
- extra_code(0,f.read_word());
- return;
- }
- Fl_Type::read_property(f, c);
- }
-}
-
-Fl_Menu_Item boxmenu1[] = {
- // these extra ones are for looking up fdesign saved strings:
- {"NO_FRAME", 0,0,(void *)FL_NO_BOX},
- {"ROUNDED3D_UPBOX", 0,0,(void *)_FL_ROUND_UP_BOX},
- {"ROUNDED3D_DOWNBOX", 0,0,(void *)_FL_ROUND_DOWN_BOX},
- {"OVAL3D_UPBOX", 0,0,(void *)_FL_ROUND_UP_BOX},
- {"OVAL3D_DOWNBOX", 0,0,(void *)_FL_ROUND_DOWN_BOX},
- {"0", 0,0,(void *)ZERO_ENTRY},
- {"1", 0,0,(void *)FL_UP_BOX},
- {"2", 0,0,(void *)FL_DOWN_BOX},
- {"3", 0,0,(void *)FL_FLAT_BOX},
- {"4", 0,0,(void *)FL_BORDER_BOX},
- {"5", 0,0,(void *)FL_SHADOW_BOX},
- {"6", 0,0,(void *)FL_FRAME_BOX},
- {"7", 0,0,(void *)FL_ROUNDED_BOX},
- {"8", 0,0,(void *)FL_RFLAT_BOX},
- {"9", 0,0,(void *)FL_RSHADOW_BOX},
- {"10", 0,0,(void *)FL_UP_FRAME},
- {"11", 0,0,(void *)FL_DOWN_FRAME},
-{0}};
-
-int lookup_symbol(const char *, int &, int numberok = 0);
-
-int Fl_Widget_Type::read_fdesign(const char* propname, const char* value) {
- int v;
- if (!strcmp(propname,"box")) {
- float x,y,w,h;
- if (sscanf(value,"%f %f %f %f",&x,&y,&w,&h) == 4) {
- if (fdesign_flip) {
- Fl_Type *p;
- for (p = parent; p && !p->is_a(ID_Window); p = p->parent) {/*empty*/}
- if (p && p->is_widget()) y = ((Fl_Widget_Type*)p)->o->h()-(y+h);
- }
- x += pasteoffset;
- y += pasteoffset;
- o->resize(int(x),int(y),int(w),int(h));
- }
- } else if (!strcmp(propname,"label")) {
- label(value);
- } else if (!strcmp(propname,"name")) {
- this->name(value);
- } else if (!strcmp(propname,"callback")) {
- callback(value); user_data_type("long");
- } else if (!strcmp(propname,"argument")) {
- user_data(value);
- } else if (!strcmp(propname,"shortcut")) {
- if (value[0]) {
- char buf[128]; sprintf(buf,"o->shortcut(\"%s\");",value);
- extra_code(0,buf);
- }
- } else if (!strcmp(propname,"style")) {
- if (!strncmp(value,"FL_NORMAL",9)) return 1;
- if (!lookup_symbol(value,v,1)) return 0;
- o->labelfont(v); o->labeltype((Fl_Labeltype)(v>>8));
- } else if (!strcmp(propname,"size")) {
- if (!lookup_symbol(value,v,1)) return 0;
- o->labelsize(v);
- } else if (!strcmp(propname,"type")) {
- if (!strncmp(value,"NORMAL",6)) return 1;
- if (lookup_symbol(value,v,1)) {o->type(v); return 1;}
- if (!strcmp(value+strlen(value)-5,"FRAME")) goto TRY_BOXTYPE;
- if (!strcmp(value+strlen(value)-3,"BOX")) goto TRY_BOXTYPE;
- return 0;
- } else if (!strcmp(propname,"lcol")) {
- if (!lookup_symbol(value,v,1)) return 0;
- o->labelcolor(v);
- } else if (!strcmp(propname,"return")) {
- if (!lookup_symbol(value,v,0)) return 0;
- o->when(v|FL_WHEN_RELEASE);
- } else if (!strcmp(propname,"alignment")) {
- if (!lookup_symbol(value,v)) {
- // convert old numeric values:
- int v1 = atoi(value); if (v1 <= 0 && strcmp(value,"0")) return 0;
- v = 0;
- if (v1 >= 5) {v = FL_ALIGN_INSIDE; v1 -= 5;}
- switch (v1) {
- case 0: v += FL_ALIGN_TOP; break;
- case 1: v += FL_ALIGN_BOTTOM; break;
- case 2: v += FL_ALIGN_LEFT; break;
- case 3: v += FL_ALIGN_RIGHT; break;
- case 4: v += FL_ALIGN_CENTER; break;
- default: return 0;
- }
- }
- o->align(v);
- } else if (!strcmp(propname,"resizebox")) {
- resizable(1);
- } else if (!strcmp(propname,"colors")) {
- char* p = (char*)value;
- while (*p != ' ') {if (!*p) return 0; p++;}
- *p = 0;
- int v1;
- if (!lookup_symbol(value,v,1) || !lookup_symbol(p+1,v1,1)) {
- *p=' '; return 0;}
- o->color(v,v1);
- } else if (!strcmp(propname,"resize")) {
- return !strcmp(value,"FL_RESIZE_ALL");
- } else if (!strcmp(propname,"gravity")) {
- return !strcmp(value,"FL_NoGravity FL_NoGravity");
- } else if (!strcmp(propname,"boxtype")) {
- TRY_BOXTYPE:
- int x = boxnumber(value);
- if (!x) {x = item_number(boxmenu1, value); if (x < 0) return 0;}
- if (x == ZERO_ENTRY) {
- x = 0;
- if (o->box() != ((Fl_Widget_Type*)factory)->o->box()) return 1; // kludge for frame
- }
- o->box((Fl_Boxtype)x);
- } else {
- return 0;
- }
- return 1;
-}
-
-void leave_live_mode_cb(Fl_Widget*, void*) {
- live_mode_cb(0, 0);
-}
-
-Fl_Widget *Fl_Widget_Type::enter_live_mode(int) {
- live_widget = widget(o->x(), o->y(), o->w(), o->h());
- if (live_widget)
- copy_properties();
- return live_widget;
-}
-
-Fl_Widget* Fl_Widget_Type::propagate_live_mode(Fl_Group* grp) {
- live_widget = grp;
- copy_properties();
- Fl_Type *n;
- for (n = next; n && n->level > level; n = n->next) {
- if (n->level == level+1) {
- Fl_Widget* proxy_child = n->enter_live_mode();
- if (proxy_child && n->is_widget() && ((Fl_Widget_Type*)n)->resizable()) {
- grp->resizable(proxy_child);
- }
- }
- }
- grp->end();
- live_widget = grp;
- copy_properties_for_children();
- return live_widget;
-}
-
-
-void Fl_Widget_Type::leave_live_mode() {
-}
-
-/**
- copy all properties from the edit widget to the live widget
- */
-void Fl_Widget_Type::copy_properties() {
- if (!live_widget)
- return;
-
- Fl_Font ff = 0;
- int fs = 0;
- Fl_Color fc = 0;
- textstuff(0, ff, fs, fc);
-
- // copy all attributes common to all widget types
- Fl_Widget *w = live_widget;
- w->label(o->label());
- w->tooltip(tooltip());
- w->type(o->type());
- w->box(o->box());
- w->color(o->color());
- w->selection_color(o->selection_color());
- w->labeltype(o->labeltype());
- w->labelfont(o->labelfont());
- w->labelsize(o->labelsize());
- w->labelcolor(o->labelcolor());
- w->align(o->align());
- w->when(o->when());
-
- // copy all attributes specific to widgets derived from Fl_Button
- if (is_button()) {
- Fl_Button* d = (Fl_Button*)live_widget, *s = (Fl_Button*)o;
- d->down_box(s->down_box());
- d->shortcut(s->shortcut());
- d->value(s->value());
- }
-
- // copy all attributes specific to widgets derived from Fl_Input_
- if (is_a(ID_Input)) {
- Fl_Input_* d = (Fl_Input_*)live_widget, *s = (Fl_Input_*)o;
- d->shortcut(s->shortcut());
- d->textfont(ff);
- d->textsize(fs);
- d->textcolor(fc);
- }
-
- // copy all attributes specific to widgets derived from Fl_Value_Input
- if (is_a(ID_Value_Input)) {
- Fl_Value_Input* d = (Fl_Value_Input*)live_widget, *s = (Fl_Value_Input*)o;
- d->shortcut(s->shortcut());
- d->textfont(ff);
- d->textsize(fs);
- d->textcolor(fc);
- }
-
- // copy all attributes specific to widgets derived from Fl_Text_Display
- if (is_a(ID_Text_Display)) {
- Fl_Text_Display* d = (Fl_Text_Display*)live_widget, *s = (Fl_Text_Display*)o;
- d->shortcut(s->shortcut());
- d->textfont(ff);
- d->textsize(fs);
- d->textcolor(fc);
- }
-
- // copy all attributes specific to Fl_Valuator and derived classes
- if (is_a(ID_Valuator_)) {
- Fl_Valuator* d = (Fl_Valuator*)live_widget, *s = (Fl_Valuator*)o;
- d->minimum(s->minimum());
- d->maximum(s->maximum());
- d->step(s->step());
- d->value(s->value());
- if (is_a(ID_Slider)) {
- Fl_Slider *d = (Fl_Slider*)live_widget, *s = (Fl_Slider*)o;
- d->slider_size(s->slider_size());
- }
- }
-
- // copy all attributes specific to Fl_Spinner and derived classes
- if (is_a(ID_Spinner)) {
- Fl_Spinner* d = (Fl_Spinner*)live_widget, *s = (Fl_Spinner*)o;
- d->minimum(s->minimum());
- d->maximum(s->maximum());
- d->step(s->step());
- d->value(s->value());
- }
-
- if (!o->visible())
- w->hide();
- if (!o->active())
- w->deactivate();
-}
-