From f4bad86bdaf333294ad1309b20e3df113fc70c3a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrgen=20Vigna?= Date: Mon, 31 Jul 2000 12:30:10 +0000 Subject: [PATCH] Baruch's graphics-patch + minipage-support in tabular-cells. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@938 a592a061-630c-0410-9148-cb99ea01b6c8 --- ChangeLog | 47 ++ configure.in | 1 + po/POTFILES.in | 3 + src/LaTeXFeatures.C | 18 +- src/LaTeXFeatures.h | 3 - src/Makefile.am | 3 +- src/buffer.C | 15 +- src/bufferlist.C | 4 +- src/frontends/Dialogs.h | 3 + src/frontends/kde/Dialogs.C | 4 +- src/frontends/xforms/Dialogs.C | 6 +- src/frontends/xforms/FormGraphics.C | 514 +++++++++++++++ src/frontends/xforms/FormGraphics.h | 145 +++++ src/frontends/xforms/FormTabular.C | 35 +- src/frontends/xforms/Makefile.am | 14 +- src/frontends/xforms/RadioButtonGroup.C | 150 +++++ src/frontends/xforms/RadioButtonGroup.h | 58 ++ src/frontends/xforms/form_graphics.C | 100 +++ src/frontends/xforms/form_graphics.h | 47 ++ src/frontends/xforms/form_tabular.C | 63 +- src/frontends/xforms/form_tabular.h | 5 +- src/frontends/xforms/forms/form_graphics.fd | 685 ++++++++++++++++++++ src/frontends/xforms/forms/form_tabular.fd | 80 ++- src/frontends/xforms/forms/makefile | 1 + src/graphics/.cvsignore | 6 + src/graphics/GraphicsCache.C | 51 ++ src/graphics/GraphicsCache.h | 59 ++ src/graphics/GraphicsCacheItem.C | 18 + src/graphics/GraphicsCacheItem.h | 29 + src/graphics/Makefile.am | 13 + src/graphics/README | 1 - src/insets/Makefile.am | 2 + src/insets/insetgraphics.C | 603 ++++++++++++----- src/insets/insetgraphics.h | 102 +-- src/insets/insetgraphicsParams.C | 446 +++++++++++++ src/insets/insetgraphicsParams.h | 126 ++++ src/insets/insettabular.C | 26 +- src/lyxfunc.C | 6 +- src/support/Makefile.am | 1 + src/support/translator.h | 132 ++++ src/tabular.C | 47 +- src/tabular.h | 12 +- 42 files changed, 3352 insertions(+), 332 deletions(-) create mode 100644 src/frontends/xforms/FormGraphics.C create mode 100644 src/frontends/xforms/FormGraphics.h create mode 100644 src/frontends/xforms/RadioButtonGroup.C create mode 100644 src/frontends/xforms/RadioButtonGroup.h create mode 100644 src/frontends/xforms/form_graphics.C create mode 100644 src/frontends/xforms/form_graphics.h create mode 100644 src/frontends/xforms/forms/form_graphics.fd create mode 100644 src/graphics/.cvsignore create mode 100644 src/graphics/GraphicsCache.C create mode 100644 src/graphics/GraphicsCache.h create mode 100644 src/graphics/GraphicsCacheItem.C create mode 100644 src/graphics/GraphicsCacheItem.h create mode 100644 src/graphics/Makefile.am delete mode 100644 src/graphics/README create mode 100644 src/insets/insetgraphicsParams.C create mode 100644 src/insets/insetgraphicsParams.h create mode 100644 src/support/translator.h diff --git a/ChangeLog b/ChangeLog index 815e32949b..5376d08fac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,50 @@ +2000-07-31 Juergen Vigna + + * 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 + + * 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 * src/insets/insettabular.C (LocalDispatch): diff --git a/configure.in b/configure.in index 90dec3eeaa..bb5ac70cda 100644 --- a/configure.in +++ b/configure.in @@ -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 \ diff --git a/po/POTFILES.in b/po/POTFILES.in index 4fb870e63d..142c74d2a0 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -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 diff --git a/src/LaTeXFeatures.C b/src/LaTeXFeatures.C index c7172bfa55..36c37e6561 100644 --- a/src/LaTeXFeatures.C +++ b/src/LaTeXFeatures.C @@ -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") diff --git a/src/LaTeXFeatures.h b/src/LaTeXFeatures.h index 48c4bc198e..cee55913a1 100644 --- a/src/LaTeXFeatures.h +++ b/src/LaTeXFeatures.h @@ -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 /// diff --git a/src/Makefile.am b/src/Makefile.am index 3bd0547ce2..a722c258f8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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) \ diff --git a/src/buffer.C b/src/buffer.C index cb9efd90d5..5a67d1e9bb 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -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(); diff --git a/src/bufferlist.C b/src/bufferlist.C index b43b3da805..e180a015d6 100644 --- a/src/bufferlist.C +++ b/src/bufferlist.C @@ -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; diff --git a/src/frontends/Dialogs.h b/src/frontends/Dialogs.h index 60e60b10fc..48e825da70 100644 --- a/src/frontends/Dialogs.h +++ b/src/frontends/Dialogs.h @@ -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 showPreferences; /// + Signal1 showGraphics; + /// Signal1 showInclude; /// Signal1 showIndex; diff --git a/src/frontends/kde/Dialogs.C b/src/frontends/kde/Dialogs.C index eb754d96e1..e785c3e47c 100644 --- a/src/frontends/kde/Dialogs.C +++ b/src/frontends/kde/Dialogs.C @@ -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. diff --git a/src/frontends/xforms/Dialogs.C b/src/frontends/xforms/Dialogs.C index 26b63a4008..8cb2fd407a 100644 --- a/src/frontends/xforms/Dialogs.C +++ b/src/frontends/xforms/Dialogs.C @@ -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" @@ -16,9 +17,10 @@ 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 index 0000000000..d730b412b7 --- /dev/null +++ b/src/frontends/xforms/FormGraphics.C @@ -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 +#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(form->u_vdata); + pre->hide(); + return FL_CANCEL; +} + + +void FormGraphics::OKCB(FL_OBJECT * ob, long) +{ + FormGraphics * pre = static_cast(ob->form->u_vdata); + pre->apply(); + pre->hide(); +} + +void FormGraphics::ApplyCB(FL_OBJECT * ob, long) +{ + FormGraphics * pre = static_cast(ob->form->u_vdata); + pre->apply(); +} + +void FormGraphics::CancelCB(FL_OBJECT * ob, long) +{ + FormGraphics * pre = static_cast(ob->form->u_vdata); + pre->hide(); +} + +void FormGraphics::BrowseCB(FL_OBJECT * ob, long) +{ + FormGraphics * pre = static_cast(ob->form->u_vdata); + pre->browse(); +} + +void FormGraphics::AdvancedOptionsCB(FL_OBJECT * /* ob */, long) +{ +// FormGraphics * pre = static_cast(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(ob->form->u_vdata); + pre->input(); +} diff --git a/src/frontends/xforms/FormGraphics.h b/src/frontends/xforms/FormGraphics.h new file mode 100644 index 0000000000..b2642cc129 --- /dev/null +++ b/src/frontends/xforms/FormGraphics.h @@ -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 +#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 + + diff --git a/src/frontends/xforms/FormTabular.C b/src/frontends/xforms/FormTabular.C index 5575f86086..574fa10999 100644 --- a/src/frontends/xforms/FormTabular.C +++ b/src/frontends/xforms/FormTabular.C @@ -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) { diff --git a/src/frontends/xforms/Makefile.am b/src/frontends/xforms/Makefile.am index 594dfd35b1..0edb0bda5c 100644 --- a/src/frontends/xforms/Makefile.am +++ b/src/frontends/xforms/Makefile.am @@ -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 index 0000000000..5e6b9cadc5 --- /dev/null +++ b/src/frontends/xforms/RadioButtonGroup.C @@ -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 +#include "RadioButtonGroup.h" + +#include "debug.h" // for lyxerr + +#include +#include +#include +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 + 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 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(), 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(), + value)); +#else + std::find_if(map.begin(), map.end(), + std::compose1( + std::bind2nd(std::equal_to(), value) + , + std::select2nd() + ) + ); +#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 +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() ); + + // 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 index 0000000000..51b51b25a6 --- /dev/null +++ b/src/frontends/xforms/RadioButtonGroup.h @@ -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 +#include +using std::vector; +using std::pair; + +#include + +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 ButtonValuePair; + typedef vector ButtonValueMap; + ButtonValueMap map; +}; + +#endif diff --git a/src/frontends/xforms/form_graphics.C b/src/frontends/xforms/form_graphics.C new file mode 100644 index 0000000000..281bca8468 --- /dev/null +++ b/src/frontends/xforms/form_graphics.C @@ -0,0 +1,100 @@ +// File modified by fdfix.sh for use by lyx (with xforms >= 0.86) and gettext +#include +#include "lyx_gui_misc.h" +#include "gettext.h" + +/* Form definition file generated with fdesign. */ + +#include FORMS_H_LOCATION +#include +#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 index 0000000000..c33862e4c6 --- /dev/null +++ b/src/frontends/xforms/form_graphics.h @@ -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_ */ diff --git a/src/frontends/xforms/form_tabular.C b/src/frontends/xforms/form_tabular.C index 3d76fea049..e7f86c07dc 100644 --- a/src/frontends/xforms/form_tabular.C +++ b/src/frontends/xforms/form_tabular.C @@ -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; diff --git a/src/frontends/xforms/form_tabular.h b/src/frontends/xforms/form_tabular.h index a0c162adc5..5b582a1316 100644 --- a/src/frontends/xforms/form_tabular.h +++ b/src/frontends/xforms/form_tabular.h @@ -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 index 0000000000..0707cc314a --- /dev/null +++ b/src/frontends/xforms/forms/form_graphics.fd @@ -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 diff --git a/src/frontends/xforms/forms/form_tabular.fd b/src/frontends/xforms/forms/form_tabular.fd index 44558ef941..841ed7d551 100644 --- a/src/frontends/xforms/forms/form_tabular.fd +++ b/src/frontends/xforms/forms/form_tabular.fd @@ -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 diff --git a/src/frontends/xforms/forms/makefile b/src/frontends/xforms/forms/makefile index 5f3281a8cd..018b71d97d 100644 --- a/src/frontends/xforms/forms/makefile +++ b/src/frontends/xforms/forms/makefile @@ -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 index 0000000000..84a0b4fd21 --- /dev/null +++ b/src/graphics/.cvsignore @@ -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 index 0000000000..a52e7291f3 --- /dev/null +++ b/src/graphics/GraphicsCache.C @@ -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 +#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 index 0000000000..881a90d13b --- /dev/null +++ b/src/graphics/GraphicsCache.h @@ -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 + +#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 CacheType; + CacheType cache; +}; + +GraphicsCache * GraphicsCache::singleton = 0; + +#endif diff --git a/src/graphics/GraphicsCacheItem.C b/src/graphics/GraphicsCacheItem.C new file mode 100644 index 0000000000..172c2e33bb --- /dev/null +++ b/src/graphics/GraphicsCacheItem.C @@ -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 +#include "GraphicsCacheItem.h" + diff --git a/src/graphics/GraphicsCacheItem.h b/src/graphics/GraphicsCacheItem.h new file mode 100644 index 0000000000..da347f3d02 --- /dev/null +++ b/src/graphics/GraphicsCacheItem.h @@ -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 index 0000000000..b54aa9d4b1 --- /dev/null +++ b/src/graphics/Makefile.am @@ -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 index 774f44f1ac..0000000000 --- a/src/graphics/README +++ /dev/null @@ -1 +0,0 @@ -Placeholder for this dir. diff --git a/src/insets/Makefile.am b/src/insets/Makefile.am index 6eb6dc2ff4..c870e42882 100644 --- a/src/insets/Makefile.am +++ b/src/insets/Makefile.am @@ -39,6 +39,8 @@ libinsets_la_SOURCES = \ insetfoot.h \ insetfootlike.C \ insetfootlike.h \ + insetgraphicsParams.h \ + insetgraphicsParams.C \ insetgraphics.C \ insetgraphics.h \ insetinclude.C \ diff --git a/src/insets/insetgraphics.C b/src/insets/insetgraphics.C index bfcc2088c2..9955ca95e8 100644 --- a/src/insets/insetgraphics.C +++ b/src/insets/insetgraphics.C @@ -3,11 +3,149 @@ * * 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 @@ -15,157 +153,83 @@ #include #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 - // - 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 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; +} diff --git a/src/insets/insetgraphics.h b/src/insets/insetgraphics.h index 43fe14c26b..4452599a8c 100644 --- a/src/insets/insetgraphics.h +++ b/src/insets/insetgraphics.h @@ -17,17 +17,26 @@ #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 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 index 0000000000..060735375a --- /dev/null +++ b/src/insets/insetgraphicsParams.C @@ -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 +#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 + resizeTranslator(InsetGraphicsParams::DEFAULT_SIZE, "default"); + +/// This is the translator between the Origin enum and corresponding lyx +/// file strings. +static Translator + originTranslator(InsetGraphicsParams::DEFAULT, "default"); + +/// This is the translator between the Display enum and corresponding lyx +/// file strings. +static Translator + 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 ¶ms) +{ + // Are we assigning the object into itself? + if (this == ¶ms) + 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 index 0000000000..027b385ae4 --- /dev/null +++ b/src/insets/insetgraphicsParams.h @@ -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 +#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 diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 832b8b119d..49af9f3cc5 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -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; diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 3df8f1fd50..91620b3865 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -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; } diff --git a/src/support/Makefile.am b/src/support/Makefile.am index a7a038facc..2bc70a97f7 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -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 index 0000000000..2170d5fa6a --- /dev/null +++ b/src/support/translator.h @@ -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 +#include +#include +#include + +// Functors used in the template. +template +class equal_1st_in_pair { +public: + equal_1st_in_pair(T1 const & value) : value_(value) {} + + typedef std::pair pair_type; + bool operator() (pair_type p) const { + return p.first == value_; + } +private: + T1 const & value_; +}; + +template +class equal_2nd_in_pair { +public: + equal_2nd_in_pair(T2 const & value) : value_(value) {} + + typedef std::pair 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 +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(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(second) + ); + + if (it != map.end()) + return (*it).first; + else { + return default_t1; + } + } + +private: + typedef std::pair MapPair; + typedef std::vector Map; + + Map map; + + const T1 default_t1; + const T2 default_t2; + +}; + +#endif diff --git a/src/tabular.C b/src/tabular.C index 7acb567292..a2bd4a2a1e 100644 --- a/src/tabular.C +++ b/src/tabular.C @@ -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(c); cell_info[i][j].bottom_line = static_cast(d); cell_info[i][j].rotate = static_cast(f); - cell_info[i][j].linebreaks = static_cast(g); + cell_info[i][j].usebox = static_cast(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; diff --git a/src/tabular.h b/src/tabular.h index 4927a9676e..e4dab2652d 100644 --- a/src/tabular.h +++ b/src/tabular.h @@ -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; /// -- 2.39.2