X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiTabular.cpp;h=2a6a26bb3aa7b86aa0b6154e938eab4bc45e0d12;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=dbce9dc6f65b92791bbdc9c516a9416966e5ec7f;hpb=71c44aa9d04e863671a48cfa680edd17aa3514d5;p=lyx.git diff --git a/src/frontends/qt4/GuiTabular.cpp b/src/frontends/qt4/GuiTabular.cpp index dbce9dc6f6..2a6a26bb3a 100644 --- a/src/frontends/qt4/GuiTabular.cpp +++ b/src/frontends/qt4/GuiTabular.cpp @@ -6,6 +6,7 @@ * \author John Levon * \author Jürgen Spitzmüller * \author Herbert Voß + * \author Uwe Stöhr * * Full author contact details are available in file CREDITS. */ @@ -23,6 +24,8 @@ #include "BufferView.h" #include "Cursor.h" #include "FuncRequest.h" +#include "FuncStatus.h" +#include "LyXFunc.h" #include "insets/InsetTabular.h" @@ -39,70 +42,128 @@ namespace frontend { GuiTabular::GuiTabular(GuiView & lv) : GuiDialog(lv, "tabular", qt_("Table Settings")), // tabular_ is initialised at dialog construction in initialiseParams() - tabular_(*lv.buffer(), 0, 0) + tabular_(&(lv.currentBufferView()->buffer()), 0, 0), + applying_(false) { active_cell_ = Tabular::npos; setupUi(this); + connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK())); + connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply())); + connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose())); + connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore())); + + // Manage the restore, ok, apply, restore and cancel/close buttons + bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy); + bc().setOK(okPB); + bc().setApply(applyPB); + bc().setCancel(closePB); + bc().setRestore(restorePB); + widthED->setValidator(unsignedLengthValidator(widthED)); topspaceED->setValidator(new LengthValidator(topspaceED)); bottomspaceED->setValidator(new LengthValidator(bottomspaceED)); interlinespaceED->setValidator(new LengthValidator(interlinespaceED)); - connect(topspaceED, SIGNAL(returnPressed()), - this, SLOT(topspace_changed())); + widthUnitCB->setCurrentItem(Length::defaultUnit()); + + connect(topspaceED, SIGNAL(textChanged(QString)), + this, SLOT(change_adaptor())); connect(topspaceUnit, SIGNAL(selectionChanged(lyx::Length::UNIT)), + this, SLOT(change_adaptor())); + connect(topspaceCO, SIGNAL(activated(int)), this, SLOT(topspace_changed())); - connect(topspaceCO, SIGNAL(activated(int)), this, SLOT(topspace_changed())); - connect(bottomspaceED, SIGNAL(returnPressed()), - this, SLOT(bottomspace_changed())); + connect(bottomspaceED, SIGNAL(textChanged(QString)), + this, SLOT(change_adaptor())); connect(bottomspaceUnit, SIGNAL(selectionChanged(lyx::Length::UNIT)), + this, SLOT(change_adaptor())); + connect(bottomspaceCO, SIGNAL(activated(int)), this, SLOT(bottomspace_changed())); - connect(bottomspaceCO, SIGNAL(activated(int)), this, SLOT(bottomspace_changed())); - connect(interlinespaceED, SIGNAL(returnPressed()), - this, SLOT(interlinespace_changed())); + connect(interlinespaceED, SIGNAL(textChanged(QString)), + this, SLOT(change_adaptor())); connect(interlinespaceUnit, SIGNAL(selectionChanged(lyx::Length::UNIT)), + this, SLOT(change_adaptor())); + connect(interlinespaceCO, SIGNAL(activated(int)), this, SLOT(interlinespace_changed())); - connect(interlinespaceCO, SIGNAL(activated(int)), this, SLOT(interlinespace_changed())); - connect(booktabsRB, SIGNAL(clicked(bool)), this, SLOT(booktabsChanged(bool))); - connect(borderDefaultRB, SIGNAL(clicked(bool)), this, SLOT(booktabsChanged(bool))); - connect(borderSetPB, SIGNAL(clicked()), this, SLOT(borderSet_clicked())); - connect(borderUnsetPB, SIGNAL(clicked()), this, SLOT(borderUnset_clicked())); - connect(longTabularCB, SIGNAL(toggled(bool)), longtableGB, SLOT(setEnabled(bool))); - connect(longTabularCB, SIGNAL(toggled(bool)), newpageCB, SLOT(setEnabled(bool))); - connect(hAlignCB, SIGNAL(activated(int)), this, SLOT(hAlign_changed(int))); - connect(vAlignCB, SIGNAL(activated(int)), this, SLOT(vAlign_changed(int))); - connect(multicolumnCB, SIGNAL(clicked()), this, SLOT(multicolumn_clicked())); - connect(newpageCB, SIGNAL(clicked()), this, SLOT(ltNewpage_clicked())); - connect(headerStatusCB, SIGNAL(clicked()), this, SLOT(ltHeaderStatus_clicked())); - connect(headerBorderAboveCB, SIGNAL(clicked()), this, SLOT(ltHeaderBorderAbove_clicked())); - connect(headerBorderBelowCB, SIGNAL(clicked()), this, SLOT(ltHeaderBorderBelow_clicked())); - connect(firstheaderStatusCB, SIGNAL(clicked()), this, SLOT(ltFirstHeaderStatus_clicked())); - connect(firstheaderBorderAboveCB, SIGNAL(clicked()), this, SLOT(ltFirstHeaderBorderAbove_clicked())); - connect(firstheaderBorderBelowCB, SIGNAL(clicked()), this, SLOT(ltFirstHeaderBorderBelow_clicked())); - connect(firstheaderNoContentsCB, SIGNAL(clicked()), this, SLOT(ltFirstHeaderEmpty_clicked())); - connect(footerStatusCB, SIGNAL(clicked()), this, SLOT(ltFooterStatus_clicked())); - connect(footerBorderAboveCB, SIGNAL(clicked()), this, SLOT(ltFooterBorderAbove_clicked())); - connect(footerBorderBelowCB, SIGNAL(clicked()), this, SLOT(ltFooterBorderBelow_clicked())); - connect(lastfooterStatusCB, SIGNAL(clicked()), this, SLOT(ltLastFooterStatus_clicked())); - connect(lastfooterBorderAboveCB, SIGNAL(clicked()), this, SLOT(ltLastFooterBorderAbove_clicked())); - connect(lastfooterBorderBelowCB, SIGNAL(clicked()), this, SLOT(ltLastFooterBorderBelow_clicked())); - connect(lastfooterNoContentsCB, SIGNAL(clicked()), this, SLOT(ltLastFooterEmpty_clicked())); - connect(specialAlignmentED, SIGNAL(returnPressed()), this, SLOT(specialAlignment_changed())); - connect(widthED, SIGNAL(editingFinished()), this, SLOT(width_changed())); - connect(widthUnit, SIGNAL(selectionChanged(lyx::Length::UNIT)), this, SLOT(width_changed())); - connect(closePB, SIGNAL(clicked()), this, SLOT(close_clicked())); - connect(borders, SIGNAL(topSet(bool)), this, SLOT(topBorder_changed())); - connect(borders, SIGNAL(bottomSet(bool)), this, SLOT(bottomBorder_changed())); - connect(borders, SIGNAL(rightSet(bool)), this, SLOT(rightBorder_changed())); - connect(borders, SIGNAL(leftSet(bool)), this, SLOT(leftBorder_changed())); - connect(rotateTabularCB, SIGNAL(clicked()), this, SLOT(rotateTabular())); - connect(rotateCellCB, SIGNAL(clicked()), this, SLOT(rotateCell())); - connect(longTabularCB, SIGNAL(clicked()), this, SLOT(longTabular())); - - bc().setPolicy(ButtonPolicy::IgnorantPolicy); - + connect(booktabsRB, SIGNAL(clicked(bool)), + this, SLOT(booktabsChanged(bool))); + connect(borderDefaultRB, SIGNAL(clicked(bool)), + this, SLOT(booktabsChanged(bool))); + connect(borderSetPB, SIGNAL(clicked()), + this, SLOT(borderSet_clicked())); + connect(borderUnsetPB, SIGNAL(clicked()), + this, SLOT(borderUnset_clicked())); + connect(longTabularCB, SIGNAL(toggled(bool)), + longtableGB, SLOT(setEnabled(bool))); + connect(longTabularCB, SIGNAL(toggled(bool)), + newpageCB, SLOT(setEnabled(bool))); + connect(longTabularCB, SIGNAL(toggled(bool)), + alignmentGB, SLOT(setEnabled(bool))); + // longtables cannot have a vertical alignment + connect(longTabularCB, SIGNAL(toggled(bool)), + TableAlignCB, SLOT(setDisabled(bool))); + connect(hAlignCB, SIGNAL(activated(int)), + this, SLOT(change_adaptor())); + connect(vAlignCB, SIGNAL(activated(int)), + this, SLOT(change_adaptor())); + connect(multicolumnCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(newpageCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(captionStatusCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(headerStatusCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(headerBorderAboveCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(headerBorderBelowCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(firstheaderStatusCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(firstheaderBorderAboveCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(firstheaderBorderBelowCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(firstheaderNoContentsCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(footerStatusCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(footerBorderAboveCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(footerBorderBelowCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(lastfooterStatusCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(lastfooterBorderAboveCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(lastfooterBorderBelowCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(lastfooterNoContentsCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(specialAlignmentED, SIGNAL(textChanged(QString)), + this, SLOT(change_adaptor())); + connect(widthED, SIGNAL(textChanged(QString)), + this, SLOT(change_adaptor())); + connect(widthUnitCB, SIGNAL(selectionChanged(lyx::Length::UNIT)), + this, SLOT(change_adaptor())); + connect(borders, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(rotateTabularCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(rotateCellCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(TableAlignCB, SIGNAL(activated(int)), + this, SLOT(change_adaptor())); + connect(longTabularCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(leftRB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(centerRB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(rightRB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + bc().addReadOnly(topspaceED); bc().addReadOnly(topspaceUnit); bc().addReadOnly(topspaceCO); @@ -120,9 +181,10 @@ GuiTabular::GuiTabular(GuiView & lv) bc().addReadOnly(rotateTabularCB); bc().addReadOnly(specialAlignmentED); bc().addReadOnly(widthED); - bc().addReadOnly(widthUnit); + bc().addReadOnly(widthUnitCB); bc().addReadOnly(hAlignCB); bc().addReadOnly(vAlignCB); + bc().addReadOnly(TableAlignCB); bc().addReadOnly(borderSetPB); bc().addReadOnly(borderUnsetPB); bc().addReadOnly(borders); @@ -142,7 +204,10 @@ GuiTabular::GuiTabular(GuiView & lv) bc().addReadOnly(lastfooterBorderBelowCB); bc().addReadOnly(lastfooterNoContentsCB); bc().addReadOnly(newpageCB); - + bc().addReadOnly(leftRB); + bc().addReadOnly(centerRB); + bc().addReadOnly(rightRB); + // initialize the length validator bc().addCheckedLineEdit(widthED, fixedWidthColLA); bc().addCheckedLineEdit(topspaceED, topspaceLA); @@ -162,33 +227,20 @@ void GuiTabular::change_adaptor() } -void GuiTabular::booktabsChanged(bool) -{ - changed(); - booktabs(booktabsRB->isChecked()); - update_borders(); -} - - void GuiTabular::topspace_changed() { switch (topspaceCO->currentIndex()) { case 0: { - set(Tabular::SET_TOP_SPACE, ""); topspaceED->setEnabled(false); topspaceUnit->setEnabled(false); break; } case 1: { - set(Tabular::SET_TOP_SPACE, "default"); topspaceED->setEnabled(false); topspaceUnit->setEnabled(false); break; } case 2: { - if (!topspaceED->text().isEmpty()) - set(Tabular::SET_TOP_SPACE, - widgetsToLength(topspaceED, topspaceUnit)); if (!bc().policy().isReadOnly()) { topspaceED->setEnabled(true); topspaceUnit->setEnabled(true); @@ -204,21 +256,16 @@ void GuiTabular::bottomspace_changed() { switch (bottomspaceCO->currentIndex()) { case 0: { - set(Tabular::SET_BOTTOM_SPACE, ""); - bottomspaceED->setEnabled(false); - bottomspaceUnit->setEnabled(false); + bottomspaceED->setEnabled(false); + bottomspaceUnit->setEnabled(false); break; } case 1: { - set(Tabular::SET_BOTTOM_SPACE, "default"); bottomspaceED->setEnabled(false); bottomspaceUnit->setEnabled(false); break; } case 2: { - if (!bottomspaceED->text().isEmpty()) - set(Tabular::SET_BOTTOM_SPACE, - widgetsToLength(bottomspaceED, bottomspaceUnit)); if (!bc().policy().isReadOnly()) { bottomspaceED->setEnabled(true); bottomspaceUnit->setEnabled(true); @@ -234,21 +281,16 @@ void GuiTabular::interlinespace_changed() { switch (interlinespaceCO->currentIndex()) { case 0: { - set(Tabular::SET_INTERLINE_SPACE, ""); - interlinespaceED->setEnabled(false); - interlinespaceUnit->setEnabled(false); + interlinespaceED->setEnabled(false); + interlinespaceUnit->setEnabled(false); break; } case 1: { - set(Tabular::SET_INTERLINE_SPACE, "default"); interlinespaceED->setEnabled(false); interlinespaceUnit->setEnabled(false); break; } case 2: { - if (!interlinespaceED->text().isEmpty()) - set(Tabular::SET_INTERLINE_SPACE, - widgetsToLength(interlinespaceED, interlinespaceUnit)); if (!bc().policy().isReadOnly()) { interlinespaceED->setEnabled(true); interlinespaceUnit->setEnabled(true); @@ -260,350 +302,345 @@ void GuiTabular::interlinespace_changed() } -void GuiTabular::close_clicked() +void GuiTabular::booktabsChanged(bool) { - closeGUI(); - slotClose(); + if (booktabsRB->isChecked()) { + borders->setLeft(false); + borders->setRight(false); + borders->setLeftEnabled(false); + borders->setRightEnabled(false); + } else { + borders->setLeftEnabled(true); + borders->setRightEnabled(true); + } + // repaint the setborder widget + borders->update(); + changed(); } void GuiTabular::borderSet_clicked() { - set(Tabular::SET_ALL_LINES); - update_borders(); + borders->setTop(true); + borders->setBottom(true); + borders->setLeft(true); + borders->setRight(true); + // repaint the setborder widget + borders->update(); changed(); } void GuiTabular::borderUnset_clicked() { - set(Tabular::UNSET_ALL_LINES); - update_borders(); - changed(); -} - - -void GuiTabular::leftBorder_changed() -{ - set(Tabular::TOGGLE_LINE_LEFT); - changed(); -} - - -void GuiTabular::rightBorder_changed() -{ - set(Tabular::TOGGLE_LINE_RIGHT); + borders->setTop(false); + borders->setBottom(false); + borders->setLeft(false); + borders->setRight(false); + // repaint the setborder widget + borders->update(); changed(); } -void GuiTabular::topBorder_changed() +void GuiTabular::update_borders() { - set(Tabular::TOGGLE_LINE_TOP); - changed(); + Tabular::idx_type const cell = getActiveCell(); + borders->setTop(tabular_.topLine(cell)); + borders->setBottom(tabular_.bottomLine(cell)); + borders->setLeft(tabular_.leftLine(cell)); + borders->setRight(tabular_.rightLine(cell)); + borders->setLeftEnabled(!booktabsRB->isChecked()); + borders->setRightEnabled(!booktabsRB->isChecked()); + // repaint the setborder widget + borders->update(); } -void GuiTabular::bottomBorder_changed() -{ - set(Tabular::TOGGLE_LINE_BOTTOM); - changed(); -} - +namespace { -void GuiTabular::specialAlignment_changed() +Length getColumnPWidth(Tabular const & t, size_t cell) { - string special = fromqstr(specialAlignmentED->text()); - setSpecial(special); - changed(); + return t.column_info[t.cellColumn(cell)].p_width; } -void GuiTabular::width_changed() +Length getMColumnPWidth(Tabular const & t, size_t cell) { - changed(); - string const width = widgetsToLength(widthED, widthUnit); - setWidth(width); + if (t.isMultiColumn(cell)) + return t.cellInfo(cell).p_width; + return Length(); } -void GuiTabular::multicolumn_clicked() +docstring getAlignSpecial(Tabular const & t, size_t cell, int what) { - toggleMultiColumn(); - changed(); + if (what == Tabular::SET_SPECIAL_MULTI) + return t.cellInfo(cell).align_special; + return t.column_info[t.cellColumn(cell)].align_special; } - -void GuiTabular::rotateTabular() -{ - rotateTabular(rotateTabularCB->isChecked()); - changed(); } -void GuiTabular::rotateCell() +void GuiTabular::applyView() { - rotateCell(rotateCellCB->isChecked()); - changed(); -} + applying_ = true; + Tabular::idx_type const cell = getActiveCell(); + Tabular::row_type const row = tabular_.cellRow(cell); + bool const multicol = tabular_.isMultiColumn(cell); -void GuiTabular::hAlign_changed(int align) -{ - GuiTabular::HALIGN h = GuiTabular::LEFT; + Tabular::Feature num = Tabular::ALIGN_LEFT; + Tabular::Feature multi_num = Tabular::M_ALIGN_LEFT; - switch (align) { - case 0: h = GuiTabular::LEFT; break; - case 1: h = GuiTabular::CENTER; break; - case 2: h = GuiTabular::RIGHT; break; - case 3: h = GuiTabular::BLOCK; break; + switch (hAlignCB->currentIndex()) { + case 0: + num = Tabular::ALIGN_LEFT; + multi_num = Tabular::M_ALIGN_LEFT; + break; + case 1: + num = Tabular::ALIGN_CENTER; + multi_num = Tabular::M_ALIGN_CENTER; + break; + case 2: + num = Tabular::ALIGN_RIGHT; + multi_num = Tabular::M_ALIGN_RIGHT; + break; + case 3: + num = Tabular::ALIGN_BLOCK; + //multi_num: no equivalent + break; } + if (multicol) + set(multi_num); + else + set(num); - halign(h); -} - + num = Tabular::VALIGN_MIDDLE; + multi_num = Tabular::M_VALIGN_MIDDLE; -void GuiTabular::vAlign_changed(int align) -{ - GuiTabular::VALIGN v = GuiTabular::TOP; + switch (vAlignCB->currentIndex()) { + case 0: + num = Tabular::VALIGN_TOP; + multi_num = Tabular::M_VALIGN_TOP; + break; + case 1: + num = Tabular::VALIGN_MIDDLE; + multi_num = Tabular::M_VALIGN_MIDDLE; + break; + case 2: + num = Tabular::VALIGN_BOTTOM; + multi_num = Tabular::M_VALIGN_BOTTOM; + break; + } + if (multicol) + set(multi_num); + else + set(num); - switch (align) { - case 0: v = GuiTabular::TOP; break; - case 1: v = GuiTabular::MIDDLE; break; - case 2: v = GuiTabular::BOTTOM; break; + switch (TableAlignCB->currentIndex()) { + case 0: + set(Tabular::TABULAR_VALIGN_TOP); + break; + case 1: + set(Tabular::TABULAR_VALIGN_MIDDLE); + break; + case 2: + set(Tabular::TABULAR_VALIGN_BOTTOM); + break; } - valign(v); -} + string value; + value = fromqstr(specialAlignmentED->text()); + if (multicol) + set(Tabular::SET_SPECIAL_MULTI, value); + else + set(Tabular::SET_SPECIAL_COLUMN, value); -void GuiTabular::longTabular() -{ - longTabular(longTabularCB->isChecked()); - changed(); -} + value = widgetsToLength(widthED, widthUnitCB); + if (multicol) + set(Tabular::SET_MPWIDTH, value); + else + set(Tabular::SET_PWIDTH, value); + if (multicolumnCB->isChecked() != multicol) + set(Tabular::MULTICOLUMN);; -void GuiTabular::ltNewpage_clicked() -{ - set(Tabular::SET_LTNEWPAGE); - changed(); -} + if (rotateTabularCB->isChecked()) + set(Tabular::SET_ROTATE_TABULAR); + else + set(Tabular::UNSET_ROTATE_TABULAR); + if (rotateCellCB->isChecked()) + set(Tabular::SET_ROTATE_CELL); + else + set(Tabular::UNSET_ROTATE_CELL); -void GuiTabular::on_captionStatusCB_toggled() -{ - set(Tabular::TOGGLE_LTCAPTION); - changed(); -} + // Borders + if (borders->getLeft() != tabular_.leftLine(cell)) + set(Tabular::TOGGLE_LINE_LEFT); + if (borders->getRight() != tabular_.rightLine(cell)) + set(Tabular::TOGGLE_LINE_RIGHT); + if (borders->getTop() != tabular_.topLine(cell)) + set(Tabular::TOGGLE_LINE_TOP); + if (borders->getBottom() != tabular_.bottomLine(cell)) + set(Tabular::TOGGLE_LINE_BOTTOM); + + if (booktabsRB->isChecked()) + set(Tabular::SET_BOOKTABS); + else + set(Tabular::UNSET_BOOKTABS); + + switch (topspaceCO->currentIndex()) { + case 0: + set(Tabular::SET_TOP_SPACE, ""); + break; + case 1: + set(Tabular::SET_TOP_SPACE, "default"); + break; + case 2: + set(Tabular::SET_TOP_SPACE, + widgetsToLength(topspaceED, + topspaceUnit)); + break; + } + + switch (bottomspaceCO->currentIndex()) { + case 0: + set(Tabular::SET_BOTTOM_SPACE, ""); + break; + case 1: + set(Tabular::SET_BOTTOM_SPACE, "default"); + break; + case 2: + set(Tabular::SET_BOTTOM_SPACE, + widgetsToLength(bottomspaceED, + bottomspaceUnit)); + break; + } + + switch (interlinespaceCO->currentIndex()) { + case 0: + set(Tabular::SET_INTERLINE_SPACE, ""); + break; + case 1: + set(Tabular::SET_INTERLINE_SPACE, "default"); + break; + case 2: + set(Tabular::SET_INTERLINE_SPACE, + widgetsToLength(interlinespaceED, + interlinespaceUnit)); + break; + } + // Longtabular + if (longTabularCB->isChecked()) + set(Tabular::SET_LONGTABULAR); + else + set(Tabular::UNSET_LONGTABULAR); -void GuiTabular::ltHeaderStatus_clicked() -{ - bool enable = headerStatusCB->isChecked(); - if (enable) + if (headerStatusCB->isChecked()) set(Tabular::SET_LTHEAD, ""); else set(Tabular::UNSET_LTHEAD, ""); - headerBorderAboveCB->setEnabled(enable); - headerBorderBelowCB->setEnabled(enable); - firstheaderNoContentsCB->setEnabled(enable); - changed(); -} - - -void GuiTabular::ltHeaderBorderAbove_clicked() -{ + if (headerBorderAboveCB->isChecked()) set(Tabular::SET_LTHEAD, "dl_above"); else set(Tabular::UNSET_LTHEAD, "dl_above"); - changed(); -} + if (headerBorderAboveCB->isChecked()) + set(Tabular::SET_LTHEAD, "dl_above"); + else + set(Tabular::UNSET_LTHEAD, "dl_above"); -void GuiTabular::ltHeaderBorderBelow_clicked() -{ if (headerBorderBelowCB->isChecked()) set(Tabular::SET_LTHEAD, "dl_below"); else set(Tabular::UNSET_LTHEAD, "dl_below"); - changed(); -} - -void GuiTabular::ltFirstHeaderBorderAbove_clicked() -{ if (firstheaderBorderAboveCB->isChecked()) set(Tabular::SET_LTFIRSTHEAD, "dl_above"); else set(Tabular::UNSET_LTFIRSTHEAD, "dl_above"); - changed(); -} - -void GuiTabular::ltFirstHeaderBorderBelow_clicked() -{ if (firstheaderBorderBelowCB->isChecked()) set(Tabular::SET_LTFIRSTHEAD, "dl_below"); else set(Tabular::UNSET_LTFIRSTHEAD, "dl_below"); - changed(); -} - -void GuiTabular::ltFirstHeaderStatus_clicked() -{ - bool enable = firstheaderStatusCB->isChecked(); - if (enable) + if (firstheaderStatusCB->isChecked()) set(Tabular::SET_LTFIRSTHEAD, ""); else set(Tabular::UNSET_LTFIRSTHEAD, ""); - firstheaderBorderAboveCB->setEnabled(enable); - firstheaderBorderBelowCB->setEnabled(enable); - changed(); -} - -void GuiTabular::ltFirstHeaderEmpty_clicked() -{ - bool enable = firstheaderNoContentsCB->isChecked(); - if (enable) + if (firstheaderNoContentsCB->isChecked()) set(Tabular::SET_LTFIRSTHEAD, "empty"); else set(Tabular::UNSET_LTFIRSTHEAD, "empty"); - firstheaderStatusCB->setEnabled(!enable); - firstheaderBorderAboveCB->setEnabled(!enable); - firstheaderBorderBelowCB->setEnabled(!enable); - changed(); -} - -void GuiTabular::ltFooterStatus_clicked() -{ - bool enable = footerStatusCB->isChecked(); - if (enable) + if (footerStatusCB->isChecked()) set(Tabular::SET_LTFOOT, ""); else set(Tabular::UNSET_LTFOOT, ""); - footerBorderAboveCB->setEnabled(enable); - footerBorderBelowCB->setEnabled(enable); - lastfooterNoContentsCB->setEnabled(enable); - changed(); -} - -void GuiTabular::ltFooterBorderAbove_clicked() -{ if (footerBorderAboveCB->isChecked()) set(Tabular::SET_LTFOOT, "dl_above"); else set(Tabular::UNSET_LTFOOT, "dl_above"); - changed(); -} - -void GuiTabular::ltFooterBorderBelow_clicked() -{ if (footerBorderBelowCB->isChecked()) set(Tabular::SET_LTFOOT, "dl_below"); else set(Tabular::UNSET_LTFOOT, "dl_below"); - changed(); -} - -void GuiTabular::ltLastFooterStatus_clicked() -{ - bool enable = lastfooterStatusCB->isChecked(); - if (enable) + if (lastfooterStatusCB->isChecked()) set(Tabular::SET_LTLASTFOOT, ""); else set(Tabular::UNSET_LTLASTFOOT, ""); - lastfooterBorderAboveCB->setEnabled(enable); - lastfooterBorderBelowCB->setEnabled(enable); - changed(); -} - -void GuiTabular::ltLastFooterBorderAbove_clicked() -{ if (lastfooterBorderAboveCB->isChecked()) set(Tabular::SET_LTLASTFOOT, "dl_above"); else set(Tabular::UNSET_LTLASTFOOT, "dl_above"); - changed(); -} - -void GuiTabular::ltLastFooterBorderBelow_clicked() -{ if (lastfooterBorderBelowCB->isChecked()) set(Tabular::SET_LTLASTFOOT, "dl_below"); else set(Tabular::UNSET_LTLASTFOOT, "dl_below"); - changed(); -} - -void GuiTabular::ltLastFooterEmpty_clicked() -{ - bool enable = lastfooterNoContentsCB->isChecked(); - if (enable) + if (lastfooterNoContentsCB->isChecked()) set(Tabular::SET_LTLASTFOOT, "empty"); else set(Tabular::UNSET_LTLASTFOOT, "empty"); - lastfooterStatusCB->setEnabled(!enable); - lastfooterBorderAboveCB->setEnabled(!enable); - lastfooterBorderBelowCB->setEnabled(!enable); - changed(); -} - - -void GuiTabular::update_borders() -{ - Tabular::idx_type const cell = getActiveCell(); - borders->setTop(tabular_.topLine(cell)); - borders->setBottom(tabular_.bottomLine(cell)); - borders->setLeft(tabular_.leftLine(cell)); - borders->setRight(tabular_.rightLine(cell)); - // repaint the setborder widget - borders->update(); -} + if (newpageCB->isChecked() != tabular_.getLTNewPage(row)) + set(Tabular::SET_LTNEWPAGE); -namespace { - -Length getColumnPWidth(Tabular const & t, size_t cell) -{ - return t.column_info[t.cellColumn(cell)].p_width; -} + if (captionStatusCB->isChecked() != tabular_.ltCaption(row)) + set(Tabular::TOGGLE_LTCAPTION); + if (leftRB->isChecked()) + set(Tabular::LONGTABULAR_ALIGN_LEFT); + else if (centerRB->isChecked()) + set(Tabular::LONGTABULAR_ALIGN_CENTER); + else if (rightRB->isChecked()) + set(Tabular::LONGTABULAR_ALIGN_RIGHT); -Length getMColumnPWidth(Tabular const & t, size_t cell) -{ - if (t.isMultiColumn(cell)) - return t.cellInfo(cell).p_width; - return Length(); + applying_ = false; } -docstring getAlignSpecial(Tabular const & t, size_t cell, int what) -{ - if (what == Tabular::SET_SPECIAL_MULTI) - return t.cellInfo(cell).align_special; - return t.column_info[t.cellColumn(cell)].align_special; -} - -} - - - void GuiTabular::updateContents() { + if (applying_) + return; + initialiseParams(string()); - size_t const cell = getActiveCell(); + Tabular::idx_type const cell = getActiveCell(); Tabular::row_type const row = tabular_.cellRow(cell); Tabular::col_type const col = tabular_.cellColumn(cell); @@ -626,10 +663,12 @@ void GuiTabular::updateContents() docstring special; if (multicol) { - special = getAlignSpecial(tabular_, cell, Tabular::SET_SPECIAL_MULTI); + special = getAlignSpecial(tabular_, cell, + Tabular::SET_SPECIAL_MULTI); pwidth = getMColumnPWidth(tabular_, cell); } else { - special = getAlignSpecial(tabular_, cell, Tabular::SET_SPECIAL_COLUMN); + special = getAlignSpecial(tabular_, cell, + Tabular::SET_SPECIAL_COLUMN); pwidth = getColumnPWidth(tabular_, cell); } @@ -698,13 +737,15 @@ void GuiTabular::updateContents() interlinespaceCO->setEnabled(!isReadonly); string colwidth; - if (!pwidth.zero()) + if (!pwidth.zero()) { colwidth = pwidth.asString(); - lengthToWidgets(widthED, widthUnit, - colwidth, default_unit); + + lengthToWidgets(widthED, widthUnitCB, + colwidth, default_unit); + } widthED->setEnabled(!isReadonly); - widthUnit->setEnabled(!isReadonly); + widthUnitCB->setEnabled(!isReadonly); hAlignCB->clear(); hAlignCB->addItem(qt_("Left")); @@ -758,6 +799,23 @@ void GuiTabular::updateContents() hAlignCB->setEnabled(true); vAlignCB->setEnabled(!pwidth.zero()); + int tableValign = 1; + switch (tabular_.tabular_valignment) { + case Tabular::LYX_VALIGN_TOP: + tableValign = 0; + break; + case Tabular::LYX_VALIGN_MIDDLE: + tableValign = 1; + break; + case Tabular::LYX_VALIGN_BOTTOM: + tableValign = 2; + break; + default: + tableValign = 0; + break; + } + TableAlignCB->setCurrentIndex(tableValign); + if (!tabular_.is_long_tabular) { headerStatusCB->setChecked(false); headerBorderAboveCB->setChecked(false); @@ -779,11 +837,62 @@ void GuiTabular::updateContents() captionStatusCB->setChecked(false); captionStatusCB->blockSignals(false); return; + } else + // longtables cannot have a vertical alignment + TableAlignCB->setCurrentIndex(Tabular::LYX_VALIGN_MIDDLE); + + switch (tabular_.longtabular_alignment) { + case Tabular::LYX_LONGTABULAR_ALIGN_LEFT: + leftRB->setChecked(true); + break; + case Tabular::LYX_LONGTABULAR_ALIGN_CENTER: + centerRB->setChecked(true); + break; + case Tabular::LYX_LONGTABULAR_ALIGN_RIGHT: + rightRB->setChecked(true); + break; + default: + centerRB->setChecked(true); + break; } captionStatusCB->blockSignals(true); captionStatusCB->setChecked(tabular_.ltCaption(row)); captionStatusCB->blockSignals(false); + // FIXME: shouldn't this be handled by GuiDialog? + // FIXME: Some of them should be handled directly in TabularUI.ui + firstheaderBorderAboveCB->setEnabled( + funcEnabled(Tabular::SET_LTFIRSTHEAD)); + firstheaderBorderBelowCB->setEnabled( + funcEnabled(Tabular::SET_LTFIRSTHEAD)); + // first header can only be suppressed when there is a header + firstheaderNoContentsCB->setEnabled(tabular_.haveLTHead() + && !tabular_.haveLTFirstHead()); + + //firstheaderStatusCB->setEnabled( + // !firstheaderNoContentsCB->isChecked()); + headerBorderAboveCB->setEnabled(funcEnabled(Tabular::SET_LTHEAD)); + headerBorderBelowCB->setEnabled(funcEnabled(Tabular::SET_LTHEAD)); + headerStatusCB->setEnabled(funcEnabled(Tabular::SET_LTHEAD)); + + footerBorderAboveCB->setEnabled(funcEnabled(Tabular::SET_LTFOOT)); + footerBorderBelowCB->setEnabled(funcEnabled(Tabular::SET_LTFOOT)); + footerStatusCB->setEnabled(funcEnabled(Tabular::SET_LTFOOT)); + + lastfooterBorderAboveCB->setEnabled( + funcEnabled(Tabular::SET_LTLASTFOOT)); + lastfooterBorderBelowCB->setEnabled( + funcEnabled(Tabular::SET_LTLASTFOOT)); + // last footer can only be suppressed when there is a footer + lastfooterNoContentsCB->setEnabled(tabular_.haveLTFoot() + && !tabular_.haveLTLastFoot()); + + captionStatusCB->setEnabled( + funcEnabled(Tabular::TOGGLE_LTCAPTION)); + // When a row is set as longtable caption, it must not be allowed + // to unset that this row is a multicolumn. + multicolumnCB->setEnabled(funcEnabled(Tabular::MULTICOLUMN)); + Tabular::ltType ltt; bool use_empty; bool row_set = tabular_.getRowOfLTHead(row, ltt); @@ -803,6 +912,12 @@ void GuiTabular::updateContents() } row_set = tabular_.getRowOfLTFirstHead(row, ltt); + // check if setting a first header is allowed + // additionally check firstheaderNoContentsCB because when this is + // the case a first header makes no sense + firstheaderStatusCB->setEnabled( + funcEnabled(Tabular::SET_LTFIRSTHEAD) + && !firstheaderNoContentsCB->isChecked()); firstheaderStatusCB->setChecked(row_set); if (ltt.set && (!ltt.empty || !use_empty)) { firstheaderBorderAboveCB->setChecked(ltt.topDL); @@ -813,7 +928,6 @@ void GuiTabular::updateContents() firstheaderBorderAboveCB->setChecked(false); firstheaderBorderBelowCB->setChecked(false); if (use_empty) { - firstheaderNoContentsCB->setChecked(ltt.empty); if (ltt.empty) firstheaderStatusCB->setEnabled(false); } @@ -836,6 +950,12 @@ void GuiTabular::updateContents() } row_set = tabular_.getRowOfLTLastFoot(row, ltt); + // check if setting a last footer is allowed + // additionally check lastfooterNoContentsCB because when this is + // the case a last footer makes no sense + lastfooterStatusCB->setEnabled( + funcEnabled(Tabular::SET_LTLASTFOOT) + && !lastfooterNoContentsCB->isChecked()); lastfooterStatusCB->setChecked(row_set); if (ltt.set && (!ltt.empty || !use_empty)) { lastfooterBorderAboveCB->setChecked(ltt.topDL); @@ -846,7 +966,6 @@ void GuiTabular::updateContents() lastfooterBorderAboveCB->setChecked(false); lastfooterBorderBelowCB->setChecked(false); if (use_empty) { - lastfooterNoContentsCB->setChecked(ltt.empty); if (ltt.empty) lastfooterStatusCB->setEnabled(false); } @@ -855,95 +974,6 @@ void GuiTabular::updateContents() } -void GuiTabular::closeGUI() -{ - // ugly hack to auto-apply the stuff that hasn't been - // yet. don't let this continue to exist ... - - // Subtle here, we must /not/ apply any changes and - // then refer to tabular, as it will have been freed - // since the changes update the actual tabular_ - // - // apply the fixed width values - size_t const cell = getActiveCell(); - bool const multicol = tabular_.isMultiColumn(cell); - string width = widgetsToLength(widthED, widthUnit); - string width2; - - Length llen = getColumnPWidth(tabular_, cell); - Length llenMulti = getMColumnPWidth(tabular_, cell); - - if (multicol && !llenMulti.zero()) - width2 = llenMulti.asString(); - else if (!multicol && !llen.zero()) - width2 = llen.asString(); - - // apply the special alignment - docstring const sa1 = qstring_to_ucs4(specialAlignmentED->text()); - docstring sa2; - - if (multicol) - sa2 = getAlignSpecial(tabular_, cell, Tabular::SET_SPECIAL_MULTI); - else - sa2 = getAlignSpecial(tabular_, cell, Tabular::SET_SPECIAL_COLUMN); - - if (sa1 != sa2) { - if (multicol) - set(Tabular::SET_SPECIAL_MULTI, to_utf8(sa1)); - else - set(Tabular::SET_SPECIAL_COLUMN, to_utf8(sa1)); - } - - if (width != width2) { - if (multicol) - set(Tabular::SET_MPWIDTH, width); - else - set(Tabular::SET_PWIDTH, width); - } - - /* DO WE NEED THIS? - switch (topspaceCO->currentIndex()) { - case 0: - set(Tabular::SET_TOP_SPACE, ""); - break; - case 1: - set(Tabular::SET_TOP_SPACE, "default"); - break; - case 2: - set(Tabular::SET_TOP_SPACE, - widgetsToLength(topspaceED, topspaceUnit)); - break; - } - - switch (bottomspaceCO->currentIndex()) { - case 0: - set(Tabular::SET_BOTTOM_SPACE, ""); - break; - case 1: - set(Tabular::SET_BOTTOM_SPACE, "default"); - break; - case 2: - set(Tabular::SET_BOTTOM_SPACE, - widgetsToLength(bottomspaceED, bottomspaceUnit)); - break; - } - - switch (interlinespaceCO->currentIndex()) { - case 0: - set(Tabular::SET_INTERLINE_SPACE, ""); - break; - case 1: - set(Tabular::SET_INTERLINE_SPACE, "default"); - break; - case 2: - set(Tabular::SET_INTERLINE_SPACE, - widgetsToLength(interlinespaceED, interlinespaceUnit)); - break; - } -*/ -} - - bool GuiTabular::initialiseParams(string const & data) { // try to get the current cell @@ -955,7 +985,8 @@ bool GuiTabular::initialiseParams(string const & data) // assume that it is "ours" for (int i = cur.depth() - 1; i >= 0; --i) if (cur[i].inset().lyxCode() == TABULAR_CODE) { - current_inset = static_cast(&cur[i].inset()); + current_inset = + static_cast(&cur[i].inset()); active_cell_ = cur[i].idx(); break; } @@ -966,7 +997,7 @@ bool GuiTabular::initialiseParams(string const & data) return true; } - InsetTabular tmp(const_cast(buffer())); + InsetTabular tmp(const_cast(&buffer())); InsetTabular::string2params(data, tmp); tabular_ = Tabular(tmp.tabular); return true; @@ -975,10 +1006,11 @@ bool GuiTabular::initialiseParams(string const & data) void GuiTabular::clearParams() { - // This function is also called when LyX is closing and the dialog is - // still open. At that time, the buffer might not be available anymore. + // This function is also called when LyX is closing and the dialog + // is still open. At that time, the buffer might not be available + // anymore. if (isBufferAvailable()) { - InsetTabular tmp(const_cast(buffer())); + InsetTabular tmp(const_cast(&buffer())); tabular_ = tmp.tabular; } active_cell_ = Tabular::npos; @@ -998,124 +1030,11 @@ void GuiTabular::set(Tabular::Feature f, string const & arg) } -void GuiTabular::setSpecial(string const & special) -{ - if (tabular_.isMultiColumn(getActiveCell())) - set(Tabular::SET_SPECIAL_MULTI, special); - else - set(Tabular::SET_SPECIAL_COLUMN, special); -} - - -void GuiTabular::setWidth(string const & width) -{ - if (tabular_.isMultiColumn(getActiveCell())) - set(Tabular::SET_MPWIDTH, width); - else - set(Tabular::SET_PWIDTH, width); - - updateView(); -} - - -void GuiTabular::toggleMultiColumn() -{ - set(Tabular::MULTICOLUMN); - updateView(); -} - - -void GuiTabular::rotateTabular(bool yes) -{ - if (yes) - set(Tabular::SET_ROTATE_TABULAR); - else - set(Tabular::UNSET_ROTATE_TABULAR); -} - - -void GuiTabular::rotateCell(bool yes) -{ - if (yes) - set(Tabular::SET_ROTATE_CELL); - else - set(Tabular::UNSET_ROTATE_CELL); -} - - -void GuiTabular::halign(GuiTabular::HALIGN h) -{ - Tabular::Feature num = Tabular::ALIGN_LEFT; - Tabular::Feature multi_num = Tabular::M_ALIGN_LEFT; - - switch (h) { - case LEFT: - num = Tabular::ALIGN_LEFT; - multi_num = Tabular::M_ALIGN_LEFT; - break; - case CENTER: - num = Tabular::ALIGN_CENTER; - multi_num = Tabular::M_ALIGN_CENTER; - break; - case RIGHT: - num = Tabular::ALIGN_RIGHT; - multi_num = Tabular::M_ALIGN_RIGHT; - break; - case BLOCK: - num = Tabular::ALIGN_BLOCK; - //multi_num: no equivalent - break; - } - - if (tabular_.isMultiColumn(getActiveCell())) - set(multi_num); - else - set(num); -} - - -void GuiTabular::valign(GuiTabular::VALIGN v) +// to get the status of the longtable row settings +bool GuiTabular::funcEnabled(Tabular::Feature f) const { - Tabular::Feature num = Tabular::VALIGN_MIDDLE; - Tabular::Feature multi_num = Tabular::M_VALIGN_MIDDLE; - - switch (v) { - case TOP: - num = Tabular::VALIGN_TOP; - multi_num = Tabular::M_VALIGN_TOP; - break; - case MIDDLE: - num = Tabular::VALIGN_MIDDLE; - multi_num = Tabular::M_VALIGN_MIDDLE; - break; - case BOTTOM: - num = Tabular::VALIGN_BOTTOM; - multi_num = Tabular::M_VALIGN_BOTTOM; - break; - } - - if (tabular_.isMultiColumn(getActiveCell())) - set(multi_num); - else - set(num); -} - - -void GuiTabular::booktabs(bool yes) -{ - if (yes) - set(Tabular::SET_BOOKTABS); - else - set(Tabular::UNSET_BOOKTABS); -} - - -void GuiTabular::longTabular(bool yes) -{ - if (yes) - set(Tabular::SET_LONGTABULAR); - else - set(Tabular::UNSET_LONGTABULAR); + return getStatus( + FuncRequest(getLfun(), featureAsString(f))).enabled(); }