]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/controllers/ControlTabular.C
fix crash due to invalidated iterator
[lyx.git] / src / frontends / controllers / ControlTabular.C
index 126bfa7c3d40d171f52ff69ba651292e38c589e3..afbd485c5025a78ae0fbf971bacaaa1f80383ddd 100644 (file)
@@ -1,4 +1,3 @@
-// -*- 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