using std::ostream;
+void leaveInset(LCursor & cur, InsetBase const & in)
+{
+ for (unsigned int i = 0; i != cur.size(); ++i) {
+ if (&cur[i].inset() == &in) {
+ cur.resize(i);
+ return;
+ }
+ }
+}
+
+
InsetCollapsable::InsetCollapsable(BufferParams const & bp,
CollapseStatus status)
: InsetText(bp), label("Label"), status_(status), openinlined_(false)
{
setAutoBreakRows(true);
- setDrawFrame(InsetText::ALWAYS);
+ setDrawFrame(true);
setFrameColor(LColor::collapsableframe);
setInsetName("Collapsable");
setButtonLabel();
if (openinlined_)
InsetText::draw(pi, x + dimc.width(),
y - aa + textdim_.asc);
- else
+ else
InsetText::draw(pi, x, dimc.height()
+ y - aa + textdim_.asc);
}
}
-InsetBase * InsetCollapsable::editXY(LCursor & cur, int x, int y)
+InsetBase * InsetCollapsable::editXY(LCursor & cur, int x, int y) const
{
- cur.push(*this);
+ cur.push(const_cast<InsetCollapsable&>(*this));
//lyxerr << "InsetCollapsable: edit xy" << endl;
if (status_ == Collapsed) {
- setStatus(Open);
- // We are not calling editXY() because the row cache of the
- // inset might be invalid. 'Entering from the left' should be
- // ok, though.
- InsetText::edit(cur, true);
- return this;
+ return const_cast<InsetCollapsable*>(this);
}
return InsetText::editXY(cur, x, y);
}
void InsetCollapsable::priv_dispatch(LCursor & cur, FuncRequest & cmd)
{
- //lyxerr << "\nInsetCollapsable::priv_dispatch (begin): cmd: " << cmd
- // << " button y: " << button_dim.y2 << endl;
+// lyxerr << "InsetCollapsable::priv_dispatch (begin): cmd: " << cmd
+// << " button y: " << button_dim.y2
+// << " coll/inline/open: " << status_ << endl;
+
+ lyxerr << "InsetCollapsable::priv_dispatch (begin): cmd: " << cmd
+ << " cur: " << cur << " bvcur: " << cur.bv().cursor() << endl;
+
switch (cmd.action) {
- case LFUN_MOUSE_PRESS:
- if (status_ == Inlined)
- InsetText::priv_dispatch(cur, cmd);
- else if (status_ == Open && !hitButton(cmd))
- InsetText::priv_dispatch(cur, cmd);
- break;
+ case LFUN_MOUSE_PRESS:
+ if (status_ == Inlined)
+ InsetText::priv_dispatch(cur, cmd);
+ else if (status_ == Open && !hitButton(cmd))
+ InsetText::priv_dispatch(cur, cmd);
+ else
+ cur.noUpdate();
+ break;
- case LFUN_MOUSE_MOTION:
- if (status_ == Inlined)
- InsetText::priv_dispatch(cur, cmd);
- else if (status_ == Open && !hitButton(cmd))
- InsetText::priv_dispatch(cur, cmd);
- break;
+ case LFUN_MOUSE_MOTION:
+ if (status_ == Inlined)
+ InsetText::priv_dispatch(cur, cmd);
+ else if (status_ == Open && !hitButton(cmd))
+ InsetText::priv_dispatch(cur, cmd);
+ break;
- case LFUN_MOUSE_RELEASE:
- if (cmd.button() == mouse_button::button3) {
- showInsetDialog(&cur.bv());
- break;
- }
+ case LFUN_MOUSE_RELEASE:
+ if (cmd.button() == mouse_button::button3) {
+ showInsetDialog(&cur.bv());
+ break;
+ }
- switch (status_) {
+ switch (status_) {
- case Collapsed:
- lyxerr << "InsetCollapsable::lfunMouseRelease 1" << endl;
- setStatus(Open);
- edit(cur, true);
- break;
-
- case Open: {
- FuncRequest cmd1 = cmd;
- if (hitButton(cmd1)) {
- lyxerr << "InsetCollapsable::lfunMouseRelease 2" << endl;
- setStatus(Collapsed);
- cur.undispatched();
- cmd = FuncRequest(LFUN_FINISHED_RIGHT);
- } else {
- lyxerr << "InsetCollapsable::lfunMouseRelease 3" << endl;
- InsetText::priv_dispatch(cur, cmd);
- }
- break;
- }
+ case Collapsed:
+ lyxerr << "InsetCollapsable::lfunMouseRelease 1" << endl;
+ setStatus(Open);
+ edit(cur, true);
+ cur.bv().cursor() = cur;
+ break;
- case Inlined:
- lyxerr << "InsetCollapsable::lfunMouseRelease 4" << endl;
+ case Open: {
+ if (hitButton(cmd)) {
+ lyxerr << "InsetCollapsable::lfunMouseRelease 2" << endl;
+ setStatus(Collapsed);
+ leaveInset(cur, *this);
+ cur.bv().cursor() = cur;
+ } else {
+ lyxerr << "InsetCollapsable::lfunMouseRelease 3" << endl;
InsetText::priv_dispatch(cur, cmd);
- break;
}
break;
+ }
- case LFUN_INSET_TOGGLE:
- if (InsetText::text_.toggleInset(cur))
- break;
- if (status_ == Open) {
- setStatus(Inlined);
- break;
- }
+ case Inlined:
+ lyxerr << "InsetCollapsable::lfunMouseRelease 4" << endl;
+ InsetText::priv_dispatch(cur, cmd);
+ break;
+ }
+ break;
+
+ case LFUN_INSET_TOGGLE:
+ if (cmd.argument == "open")
+ setStatus(Open);
+ else if (cmd.argument == "close") {
setStatus(Collapsed);
+ leaveInset(cur, *this);
+ } else if (cmd.argument == "toggle"
+ || cmd.argument.empty()) {
+ if (isOpen()) {
+ setStatus(Collapsed);
+ leaveInset(cur, *this);
+ } else
+ setStatus(Open);
+ } else // if assign or anything else
cur.undispatched();
- cmd = FuncRequest(LFUN_FINISHED_RIGHT);
- break;
+ cur.dispatched();
+ break;
- default:
- InsetText::priv_dispatch(cur, cmd);
- break;
+ default:
+ InsetText::priv_dispatch(cur, cmd);
+ break;
}
}