X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiBox.cpp;h=087f8663a64c36e337f878d83bacda1dbba102ce;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=fde1ba6b13233c4c4f2a8c555aa8e622ea21f7b9;hpb=887bd847c6bc413531c388dbc2fcb26411d2266c;p=lyx.git diff --git a/src/frontends/qt4/GuiBox.cpp b/src/frontends/qt4/GuiBox.cpp index fde1ba6b13..087f8663a6 100644 --- a/src/frontends/qt4/GuiBox.cpp +++ b/src/frontends/qt4/GuiBox.cpp @@ -3,9 +3,9 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna (Minipage stuff) + * \author Jürgen Vigna (Minipage stuff) * \author Martin Vermeer - * \author Jürgen Spitzmüller + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -14,67 +14,110 @@ #include "GuiBox.h" +#include "FuncRequest.h" #include "LengthCombo.h" +#include "Length.h" #include "qt_helpers.h" -#include "lengthcommon.h" -#include "LyXRC.h" // to set the default length values #include "Validator.h" #include "insets/InsetBox.h" +#include "support/gettext.h" +#include "support/foreach.h" #include "support/lstrings.h" #include #include -#include +#ifdef IN +#undef IN +#endif + +using namespace std; -using std::string; namespace lyx { namespace frontend { -GuiBoxDialog::GuiBoxDialog(LyXView & lv) - : GuiDialog(lv, "box") +static QStringList boxGuiIds() +{ + return QStringList() + << "Frameless" << "Boxed" + << "ovalbox" << "Ovalbox" + << "Shadowbox" << "Shaded" + << "Doublebox"; +} + + +static QStringList boxGuiNames() +{ + return QStringList() + << qt_("No frame") << qt_("Simple rectangular frame") + << qt_("Oval frame, thin") << qt_("Oval frame, thick") + << qt_("Drop shadow") << qt_("Shaded background") + << qt_("Double rectangular frame"); +} + + +static QStringList boxGuiSpecialLengthIds() +{ + return QStringList() << "height" << "depth" + << "totalheight" << "width"; +} + + +static QStringList boxGuiSpecialLengthNames() +{ + return QStringList() << qt_("Height") << qt_("Depth") + << qt_("Total Height") << qt_("Width"); +} + + +GuiBox::GuiBox(GuiView & lv) + : GuiDialog(lv, "box", qt_("Box Settings")), params_("") { setupUi(this); - setViewTitle(_("Box Settings")); - setController(new ControlBox(*this)); // fill the box type choice - box_gui_tokens(ids_, gui_names_); - for (unsigned int i = 0; i < gui_names_.size(); ++i) - typeCO->addItem(toqstr(gui_names_[i])); + ids_ = boxGuiIds(); + gui_names_ = boxGuiNames(); + foreach (QString const & str, gui_names_) + typeCO->addItem(str); // add the special units to the height choice // width needs different handling - box_gui_tokens_special_length(ids_spec_, gui_names_spec_); - for (unsigned int i = 1; i < gui_names_spec_.size(); ++i) - heightUnitsLC->addItem(toqstr(gui_names_spec_[i])); + ids_spec_ = boxGuiSpecialLengthIds(); + gui_names_spec_ = boxGuiSpecialLengthNames(); + for (int i = 0; i != ids_spec_.size(); ++i) + heightUnitsLC->addItem(gui_names_spec_[i], ids_spec_[i]); connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore())); connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK())); connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply())); connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose())); - connect(widthED, SIGNAL(textChanged(const QString &)), + connect(widthED, SIGNAL(textChanged(QString)), this, SLOT(change_adaptor())); connect(widthUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT)), this, SLOT(change_adaptor())); - connect(valignCO, SIGNAL(highlighted(const QString &)), + connect(valignCO, SIGNAL(highlighted(QString)), + this, SLOT(change_adaptor())); + connect(heightCB, SIGNAL(stateChanged(int)), this, SLOT(change_adaptor())); - connect(heightED, SIGNAL(textChanged(const QString &)), + connect(heightED, SIGNAL(textChanged(QString)), this, SLOT(change_adaptor())); - connect(heightUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT) ), + connect(heightUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT)), this, SLOT(change_adaptor())); connect(restorePB, SIGNAL(clicked()), this, SLOT(restoreClicked())); connect(typeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); connect(typeCO, SIGNAL(activated(int)), this, SLOT(typeChanged(int))); connect(halignCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); connect(ialignCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); - connect(innerBoxCO, SIGNAL(activated(const QString&)), - this, SLOT(innerBoxChanged(const QString &))); + connect(innerBoxCO, SIGNAL(activated(QString)), + this, SLOT(innerBoxChanged(QString))); connect(innerBoxCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); + connect(pagebreakCB, SIGNAL(stateChanged(int)), + this, SLOT(pagebreakClicked())); heightED->setValidator(unsignedLengthValidator(heightED)); widthED->setValidator(unsignedLengthValidator(widthED)); @@ -87,9 +130,11 @@ GuiBoxDialog::GuiBoxDialog(LyXView & lv) bc().addReadOnly(ialignCO); bc().addReadOnly(halignCO); bc().addReadOnly(widthED); - bc().addReadOnly(heightED); bc().addReadOnly(widthUnitsLC); + bc().addReadOnly(heightCB); + bc().addReadOnly(heightED); bc().addReadOnly(heightUnitsLC); + bc().addReadOnly(pagebreakCB); bc().setRestore(restorePB); bc().setOK(okPB); @@ -98,254 +143,231 @@ GuiBoxDialog::GuiBoxDialog(LyXView & lv) // initialize the length validator bc().addCheckedLineEdit(widthED, widthLA); - bc().addCheckedLineEdit(heightED, heightLA); + bc().addCheckedLineEdit(heightED, heightCB); } -ControlBox & GuiBoxDialog::controller() -{ - return static_cast(GuiDialog::controller()); -} - - -void GuiBoxDialog::closeEvent(QCloseEvent * e) -{ - slotClose(); - e->accept(); -} - - -void GuiBoxDialog::change_adaptor() +void GuiBox::change_adaptor() { changed(); } -void GuiBoxDialog::innerBoxChanged(const QString & str) +void GuiBox::innerBoxChanged(QString const & str) { bool const ibox = (str != qt_("None")); valignCO->setEnabled(ibox); ialignCO->setEnabled(ibox); halignCO->setEnabled(!ibox); - heightED->setEnabled(ibox); - heightUnitsLC->setEnabled(ibox); + heightCB->setEnabled(ibox); + pagebreakCB->setEnabled(!ibox && typeCO->currentIndex() == 1); + heightED->setEnabled(heightCB->checkState() == Qt::Checked && ibox); + heightUnitsLC->setEnabled(heightCB->checkState() == Qt::Checked && ibox); setSpecial(ibox); } -void GuiBoxDialog::typeChanged(int index) +void GuiBox::typeChanged(int index) { bool const frameless = (index == 0); if (frameless) { valignCO->setEnabled(true); ialignCO->setEnabled(true); halignCO->setEnabled(false); - heightED->setEnabled(true); - heightUnitsLC->setEnabled(true); + heightCB->setEnabled(true); + heightED->setEnabled(heightCB->checkState() == Qt::Checked); + heightUnitsLC->setEnabled(heightCB->checkState() == Qt::Checked); setSpecial(true); } + if (index != 1) + pagebreakCB->setChecked(false); int itype = innerBoxCO->currentIndex(); + if (innerBoxCO->count() == 2) + ++itype; + pagebreakCB->setEnabled(index == 1 && itype == 0); + widthED->setEnabled(index != 5); + widthUnitsLC->setEnabled(index != 5); setInnerType(frameless, itype); } -void GuiBoxDialog::restoreClicked() +void GuiBox::restoreClicked() { setInnerType(true, 2); widthED->setText("100"); widthUnitsLC->setCurrentItem(Length::PCW); + heightCB->setCheckState(Qt::Checked); heightED->setText("1"); - for (int j = 0; j < heightUnitsLC->count(); j++) { - if (heightUnitsLC->itemText(j) == qt_("Total Height")) - heightUnitsLC->setCurrentItem(j); + heightUnitsLC->setCurrentItem("totalheight"); +} + + +void GuiBox::pagebreakClicked() +{ + bool pbreak = (pagebreakCB->checkState() == Qt::Checked); + innerBoxCO->setEnabled(!pbreak); + widthED->setEnabled(!pbreak); + widthUnitsLC->setEnabled(!pbreak); + if (pbreak) { + valignCO->setEnabled(false); + ialignCO->setEnabled(false); + halignCO->setEnabled(false); + heightCB->setEnabled(false); + heightED->setEnabled(false); + heightUnitsLC->setEnabled(false); + setSpecial(false); + } else { + typeChanged(typeCO->currentIndex()); } + change_adaptor(); } -void GuiBoxDialog::updateContents() +void GuiBox::updateContents() { - string type(controller().params().type); - for (unsigned int i = 0; i < gui_names_.size(); ++i) { + QString type = toqstr(params_.type); + if (type == "Framed") { + pagebreakCB->setChecked(true); + type = "Boxed"; + } else { + pagebreakCB->setChecked(false); + } + + pagebreakCB->setEnabled(type == "Boxed" && !params_.inner_box); + + for (int i = 0; i != gui_names_.size(); ++i) { if (type == ids_[i]) typeCO->setCurrentIndex(i); } // default: minipage - unsigned int inner_type = 2; - if (!controller().params().inner_box) + int inner_type = 2; + if (!params_.inner_box) // none inner_type = 0; - if (controller().params().use_parbox) + if (params_.use_parbox) // parbox inner_type = 1; - bool frameless = (controller().params().type == "Frameless"); + bool frameless = (params_.type == "Frameless"); setInnerType(frameless, inner_type); - char c = controller().params().pos; + char c = params_.pos; valignCO->setCurrentIndex(string("tcb").find(c, 0)); - c = controller().params().inner_pos; + c = params_.inner_pos; ialignCO->setCurrentIndex(string("tcbs").find(c, 0)); - c = controller().params().hor_pos; + c = params_.hor_pos; halignCO->setCurrentIndex(string("lcrs").find(c, 0)); - bool ibox = controller().params().inner_box; + bool ibox = params_.inner_box; valignCO->setEnabled(ibox); ialignCO->setEnabled(ibox); halignCO->setEnabled(!ibox); setSpecial(ibox); - Length::UNIT default_unit = - (lyxrc.default_papersize > 3) ? Length::CM : Length::IN; + Length::UNIT const default_unit = Length::defaultUnit(); lengthToWidgets(widthED, widthUnitsLC, - (controller().params().width).asString(), default_unit); - - string const special = controller().params().special; - if (!special.empty() && special != "none") { - QString spc; - for (unsigned int i = 0; i < gui_names_spec_.size(); i++) { - if (special == ids_spec_[i]) - spc = toqstr(gui_names_spec_[i].c_str()); - } - for (int j = 0; j < widthUnitsLC->count(); j++) { - if (widthUnitsLC->itemText(j) == spc) - widthUnitsLC->setCurrentIndex(j); - } - } + (params_.width).asString(), default_unit); - lengthToWidgets(heightED, heightUnitsLC, - (controller().params().height).asString(), default_unit); - - string const height_special = controller().params().height_special; - if (!height_special.empty() && height_special != "none") { - QString hspc; - for (unsigned int i = 0; i < gui_names_spec_.size(); i++) { - if (height_special == ids_spec_[i]) { - hspc = toqstr(gui_names_spec_[i].c_str()); - } - } - for (int j = 0; j < heightUnitsLC->count(); j++) { - if (heightUnitsLC->itemText(j) == hspc) { - heightUnitsLC->setCurrentIndex(j); - } - } - } + QString const special = toqstr(params_.special); + if (!special.isEmpty() && special != "none") + widthUnitsLC->setCurrentItem(special); - heightED->setEnabled(ibox); - heightUnitsLC->setEnabled(ibox); + lengthToWidgets(heightED, heightUnitsLC, + (params_.height).asString(), default_unit); + + QString const height_special = toqstr(params_.height_special); + if (!height_special.isEmpty() && height_special != "none") + heightUnitsLC->setCurrentItem(height_special); + // set no optional height if the value is the default "1\height" + // (special units like \height are handled as "in", + if (height_special == "totalheight" && params_.height == Length("1in")) + heightCB->setCheckState(Qt::Unchecked); + else + heightCB->setCheckState(Qt::Checked); + + heightCB->setEnabled(ibox); } -void GuiBoxDialog::applyView() +void GuiBox::applyView() { - controller().params().type = - ids_[typeCO->currentIndex()]; - - controller().params().inner_box = - innerBoxCO->currentText() != qt_("None"); - controller().params().use_parbox = - innerBoxCO->currentText() == qt_("Parbox"); - - controller().params().pos = - "tcb"[valignCO->currentIndex()]; - controller().params().inner_pos = - "tcbs"[ialignCO->currentIndex()]; - controller().params().hor_pos = - "lcrs"[halignCO->currentIndex()]; - - int i = 0; - bool spec = false; - QString special = widthUnitsLC->currentText(); + bool pagebreak = + pagebreakCB->isEnabled() && pagebreakCB->isChecked(); + if (pagebreak) + params_.type = "Framed"; + else + params_.type = fromqstr(ids_[typeCO->currentIndex()]); + + params_.inner_box = + (!pagebreak && innerBoxCO->currentText() != qt_("None")); + params_.use_parbox = + (!pagebreak && innerBoxCO->currentText() == qt_("Parbox")); + + params_.pos = "tcb"[valignCO->currentIndex()]; + params_.inner_pos = "tcbs"[ialignCO->currentIndex()]; + params_.hor_pos = "lcrs"[halignCO->currentIndex()]; + + QString unit = + widthUnitsLC->itemData(widthUnitsLC->currentIndex()).toString(); QString value = widthED->text(); - if (special == qt_("Height")) { - i = 1; - spec = true; - } else if (special == qt_("Depth")) { - i = 2; - spec = true; - } else if (special == qt_("Total Height")) { - i = 3; - spec = true; - } else if (special == qt_("Width")) { - i = 4; - spec = true; - } - // the user might insert a non-special value in the line edit - if (isValidLength(fromqstr(value))) { - i = 0; - spec = false; - } - controller().params().special = ids_spec_[i]; - - string width; - if (spec) { - width = fromqstr(value); - // beware: bogosity! the unit is simply ignored in this case - width += "in"; - } else - width = widgetsToLength(widthED, widthUnitsLC); - - controller().params().width = Length(width); - - i = 0; - spec = false; - special = heightUnitsLC->currentText(); - value = heightED->text(); - if (special == qt_("Height")) { - i = 1; - spec = true; - } else if (special == qt_("Depth")) { - i = 2; - spec = true; - } else if (special == qt_("Total Height")) { - i = 3; - spec = true; - } else if (special == qt_("Width")) { - i = 4; - spec = true; - } - // the user might insert a non-special value in the line edit - if (isValidLength(fromqstr(value))) { - i = 0; - spec = false; + if (ids_spec_.contains(unit) && !isValidLength(fromqstr(value))) { + params_.special = fromqstr(unit); + // Note: the unit is simply ignored in this case + params_.width = Length(value.toDouble(), Length::IN); + } else { + params_.special = "none"; + params_.width = Length(widgetsToLength(widthED, widthUnitsLC)); } - controller().params().height_special = ids_spec_[i]; - - string height; - if (spec && !isValidLength(fromqstr(heightED->text()))) { - height = fromqstr(value); - // beware: bogosity! the unit is simply ignored in this case - height += "in"; - } else - height = widgetsToLength(heightED, heightUnitsLC); - controller().params().height = Length(height); + // the height parameter is omitted if the value + // is "1in" and "Total Height" is used as unit. + // 1in + "Total Height" means "1\height" which is the LaTeX default + // if no height is given + if (heightCB->checkState() == Qt::Unchecked) { + params_.height = Length("1in"); + params_.height_special = "totalheight"; + } else { + unit = heightUnitsLC->itemData(heightUnitsLC->currentIndex()).toString(); + value = heightED->text(); + if (ids_spec_.contains(unit) && !isValidLength(fromqstr(value))) { + params_.height_special = fromqstr(unit); + // Note: the unit is simply ignored in this case + params_.height = Length(value.toDouble(), Length::IN); + } else { + params_.height_special = "none"; + params_.height = + Length(widgetsToLength(heightED, heightUnitsLC)); + } + } } -void GuiBoxDialog::setSpecial(bool ibox) +void GuiBox::setSpecial(bool ibox) { - box_gui_tokens_special_length(ids_spec_, gui_names_spec_); + QString const last_item = + widthUnitsLC->itemData(heightUnitsLC->currentIndex()).toString(); + // check if the widget contains the special units - int count = widthUnitsLC->count(); - bool has_special = false; - for (int i = 0; i < count; i++) - if (widthUnitsLC->itemText(i).contains(qt_("Total Height")) > 0) - has_special = true; + bool const has_special = (widthUnitsLC->findData("totalheight") != -1); // insert 'em if needed... if (!ibox && !has_special) { - for (unsigned int i = 1; i < gui_names_spec_.size(); i++) - widthUnitsLC->addItem(toqstr(gui_names_spec_[i])); + for (int i = 1; i < ids_spec_.size(); ++i) + widthUnitsLC->addItem(gui_names_spec_[i], ids_spec_[i]); // ... or remove 'em if needed } else if (ibox && has_special) { - widthUnitsLC->clear(); - for (int i = 0; i < num_units; i++) - widthUnitsLC->addItem(qt_(unit_name_gui[i])); + for (int i = 1; i < ids_spec_.size(); ++i) { + int n = widthUnitsLC->findData(ids_spec_[i]); + if (n != -1) + widthUnitsLC->removeItem(n); + } } + // restore selected text, if possible + widthUnitsLC->setCurrentItem(last_item); } -void GuiBoxDialog::setInnerType(bool frameless, int i) +void GuiBox::setInnerType(bool frameless, int i) { // with "frameless" boxes, inner box is mandatory (i.e. is the actual box) // we have to remove "none" then and adjust the combo @@ -353,10 +375,11 @@ void GuiBoxDialog::setInnerType(bool frameless, int i) innerBoxCO->clear(); innerBoxCO->addItem(qt_("Parbox")); innerBoxCO->addItem(qt_("Minipage")); - innerBoxCO->setCurrentIndex(i - 1); + if (i != 0) + innerBoxCO->setCurrentIndex(i - 1); + else + innerBoxCO->setCurrentIndex(i); } else { - if (innerBoxCO->count() == 2) - ++i; innerBoxCO->clear(); innerBoxCO->addItem(qt_("None")); innerBoxCO->addItem(qt_("Parbox")); @@ -365,8 +388,30 @@ void GuiBoxDialog::setInnerType(bool frameless, int i) } } +bool GuiBox::initialiseParams(string const & data) +{ + InsetBox::string2params(data, params_); + return true; +} + + +void GuiBox::clearParams() +{ + params_ = InsetBoxParams(""); +} + + +void GuiBox::dispatchParams() +{ + dispatch(FuncRequest(getLfun(), InsetBox::params2string(params_))); +} + + +Dialog * createGuiBox(GuiView & lv) { return new GuiBox(lv); } + + } // namespace frontend } // namespace lyx -#include "GuiBox_moc.cpp" +#include "moc_GuiBox.cpp"