GTK Box dialog

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9239 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
John Spray 2004-11-14 17:10:04 +00:00
parent 77384eb8f6
commit 5352478c93
11 changed files with 1145 additions and 48 deletions

View File

@ -1,3 +1,11 @@
2004-11-14 John Spray <spray_john@users.sourceforge.net>
* 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 <lasgouttes@lyx.org>
* GToolbar.C (selected): use layoutSelected()

View File

@ -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 const & name)
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()));

427
src/frontends/gtk/GBox.C Normal file
View File

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

88
src/frontends/gtk/GBox.h Normal file
View File

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

View File

@ -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::ComboBox * combo,
}
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 & filename, string const & bb_inset)
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 & filename, string const & bb_inset)
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);
}

View File

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

View File

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

View File

@ -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"
@ -24,6 +24,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()
{
vector<string> data(unit_name_gui, unit_name_gui + num_units);

View File

@ -12,12 +12,23 @@
#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();
/** name is the name of the glade file, without path or extension.

View File

@ -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">&lt;b&gt;Box&lt;/b&gt;</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">&lt;b&gt;Size&lt;/b&gt;</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">&lt;b&gt;Alignment&lt;/b&gt;</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>