-// -*- C++ -*-
/**
* \file ControlTabular.C
* This file is part of LyX, the document processor.
*
* \author John Levon
*
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
*/
-#include "ControlTabular.h"
-
-#include "ButtonControllerBase.h"
-#include "ViewBase.h"
-#include "support/LAssert.h"
+#include <config.h>
-#include "frontends/LyXView.h"
#include "BufferView.h"
-#include "buffer.h"
+#include "ControlTabular.h"
+#include "cursor.h"
+#include "funcrequest.h"
#include "lyxrc.h"
+#include "paragraph.h"
#include "insets/insettabular.h"
-#include <boost/bind.hpp>
-ControlTabular::ControlTabular(LyXView & lv, Dialogs & d)
- : ControlConnectBD(lv, d),
- inset_(0), dialog_built_(false)
+using std::string;
+
+namespace lyx {
+namespace frontend {
+
+ControlTabular::ControlTabular(Dialog & parent)
+ : Dialog::Controller(parent), active_cell_(LyXTabular::npos)
{}
-void ControlTabular::showInset(InsetTabular * inset)
+bool ControlTabular::initialiseParams(string const & data)
{
- lyx::Assert(inset);
+ // try to get the current cell
+ BufferView const * const bv = kernel().bufferview();
+ if (bv) {
+ LCursor const & cur = bv->cursor();
+ // get the innermost tabular inset;
+ // assume that it is "ours"
+ for (int i = cur.depth() - 1; i >= 0; --i)
+ if (cur[i].inset().lyxCode() == InsetBase::TABULAR_CODE) {
+ active_cell_ = cur[i].idx();
+ break;
+ }
+ }
+ InsetTabular tmp(kernel().buffer());
+ InsetTabularMailer::string2params(data, tmp);
+ params_.reset(new LyXTabular(tmp.tabular));
+ return true;
+}
- connectInset(inset);
- show(inset);
- // The widgets may not be valid, so refresh the button controller
- // FIXME: needed ?
- bc().refresh();
+void ControlTabular::clearParams()
+{
+ params_.reset();
+ active_cell_ = LyXTabular::npos;
}
-void ControlTabular::updateInset(InsetTabular * inset)
+LyXTabular::idx_type ControlTabular::getActiveCell() const
{
- if (!view().isVisible())
- return;
- lyx::Assert(inset);
- connectInset(inset);
- update();
+ return active_cell_;
}
-void ControlTabular::show(InsetTabular * inset)
+LyXTabular const & ControlTabular::tabular() const
{
- inset_ = inset;
+ BOOST_ASSERT(params_.get());
+ return *params_.get();
+}
- if (emergency_exit_) {
- hide();
- return;
- }
- if (!dialog_built_) {
- view().build();
- dialog_built_ = true;
- }
+void ControlTabular::set(LyXTabular::Feature f, string const & arg)
+{
+ string const data = featureAsString(f) + ' ' + arg;
+ kernel().dispatch(FuncRequest(getLfun(), data));
+}
- bc().readOnly(bufferIsReadonly());
- view().show();
+
+bool ControlTabular::useMetricUnits() const
+{
+ return lyxrc.default_papersize > PAPER_USEXECUTIVE;
}
-void ControlTabular::update()
+void ControlTabular::toggleTopLine()
{
- if (emergency_exit_) {
- hide();
- return;
- }
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(LyXTabular::M_TOGGLE_LINE_TOP);
+ else
+ set(LyXTabular::TOGGLE_LINE_TOP);
+}
+
+
+void ControlTabular::toggleBottomLine()
+{
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(LyXTabular::M_TOGGLE_LINE_BOTTOM);
+ else
+ set(LyXTabular::TOGGLE_LINE_BOTTOM);
+}
- bc().readOnly(bufferIsReadonly());
- view().update();
- // The widgets may not be valid, so refresh the button controller
- // FIXME: needed ?
- bc().refresh();
+void ControlTabular::toggleLeftLine()
+{
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(LyXTabular::M_TOGGLE_LINE_LEFT);
+ else
+ set(LyXTabular::TOGGLE_LINE_LEFT);
}
-void ControlTabular::hide()
+void ControlTabular::toggleRightLine()
{
- emergency_exit_ = false;
- inset_ = 0;
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(LyXTabular::M_TOGGLE_LINE_RIGHT);
+ else
+ set(LyXTabular::TOGGLE_LINE_RIGHT);
+}
- ih_.disconnect();
- disconnect();
- view().hide();
+
+void ControlTabular::setSpecial(string const & special)
+{
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(LyXTabular::SET_SPECIAL_MULTI, special);
+ else
+ set(LyXTabular::SET_SPECIAL_COLUMN, special);
}
-void ControlTabular::updateSlot(bool switched)
+void ControlTabular::setWidth(string const & width)
{
- if (switched)
- hide();
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(LyXTabular::SET_MPWIDTH, width);
else
- update();
+ set(LyXTabular::SET_PWIDTH, width);
+
+ dialog().view().update();
}
-void ControlTabular::connectInset(InsetTabular * inset)
+void ControlTabular::toggleMultiColumn()
{
- // If connected to another inset, disconnect from it.
- if (inset_) {
- ih_.disconnect();
- inset_ = 0;
- }
+ set(LyXTabular::MULTICOLUMN);
+ dialog().view().update();
+}
- if (inset) {
- inset_ = inset;
- ih_ = inset->hideDialog.connect(
- boost::bind(&ControlTabular::hide, this));
- }
- connect();
+
+void ControlTabular::rotateTabular(bool yes)
+{
+ if (yes)
+ set(LyXTabular::SET_ROTATE_TABULAR);
+ else
+ set(LyXTabular::UNSET_ROTATE_TABULAR);
}
-LyXTabular const & ControlTabular::tabular() const
+void ControlTabular::rotateCell(bool yes)
{
- lyx::Assert(inset_);
- return *inset_->tabular.get();
+ if (yes)
+ set(LyXTabular::SET_ROTATE_CELL);
+ else
+ set(LyXTabular::UNSET_ROTATE_CELL);
}
-void ControlTabular::set(LyXTabular::Feature f, string const & arg)
+void ControlTabular::halign(ControlTabular::HALIGN h)
{
- lyx::Assert(inset_);
- inset_->tabularFeatures(lv_.view().get(), f, arg);
+ LyXTabular::Feature num = LyXTabular::ALIGN_LEFT;
+ LyXTabular::Feature multi_num = LyXTabular::M_ALIGN_LEFT;
+
+ switch (h) {
+ case LEFT:
+ num = LyXTabular::ALIGN_LEFT;
+ multi_num = LyXTabular::M_ALIGN_LEFT;
+ break;
+ case CENTER:
+ num = LyXTabular::ALIGN_CENTER;
+ multi_num = LyXTabular::M_ALIGN_CENTER;
+ break;
+ case RIGHT:
+ num = LyXTabular::ALIGN_RIGHT;
+ multi_num = LyXTabular::M_ALIGN_RIGHT;
+ break;
+ case BLOCK:
+ num = LyXTabular::ALIGN_BLOCK;
+ //multi_num: no equivalent
+ break;
+ }
+
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(multi_num);
+ else
+ set(num);
}
-bool ControlTabular::useMetricUnits() const
+void ControlTabular::valign(ControlTabular::VALIGN v)
{
- return lyxrc.default_papersize > BufferParams::PAPER_EXECUTIVEPAPER;
+ LyXTabular::Feature num = LyXTabular::VALIGN_MIDDLE;
+ LyXTabular::Feature multi_num = LyXTabular::M_VALIGN_MIDDLE;
+
+ switch (v) {
+ case TOP:
+ num = LyXTabular::VALIGN_TOP;
+ multi_num = LyXTabular::M_VALIGN_TOP;
+ break;
+ case MIDDLE:
+ num = LyXTabular::VALIGN_MIDDLE;
+ multi_num = LyXTabular::M_VALIGN_MIDDLE;
+ break;
+ case BOTTOM:
+ num = LyXTabular::VALIGN_BOTTOM;
+ multi_num = LyXTabular::M_VALIGN_BOTTOM;
+ break;
+ }
+
+ if (tabular().isMultiColumn(getActiveCell()))
+ set(multi_num);
+ else
+ set(num);
}
-int ControlTabular::getActiveCell() const
+void ControlTabular::longTabular(bool yes)
{
- lyx::Assert(inset_);
- return inset_->getActCell();
+ if (yes)
+ set(LyXTabular::SET_LONGTABULAR);
+ else
+ set(LyXTabular::UNSET_LONGTABULAR);
}
+
+} // namespace frontend
+} // namespace lyx