]> git.lyx.org Git - features.git/commitdiff
Baruch's graphics-patch + minipage-support in tabular-cells.
authorJürgen Vigna <jug@sad.it>
Mon, 31 Jul 2000 12:30:10 +0000 (12:30 +0000)
committerJürgen Vigna <jug@sad.it>
Mon, 31 Jul 2000 12:30:10 +0000 (12:30 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@938 a592a061-630c-0410-9148-cb99ea01b6c8

42 files changed:
ChangeLog
configure.in
po/POTFILES.in
src/LaTeXFeatures.C
src/LaTeXFeatures.h
src/Makefile.am
src/buffer.C
src/bufferlist.C
src/frontends/Dialogs.h
src/frontends/kde/Dialogs.C
src/frontends/xforms/Dialogs.C
src/frontends/xforms/FormGraphics.C [new file with mode: 0644]
src/frontends/xforms/FormGraphics.h [new file with mode: 0644]
src/frontends/xforms/FormTabular.C
src/frontends/xforms/Makefile.am
src/frontends/xforms/RadioButtonGroup.C [new file with mode: 0644]
src/frontends/xforms/RadioButtonGroup.h [new file with mode: 0644]
src/frontends/xforms/form_graphics.C [new file with mode: 0644]
src/frontends/xforms/form_graphics.h [new file with mode: 0644]
src/frontends/xforms/form_tabular.C
src/frontends/xforms/form_tabular.h
src/frontends/xforms/forms/form_graphics.fd [new file with mode: 0644]
src/frontends/xforms/forms/form_tabular.fd
src/frontends/xforms/forms/makefile
src/graphics/.cvsignore [new file with mode: 0644]
src/graphics/GraphicsCache.C [new file with mode: 0644]
src/graphics/GraphicsCache.h [new file with mode: 0644]
src/graphics/GraphicsCacheItem.C [new file with mode: 0644]
src/graphics/GraphicsCacheItem.h [new file with mode: 0644]
src/graphics/Makefile.am [new file with mode: 0644]
src/graphics/README [deleted file]
src/insets/Makefile.am
src/insets/insetgraphics.C
src/insets/insetgraphics.h
src/insets/insetgraphicsParams.C [new file with mode: 0644]
src/insets/insetgraphicsParams.h [new file with mode: 0644]
src/insets/insettabular.C
src/lyxfunc.C
src/support/Makefile.am
src/support/translator.h [new file with mode: 0644]
src/tabular.C
src/tabular.h

index 815e32949b726927c7977d86d81b5cb121570f87..5376d08fac76fc90de3fc61ac8dc3dca7b0165d5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,50 @@
+2000-07-31  Juergen Vigna  <jug@sad.it>
+
+       * src/frontends/xforms/FormTabular.C (local_update): changed
+       radio_linebreaks to radio_useparbox and added radio_useminipage.
+
+       * src/tabular.C: made support for using minipages/parboxes.
+
+       * src/bufferlist.C (QwriteAll): small fix for asking for save.
+
+       * src/insets/insetgraphics.C (draw): just draw the inset so that the
+       cursor is visible.
+       (descent): so the cursor is in the middle.
+       (width): bit smaller box.
+
+       * src/insets/insetgraphics.h: added display() function.
+
+2000-07-31  Baruch Even <baruch.even@writeme.com>
+
+    * src/frontends/Dialogs.h: Added showGraphics signals.
+    
+    * src/frontends/xforms/forms/form_graphics.fd: Added file, the xforms
+                    form definition of the graphics dialog.
+
+    * src/frontends/xforms/FormGraphics.h:
+    * src/frontends/xforms/FormGraphics.C: Added files, the GUIndependent
+                    code of InsetGraphics
+    
+    * src/insets/insetgraphics.h:
+    * src/insets/insetgraphics.C: Major writing to make it work.
+
+    * src/insets/insetgraphicsParams.h:
+    * src/insets/insetgraphicsParams.C: Added files, parameter passing struct
+                    between InsetGraphics and GUI.
+
+    * src/LaTeXFeatures.h:
+    * src/LaTeXFeatures.C (c-tor, require, getPackages):
+                    Enabled support for graphicx package.
+
+    * src/buffer.C (parseSingleLyXformat2Token):
+                    Fixed read support for the graphics inset.
+
+    * src/support/translator.h: Added file, used in InsetGraphicsParams. this                       is a template to translate between two types.
+
+    * src/frontends/xforms/RadioButtonGroup.h:
+    * src/frontends/xforms/RadioButtonGroup.C: Added files, Comprise a way to
+                    easily control a radio button group.
+
 2000-07-28  Juergen Vigna  <jug@sad.it>
 
        * src/insets/insettabular.C (LocalDispatch): 
index 90dec3eeaac3499e7ae52ac6eb74c8bfdae6a90d..bb5ac70cda9653c162df0a898653941d923e6b4a 100644 (file)
@@ -272,6 +272,7 @@ AC_OUTPUT([Makefile \
        po/Makefile.in \
        src/Makefile \
        src/mathed/Makefile \
+       src/graphics/Makefile \
        src/insets/Makefile \
        src/support/Makefile \
        src/xtl/Makefile \
index 4fb870e63dff1883667ce6334561e6ed9cdf5c0f..142c74d2a0da2a516a99724dda343dc52e7a991b 100644 (file)
@@ -31,6 +31,8 @@ src/frontends/xforms/FormCitation.C
 src/frontends/xforms/form_citation.C
 src/frontends/xforms/FormCopyright.C
 src/frontends/xforms/form_copyright.C
+src/frontends/xforms/FormGraphics.C
+src/frontends/xforms/form_graphics.C
 src/frontends/xforms/FormPreferences.C
 src/frontends/xforms/form_preferences.C
 src/frontends/xforms/FormPrint.C
@@ -40,6 +42,7 @@ src/frontends/xforms/forms/form_copyright.C
 src/frontends/xforms/forms/form_preferences.C
 src/frontends/xforms/forms/form_print.C
 src/frontends/xforms/forms/form_tabular.C
+src/frontends/xforms/forms/form_url.C
 src/frontends/xforms/FormTabular.C
 src/frontends/xforms/form_tabular.C
 src/frontends/xforms/FormUrl.C
index c7172bfa5577ea7c6d09f4bd6c8f9bfd8e5bc766..36c37e65616a0e6fb07c4b32bc82e3eeffd6c246 100644 (file)
@@ -31,7 +31,8 @@ LaTeXFeatures::LaTeXFeatures(BufferParams const & p, int n)
        // packages
        array = false;
        color = false;
-       graphics = false;
+       graphics = false; // INSET_GRAPHICS: remove this when InsetFig is thrown.
+    graphicx = false;
        setspace = false;
        makeidx = false;
        verbatim = false;
@@ -79,11 +80,8 @@ void LaTeXFeatures::require(string const & name) {
        } else if (name == "color") {
                color = true;
        } else if (name == "graphics") {
-#ifdef USE_GRAPHICX
                graphicx = true;
-#else
-               graphics = true;
-#endif
+               graphics = true;// INSET_GRAPHICS: remove this when InsetFig is thrown.
        } else if (name == "setspace") {
                setspace = true;
        } else if (name == "makeidx") {
@@ -151,6 +149,16 @@ string LaTeXFeatures::getPackages()
                packages += "\\makeindex\n";
        }
 
+       // graphicx.sty
+       if (graphicx && params.graphicsDriver != "none") {
+               if (params.graphicsDriver == "default")
+                       packages += "\\usepackage{graphicx}\n";
+               else
+                       packages += "\\usepackage[" 
+                               + params.graphicsDriver + "]{graphicx}\n";
+       }
+
+    // INSET_GRAPHICS: remove this when InsetFig is thrown.
        // graphics.sty
        if (graphics && params.graphicsDriver != "none") {
                if (params.graphicsDriver == "default")
index 48c4bc198eba806b0ce737fabcd0189b6b8d5e08..cee55913a121baf94785f6acbfc916483df0c751 100644 (file)
@@ -58,13 +58,10 @@ struct LaTeXFeatures {
        bool array;
        ///
        bool color;     // color.sty
-#ifdef USE_GRAPHICX
        ///
        bool graphicx; // graphicx.sty
-#else
        ///
        bool graphics;  // graphics.sty
-#endif
        ///
        bool setspace;  // setspace.sty
        ///
index 3bd0547ce26dd74d218121a92325579c6ea70e2d..a722c258f8dc60503433d4fd811a047535b9da8e 100644 (file)
@@ -1,5 +1,5 @@
 AUTOMAKE_OPTIONS = foreign
-SUBDIRS = mathed insets support frontends
+SUBDIRS = mathed insets graphics support frontends
 DISTCLEANFILES= *.orig *.rej *~ *.bak core libintl.h config.h
 MAINTAINERCLEANFILES = $(srcdir)/Makefile.in $(srcdir)/config.h.in
 bin_PROGRAMS = lyx
@@ -8,6 +8,7 @@ bin_PROGRAMS = lyx
 ## free to provide another solution... Maybe signals would solve that
 ## magically, but I do not understand them much (JMarc)
 lyx_DEPENDENCIES = mathed/libmathed.la insets/libinsets.la \
+       graphics/libgraphics.la \
        frontends/libfrontends.la @FRONTEND_GUILIB@ \
        frontends/libfrontends.la support/libsupport.la @INCLUDED_SIGC@
 lyx_LDADD = $(lyx_DEPENDENCIES) @INTLLIBS@ $(LYX_LIBS) $(SIGC_LIBS) \
index cb9efd90d5c4ce1ae2adc75c2650dd207a0548e9..5a67d1e9bb1bd483ae0bcebcf984d96bc24177bb 100644 (file)
@@ -948,10 +948,11 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        inset->Read(this, lex);
                        par->InsertInset(pos, inset, font);
                        ++pos;
-               } else if (tmptok == "GRAPHICS") {
+               } else if (tmptok == "Graphics") {
                        Inset * inset = new InsetGraphics;
-                               //inset->Read(this, lex);
+            inset->Read(this, lex);
                        par->InsertInset(pos, inset, font);
+            ++pos;
                } else if (tmptok == "LatexCommand") {
                        InsetCommand inscmd;
                        inscmd.Read(this, lex);
@@ -3563,7 +3564,7 @@ int Buffer::runLiterate()
        users->owner()->getMiniBuffer()->Set(_("Running Literate..."));   
 
        // Remove all error insets
-       bool a = users->removeAutoInsets();
+       bool removedErrorInsets = users->removeAutoInsets();
 
        // generate the Literate file if necessary
        makeLaTeXFile(lit_name, org_path, false);
@@ -3596,7 +3597,7 @@ int Buffer::runLiterate()
 
        // if we removed error insets before we ran LaTeX or if we inserted
        // error insets after we ran LaTeX this must be run:
-        if (a || (res & Literate::ERRORS)){
+        if (removedErrorInsets || (res & Literate::ERRORS)){
                 users->redraw();
                 users->fitCursor();
                 //users->updateScrollbar();
@@ -3630,10 +3631,10 @@ int Buffer::buildProgram()
         users->owner()->getMiniBuffer()->Set(_("Building Program..."));   
  
         // Remove all error insets
-        bool a = users->removeAutoInsets();
+        bool removedErrorInsets = users->removeAutoInsets();
  
         // generate the LaTeX file if necessary
-        if (!isNwClean() || a) {
+        if (!isNwClean() || removedErrorInsets) {
                 makeLaTeXFile(lit_name, org_path, false);
                 markNwDirty();
         }
@@ -3667,7 +3668,7 @@ int Buffer::buildProgram()
         // if we removed error insets before we ran Literate/Build or
        // if we inserted error insets after we ran Literate/Build this
        // must be run:
-       if (a || (res & Literate::ERRORS)){
+       if (removedErrorInsets || (res & Literate::ERRORS)){
                users->redraw();
                users->fitCursor();
                //users->updateScrollbar();
index b43b3da8057b6efcd2c523ecb9c392539b3f400b..e180a015d6a46dd7bb5bc2fcba149c4e1c6dfb7e 100644 (file)
@@ -111,8 +111,10 @@ bool BufferList::QwriteAll()
                                case 1: // Yes
                                        if ((*it)->isUnnamed())
                                                reask = !MenuWriteAs((*it));
-                                       else
+                                       else {
                                                MenuWrite((*it));
+                                               reask = false;
+                                       }
                                        break;
                                case 2: // No
                                        askMoreConfirmation = true;
index 60e60b10fc5c20f4d1b8a3fff9173def71906412..48e825da70a77a9f3e56193045f00e1cdac7fda5 100644 (file)
@@ -29,6 +29,7 @@ class DialogBase;
 // Maybe this should be a UIFunc modelled on LyXFunc
 class LyXView;
 
+class InsetGraphics;
 class InsetBibKey;
 class InsetBibtex;
 class InsetCitation;
@@ -105,6 +106,8 @@ public:
        ///
        Signal0<void> showPreferences;
        ///
+       Signal1<void, InsetGraphics *> showGraphics;
+       ///
        Signal1<void, InsetInclude *> showInclude;
        ///
        Signal1<void, InsetIndex *> showIndex;
index eb754d96e1b1ab8854a6a621b8cb1fc16e0db4e7..e785c3e47c144a466faed53d3e5a1bb55247d8c6 100644 (file)
@@ -9,9 +9,9 @@
 #endif
 
 
-Dialogs::Dialogs(LyXFunc * lf)
+Dialogs::Dialogs(LyXView * lv)
 {
-       dialogs_.push_back(new FormCopyright(lf, this));
+       dialogs_.push_back(new FormCopyright(lv, this));
 
        // reduce the number of connections needed in
        // dialogs by a simple connection here.
index 26b63a400873a57e8f05c00cc8080f1e37f0f2a5..8cb2fd407aef875d9578b2f140437e6404f5fc0b 100644 (file)
@@ -2,9 +2,10 @@
 #include FORMS_H_LOCATION
 
 #include "Dialogs.h"
-#include "FormCitation.h"
 #include "FormCopyright.h"
 #include "FormPreferences.h"
+#include "FormGraphics.h"
+#include "FormCitation.h"
 #include "FormPrint.h"
 #include "FormTabular.h"
 #include "FormUrl.h"
 
 Dialogs::Dialogs(LyXView * lv)
 {
-       dialogs_.push_back(new FormCitation(lv, this));
        dialogs_.push_back(new FormCopyright(lv, this));
        dialogs_.push_back(new FormPreferences(lv, this));
+       dialogs_.push_back(new FormGraphics(lv, this));
+       dialogs_.push_back(new FormCitation(lv, this));
        dialogs_.push_back(new FormPrint(lv, this));
        dialogs_.push_back(new FormTabular(lv, this));
        dialogs_.push_back(new FormUrl(lv, this));
diff --git a/src/frontends/xforms/FormGraphics.C b/src/frontends/xforms/FormGraphics.C
new file mode 100644 (file)
index 0000000..d730b41
--- /dev/null
@@ -0,0 +1,514 @@
+/* FormGraphics.C
+ * FormGraphics Interface Class Implementation
+ */
+
+/* TODO:
+ *      * Handle the case when the buffer is read-only.
+ *          Initial work is done, if we are read-only the ok/cancel are 
+ *          disabled. Probably we need to find a better way to deal with it.
+ *      
+ */
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include <config.h>
+#include "lyx_gui_misc.h"
+#include "gettext.h"
+#include FORMS_H_LOCATION
+
+#include "xform_macros.h"
+#include "input_validators.h"
+#include "FormGraphics.h"
+#include "form_graphics.h"
+#include "Dialogs.h"
+#include "LyXView.h"
+#include "BufferView.h"
+
+#include "debug.h" // for lyxerr
+
+#include "support/lstrings.h" // for strToDbl & tostr
+#include "support/FileInfo.h" // for FileInfo
+#include "filedlg.h" // for LyXFileDlg
+#include "support/filetools.h" // for AddName
+#include "insets/insetgraphics.h"
+#include "insets/insetgraphicsParams.h"
+
+#include "RadioButtonGroup.h"
+
+#ifdef ENABLE_ASSERTIONS
+#include "support/LAssert.h"
+#endif
+
+C_RETURNCB(FormGraphics, WMHideCB)
+C_GENERICCB(FormGraphics, OKCB)
+C_GENERICCB(FormGraphics, ApplyCB)
+C_GENERICCB(FormGraphics, CancelCB)
+C_GENERICCB(FormGraphics, BrowseCB)    
+C_GENERICCB(FormGraphics, AdvancedOptionsCB)
+C_GENERICCB(FormGraphics, InputCB)
+
+    
+FormGraphics::FormGraphics(LyXView * lv, Dialogs * d)
+       : dialog_(0), lv_(lv), d_(d), inset_(0), 
+    // The buttons c-tor values are the number of buttons we use
+    // This is only to reduce memory waste.
+      widthButtons(5), heightButtons(4), displayButtons(4),
+      ih_(0), h_(0), u_(0), 
+      last_image_path(".")
+{
+       // let the dialog be shown
+       // This is a permanent connection so we won't bother
+       // storing a copy because we won't be disconnecting.
+       d->showGraphics.connect(slot(this, &FormGraphics::showDialog));
+}
+
+
+FormGraphics::~FormGraphics()
+{
+       free();
+}
+
+
+void FormGraphics::build()
+{
+    dialog_ = build_graphics();
+#ifdef ENABLE_ASSERTIONS
+    Assert(dialog_ != 0);
+#endif    
+    if (!dialog_) 
+        return;
+
+    // This is the place to add settings of the dialog that did not go
+    // to the .fd file.
+
+    // Set the input widgets to issue a callback to input() whenever
+    // they change, so we can verify their content.
+    fl_set_input_return(dialog_->input_width,
+            FL_RETURN_CHANGED);
+    fl_set_input_return(dialog_->input_height,
+            FL_RETURN_CHANGED);
+    fl_set_input_return(dialog_->input_filename,
+            FL_RETURN_CHANGED);
+//    fl_set_input_return(dialog_->input_rotate_angle,
+//            FL_RETURN_CHANGED);
+    
+    // Set the maximum characters that can be written in the input texts.
+    fl_set_input_maxchars(dialog_->input_width, WIDTH_MAXDIGITS);
+    fl_set_input_maxchars(dialog_->input_height, HEIGHT_MAXDIGITS);
+    fl_set_input_maxchars(dialog_->input_filename, FILENAME_MAXCHARS);
+    fl_set_input_maxchars(dialog_->input_rotate_angle, ROTATE_MAXCHARS);
+    
+    // Set input filter on width and height to make them accept only
+    // unsigned numbers.
+    fl_set_input_filter(dialog_->input_width,
+            fl_unsigned_int_filter);
+    fl_set_input_filter(dialog_->input_height,
+            fl_unsigned_int_filter);
+
+  
+    // Add the widgets of the width radio buttons to their group
+    widthButtons.reset();
+    widthButtons.registerRadioButton(dialog_->radio_width_default, 
+            InsetGraphicsParams::DEFAULT_SIZE);
+    widthButtons.registerRadioButton(dialog_->radio_width_cm, 
+            InsetGraphicsParams::CM);
+    widthButtons.registerRadioButton(dialog_->radio_width_inch, 
+            InsetGraphicsParams::INCH);
+    widthButtons.registerRadioButton(dialog_->radio_width_percent_page,
+            InsetGraphicsParams::PERCENT_PAGE);
+    widthButtons.registerRadioButton(dialog_->radio_width_percent_column, 
+            InsetGraphicsParams::PERCENT_COLUMN);
+    
+    // Add the widgets of the height radio buttons to their group
+    heightButtons.reset();
+    heightButtons.registerRadioButton(dialog_->radio_height_default, 
+            InsetGraphicsParams::DEFAULT_SIZE);
+    heightButtons.registerRadioButton(dialog_->radio_height_cm, 
+            InsetGraphicsParams::CM);
+    heightButtons.registerRadioButton(dialog_->radio_height_inch, 
+            InsetGraphicsParams::INCH);
+    heightButtons.registerRadioButton(dialog_->radio_height_percent_page,
+            InsetGraphicsParams::PERCENT_PAGE);
+    
+    // Add the widgets of the display radio buttons to their group
+    displayButtons.reset();
+    displayButtons.registerRadioButton(dialog_->radio_display_color, 
+            InsetGraphicsParams::COLOR);
+    displayButtons.registerRadioButton(dialog_->radio_display_grayscale, 
+            InsetGraphicsParams::GRAYSCALE);
+    displayButtons.registerRadioButton(dialog_->radio_display_monochrome, 
+            InsetGraphicsParams::MONOCHROME);
+    displayButtons.registerRadioButton(dialog_->radio_no_display, 
+            InsetGraphicsParams::NONE);
+    
+    // Connect a signal to hide the window when the window manager orders it.
+    fl_set_form_atclose(dialog_->form_graphics,
+                           C_FormGraphicsWMHideCB, 0);
+}
+
+void FormGraphics::show()
+{
+    // If the dialog doesn't exist yet, build it.
+       if (!dialog_) {
+               build();
+       }
+
+    // Update the form with the data from the inset.
+    update();
+    
+    // If the form is visible
+       if (dialog_->form_graphics->visible) {
+        // Raise it.
+               fl_raise_form(dialog_->form_graphics);
+       } else {
+        // Otherwise (invisible), show it.
+               fl_show_form(dialog_->form_graphics,
+                            FL_PLACE_MOUSE,
+                            FL_FULLBORDER,
+                            _("Graphics"));
+
+        // And connect the signals 'updateBufferDependent',
+        // 'hideBufferDependent' and 'hideGraphics'.
+               u_ = d_->updateBufferDependent.connect(slot(this,
+                                                           &FormGraphics::update));
+               h_ = d_->hideBufferDependent.connect(slot(this,
+                                                         &FormGraphics::hide));
+       }
+}
+
+void FormGraphics::showDialog(InsetGraphics* inset)
+{
+#ifdef ENABLE_ASSERTIONS
+    Assert(inset != 0);
+#endif 
+
+    // If we are connected to another inset, disconnect.
+    if (inset_)
+        ih_.disconnect();
+    
+    inset_ = inset;
+    
+    if (inset_) {
+        ih_ = inset_->hide.connect(slot(this, &FormGraphics::hide));
+        show();
+    }
+}
+
+
+void FormGraphics::hide()
+{
+    // If the dialog exists, and the form is allocated and visible.
+       if (dialog_
+               && dialog_->form_graphics
+               && dialog_->form_graphics->visible) {
+        // Hide the form
+               fl_hide_form(dialog_->form_graphics);
+
+        // And disconnect the signals.
+        u_.disconnect();
+               h_.disconnect();
+        ih_.disconnect();
+
+        // Forget the inset.
+        inset_ = 0;
+       }
+    // Most of the time, the dialog is not needed anymore, we'll free it
+    // now to save memory.
+    free();
+}
+
+
+void FormGraphics::free()
+{
+    // hide() will disconnect the signals so we need not worry about them.
+       if (dialog_) {
+               if (dialog_->form_graphics) {
+            // If the dialog is visible, hide it.
+            if (dialog_->form_graphics->visible) {
+                           hide();
+                   }
+           
+            // Remove all associations for the radio buttons
+            widthButtons.reset();
+            heightButtons.reset();
+            displayButtons.reset();
+            
+            // Free the form.
+                   fl_free_form(dialog_->form_graphics);
+        }
+
+               delete dialog_;
+               dialog_ = 0;
+       }
+}
+
+void FormGraphics::apply()
+{
+#ifdef ENABLE_ASSERTIONS
+    Assert(inset_ != 0);
+#endif    
+    if (! inset_)
+        return;
+
+    // Take all dialog details and insert them to the inset.
+
+    // Create the parameters structure and fill the data from the dialog.
+    InsetGraphicsParams igp;
+
+    igp.filename = fl_get_input(dialog_->input_filename);
+
+    igp.display = displayButtons.getButton();
+    
+    igp.widthResize = widthButtons.getButton();
+    igp.widthSize = strToDbl(fl_get_input(dialog_->input_width));
+
+    igp.heightResize = heightButtons.getButton();
+    igp.heightSize = strToDbl(fl_get_input(dialog_->input_height));
+
+    igp.rotateAngle = strToInt(fl_get_input(dialog_->input_rotate_angle));
+    if (igp.rotateAngle >= 360)
+        igp.rotateAngle = igp.rotateAngle % 360;
+    if (igp.rotateAngle <= -360)
+        igp.rotateAngle = - ((-igp.rotateAngle) % 360);
+   
+    igp.subcaption = fl_get_button(dialog_->check_subcaption);
+    igp.subcaptionText = fl_get_input(dialog_->input_subcaption);
+
+    igp.inlineFigure = fl_get_button(dialog_->check_inline);
+    
+#ifdef ENABLE_ASSERTIONS    
+    igp.testInvariant();
+#endif
+
+    // Set the parameters in the inset, it also returns true if the new
+    // parameters are different from what was in the inset already.
+    bool changed = inset_->setParams(igp);
+
+    // Tell LyX we've got a change, and mark the document dirty, if it changed.
+    lv_->view()->updateInset(inset_, changed);
+}
+
+void FormGraphics::update()
+{
+#ifdef ENABLE_ASSERTIONS
+    Assert(inset_ != 0);
+#endif    
+    if (! inset_)
+        return;
+
+    // Update dialog with details from inset
+    InsetGraphicsParams igp = inset_->getParams();
+
+    // Update the filename input field
+    fl_set_input(dialog_->input_filename,
+            igp.filename.c_str());
+
+    // Update the display depth radio buttons
+    displayButtons.setButton(igp.display);
+    
+    // Update the width radio buttons and input field
+    widthButtons.setButton(igp.widthResize);
+    fl_set_input(dialog_->input_width,
+            tostr(igp.widthSize).c_str());
+
+    // Update the height radio buttons and input field
+    heightButtons.setButton(igp.heightResize);
+    fl_set_input(dialog_->input_height,
+            tostr(igp.heightSize).c_str());
+
+    // Update the rotate angle
+    fl_set_input(dialog_->input_rotate_angle,
+            tostr(igp.rotateAngle).c_str());
+  
+    // Update the subcaption check button and input field
+    fl_set_button(dialog_->check_subcaption,
+            igp.subcaption);
+    fl_set_input(dialog_->input_subcaption,
+            igp.subcaptionText.c_str());
+   
+    // Update the inline figure check button
+    fl_set_button(dialog_->check_inline,
+            igp.inlineFigure);
+   
+    // Now make sure that the buttons are set correctly. 
+    input();
+}
+
+void FormGraphics::input() 
+{
+    // Put verifications that the dialog shows some sane values,
+    // if not disallow clicking on ok/apply.
+    // Possibly use a label in the bottom of the dialog to give the reason.
+
+    // Is all input boxes convey a valid meaning?
+    bool inputOK = true;
+
+    // Things that we check (meaning they are incorrect states):
+    // 1. No filename specified. 
+    // 2. Width radio button is not Default and width text is not a number.
+    // 3. Height radio button is not Default and height text is a not a number
+  
+    // Note: radio button default means that the user asks for the image
+    // to be included as is with no size change, in this case we don't need
+    // any width or height.
+  
+    // We verify now that there is a filename, it exists, it's a file
+    // and it's readable.
+    string filename = fl_get_input(dialog_->input_filename);
+    FileInfo file(filename);
+    if (filename.empty()       
+            || !file.isOK()       
+            || !file.exist()     
+            || !file.isRegular()     
+            || !file.readable()
+       )
+        inputOK = false;
+
+    // Width radio button not default and no number.
+    if  (!fl_get_button(dialog_->radio_width_default)
+           && strToDbl(fl_get_input(dialog_->input_width)) <= 0.0) {
+            
+        inputOK = false;
+    }
+
+    // Height radio button not default and no number.
+    if (!fl_get_button(dialog_->radio_height_default) 
+            && strToDbl(fl_get_input(dialog_->input_height)) <= 0.0) {
+        
+        inputOK = false;
+    }
+
+
+    // Now set the buttons to the correct state.
+    if (inputOK && ! lv_->buffer()->isReadonly()) {
+        fl_activate_object(dialog_->button_ok);
+        fl_activate_object(dialog_->button_apply);
+        fl_set_object_lcol(dialog_->button_ok, FL_BLACK);
+        fl_set_object_lcol(dialog_->button_apply, FL_BLACK);
+    } else {
+        fl_deactivate_object(dialog_->button_ok);
+        fl_deactivate_object(dialog_->button_apply);
+        fl_set_object_lcol(dialog_->button_ok, FL_INACTIVE);
+        fl_set_object_lcol(dialog_->button_apply, FL_INACTIVE);
+    }
+}
+
+
+// We need these in the file browser.
+extern string system_lyxdir;
+extern string user_lyxdir;
+//extern string system_tempdir;
+
+// Need to move this to the form_graphics
+string FormGraphics::browseFile(string const & filename)
+{
+    if (! filename.empty() )
+        last_image_path = OnlyPath(filename);
+
+    // Does user clipart directory exist?
+    string bufclip = AddName (user_lyxdir, "clipart"); 
+    FileInfo fileInfo(bufclip);
+    if (!(fileInfo.isOK() && fileInfo.isDir()))
+        // No - bail out to system clipart directory
+        bufclip = AddName (system_lyxdir, "clipart");  
+
+    LyXFileDlg fileDlg;
+    fileDlg.SetButton(0, _("Clipart"), bufclip); 
+
+    bool error = false;
+    string buf;
+    do {
+        string p = fileDlg.Select(_("Graphics"),
+                last_image_path,
+                "*(ps|png)", filename);
+
+        if (p.empty()) return p;
+
+        last_image_path = OnlyPath(p);
+
+        if (p.find_first_of("#~$% ") != string::npos) {
+                       WriteAlert(_("Filename can't contain any "
+                                    "of these characters:"),
+                                  // xgettext:no-c-format
+                                  _("space, '#', '~', '$' or '%'.")); 
+                       error = true;
+               } else {
+            error = false;
+            buf = p;
+        }
+       } while (error);
+
+       return buf;
+}
+
+void FormGraphics::browse()
+{
+    // Get the filename from the dialog
+    string filename = fl_get_input(dialog_->input_filename);
+
+    // Show the file browser dialog
+    string new_filename = browseFile(filename);
+
+    // Save the filename to the dialog
+    if (new_filename != filename && ! new_filename.empty()) {
+        fl_set_input(dialog_->input_filename,
+                     new_filename.c_str());
+        // The above set input doesn't cause an input event so we do
+        // it manually. Otherwise the user needs to cause an input event
+        // to get the ok/apply buttons to be activated.
+        input();
+    }
+    
+}
+
+int FormGraphics::WMHideCB(FL_FORM * form, void *)
+{
+       // Ensure that the signal h is disconnected even if the
+       // window manager is used to close the dialog.
+       FormGraphics * pre = static_cast<FormGraphics*>(form->u_vdata);
+       pre->hide();
+       return FL_CANCEL;
+}
+
+
+void FormGraphics::OKCB(FL_OBJECT * ob, long)
+{
+       FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
+    pre->apply();
+       pre->hide();
+}
+
+void FormGraphics::ApplyCB(FL_OBJECT * ob, long)
+{
+       FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
+       pre->apply();
+}
+
+void FormGraphics::CancelCB(FL_OBJECT * ob, long)
+{
+       FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
+       pre->hide();
+}
+
+void FormGraphics::BrowseCB(FL_OBJECT * ob, long)
+{
+       FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
+    pre->browse();
+}
+
+void FormGraphics::AdvancedOptionsCB(FL_OBJECT * /* ob */, long)
+{
+//  FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
+//     pre->showAdvancedOptions();
+    lyxerr << "Advanced Options button depressed, "
+              "show advanced options dialog"
+           << endl;
+}
+
+void FormGraphics::InputCB(FL_OBJECT * ob, long)
+{
+    FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
+       pre->input();
+}
diff --git a/src/frontends/xforms/FormGraphics.h b/src/frontends/xforms/FormGraphics.h
new file mode 100644 (file)
index 0000000..b2642cc
--- /dev/null
@@ -0,0 +1,145 @@
+// -*- C++ -*-
+/* FormGraphics.h
+ * FormGraphics Interface Class
+ *
+ * This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 1995 Matthias Ettrich
+ *           Copyright 1995-2000 The LyX Team.
+ *
+ *           This file Copyright 2000
+ *           Baruch Even
+ * ======================================================
+ */
+
+#ifndef FORMGRAPHICS_H
+#define FORMGRAPHICS_H
+
+#include <config.h>
+#include "LString.h"
+#include "frontends/DialogBase.h"
+//#include "form_graphics.h"
+#include "RadioButtonGroup.h"
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+class Dialogs;
+// same arguement as in Dialogs.h s/LyX/UI/
+class LyXView;
+class InsetGraphics;
+
+struct FD_form_graphics;
+
+/** This class provides an XForms implementation of the FormGraphics Dialog.
+ */
+class FormGraphics: public DialogBase {
+public:
+       /**@name Constructors and Destructors */
+       //@{
+       /// #FormGraphics x(LyXFunc ..., Dialogs ...);#
+       FormGraphics(LyXView *, Dialogs *);
+       ///
+       ~FormGraphics();
+       //@}
+
+       /**@name Real per-instance Callback Methods */
+       //@{
+       static  int WMHideCB(FL_FORM *, void *);
+       static void OKCB(FL_OBJECT *, long);
+    static void ApplyCB(FL_OBJECT *, long);
+    static void CancelCB(FL_OBJECT *, long);
+    static void BrowseCB(FL_OBJECT *, long);
+    static void AdvancedOptionsCB(FL_OBJECT *, long);
+    static void InputCB(FL_OBJECT *, long);
+       //@}
+
+private:
+       FormGraphics() : widthButtons(5), heightButtons(4), displayButtons(4) {}
+       FormGraphics(FormGraphics &) : DialogBase() {}
+       
+    /**@name Define enum constants */
+    //@{ 
+    /// The maximum digits for the image width (cm, inch, percent)
+    enum { WIDTH_MAXDIGITS = 3 }; 
+    /// The maximum digits for the image height (cm, inch, percent)
+    enum { HEIGHT_MAXDIGITS = 3 };
+    /// The maximum characters in the rotation angle (minus sign and 3 digits)
+    enum { ROTATE_MAXCHARS = 4 };
+    /// The maximum characters in a filename.
+    enum { FILENAME_MAXCHARS = 1024 };
+    //@}
+
+    
+       /**@name Slot Methods */
+       //@{
+       /// Save the active inset and show the dialog.
+       void showDialog(InsetGraphics * inset);
+       /// Create the dialog if necessary, update it and display it.
+    void show();
+       /// Hide the dialog.
+       void hide();
+       /// Update the dialog
+       void update();
+       //@}
+
+    /**@name Callback methods */
+    //@{
+    /// Apply the changes to the inset.
+    void apply();
+    /// Verify that the input is correct. If not disable ok/apply buttons.
+    void input();
+    /// Open the file browse dialog to select an image file.
+    void browse();
+       /// Build the dialog
+       //@}
+       
+    void build();
+       ///
+       FD_form_graphics * build_graphics();
+       /// Explicitly free the dialog.
+       void free();
+    /// Display a file browser dialog and return the file chosen.
+    string browseFile(string const & filename);
+
+       /**@name Private Data */
+       //@{
+       /// Real GUI implementation.
+       FD_form_graphics * dialog_;
+       /** Which LyXFunc do we use?
+           We could modify Dialogs to have a visible LyXFunc* instead and
+           save a couple of bytes per dialog.
+       */
+       LyXView * lv_;
+       /** Which Dialogs do we belong to?
+           Used so we can get at the signals we have to connect to.
+       */
+       Dialogs * d_;
+    /** Which Inset do we belong to?
+     *  Used to set and update data to/from the inset.
+     */
+    InsetGraphics * inset_;
+    /// The radio buttons groups
+    RadioButtonGroup widthButtons;
+    RadioButtonGroup heightButtons;
+    RadioButtonGroup displayButtons;
+
+    /// Inset Hide connection, connected to the calling inset hide signal.
+    Connection ih_;
+       /// Hide connection.
+       Connection h_;
+    /// Update connection.
+    Connection u_;
+    /// Last used figure path
+    string last_image_path;
+       //@}
+
+};
+
+#endif
+
+
index 5575f8608667136c33d8dee5b2783f9c071a205e..574fa10999ac8887a84f2a68a454041068cc4577 100644 (file)
@@ -407,14 +407,27 @@ bool FormTabular::local_update(bool)
         fl_activate_object(column_options_->input_column_width);
     }
     if (!pwidth.empty()) {
-        fl_activate_object(cell_options_->radio_linebreak_cell);
-        fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_BLACK);
-        fl_set_button(cell_options_->radio_linebreak_cell,
-                      tabular->GetLinebreaks(cell));
+        fl_activate_object(cell_options_->radio_useparbox);
+        fl_activate_object(cell_options_->radio_useminipage);
+        fl_set_object_lcol(cell_options_->radio_useparbox, FL_BLACK);
+        fl_set_object_lcol(cell_options_->radio_useminipage, FL_BLACK);
+       fl_set_button(cell_options_->radio_useparbox, 0);
+       fl_set_button(cell_options_->radio_useminipage, 0);
+       switch (tabular->GetUsebox(cell)) {
+       case 1:
+           fl_set_button(cell_options_->radio_useparbox, 1);
+           break;
+       case 2:
+           fl_set_button(cell_options_->radio_useminipage, 1);
+           break;
+       }
     } else {
-        fl_deactivate_object(cell_options_->radio_linebreak_cell);
-        fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_INACTIVE);
-        fl_set_button(cell_options_->radio_linebreak_cell,0);
+        fl_deactivate_object(cell_options_->radio_useparbox);
+        fl_set_object_lcol(cell_options_->radio_useparbox, FL_INACTIVE);
+        fl_set_button(cell_options_->radio_useparbox,0);
+        fl_deactivate_object(cell_options_->radio_useminipage);
+        fl_set_object_lcol(cell_options_->radio_useminipage, FL_INACTIVE);
+        fl_set_button(cell_options_->radio_useminipage,0);
     }
     align = tabular->GetAlignment(cell, true);
     fl_set_button(column_options_->radio_align_left, 0);
@@ -661,8 +674,12 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
             num = LyXTabular::SET_ROTATE_CELL;
        else
            num = LyXTabular::UNSET_ROTATE_CELL;
-    } else if (ob == cell_options_->radio_linebreak_cell) {
-        num = LyXTabular::SET_LINEBREAKS;
+    } else if (ob == cell_options_->radio_useparbox) {
+        num = LyXTabular::SET_USEBOX;
+       special = "1";
+    } else if (ob == cell_options_->radio_useminipage) {
+        num = LyXTabular::SET_USEBOX;
+       special = "2";
     } else if (ob == longtable_options_->radio_lt_firsthead) {
         num = LyXTabular::SET_LTFIRSTHEAD;
     } else if (ob == longtable_options_->radio_lt_head) {
index 594dfd35b1fe8fba4804df10c336c548a935f740..0edb0bda5c0b9b4ddc4f52330b9f4741d06e9d6a 100644 (file)
@@ -19,6 +19,10 @@ libxforms_la_SOURCES = \
        FormCopyright.h \
        form_copyright.C \
        form_copyright.h \
+       FormGraphics.C \
+       FormGraphics.h \
+       form_graphics.C \
+       form_graphics.h \
        FormPreferences.C \
        FormPreferences.h \
        form_preferences.C \
@@ -35,12 +39,14 @@ libxforms_la_SOURCES = \
        FormUrl.h \
        form_url.C \
        form_url.h \
-       Toolbar_pimpl.C \
-       Toolbar_pimpl.h \
-       Menubar_pimpl.C \
-       Menubar_pimpl.h \
        input_validators.h \
        input_validators.c \
+       Menubar_pimpl.C \
+       Menubar_pimpl.h \
+       RadioButtonGroup.C \
+       RadioButtonGroup.h \
+       Toolbar_pimpl.C \
+       Toolbar_pimpl.h \
        xform_macros.h
 
 # These still have to be added. Sooner or later. ARRae-20000411
diff --git a/src/frontends/xforms/RadioButtonGroup.C b/src/frontends/xforms/RadioButtonGroup.C
new file mode 100644 (file)
index 0000000..5e6b9ca
--- /dev/null
@@ -0,0 +1,150 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include <config.h>
+#include "RadioButtonGroup.h"
+
+#include "debug.h" // for lyxerr
+
+#include <functional>
+#include <algorithm>
+#include <iterator>
+using std::find_if;
+
+void RadioButtonGroup::registerRadioButton(FL_OBJECT *button, int value)
+{
+#if 0
+    bvec.push_back(button);
+    vvec.push_back(value);
+#endif
+    map.push_back( ButtonValuePair(button, value) );
+}
+
+
+void RadioButtonGroup::reset()
+{
+#if 0
+    bvec.clear();
+    vvec.clear();
+#endif
+    map.clear(); 
+}
+
+    // Functor to help us in our work, we should try to find how to achieve
+    // this with only STL predicates, but its easier to write this than to
+    // dig. If you can find the equivalent STL predicate combination, let me 
+    // know.
+    //
+    // The idea is to take a pair and a value and return true when the second
+    // element in the pair equals the value.
+    template <typename T>
+    struct equal_to_second_in_pair {
+        typedef bool                    result_type;
+        typedef T              first_argument_type;
+        typedef typename T::second_type second_argument_type;
+
+        bool operator() (
+           pair<typename T::first_type, typename T::second_type> const & left,
+           typename T::second_type const & right) const
+        {
+            return left.second == right;
+        }
+    };
+
+void RadioButtonGroup::setButton(int value)
+{
+#if 0
+    ValueVector::iterator vit =
+        find_if(vvec.begin(), vvec.end(),
+            bind2nd(equal_to<int>(), value));
+    
+    if (vit == vvec.end()) {
+        lyxerr << "BUG: Requested value in RadioButtonGroup doesn't exists"
+            << endl;
+        return;
+    }
+
+    unsigned n = std::distance(vvec.begin(), vit);
+
+    fl_set_button(bvec[n], 1);
+#endif
+
+
+    ButtonValueMap::const_iterator it = 
+#if 0
+        find_if(map.begin(), map.end(),
+                bind2nd(equal_to_second_in_pair<ButtonValuePair>(),
+                    value));
+#else
+        std::find_if(map.begin(), map.end(),
+                std::compose1(
+                    std::bind2nd(std::equal_to<int>(), value)
+                    ,
+                    std::select2nd<ButtonValuePair>()
+                )
+        );
+#endif
+    // If we found nothing, report it and return
+    if (it == map.end()) {
+        lyxerr << "BUG: Requested value in RadioButtonGroup doesn't exists"
+            << endl;
+    } else {
+        fl_set_button((*it).first, 1);
+    }
+    
+}
+
+template<typename T>
+struct is_set_button {
+    bool operator() (T const & item) const
+    {
+        return fl_get_button( (item).first );
+    }
+};
+
+int  RadioButtonGroup::getButton()
+{
+#if 0
+    ButtonVector::const_iterator bit = bvec.begin();
+    ValueVector::const_iterator vit = vvec.begin();
+
+    while (bit != bvec.end()) {
+        if (fl_get_button(*bit))
+            return *vit;
+
+        bit++;
+        vit++;
+    }
+
+    return 0;
+#endif
+
+    // Find the first button that is active
+    ButtonValueMap::iterator it =
+        find_if(map.begin(), map.end(),
+                is_set_button<ButtonValuePair>() );
+
+    // If such a button was found, return its value.
+    if (it != map.end()) {
+        return (*it).second;
+    }
+
+    lyxerr << "BUG: No radio button found to be active." << endl;
+
+    // Else return 0.
+    return 0;
+}
+
diff --git a/src/frontends/xforms/RadioButtonGroup.h b/src/frontends/xforms/RadioButtonGroup.h
new file mode 100644 (file)
index 0000000..51b51b2
--- /dev/null
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+/*
+ * This class simplifies the work with a group of radio buttons,
+ * the idea is that you register a bunch of radio buttons with the accompanying
+ * value for each radio button and then you get to query or set the active
+ * button in a single function call.
+ */
+
+#ifndef RADIOBUTTONGROUP_H
+#define RADIOBUTTONGROUP_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include <vector>
+#include <pair.h>
+using std::vector;
+using std::pair;
+
+#include <forms.h>
+
+class RadioButtonGroup {
+public:
+    /// Constructor. Allocate space for 'n' items in the group.
+    RadioButtonGroup(unsigned n = 5) : map(n)
+    {};
+    /// Destructor. Cleans up.
+    ~RadioButtonGroup() {};
+   
+    /// Register a radio button with it's corresponding value.
+    void registerRadioButton(FL_OBJECT *button, int value);
+    /// Reset registrations.
+    void reset();
+
+    // Set the active button.
+    void setButton(int value);
+
+    // Get the active button.
+    int  getButton();
+    
+private:
+    typedef pair<FL_OBJECT *, int> ButtonValuePair;
+    typedef vector<ButtonValuePair> ButtonValueMap;
+    ButtonValueMap map;
+};
+
+#endif
diff --git a/src/frontends/xforms/form_graphics.C b/src/frontends/xforms/form_graphics.C
new file mode 100644 (file)
index 0000000..281bca8
--- /dev/null
@@ -0,0 +1,100 @@
+// File modified by fdfix.sh for use by lyx (with xforms >= 0.86) and gettext
+#include <config.h>
+#include "lyx_gui_misc.h"
+#include "gettext.h"
+
+/* Form definition file generated with fdesign. */
+
+#include FORMS_H_LOCATION
+#include <stdlib.h>
+#include "form_graphics.h"
+#include "FormGraphics.h" 
+
+FD_form_graphics * FormGraphics::build_graphics()
+{
+  FL_OBJECT *obj;
+  FD_form_graphics *fdui = new FD_form_graphics;
+
+  fdui->form_graphics = fl_bgn_form(FL_NO_BOX, 410, 390);
+  fdui->form_graphics->u_vdata = this;
+  obj = fl_add_box(FL_UP_BOX, 0, 0, 410, 390, "");
+    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
+    fl_set_object_resize(obj, FL_RESIZE_NONE);
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 310, 390, 30, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 230, 250, 170, 50, "");
+  fdui->input_filename = obj = fl_add_input(FL_NORMAL_INPUT, 90, 20, 210, 30, idex(_("Graphics File|F#F")));fl_set_button_shortcut(obj, scex(_("Graphics File|F#F")), 1);
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->button_browse = obj = fl_add_button(FL_NORMAL_BUTTON, 310, 20, 90, 30, idex(_("Browse|B#B")));fl_set_button_shortcut(obj, scex(_("Browse|B#B")), 1);
+    fl_set_object_callback(obj, C_FormGraphicsBrowseCB, 0);
+  obj = fl_add_labelframe(FL_ENGRAVED_FRAME, 10, 70, 200, 160, _("Width"));
+    fl_set_object_lalign(obj, FL_ALIGN_CENTER);
+  obj = fl_add_text(FL_NORMAL_TEXT, 130, 60, 50, 20, _("Height"));
+    fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
+  fdui->input_width = obj = fl_add_input(FL_NORMAL_INPUT, 20, 190, 90, 30, "");
+    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->input_height = obj = fl_add_input(FL_NORMAL_INPUT, 120, 190, 80, 30, "");
+    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  obj = fl_add_labelframe(FL_ENGRAVED_FRAME, 230, 70, 170, 160, _("Display"));
+    fl_set_object_lalign(obj, FL_ALIGN_CENTER);
+  fdui->button_ok = obj = fl_add_button(FL_RETURN_BUTTON, 10, 350, 70, 30, _("Ok"));
+    fl_set_object_callback(obj, C_FormGraphicsOKCB, 0);
+  fdui->button_apply = obj = fl_add_button(FL_NORMAL_BUTTON, 100, 350, 70, 30, idex(_("Apply|A#A")));fl_set_button_shortcut(obj, scex(_("Apply|A#A")), 1);
+    fl_set_object_callback(obj, C_FormGraphicsApplyCB, 0);
+  fdui->button_cancel = obj = fl_add_button(FL_NORMAL_BUTTON, 190, 350, 70, 30, idex(_("Cancel|C#C^[")));fl_set_button_shortcut(obj, scex(_("Cancel|C#C^[")), 1);
+    fl_set_object_callback(obj, C_FormGraphicsCancelCB, 0);
+
+  fdui->radio_button_group_width = fl_bgn_group();
+  fdui->radio_width_percent_page = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 140, 80, 30, _("% of Page"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->radio_width_default = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 80, 80, 30, _("Default"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+    fl_set_button(obj, 1);
+  fdui->radio_width_cm = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 100, 80, 30, _("cm"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->radio_width_inch = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 120, 80, 30, _("Inch"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->radio_width_percent_column = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 160, 80, 30, _("% of Column"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fl_end_group();
+
+
+  fdui->radio_button_group_height = fl_bgn_group();
+  fdui->radio_height_percent_page = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 140, 80, 30, _("% of Page"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->radio_height_inch = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 120, 80, 30, _("Inch"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->radio_height_cm = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 100, 80, 30, _("cm"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->radio_height_default = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 80, 80, 30, _("Default"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+    fl_set_button(obj, 1);
+  fl_end_group();
+
+
+  fdui->radio_button_group_display = fl_bgn_group();
+  fdui->radio_display_monochrome = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 80, 80, 30, _("in Monochrome"));
+    fl_set_button(obj, 1);
+  fdui->radio_display_grayscale = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 110, 80, 30, _("in Grayscale"));
+  fdui->radio_display_color = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 140, 80, 30, _("in Color"));
+  fdui->radio_no_display = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 170, 80, 30, _("Don't display"));
+  fl_end_group();
+
+  obj = fl_add_labelframe(FL_ENGRAVED_FRAME, 10, 250, 200, 50, _("Rotate"));
+  fdui->input_rotate_angle = obj = fl_add_input(FL_INT_INPUT, 70, 260, 80, 30, _("Angle"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->check_inline = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 230, 260, 170, 30, _("Inline Figure"));
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->input_subcaption = obj = fl_add_input(FL_NORMAL_INPUT, 120, 310, 280, 30, "");
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fdui->check_subcaption = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 310, 110, 30, idex(_("Subcaption|S#S")));fl_set_button_shortcut(obj, scex(_("Subcaption|S#S")), 1);
+    fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
+  fl_end_form();
+
+  fdui->form_graphics->fdui = fdui;
+
+  return fdui;
+}
+/*---------------------------------------*/
+
diff --git a/src/frontends/xforms/form_graphics.h b/src/frontends/xforms/form_graphics.h
new file mode 100644 (file)
index 0000000..c33862e
--- /dev/null
@@ -0,0 +1,47 @@
+/** Header file generated with fdesign on Wed Jul 19 10:20:11 2000.**/
+
+#ifndef FD_form_graphics_h_
+#define FD_form_graphics_h_
+
+/** Callbacks, globals and object handlers **/
+extern  "C" void C_FormGraphicsInputCB(FL_OBJECT *, long);
+extern  "C" void C_FormGraphicsBrowseCB(FL_OBJECT *, long);
+extern  "C" void C_FormGraphicsOKCB(FL_OBJECT *, long);
+extern  "C" void C_FormGraphicsApplyCB(FL_OBJECT *, long);
+extern  "C" void C_FormGraphicsCancelCB(FL_OBJECT *, long);
+
+
+/**** Forms and Objects ****/
+struct FD_form_graphics {
+
+       FL_FORM *form_graphics;
+       FL_OBJECT *input_filename;
+       FL_OBJECT *button_browse;
+       FL_OBJECT *input_width;
+       FL_OBJECT *input_height;
+       FL_OBJECT *button_ok;
+       FL_OBJECT *button_apply;
+       FL_OBJECT *button_cancel;
+       FL_OBJECT *radio_button_group_width;
+       FL_OBJECT *radio_width_percent_page;
+       FL_OBJECT *radio_width_default;
+       FL_OBJECT *radio_width_cm;
+       FL_OBJECT *radio_width_inch;
+       FL_OBJECT *radio_width_percent_column;
+       FL_OBJECT *radio_button_group_height;
+       FL_OBJECT *radio_height_percent_page;
+       FL_OBJECT *radio_height_inch;
+       FL_OBJECT *radio_height_cm;
+       FL_OBJECT *radio_height_default;
+       FL_OBJECT *radio_button_group_display;
+       FL_OBJECT *radio_display_monochrome;
+       FL_OBJECT *radio_display_grayscale;
+       FL_OBJECT *radio_display_color;
+       FL_OBJECT *radio_no_display;
+       FL_OBJECT *input_rotate_angle;
+       FL_OBJECT *check_inline;
+       FL_OBJECT *input_subcaption;
+       FL_OBJECT *check_subcaption;
+};
+
+#endif /* FD_form_graphics_h_ */
index 3d76fea049288ad8961f64eb63aabb01752e1d08..e7f86c07dca01543ed7924e4a6d45f27942cee58 100644 (file)
@@ -15,22 +15,22 @@ FD_form_tabular * FormTabular::build_tabular()
   FL_OBJECT *obj;
   FD_form_tabular *fdui = new FD_form_tabular;
 
-  fdui->form_tabular = fl_bgn_form(FL_NO_BOX, 510, 285);
+  fdui->form_tabular = fl_bgn_form(FL_NO_BOX, 510, 315);
   fdui->form_tabular->u_vdata = this;
-  obj = fl_add_box(FL_FLAT_BOX, 0, 0, 510, 285, "");
-  fdui->tabFolder = obj = fl_add_tabfolder(FL_TOP_TABFOLDER, 0, 0, 505, 245, _("Tabbed folder"));
+  obj = fl_add_box(FL_FLAT_BOX, 0, 0, 510, 315, "");
+  fdui->tabFolder = obj = fl_add_tabfolder(FL_TOP_TABFOLDER, 0, 0, 505, 275, _("Tabbed folder"));
     fl_set_object_resize(obj, FL_RESIZE_ALL);
-  fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 250, 90, 30, idex(_("Close|#C")));
+  fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 280, 90, 30, idex(_("Close|#C")));
     fl_set_button_shortcut(obj, scex(_("Close|#C")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularCloseCB, 0);
-  fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 64, 250, 60, 30, "");
+  fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 65, 280, 60, 30, "");
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
-  fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 250, 60, 30, "");
+  fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 280, 60, 30, "");
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
-  fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 250, 290, 30, "");
+  fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 275, 290, 30, "");
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
@@ -190,28 +190,28 @@ FD_form_cell_options * FormTabular::build_cell_options()
   FL_OBJECT *obj;
   FD_form_cell_options *fdui = new FD_form_cell_options;
 
-  fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 227);
+  fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 257);
   fdui->form_cell_options->u_vdata = this;
-  obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 227, "");
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 110, 155, 100, "");
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 110, 180, 100, "");
+  obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 257, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 145, 155, 100, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 145, 180, 100, "");
     fl_set_object_color(obj, FL_COL1, FL_COL1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
-  obj = fl_add_text(FL_NORMAL_TEXT, 15, 100, 70, 20, _("Borders"));
+  obj = fl_add_text(FL_NORMAL_TEXT, 15, 135, 70, 20, _("Borders"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 195, 110, 130, 100, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 195, 145, 130, 100, "");
     fl_set_object_color(obj, FL_COL1, FL_COL1);
-  obj = fl_add_text(FL_NORMAL_TEXT, 200, 100, 115, 20, _("H. Alignment"));
+  obj = fl_add_text(FL_NORMAL_TEXT, 200, 135, 115, 20, _("H. Alignment"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
-  obj = fl_add_text(FL_NORMAL_TEXT, 345, 100, 115, 20, _("V. Alignment"));
+  obj = fl_add_text(FL_NORMAL_TEXT, 345, 135, 115, 20, _("V. Alignment"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 15, 150, 85, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 15, 150, 115, "");
   obj = fl_add_text(FL_NORMAL_TEXT, 15, 5, 140, 20, _("Special Cell"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
@@ -219,12 +219,12 @@ FD_form_cell_options * FormTabular::build_cell_options()
   fdui->radio_multicolumn = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 25, 145, 25, idex(_("Multicolumn|#M")));
     fl_set_button_shortcut(obj, scex(_("Multicolumn|#M")), 1);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_linebreak_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 50, 145, 25, idex(_("Linebreaks|#N")));
-    fl_set_button_shortcut(obj, scex(_("Linebreaks|#N")), 1);
+  fdui->radio_useparbox = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 50, 145, 25, idex(_("Use ParBox|#U")));
+    fl_set_button_shortcut(obj, scex(_("Use ParBox|#U")), 1);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, _("Rotate 90°"));
+  fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 100, 145, 25, _("Rotate 90°"));
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 85, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 115, "");
     fl_set_object_color(obj, FL_COL1, FL_COL1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
   fdui->input_special_multialign = obj = fl_add_input(FL_NORMAL_INPUT, 175, 30, 310, 30, "");
@@ -237,50 +237,53 @@ FD_form_cell_options * FormTabular::build_cell_options()
   fdui->input_mcolumn_width = obj = fl_add_input(FL_NORMAL_INPUT, 360, 65, 125, 30, _("Width of multi-column:"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 135, 25, 25, idex(_("Top|#t")));
+  fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 170, 25, 25, idex(_("Top|#t")));
     fl_set_button_shortcut(obj, scex(_("Top|#t")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_border_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 165, 25, 25, idex(_("Bottom|#b")));
+  fdui->radio_border_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 200, 25, 25, idex(_("Bottom|#b")));
     fl_set_button_shortcut(obj, scex(_("Bottom|#b")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_BOTTOM_LEFT);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_border_left = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 55, 150, 25, 25, idex(_("Left|#l")));
+  fdui->radio_border_left = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 55, 185, 25, 25, idex(_("Left|#l")));
     fl_set_button_shortcut(obj, scex(_("Left|#l")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_border_right = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 95, 150, 25, 25, idex(_("Right|#r")));
+  fdui->radio_border_right = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 95, 185, 25, 25, idex(_("Right|#r")));
     fl_set_button_shortcut(obj, scex(_("Right|#r")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_RIGHT);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 120, 110, 25, idex(_("Left|#e")));
+  fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 155, 110, 25, idex(_("Left|#e")));
     fl_set_button_shortcut(obj, scex(_("Left|#e")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 170, 115, 25, idex(_("Right|#i")));
+  fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 205, 115, 25, idex(_("Right|#i")));
     fl_set_button_shortcut(obj, scex(_("Right|#i")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 145, 115, 25, idex(_("Center|#c")));
+  fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 180, 115, 25, idex(_("Center|#c")));
     fl_set_button_shortcut(obj, scex(_("Center|#c")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 120, 140, 25, idex(_("Top|#p")));
+  fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 155, 140, 25, idex(_("Top|#p")));
     fl_set_button_shortcut(obj, scex(_("Top|#p")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 145, 140, 25, idex(_("Center|#n")));
+  fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 180, 140, 25, idex(_("Center|#n")));
     fl_set_button_shortcut(obj, scex(_("Center|#n")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 170, 140, 25, idex(_("Bottom|#o")));
+  fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 205, 140, 25, idex(_("Bottom|#o")));
     fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
+  fdui->radio_useminipage = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, idex(_("Use Minipage|#s")));
+    fl_set_button_shortcut(obj, scex(_("Use Minipage|#s")), 1);
+    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   fl_end_form();
 
   fdui->form_cell_options->fdui = fdui;
index a0c162adc52dee40b560fed1232abb5c770c74e4..5b582a1316140db2d544ee411d5c536ee4db0153 100644 (file)
@@ -1,4 +1,4 @@
-/** Header file generated with fdesign on Fri Jul 28 11:50:11 2000.**/
+/** Header file generated with fdesign on Mon Jul 31 12:55:35 2000.**/
 
 #ifndef FD_form_tabular_h_
 #define FD_form_tabular_h_
@@ -61,7 +61,7 @@ struct FD_form_cell_options {
 
        FL_FORM *form_cell_options;
        FL_OBJECT *radio_multicolumn;
-       FL_OBJECT *radio_linebreak_cell;
+       FL_OBJECT *radio_useparbox;
        FL_OBJECT *radio_rotate_cell;
        FL_OBJECT *input_special_multialign;
        FL_OBJECT *input_mcolumn_width;
@@ -75,6 +75,7 @@ struct FD_form_cell_options {
        FL_OBJECT *radio_valign_top;
        FL_OBJECT *radio_valign_center;
        FL_OBJECT *radio_valign_bottom;
+       FL_OBJECT *radio_useminipage;
 };
 struct FD_form_longtable_options {
 
diff --git a/src/frontends/xforms/forms/form_graphics.fd b/src/frontends/xforms/forms/form_graphics.fd
new file mode 100644 (file)
index 0000000..0707cc3
--- /dev/null
@@ -0,0 +1,685 @@
+Magic: 13000
+
+Internal Form Definition File
+    (do not change)
+
+Number of forms: 1
+Unit of measure: FL_COORD_PIXEL
+
+=============== FORM ===============
+Name: form_graphics
+Width: 410
+Height: 390
+Number of Objects: 37
+
+--------------------
+class: FL_BOX
+type: UP_BOX
+box: 0 0 410 390
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_NONE
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_FRAME
+type: ENGRAVED_FRAME
+box: 10 310 390 30
+boxtype: FL_NO_BOX
+colors: FL_BLACK FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_FRAME
+type: ENGRAVED_FRAME
+box: 230 250 170 50
+boxtype: FL_NO_BOX
+colors: FL_BLACK FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_INPUT
+type: NORMAL_INPUT
+box: 90 20 210 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Graphics File|F#F
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_filename
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 310 20 90 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Browse|B#B
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_browse
+callback: C_FormGraphicsBrowseCB
+argument: 0
+
+--------------------
+class: FL_LABELFRAME
+type: ENGRAVED_FRAME
+box: 10 70 200 160
+boxtype: FL_NO_BOX
+colors: FL_BLACK FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Width
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_TEXT
+type: NORMAL_TEXT
+box: 130 60 50 20
+boxtype: FL_FLAT_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Height
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_INPUT
+type: NORMAL_INPUT
+box: 20 190 90 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_width
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_INPUT
+type: NORMAL_INPUT
+box: 120 190 80 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_height
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_LABELFRAME
+type: ENGRAVED_FRAME
+box: 230 70 170 160
+boxtype: FL_NO_BOX
+colors: FL_BLACK FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Display
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_BUTTON
+type: RETURN_BUTTON
+box: 10 350 70 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Ok
+shortcut: ^M
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_ok
+callback: C_FormGraphicsOKCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 100 350 70 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Apply|A#A
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_apply
+callback: C_FormGraphicsApplyCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 190 350 70 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Cancel|C#C^[
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_cancel
+callback: C_FormGraphicsCancelCB
+argument: 0
+
+--------------------
+class: FL_BEGIN_GROUP
+type: 0
+box: 0 10 10 0
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_button_group_width
+callback: 
+argument: 
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 10 140 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: % of Page
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_width_percent_page
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 10 80 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Default
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_width_default
+callback: C_FormGraphicsInputCB
+argument: 0
+       value: 1
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 10 100 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: cm
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_width_cm
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 10 120 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Inch
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_width_inch
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 10 160 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: % of Column
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_width_percent_column
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_END_GROUP
+type: 0
+box: 0 0 0 0
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_BEGIN_GROUP
+type: 0
+box: 0 10 10 0
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_button_group_height
+callback: 
+argument: 
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 110 140 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: % of Page
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_height_percent_page
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 110 120 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Inch
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_height_inch
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 110 100 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: cm
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_height_cm
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 110 80 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Default
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_height_default
+callback: C_FormGraphicsInputCB
+argument: 0
+       value: 1
+
+--------------------
+class: FL_END_GROUP
+type: 0
+box: 0 0 0 0
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_BEGIN_GROUP
+type: 0
+box: 0 10 10 0
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_button_group_display
+callback: 
+argument: 
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 250 80 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: in Monochrome
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_display_monochrome
+callback: 
+argument: 
+       value: 1
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 250 110 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: in Grayscale
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_display_grayscale
+callback: 
+argument: 
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 250 140 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: in Color
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_display_color
+callback: 
+argument: 
+
+--------------------
+class: FL_CHECKBUTTON
+type: RADIO_BUTTON
+box: 250 170 80 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Don't display
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_no_display
+callback: 
+argument: 
+
+--------------------
+class: FL_END_GROUP
+type: 0
+box: 0 0 0 0
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_LABELFRAME
+type: ENGRAVED_FRAME
+box: 10 250 200 50
+boxtype: FL_NO_BOX
+colors: FL_BLACK FL_COL1
+alignment: FL_ALIGN_TOP_LEFT
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Rotate
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_INPUT
+type: INT_INPUT
+box: 70 260 80 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Angle
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_rotate_angle
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: PUSH_BUTTON
+box: 230 260 170 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Inline Figure
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: check_inline
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_INPUT
+type: NORMAL_INPUT
+box: 120 310 280 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_subcaption
+callback: C_FormGraphicsInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: PUSH_BUTTON
+box: 10 310 110 30
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Subcaption|S#S
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: check_subcaption
+callback: C_FormGraphicsInputCB
+argument: 0
+
+==============================
+create_the_forms
index 44558ef941aa5377f86e8da56a0b6874ce415bd4..841ed7d55192026d22b925633e4b87fc1570e329 100644 (file)
@@ -10,13 +10,13 @@ SnapGrid: 5
 =============== FORM ===============
 Name: form_tabular
 Width: 510
-Height: 285
+Height: 315
 Number of Objects: 6
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 510 285
+box: 0 0 510 315
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -34,7 +34,7 @@ argument:
 --------------------
 class: FL_TABFOLDER
 type: TOP_TABFOLDER
-box: 0 0 505 245
+box: 0 0 505 275
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_TOP_LEFT
@@ -52,7 +52,7 @@ argument:
 --------------------
 class: FL_BUTTON
 type: NORMAL_BUTTON
-box: 415 250 90 30
+box: 415 280 90 30
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -70,7 +70,7 @@ argument: 0
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 64 250 60 30
+box: 65 280 60 30
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_TOP_LEFT
@@ -88,7 +88,7 @@ argument:
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 5 250 60 30
+box: 5 280 60 30
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_TOP_LEFT
@@ -106,7 +106,7 @@ argument:
 --------------------
 class: FL_TEXT
 type: NORMAL_TEXT
-box: 125 250 290 30
+box: 125 275 290 30
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@@ -712,13 +712,13 @@ argument: 0
 =============== FORM ===============
 Name: form_cell_options
 Width: 505
-Height: 227
-Number of Objects: 26
+Height: 257
+Number of Objects: 27
 
 --------------------
 class: FL_BOX
 type: UP_BOX
-box: 0 0 505 227
+box: 0 0 505 257
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -736,7 +736,7 @@ argument:
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
-box: 335 110 155 100
+box: 335 145 155 100
 boxtype: FL_NO_BOX
 colors: FL_BLACK FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -754,7 +754,7 @@ argument:
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
-box: 10 110 180 100
+box: 10 145 180 100
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -772,7 +772,7 @@ argument:
 --------------------
 class: FL_TEXT
 type: NORMAL_TEXT
-box: 15 100 70 20
+box: 15 135 70 20
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@@ -790,7 +790,7 @@ argument:
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
-box: 195 110 130 100
+box: 195 145 130 100
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -808,7 +808,7 @@ argument:
 --------------------
 class: FL_TEXT
 type: NORMAL_TEXT
-box: 200 100 115 20
+box: 200 135 115 20
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@@ -826,7 +826,7 @@ argument:
 --------------------
 class: FL_TEXT
 type: NORMAL_TEXT
-box: 345 100 115 20
+box: 345 135 115 20
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@@ -844,7 +844,7 @@ argument:
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
-box: 10 15 150 85
+box: 10 15 150 115
 boxtype: FL_NO_BOX
 colors: FL_BLACK FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -905,18 +905,18 @@ alignment: FL_ALIGN_CENTER
 style: FL_NORMAL_STYLE
 size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
-label: Linebreaks|#N
+label: Use ParBox|#U
 shortcut: 
 resize: FL_RESIZE_ALL
 gravity: FL_NoGravity FL_NoGravity
-name: radio_linebreak_cell
+name: radio_useparbox
 callback: C_FormTabularInputCB
 argument: 0
 
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 10 75 145 25
+box: 10 100 145 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -934,7 +934,7 @@ argument: 0
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
-box: 165 15 325 85
+box: 165 15 325 115
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -1006,7 +1006,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 75 135 25 25
+box: 75 170 25 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_TOP_LEFT
@@ -1024,7 +1024,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 75 165 25 25
+box: 75 200 25 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_BOTTOM_LEFT
@@ -1042,7 +1042,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 55 150 25 25
+box: 55 185 25 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_LEFT
@@ -1060,7 +1060,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 95 150 25 25
+box: 95 185 25 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_RIGHT
@@ -1078,7 +1078,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 195 120 110 25
+box: 195 155 110 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1096,7 +1096,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 195 170 115 25
+box: 195 205 115 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1114,7 +1114,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 195 145 115 25
+box: 195 180 115 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1132,7 +1132,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 345 120 140 25
+box: 345 155 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1150,7 +1150,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 345 145 140 25
+box: 345 180 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1168,7 +1168,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 345 170 140 25
+box: 345 205 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1183,6 +1183,24 @@ name: radio_valign_bottom
 callback: C_FormTabularInputCB
 argument: 0
 
+--------------------
+class: FL_CHECKBUTTON
+type: PUSH_BUTTON
+box: 10 75 145 25
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: Use Minipage|#s
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_useminipage
+callback: C_FormTabularInputCB
+argument: 0
+
 =============== FORM ===============
 Name: form_longtable_options
 Width: 505
index 5f3281a8cd66d913da2810f514ebf1c65aed0bdd..018b71d97debc27119950cd457adf98085aab2f0 100644 (file)
@@ -23,6 +23,7 @@ SRCS := form_citation.fd \
        form_copyright.fd \
        form_preferences.fd \
        form_print.fd \
+       form_graphics.fd \
        form_tabular.fd \
        form_url.fd
 
diff --git a/src/graphics/.cvsignore b/src/graphics/.cvsignore
new file mode 100644 (file)
index 0000000..84a0b4f
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+*.deps
+*.lo
+.libs
+libgraphics.la
diff --git a/src/graphics/GraphicsCache.C b/src/graphics/GraphicsCache.C
new file mode 100644 (file)
index 0000000..a52e729
--- /dev/null
@@ -0,0 +1,51 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include <config.h>
+#include "GraphicsCache.h"
+
+GraphicsCache * 
+GraphicsCache::getInstance()
+{
+    if (! singleton) {
+        singleton = new GraphicsCache;
+    }
+
+    return singleton;
+}
+
+
+GraphicsCacheItem * 
+GraphicsCache::addFile(string filename)
+{
+    CacheType::const_iterator it = cache.find(filename);
+    
+    if (it != cache.end()) {
+        return (*it).second;
+    }
+    // INCOMPLETE!
+    return 0;
+}
+
+void
+GraphicsCache::removeFile(string filename)
+{
+    CacheType::const_iterator it = cache.find(filename);
+    
+    if (it != cache.end()) {
+        // INCOMPLETE!
+//        cache.erase(it);
+    }
+}
diff --git a/src/graphics/GraphicsCache.h b/src/graphics/GraphicsCache.h
new file mode 100644 (file)
index 0000000..881a90d
--- /dev/null
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifndef GRAPHICSCACHE_H
+#define GRAPHICSCACHE_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include <map>
+
+#include "LString.h"
+#include "GraphicsCacheItem.h"
+
+/** GraphicsCache is the manager of the image cache, it is responsible to
+ * create the GraphicsCacheItem's and maintain them.
+ *
+ * GraphicsCache is a singleton class, there should be only one instance of
+ * it at any moment.
+ */
+class GraphicsCache {
+public:
+    /// Get the instance of the class.
+    static GraphicsCache * getInstance();
+
+    /// Add a file to the cache.
+    GraphicsCacheItem * addFile(string filename);
+
+private:
+    /// Remove a cache item if it's count has gone to zero.
+    void removeFile(string filename);
+    
+    /// Private c-tor so we can control how many objects are instantiated.
+    GraphicsCache() {}
+
+    /// Private d-tor so that no-one will destroy us.
+    ~GraphicsCache() {
+        delete singleton;
+    }
+
+    /// Holder of the single instance of the class.
+    static GraphicsCache * singleton;
+
+    typedef std::map<string, GraphicsCacheItem *> CacheType;
+    CacheType cache;
+};
+
+GraphicsCache * GraphicsCache::singleton = 0;
+
+#endif
diff --git a/src/graphics/GraphicsCacheItem.C b/src/graphics/GraphicsCacheItem.C
new file mode 100644 (file)
index 0000000..172c2e3
--- /dev/null
@@ -0,0 +1,18 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include <config.h>
+#include "GraphicsCacheItem.h"
+
diff --git a/src/graphics/GraphicsCacheItem.h b/src/graphics/GraphicsCacheItem.h
new file mode 100644 (file)
index 0000000..da347f3
--- /dev/null
@@ -0,0 +1,29 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifndef GRAPHICSCACHEITEM_H
+#define GRAPHICSCACHEITEM_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+class GraphicsCacheItem {
+public:
+    ~GraphicsCacheItem() {}
+    
+private:
+    GraphicsCacheItem() {}
+
+    friend class GraphicsCache;
+};
+
+#endif
diff --git a/src/graphics/Makefile.am b/src/graphics/Makefile.am
new file mode 100644 (file)
index 0000000..b54aa9d
--- /dev/null
@@ -0,0 +1,13 @@
+AUTOMAKE_OPTIONS = foreign
+DISTCLEANFILES= *.orig *.rej *~ *.bak core
+MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
+noinst_LTLIBRARIES = libgraphics.la
+LIBS =
+ETAGS_ARGS = --lang=c++
+INCLUDES = -I${srcdir}/../ $(SIGC_CFLAGS)
+
+libgraphics_la_SOURCES = \
+       GraphicsCache.h \
+       GraphicsCache.C \
+       GraphicsCacheItem.h \
+       GraphicsCacheItem.C
diff --git a/src/graphics/README b/src/graphics/README
deleted file mode 100644 (file)
index 774f44f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Placeholder for this dir.
index 6eb6dc2ff4352170a4f65359b1602b80d9eed754..c870e428822b65ec4f2f72f429d52dae74608f64 100644 (file)
@@ -39,6 +39,8 @@ libinsets_la_SOURCES = \
        insetfoot.h \
        insetfootlike.C \
        insetfootlike.h \
+       insetgraphicsParams.h \
+       insetgraphicsParams.C \
        insetgraphics.C \
        insetgraphics.h \
        insetinclude.C \
index bfcc2088c2d829391f2a457e3eda46d03f2f0c9e..9955ca95e8b4bd37a59dd933320435eab858dc5a 100644 (file)
  * 
  *           LyX, The Document Processor
  *      
- *           Copyright 1995 Matthias Ettrich
  *           Copyright 1995-2000 the LyX Team.
- *
+ *           
+ *           This file Copyright 2000 Baruch Even.
  * ====================================================== */
 
+/*
+How to use it for now:
+    * The lyxfunc 'graphics-insert' will insert this inset into the document.
+*/
+
+/*
+Immediate tasks:
+    * Add the GraphicsCache and FormatTranslator in order to get inline
+        viewing of the figures.
+        
+*/
+
+/*
+Known BUGS:
+    
+    * If the image is from the clipart, and the document is moved to another
+       directory, the user is screwed. Need a way to handle it.
+       This amounts to a problem of when to use relative or absolute file paths
+       We should probably use what the user asks to use... but when he chooses
+       by the file dialog we normally get an absolute path and this may not be 
+       what the user meant.
+    * Bug in FileDlg class (src/filedlg.[hC]) when selecting a file and then
+        pressing ok, it counts as if no real selection done. Apparently it
+        when choosing a file it doesn't update the select file input line.
+
+Current PROBLEMS:
+    
+    * How to support both PDF and PS output, should we do the conversion
+        or should we just give the bounding box and tell latex how to do the
+        conversion itself?
+        I (Baruch Even) tend towards doing the conversion ourselves, otherwise
+        we need to give latex quite a few translation commands and from the
+        graphicx package docs it appears that it takes quite a bit of memory
+        on the side of TeXing.
+
+TODO Basics:
+
+    * Add support for more features so that it will be useable as a drop in
+      replacement to insetfig.
+        * Keep aspect ratio radio button
+
+    * Create the GraphicsCache and FormatTranslator
+    * Add inline viewing of image.
+
+TODO Before initial production release:
+    * Replace insetfig everywhere
+        * Read it's file format
+        * Get created by all commands used to create figinset currently.
+        * Search for comments of the form
+            // INSET_GRAPHICS: remove this when InsetFig is thrown.
+          And act upon them.
+
+    * Pop up a dialog if the widget version is higher than what we accept.
+    * Finish the basic To-do list.
+    * Extract the general logic of the dialog in order to allow easier porting
+        to Gnome/KDE, and put the general logic in frontends and the inherited
+        platform dependent code in the appropriate dirs.
+   
+TODO Extended features:
+
+    * Advanced Latex tab folder.
+    * Add even more options to make it better than insetfig.
+        * Support for complete control over the latex parameters for TeXperts
+        * What advanced features the users want to do?
+            Implement them in a non latex dependent way, but a logical way.
+            LyX should translate it to latex or any other fitting format.
+    * Add a way to roll the image file into the file format.
+    * When loading if the image is not found in the expected place, try
+       to find it in the clipart, or in the same directory with the image.
+    * If the dialog had no real change from previous time, do not mark document
+        as changed.
+    * Keep a tab on the image file, if it changes, update the lyx view.
+ */
+
+/* NOTES:
+ *
+ * Intentions:
+ *  This is currently a moving target, I'm trying stuff and learning what
+ *  is needed and how to accomplish it, since there is no predefined goal or
+ *  way to go I invent it as I go.
+ *
+ *  My current intention is for seperation from LaTeX, the basic needs are 
+ *  resizing and rotating, displaying on screen in various depths and printing
+ *  conversion of depths (independent of the display depth). For this I'll 
+ *  provide a simple interface.
+ *
+ *  The medium level includes clipping of the image, but in a limited way.
+ *
+ *  For the LaTeX gurus I'll provide a complete control over the output, but
+ *  this is latex dependent and guru dependent so I'd rather avoid doing this
+ *  for the normal user. This stuff includes clipping, special image size
+ *  specifications (\textwidth\minus 2in) which I see no way to generalize
+ *  to non-latex specific way.
+ *
+ * Used packages:
+ *  'graphicx' for the graphics inclusion.
+ *  'subfigure' for the subfigures.
+ *
+ * Fileformat:
+ *
+ * Current version is 1 (inset file format version), when changing it
+ * it should be changed in the Write() function when writing in one place
+ * and when reading one should change the version check and the error message.
+ *
+ * The filename is kept in  the lyx file in a relative way, so as to allow
+ * moving the document file and its images with no problem.
+ *
+ * Conversions:
+ *  
+ *  Apparently the PNG output is preferred over PDF images when doing PDF
+ *  documents (i.e. prefer imagemagick eps2png over eps2pdf)
+ */
+
+/* Current Stage:
+ *  Embryonic.
+ *
+ * PLAN:
+ *  Finish basic support:
+ *      Inline image viewing
+ *      Get into lyx-devel as an unactivated inset for the benefit of those
+ *          who really need it.
+ *
+ *  Do Release quality support:
+ *      Allow to change display depth
+ *      Make default figure instead of InsetFig
+ *      Add to LyX (probably after 1.1.6 is released)
+ *      
+ *  Extended features:
+ *      Output format conversion
+ *      Print depth changes
+ *      Image file tracking of changes.
+ *
+ *  Extended^2:
+ *      Image roll-in (how? when? why?)
+ *          This means to add the image inside the LyX file, usefull when
+ *          transferring the file around.
+ */
 #ifdef __GNUG__
 #pragma implementation
 #endif
 #include <config.h>
 
 #include "insets/insetgraphics.h"
+#include "insets/insetgraphicsParams.h"
+#include "graphics/GraphicsCache.h"
+#include "graphics/GraphicsCacheItem.h"
+#include "frontends/Dialogs.h"
+#include "LyXView.h"
+#include "buffer.h"
 #include "BufferView.h"
 #include "Painter.h"
-#include "form_graphics.h"
 #include "lyx_gui_misc.h"
 #include "filedlg.h"
 #include "support/FileInfo.h"
 #include "support/filetools.h"
 
-using std::ostream;
-using std::endl;
-
-extern string system_lyxdir;
-extern string user_lyxdir;
-extern string system_tempdir;
-
-string browseFile();
-
-extern "C"
-void GraphicxCB(FL_OBJECT * obj, long arg) 
-{
-       lyxerr << "GraphicxCB: obj = " << obj << " arg = " << arg << endl;
-       switch (arg) {
-       case 0: // The graphics file
-               lyxerr << "Set the graphics file in InsetGraphics" << endl;
-               break;
-       case 1: // The file browser
-               browseFile();
-               break;
-       case 2: // The Apply button
-               lyxerr << "Scan the form and set the "
-                       "InsetGraphics accordingly." << endl;
-               break;
-       case 3: // The OK button
-               GraphicxCB(obj, 2); // do the apply
-               GraphicxCB(obj, 4); // do the cancel
-               break;
-       case 4: // The Cancel button
-               lyxerr << "Just hide the form and do nothing else!" << endl;
-               break;
-       case 99:
-               lyxerr << "Not implemented yet..." << endl;
-               break;
-       default:
-               lyxerr << "Unknown callback value!" << endl;
-               break;
-       }
-}
-
-
-string browseFile()
-{
-       // This function is probably not good enough yet, and does need some
-       // arguemnts to tell what dir to start looking in.
-       
-       static string current_figure_path = ".";
-
-       LyXFileDlg fileDlg;
-
-       // Does user clipart directory exist?
-       string bufclip = AddName (user_lyxdir, "clipart");      
-       FileInfo fileInfo(bufclip);
-       if (!(fileInfo.isOK() && fileInfo.isDir()))
-               // No - bail out to system clipart directory
-               bufclip = AddName (system_lyxdir, "clipart");   
+#include "debug.h"
 
 
-       fileDlg.SetButton(0, _("Clipart"), bufclip); 
-
-       bool error = false;
-       string buf;
-       do {
-               string p = fileDlg.Select(_("Graphics"),
-                                  current_figure_path,
-                                  "*ps", string());
-
-               if (p.empty()) return p;
-
-               current_figure_path = OnlyPath(p);
-
-               if (p.find_first_of("#~$% ") != string::npos) {
-                       WriteAlert(_("Filename can't contain any "
-                                    "of these characters:"),
-                                  // xgettext:no-c-format
-                                  _("space, '#', '~', '$' or '%'.")); 
-                       error = true;
-               }
-       } while (error);
-
-       return buf;
-}
+using std::ostream;
+using std::endl;
 
 
+// Initialize only those variables that do not have a constructor.
 InsetGraphics::InsetGraphics()
-       : form(0)
+#ifdef IG_OLDPARAMS    
+      : use_bb(false), hiresbb(false), angle(0.0), origin(DEFAULT)
+      ,keepaspectratio(false), scale(0.0), clip(false), draft(false)          
+#endif     
 {}
 
+InsetGraphics::~InsetGraphics()
+{
+    // Emits the hide signal to the dialog connected (if any)
+    hide();
+}
 
 int InsetGraphics::ascent(BufferView *, LyXFont const &) const 
 {
        
-       return 100;
+       return 25;
 }
 
 
 int InsetGraphics::descent(BufferView *, LyXFont const &) const 
 {
        // this is not true if viewport is used and clip is not.
-       return 1;
+       return 25;
 }
 
 
 int InsetGraphics::width(BufferView *, LyXFont const &) const 
 {
+    // Need to replace this with data coming from GraphicsCache
+#ifdef IG_OLDPARAMS    
        if (bb.isSet()) {
-               return bb.urx - bb.llx;
+               return bb.urx - bb.llx + 2;
        }
-       return 100;
+#endif    
+       return 50;
 }
 
 
 void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
                         int baseline, float & x, bool) const
 {
-       Painter & pain = bv->painter();
+       Painter & paint = bv->painter();
 
        // This will draw the graphics. As for now we only draw a
        // placeholder rectangele.
-       pain.rectangle(int(x), baseline - ascent(bv, font),
-                      width(bv, font),
+       paint.rectangle(int(x)+2, baseline - ascent(bv, font),
+                      width(bv, font) - 4,
                       ascent(bv, font) + descent(bv, font));
 }
 
 
-void InsetGraphics::Edit(BufferView *, int, int, unsigned int)
+void InsetGraphics::Edit(BufferView *bv, int, int, unsigned int)
 {
-       lyxerr.debug() << "InsetGraphics::Edit" << endl;
-
-       if (!form) {
-               form = create_form_Graphics();
-               fl_set_form_atclose(form->Graphics, CancelCloseBoxCB, 0);
-               fl_set_object_return(form->Angle, FL_RETURN_ALWAYS);
-               fl_set_object_return(form->Width, FL_RETURN_ALWAYS);
-               fl_set_object_return(form->Height, FL_RETURN_ALWAYS);
-       }
-
-       if (form->Graphics->visible) {
-               fl_raise_form(form->Graphics);
-       } else {
-               fl_show_form(form->Graphics, FL_PLACE_MOUSE | FL_PLACE_SIZE,
-                            FL_FULLBORDER, _("Graphics"));
-       }
+    bv->owner()->getDialogs() -> showGraphics(this);
 }
 
 
@@ -175,70 +239,197 @@ Inset::EDITABLE InsetGraphics::Editable() const
 }
 
 
-void InsetGraphics::Write(Buffer const *, ostream & os) const
+void InsetGraphics::Write(Buffer const * buf, ostream & os) const
 {
-       // The question on the file format is still open.
-       // Suggestions?
-       // perhaps a format that is xml-parsable
-       //<graphics name="test.eps"/>
-       os << "GRAPHICS\n";
+       os << "Graphics FormatVersion 1" << endl;
+
+    params.Write(buf, os);
 }
 
+#if 0
+// Baruch Even 2000-07-08
+
+// A Thought for another way to read the file...
+// The map should be a static part of the object or a static part of this
+// file and should be filled during program start.
+// The questions are:
+// 1. Is this cleaner?
+// 2. Is there no hidden performance costs?
+// 
+// Regarding 2 I can already see that we will have two copies of the strings
+// one in the data part of the program and one in the map, but that won't be
+// more than say 2K (overestimation here), there is no real benefit to put
+// it in the map since there aren't that many configuration items that will
+// make it a faster solution, it might just be a bit cleaner.
+// (a map stores either in a hash or a kind of a balanced tree).
+
+void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
+{
+    typedef map<string, enum TOKENS> ReadActionMap;
+    static ReadActionMap const readMap;
+
+    bool finished = false;
+
+    while (lex.IsOK() && !finished) {
+        lex.next();
+
+        string const token = lex.GetString();
+        lyxerr.debug() << "Token: '" << token << '\'' << endl;
+
+        if (token.empty())
+            continue;
+        
+        ReadActionMap::const_iterator it =
+            readMap.find(token);
+
+        if (it == readMap.end()) {
+            lyxerr << "Unknown keyword, skipping." << endl;
+            continue;
+        }
+        
+        switch (it.second) {
+        case FILENAME_TOKEN:
+            break;
+        case VERSION_TOKEN:
+            break;
+        default:
+            break;
+        }
+
+            
+    }
+}
+#endif
 
-void InsetGraphics::Read(Buffer const *, LyXLex & /*lex*/
+void InsetGraphics::Read(Buffer const * buf, LyXLex & lex
 {
-       // For now we only use a static file...
-       graphicsfile = "testfile.xpm";
-       //graphicscache.addFile(graphicsfile);
-       //bb = graphicscache.getBB(graphicsfile);
-       //pixmap = graphicscache.getPixmap(graphicsfile);
+    bool finished = false;
+    
+    while (lex.IsOK() && !finished) {
+        lex.next();
+        
+        string const token = lex.GetString();
+        lyxerr.debug() << "Token: '" << token << '\'' << endl;
+
+        if (token.empty()) {
+            continue;
+        } else if (token == "\\end_inset") {
+            finished = true;
+        } else if (token == "FormatVersion") {
+            lex.next();
+            int version = lex.GetInteger();
+            if (version > 1)
+                lyxerr 
+                    << "This document was created with a newer Graphics widget"
+                       ", You should use a newer version of LyX to read this"
+                       " file."
+                    << endl;
+            // TODO: Possibly open up a dialog?
+        } else {
+            if (! params.Read(buf, lex, token))
+                lyxerr << "Unknown token, " << token << ",skipping." << endl;
+        }
+    }
+    
+    updateInset();
 }
 
+static void formatResize(ostream & os, char const *key,
+        InsetGraphicsParams::Resize resizeType, double size)
+{
+    switch (resizeType) {
+    case InsetGraphicsParams::DEFAULT_SIZE:
+        break;
+    
+    case InsetGraphicsParams::CM:
+        os << key << '=' << size << "cm,";
+        break;
+            
+    case InsetGraphicsParams::INCH:
+        os << key << '=' << size << "in,";
+        break;
+            
+    case InsetGraphicsParams::PERCENT_PAGE:
+        os << key << '=' << size/100 << "\\text" << key << ',';
+        break;
+            
+    case InsetGraphicsParams::PERCENT_COLUMN:
+        os << key << '=' << size/100 << "\\column" << key << ',';
+        break;
+            
+    }
+}
 
-int InsetGraphics::Latex(Buffer const *, ostream & os,
+int InsetGraphics::Latex(Buffer const *buf, ostream & os,
                         bool /*fragile*/, bool/*fs*/) const
 {
        // MISSING: We have to decide how to do the order of the options
-       // that is depentant of order, like witdth, height, andlge. Should
+       // that is dependent of order, like witdth, height, angle. Should
        // we rotate before scale? Should we let the user decide?
        // bool rot_before_scale; ?
-       // Nothing to do if we don't have a graphics file
-       if (graphicsfile.empty()) return 0;
 
-       // We never used the starred form, we use the "clip" option instead.
-       string command("\\insetgraphics");
-       
+    // (BE) As a first step we should do a scale before rotate since this is
+    // more like the natural thought of how to do it.
+    // (BE) I believe that a priority list presented to the user with
+    // a default order would be the best, though it would be better to
+    // hide such a thing in an "Advanced options" dialog.
+    // (BE) This should go an advanced LaTeX options dialog.
+
+    // If there is no file specified, just output a message about it in
+    // the latex output.
+    if (params.filename.empty()) {
+        os << "\\fbox{\\rule[-0.5in]{0pt}{1in}"
+           << _("empty figure path")
+           << '}'
+           << endl;
+
+        return 1;
+    }
+
+    // Calculate the options part of the command, we must do it to a string
+    // stream since we might have a trailing comma that we would like to remove
+    // before writing it to the output stream.
 #ifdef HAVE_SSTREAM
        std::ostringstream options;
 #else
        ostrstream options;
 #endif
+    
+    formatResize(options, "width", params.widthResize, params.widthSize);
+    formatResize(options, "height", params.heightResize, params.heightSize);
+
+    if (params.rotateAngle != 0) {
+        options << "angle="
+            << params.rotateAngle << ',';
+    }
+    
+#ifdef IG_OLDPARAMS    
        if (bb.isSet() && use_bb) {
                options << "bb="
-                       << bb.llx << " " << bb.lly << " "
-                       << bb.urx << " " << bb.ury << ",";
+                       << bb.llx << ' ' << bb.lly << ' '
+                       << bb.urx << ' ' << bb.ury << ',';
        }
        if (hiresbb) {
                options << "hiresbb,";
        }
        if (viewport.isSet()) {
                options << "viewport="
-                       << viewport.llx << " " << viewport.lly << " "
-                       << viewport.urx << " " << viewport.ury << ",";
+                       << viewport.llx << ' ' << viewport.lly << ' '
+                       << viewport.urx << ' ' << viewport.ury << ',';
        }
        if (trim.isSet()) {
                options << "trim="
-                       << trim.llx << " " << trim.lly << " "
-                       << trim.urx << " " << trim.ury << ",";
+                       << trim.llx << ' ' << trim.lly << ' '
+                       << trim.urx << ' ' << trim.ury << ',';
        }
-       if (natheight.value() == 0) {
-               options << "natheight=" << natheight.asString() << ",";
+       if (natheight.value() != 0) {
+               options << "natheight=" << natheight.asString() << ',';
        }
-       if (natwidth.value() == 0) {
-               options << "natwidth=" << natwidth.asString() << ",";
+       if (natwidth.value() != 0) {
+               options << "natwidth=" << natwidth.asString() << ',';
        }
        if (angle != 0.0) {
-               options << "angle=" << angle << ",";
+               options << "angle=" << angle << ',';
        }
        if (origin != DEFAULT) {
                switch(origin) {
@@ -282,19 +473,19 @@ int InsetGraphics::Latex(Buffer const *, ostream & os,
                }
        }
        if (g_width.value() != 0) {
-               options << "width=" << g_width.asString() << ",";
+               options << "width=" << g_width.asString() << ',';
        }
        if (g_height.value() != 0) {
-               options << "height=" << g_height.asString() << ",";
+               options << "height=" << g_height.asString() << ',';
        }
        if (totalheight.value() != 0) {
-               options << "totalheight=" << totalheight.asString() << ",";
+               options << "totalheight=" << totalheight.asString() << ',';
        }
        if (keepaspectratio) {
                options << "keepaspectratio,";
        }
        if (scale != 0.0) {
-               options << "scale=" << scale << ",";
+               options << "scale=" << scale << ',';
        }
        if (clip) {
                options << "clip,";
@@ -303,17 +494,21 @@ int InsetGraphics::Latex(Buffer const *, ostream & os,
                options << "draft,";
        }
        if (!type.empty()) {
-               options << "type=" << type << ",";
-       }
-       if (!ext.empty()) {
-               options << "ext=" << type << ",";
-       }
-       if (!read.empty()) {
-               options << "read=" << type << ",";
-       }
-       if (!command.empty()) {
-               options << "command=" << type << ",";
-       }
+               options << "type=" << type << ',';
+       
+        // These should be present only when type is used.
+           if (!ext.empty()) {
+                   options << "ext=" << type << ',';
+           }
+           if (!read.empty()) {
+                   options << "read=" << type << ',';
+           }
+           if (!command.empty()) {
+                   options << "command=" << type << ',';
+           }
+    }
+#endif
+
 #ifdef HAVE_SSTREAM
        string opts(options.str().c_str());
 #else
@@ -323,48 +518,126 @@ int InsetGraphics::Latex(Buffer const *, ostream & os,
        delete [] tmp;
 #endif
        opts = strip(opts, ',');
+
+    
+    // If it's not an inline image, surround it with the centering paragraph.
+    if (! params.inlineFigure) {
+        os << endl 
+            << "\\vspace{0.3cm}" << endl
+            << "{\\par\\centering ";
+    }
+   
+    // Do we want subcaptions?
+    if (params.subcaption) {
+        os << "\\subfigure[" << params.subcaptionText << "]{";
+    }
+    
+       // We never used the starred form, we use the "clip" option instead.
+    os << "\\includegraphics";
+
        if (!opts.empty()) {
-               command += "[";
-               command += opts;
-               command += "]";
+               os << '[' << opts << ']';
        }
-       command += "{";
-       command += graphicsfile;
-       command += "}";
 
-       os << command << '\n';
-       
+    // Make the filename relative to the lyx file
+    string filename = MakeRelPath(params.filename, OnlyPath(buf->fileName()));
+
+    // and remove the extension so the LaTeX will use whatever is
+    // appropriate (when there are several versions in different formats)
+    filename = ChangeExtension(filename, string());
+
+       os << '{' << filename << '}';
+
+    // Do we want a subcaption?
+    if (params.subcaption) {
+        // Close the subcaption command
+        os << '}';
+    }
+    
+    // Is this an inline graphics?
+    if (!params.inlineFigure) {
+        os  << " \\par}" << endl
+            << "\\vspace{0.3cm}" << endl;
+    }
+
+    // How do we decide to what format should we export?
+//    cachehandle->export(ImageType::EPS);
+//    cachehandle->export(ImageType::PNG);
+        
        return 1;
 }
 
 
 int InsetGraphics::Ascii(Buffer const *, ostream &) const
 {
+    // No graphics in ascii output.
        return 0;
 }
 
 
 int InsetGraphics::Linuxdoc(Buffer const *, ostream &) const
 {
+    // No graphics in LinuxDoc output. Should check how/what to add.
        return 0;
 }
 
 
 int InsetGraphics::DocBook(Buffer const *, ostream &) const
 {
+    // No graphics in DocBook output. Should check how/what to add.
        return 0;
 }
 
 
-void InsetGraphics::Validate(LaTeXFeatures & /*features*/) const
+void InsetGraphics::Validate(LaTeXFeatures & features) const
 {
-       //features.graphicx = true;
+    // If we have no image, we should not require anything.
+    if (params.filename.empty())
+        return;
+
+       features.graphicx = true;
+
+    if (params.subcaption)
+        features.subfigure = true;
 }
 
+// Update the inset after parameters changed (read from file or changed in
+// dialog.
+void InsetGraphics::updateInset()
+{
+    // If file changed...
+       //graphicscache.addFile(params.filename);
+       //bb = graphicscache.getBB(params.filename);
+       //pixmap = graphicscache.getPixmap(params.filename);
+}
 
-Inset * InsetGraphics::Clone() const
+bool InsetGraphics::setParams(InsetGraphicsParams const & params)
 {
-       return new InsetGraphics;
+    // TODO: Make it return true only when the data has been changed.
+    // for this to work we still need to implement operator == in 
+    // InsetGraphicsParams
+    if (this->params == params)
+        return false;
+
+    // Copy the new parameters.
+    this->params = params;
+
+    // Update the inset with the new parameters.
+    updateInset();
+   
+    // We have changed data, report it.
+    return true;
 }
 
+InsetGraphicsParams InsetGraphics::getParams() const
+{
+    return params;
+}
 
+Inset * InsetGraphics::Clone() const
+{
+    InsetGraphics * newInset = new InsetGraphics;
+    newInset->setParams(getParams());
+    
+       return newInset;
+}
index 43fe14c26b13567ecf51cee2b42576089cd220f7..4452599a8ca2f63b874e395254d67af49d146f12 100644 (file)
 #endif
 
 #include "insets/lyxinset.h"
+#include "insets/insetgraphicsParams.h"
+
 #include "LaTeXFeatures.h"
-#include "vspace.h"
-#include "insets/BoundingBox.h"
 
-struct FD_Graphics;
+// We need a signal here to hide an active dialog when we are deleted.
+#include "sigc++/signal_system.h"
+#ifdef SIGC_CXX_NAMESPACES
+using SigC::Signal0;
+#endif
+
+class Dialogs;
+class GraphicsCacheItem;
 
 ///
 class InsetGraphics : public Inset {
 public:
        ///
        InsetGraphics();
+    ///
+    ~InsetGraphics();
        ///
        int ascent(BufferView *, LyXFont const &) const;
        ///
@@ -35,6 +44,8 @@ public:
        ///
        int width(BufferView *, LyXFont const &) const;
        ///
+       bool display() const { return true; }
+       ///
        void draw(BufferView *, LyXFont const &, int, float &, bool) const;
        ///
        void Edit(BufferView *, int, int, unsigned int);
@@ -44,6 +55,7 @@ public:
        void Write(Buffer const *, std::ostream &) const;
        ///
        void Read(Buffer const *, LyXLex & lex);
+
        /** returns the number of rows (\n's) of generated tex code.
         fragile == true means, that the inset should take care about
         fragile commands by adding a \protect before.
@@ -57,7 +69,9 @@ public:
        ///
        int DocBook(Buffer const *, std::ostream &) const;
 
-       /// Updates needed features for this inset.
+       /** Tell LyX what the latex features you need i.e. what latex packages
+     * you need to be included.
+     */
        void Validate(LaTeXFeatures & features) const;
 
        /// returns LyX code associated with the inset. Used for TOC, ...)
@@ -65,28 +79,37 @@ public:
   
        ///
        Inset * Clone() const;
-       /// Set the graphics file
-       void graphicsFile(string const & f) {
-               graphicsfile = f;
-       }
-       /// Get the graphics file
-       string const & graphicsFile() const {
-               return graphicsfile;
-       }
+
+    /// Set the inset parameters, used by the GUIndependent dialog.
+    /// Return true of new params are different from what was so far.
+    bool setParams(InsetGraphicsParams const & params);
+
+    /// Get the inset parameters, used by the GUIndependent dialog.
+    InsetGraphicsParams getParams() const;
+
+    /// This signal is connected by our dialog and called when the inset
+    /// is deleted.
+    Signal0<void> hide;
 private:
-       ///
-       FD_Graphics * form;
-       ///
-       string graphicsfile;
-       ///
-       Pixmap pixmap;
-       
+    /// Update the inset after parameter change.
+    void updateInset();
+
+    /// The graphics cache handle.
+    GraphicsCacheItem * cachehandle;
+
+
+    InsetGraphicsParams params;
+
+    // Baruch Even (baruch.even@writeme.com) 2000-07-17
+    // This was the intended way however it is not flexible enough and
+    // only provides for LaTeX output.
+#ifdef IG_OLDPARAMS
        // We need variables to store the size of the boundingbox and
        // to store a pointer to the pixmap in.. The question is if
        // these should be in a "pixmap" class.
        // We also need to have variables about rotation and scaling,
        // width and height. in effect all the paramters that
-       // \includegrapichs can handle. (the graphix.sty package)
+       // \includegraphics can handle. (the graphix.sty package)
 
        /** The "bounding box" of the graphics image. Its value field
            must contain four dimensions, separated by spaces.  */
@@ -101,76 +124,77 @@ private:
            and then for HiResBoundingBox, and set hiresbb depending on this.
            This key makes LaTeX search for %%HiResBoundingBox comments
            instead of the normal %%BoundingBox. Some applications use
-           this to specify more precise bounding boxes, becase the cumbers
+           this to specify more precise bounding boxes, becase the numbers
            can normally only have integer values. It is a Boolean, either
            "true" or "false". */
        bool hiresbb;
+    
        /** This key takes four arguments (like bb), but in this case the
            origin is taken with respect to the bounding box specified in
            the file. So to view a 20 bp square at the lower left-hand corner
            of the picture, specify viewport=0 0 20 20. */
        BoundingBox viewport;
+    
        /** Similar to the viewport key, but the four dimensions correspond
            to the amount of space to be trimmed (cut off) at the left-hand
            side, bottom, right-hand side and top of the included graphics. */
        BoundingBox trim;
+    
        /// Natural height of figure
        LyXLength natheight;
+    
        /// Natural width of figure.
        LyXLength natwidth;
+   
        /// Rotation angle (in degrees, counterclockwise).
        float angle;
-       /// This is the different origins that the graphicx package support.
-       enum Origin {
-               DEFAULT,
-               LEFTTOP,
-               LEFTCENTER,
-               LEFTBASELINE,
-               LEFTBOTTOM,
-               CENTERTOP,
-               CENTER,
-               CENTERBASELINE,
-               CENTERBOTTOM,
-               RIGHTTOP,
-               RIGHTCENTER,
-               RIGHTBASELINE,
-               RIGHTBOTTOM,
-               REFERENCE_POINT = LEFTBASELINE
-       };
+
        /** Origin for rotation, similar to the origin parameter of
            the \rotatebox command described on p.46 and Fig. 2.2 on p.46. */
        Origin origin;
+    
        /// Required width (the width of the image is scaled to that value).
        LyXLength g_width;
+    
        /// Required height (the height of the image is scaled to that value).
        LyXLength g_height;
+    
        /** Required total height (the total height of the image is scaled
            to that value). This key should be used instead of height if
            images are rotated over 90 degrees, since the height can
            disappear (and become the depth) and LaTeX will have difficulties
            satisfying the user's request. */
        LyXLength totalheight;
+    
        /** Boolean variable that can have the values "true" and "false"
            (se above for defaults). When true, specifying both width and
            height parameters does not distort the picture, but the image
            is scaled so that neither of the width of height exceeds the
            given dimensions. */
        bool keepaspectratio;
+    
        /// Scale factor
        float scale;
+    
        /** Clip the graphic to the bounding box. It is a Boolean, either
            "true" or "false". */
        bool clip;
+    
        /// Locally switch to draft mode. A Boolean valued key, like clip.
        bool draft;
+    
        /// The graphics type.
        string type;
-       ///x The file extension of the file containing the image data.
+    
+       /// The file extension of the file containing the image data.
        string ext;
+    
        /// The file extension of the file "read" by LaTeX.
        string read;
+    
        /// Any command to be applied to the file.
        string command;
+#endif    
 };
 
 #endif
diff --git a/src/insets/insetgraphicsParams.C b/src/insets/insetgraphicsParams.C
new file mode 100644 (file)
index 0000000..0607353
--- /dev/null
@@ -0,0 +1,446 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include <config.h>
+#include "insetgraphicsParams.h"
+
+#include "support/translator.h"
+#include "support/filetools.h"
+
+#ifdef ENABLE_ASSERTIONS
+#include "support/LAssert.h"
+#endif
+
+/// This variable keeps a tab on whether the translator was set with the
+/// translations.
+static bool translatorsSet = false;
+
+/// This is the translator between the Resize enum and corresponding lyx
+/// file strings.
+static Translator<InsetGraphicsParams::Resize, string>
+    resizeTranslator(InsetGraphicsParams::DEFAULT_SIZE, "default");
+
+/// This is the translator between the Origin enum and corresponding lyx
+/// file strings.
+static Translator<InsetGraphicsParams::Origin, string>
+    originTranslator(InsetGraphicsParams::DEFAULT, "default");
+
+/// This is the translator between the Display enum and corresponding lyx
+/// file strings.
+static Translator<InsetGraphicsParams::DisplayType, string>
+    displayTranslator(InsetGraphicsParams::MONOCHROME, "monochrome");
+
+
+
+InsetGraphicsParams::InsetGraphicsParams()
+{
+    init();
+
+    // Set translators
+    if (! translatorsSet) {
+        translatorsSet = true;
+
+        // Fill the resize translator
+        resizeTranslator.addPair(DEFAULT_SIZE, "default");
+        resizeTranslator.addPair(CM, "cm");
+        resizeTranslator.addPair(INCH, "inch");
+        resizeTranslator.addPair(PERCENT_PAGE, "percentOfPage");
+        resizeTranslator.addPair(PERCENT_COLUMN, "percentOfColumn");
+
+        // Fill the origin translator
+        originTranslator.addPair(DEFAULT, "default");
+        originTranslator.addPair(LEFTTOP, "leftTop");
+        originTranslator.addPair(LEFTCENTER, "leftCenter");
+        originTranslator.addPair(LEFTBASELINE, "leftBaseLine");
+        originTranslator.addPair(LEFTBOTTOM, "leftBottom");
+        originTranslator.addPair(CENTERTOP, "centerTop");
+        originTranslator.addPair(CENTER, "center");
+        originTranslator.addPair(CENTERBASELINE, "centerBaseLine");
+        originTranslator.addPair(CENTERBOTTOM, "centerBottom");
+        originTranslator.addPair(RIGHTTOP, "rightTop");
+        originTranslator.addPair(RIGHTCENTER, "rightCenter");
+        originTranslator.addPair(RIGHTBASELINE, "rightBaseLine");
+        originTranslator.addPair(RIGHTBOTTOM, "rightBottom");
+        originTranslator.addPair(REFERENCE_POINT, "referencePoint");
+        
+        // Fill the display translator
+        displayTranslator.addPair(MONOCHROME, "monochrome");
+        displayTranslator.addPair(GRAYSCALE, "grayscale");
+        displayTranslator.addPair(COLOR, "color");
+        displayTranslator.addPair(NONE, "none");
+    }
+    
+}
+
+
+InsetGraphicsParams::InsetGraphicsParams(InsetGraphicsParams const & igp)
+{
+    // I decided to skip the initialization since the copy will overwrite
+    // everything anyway.
+//    init();
+    copy(igp);
+}
+
+InsetGraphicsParams const & 
+InsetGraphicsParams::operator=(InsetGraphicsParams const &params)
+{
+    // Are we assigning the object into itself?
+    if (this == &params)
+        return *this;
+    
+    copy(params);    
+    return *this;
+}
+
+void InsetGraphicsParams::init()
+{
+    subcaptionText = filename = string();
+    display = MONOCHROME;
+    inlineFigure = false;
+    subcaption = false;
+    keepAspectRatio = true;
+    widthResize = DEFAULT_SIZE;
+    widthSize = 0.0;
+    heightResize = DEFAULT_SIZE;
+    heightSize = 0.0;
+    rotateOrigin = DEFAULT;
+    rotateAngle = 0;
+
+#ifdef ENABLE_ASSERTION
+    testInvariant();
+#endif
+}
+
+void InsetGraphicsParams::copy(InsetGraphicsParams const & igp)
+{
+    filename = igp.filename;
+    display = igp.display;
+    inlineFigure = igp.inlineFigure;
+    subcaption = igp.subcaption;
+    subcaptionText = igp.subcaptionText;
+    keepAspectRatio = igp.keepAspectRatio;
+    widthResize = igp.widthResize;
+    widthSize = igp.widthSize;
+    heightResize = igp.heightResize;
+    heightSize = igp.heightSize;
+    rotateOrigin = igp.rotateOrigin;
+    rotateAngle = igp.rotateAngle;
+
+#ifdef ENABLE_ASSERTIONS
+    testInvariant();
+#endif    
+}
+
+void InsetGraphicsParams::testInvariant() const
+{
+#ifdef ENABLE_ASSERTIONS
+    // Filename might be empty (when the dialog is first created).
+    // Assert(!filename.empty());
+    
+    Assert(display == COLOR ||
+            display == MONOCHROME ||
+            display == GRAYSCALE ||
+            display == NONE
+            );
+    
+    Assert(widthResize == DEFAULT_SIZE ||
+            widthResize == CM ||
+            widthResize == INCH ||
+            widthResize == PERCENT_PAGE ||
+            widthResize == PERCENT_COLUMN
+            );
+
+    Assert(heightResize == DEFAULT_SIZE ||
+            heightResize == CM ||
+            heightResize == INCH ||
+            heightResize == PERCENT_PAGE
+            );
+    
+    Assert(widthSize  >= 0.0);
+    Assert(heightSize >= 0.0);
+    
+    // Angle is in degrees and ranges -360 < angle < 360
+    // The reason for this is that in latex there is a meaning for the
+    // different angles and they are not necessarliy interchangeable,
+    // it depends on the rotation origin.
+    Assert(rotateAngle <  360);
+    Assert(rotateAngle > -360);
+
+#endif
+}
+
+bool operator==(InsetGraphicsParams const & left, 
+        InsetGraphicsParams const & right)
+{
+    if (left.filename == right.filename   &&
+            left.display == right.display &&
+            left.inlineFigure == right.inlineFigure &&
+            left.subcaption == right.subcaption &&
+            left.subcaptionText == right.subcaptionText &&
+            left.keepAspectRatio == right.keepAspectRatio &&
+            left.widthResize == right.widthResize &&
+            left.widthSize == right.widthSize &&
+            left.heightResize == right.heightResize &&
+            left.heightSize == right.heightSize &&
+            left.rotateOrigin == right.rotateOrigin &&
+            left.rotateAngle == right.rotateAngle
+            )
+        return true;
+
+    return false;
+}
+
+static void writeResize(ostream & os, char const * key, 
+        InsetGraphicsParams::Resize resize, double size)
+{
+    os << ' ' << key << "Resize ";
+
+    os << resizeTranslator.find(resize);
+#if 0
+    // Old code, before using translators
+    switch (resize) {
+    case InsetGraphicsParams::DEFAULT_SIZE:
+        os << "default";
+        break;
+        
+    case InsetGraphicsParams::CM:
+        os << "cm";
+        break;
+        
+    case InsetGraphicsParams::INCH:
+        os << "inch";
+        break;
+        
+    case InsetGraphicsParams::PERCENT_PAGE:
+        os << "percentOfPage";
+        break;
+        
+    case InsetGraphicsParams::PERCENT_COLUMN:
+        os << "percentOfColumnt";
+        break;
+    }
+#endif
+    os << ' ' << key << ' ' << size << endl;
+}
+
+static void writeOrigin(ostream & os, 
+        InsetGraphicsParams::Origin origin)
+{
+    os << " rotateOrigin " << originTranslator.find(origin);
+    
+#if 0
+    // Old method.
+    switch (origin) {
+    case InsetGraphicsParams::  DEFAULT:
+        os << "default";
+        break;
+    case InsetGraphicsParams:: LEFTTOP:
+        os << "LeftTop";
+        break;
+    case InsetGraphicsParams:: LEFTCENTER:
+        os << "LeftCenter";
+        break;
+    case InsetGraphicsParams:: LEFTBASELINE:
+        os << "LeftBaseLine";
+        break;
+    case InsetGraphicsParams:: LEFTBOTTOM:
+        os << "LeftBottom";
+        break;
+    case InsetGraphicsParams:: CENTERTOP:
+        os << "CenterTop";
+        break;
+    case InsetGraphicsParams:: CENTER:
+        os << "Center";
+        break;
+    case InsetGraphicsParams:: CENTERBASELINE:
+        os << "CenterBaseLine";
+        break;
+    case InsetGraphicsParams:: CENTERBOTTOM:
+        os << "CenterBottom";
+        break;
+    case InsetGraphicsParams:: RIGHTTOP:
+        os << "RightTop";
+        break;
+    case InsetGraphicsParams:: RIGHTCENTER:
+        os << "RightCenter";
+        break;
+    case InsetGraphicsParams:: RIGHTBASELINE:
+        os << "RightBaseLine";
+        break;
+    case InsetGraphicsParams:: RIGHTBOTTOM:
+        os << "RightBottom";
+        break;
+        // Current REFERENCE_POINT is aliased to LEFTBASELINE
+//    case InsetGraphicsParams::       REFERENCE_POINT:
+    }
+#endif
+    
+    os << endl;
+}
+
+void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
+{
+    // If there is no filename, write nothing for it.
+    if (! filename.empty()) {
+        os << "filename " 
+           << MakeRelPath(filename, OnlyPath(buf->fileName())) 
+           << endl;
+    }
+
+    // Save the display type
+    os << " display " << displayTranslator.find(display) << endl;
+#if 0
+    switch (display) {
+    case COLOR:
+        os << "color";
+        break;
+
+    case GRAYSCALE:
+        os << "grayscale";
+        break;
+
+    case MONOCHROME:
+        os << "monochrome";
+        break;
+
+    case NONE:
+        os << "none";
+        break;
+    }
+    os << endl;
+#endif
+    
+    // Save the inline status
+    if (inlineFigure)
+        os << " inline";
+
+    // Save the subcaption status
+    if (subcaption)
+        os << " subcaption";
+
+    if (! subcaptionText.empty())
+        os << " subcaptionText \"" << subcaptionText << '\"' << endl;
+
+    writeResize(os, "width", widthResize, widthSize);
+    writeResize(os, "height", heightResize, heightSize);
+
+    writeOrigin(os, rotateOrigin);
+    if (rotateAngle != 0)
+        os << " rotateAngle " << rotateAngle << endl;
+}
+   
+static readResize(InsetGraphicsParams * igp, bool height, string const & token)
+{
+    InsetGraphicsParams::Resize resize = InsetGraphicsParams::DEFAULT_SIZE;
+
+    resize = resizeTranslator.find(token);
+#if 0
+    // Old code, before translator.
+    if (token == "default")
+        resize = InsetGraphicsParams::DEFAULT_SIZE;
+    else if (token == "cm")
+        resize = InsetGraphicsParams::CM;
+    else if (token == "inch")
+        resize = InsetGraphicsParams::INCH;
+    else if (token == "percentOfPage")
+        resize = InsetGraphicsParams::PERCENT_PAGE;
+    else if (token == "percentOfColumn")
+        resize = InsetGraphicsParams::PERCENT_COLUMN;
+    else {
+        lyxerr << "BUG: When reading resize value of InsetGraphicsParam"
+            " unknown token found '" << token << '\'' << endl;
+    }
+#endif 
+    
+    if (height)
+        igp->heightResize = resize;
+    else 
+        igp->widthResize = resize;
+}
+    
+static readOrigin(InsetGraphicsParams * igp, string const & token)
+{ // TODO: complete this function.
+    igp->rotateOrigin = originTranslator.find(token);
+}
+    
+bool InsetGraphicsParams::Read(Buffer const * buf, LyXLex & lex, 
+        string const& token)
+{
+    if (token == "filename") {
+        lex.next();
+        filename = lex.GetString();
+
+        if (!filename.empty()) {
+            // Make the filename with absolute directory.
+            filename = MakeAbsPath(filename, OnlyPath(buf->fileName()));
+        }
+    } else if (token == "display") {
+        lex.next();
+        string const type = lex.GetString();
+
+        display = displayTranslator.find(type);
+#if 0
+        if (type == "color")
+            display = COLOR;
+        else if (type == "grayscale")
+            display = GRAYSCALE;
+        else if (type == "monochrome")
+            display = MONOCHROME;
+        else if (type == "none")
+            display = NONE;
+        else {
+            display = MONOCHROME;
+            lyxerr << "BUG: When reading InsetGraphicsParams"
+                " display has an unknown type " << type << endl;
+        }
+#endif 
+    } else if (token == "inline") {
+        inlineFigure = true;
+    } else if (token == "subcaption") {
+        subcaption = true;
+    } else if (token == "subcaptionText") {
+        lex.next();
+        subcaptionText = lex.GetString();
+    } else if (token == "widthResize") {
+        lex.next();
+        string const token = lex.GetString();
+        
+        readResize(this, false, token);
+    } else if (token == "width") {
+        lex.next();
+        widthSize = lex.GetFloat();
+    } else if (token == "heightResize") {
+        lex.next();
+        string const token = lex.GetString();
+        
+        readResize(this, true, token);
+    } else if (token == "height") {
+        lex.next();
+        heightSize = lex.GetFloat();
+    } else if (token == "rotateOrigin") {
+        lex.next();
+        string const token = lex.GetString();
+
+        readOrigin(this, token);
+    } else if (token == "rotateAngle") {
+        lex.next();
+        rotateAngle = lex.GetInteger();
+    } else {
+        // If it's none of the above, its not ours.
+        return false;
+    }
+
+    return true;
+}
diff --git a/src/insets/insetgraphicsParams.h b/src/insets/insetgraphicsParams.h
new file mode 100644 (file)
index 0000000..027b385
--- /dev/null
@@ -0,0 +1,126 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifndef INSETGRAPHICSPARAMS_H
+#define INSETGRAPHICSPARAMS_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include <config.h>
+#include "LString.h"
+
+#include "buffer.h"
+#include "lyxlex.h"
+
+using std::ostream;
+
+/// This struct holds all the parameters needed by insetGraphics.
+struct InsetGraphicsParams {
+    /// Image filename.
+    string filename;
+    
+    /// How do we display the image?
+    enum DisplayType {
+        /// In full color range (if it's not in color we show it as it is)
+        COLOR,
+        /// In Grayscale (256 shades of gray).
+        GRAYSCALE,
+        /// In black and white.
+        MONOCHROME,
+        /// Don't display it on screen, only keep a frame in place.
+        NONE
+    };
+
+    /// How to display the image
+    DisplayType display;
+
+    /// Is the figure inlined? (not in a paragraph of its own).
+    bool inlineFigure;
+
+    /// Do we have a subcaption?
+    bool subcaption;
+
+    /// The text of the subcaption.
+    string subcaptionText;
+    
+       /// This is the different origins that the graphicx package support.
+       enum Origin {
+               DEFAULT,
+               LEFTTOP,
+               LEFTCENTER,
+               LEFTBASELINE,
+               LEFTBOTTOM,
+               CENTERTOP,
+               CENTER,
+               CENTERBASELINE,
+               CENTERBOTTOM,
+               RIGHTTOP,
+               RIGHTCENTER,
+               RIGHTBASELINE,
+               RIGHTBOTTOM,
+               REFERENCE_POINT = LEFTBASELINE
+       };
+
+    /// The resize of the image, is it the default size, in cm, inch or
+    /// percentage of the page/column width/height
+    enum Resize {
+        DEFAULT_SIZE,
+        CM,
+        INCH,
+        PERCENT_PAGE,
+        PERCENT_COLUMN
+    };
+
+    
+    /// Keep the ratio between height and width when resizing.
+    bool keepAspectRatio;
+
+    // What width resize to do?
+    Resize widthResize;
+    // Value of width resize
+    float widthSize;
+    // What height resize to do?
+    Resize heightResize;
+    // Value of height resize
+    float heightSize;
+
+    // Origin point of rotation
+    Origin rotateOrigin;
+    // Rotation angle.
+    int rotateAngle;
+
+    InsetGraphicsParams();
+
+    InsetGraphicsParams(InsetGraphicsParams const &);
+    InsetGraphicsParams const & operator=(InsetGraphicsParams const &);
+
+    /// Save the parameters in the LyX format stream.
+    void Write(Buffer const * buf, ostream & os) const;
+    
+    /// If the token belongs to our parameters, read it.
+    bool Read(Buffer const * buf, LyXLex & lex, string const & token);
+    
+    /// Test the struct to make sure that all the options have legal values.
+    void testInvariant() const;
+
+private:
+    /// Initialize the object to a default status.
+    void init();
+
+    /// Copy the other objects content to us, used in copy c-tor and assignment
+    void copy(InsetGraphicsParams const & params);
+};
+
+bool operator==(InsetGraphicsParams const&, InsetGraphicsParams const &);
+
+#endif
index 832b8b119d2429a05da1914cf7ef5bf026a63177..49af9f3cc576506fb60c54d7c73f8e4e8d065754 100644 (file)
@@ -90,7 +90,7 @@ static tabular_features tabularFeatures[] =
     { LyXTabular::UNSET_ROTATE_TABULAR, "unset-rotate-tabular" },
     { LyXTabular::SET_ROTATE_CELL, "set-rotate-cell" },
     { LyXTabular::UNSET_ROTATE_CELL, "unset-rotate-cell" },
-    { LyXTabular::SET_LINEBREAKS, "set-linebreaks" },
+    { LyXTabular::SET_USEBOX, "set-usebox" },
     { LyXTabular::SET_LTHEAD, "set-lthead" },
     { LyXTabular::SET_LTFIRSTHEAD, "set-ltfirsthead" },
     { LyXTabular::SET_LTFOOT, "set-ltfoot" },
@@ -190,7 +190,7 @@ void InsetTabular::initFeatures()
        { LyXTabular::UNSET_ROTATE_TABULAR, "unset-rotate-tabular" },
        { LyXTabular::SET_ROTATE_CELL, "set-rotate-cell" },
        { LyXTabular::UNSET_ROTATE_CELL, "unset-rotate-cell" },
-       { LyXTabular::SET_LINEBREAKS, "set-linebreaks" },
+       { LyXTabular::SET_USEBOX, "set-usebox" },
        { LyXTabular::SET_LTHEAD, "set-lthead" },
        { LyXTabular::SET_LTFIRSTHEAD, "set-ltfirsthead" },
        { LyXTabular::SET_LTFOOT, "set-ltfoot" },
@@ -1171,7 +1171,7 @@ bool InsetTabular::TabularFeatures(BufferView * bv, string what)
 }
 
 
-void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
+void InsetTabular::TabularFeatures(BufferView * bv, int feature, string value)
 {
     int
        i, j,
@@ -1252,8 +1252,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
     switch (feature) {
     case LyXTabular::SET_PWIDTH:
     {
-       bool update = (tabular->GetColumnPWidth(actcell) != val);
-       tabular->SetColumnPWidth(actcell,val);
+       bool update = (tabular->GetColumnPWidth(actcell) != value);
+       tabular->SetColumnPWidth(actcell,value);
        if (update) {
            for (int i=0; i < tabular->rows(); ++i) {
                tabular->GetCellInset(tabular->GetCellNumber(i, column))->
@@ -1265,8 +1265,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
     break;
     case LyXTabular::SET_MPWIDTH:
     {
-       bool update = (tabular->GetPWidth(actcell) != val);
-       tabular->SetMColumnPWidth(actcell,val);
+       bool update = (tabular->GetPWidth(actcell) != value);
+       tabular->SetMColumnPWidth(actcell,value);
        if (update) {
            for (int i=0; i < tabular->rows(); ++i) {
                tabular->GetCellInset(tabular->GetCellNumber(i, column))->
@@ -1278,7 +1278,7 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
     break;
     case LyXTabular::SET_SPECIAL_COLUMN:
     case LyXTabular::SET_SPECIAL_MULTI:
-       tabular->SetAlignSpecial(actcell,val,feature);
+       tabular->SetAlignSpecial(actcell,value,feature);
        break;
     case LyXTabular::APPEND_ROW:
        // append the row into the tabular
@@ -1452,12 +1452,16 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
            for(j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetRotateCell(tabular->GetCellNumber(i,j),false);
        break;
-    case LyXTabular::SET_LINEBREAKS:
-       what = !tabular->GetLinebreaks(actcell);
+    case LyXTabular::SET_USEBOX:
+    {
+       int val = strToInt(value);
+       if (val == tabular->GetUsebox(actcell))
+           val = 0;
        for(i=sel_row_start; i<=sel_row_end; ++i)
            for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetLinebreaks(tabular->GetCellNumber(i,j),what);
+               tabular->SetUsebox(tabular->GetCellNumber(i,j),val);
        break;
+    }
     case LyXTabular::SET_LTFIRSTHEAD:
        tabular->SetLTHead(actcell,true);
        break;
index 3df8f1fd500c1aa2a0e3b124a447bbf901c36005..91620b3865a9e6e849c43199606056b98a8f02d1 100644 (file)
@@ -924,8 +924,12 @@ string LyXFunc::Dispatch(int ac,
        case LFUN_INSET_GRAPHICS:
        {
                Inset * new_inset = new InsetGraphics;
-               if (!owner->view()->insertInset(new_inset))
+               if (!owner->view()->insertInset(new_inset)) {
                        delete new_inset;
+               } else {
+                   // this is need because you don't use a inset->Edit()
+                   owner->view()->updateInset(new_inset, true);
+               }
                break;
        }
        
index a7a038facc86209d1fb45921755096271434d9c7..2bc70a97f7b0f6704359bf243d2140f55d8db61a 100644 (file)
@@ -55,5 +55,6 @@ libsupport_la_SOURCES = \
        syscontr.C \
        syscontr.h \
        syssingleton.C \
+       translator.h \
        textutils.h \
        utility.hpp
diff --git a/src/support/translator.h b/src/support/translator.h
new file mode 100644 (file)
index 0000000..2170d5f
--- /dev/null
@@ -0,0 +1,132 @@
+// -*- C++ -*-
+/* This file is part of
+ * =================================================
+ * 
+ *          LyX, The Document Processor
+ *          Copyright 1995 Matthias Ettrich.
+ *          Copyright 1995-2000 The LyX Team.
+ *
+ *          This file Copyright 2000 Baruch Even
+ * ================================================= */
+
+#ifndef TRANSLATOR_H
+#define TRANSLATOR_H
+
+
+#include <vector>
+#include <utility>
+#include <algorithm>
+#include <functional>
+
+// Functors used in the template.
+template<typename T1, typename T2>
+class equal_1st_in_pair {
+public:
+    equal_1st_in_pair(T1 const & value) : value_(value) {}
+
+    typedef std::pair<T1, T2> pair_type;
+    bool operator() (pair_type p) const {
+        return p.first == value_;
+    }
+private:
+    T1 const & value_;
+};
+
+template<typename T1, typename T2>
+class equal_2nd_in_pair {
+public:
+    equal_2nd_in_pair(T2 const & value) : value_(value) {}
+
+    typedef std::pair<T1, T2> pair_type;
+    bool operator() (pair_type p) const {
+        return p.second == value_;
+    }
+private:
+    T2 const & value_;
+};
+
+/** This class template is used to translate between two elements, specifically
+ * it was worked out to translate between an enum and strings when reading
+ * the lyx file.
+ *
+ * The two template arguments should be of different types.
+ */
+
+template<typename T1, typename T2>
+class Translator {
+public:
+    typedef T1 first_argument_type;
+    typedef T2 second_argument_type;
+
+    /// c-tor.
+    Translator(T1 const & t1, T2 const & t2) 
+        : default_t1(t1), default_t2(t2) 
+        {}
+    /// d-tor. Not virtual since it's not going to be inherited.
+    ~Translator() {}
+
+    /// Add a mapping to the translator.
+    void addPair(T1 const & first, T2 const & second) {
+        map.push_back(MapPair(first, second));
+    }
+
+    /// Find the mapping for the first argument
+    T2 const & find(T1 const & first) const {
+#ifdef ENABLE_ASSERTIONS
+        Assert( ! map.empty());
+#endif
+
+        // For explanation see the next find() function.
+        Map::const_iterator it =
+            std::find_if(map.begin(), map.end(),
+                    equal_1st_in_pair<T1, T2>(first)
+                        );
+
+        if (it != map.end())
+            return (*it).second;
+        else {
+            return default_t2;
+        }
+    }
+
+    /// Find the mapping for the second argument
+    T1 const & find(T2 const & second) const {
+#ifdef ENABLE_ASSERTIONS
+        Assert( ! map.empty());
+#endif
+
+        // The idea is as follows:
+        // find_if() will try to compare the data in the vector with the value.
+        // The vector is made of pairs and the value has the type of the
+        // second part of the pair. 
+        // We thus give find_if() an equal_to functor and assign to its second
+        // post the value we want to compare. We now compose the equal_to 
+        // functor with the select2nd functor to take only the second value
+        // of the pair to be compared.
+        //
+        // We can depict it as follows:
+        // equal_to( select2nd(pair) , second)
+        Map::const_iterator it =
+            std::find_if(map.begin(), map.end(),
+                    equal_2nd_in_pair<T1, T2>(second)
+                        );
+
+        if (it != map.end())
+            return (*it).first;
+        else {
+            return default_t1;
+        }
+    }
+
+private:
+    typedef std::pair<T1, T2> MapPair;
+    typedef std::vector<MapPair> Map;
+
+    Map map;
+
+    const T1 default_t1;
+    const T2 default_t2;
+
+};
+
+#endif
index 7acb56729297ec60fcbbea8fc060c57536f2756f..a2bd4a2a1e435b5fff1256dbf24e478f843b1623 100644 (file)
@@ -53,7 +53,7 @@ LyXTabular::cellstruct::cellstruct()
     top_line = true;
     bottom_line = false;
     rotate = false;
-    linebreaks = false;
+    usebox = false;
 }
 
 
@@ -940,7 +940,7 @@ void LyXTabular::Write(Buffer const * buf, ostream & os) const
                " leftline=" << cell_info[i][j].left_line <<
                " rightline=" << cell_info[i][j].right_line <<
                " rotate=" << cell_info[i][j].rotate <<
-               " linebreaks=" << cell_info[i][j].linebreaks <<
+               " usebox=" << cell_info[i][j].usebox <<
                " width=\"" << cell_info[i][j].p_width <<
                "\" special=\"" << cell_info[i][j].align_special <<
                "\">" << endl;
@@ -1110,7 +1110,7 @@ void LyXTabular::Read(Buffer const * buf, LyXLex & lex)
            (void)getTokenValue(line, "leftline", cell_info[i][j].left_line);
            (void)getTokenValue(line, "rightline", cell_info[i][j].right_line);
            (void)getTokenValue(line, "rotate", cell_info[i][j].rotate);
-           (void)getTokenValue(line, "linebreaks", cell_info[i][j].linebreaks);
+           (void)getTokenValue(line, "usebox", cell_info[i][j].usebox);
            (void)getTokenValue(line, "width", cell_info[i][j].p_width);
            (void)getTokenValue(line, "special", cell_info[i][j].align_special);
            l_getline(is, line);
@@ -1248,7 +1248,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
                cell_info[i][j].top_line = static_cast<char>(c);
                cell_info[i][j].bottom_line = static_cast<char>(d);
                cell_info[i][j].rotate = static_cast<bool>(f);
-               cell_info[i][j].linebreaks = static_cast<bool>(g);
+               cell_info[i][j].usebox = static_cast<bool>(g);
                cell_info[i][j].align_special = s1;
                cell_info[i][j].p_width = s2;
            }
@@ -1326,7 +1326,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
            }
            inset = GetCellInset(cell);
            row = row_of_cell(cell);
-           if (!cell_info[row_of_cell(cell)][column_of_cell(cell)].linebreaks)
+           if (!cell_info[row_of_cell(cell)][column_of_cell(cell)].usebox)
            {
                // insert a space instead
                par->Erase(i);
@@ -1684,18 +1684,18 @@ int LyXTabular::GetCellNumber(int row, int column) const
 }
 
 
-void LyXTabular::SetLinebreaks(int cell, bool what)
+void LyXTabular::SetUsebox(int cell, int what)
 {
-    cellinfo_of_cell(cell)->linebreaks = what;
+    cellinfo_of_cell(cell)->usebox = what;
 }
 
 
-bool LyXTabular::GetLinebreaks(int cell) const
+int LyXTabular::GetUsebox(int cell) const
 {
     if (column_info[column_of_cell(cell)].p_width.empty() &&
         !(IsMultiColumn(cell) && !cellinfo_of_cell(cell)->p_width.empty()))
         return false;
-    return cellinfo_of_cell(cell)->linebreaks;
+    return cellinfo_of_cell(cell)->usebox;
 }
 
 
@@ -1950,7 +1950,7 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const
            os << "}{";
        }
     }
-    if (GetLinebreaks(cell)) {
+    if (GetUsebox(cell) == 1) {
        os << "\\parbox[";
        switch(GetVAlignment(cell)) {
        case LYX_VALIGN_TOP:
@@ -1963,7 +1963,22 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const
            os << "b";
            break;
        }
-       os << "]{" << GetPWidth(cell) << "}{\\smallskip{}";
+       os << "]{" << GetPWidth(cell) << "}{";
+    } else if (GetUsebox(cell) == 2) {
+       os << "\\begin{minipage}[";
+       switch(GetVAlignment(cell)) {
+       case LYX_VALIGN_TOP:
+           os << "t";
+           break;
+       case LYX_VALIGN_CENTER:
+           os << "m";
+           break;
+       case LYX_VALIGN_BOTTOM:
+           os << "b";
+           break;
+       }
+       os << "]{" << GetPWidth(cell) << "}\n";
+       ++ret;
     }
     return ret;
 }
@@ -1974,13 +1989,17 @@ int LyXTabular::TeXCellPostamble(ostream & os, int cell) const
     int ret = 0;
 
     // usual cells
-    if (GetLinebreaks(cell))
-       os << "\\smallskip{}}";
+    if (GetUsebox(cell) == 1)
+       os << "}";
+    else if (GetUsebox(cell) == 2) {
+       os << "%\n\\end{minipage}";
+       ret += 2;
+    }
     if (IsMultiColumn(cell)){
        os << '}';
     }
     if (GetRotateCell(cell)) {
-       os << endl << "\\end{sideways}";
+       os << "%\n\\end{sideways}";
        ++ret;
     }
     return ret;
index 4927a9676e556eea40570638a5b61846a26b11c2..e4dab2652dcd9e8ca297331f74cea072be0af5a0 100644 (file)
@@ -68,7 +68,7 @@ public:
        UNSET_ROTATE_TABULAR,
        SET_ROTATE_CELL,
        UNSET_ROTATE_CELL,
-       SET_LINEBREAKS,
+       SET_USEBOX,
        SET_LTHEAD,
        SET_LTFIRSTHEAD,
        SET_LTFOOT,
@@ -270,9 +270,9 @@ public:
     ///
     int GetCellNumber(int row, int column) const;
     ///
-    void SetLinebreaks(int cell, bool what);
+    void SetUsebox(int cell, int what);
     ///
-    bool GetLinebreaks(int cell) const;
+    int GetUsebox(int cell) const;
     ///
     /// Long Tabular Options
     ///
@@ -334,7 +334,11 @@ private: //////////////////////////////////////////////////////////////////
        ///
        bool right_line;
        ///
-       bool linebreaks;
+       /// 0 ... don't use a box
+       /// 1 ... use a parbox
+       /// 2 ... use a minipage
+       ///
+       int usebox;
        ///
        int rotate;
        ///