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
This commit is contained in:
Jürgen Vigna 2000-07-31 12:30:10 +00:00
parent 3c3ebc6828
commit f4bad86bda
42 changed files with 3356 additions and 336 deletions

View File

@ -1,3 +1,50 @@
2000-07-31 Juergen Vigna <jug@sad.it>
* src/frontends/xforms/FormTabular.C (local_update): changed
radio_linebreaks to radio_useparbox and added radio_useminipage.
* src/tabular.C: made support for using minipages/parboxes.
* src/bufferlist.C (QwriteAll): small fix for asking for save.
* src/insets/insetgraphics.C (draw): just draw the inset so that the
cursor is visible.
(descent): so the cursor is in the middle.
(width): bit smaller box.
* src/insets/insetgraphics.h: added display() function.
2000-07-31 Baruch Even <baruch.even@writeme.com>
* src/frontends/Dialogs.h: Added showGraphics signals.
* src/frontends/xforms/forms/form_graphics.fd: Added file, the xforms
form definition of the graphics dialog.
* src/frontends/xforms/FormGraphics.h:
* src/frontends/xforms/FormGraphics.C: Added files, the GUIndependent
code of InsetGraphics
* src/insets/insetgraphics.h:
* src/insets/insetgraphics.C: Major writing to make it work.
* src/insets/insetgraphicsParams.h:
* src/insets/insetgraphicsParams.C: Added files, parameter passing struct
between InsetGraphics and GUI.
* src/LaTeXFeatures.h:
* src/LaTeXFeatures.C (c-tor, require, getPackages):
Enabled support for graphicx package.
* src/buffer.C (parseSingleLyXformat2Token):
Fixed read support for the graphics inset.
* src/support/translator.h: Added file, used in InsetGraphicsParams. this is a template to translate between two types.
* src/frontends/xforms/RadioButtonGroup.h:
* src/frontends/xforms/RadioButtonGroup.C: Added files, Comprise a way to
easily control a radio button group.
2000-07-28 Juergen Vigna <jug@sad.it>
* src/insets/insettabular.C (LocalDispatch):

View File

@ -272,6 +272,7 @@ AC_OUTPUT([Makefile \
po/Makefile.in \
src/Makefile \
src/mathed/Makefile \
src/graphics/Makefile \
src/insets/Makefile \
src/support/Makefile \
src/xtl/Makefile \

View File

@ -31,6 +31,8 @@ src/frontends/xforms/FormCitation.C
src/frontends/xforms/form_citation.C
src/frontends/xforms/FormCopyright.C
src/frontends/xforms/form_copyright.C
src/frontends/xforms/FormGraphics.C
src/frontends/xforms/form_graphics.C
src/frontends/xforms/FormPreferences.C
src/frontends/xforms/form_preferences.C
src/frontends/xforms/FormPrint.C
@ -40,6 +42,7 @@ src/frontends/xforms/forms/form_copyright.C
src/frontends/xforms/forms/form_preferences.C
src/frontends/xforms/forms/form_print.C
src/frontends/xforms/forms/form_tabular.C
src/frontends/xforms/forms/form_url.C
src/frontends/xforms/FormTabular.C
src/frontends/xforms/form_tabular.C
src/frontends/xforms/FormUrl.C

View File

@ -31,7 +31,8 @@ LaTeXFeatures::LaTeXFeatures(BufferParams const & p, int n)
// packages
array = false;
color = false;
graphics = false;
graphics = false; // INSET_GRAPHICS: remove this when InsetFig is thrown.
graphicx = false;
setspace = false;
makeidx = false;
verbatim = false;
@ -79,11 +80,8 @@ void LaTeXFeatures::require(string const & name) {
} else if (name == "color") {
color = true;
} else if (name == "graphics") {
#ifdef USE_GRAPHICX
graphicx = true;
#else
graphics = true;
#endif
graphics = true;// INSET_GRAPHICS: remove this when InsetFig is thrown.
} else if (name == "setspace") {
setspace = true;
} else if (name == "makeidx") {
@ -151,6 +149,16 @@ string LaTeXFeatures::getPackages()
packages += "\\makeindex\n";
}
// graphicx.sty
if (graphicx && params.graphicsDriver != "none") {
if (params.graphicsDriver == "default")
packages += "\\usepackage{graphicx}\n";
else
packages += "\\usepackage["
+ params.graphicsDriver + "]{graphicx}\n";
}
// INSET_GRAPHICS: remove this when InsetFig is thrown.
// graphics.sty
if (graphics && params.graphicsDriver != "none") {
if (params.graphicsDriver == "default")

View File

@ -58,13 +58,10 @@ struct LaTeXFeatures {
bool array;
///
bool color; // color.sty
#ifdef USE_GRAPHICX
///
bool graphicx; // graphicx.sty
#else
///
bool graphics; // graphics.sty
#endif
///
bool setspace; // setspace.sty
///

View File

@ -1,5 +1,5 @@
AUTOMAKE_OPTIONS = foreign
SUBDIRS = mathed insets support frontends
SUBDIRS = mathed insets graphics support frontends
DISTCLEANFILES= *.orig *.rej *~ *.bak core libintl.h config.h
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in $(srcdir)/config.h.in
bin_PROGRAMS = lyx
@ -8,6 +8,7 @@ bin_PROGRAMS = lyx
## free to provide another solution... Maybe signals would solve that
## magically, but I do not understand them much (JMarc)
lyx_DEPENDENCIES = mathed/libmathed.la insets/libinsets.la \
graphics/libgraphics.la \
frontends/libfrontends.la @FRONTEND_GUILIB@ \
frontends/libfrontends.la support/libsupport.la @INCLUDED_SIGC@
lyx_LDADD = $(lyx_DEPENDENCIES) @INTLLIBS@ $(LYX_LIBS) $(SIGC_LIBS) \

View File

@ -948,10 +948,11 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
inset->Read(this, lex);
par->InsertInset(pos, inset, font);
++pos;
} else if (tmptok == "GRAPHICS") {
} else if (tmptok == "Graphics") {
Inset * inset = new InsetGraphics;
//inset->Read(this, lex);
inset->Read(this, lex);
par->InsertInset(pos, inset, font);
++pos;
} else if (tmptok == "LatexCommand") {
InsetCommand inscmd;
inscmd.Read(this, lex);
@ -3563,7 +3564,7 @@ int Buffer::runLiterate()
users->owner()->getMiniBuffer()->Set(_("Running Literate..."));
// Remove all error insets
bool a = users->removeAutoInsets();
bool removedErrorInsets = users->removeAutoInsets();
// generate the Literate file if necessary
makeLaTeXFile(lit_name, org_path, false);
@ -3596,7 +3597,7 @@ int Buffer::runLiterate()
// if we removed error insets before we ran LaTeX or if we inserted
// error insets after we ran LaTeX this must be run:
if (a || (res & Literate::ERRORS)){
if (removedErrorInsets || (res & Literate::ERRORS)){
users->redraw();
users->fitCursor();
//users->updateScrollbar();
@ -3630,10 +3631,10 @@ int Buffer::buildProgram()
users->owner()->getMiniBuffer()->Set(_("Building Program..."));
// Remove all error insets
bool a = users->removeAutoInsets();
bool removedErrorInsets = users->removeAutoInsets();
// generate the LaTeX file if necessary
if (!isNwClean() || a) {
if (!isNwClean() || removedErrorInsets) {
makeLaTeXFile(lit_name, org_path, false);
markNwDirty();
}
@ -3667,7 +3668,7 @@ int Buffer::buildProgram()
// if we removed error insets before we ran Literate/Build or
// if we inserted error insets after we ran Literate/Build this
// must be run:
if (a || (res & Literate::ERRORS)){
if (removedErrorInsets || (res & Literate::ERRORS)){
users->redraw();
users->fitCursor();
//users->updateScrollbar();

View File

@ -111,8 +111,10 @@ bool BufferList::QwriteAll()
case 1: // Yes
if ((*it)->isUnnamed())
reask = !MenuWriteAs((*it));
else
else {
MenuWrite((*it));
reask = false;
}
break;
case 2: // No
askMoreConfirmation = true;

View File

@ -29,6 +29,7 @@ class DialogBase;
// Maybe this should be a UIFunc modelled on LyXFunc
class LyXView;
class InsetGraphics;
class InsetBibKey;
class InsetBibtex;
class InsetCitation;
@ -105,6 +106,8 @@ public:
///
Signal0<void> showPreferences;
///
Signal1<void, InsetGraphics *> showGraphics;
///
Signal1<void, InsetInclude *> showInclude;
///
Signal1<void, InsetIndex *> showIndex;

View File

@ -9,9 +9,9 @@
#endif
Dialogs::Dialogs(LyXFunc * lf)
Dialogs::Dialogs(LyXView * lv)
{
dialogs_.push_back(new FormCopyright(lf, this));
dialogs_.push_back(new FormCopyright(lv, this));
// reduce the number of connections needed in
// dialogs by a simple connection here.

View File

@ -2,9 +2,10 @@
#include FORMS_H_LOCATION
#include "Dialogs.h"
#include "FormCitation.h"
#include "FormCopyright.h"
#include "FormPreferences.h"
#include "FormGraphics.h"
#include "FormCitation.h"
#include "FormPrint.h"
#include "FormTabular.h"
#include "FormUrl.h"
@ -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));

View File

@ -0,0 +1,514 @@
/* FormGraphics.C
* FormGraphics Interface Class Implementation
*/
/* TODO:
* * Handle the case when the buffer is read-only.
* Initial work is done, if we are read-only the ok/cancel are
* disabled. Probably we need to find a better way to deal with it.
*
*/
#ifdef __GNUG__
#pragma implementation
#endif
#include <config.h>
#include "lyx_gui_misc.h"
#include "gettext.h"
#include FORMS_H_LOCATION
#include "xform_macros.h"
#include "input_validators.h"
#include "FormGraphics.h"
#include "form_graphics.h"
#include "Dialogs.h"
#include "LyXView.h"
#include "BufferView.h"
#include "debug.h" // for lyxerr
#include "support/lstrings.h" // for strToDbl & tostr
#include "support/FileInfo.h" // for FileInfo
#include "filedlg.h" // for LyXFileDlg
#include "support/filetools.h" // for AddName
#include "insets/insetgraphics.h"
#include "insets/insetgraphicsParams.h"
#include "RadioButtonGroup.h"
#ifdef ENABLE_ASSERTIONS
#include "support/LAssert.h"
#endif
C_RETURNCB(FormGraphics, WMHideCB)
C_GENERICCB(FormGraphics, OKCB)
C_GENERICCB(FormGraphics, ApplyCB)
C_GENERICCB(FormGraphics, CancelCB)
C_GENERICCB(FormGraphics, BrowseCB)
C_GENERICCB(FormGraphics, AdvancedOptionsCB)
C_GENERICCB(FormGraphics, InputCB)
FormGraphics::FormGraphics(LyXView * lv, Dialogs * d)
: dialog_(0), lv_(lv), d_(d), inset_(0),
// The buttons c-tor values are the number of buttons we use
// This is only to reduce memory waste.
widthButtons(5), heightButtons(4), displayButtons(4),
ih_(0), h_(0), u_(0),
last_image_path(".")
{
// let the dialog be shown
// This is a permanent connection so we won't bother
// storing a copy because we won't be disconnecting.
d->showGraphics.connect(slot(this, &FormGraphics::showDialog));
}
FormGraphics::~FormGraphics()
{
free();
}
void FormGraphics::build()
{
dialog_ = build_graphics();
#ifdef ENABLE_ASSERTIONS
Assert(dialog_ != 0);
#endif
if (!dialog_)
return;
// This is the place to add settings of the dialog that did not go
// to the .fd file.
// Set the input widgets to issue a callback to input() whenever
// they change, so we can verify their content.
fl_set_input_return(dialog_->input_width,
FL_RETURN_CHANGED);
fl_set_input_return(dialog_->input_height,
FL_RETURN_CHANGED);
fl_set_input_return(dialog_->input_filename,
FL_RETURN_CHANGED);
// fl_set_input_return(dialog_->input_rotate_angle,
// FL_RETURN_CHANGED);
// Set the maximum characters that can be written in the input texts.
fl_set_input_maxchars(dialog_->input_width, WIDTH_MAXDIGITS);
fl_set_input_maxchars(dialog_->input_height, HEIGHT_MAXDIGITS);
fl_set_input_maxchars(dialog_->input_filename, FILENAME_MAXCHARS);
fl_set_input_maxchars(dialog_->input_rotate_angle, ROTATE_MAXCHARS);
// Set input filter on width and height to make them accept only
// unsigned numbers.
fl_set_input_filter(dialog_->input_width,
fl_unsigned_int_filter);
fl_set_input_filter(dialog_->input_height,
fl_unsigned_int_filter);
// Add the widgets of the width radio buttons to their group
widthButtons.reset();
widthButtons.registerRadioButton(dialog_->radio_width_default,
InsetGraphicsParams::DEFAULT_SIZE);
widthButtons.registerRadioButton(dialog_->radio_width_cm,
InsetGraphicsParams::CM);
widthButtons.registerRadioButton(dialog_->radio_width_inch,
InsetGraphicsParams::INCH);
widthButtons.registerRadioButton(dialog_->radio_width_percent_page,
InsetGraphicsParams::PERCENT_PAGE);
widthButtons.registerRadioButton(dialog_->radio_width_percent_column,
InsetGraphicsParams::PERCENT_COLUMN);
// Add the widgets of the height radio buttons to their group
heightButtons.reset();
heightButtons.registerRadioButton(dialog_->radio_height_default,
InsetGraphicsParams::DEFAULT_SIZE);
heightButtons.registerRadioButton(dialog_->radio_height_cm,
InsetGraphicsParams::CM);
heightButtons.registerRadioButton(dialog_->radio_height_inch,
InsetGraphicsParams::INCH);
heightButtons.registerRadioButton(dialog_->radio_height_percent_page,
InsetGraphicsParams::PERCENT_PAGE);
// Add the widgets of the display radio buttons to their group
displayButtons.reset();
displayButtons.registerRadioButton(dialog_->radio_display_color,
InsetGraphicsParams::COLOR);
displayButtons.registerRadioButton(dialog_->radio_display_grayscale,
InsetGraphicsParams::GRAYSCALE);
displayButtons.registerRadioButton(dialog_->radio_display_monochrome,
InsetGraphicsParams::MONOCHROME);
displayButtons.registerRadioButton(dialog_->radio_no_display,
InsetGraphicsParams::NONE);
// Connect a signal to hide the window when the window manager orders it.
fl_set_form_atclose(dialog_->form_graphics,
C_FormGraphicsWMHideCB, 0);
}
void FormGraphics::show()
{
// If the dialog doesn't exist yet, build it.
if (!dialog_) {
build();
}
// Update the form with the data from the inset.
update();
// If the form is visible
if (dialog_->form_graphics->visible) {
// Raise it.
fl_raise_form(dialog_->form_graphics);
} else {
// Otherwise (invisible), show it.
fl_show_form(dialog_->form_graphics,
FL_PLACE_MOUSE,
FL_FULLBORDER,
_("Graphics"));
// And connect the signals 'updateBufferDependent',
// 'hideBufferDependent' and 'hideGraphics'.
u_ = d_->updateBufferDependent.connect(slot(this,
&FormGraphics::update));
h_ = d_->hideBufferDependent.connect(slot(this,
&FormGraphics::hide));
}
}
void FormGraphics::showDialog(InsetGraphics* inset)
{
#ifdef ENABLE_ASSERTIONS
Assert(inset != 0);
#endif
// If we are connected to another inset, disconnect.
if (inset_)
ih_.disconnect();
inset_ = inset;
if (inset_) {
ih_ = inset_->hide.connect(slot(this, &FormGraphics::hide));
show();
}
}
void FormGraphics::hide()
{
// If the dialog exists, and the form is allocated and visible.
if (dialog_
&& dialog_->form_graphics
&& dialog_->form_graphics->visible) {
// Hide the form
fl_hide_form(dialog_->form_graphics);
// And disconnect the signals.
u_.disconnect();
h_.disconnect();
ih_.disconnect();
// Forget the inset.
inset_ = 0;
}
// Most of the time, the dialog is not needed anymore, we'll free it
// now to save memory.
free();
}
void FormGraphics::free()
{
// hide() will disconnect the signals so we need not worry about them.
if (dialog_) {
if (dialog_->form_graphics) {
// If the dialog is visible, hide it.
if (dialog_->form_graphics->visible) {
hide();
}
// Remove all associations for the radio buttons
widthButtons.reset();
heightButtons.reset();
displayButtons.reset();
// Free the form.
fl_free_form(dialog_->form_graphics);
}
delete dialog_;
dialog_ = 0;
}
}
void FormGraphics::apply()
{
#ifdef ENABLE_ASSERTIONS
Assert(inset_ != 0);
#endif
if (! inset_)
return;
// Take all dialog details and insert them to the inset.
// Create the parameters structure and fill the data from the dialog.
InsetGraphicsParams igp;
igp.filename = fl_get_input(dialog_->input_filename);
igp.display = displayButtons.getButton();
igp.widthResize = widthButtons.getButton();
igp.widthSize = strToDbl(fl_get_input(dialog_->input_width));
igp.heightResize = heightButtons.getButton();
igp.heightSize = strToDbl(fl_get_input(dialog_->input_height));
igp.rotateAngle = strToInt(fl_get_input(dialog_->input_rotate_angle));
if (igp.rotateAngle >= 360)
igp.rotateAngle = igp.rotateAngle % 360;
if (igp.rotateAngle <= -360)
igp.rotateAngle = - ((-igp.rotateAngle) % 360);
igp.subcaption = fl_get_button(dialog_->check_subcaption);
igp.subcaptionText = fl_get_input(dialog_->input_subcaption);
igp.inlineFigure = fl_get_button(dialog_->check_inline);
#ifdef ENABLE_ASSERTIONS
igp.testInvariant();
#endif
// Set the parameters in the inset, it also returns true if the new
// parameters are different from what was in the inset already.
bool changed = inset_->setParams(igp);
// Tell LyX we've got a change, and mark the document dirty, if it changed.
lv_->view()->updateInset(inset_, changed);
}
void FormGraphics::update()
{
#ifdef ENABLE_ASSERTIONS
Assert(inset_ != 0);
#endif
if (! inset_)
return;
// Update dialog with details from inset
InsetGraphicsParams igp = inset_->getParams();
// Update the filename input field
fl_set_input(dialog_->input_filename,
igp.filename.c_str());
// Update the display depth radio buttons
displayButtons.setButton(igp.display);
// Update the width radio buttons and input field
widthButtons.setButton(igp.widthResize);
fl_set_input(dialog_->input_width,
tostr(igp.widthSize).c_str());
// Update the height radio buttons and input field
heightButtons.setButton(igp.heightResize);
fl_set_input(dialog_->input_height,
tostr(igp.heightSize).c_str());
// Update the rotate angle
fl_set_input(dialog_->input_rotate_angle,
tostr(igp.rotateAngle).c_str());
// Update the subcaption check button and input field
fl_set_button(dialog_->check_subcaption,
igp.subcaption);
fl_set_input(dialog_->input_subcaption,
igp.subcaptionText.c_str());
// Update the inline figure check button
fl_set_button(dialog_->check_inline,
igp.inlineFigure);
// Now make sure that the buttons are set correctly.
input();
}
void FormGraphics::input()
{
// Put verifications that the dialog shows some sane values,
// if not disallow clicking on ok/apply.
// Possibly use a label in the bottom of the dialog to give the reason.
// Is all input boxes convey a valid meaning?
bool inputOK = true;
// Things that we check (meaning they are incorrect states):
// 1. No filename specified.
// 2. Width radio button is not Default and width text is not a number.
// 3. Height radio button is not Default and height text is a not a number
// Note: radio button default means that the user asks for the image
// to be included as is with no size change, in this case we don't need
// any width or height.
// We verify now that there is a filename, it exists, it's a file
// and it's readable.
string filename = fl_get_input(dialog_->input_filename);
FileInfo file(filename);
if (filename.empty()
|| !file.isOK()
|| !file.exist()
|| !file.isRegular()
|| !file.readable()
)
inputOK = false;
// Width radio button not default and no number.
if (!fl_get_button(dialog_->radio_width_default)
&& strToDbl(fl_get_input(dialog_->input_width)) <= 0.0) {
inputOK = false;
}
// Height radio button not default and no number.
if (!fl_get_button(dialog_->radio_height_default)
&& strToDbl(fl_get_input(dialog_->input_height)) <= 0.0) {
inputOK = false;
}
// Now set the buttons to the correct state.
if (inputOK && ! lv_->buffer()->isReadonly()) {
fl_activate_object(dialog_->button_ok);
fl_activate_object(dialog_->button_apply);
fl_set_object_lcol(dialog_->button_ok, FL_BLACK);
fl_set_object_lcol(dialog_->button_apply, FL_BLACK);
} else {
fl_deactivate_object(dialog_->button_ok);
fl_deactivate_object(dialog_->button_apply);
fl_set_object_lcol(dialog_->button_ok, FL_INACTIVE);
fl_set_object_lcol(dialog_->button_apply, FL_INACTIVE);
}
}
// We need these in the file browser.
extern string system_lyxdir;
extern string user_lyxdir;
//extern string system_tempdir;
// Need to move this to the form_graphics
string FormGraphics::browseFile(string const & filename)
{
if (! filename.empty() )
last_image_path = OnlyPath(filename);
// Does user clipart directory exist?
string bufclip = AddName (user_lyxdir, "clipart");
FileInfo fileInfo(bufclip);
if (!(fileInfo.isOK() && fileInfo.isDir()))
// No - bail out to system clipart directory
bufclip = AddName (system_lyxdir, "clipart");
LyXFileDlg fileDlg;
fileDlg.SetButton(0, _("Clipart"), bufclip);
bool error = false;
string buf;
do {
string p = fileDlg.Select(_("Graphics"),
last_image_path,
"*(ps|png)", filename);
if (p.empty()) return p;
last_image_path = OnlyPath(p);
if (p.find_first_of("#~$% ") != string::npos) {
WriteAlert(_("Filename can't contain any "
"of these characters:"),
// xgettext:no-c-format
_("space, '#', '~', '$' or '%'."));
error = true;
} else {
error = false;
buf = p;
}
} while (error);
return buf;
}
void FormGraphics::browse()
{
// Get the filename from the dialog
string filename = fl_get_input(dialog_->input_filename);
// Show the file browser dialog
string new_filename = browseFile(filename);
// Save the filename to the dialog
if (new_filename != filename && ! new_filename.empty()) {
fl_set_input(dialog_->input_filename,
new_filename.c_str());
// The above set input doesn't cause an input event so we do
// it manually. Otherwise the user needs to cause an input event
// to get the ok/apply buttons to be activated.
input();
}
}
int FormGraphics::WMHideCB(FL_FORM * form, void *)
{
// Ensure that the signal h is disconnected even if the
// window manager is used to close the dialog.
FormGraphics * pre = static_cast<FormGraphics*>(form->u_vdata);
pre->hide();
return FL_CANCEL;
}
void FormGraphics::OKCB(FL_OBJECT * ob, long)
{
FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
pre->apply();
pre->hide();
}
void FormGraphics::ApplyCB(FL_OBJECT * ob, long)
{
FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
pre->apply();
}
void FormGraphics::CancelCB(FL_OBJECT * ob, long)
{
FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
pre->hide();
}
void FormGraphics::BrowseCB(FL_OBJECT * ob, long)
{
FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
pre->browse();
}
void FormGraphics::AdvancedOptionsCB(FL_OBJECT * /* ob */, long)
{
// FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
// pre->showAdvancedOptions();
lyxerr << "Advanced Options button depressed, "
"show advanced options dialog"
<< endl;
}
void FormGraphics::InputCB(FL_OBJECT * ob, long)
{
FormGraphics * pre = static_cast<FormGraphics*>(ob->form->u_vdata);
pre->input();
}

View File

@ -0,0 +1,145 @@
// -*- C++ -*-
/* FormGraphics.h
* FormGraphics Interface Class
*
* This file is part of
* ======================================================
*
* LyX, The Document Processor
*
* Copyright 1995 Matthias Ettrich
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000
* Baruch Even
* ======================================================
*/
#ifndef FORMGRAPHICS_H
#define FORMGRAPHICS_H
#include <config.h>
#include "LString.h"
#include "frontends/DialogBase.h"
//#include "form_graphics.h"
#include "RadioButtonGroup.h"
#ifdef __GNUG__
#pragma interface
#endif
class Dialogs;
// same arguement as in Dialogs.h s/LyX/UI/
class LyXView;
class InsetGraphics;
struct FD_form_graphics;
/** This class provides an XForms implementation of the FormGraphics Dialog.
*/
class FormGraphics: public DialogBase {
public:
/**@name Constructors and Destructors */
//@{
/// #FormGraphics x(LyXFunc ..., Dialogs ...);#
FormGraphics(LyXView *, Dialogs *);
///
~FormGraphics();
//@}
/**@name Real per-instance Callback Methods */
//@{
static int WMHideCB(FL_FORM *, void *);
static void OKCB(FL_OBJECT *, long);
static void ApplyCB(FL_OBJECT *, long);
static void CancelCB(FL_OBJECT *, long);
static void BrowseCB(FL_OBJECT *, long);
static void AdvancedOptionsCB(FL_OBJECT *, long);
static void InputCB(FL_OBJECT *, long);
//@}
private:
FormGraphics() : widthButtons(5), heightButtons(4), displayButtons(4) {}
FormGraphics(FormGraphics &) : DialogBase() {}
/**@name Define enum constants */
//@{
/// The maximum digits for the image width (cm, inch, percent)
enum { WIDTH_MAXDIGITS = 3 };
/// The maximum digits for the image height (cm, inch, percent)
enum { HEIGHT_MAXDIGITS = 3 };
/// The maximum characters in the rotation angle (minus sign and 3 digits)
enum { ROTATE_MAXCHARS = 4 };
/// The maximum characters in a filename.
enum { FILENAME_MAXCHARS = 1024 };
//@}
/**@name Slot Methods */
//@{
/// Save the active inset and show the dialog.
void showDialog(InsetGraphics * inset);
/// Create the dialog if necessary, update it and display it.
void show();
/// Hide the dialog.
void hide();
/// Update the dialog
void update();
//@}
/**@name Callback methods */
//@{
/// Apply the changes to the inset.
void apply();
/// Verify that the input is correct. If not disable ok/apply buttons.
void input();
/// Open the file browse dialog to select an image file.
void browse();
/// Build the dialog
//@}
void build();
///
FD_form_graphics * build_graphics();
/// Explicitly free the dialog.
void free();
/// Display a file browser dialog and return the file chosen.
string browseFile(string const & filename);
/**@name Private Data */
//@{
/// Real GUI implementation.
FD_form_graphics * dialog_;
/** Which LyXFunc do we use?
We could modify Dialogs to have a visible LyXFunc* instead and
save a couple of bytes per dialog.
*/
LyXView * lv_;
/** Which Dialogs do we belong to?
Used so we can get at the signals we have to connect to.
*/
Dialogs * d_;
/** Which Inset do we belong to?
* Used to set and update data to/from the inset.
*/
InsetGraphics * inset_;
/// The radio buttons groups
RadioButtonGroup widthButtons;
RadioButtonGroup heightButtons;
RadioButtonGroup displayButtons;
/// Inset Hide connection, connected to the calling inset hide signal.
Connection ih_;
/// Hide connection.
Connection h_;
/// Update connection.
Connection u_;
/// Last used figure path
string last_image_path;
//@}
};
#endif

View File

@ -407,14 +407,27 @@ bool FormTabular::local_update(bool)
fl_activate_object(column_options_->input_column_width);
}
if (!pwidth.empty()) {
fl_activate_object(cell_options_->radio_linebreak_cell);
fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_BLACK);
fl_set_button(cell_options_->radio_linebreak_cell,
tabular->GetLinebreaks(cell));
fl_activate_object(cell_options_->radio_useparbox);
fl_activate_object(cell_options_->radio_useminipage);
fl_set_object_lcol(cell_options_->radio_useparbox, FL_BLACK);
fl_set_object_lcol(cell_options_->radio_useminipage, FL_BLACK);
fl_set_button(cell_options_->radio_useparbox, 0);
fl_set_button(cell_options_->radio_useminipage, 0);
switch (tabular->GetUsebox(cell)) {
case 1:
fl_set_button(cell_options_->radio_useparbox, 1);
break;
case 2:
fl_set_button(cell_options_->radio_useminipage, 1);
break;
}
} else {
fl_deactivate_object(cell_options_->radio_linebreak_cell);
fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_INACTIVE);
fl_set_button(cell_options_->radio_linebreak_cell,0);
fl_deactivate_object(cell_options_->radio_useparbox);
fl_set_object_lcol(cell_options_->radio_useparbox, FL_INACTIVE);
fl_set_button(cell_options_->radio_useparbox,0);
fl_deactivate_object(cell_options_->radio_useminipage);
fl_set_object_lcol(cell_options_->radio_useminipage, FL_INACTIVE);
fl_set_button(cell_options_->radio_useminipage,0);
}
align = tabular->GetAlignment(cell, true);
fl_set_button(column_options_->radio_align_left, 0);
@ -661,8 +674,12 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
num = LyXTabular::SET_ROTATE_CELL;
else
num = LyXTabular::UNSET_ROTATE_CELL;
} else if (ob == cell_options_->radio_linebreak_cell) {
num = LyXTabular::SET_LINEBREAKS;
} else if (ob == cell_options_->radio_useparbox) {
num = LyXTabular::SET_USEBOX;
special = "1";
} else if (ob == cell_options_->radio_useminipage) {
num = LyXTabular::SET_USEBOX;
special = "2";
} else if (ob == longtable_options_->radio_lt_firsthead) {
num = LyXTabular::SET_LTFIRSTHEAD;
} else if (ob == longtable_options_->radio_lt_head) {

View File

@ -19,6 +19,10 @@ libxforms_la_SOURCES = \
FormCopyright.h \
form_copyright.C \
form_copyright.h \
FormGraphics.C \
FormGraphics.h \
form_graphics.C \
form_graphics.h \
FormPreferences.C \
FormPreferences.h \
form_preferences.C \
@ -35,12 +39,14 @@ libxforms_la_SOURCES = \
FormUrl.h \
form_url.C \
form_url.h \
Toolbar_pimpl.C \
Toolbar_pimpl.h \
Menubar_pimpl.C \
Menubar_pimpl.h \
input_validators.h \
input_validators.c \
Menubar_pimpl.C \
Menubar_pimpl.h \
RadioButtonGroup.C \
RadioButtonGroup.h \
Toolbar_pimpl.C \
Toolbar_pimpl.h \
xform_macros.h
# These still have to be added. Sooner or later. ARRae-20000411

View File

@ -0,0 +1,150 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifdef __GNUG__
#pragma implementation
#endif
#include <config.h>
#include "RadioButtonGroup.h"
#include "debug.h" // for lyxerr
#include <functional>
#include <algorithm>
#include <iterator>
using std::find_if;
void RadioButtonGroup::registerRadioButton(FL_OBJECT *button, int value)
{
#if 0
bvec.push_back(button);
vvec.push_back(value);
#endif
map.push_back( ButtonValuePair(button, value) );
}
void RadioButtonGroup::reset()
{
#if 0
bvec.clear();
vvec.clear();
#endif
map.clear();
}
// Functor to help us in our work, we should try to find how to achieve
// this with only STL predicates, but its easier to write this than to
// dig. If you can find the equivalent STL predicate combination, let me
// know.
//
// The idea is to take a pair and a value and return true when the second
// element in the pair equals the value.
template <typename T>
struct equal_to_second_in_pair {
typedef bool result_type;
typedef T first_argument_type;
typedef typename T::second_type second_argument_type;
bool operator() (
pair<typename T::first_type, typename T::second_type> const & left,
typename T::second_type const & right) const
{
return left.second == right;
}
};
void RadioButtonGroup::setButton(int value)
{
#if 0
ValueVector::iterator vit =
find_if(vvec.begin(), vvec.end(),
bind2nd(equal_to<int>(), value));
if (vit == vvec.end()) {
lyxerr << "BUG: Requested value in RadioButtonGroup doesn't exists"
<< endl;
return;
}
unsigned n = std::distance(vvec.begin(), vit);
fl_set_button(bvec[n], 1);
#endif
ButtonValueMap::const_iterator it =
#if 0
find_if(map.begin(), map.end(),
bind2nd(equal_to_second_in_pair<ButtonValuePair>(),
value));
#else
std::find_if(map.begin(), map.end(),
std::compose1(
std::bind2nd(std::equal_to<int>(), value)
,
std::select2nd<ButtonValuePair>()
)
);
#endif
// If we found nothing, report it and return
if (it == map.end()) {
lyxerr << "BUG: Requested value in RadioButtonGroup doesn't exists"
<< endl;
} else {
fl_set_button((*it).first, 1);
}
}
template<typename T>
struct is_set_button {
bool operator() (T const & item) const
{
return fl_get_button( (item).first );
}
};
int RadioButtonGroup::getButton()
{
#if 0
ButtonVector::const_iterator bit = bvec.begin();
ValueVector::const_iterator vit = vvec.begin();
while (bit != bvec.end()) {
if (fl_get_button(*bit))
return *vit;
bit++;
vit++;
}
return 0;
#endif
// Find the first button that is active
ButtonValueMap::iterator it =
find_if(map.begin(), map.end(),
is_set_button<ButtonValuePair>() );
// If such a button was found, return its value.
if (it != map.end()) {
return (*it).second;
}
lyxerr << "BUG: No radio button found to be active." << endl;
// Else return 0.
return 0;
}

View File

@ -0,0 +1,58 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
/*
* This class simplifies the work with a group of radio buttons,
* the idea is that you register a bunch of radio buttons with the accompanying
* value for each radio button and then you get to query or set the active
* button in a single function call.
*/
#ifndef RADIOBUTTONGROUP_H
#define RADIOBUTTONGROUP_H
#ifdef __GNUG__
#pragma interface
#endif
#include <vector>
#include <pair.h>
using std::vector;
using std::pair;
#include <forms.h>
class RadioButtonGroup {
public:
/// Constructor. Allocate space for 'n' items in the group.
RadioButtonGroup(unsigned n = 5) : map(n)
{};
/// Destructor. Cleans up.
~RadioButtonGroup() {};
/// Register a radio button with it's corresponding value.
void registerRadioButton(FL_OBJECT *button, int value);
/// Reset registrations.
void reset();
// Set the active button.
void setButton(int value);
// Get the active button.
int getButton();
private:
typedef pair<FL_OBJECT *, int> ButtonValuePair;
typedef vector<ButtonValuePair> ButtonValueMap;
ButtonValueMap map;
};
#endif

View File

@ -0,0 +1,100 @@
// File modified by fdfix.sh for use by lyx (with xforms >= 0.86) and gettext
#include <config.h>
#include "lyx_gui_misc.h"
#include "gettext.h"
/* Form definition file generated with fdesign. */
#include FORMS_H_LOCATION
#include <stdlib.h>
#include "form_graphics.h"
#include "FormGraphics.h"
FD_form_graphics * FormGraphics::build_graphics()
{
FL_OBJECT *obj;
FD_form_graphics *fdui = new FD_form_graphics;
fdui->form_graphics = fl_bgn_form(FL_NO_BOX, 410, 390);
fdui->form_graphics->u_vdata = this;
obj = fl_add_box(FL_UP_BOX, 0, 0, 410, 390, "");
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_resize(obj, FL_RESIZE_NONE);
obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 310, 390, 30, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 230, 250, 170, 50, "");
fdui->input_filename = obj = fl_add_input(FL_NORMAL_INPUT, 90, 20, 210, 30, idex(_("Graphics File|F#F")));fl_set_button_shortcut(obj, scex(_("Graphics File|F#F")), 1);
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->button_browse = obj = fl_add_button(FL_NORMAL_BUTTON, 310, 20, 90, 30, idex(_("Browse|B#B")));fl_set_button_shortcut(obj, scex(_("Browse|B#B")), 1);
fl_set_object_callback(obj, C_FormGraphicsBrowseCB, 0);
obj = fl_add_labelframe(FL_ENGRAVED_FRAME, 10, 70, 200, 160, _("Width"));
fl_set_object_lalign(obj, FL_ALIGN_CENTER);
obj = fl_add_text(FL_NORMAL_TEXT, 130, 60, 50, 20, _("Height"));
fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
fdui->input_width = obj = fl_add_input(FL_NORMAL_INPUT, 20, 190, 90, 30, "");
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->input_height = obj = fl_add_input(FL_NORMAL_INPUT, 120, 190, 80, 30, "");
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
obj = fl_add_labelframe(FL_ENGRAVED_FRAME, 230, 70, 170, 160, _("Display"));
fl_set_object_lalign(obj, FL_ALIGN_CENTER);
fdui->button_ok = obj = fl_add_button(FL_RETURN_BUTTON, 10, 350, 70, 30, _("Ok"));
fl_set_object_callback(obj, C_FormGraphicsOKCB, 0);
fdui->button_apply = obj = fl_add_button(FL_NORMAL_BUTTON, 100, 350, 70, 30, idex(_("Apply|A#A")));fl_set_button_shortcut(obj, scex(_("Apply|A#A")), 1);
fl_set_object_callback(obj, C_FormGraphicsApplyCB, 0);
fdui->button_cancel = obj = fl_add_button(FL_NORMAL_BUTTON, 190, 350, 70, 30, idex(_("Cancel|C#C^[")));fl_set_button_shortcut(obj, scex(_("Cancel|C#C^[")), 1);
fl_set_object_callback(obj, C_FormGraphicsCancelCB, 0);
fdui->radio_button_group_width = fl_bgn_group();
fdui->radio_width_percent_page = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 140, 80, 30, _("% of Page"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->radio_width_default = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 80, 80, 30, _("Default"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fl_set_button(obj, 1);
fdui->radio_width_cm = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 100, 80, 30, _("cm"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->radio_width_inch = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 120, 80, 30, _("Inch"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->radio_width_percent_column = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 160, 80, 30, _("% of Column"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fl_end_group();
fdui->radio_button_group_height = fl_bgn_group();
fdui->radio_height_percent_page = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 140, 80, 30, _("% of Page"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->radio_height_inch = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 120, 80, 30, _("Inch"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->radio_height_cm = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 100, 80, 30, _("cm"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->radio_height_default = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 110, 80, 80, 30, _("Default"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fl_set_button(obj, 1);
fl_end_group();
fdui->radio_button_group_display = fl_bgn_group();
fdui->radio_display_monochrome = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 80, 80, 30, _("in Monochrome"));
fl_set_button(obj, 1);
fdui->radio_display_grayscale = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 110, 80, 30, _("in Grayscale"));
fdui->radio_display_color = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 140, 80, 30, _("in Color"));
fdui->radio_no_display = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 250, 170, 80, 30, _("Don't display"));
fl_end_group();
obj = fl_add_labelframe(FL_ENGRAVED_FRAME, 10, 250, 200, 50, _("Rotate"));
fdui->input_rotate_angle = obj = fl_add_input(FL_INT_INPUT, 70, 260, 80, 30, _("Angle"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->check_inline = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 230, 260, 170, 30, _("Inline Figure"));
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->input_subcaption = obj = fl_add_input(FL_NORMAL_INPUT, 120, 310, 280, 30, "");
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fdui->check_subcaption = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 310, 110, 30, idex(_("Subcaption|S#S")));fl_set_button_shortcut(obj, scex(_("Subcaption|S#S")), 1);
fl_set_object_callback(obj, C_FormGraphicsInputCB, 0);
fl_end_form();
fdui->form_graphics->fdui = fdui;
return fdui;
}
/*---------------------------------------*/

View File

@ -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_ */

View File

@ -15,22 +15,22 @@ FD_form_tabular * FormTabular::build_tabular()
FL_OBJECT *obj;
FD_form_tabular *fdui = new FD_form_tabular;
fdui->form_tabular = fl_bgn_form(FL_NO_BOX, 510, 285);
fdui->form_tabular = fl_bgn_form(FL_NO_BOX, 510, 315);
fdui->form_tabular->u_vdata = this;
obj = fl_add_box(FL_FLAT_BOX, 0, 0, 510, 285, "");
fdui->tabFolder = obj = fl_add_tabfolder(FL_TOP_TABFOLDER, 0, 0, 505, 245, _("Tabbed folder"));
obj = fl_add_box(FL_FLAT_BOX, 0, 0, 510, 315, "");
fdui->tabFolder = obj = fl_add_tabfolder(FL_TOP_TABFOLDER, 0, 0, 505, 275, _("Tabbed folder"));
fl_set_object_resize(obj, FL_RESIZE_ALL);
fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 250, 90, 30, idex(_("Close|#C")));
fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 280, 90, 30, idex(_("Close|#C")));
fl_set_button_shortcut(obj, scex(_("Close|#C")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularCloseCB, 0);
fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 64, 250, 60, 30, "");
fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 65, 280, 60, 30, "");
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 250, 60, 30, "");
fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 280, 60, 30, "");
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 250, 290, 30, "");
fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 275, 290, 30, "");
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
fl_set_object_lstyle(obj, FL_BOLD_STYLE);
@ -190,28 +190,28 @@ FD_form_cell_options * FormTabular::build_cell_options()
FL_OBJECT *obj;
FD_form_cell_options *fdui = new FD_form_cell_options;
fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 227);
fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 257);
fdui->form_cell_options->u_vdata = this;
obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 227, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 110, 155, 100, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 110, 180, 100, "");
obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 257, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 145, 155, 100, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 145, 180, 100, "");
fl_set_object_color(obj, FL_COL1, FL_COL1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
obj = fl_add_text(FL_NORMAL_TEXT, 15, 100, 70, 20, _("Borders"));
obj = fl_add_text(FL_NORMAL_TEXT, 15, 135, 70, 20, _("Borders"));
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
fl_set_object_lstyle(obj, FL_BOLD_STYLE);
obj = fl_add_frame(FL_ENGRAVED_FRAME, 195, 110, 130, 100, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 195, 145, 130, 100, "");
fl_set_object_color(obj, FL_COL1, FL_COL1);
obj = fl_add_text(FL_NORMAL_TEXT, 200, 100, 115, 20, _("H. Alignment"));
obj = fl_add_text(FL_NORMAL_TEXT, 200, 135, 115, 20, _("H. Alignment"));
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
fl_set_object_lstyle(obj, FL_BOLD_STYLE);
obj = fl_add_text(FL_NORMAL_TEXT, 345, 100, 115, 20, _("V. Alignment"));
obj = fl_add_text(FL_NORMAL_TEXT, 345, 135, 115, 20, _("V. Alignment"));
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
fl_set_object_lstyle(obj, FL_BOLD_STYLE);
obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 15, 150, 85, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 15, 150, 115, "");
obj = fl_add_text(FL_NORMAL_TEXT, 15, 5, 140, 20, _("Special Cell"));
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
@ -219,12 +219,12 @@ FD_form_cell_options * FormTabular::build_cell_options()
fdui->radio_multicolumn = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 25, 145, 25, idex(_("Multicolumn|#M")));
fl_set_button_shortcut(obj, scex(_("Multicolumn|#M")), 1);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_linebreak_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 50, 145, 25, idex(_("Linebreaks|#N")));
fl_set_button_shortcut(obj, scex(_("Linebreaks|#N")), 1);
fdui->radio_useparbox = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 50, 145, 25, idex(_("Use ParBox|#U")));
fl_set_button_shortcut(obj, scex(_("Use ParBox|#U")), 1);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, _("Rotate 90°"));
fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 100, 145, 25, _("Rotate 90°"));
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 85, "");
obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 115, "");
fl_set_object_color(obj, FL_COL1, FL_COL1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fdui->input_special_multialign = obj = fl_add_input(FL_NORMAL_INPUT, 175, 30, 310, 30, "");
@ -237,50 +237,53 @@ FD_form_cell_options * FormTabular::build_cell_options()
fdui->input_mcolumn_width = obj = fl_add_input(FL_NORMAL_INPUT, 360, 65, 125, 30, _("Width of multi-column:"));
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 135, 25, 25, idex(_("Top|#t")));
fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 170, 25, 25, idex(_("Top|#t")));
fl_set_button_shortcut(obj, scex(_("Top|#t")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_border_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 165, 25, 25, idex(_("Bottom|#b")));
fdui->radio_border_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 200, 25, 25, idex(_("Bottom|#b")));
fl_set_button_shortcut(obj, scex(_("Bottom|#b")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_BOTTOM_LEFT);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_border_left = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 55, 150, 25, 25, idex(_("Left|#l")));
fdui->radio_border_left = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 55, 185, 25, 25, idex(_("Left|#l")));
fl_set_button_shortcut(obj, scex(_("Left|#l")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_LEFT);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_border_right = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 95, 150, 25, 25, idex(_("Right|#r")));
fdui->radio_border_right = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 95, 185, 25, 25, idex(_("Right|#r")));
fl_set_button_shortcut(obj, scex(_("Right|#r")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_lalign(obj, FL_ALIGN_RIGHT);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 120, 110, 25, idex(_("Left|#e")));
fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 155, 110, 25, idex(_("Left|#e")));
fl_set_button_shortcut(obj, scex(_("Left|#e")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 170, 115, 25, idex(_("Right|#i")));
fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 205, 115, 25, idex(_("Right|#i")));
fl_set_button_shortcut(obj, scex(_("Right|#i")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 145, 115, 25, idex(_("Center|#c")));
fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 180, 115, 25, idex(_("Center|#c")));
fl_set_button_shortcut(obj, scex(_("Center|#c")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 120, 140, 25, idex(_("Top|#p")));
fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 155, 140, 25, idex(_("Top|#p")));
fl_set_button_shortcut(obj, scex(_("Top|#p")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 145, 140, 25, idex(_("Center|#n")));
fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 180, 140, 25, idex(_("Center|#n")));
fl_set_button_shortcut(obj, scex(_("Center|#n")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 170, 140, 25, idex(_("Bottom|#o")));
fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 205, 140, 25, idex(_("Bottom|#o")));
fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1);
fl_set_object_lsize(obj, FL_NORMAL_SIZE);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fdui->radio_useminipage = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, idex(_("Use Minipage|#s")));
fl_set_button_shortcut(obj, scex(_("Use Minipage|#s")), 1);
fl_set_object_callback(obj, C_FormTabularInputCB, 0);
fl_end_form();
fdui->form_cell_options->fdui = fdui;

View File

@ -1,4 +1,4 @@
/** Header file generated with fdesign on Fri Jul 28 11:50:11 2000.**/
/** Header file generated with fdesign on Mon Jul 31 12:55:35 2000.**/
#ifndef FD_form_tabular_h_
#define FD_form_tabular_h_
@ -61,7 +61,7 @@ struct FD_form_cell_options {
FL_FORM *form_cell_options;
FL_OBJECT *radio_multicolumn;
FL_OBJECT *radio_linebreak_cell;
FL_OBJECT *radio_useparbox;
FL_OBJECT *radio_rotate_cell;
FL_OBJECT *input_special_multialign;
FL_OBJECT *input_mcolumn_width;
@ -75,6 +75,7 @@ struct FD_form_cell_options {
FL_OBJECT *radio_valign_top;
FL_OBJECT *radio_valign_center;
FL_OBJECT *radio_valign_bottom;
FL_OBJECT *radio_useminipage;
};
struct FD_form_longtable_options {

View File

@ -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

View File

@ -10,13 +10,13 @@ SnapGrid: 5
=============== FORM ===============
Name: form_tabular
Width: 510
Height: 285
Height: 315
Number of Objects: 6
--------------------
class: FL_BOX
type: FLAT_BOX
box: 0 0 510 285
box: 0 0 510 315
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -34,7 +34,7 @@ argument:
--------------------
class: FL_TABFOLDER
type: TOP_TABFOLDER
box: 0 0 505 245
box: 0 0 505 275
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_TOP_LEFT
@ -52,7 +52,7 @@ argument:
--------------------
class: FL_BUTTON
type: NORMAL_BUTTON
box: 415 250 90 30
box: 415 280 90 30
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -70,7 +70,7 @@ argument: 0
--------------------
class: FL_INPUT
type: NORMAL_INPUT
box: 64 250 60 30
box: 65 280 60 30
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_TOP_LEFT
@ -88,7 +88,7 @@ argument:
--------------------
class: FL_INPUT
type: NORMAL_INPUT
box: 5 250 60 30
box: 5 280 60 30
boxtype: FL_DOWN_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_TOP_LEFT
@ -106,7 +106,7 @@ argument:
--------------------
class: FL_TEXT
type: NORMAL_TEXT
box: 125 250 290 30
box: 125 275 290 30
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@ -712,13 +712,13 @@ argument: 0
=============== FORM ===============
Name: form_cell_options
Width: 505
Height: 227
Number of Objects: 26
Height: 257
Number of Objects: 27
--------------------
class: FL_BOX
type: UP_BOX
box: 0 0 505 227
box: 0 0 505 257
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -736,7 +736,7 @@ argument:
--------------------
class: FL_FRAME
type: ENGRAVED_FRAME
box: 335 110 155 100
box: 335 145 155 100
boxtype: FL_NO_BOX
colors: FL_BLACK FL_COL1
alignment: FL_ALIGN_CENTER
@ -754,7 +754,7 @@ argument:
--------------------
class: FL_FRAME
type: ENGRAVED_FRAME
box: 10 110 180 100
box: 10 145 180 100
boxtype: FL_NO_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -772,7 +772,7 @@ argument:
--------------------
class: FL_TEXT
type: NORMAL_TEXT
box: 15 100 70 20
box: 15 135 70 20
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@ -790,7 +790,7 @@ argument:
--------------------
class: FL_FRAME
type: ENGRAVED_FRAME
box: 195 110 130 100
box: 195 145 130 100
boxtype: FL_NO_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -808,7 +808,7 @@ argument:
--------------------
class: FL_TEXT
type: NORMAL_TEXT
box: 200 100 115 20
box: 200 135 115 20
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@ -826,7 +826,7 @@ argument:
--------------------
class: FL_TEXT
type: NORMAL_TEXT
box: 345 100 115 20
box: 345 135 115 20
boxtype: FL_FLAT_BOX
colors: FL_COL1 FL_MCOL
alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE
@ -844,7 +844,7 @@ argument:
--------------------
class: FL_FRAME
type: ENGRAVED_FRAME
box: 10 15 150 85
box: 10 15 150 115
boxtype: FL_NO_BOX
colors: FL_BLACK FL_COL1
alignment: FL_ALIGN_CENTER
@ -905,18 +905,18 @@ alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label: Linebreaks|#N
label: Use ParBox|#U
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: radio_linebreak_cell
name: radio_useparbox
callback: C_FormTabularInputCB
argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 10 75 145 25
box: 10 100 145 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -934,7 +934,7 @@ argument: 0
--------------------
class: FL_FRAME
type: ENGRAVED_FRAME
box: 165 15 325 85
box: 165 15 325 115
boxtype: FL_NO_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
@ -1006,7 +1006,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 75 135 25 25
box: 75 170 25 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_TOP_LEFT
@ -1024,7 +1024,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 75 165 25 25
box: 75 200 25 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_BOTTOM_LEFT
@ -1042,7 +1042,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 55 150 25 25
box: 55 185 25 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_LEFT
@ -1060,7 +1060,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 95 150 25 25
box: 95 185 25 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_RIGHT
@ -1078,7 +1078,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: RADIO_BUTTON
box: 195 120 110 25
box: 195 155 110 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -1096,7 +1096,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: RADIO_BUTTON
box: 195 170 115 25
box: 195 205 115 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -1114,7 +1114,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: RADIO_BUTTON
box: 195 145 115 25
box: 195 180 115 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -1132,7 +1132,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 345 120 140 25
box: 345 155 140 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -1150,7 +1150,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 345 145 140 25
box: 345 180 140 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -1168,7 +1168,7 @@ argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 345 170 140 25
box: 345 205 140 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
@ -1183,6 +1183,24 @@ name: radio_valign_bottom
callback: C_FormTabularInputCB
argument: 0
--------------------
class: FL_CHECKBUTTON
type: PUSH_BUTTON
box: 10 75 145 25
boxtype: FL_NO_BOX
colors: FL_COL1 FL_YELLOW
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label: Use Minipage|#s
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: radio_useminipage
callback: C_FormTabularInputCB
argument: 0
=============== FORM ===============
Name: form_longtable_options
Width: 505

View File

@ -23,6 +23,7 @@ SRCS := form_citation.fd \
form_copyright.fd \
form_preferences.fd \
form_print.fd \
form_graphics.fd \
form_tabular.fd \
form_url.fd

6
src/graphics/.cvsignore Normal file
View File

@ -0,0 +1,6 @@
Makefile.in
Makefile
*.deps
*.lo
.libs
libgraphics.la

View File

@ -0,0 +1,51 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifdef __GNUG__
#pragma implementation
#endif
#include <config.h>
#include "GraphicsCache.h"
GraphicsCache *
GraphicsCache::getInstance()
{
if (! singleton) {
singleton = new GraphicsCache;
}
return singleton;
}
GraphicsCacheItem *
GraphicsCache::addFile(string filename)
{
CacheType::const_iterator it = cache.find(filename);
if (it != cache.end()) {
return (*it).second;
}
// INCOMPLETE!
return 0;
}
void
GraphicsCache::removeFile(string filename)
{
CacheType::const_iterator it = cache.find(filename);
if (it != cache.end()) {
// INCOMPLETE!
// cache.erase(it);
}
}

View File

@ -0,0 +1,59 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifndef GRAPHICSCACHE_H
#define GRAPHICSCACHE_H
#ifdef __GNUG__
#pragma interface
#endif
#include <map>
#include "LString.h"
#include "GraphicsCacheItem.h"
/** GraphicsCache is the manager of the image cache, it is responsible to
* create the GraphicsCacheItem's and maintain them.
*
* GraphicsCache is a singleton class, there should be only one instance of
* it at any moment.
*/
class GraphicsCache {
public:
/// Get the instance of the class.
static GraphicsCache * getInstance();
/// Add a file to the cache.
GraphicsCacheItem * addFile(string filename);
private:
/// Remove a cache item if it's count has gone to zero.
void removeFile(string filename);
/// Private c-tor so we can control how many objects are instantiated.
GraphicsCache() {}
/// Private d-tor so that no-one will destroy us.
~GraphicsCache() {
delete singleton;
}
/// Holder of the single instance of the class.
static GraphicsCache * singleton;
typedef std::map<string, GraphicsCacheItem *> CacheType;
CacheType cache;
};
GraphicsCache * GraphicsCache::singleton = 0;
#endif

View File

@ -0,0 +1,18 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifdef __GNUG__
#pragma implementation
#endif
#include <config.h>
#include "GraphicsCacheItem.h"

View File

@ -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

13
src/graphics/Makefile.am Normal file
View File

@ -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

View File

@ -1 +0,0 @@
Placeholder for this dir.

View File

@ -39,6 +39,8 @@ libinsets_la_SOURCES = \
insetfoot.h \
insetfootlike.C \
insetfootlike.h \
insetgraphicsParams.h \
insetgraphicsParams.C \
insetgraphics.C \
insetgraphics.h \
insetinclude.C \

View File

@ -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 <config.h>
#include "insets/insetgraphics.h"
#include "insets/insetgraphicsParams.h"
#include "graphics/GraphicsCache.h"
#include "graphics/GraphicsCacheItem.h"
#include "frontends/Dialogs.h"
#include "LyXView.h"
#include "buffer.h"
#include "BufferView.h"
#include "Painter.h"
#include "form_graphics.h"
#include "lyx_gui_misc.h"
#include "filedlg.h"
#include "support/FileInfo.h"
#include "support/filetools.h"
#include "debug.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");
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;
}
// Initialize only those variables that do not have a constructor.
InsetGraphics::InsetGraphics()
: form(0)
#ifdef IG_OLDPARAMS
: use_bb(false), hiresbb(false), angle(0.0), origin(DEFAULT)
,keepaspectratio(false), scale(0.0), clip(false), draft(false)
#endif
{}
InsetGraphics::~InsetGraphics()
{
// Emits the hide signal to the dialog connected (if any)
hide();
}
int InsetGraphics::ascent(BufferView *, LyXFont const &) const
{
return 100;
return 25;
}
int InsetGraphics::descent(BufferView *, LyXFont const &) const
{
// this is not true if viewport is used and clip is not.
return 1;
return 25;
}
int InsetGraphics::width(BufferView *, LyXFont const &) const
{
// Need to replace this with data coming from GraphicsCache
#ifdef IG_OLDPARAMS
if (bb.isSet()) {
return bb.urx - bb.llx;
return bb.urx - bb.llx + 2;
}
return 100;
#endif
return 50;
}
void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
int baseline, float & x, bool) const
{
Painter & pain = bv->painter();
Painter & paint = bv->painter();
// This will draw the graphics. As for now we only draw a
// placeholder rectangele.
pain.rectangle(int(x), baseline - ascent(bv, font),
width(bv, font),
paint.rectangle(int(x)+2, baseline - ascent(bv, font),
width(bv, font) - 4,
ascent(bv, font) + descent(bv, font));
}
void InsetGraphics::Edit(BufferView *, int, int, unsigned int)
void InsetGraphics::Edit(BufferView *bv, int, int, unsigned int)
{
lyxerr.debug() << "InsetGraphics::Edit" << endl;
if (!form) {
form = create_form_Graphics();
fl_set_form_atclose(form->Graphics, CancelCloseBoxCB, 0);
fl_set_object_return(form->Angle, FL_RETURN_ALWAYS);
fl_set_object_return(form->Width, FL_RETURN_ALWAYS);
fl_set_object_return(form->Height, FL_RETURN_ALWAYS);
}
if (form->Graphics->visible) {
fl_raise_form(form->Graphics);
} else {
fl_show_form(form->Graphics, FL_PLACE_MOUSE | FL_PLACE_SIZE,
FL_FULLBORDER, _("Graphics"));
}
bv->owner()->getDialogs() -> showGraphics(this);
}
@ -175,70 +239,197 @@ Inset::EDITABLE InsetGraphics::Editable() const
}
void InsetGraphics::Write(Buffer const *, ostream & os) const
void InsetGraphics::Write(Buffer const * buf, ostream & os) const
{
// The question on the file format is still open.
// Suggestions?
// perhaps a format that is xml-parsable
//<graphics name="test.eps"/>
os << "GRAPHICS\n";
os << "Graphics FormatVersion 1" << endl;
params.Write(buf, os);
}
#if 0
// Baruch Even 2000-07-08
void InsetGraphics::Read(Buffer const *, LyXLex & /*lex*/)
// 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)
{
// For now we only use a static file...
graphicsfile = "testfile.xpm";
//graphicscache.addFile(graphicsfile);
//bb = graphicscache.getBB(graphicsfile);
//pixmap = graphicscache.getPixmap(graphicsfile);
typedef map<string, enum TOKENS> ReadActionMap;
static ReadActionMap const readMap;
bool finished = false;
while (lex.IsOK() && !finished) {
lex.next();
string const token = lex.GetString();
lyxerr.debug() << "Token: '" << token << '\'' << endl;
if (token.empty())
continue;
ReadActionMap::const_iterator it =
readMap.find(token);
if (it == readMap.end()) {
lyxerr << "Unknown keyword, skipping." << endl;
continue;
}
switch (it.second) {
case FILENAME_TOKEN:
break;
case VERSION_TOKEN:
break;
default:
break;
}
}
}
#endif
void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
{
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 (!opts.empty()) {
command += "[";
command += opts;
command += "]";
}
command += "{";
command += graphicsfile;
command += "}";
os << command << '\n';
// 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()) {
os << '[' << opts << ']';
}
// 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);
}
bool InsetGraphics::setParams(InsetGraphicsParams const & params)
{
// 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
{
return new InsetGraphics;
InsetGraphics * newInset = new InsetGraphics;
newInset->setParams(getParams());
return newInset;
}

View File

@ -17,17 +17,26 @@
#endif
#include "insets/lyxinset.h"
#include "LaTeXFeatures.h"
#include "vspace.h"
#include "insets/BoundingBox.h"
#include "insets/insetgraphicsParams.h"
struct FD_Graphics;
#include "LaTeXFeatures.h"
// We need a signal here to hide an active dialog when we are deleted.
#include "sigc++/signal_system.h"
#ifdef SIGC_CXX_NAMESPACES
using SigC::Signal0;
#endif
class Dialogs;
class GraphicsCacheItem;
///
class InsetGraphics : public Inset {
public:
///
InsetGraphics();
///
~InsetGraphics();
///
int ascent(BufferView *, LyXFont const &) const;
///
@ -35,6 +44,8 @@ public:
///
int width(BufferView *, LyXFont const &) const;
///
bool display() const { return true; }
///
void draw(BufferView *, LyXFont const &, int, float &, bool) const;
///
void Edit(BufferView *, int, int, unsigned int);
@ -44,6 +55,7 @@ public:
void Write(Buffer const *, std::ostream &) const;
///
void Read(Buffer const *, LyXLex & lex);
/** returns the number of rows (\n's) of generated tex code.
fragile == true means, that the inset should take care about
fragile commands by adding a \protect before.
@ -57,7 +69,9 @@ public:
///
int DocBook(Buffer const *, std::ostream &) const;
/// Updates needed features for this inset.
/** Tell LyX what the latex features you need i.e. what latex packages
* you need to be included.
*/
void Validate(LaTeXFeatures & features) const;
/// returns LyX code associated with the inset. Used for TOC, ...)
@ -65,28 +79,37 @@ public:
///
Inset * Clone() const;
/// Set the graphics file
void graphicsFile(string const & f) {
graphicsfile = f;
}
/// Get the graphics file
string const & graphicsFile() const {
return graphicsfile;
}
/// Set the inset parameters, used by the GUIndependent dialog.
/// Return true of new params are different from what was so far.
bool setParams(InsetGraphicsParams const & params);
/// Get the inset parameters, used by the GUIndependent dialog.
InsetGraphicsParams getParams() const;
/// This signal is connected by our dialog and called when the inset
/// is deleted.
Signal0<void> hide;
private:
///
FD_Graphics * form;
///
string graphicsfile;
///
Pixmap pixmap;
/// Update the inset after parameter change.
void updateInset();
/// The graphics cache handle.
GraphicsCacheItem * cachehandle;
InsetGraphicsParams params;
// Baruch Even (baruch.even@writeme.com) 2000-07-17
// This was the intended way however it is not flexible enough and
// only provides for LaTeX output.
#ifdef IG_OLDPARAMS
// We need variables to store the size of the boundingbox and
// to store a pointer to the pixmap in.. The question is if
// these should be in a "pixmap" class.
// We also need to have variables about rotation and scaling,
// width and height. in effect all the paramters that
// \includegrapichs can handle. (the graphix.sty package)
// \includegraphics can handle. (the graphix.sty package)
/** The "bounding box" of the graphics image. Its value field
must contain four dimensions, separated by spaces. */
@ -101,76 +124,77 @@ private:
and then for HiResBoundingBox, and set hiresbb depending on this.
This key makes LaTeX search for %%HiResBoundingBox comments
instead of the normal %%BoundingBox. Some applications use
this to specify more precise bounding boxes, becase the cumbers
this to specify more precise bounding boxes, becase the numbers
can normally only have integer values. It is a Boolean, either
"true" or "false". */
bool hiresbb;
/** This key takes four arguments (like bb), but in this case the
origin is taken with respect to the bounding box specified in
the file. So to view a 20 bp square at the lower left-hand corner
of the picture, specify viewport=0 0 20 20. */
BoundingBox viewport;
/** Similar to the viewport key, but the four dimensions correspond
to the amount of space to be trimmed (cut off) at the left-hand
side, bottom, right-hand side and top of the included graphics. */
BoundingBox trim;
/// Natural height of figure
LyXLength natheight;
/// Natural width of figure.
LyXLength natwidth;
/// Rotation angle (in degrees, counterclockwise).
float angle;
/// This is the different origins that the graphicx package support.
enum Origin {
DEFAULT,
LEFTTOP,
LEFTCENTER,
LEFTBASELINE,
LEFTBOTTOM,
CENTERTOP,
CENTER,
CENTERBASELINE,
CENTERBOTTOM,
RIGHTTOP,
RIGHTCENTER,
RIGHTBASELINE,
RIGHTBOTTOM,
REFERENCE_POINT = LEFTBASELINE
};
/** Origin for rotation, similar to the origin parameter of
the \rotatebox command described on p.46 and Fig. 2.2 on p.46. */
Origin origin;
/// Required width (the width of the image is scaled to that value).
LyXLength g_width;
/// Required height (the height of the image is scaled to that value).
LyXLength g_height;
/** Required total height (the total height of the image is scaled
to that value). This key should be used instead of height if
images are rotated over 90 degrees, since the height can
disappear (and become the depth) and LaTeX will have difficulties
satisfying the user's request. */
LyXLength totalheight;
/** Boolean variable that can have the values "true" and "false"
(se above for defaults). When true, specifying both width and
height parameters does not distort the picture, but the image
is scaled so that neither of the width of height exceeds the
given dimensions. */
bool keepaspectratio;
/// Scale factor
float scale;
/** Clip the graphic to the bounding box. It is a Boolean, either
"true" or "false". */
bool clip;
/// Locally switch to draft mode. A Boolean valued key, like clip.
bool draft;
/// The graphics type.
string type;
///x The file extension of the file containing the image data.
/// The file extension of the file containing the image data.
string ext;
/// The file extension of the file "read" by LaTeX.
string read;
/// Any command to be applied to the file.
string command;
#endif
};
#endif

View File

@ -0,0 +1,446 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifdef __GNUG__
#pragma implementation
#endif
#include <config.h>
#include "insetgraphicsParams.h"
#include "support/translator.h"
#include "support/filetools.h"
#ifdef ENABLE_ASSERTIONS
#include "support/LAssert.h"
#endif
/// This variable keeps a tab on whether the translator was set with the
/// translations.
static bool translatorsSet = false;
/// This is the translator between the Resize enum and corresponding lyx
/// file strings.
static Translator<InsetGraphicsParams::Resize, string>
resizeTranslator(InsetGraphicsParams::DEFAULT_SIZE, "default");
/// This is the translator between the Origin enum and corresponding lyx
/// file strings.
static Translator<InsetGraphicsParams::Origin, string>
originTranslator(InsetGraphicsParams::DEFAULT, "default");
/// This is the translator between the Display enum and corresponding lyx
/// file strings.
static Translator<InsetGraphicsParams::DisplayType, string>
displayTranslator(InsetGraphicsParams::MONOCHROME, "monochrome");
InsetGraphicsParams::InsetGraphicsParams()
{
init();
// Set translators
if (! translatorsSet) {
translatorsSet = true;
// Fill the resize translator
resizeTranslator.addPair(DEFAULT_SIZE, "default");
resizeTranslator.addPair(CM, "cm");
resizeTranslator.addPair(INCH, "inch");
resizeTranslator.addPair(PERCENT_PAGE, "percentOfPage");
resizeTranslator.addPair(PERCENT_COLUMN, "percentOfColumn");
// Fill the origin translator
originTranslator.addPair(DEFAULT, "default");
originTranslator.addPair(LEFTTOP, "leftTop");
originTranslator.addPair(LEFTCENTER, "leftCenter");
originTranslator.addPair(LEFTBASELINE, "leftBaseLine");
originTranslator.addPair(LEFTBOTTOM, "leftBottom");
originTranslator.addPair(CENTERTOP, "centerTop");
originTranslator.addPair(CENTER, "center");
originTranslator.addPair(CENTERBASELINE, "centerBaseLine");
originTranslator.addPair(CENTERBOTTOM, "centerBottom");
originTranslator.addPair(RIGHTTOP, "rightTop");
originTranslator.addPair(RIGHTCENTER, "rightCenter");
originTranslator.addPair(RIGHTBASELINE, "rightBaseLine");
originTranslator.addPair(RIGHTBOTTOM, "rightBottom");
originTranslator.addPair(REFERENCE_POINT, "referencePoint");
// Fill the display translator
displayTranslator.addPair(MONOCHROME, "monochrome");
displayTranslator.addPair(GRAYSCALE, "grayscale");
displayTranslator.addPair(COLOR, "color");
displayTranslator.addPair(NONE, "none");
}
}
InsetGraphicsParams::InsetGraphicsParams(InsetGraphicsParams const & igp)
{
// I decided to skip the initialization since the copy will overwrite
// everything anyway.
// init();
copy(igp);
}
InsetGraphicsParams const &
InsetGraphicsParams::operator=(InsetGraphicsParams const &params)
{
// Are we assigning the object into itself?
if (this == &params)
return *this;
copy(params);
return *this;
}
void InsetGraphicsParams::init()
{
subcaptionText = filename = string();
display = MONOCHROME;
inlineFigure = false;
subcaption = false;
keepAspectRatio = true;
widthResize = DEFAULT_SIZE;
widthSize = 0.0;
heightResize = DEFAULT_SIZE;
heightSize = 0.0;
rotateOrigin = DEFAULT;
rotateAngle = 0;
#ifdef ENABLE_ASSERTION
testInvariant();
#endif
}
void InsetGraphicsParams::copy(InsetGraphicsParams const & igp)
{
filename = igp.filename;
display = igp.display;
inlineFigure = igp.inlineFigure;
subcaption = igp.subcaption;
subcaptionText = igp.subcaptionText;
keepAspectRatio = igp.keepAspectRatio;
widthResize = igp.widthResize;
widthSize = igp.widthSize;
heightResize = igp.heightResize;
heightSize = igp.heightSize;
rotateOrigin = igp.rotateOrigin;
rotateAngle = igp.rotateAngle;
#ifdef ENABLE_ASSERTIONS
testInvariant();
#endif
}
void InsetGraphicsParams::testInvariant() const
{
#ifdef ENABLE_ASSERTIONS
// Filename might be empty (when the dialog is first created).
// Assert(!filename.empty());
Assert(display == COLOR ||
display == MONOCHROME ||
display == GRAYSCALE ||
display == NONE
);
Assert(widthResize == DEFAULT_SIZE ||
widthResize == CM ||
widthResize == INCH ||
widthResize == PERCENT_PAGE ||
widthResize == PERCENT_COLUMN
);
Assert(heightResize == DEFAULT_SIZE ||
heightResize == CM ||
heightResize == INCH ||
heightResize == PERCENT_PAGE
);
Assert(widthSize >= 0.0);
Assert(heightSize >= 0.0);
// Angle is in degrees and ranges -360 < angle < 360
// The reason for this is that in latex there is a meaning for the
// different angles and they are not necessarliy interchangeable,
// it depends on the rotation origin.
Assert(rotateAngle < 360);
Assert(rotateAngle > -360);
#endif
}
bool operator==(InsetGraphicsParams const & left,
InsetGraphicsParams const & right)
{
if (left.filename == right.filename &&
left.display == right.display &&
left.inlineFigure == right.inlineFigure &&
left.subcaption == right.subcaption &&
left.subcaptionText == right.subcaptionText &&
left.keepAspectRatio == right.keepAspectRatio &&
left.widthResize == right.widthResize &&
left.widthSize == right.widthSize &&
left.heightResize == right.heightResize &&
left.heightSize == right.heightSize &&
left.rotateOrigin == right.rotateOrigin &&
left.rotateAngle == right.rotateAngle
)
return true;
return false;
}
static void writeResize(ostream & os, char const * key,
InsetGraphicsParams::Resize resize, double size)
{
os << ' ' << key << "Resize ";
os << resizeTranslator.find(resize);
#if 0
// Old code, before using translators
switch (resize) {
case InsetGraphicsParams::DEFAULT_SIZE:
os << "default";
break;
case InsetGraphicsParams::CM:
os << "cm";
break;
case InsetGraphicsParams::INCH:
os << "inch";
break;
case InsetGraphicsParams::PERCENT_PAGE:
os << "percentOfPage";
break;
case InsetGraphicsParams::PERCENT_COLUMN:
os << "percentOfColumnt";
break;
}
#endif
os << ' ' << key << ' ' << size << endl;
}
static void writeOrigin(ostream & os,
InsetGraphicsParams::Origin origin)
{
os << " rotateOrigin " << originTranslator.find(origin);
#if 0
// Old method.
switch (origin) {
case InsetGraphicsParams:: DEFAULT:
os << "default";
break;
case InsetGraphicsParams:: LEFTTOP:
os << "LeftTop";
break;
case InsetGraphicsParams:: LEFTCENTER:
os << "LeftCenter";
break;
case InsetGraphicsParams:: LEFTBASELINE:
os << "LeftBaseLine";
break;
case InsetGraphicsParams:: LEFTBOTTOM:
os << "LeftBottom";
break;
case InsetGraphicsParams:: CENTERTOP:
os << "CenterTop";
break;
case InsetGraphicsParams:: CENTER:
os << "Center";
break;
case InsetGraphicsParams:: CENTERBASELINE:
os << "CenterBaseLine";
break;
case InsetGraphicsParams:: CENTERBOTTOM:
os << "CenterBottom";
break;
case InsetGraphicsParams:: RIGHTTOP:
os << "RightTop";
break;
case InsetGraphicsParams:: RIGHTCENTER:
os << "RightCenter";
break;
case InsetGraphicsParams:: RIGHTBASELINE:
os << "RightBaseLine";
break;
case InsetGraphicsParams:: RIGHTBOTTOM:
os << "RightBottom";
break;
// Current REFERENCE_POINT is aliased to LEFTBASELINE
// case InsetGraphicsParams:: REFERENCE_POINT:
}
#endif
os << endl;
}
void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
{
// If there is no filename, write nothing for it.
if (! filename.empty()) {
os << "filename "
<< MakeRelPath(filename, OnlyPath(buf->fileName()))
<< endl;
}
// Save the display type
os << " display " << displayTranslator.find(display) << endl;
#if 0
switch (display) {
case COLOR:
os << "color";
break;
case GRAYSCALE:
os << "grayscale";
break;
case MONOCHROME:
os << "monochrome";
break;
case NONE:
os << "none";
break;
}
os << endl;
#endif
// Save the inline status
if (inlineFigure)
os << " inline";
// Save the subcaption status
if (subcaption)
os << " subcaption";
if (! subcaptionText.empty())
os << " subcaptionText \"" << subcaptionText << '\"' << endl;
writeResize(os, "width", widthResize, widthSize);
writeResize(os, "height", heightResize, heightSize);
writeOrigin(os, rotateOrigin);
if (rotateAngle != 0)
os << " rotateAngle " << rotateAngle << endl;
}
static readResize(InsetGraphicsParams * igp, bool height, string const & token)
{
InsetGraphicsParams::Resize resize = InsetGraphicsParams::DEFAULT_SIZE;
resize = resizeTranslator.find(token);
#if 0
// Old code, before translator.
if (token == "default")
resize = InsetGraphicsParams::DEFAULT_SIZE;
else if (token == "cm")
resize = InsetGraphicsParams::CM;
else if (token == "inch")
resize = InsetGraphicsParams::INCH;
else if (token == "percentOfPage")
resize = InsetGraphicsParams::PERCENT_PAGE;
else if (token == "percentOfColumn")
resize = InsetGraphicsParams::PERCENT_COLUMN;
else {
lyxerr << "BUG: When reading resize value of InsetGraphicsParam"
" unknown token found '" << token << '\'' << endl;
}
#endif
if (height)
igp->heightResize = resize;
else
igp->widthResize = resize;
}
static readOrigin(InsetGraphicsParams * igp, string const & token)
{ // TODO: complete this function.
igp->rotateOrigin = originTranslator.find(token);
}
bool InsetGraphicsParams::Read(Buffer const * buf, LyXLex & lex,
string const& token)
{
if (token == "filename") {
lex.next();
filename = lex.GetString();
if (!filename.empty()) {
// Make the filename with absolute directory.
filename = MakeAbsPath(filename, OnlyPath(buf->fileName()));
}
} else if (token == "display") {
lex.next();
string const type = lex.GetString();
display = displayTranslator.find(type);
#if 0
if (type == "color")
display = COLOR;
else if (type == "grayscale")
display = GRAYSCALE;
else if (type == "monochrome")
display = MONOCHROME;
else if (type == "none")
display = NONE;
else {
display = MONOCHROME;
lyxerr << "BUG: When reading InsetGraphicsParams"
" display has an unknown type " << type << endl;
}
#endif
} else if (token == "inline") {
inlineFigure = true;
} else if (token == "subcaption") {
subcaption = true;
} else if (token == "subcaptionText") {
lex.next();
subcaptionText = lex.GetString();
} else if (token == "widthResize") {
lex.next();
string const token = lex.GetString();
readResize(this, false, token);
} else if (token == "width") {
lex.next();
widthSize = lex.GetFloat();
} else if (token == "heightResize") {
lex.next();
string const token = lex.GetString();
readResize(this, true, token);
} else if (token == "height") {
lex.next();
heightSize = lex.GetFloat();
} else if (token == "rotateOrigin") {
lex.next();
string const token = lex.GetString();
readOrigin(this, token);
} else if (token == "rotateAngle") {
lex.next();
rotateAngle = lex.GetInteger();
} else {
// If it's none of the above, its not ours.
return false;
}
return true;
}

View File

@ -0,0 +1,126 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifndef INSETGRAPHICSPARAMS_H
#define INSETGRAPHICSPARAMS_H
#ifdef __GNUG__
#pragma interface
#endif
#include <config.h>
#include "LString.h"
#include "buffer.h"
#include "lyxlex.h"
using std::ostream;
/// This struct holds all the parameters needed by insetGraphics.
struct InsetGraphicsParams {
/// Image filename.
string filename;
/// How do we display the image?
enum DisplayType {
/// In full color range (if it's not in color we show it as it is)
COLOR,
/// In Grayscale (256 shades of gray).
GRAYSCALE,
/// In black and white.
MONOCHROME,
/// Don't display it on screen, only keep a frame in place.
NONE
};
/// How to display the image
DisplayType display;
/// Is the figure inlined? (not in a paragraph of its own).
bool inlineFigure;
/// Do we have a subcaption?
bool subcaption;
/// The text of the subcaption.
string subcaptionText;
/// This is the different origins that the graphicx package support.
enum Origin {
DEFAULT,
LEFTTOP,
LEFTCENTER,
LEFTBASELINE,
LEFTBOTTOM,
CENTERTOP,
CENTER,
CENTERBASELINE,
CENTERBOTTOM,
RIGHTTOP,
RIGHTCENTER,
RIGHTBASELINE,
RIGHTBOTTOM,
REFERENCE_POINT = LEFTBASELINE
};
/// The resize of the image, is it the default size, in cm, inch or
/// percentage of the page/column width/height
enum Resize {
DEFAULT_SIZE,
CM,
INCH,
PERCENT_PAGE,
PERCENT_COLUMN
};
/// Keep the ratio between height and width when resizing.
bool keepAspectRatio;
// What width resize to do?
Resize widthResize;
// Value of width resize
float widthSize;
// What height resize to do?
Resize heightResize;
// Value of height resize
float heightSize;
// Origin point of rotation
Origin rotateOrigin;
// Rotation angle.
int rotateAngle;
InsetGraphicsParams();
InsetGraphicsParams(InsetGraphicsParams const &);
InsetGraphicsParams const & operator=(InsetGraphicsParams const &);
/// Save the parameters in the LyX format stream.
void Write(Buffer const * buf, ostream & os) const;
/// If the token belongs to our parameters, read it.
bool Read(Buffer const * buf, LyXLex & lex, string const & token);
/// Test the struct to make sure that all the options have legal values.
void testInvariant() const;
private:
/// Initialize the object to a default status.
void init();
/// Copy the other objects content to us, used in copy c-tor and assignment
void copy(InsetGraphicsParams const & params);
};
bool operator==(InsetGraphicsParams const&, InsetGraphicsParams const &);
#endif

View File

@ -90,7 +90,7 @@ static tabular_features tabularFeatures[] =
{ LyXTabular::UNSET_ROTATE_TABULAR, "unset-rotate-tabular" },
{ LyXTabular::SET_ROTATE_CELL, "set-rotate-cell" },
{ LyXTabular::UNSET_ROTATE_CELL, "unset-rotate-cell" },
{ LyXTabular::SET_LINEBREAKS, "set-linebreaks" },
{ LyXTabular::SET_USEBOX, "set-usebox" },
{ LyXTabular::SET_LTHEAD, "set-lthead" },
{ LyXTabular::SET_LTFIRSTHEAD, "set-ltfirsthead" },
{ LyXTabular::SET_LTFOOT, "set-ltfoot" },
@ -190,7 +190,7 @@ void InsetTabular::initFeatures()
{ LyXTabular::UNSET_ROTATE_TABULAR, "unset-rotate-tabular" },
{ LyXTabular::SET_ROTATE_CELL, "set-rotate-cell" },
{ LyXTabular::UNSET_ROTATE_CELL, "unset-rotate-cell" },
{ LyXTabular::SET_LINEBREAKS, "set-linebreaks" },
{ LyXTabular::SET_USEBOX, "set-usebox" },
{ LyXTabular::SET_LTHEAD, "set-lthead" },
{ LyXTabular::SET_LTFIRSTHEAD, "set-ltfirsthead" },
{ LyXTabular::SET_LTFOOT, "set-ltfoot" },
@ -1171,7 +1171,7 @@ bool InsetTabular::TabularFeatures(BufferView * bv, string what)
}
void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
void InsetTabular::TabularFeatures(BufferView * bv, int feature, string value)
{
int
i, j,
@ -1252,8 +1252,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
switch (feature) {
case LyXTabular::SET_PWIDTH:
{
bool update = (tabular->GetColumnPWidth(actcell) != val);
tabular->SetColumnPWidth(actcell,val);
bool update = (tabular->GetColumnPWidth(actcell) != value);
tabular->SetColumnPWidth(actcell,value);
if (update) {
for (int i=0; i < tabular->rows(); ++i) {
tabular->GetCellInset(tabular->GetCellNumber(i, column))->
@ -1265,8 +1265,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
break;
case LyXTabular::SET_MPWIDTH:
{
bool update = (tabular->GetPWidth(actcell) != val);
tabular->SetMColumnPWidth(actcell,val);
bool update = (tabular->GetPWidth(actcell) != value);
tabular->SetMColumnPWidth(actcell,value);
if (update) {
for (int i=0; i < tabular->rows(); ++i) {
tabular->GetCellInset(tabular->GetCellNumber(i, column))->
@ -1278,7 +1278,7 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
break;
case LyXTabular::SET_SPECIAL_COLUMN:
case LyXTabular::SET_SPECIAL_MULTI:
tabular->SetAlignSpecial(actcell,val,feature);
tabular->SetAlignSpecial(actcell,value,feature);
break;
case LyXTabular::APPEND_ROW:
// append the row into the tabular
@ -1452,12 +1452,16 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
for(j=sel_col_start; j<=sel_col_end; ++j)
tabular->SetRotateCell(tabular->GetCellNumber(i,j),false);
break;
case LyXTabular::SET_LINEBREAKS:
what = !tabular->GetLinebreaks(actcell);
case LyXTabular::SET_USEBOX:
{
int val = strToInt(value);
if (val == tabular->GetUsebox(actcell))
val = 0;
for(i=sel_row_start; i<=sel_row_end; ++i)
for(j=sel_col_start; j<=sel_col_end; ++j)
tabular->SetLinebreaks(tabular->GetCellNumber(i,j),what);
tabular->SetUsebox(tabular->GetCellNumber(i,j),val);
break;
}
case LyXTabular::SET_LTFIRSTHEAD:
tabular->SetLTHead(actcell,true);
break;

View File

@ -924,8 +924,12 @@ string LyXFunc::Dispatch(int ac,
case LFUN_INSET_GRAPHICS:
{
Inset * new_inset = new InsetGraphics;
if (!owner->view()->insertInset(new_inset))
if (!owner->view()->insertInset(new_inset)) {
delete new_inset;
} else {
// this is need because you don't use a inset->Edit()
owner->view()->updateInset(new_inset, true);
}
break;
}

View File

@ -55,5 +55,6 @@ libsupport_la_SOURCES = \
syscontr.C \
syscontr.h \
syssingleton.C \
translator.h \
textutils.h \
utility.hpp

132
src/support/translator.h Normal file
View File

@ -0,0 +1,132 @@
// -*- C++ -*-
/* This file is part of
* =================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich.
* Copyright 1995-2000 The LyX Team.
*
* This file Copyright 2000 Baruch Even
* ================================================= */
#ifndef TRANSLATOR_H
#define TRANSLATOR_H
#include <vector>
#include <utility>
#include <algorithm>
#include <functional>
// Functors used in the template.
template<typename T1, typename T2>
class equal_1st_in_pair {
public:
equal_1st_in_pair(T1 const & value) : value_(value) {}
typedef std::pair<T1, T2> pair_type;
bool operator() (pair_type p) const {
return p.first == value_;
}
private:
T1 const & value_;
};
template<typename T1, typename T2>
class equal_2nd_in_pair {
public:
equal_2nd_in_pair(T2 const & value) : value_(value) {}
typedef std::pair<T1, T2> pair_type;
bool operator() (pair_type p) const {
return p.second == value_;
}
private:
T2 const & value_;
};
/** This class template is used to translate between two elements, specifically
* it was worked out to translate between an enum and strings when reading
* the lyx file.
*
* The two template arguments should be of different types.
*/
template<typename T1, typename T2>
class Translator {
public:
typedef T1 first_argument_type;
typedef T2 second_argument_type;
/// c-tor.
Translator(T1 const & t1, T2 const & t2)
: default_t1(t1), default_t2(t2)
{}
/// d-tor. Not virtual since it's not going to be inherited.
~Translator() {}
/// Add a mapping to the translator.
void addPair(T1 const & first, T2 const & second) {
map.push_back(MapPair(first, second));
}
/// Find the mapping for the first argument
T2 const & find(T1 const & first) const {
#ifdef ENABLE_ASSERTIONS
Assert( ! map.empty());
#endif
// For explanation see the next find() function.
Map::const_iterator it =
std::find_if(map.begin(), map.end(),
equal_1st_in_pair<T1, T2>(first)
);
if (it != map.end())
return (*it).second;
else {
return default_t2;
}
}
/// Find the mapping for the second argument
T1 const & find(T2 const & second) const {
#ifdef ENABLE_ASSERTIONS
Assert( ! map.empty());
#endif
// The idea is as follows:
// find_if() will try to compare the data in the vector with the value.
// The vector is made of pairs and the value has the type of the
// second part of the pair.
// We thus give find_if() an equal_to functor and assign to its second
// post the value we want to compare. We now compose the equal_to
// functor with the select2nd functor to take only the second value
// of the pair to be compared.
//
// We can depict it as follows:
// equal_to( select2nd(pair) , second)
Map::const_iterator it =
std::find_if(map.begin(), map.end(),
equal_2nd_in_pair<T1, T2>(second)
);
if (it != map.end())
return (*it).first;
else {
return default_t1;
}
}
private:
typedef std::pair<T1, T2> MapPair;
typedef std::vector<MapPair> Map;
Map map;
const T1 default_t1;
const T2 default_t2;
};
#endif

View File

@ -53,7 +53,7 @@ LyXTabular::cellstruct::cellstruct()
top_line = true;
bottom_line = false;
rotate = false;
linebreaks = false;
usebox = false;
}
@ -940,7 +940,7 @@ void LyXTabular::Write(Buffer const * buf, ostream & os) const
" leftline=" << cell_info[i][j].left_line <<
" rightline=" << cell_info[i][j].right_line <<
" rotate=" << cell_info[i][j].rotate <<
" linebreaks=" << cell_info[i][j].linebreaks <<
" usebox=" << cell_info[i][j].usebox <<
" width=\"" << cell_info[i][j].p_width <<
"\" special=\"" << cell_info[i][j].align_special <<
"\">" << endl;
@ -1110,7 +1110,7 @@ void LyXTabular::Read(Buffer const * buf, LyXLex & lex)
(void)getTokenValue(line, "leftline", cell_info[i][j].left_line);
(void)getTokenValue(line, "rightline", cell_info[i][j].right_line);
(void)getTokenValue(line, "rotate", cell_info[i][j].rotate);
(void)getTokenValue(line, "linebreaks", cell_info[i][j].linebreaks);
(void)getTokenValue(line, "usebox", cell_info[i][j].usebox);
(void)getTokenValue(line, "width", cell_info[i][j].p_width);
(void)getTokenValue(line, "special", cell_info[i][j].align_special);
l_getline(is, line);
@ -1248,7 +1248,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
cell_info[i][j].top_line = static_cast<char>(c);
cell_info[i][j].bottom_line = static_cast<char>(d);
cell_info[i][j].rotate = static_cast<bool>(f);
cell_info[i][j].linebreaks = static_cast<bool>(g);
cell_info[i][j].usebox = static_cast<bool>(g);
cell_info[i][j].align_special = s1;
cell_info[i][j].p_width = s2;
}
@ -1326,7 +1326,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
}
inset = GetCellInset(cell);
row = row_of_cell(cell);
if (!cell_info[row_of_cell(cell)][column_of_cell(cell)].linebreaks)
if (!cell_info[row_of_cell(cell)][column_of_cell(cell)].usebox)
{
// insert a space instead
par->Erase(i);
@ -1684,18 +1684,18 @@ int LyXTabular::GetCellNumber(int row, int column) const
}
void LyXTabular::SetLinebreaks(int cell, bool what)
void LyXTabular::SetUsebox(int cell, int what)
{
cellinfo_of_cell(cell)->linebreaks = what;
cellinfo_of_cell(cell)->usebox = what;
}
bool LyXTabular::GetLinebreaks(int cell) const
int LyXTabular::GetUsebox(int cell) const
{
if (column_info[column_of_cell(cell)].p_width.empty() &&
!(IsMultiColumn(cell) && !cellinfo_of_cell(cell)->p_width.empty()))
return false;
return cellinfo_of_cell(cell)->linebreaks;
return cellinfo_of_cell(cell)->usebox;
}
@ -1950,7 +1950,7 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const
os << "}{";
}
}
if (GetLinebreaks(cell)) {
if (GetUsebox(cell) == 1) {
os << "\\parbox[";
switch(GetVAlignment(cell)) {
case LYX_VALIGN_TOP:
@ -1963,7 +1963,22 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const
os << "b";
break;
}
os << "]{" << GetPWidth(cell) << "}{\\smallskip{}";
os << "]{" << GetPWidth(cell) << "}{";
} else if (GetUsebox(cell) == 2) {
os << "\\begin{minipage}[";
switch(GetVAlignment(cell)) {
case LYX_VALIGN_TOP:
os << "t";
break;
case LYX_VALIGN_CENTER:
os << "m";
break;
case LYX_VALIGN_BOTTOM:
os << "b";
break;
}
os << "]{" << GetPWidth(cell) << "}\n";
++ret;
}
return ret;
}
@ -1974,13 +1989,17 @@ int LyXTabular::TeXCellPostamble(ostream & os, int cell) const
int ret = 0;
// usual cells
if (GetLinebreaks(cell))
os << "\\smallskip{}}";
if (GetUsebox(cell) == 1)
os << "}";
else if (GetUsebox(cell) == 2) {
os << "%\n\\end{minipage}";
ret += 2;
}
if (IsMultiColumn(cell)){
os << '}';
}
if (GetRotateCell(cell)) {
os << endl << "\\end{sideways}";
os << "%\n\\end{sideways}";
++ret;
}
return ret;

View File

@ -68,7 +68,7 @@ public:
UNSET_ROTATE_TABULAR,
SET_ROTATE_CELL,
UNSET_ROTATE_CELL,
SET_LINEBREAKS,
SET_USEBOX,
SET_LTHEAD,
SET_LTFIRSTHEAD,
SET_LTFOOT,
@ -270,9 +270,9 @@ public:
///
int GetCellNumber(int row, int column) const;
///
void SetLinebreaks(int cell, bool what);
void SetUsebox(int cell, int what);
///
bool GetLinebreaks(int cell) const;
int GetUsebox(int cell) const;
///
/// Long Tabular Options
///
@ -334,7 +334,11 @@ private: //////////////////////////////////////////////////////////////////
///
bool right_line;
///
bool linebreaks;
/// 0 ... don't use a box
/// 1 ... use a parbox
/// 2 ... use a minipage
///
int usebox;
///
int rotate;
///