Hi, Attached patch implements the box dialog for the gtk frontend. I've also moved some common functionality out of GGraphics and into ghelpers.
John
Index: ChangeLog =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/ChangeLog,v retrieving revision 1.81 diff -u -p -r1.81 ChangeLog --- ChangeLog 9 Nov 2004 12:40:33 -0000 1.81 +++ ChangeLog 14 Nov 2004 14:50:14 -0000 @@ -1,3 +1,11 @@ +2004-11-14 John Spray <[EMAIL PROTECTED]> + + * The Box dialog: + Dialogs.C, Makefile.am, GBox.C, GBox.h + * ghelpers.[Ch], GGraphics.[Ch]: new functions unitsComboFromLength + and getDefaultUnit take functionality that was in GGraphics into + ghelpers + 2004-11-08 Jean-Marc Lasgouttes <[EMAIL PROTECTED]> * GToolbar.C (selected): use layoutSelected() Index: Dialogs.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/Dialogs.C,v retrieving revision 1.31 diff -u -p -r1.31 Dialogs.C --- Dialogs.C 26 Oct 2004 09:10:16 -0000 1.31 +++ Dialogs.C 14 Nov 2004 14:50:14 -0000 @@ -54,7 +54,7 @@ #include "GMathDelim.h" #include "FormBibitem.h" #include "FormBibtex.h" -#include "FormBox.h" +#include "GBox.h" #include "FormBranch.h" #include "GChanges.h" #include "GCharacter.h" @@ -190,8 +190,9 @@ Dialogs::DialogPtr Dialogs::build(string dialog->setView(new FormBibtex(*dialog)); dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy); } else if (name == "box") { + dialog->bc().view(new GBC(dialog->bc())); dialog->setController(new ControlBox(*dialog)); - dialog->setView(new FormBox(*dialog)); + dialog->setView(new GBox(*dialog)); dialog->bc().bp(new OkApplyCancelReadOnlyPolicy); } else if (name == "changes") { dialog->bc().view(new GBC(dialog->bc())); Index: GBox.C =================================================================== RCS file: GBox.C diff -N GBox.C --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ GBox.C 14 Nov 2004 14:50:14 -0000 @@ -0,0 +1,427 @@ +/** + * \file GBox.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author John Spray + * + * Full author contact details are available in file CREDITS. + */ + +#include <config.h> + +#include "GBox.h" + +#include "ghelpers.h" + +#include "controllers/ControlBox.h" + +#include "insets/insetbox.h" +#include "lengthcommon.h" +#include "lyxrc.h" // to set the default length values + +using std::string; +using std::vector; + +namespace lyx { +namespace frontend { + +namespace { +string defaultUnit("cm"); +} // namespace anon + +GBox::GBox(Dialog & parent) + : GViewCB<ControlBox, GViewGladeB>(parent, _("Box Settings"), false) +{} + + +void GBox::doBuild() +{ + string const gladeName = findGladeFile("box"); + xml_ = Gnome::Glade::Xml::create(gladeName); + + Gtk::Button * closebutton; + xml_->get_widget("Close", closebutton); + setCancel(closebutton); + + xml_->get_widget("Type", typecombo_); + bcview().addReadOnly(typecombo_); + xml_->get_widget("InnerBox", innerboxcombo_); + bcview().addReadOnly(innerboxcombo_); + xml_->get_widget("WidthUnits", widthunitscombo_); + bcview().addReadOnly(widthunitscombo_); + xml_->get_widget("HeightUnits", heightunitscombo_); + bcview().addReadOnly(heightunitscombo_); + xml_->get_widget("BoxVertical", boxvertcombo_); + bcview().addReadOnly(boxvertcombo_); + xml_->get_widget("ContentVertical", contentvertcombo_); + bcview().addReadOnly(contentvertcombo_); + xml_->get_widget("ContentHorizontal", contenthorzcombo_); + bcview().addReadOnly(contenthorzcombo_); + xml_->get_widget("Width", widthspin_); + bcview().addReadOnly(widthspin_); + xml_->get_widget("Height", heightspin_); + bcview().addReadOnly(heightspin_); + + cols_.add(stringcol_); + + // fill the box type choice + box_gui_tokens(ids_, gui_names_); + PopulateComboBox(typecombo_, gui_names_); + typecombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onTypeComboChanged)); + + // set up innerbox (populated in setInnerType) + innerboxstore_ = Gtk::ListStore::create(cols_); + innerboxcombo_->set_model(innerboxstore_); + Gtk::CellRendererText * cell = Gtk::manage(new Gtk::CellRendererText); + innerboxcombo_->pack_start(*cell, true); + innerboxcombo_->add_attribute(*cell, "text", 0); + + innerboxcombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onInnerBoxComboChanged)); + + boxvertcombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onAlignChanged)); + contenthorzcombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onAlignChanged)); + contentvertcombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onAlignChanged)); + + heightunitscombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onHeightChanged)); + widthunitscombo_->signal_changed().connect( + sigc::mem_fun(*this, &GBox::onWidthChanged)); + + heightspin_->signal_value_changed().connect( + sigc::mem_fun(*this, &GBox::onHeightChanged)); + widthspin_->signal_value_changed().connect( + sigc::mem_fun(*this, &GBox::onWidthChanged)); + + + widthunitsstore_ = Gtk::ListStore::create(cols_); + widthunitscombo_->set_model(widthunitsstore_); + cell = Gtk::manage(new Gtk::CellRendererText); + widthunitscombo_->pack_start(*cell, true); + widthunitscombo_->add_attribute(*cell, "text", 0); + //widthunitscombo_ is populated in setSpecial + + box_gui_tokens_special_length(ids_spec_, gui_names_spec_); + vector<string> heightunits = buildLengthUnitList(); + // Append special entries, skipping the first item "None" + heightunits.insert(heightunits.end(), + ++gui_names_spec_.begin(), gui_names_spec_.end()); + + PopulateComboBox(heightunitscombo_, heightunits); +} + + +void GBox::PopulateComboBox(Gtk::ComboBox * combo, + vector<string> const & strings + ) +{ + Glib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(cols_); + vector<string>::const_iterator it = strings.begin(); + vector<string>::const_iterator end = strings.end(); + for(; it != end; ++it) + (*model->append())[stringcol_] = *it; + + combo->set_model(model); + Gtk::CellRendererText * cell = Gtk::manage(new Gtk::CellRendererText); + combo->pack_start(*cell, true); + combo->add_attribute(*cell, "text", 0); +} + + +void GBox::update() +{ + applylock_ = true; + + defaultUnit = getDefaultUnit(); + + char c = controller().params().pos; + boxvertcombo_->set_active(string("tcb").find(c, 0)); + c = controller().params().inner_pos; + contentvertcombo_->set_active(string("tcbs").find(c, 0)); + c = controller().params().hor_pos; + contenthorzcombo_->set_active(string("lcrs").find(c, 0)); + + string type(controller().params().type); + for (unsigned int i = 0; i < gui_names_.size(); ++i) { + if (type == ids_[i]) + typecombo_->set_active(i); + } + + applylock_ = false; + updateInnerBoxCombo(); + applylock_ = true; + + bool ibox = controller().params().inner_box; + boxvertcombo_->set_sensitive(ibox); + contentvertcombo_->set_sensitive(ibox); + contenthorzcombo_->set_sensitive(!ibox); + setSpecial(ibox); + + widthspin_->get_adjustment()->set_value(controller().params().width.value()); + unitsComboFromLength(widthunitscombo_, stringcol_, + controller().params().width, defaultUnit); + + string const special(controller().params().special); + if (!special.empty() && special != "none") { + string spc; + for (unsigned int i = 0; i < gui_names_spec_.size(); ++i) { + if (special == ids_spec_[i]) + spc = gui_names_spec_[i]; + } + for (int j = 0; j < widthunitsstore_->children().size(); ++j) { + if (widthunitsstore_->children()[j][stringcol_] == spc) + widthunitscombo_->set_active(j); + } + } + + heightspin_->get_adjustment()->set_value(controller().params().height.value()); + unitsComboFromLength(heightunitscombo_, stringcol_, + controller().params().height, defaultUnit); + + string const height_special(controller().params().height_special); + if (!height_special.empty() && height_special != "none") { + string hspc; + for (unsigned int i = 0; i < gui_names_spec_.size(); ++i) { + if (height_special == ids_spec_[i]) { + hspc = gui_names_spec_[i]; + } + } + for (int j = 0; j < heightunitscombo_->get_model()->children().size(); ++j) { + if (heightunitscombo_->get_model()->children()[j][stringcol_] == hspc) { + heightunitscombo_->set_active(j); + } + } + } + + heightspin_->set_sensitive(ibox); + heightunitscombo_->set_sensitive(ibox); + applylock_ = false; +} + + +void GBox::setSpecial(bool ibox) +{ + bool const oldlock = applylock_; + applylock_ = true; + + unsigned int const initselection = widthunitscombo_->get_active_row_number(); + widthunitsstore_->clear(); + vector<string> normalunits = buildLengthUnitList(); + if (ibox) { + vector<string>::const_iterator it = normalunits.begin(); + vector<string>::const_iterator end = normalunits.end(); + for(; it != end; ++it) + (*widthunitsstore_->append())[stringcol_] = *it; + } else { + vector<string>::const_iterator it = normalunits.begin(); + vector<string>::const_iterator end = normalunits.end(); + for(; it != end; ++it) + (*widthunitsstore_->append())[stringcol_] = *it; + // Skip the first item "None" + it = ++gui_names_spec_.begin(); + end = gui_names_spec_.end(); + for(; it != end; ++it) + (*widthunitsstore_->append())[stringcol_] = *it; + } + + int const store_size = widthunitsstore_->children().size(); + if (initselection >= store_size) { + widthunitscombo_->set_active(0); + onWidthChanged(); + } else { + widthunitscombo_->set_active(initselection); + } + applylock_ = oldlock; +} + + +void GBox::updateInnerBoxCombo() +{ + bool const oldlock = applylock_; + applylock_ = true; + // with "frameless" boxes, inner box is mandatory (i.e. is the actual box) + // we have to remove "none" then and adjust the combo + + // default: minipage + unsigned int i = 2; + if (!controller().params().inner_box) + // none + i = 0; + if (controller().params().use_parbox) + // parbox + i = 1; + bool frameless = (controller().params().type == "Frameless"); + + int const oldsize = innerboxstore_->children().size(); + // Store the initial selection in 0,1,2 format + int oldselection = -1; + if (oldsize == 2) + oldselection = innerboxcombo_->get_active_row_number() + 1; + else if (oldsize == 3) + oldselection = innerboxcombo_->get_active_row_number(); + + if (frameless && oldsize != 2) { + innerboxstore_->clear(); + (*innerboxstore_->append())[stringcol_] = _("Parbox"); + (*innerboxstore_->append())[stringcol_] = _("Minipage"); + // Cope when the backend asks for no inner box in + // a frameless box + if (i == 0) { + applylock_ = false; + innerboxcombo_->set_active(i); + applylock_ = true; + } else + innerboxcombo_->set_active(i - 1); + } else if (!frameless && oldsize != 3) { + innerboxstore_->clear(); + (*innerboxstore_->append())[stringcol_] = _("None"); + (*innerboxstore_->append())[stringcol_] = _("Parbox"); + (*innerboxstore_->append())[stringcol_] = _("Minipage"); + innerboxcombo_->set_active(i); + } else { + // we're not changing the liststore, just selecting i + if (!frameless) + innerboxcombo_->set_active(i); + if (frameless) + innerboxcombo_->set_active(i - 1); + } + + // Update the width units list if we've changed inner box type + if (i != oldselection) + setSpecial(i != 0); + + applylock_ = oldlock; +} + + +void GBox::onInnerBoxComboChanged() +{ + if (applylock_) + return; + + controller().params().use_parbox = + (*innerboxcombo_->get_active())[stringcol_] == _("Parbox"); + + bool const ibox = (*innerboxcombo_->get_active())[stringcol_] != _("None"); + controller().params().inner_box = ibox; + setSpecial(ibox); + + boxvertcombo_->set_sensitive(ibox); + contentvertcombo_->set_sensitive(ibox); + contenthorzcombo_->set_sensitive(!ibox); + heightspin_->set_sensitive(ibox); + heightunitscombo_->set_sensitive(ibox); + // wtf? form_->set_sensitive(ibox); + + controller().dispatchParams(); +} + + +void GBox::onTypeComboChanged() +{ + int const index = typecombo_->get_active_row_number(); + controller().params().type = ids_[index]; + + bool frameless = (index == 0); + if (frameless) { + boxvertcombo_->set_sensitive(true); + contentvertcombo_->set_sensitive(true); + contenthorzcombo_->set_sensitive(false); + heightspin_->set_sensitive(true); + heightunitscombo_->set_sensitive(true); + //wtf? form_->setSpecial(true); + } + //int itype = innerboxcombo_->get_active_row_number(); + controller().dispatchParams(); + + updateInnerBoxCombo(); +} + + +void GBox::onHeightChanged() +{ + if (applylock_) + return; + + // "None" + int i = 0; + bool spec = false; + Glib::ustring special = (*heightunitscombo_->get_active())[stringcol_]; + for (int j = 1; j < gui_names_spec_.size() ; ++j) { + if (gui_names_spec_[j] == special) { + i=j; + spec = true; + } + } + controller().params().height_special = ids_spec_[i]; + + string height; + if (spec) { + height = heightspin_->get_text(); + // beware: bogosity! the unit is simply ignored in this case + height += "in"; + } else { + Glib::ustring const heightunit = + (*heightunitscombo_->get_active())[stringcol_]; + height = heightspin_->get_text() + heightunit; + } + + controller().params().height = LyXLength(height); + controller().dispatchParams(); +} + + +void GBox::onWidthChanged() +{ + if (applylock_) + return; + + int i = 0; + bool spec = false; + Glib::ustring special = (*widthunitscombo_->get_active())[stringcol_]; + for (int j = 1; j < gui_names_spec_.size() ; ++j) { + if (gui_names_spec_[j] == special) { + i=j; + spec = true; + } + } + controller().params().special = ids_spec_[i]; + + string width; + if (spec) { + width = widthspin_->get_text(); + // beware: bogosity! the unit is simply ignored in this case + width += "in"; + } else { + Glib::ustring const widthunit = + (*widthunitscombo_->get_active())[stringcol_]; + width = widthspin_->get_text() + widthunit; + } + + controller().params().width = LyXLength(width); + controller().dispatchParams(); +} + + +void GBox::onAlignChanged() +{ + if (applylock_) + return; + + controller().params().pos = + "tcb"[boxvertcombo_->get_active_row_number()]; + controller().params().inner_pos = + "tcbs"[contenthorzcombo_->get_active_row_number()]; + controller().params().hor_pos = + "lcrs"[contentvertcombo_->get_active_row_number()]; + + controller().dispatchParams(); +} + +} // namespace frontend +} // namespace lyx Index: GBox.h =================================================================== RCS file: GBox.h diff -N GBox.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ GBox.h 14 Nov 2004 14:50:15 -0000 @@ -0,0 +1,88 @@ +// -*- C++ -*- +/** + * \file GBox.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author John Spray + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef GBOX_H +#define GBOX_H + +#include "GViewBase.h" + +#include "lyxlength.h" + +#include <vector> +#include <string> + +namespace lyx { +namespace frontend { + +class ControlBox; + +class GBox + : public GViewCB<ControlBox, GViewGladeB> +{ +public: + GBox(Dialog &); + + // This dialog is instant-apply + virtual void apply() {} + // update + virtual void update(); + // build the dialog + virtual void doBuild(); + + // Put strings into combo + void PopulateComboBox(Gtk::ComboBox * combo, + std::vector<std::string> const & strings); + + // add or remove special lengths in widthunits combo + void setSpecial(bool ibox); + // only show valid inner box options + void updateInnerBoxCombo(); + + // Signal handlers + void onTypeComboChanged(); + void onInnerBoxComboChanged(); + void onAlignChanged(); + void onHeightChanged(); + void onWidthChanged(); + + // Some event handlers are disabled when this is true + bool applylock_; + + // The 'type' field keys and display strings + std::vector<std::string> ids_; + std::vector<std::string> gui_names_; + + // The special units for width and height + std::vector<std::string> ids_spec_; + std::vector<std::string> gui_names_spec_; + + // Widgets from glade + Gtk::ComboBox * typecombo_; + Gtk::ComboBox * innerboxcombo_; + Glib::RefPtr<Gtk::ListStore> innerboxstore_; + Gtk::ComboBox * widthunitscombo_; + Glib::RefPtr<Gtk::ListStore> widthunitsstore_; + Gtk::ComboBox * heightunitscombo_; + Gtk::ComboBox * boxvertcombo_; + Gtk::ComboBox * contentvertcombo_; + Gtk::ComboBox * contenthorzcombo_; + Gtk::SpinButton * widthspin_; + Gtk::SpinButton * heightspin_; + + // Treemodel objects for use in combobox liststores + Gtk::TreeModelColumn<Glib::ustring> stringcol_; + Gtk::TreeModel::ColumnRecord cols_; +}; + +} // namespace frontend +} // namespace lyx + +#endif // GBOX_H Index: GGraphics.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/GGraphics.C,v retrieving revision 1.2 diff -u -p -r1.2 GGraphics.C --- GGraphics.C 1 Nov 2004 10:23:11 -0000 1.2 +++ GGraphics.C 14 Nov 2004 14:50:15 -0000 @@ -192,18 +192,6 @@ void GGraphics::doBuild() // Store the identifiers for later origins_ = getSecond(origindata); PopulateComboBox(origincombo_, getFirst(origindata)); - - // set the right default unit - switch (lyxrc.default_papersize) { - case PAPER_DEFAULT: break; - case PAPER_USLETTER: - case PAPER_LEGALPAPER: - case PAPER_EXECUTIVEPAPER: defaultUnit = "in"; break; - case PAPER_A3PAPER: - case PAPER_A4PAPER: - case PAPER_A5PAPER: - case PAPER_B5PAPER: defaultUnit = "cm"; break; - } } @@ -239,28 +227,6 @@ void GGraphics::PopulateComboBox(Gtk::Co } -void GGraphics::updateComboFromLength(Gtk::ComboBox * combo, - LyXLength const & len) -{ - string unit = stringFromUnit(len.unit()); - if (unit.empty()) - unit = defaultUnit; - - Gtk::TreeModel::iterator it = combo->get_model()->children().begin(); - Gtk::TreeModel::iterator end = combo->get_model()->children().end(); - for (; it != end ; ++it) { - if ((*it)[stringcol_] == unit) { - combo->set_active(it); - return; - } - } - // Fallen through, we didn't find the target length! - combo->set_active(0); - lyxerr << "GGraphics::updateComboFromLength: couldn't find " - "target unit '" << unit << "'\n"; -} - - void GGraphics::apply() { // Create the parameters structure and fill the data from the dialog. @@ -368,6 +334,9 @@ void GGraphics::apply() void GGraphics::update() { + // set the right default unit + defaultUnit = getDefaultUnit(); + // Update dialog with details from inset InsetGraphicsParams & igp = controller().params(); @@ -397,9 +366,11 @@ void GGraphics::update() { outputscalespin_->get_adjustment()->set_value(igp.scale); widthspin_->get_adjustment()->set_value(igp.width.value()); - updateComboFromLength(widthunitscombo_, igp.width); + unitsComboFromLength(widthunitscombo_, stringcol_, + igp.width, defaultUnit); heightspin_->get_adjustment()->set_value(igp.height.value()); - updateComboFromLength(heightunitscombo_, igp.height); + unitsComboFromLength(heightunitscombo_, stringcol_, + igp.height, defaultUnit); if (!float_equal(igp.scale, 0.0, 0.05)) { // scaling sizing mode @@ -470,7 +441,8 @@ void GGraphics::updateBB(string const & righttopxspin_->set_text(""); righttopyspin_->set_text(""); } - updateComboFromLength(bbunitscombo_,LyXLength("bp")); + unitsComboFromLength(bbunitscombo_, stringcol_, + LyXLength("bp"), defaultUnit); } else { // get the values from the inset lyxerr[Debug::GRAPHICS] @@ -480,7 +452,7 @@ void GGraphics::updateBB(string const & LyXLength anyLength; anyLength = LyXLength(token(bb_inset, ' ', 0)); - updateComboFromLength(bbunitscombo_, anyLength); + unitsComboFromLength(bbunitscombo_, stringcol_, anyLength, defaultUnit); leftbottomxspin_->get_adjustment()->set_value(anyLength.value()); @@ -533,7 +505,8 @@ void GGraphics::onBBFromFileClicked() leftbottomyspin_->set_text(token(bb, ' ', 1)); righttopxspin_->set_text(token(bb, ' ', 2)); righttopyspin_->set_text(token(bb, ' ', 3)); - updateComboFromLength(bbunitscombo_,LyXLength("bp")); + unitsComboFromLength(bbunitscombo_, stringcol_, + LyXLength("bp"), defaultUnit); } controller().bbChanged = false; } else { @@ -541,7 +514,8 @@ void GGraphics::onBBFromFileClicked() leftbottomyspin_->set_text(""); righttopxspin_->set_text(""); righttopyspin_->set_text(""); - updateComboFromLength(bbunitscombo_,LyXLength("bp")); + unitsComboFromLength(bbunitscombo_, stringcol_, + LyXLength("bp"), defaultUnit); } bc().input(ButtonPolicy::SMI_VALID); } Index: GGraphics.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/GGraphics.h,v retrieving revision 1.1 diff -u -p -r1.1 GGraphics.h --- GGraphics.h 26 Oct 2004 09:10:16 -0000 1.1 +++ GGraphics.h 14 Nov 2004 14:50:16 -0000 @@ -45,9 +45,6 @@ private: void PopulateComboBox(Gtk::ComboBox * combo, std::vector<std::string> const & strings); - void updateComboFromLength(Gtk::ComboBox * combo, - LyXLength const & len); - bool updating_; /// Store the LaTeX names for the rotation origins. Index: Makefile.am =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/Makefile.am,v retrieving revision 1.30 diff -u -p -r1.30 Makefile.am --- Makefile.am 26 Oct 2004 21:16:43 -0000 1.30 +++ Makefile.am 14 Nov 2004 14:50:16 -0000 @@ -24,6 +24,8 @@ libgtk_la_SOURCES = \ GAboutlyx.h \ GBC.C \ GBC.h \ + GBox.C \ + GBox.h \ GChanges.C \ GChanges.h \ GCharacter.C \ @@ -108,7 +110,6 @@ xforms_objects = \ ../xforms/fdesign_base.lo \ ../xforms/FormBibitem.lo \ ../xforms/FormBibtex.lo \ - ../xforms/FormBox.lo \ ../xforms/FormBranch.lo \ ../xforms/FormBrowser.lo \ ../xforms/FormCitation.lo \ Index: ghelpers.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/ghelpers.C,v retrieving revision 1.4 diff -u -p -r1.4 ghelpers.C --- ghelpers.C 26 Oct 2004 09:10:16 -0000 1.4 +++ ghelpers.C 14 Nov 2004 14:50:16 -0000 @@ -12,8 +12,8 @@ #include "ghelpers.h" +#include "lyxrc.h" #include "debug.h" -#include "lengthcommon.h" #include "support/filetools.h" #include "support/path_defines.h" @@ -23,6 +23,46 @@ using std::vector; namespace lyx { namespace frontend { + +string const getDefaultUnit() +{ + switch (lyxrc.default_papersize) { + case PAPER_DEFAULT: return "cm"; + case PAPER_USLETTER: + case PAPER_LEGALPAPER: + case PAPER_EXECUTIVEPAPER: return "in"; break; + case PAPER_A3PAPER: + case PAPER_A4PAPER: + case PAPER_A5PAPER: + case PAPER_B5PAPER: return "cm"; break; + } +} + + +void unitsComboFromLength(Gtk::ComboBox * combo, + Gtk::TreeModelColumn<Glib::ustring> const & stringcol, + LyXLength const & len, + std::string defunit) +{ + string unit = stringFromUnit(len.unit()); + if (unit.empty()) + unit = defunit; + + Gtk::TreeModel::iterator it = combo->get_model()->children().begin(); + Gtk::TreeModel::iterator end = combo->get_model()->children().end(); + for (; it != end ; ++it) { + if ((*it)[stringcol] == unit) { + combo->set_active(it); + return; + } + } + + // Fallen through, we didn't find the target length! + combo->set_active(0); + lyxerr << "unitsComboFromLength: couldn't find " + "target unit '" << unit << "'\n"; +} + vector<string> const buildLengthUnitList() { Index: ghelpers.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/gtk/ghelpers.h,v retrieving revision 1.4 diff -u -p -r1.4 ghelpers.h --- ghelpers.h 26 Oct 2004 09:10:16 -0000 1.4 +++ ghelpers.h 14 Nov 2004 14:50:16 -0000 @@ -12,11 +12,22 @@ #ifndef GHELPERS_H #define GHELPERS_H +#include "lengthcommon.h" + +#include <gtkmm.h> + #include <string> #include <vector> namespace lyx { namespace frontend { + +std::string const getDefaultUnit(); + +void unitsComboFromLength(Gtk::ComboBox * combo, + Gtk::TreeModelColumn<Glib::ustring> const & stringcol, + LyXLength const & len, + std::string defunit); std::vector<std::string> const buildLengthUnitList(); Index: glade/box.glade =================================================================== RCS file: glade/box.glade diff -N glade/box.glade --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ glade/box.glade 14 Nov 2004 14:50:16 -0000 @@ -0,0 +1,550 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> + +<glade-interface> + +<widget class="GtkDialog" id="dialog"> + <property name="title" translatable="yes">dialog1</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="Close"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-close</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-7</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Box</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment11"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">6</property> + <property name="bottom_padding">6</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + + <child> + <widget class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="label" translatable="yes">T_ype:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">Type</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Inner Box:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">InnerBox</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="InnerBox"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="Type"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Size</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment10"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">6</property> + <property name="bottom_padding">6</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">3</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + + <child> + <widget class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Width:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">Width</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Height:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">Height</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="HeightUnits"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="WidthUnits"> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="Width"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">666 0 10000 1 10 10</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="Height"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">666 0 10000 1 10 10</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Alignment</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">6</property> + <property name="bottom_padding">6</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="n_rows">3</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + + <child> + <widget class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Box vertical:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">BoxVertical</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="label" translatable="yes">C_ontent vertical:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">ContentVertical</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="label" translatable="yes">Co_ntent horizontal:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">ContentHorizontal</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="ContentVertical"> + <property name="visible">True</property> + <property name="items" translatable="yes">Top +Center +Bottom +Fill</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="BoxVertical"> + <property name="visible">True</property> + <property name="items" translatable="yes">Top +Center +Bottom</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="ContentHorizontal"> + <property name="visible">True</property> + <property name="items" translatable="yes">Left +Center +Right +Fill</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +</glade-interface>