Cleanup mouse/selection/context-menu interactions.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23944 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2008-03-25 10:54:38 +00:00
parent 678a72f549
commit fb25ff1819
14 changed files with 115 additions and 164 deletions

View File

@ -1134,51 +1134,63 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
break; break;
// Single-click on work area // Single-click on work area
case LFUN_MOUSE_PRESS: { case LFUN_MOUSE_PRESS:
// Right click on a footnote flag opens float menu // We are not marking a selection with the keyboard in any case.
// FIXME: Why should we clear the selection in this case? cur.bv().cursor().mark() = false;
if (cmd.button() == mouse_button::button3) switch (cmd.button()) {
cur.clearSelection(); case mouse_button::button1:
// Set the cursor
if (!bv->mouseSetCursor(cur, cmd.argument() == "region-select"))
cur.updateFlags(Update::SinglePar | Update::FitCursor);
break;
bool do_selection = cmd.button() == mouse_button::button1 case mouse_button::button2:
&& cmd.argument() == "region-select"; // Middle mouse pasting.
// Set the cursor if (!cap::selection()) {
bool update = bv->mouseSetCursor(cur, do_selection); // There is no local selection in the current buffer, so try to
// paste primary selection instead.
// Insert primary selection with middle mouse lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE,
// if there is a local selection in the current buffer, "paragraph"));
// insert this // Nothing else to do.
if (cmd.button() == mouse_button::button2) { cur.noUpdate();
if (cap::selection()) { return;
// Copy the selection buffer to the clipboard
// stack, because we want it to appear in the
// "Edit->Paste recent" menu.
cap::copySelectionToStack();
cap::pasteSelection(bv->cursor(),
bv->buffer().errorList("Paste"));
bv->buffer().errors("Paste");
bv->buffer().markDirty();
bv->cursor().finishUndo();
} else {
lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph"));
} }
} // Copy the selection buffer to the clipboard stack, because we want it
// to appear in the "Edit->Paste recent" menu.
cap::copySelectionToStack();
cap::pasteSelection(bv->cursor(), bv->buffer().errorList("Paste"));
cur.updateFlags(Update::Force | Update::FitCursor);
bv->buffer().errors("Paste");
bv->buffer().markDirty();
bv->cursor().finishUndo();
break;
// we have to update after dEPM triggered case mouse_button::button3:
if (!update && cmd.button() == mouse_button::button1) { if (cur.selection()) {
needsUpdate = false; DocIterator const selbeg = cur.selectionBegin();
cur.noUpdate(); DocIterator const selend = cur.selectionEnd();
Cursor tmpcur = cur;
tm.setCursorFromCoordinates(tmpcur, cmd.x, cmd.y);
// Don't do anything if we right-click a selection, a selection
// context menu should popup instead.
if (tmpcur < selbeg || tmpcur >= selend) {
cur.noUpdate();
return;
}
}
if (!bv->mouseSetCursor(cur, false)) {
cur.noUpdate();
return;
}
return;
} }
break;
}
case LFUN_MOUSE_MOTION: { case LFUN_MOUSE_MOTION: {
// Only use motion with button 1 // Mouse motion with right or middle mouse do nothing for now.
//if (cmd.button() != mouse_button::button1) if (cmd.button() != mouse_button::button1) {
// return false; cur.noUpdate();
return;
}
// ignore motions deeper nested than the real anchor // ignore motions deeper nested than the real anchor
Cursor & bvcur = cur.bv().cursor(); Cursor & bvcur = cur.bv().cursor();
if (!bvcur.anchor_.hasPart(cur)) { if (!bvcur.anchor_.hasPart(cur)) {
@ -1203,42 +1215,52 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
else if (cmd.y < 0) else if (cmd.y < 0)
lyx::dispatch(FuncRequest(LFUN_UP_SELECT)); lyx::dispatch(FuncRequest(LFUN_UP_SELECT));
} }
// We continue with our existing selection or start a new one, so don't
if (cur.top() == old) // reset the anchor.
cur.noUpdate(); bvcur.setCursor(cur);
else { bvcur.selection() = true;
// FIXME: This is brute force! But without it the selected if (cur.top() == old) {
// area is not corrected updated while moving the mouse. // We didn't move one iota, so no need to update the screen.
cur.updateFlags(Update::Force | Update::FitCursor); cur.updateFlags(Update::SinglePar | Update::FitCursor);
// don't set anchor_ //cur.noUpdate();
bvcur.setCursor(cur); return;
bvcur.selection() = true;
//lyxerr << "MOTION: " << bv->cursor() << endl;
} }
break; break;
} }
case LFUN_MOUSE_RELEASE: { case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button2) switch (cmd.button()) {
break; case mouse_button::button1:
// Cursor was set at LFUN_MOUSE_PRESS or LFUN_MOUSE_MOTION time.
if (cmd.button() == mouse_button::button1) { // If there is a new selection, update persistent selection;
// if there is new selection, update persistent // otherwise, single click does not clear persistent selection
// selection, otherwise, single click does not // buffer.
// clear persistent selection buffer
if (cur.selection()) { if (cur.selection()) {
// finish selection // Finish selection.
// if double click, cur is moved to the end of word by selectWord // If double click, cur is moved to the end of word by selectWord
// but bvcur is current mouse position // but bvcur is current mouse position.
Cursor & bvcur = cur.bv().cursor(); cur.bv().cursor().selection() = true;
bvcur.selection() = true;
} }
needsUpdate = false; // FIXME: We could try to handle drag and drop of selection here.
cur.noUpdate(); cur.noUpdate();
} return;
case mouse_button::button2:
// Middle mouse pasting is handled at mouse press time,
// see LFUN_MOUSE_PRESS.
cur.noUpdate();
return;
case mouse_button::button3:
// Cursor was set at LFUN_MOUSE_PRESS time.
// FIXME: If there is a selection we could try to handle a special
// drag & drop context menu.
cur.noUpdate();
return;
} // switch (cmd.button())
break; break;
}
case LFUN_SELF_INSERT: { case LFUN_SELF_INSERT: {
if (cmd.argument().empty()) if (cmd.argument().empty())

View File

@ -198,14 +198,6 @@ void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd)
InsetBoxMailer(*this).updateDialog(&cur.bv()); InsetBoxMailer(*this).updateDialog(&cur.bv());
break; break;
case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
InsetBoxMailer(*this).showDialog(&cur.bv());
break;
}
InsetCollapsable::doDispatch(cur, cmd);
break;
default: default:
InsetCollapsable::doDispatch(cur, cmd); InsetCollapsable::doDispatch(cur, cmd);
break; break;

View File

@ -130,14 +130,6 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd)
InsetBranchMailer(*this).updateDialog(&cur.bv()); InsetBranchMailer(*this).updateDialog(&cur.bv());
break; break;
case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button3 && hitButton(cmd))
InsetBranchMailer(*this).showDialog(&cur.bv());
else
InsetCollapsable::doDispatch(cur, cmd);
break;
case LFUN_INSET_TOGGLE: case LFUN_INSET_TOGGLE:
if (cmd.argument() == "assign") { if (cmd.argument() == "assign") {
// The branch inset uses "assign". // The branch inset uses "assign".

View File

@ -497,21 +497,25 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
switch (cmd.action) { switch (cmd.action) {
case LFUN_MOUSE_PRESS: case LFUN_MOUSE_PRESS:
if (cmd.button() == mouse_button::button1 if (hitButton(cmd) && geometry() != NoButton) {
&& hitButton(cmd) switch (cmd.button()) {
&& geometry() != NoButton) { case mouse_button::button1:
// reset selection if necessary (see bug 3060) // reset selection if necessary (see bug 3060)
if (cur.selection()) if (cur.selection())
cur.bv().cursor().clearSelection(); cur.bv().cursor().clearSelection();
else else
cur.noUpdate(); cur.noUpdate();
cur.dispatched(); cur.dispatched();
break; return;
case mouse_button::button2:
case mouse_button::button3:
// Nothing to do.
cur.undispatched();
return;
}
} }
if (geometry() == NoButton) if (geometry() == NoButton
InsetText::doDispatch(cur, cmd); || (geometry() != ButtonOnly && !hitButton(cmd)))
else if (geometry() != ButtonOnly
&& !hitButton(cmd))
InsetText::doDispatch(cur, cmd); InsetText::doDispatch(cur, cmd);
else else
cur.undispatched(); cur.undispatched();
@ -530,26 +534,6 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
break; break;
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button3) {
// There is no button to right click:
if (decoration() == InsetLayout::Minimalistic ||
geometry() == Corners ||
geometry() == SubLabel ||
geometry() == NoButton
) {
if (status_ == Open)
setStatus(cur, Collapsed);
else
setStatus(cur, Open);
break;
} else {
// Open the Inset
// configuration dialog
showInsetDialog(&cur.bv());
break;
}
}
if (geometry() == NoButton) { if (geometry() == NoButton) {
// The mouse click has to be within the inset! // The mouse click has to be within the inset!
InsetText::doDispatch(cur, cmd); InsetText::doDispatch(cur, cmd);

View File

@ -107,16 +107,6 @@ void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd)
Layout const layout = bp.documentClass().emptyLayout(); Layout const layout = bp.documentClass().emptyLayout();
//lyxerr << "\nInsetERT::doDispatch (begin): cmd: " << cmd << endl; //lyxerr << "\nInsetERT::doDispatch (begin): cmd: " << cmd << endl;
switch (cmd.action) { switch (cmd.action) {
case LFUN_MOUSE_PRESS:
if (cmd.button() != mouse_button::button3)
InsetCollapsable::doDispatch(cur, cmd);
else
// This makes the cursor leave the
// inset when it collapses on mouse-3
cur.undispatched();
break;
case LFUN_QUOTE_INSERT: { case LFUN_QUOTE_INSERT: {
// We need to bypass the fancy quotes in Text // We need to bypass the fancy quotes in Text
FuncRequest f(LFUN_SELF_INSERT, "\""); FuncRequest f(LFUN_SELF_INSERT, "\"");

View File

@ -471,7 +471,7 @@ void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd)
break; break;
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
if (!cur.selection()) if (!cur.selection() && cmd.button() == mouse_button::button1)
InsetExternalMailer(*this).showDialog(&cur.bv()); InsetExternalMailer(*this).showDialog(&cur.bv());
break; break;

View File

@ -146,17 +146,6 @@ void InsetFloat::doDispatch(Cursor & cur, FuncRequest & cmd)
break; break;
} }
case LFUN_MOUSE_RELEASE: {
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
if (params_.subfloat)
break;
InsetFloatMailer(*this).showDialog(&cur.bv());
break;
}
InsetCollapsable::doDispatch(cur, cmd);
break;
}
default: default:
InsetCollapsable::doDispatch(cur, cmd); InsetCollapsable::doDispatch(cur, cmd);
break; break;

View File

@ -197,7 +197,7 @@ void InsetGraphics::doDispatch(Cursor & cur, FuncRequest & cmd)
break; break;
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
if (!cur.selection()) if (!cur.selection() && cmd.button() == mouse_button::button1)
InsetGraphicsMailer(*this).showDialog(&cur.bv()); InsetGraphicsMailer(*this).showDialog(&cur.bv());
break; break;

View File

@ -214,14 +214,6 @@ void InsetListings::doDispatch(Cursor & cur, FuncRequest & cmd)
case LFUN_INSET_DIALOG_UPDATE: case LFUN_INSET_DIALOG_UPDATE:
InsetListingsMailer(*this).updateDialog(&cur.bv()); InsetListingsMailer(*this).updateDialog(&cur.bv());
break; break;
case LFUN_MOUSE_RELEASE: {
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
InsetListingsMailer(*this).showDialog(&cur.bv());
break;
}
InsetCollapsable::doDispatch(cur, cmd);
break;
}
default: default:
InsetCollapsable::doDispatch(cur, cmd); InsetCollapsable::doDispatch(cur, cmd);
break; break;

View File

@ -132,7 +132,7 @@ void InsetSpace::doDispatch(Cursor & cur, FuncRequest & cmd)
} }
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
if (!cur.selection()) if (!cur.selection() && cmd.button() == mouse_button::button1)
InsetSpaceMailer(*this).showDialog(&cur.bv()); InsetSpaceMailer(*this).showDialog(&cur.bv());
break; break;

View File

@ -3179,12 +3179,6 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
} }
break; break;
case LFUN_MOUSE_RELEASE:
//lyxerr << "# InsetTabular::MouseRelease\n" << bvcur << endl;
if (cmd.button() == mouse_button::button3)
InsetTabularMailer(*this).showDialog(&cur.bv());
break;
case LFUN_CELL_BACKWARD: case LFUN_CELL_BACKWARD:
movePrevCell(cur); movePrevCell(cur);
cur.selection() = false; cur.selection() = false;

View File

@ -424,6 +424,11 @@ ParagraphList & InsetText::paragraphs()
} }
//void InsetInclude::addToToc(ParConstIterator const & cpit) const
//{
//}
void InsetText::updateLabels(ParIterator const & it) void InsetText::updateLabels(ParIterator const & it)
{ {
ParIterator it2 = it; ParIterator it2 = it;

View File

@ -62,7 +62,7 @@ void InsetVSpace::doDispatch(Cursor & cur, FuncRequest & cmd)
} }
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
if (!cur.selection()) if (!cur.selection() && cmd.button() == mouse_button::button1)
InsetVSpaceMailer(*this).showDialog(&cur.bv()); InsetVSpaceMailer(*this).showDialog(&cur.bv());
break; break;

View File

@ -74,15 +74,6 @@ void InsetWrap::doDispatch(Cursor & cur, FuncRequest & cmd)
InsetWrapMailer(*this).updateDialog(&cur.bv()); InsetWrapMailer(*this).updateDialog(&cur.bv());
break; break;
case LFUN_MOUSE_RELEASE: {
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
InsetWrapMailer(*this).showDialog(&cur.bv());
break;
}
InsetCollapsable::doDispatch(cur, cmd);
break;
}
default: default:
InsetCollapsable::doDispatch(cur, cmd); InsetCollapsable::doDispatch(cur, cmd);
break; break;