#include "frontends/Dialogs.h"
#include "insets/insetspecialchar.h"
#include "insets/insettext.h"
-#include "insets/insetbib.h"
#include "insets/insetquotes.h"
#include "insets/insetcommand.h"
#include "undo_funcs.h"
extern int bibitemMaxWidth(BufferView *, LyXFont const &);
// the selection possible is needed, that only motion events are
-// used, where the bottom press event was on the drawing area too
+// used, where the bottom press event was on the drawing area too
bool selection_possible = false;
if (selecting || lt->selection.mark()) {
lt->setSelection(bv);
- if (lt->bv_owner)
+ if (lt->isTopLevel())
bv->toggleToggle();
else
bv->updateInset(lt->inset_owner, false);
}
- if (lt->bv_owner) {
+ if (lt->isTopLevel()) {
//if (fitcur)
// bv->update(lt, BufferView::SELECT|BufferView::FITCUR);
//else
Inset /*const*/ * inset = par.getInset(pos);
- if (!isEditableInset(inset))
+ if (!isEditableInset(inset))
return 0;
// get inset dimensions
);
if (!b.contained(x, y)) {
- lyxerr[Debug::GUI] << "Missed inset at x,y " << x << "," << y
- << " box " << b << endl;
+ lyxerr[Debug::GUI] << "Missed inset at x,y "
+ << x << ',' << y
+ << " box " << b << endl;
return 0;
}
int new_y;
if (cursorrow == bv->text->cursor.row()) {
- // we have a row which is higher than the workarea so we leave the
- // cursor on the start of the row and move only the draw up as soon
- // as we move the cursor or do something while inside the row (it may
- // span several workarea-heights) we'll move to the top again, but this
- // is better than just jump down and only display part of the row.
+ // we have a row which is taller than the workarea. The
+ // simplest solution is to move to the previous row instead.
+ cursorUp(bv, true);
+ return;
+ // This is what we used to do, so we wouldn't skip right past
+ // tall rows, but it's not working right now.
+#if 0
new_y = bv->text->first_y - bv->workHeight();
+#endif
} else {
if (inset_owner) {
new_y = bv->text->cursor.iy()
int new_y;
if (cursorrow == bv->text->cursor.row()) {
- // we have a row which is higher than the workarea so we leave the
- // cursor on the start of the row and move only the draw down as soon
- // as we move the cursor or do something while inside the row (it may
- // span several workarea-heights) we'll move to the top again, but this
- // is better than just jump down and only display part of the row.
+ // we have a row which is taller than the workarea. The
+ // simplest solution is to move to the next row instead.
+ cursorDown(bv, true);
+ return;
+ // This is what we used to do, so we wouldn't skip right past
+ // tall rows, but it's not working right now.
+#if 0
new_y = bv->text->first_y + bv->workHeight();
+#endif
} else {
if (inset_owner) {
new_y = bv->text->cursor.iy()
bv->update(this, c);
}
+namespace {
void specialChar(LyXText * lt, BufferView * bv, InsetSpecialChar::Kind kind)
{
}
+void doInsertInset(LyXText * lt, FuncRequest const & cmd,
+ bool edit, bool pastesel)
+{
+ Inset * inset = createInset(cmd);
+ BufferView * bv = cmd.view();
+
+ if (inset) {
+ bool gotsel = false;
+ if (lt->selection.set()) {
+ lt->cutSelection(bv, true, false);
+ gotsel = true;
+ }
+ if (bv->insertInset(inset)) {
+ if (edit)
+ inset->edit(bv);
+ if (gotsel && pastesel)
+ bv->owner()->dispatch(FuncRequest(LFUN_PASTESELECTION));
+ }
+ else
+ delete inset;
+ }
+}
+
+}
+
Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
{
lyxerr[Debug::ACTION] << "LyXFunc::dispatch: action[" << cmd.action
- <<"] arg[" << cmd.argument << "]" << endl;
+ <<"] arg[" << cmd.argument << ']' << endl;
BufferView * bv = cmd.view();
// ensure that we have only one start_of_appendix in this document
Paragraph * tmp = ownerParagraph();
- for (; tmp; tmp = tmp->next())
- tmp->params().startOfAppendix(false);
+ for (; tmp; tmp = tmp->next()) {
+ if (tmp->params().startOfAppendix()) {
+ setUndo(bv, Undo::EDIT, tmp, tmp->next());
+ tmp->params().startOfAppendix(false);
+ break;
+ }
+ }
+ setUndo(bv, Undo::EDIT, par, par->next());
par->params().startOfAppendix(start);
// we can set the refreshing parameters now
finishChange(bv, true);
break;
+ case LFUN_WORDSEL: {
+ update(bv, false);
+ LyXCursor cur1;
+ LyXCursor cur2;
+ getWord(cur1, cur2, WHOLE_WORD);
+ setCursor(bv, cur1.par(), cur1.pos());
+ bv->beforeChange(this);
+ setCursor(bv, cur2.par(), cur2.pos());
+ finishChange(bv, true);
+ break;
+ }
+
case LFUN_RIGHT: {
bool is_rtl = cursor.par()->isRightToLeftPar(bv->buffer()->params);
if (!selection.mark())
bv->beforeChange(this);
- update(bv);
+ update(bv, false);
if (is_rtl)
cursorLeft(bv, false);
if (cursor.pos() < cursor.par()->size()
bool const is_rtl = cursor.par()->isRightToLeftPar(bv->buffer()->params);
if (!selection.mark())
bv->beforeChange(this);
- update(bv);
+ update(bv, false);
LyXCursor const cur = cursor;
if (!is_rtl)
cursorLeft(bv, false);
case LFUN_UPCASE_WORD:
update(bv, false);
- changeCase(bv, LyXText::text_uppercase);
+ changeCase(*bv, LyXText::text_uppercase);
if (inset_owner)
bv->updateInset(inset_owner, true);
update(bv);
case LFUN_LOWCASE_WORD:
update(bv, false);
- changeCase(bv, LyXText::text_lowercase);
+ changeCase(*bv, LyXText::text_lowercase);
if (inset_owner)
bv->updateInset(inset_owner, true);
update(bv);
case LFUN_CAPITALIZE_WORD:
update(bv, false);
- changeCase(bv, LyXText::text_capitalization);
+ changeCase(*bv, LyXText::text_capitalization);
if (inset_owner)
bv->updateInset(inset_owner, true);
update(bv);
case LFUN_BEGINNINGBUFSEL:
if (inset_owner)
- return Inset::UNDISPATCHED;
+ return UNDISPATCHED;
update(bv, false);
cursorTop(bv);
finishChange(bv, true);
case LFUN_ENDBUFSEL:
if (inset_owner)
- return Inset::UNDISPATCHED;
+ return UNDISPATCHED;
update(bv, false);
cursorBottom(bv);
finishChange(bv, true);
if (!is)
lyxerr << "SETXY: Could not parse coordinates in '"
<< cmd.argument << std::endl;
- else
+ else
setCursorFromCoordinates(bv, x, y);
break;
}
change_layout = true;
break;
}
+ spar = spar->next();
}
}
if (change_layout) {
case LFUN_MOUSE_TRIPLE:
if (!bv->buffer())
break;
- if (bv_owner && bv->theLockingInset())
+ if (isTopLevel() && bv->theLockingInset())
break;
if (cmd.button() == mouse_button::button1) {
- if (bv_owner) {
+ if (isTopLevel()) {
bv->screen().hideCursor();
bv->screen().toggleSelection(this, bv);
}
selection.cursor = cursor;
cursorEnd(bv);
setSelection(bv);
- if (bv_owner)
+ if (isTopLevel())
bv->screen().toggleSelection(this, bv, false);
update(bv, false);
bv->haveSelection(selection.set());
case LFUN_MOUSE_DOUBLE:
if (!bv->buffer())
break;
- if (bv_owner && bv->theLockingInset())
+ if (isTopLevel() && bv->theLockingInset())
break;
if (cmd.button() == mouse_button::button1) {
- if (bv_owner) {
+ if (isTopLevel()) {
bv->screen().hideCursor();
bv->screen().toggleSelection(this, bv);
selectWord(bv, LyXText::WHOLE_WORD_STRICT);
// in some other local environment, but I would like to leave this here
// for the moment until I can remove this (Jug 20020418)
if (y_before < bv->text->cursor.y())
- lyxerr << y_before << ":" << bv->text->cursor.y() << endl;
+ lyxerr << y_before << ':'
+ << bv->text->cursor.y() << endl;
#endif
// This is to allow jumping over large insets
if (cursorrow == bv->text->cursor.row()) {
// do nothing if we used the mouse wheel
if (!bv->buffer())
break;
-
+
if (cmd.button() == mouse_button::button4
|| cmd.button() == mouse_button::button5)
break;
} else {
FuncRequest cmd1(bv, LFUN_MOUSE_RELEASE, x, y, cmd.button());
inset_hit->localDispatch(cmd1);
- // IMO this is a grosshack! Inset's should be changed so that
+ // IMO this is a gross hack! Insets should be changed so that
// they call the actions they have to do with the insetButtonRel.
// function and not in the edit(). This should be changed
// (Jug 20020329)
break;
}
- // Maybe we want to edit a bibitem ale970302
- if (bv->text->cursor.par()->bibkey) {
- bool const is_rtl =
- bv->text->cursor.par()->isRightToLeftPar(bv->buffer()->params);
- int const width =
- bibitemMaxWidth(bv, bv->buffer()->params.getLyXTextClass().defaultfont());
- if ((is_rtl && x > bv->text->workWidth(bv)-20-width) ||
- (!is_rtl && x < 20 + width)) {
- bv->text->cursor.par()->bibkey->edit(bv, 0, 0, mouse_button::none);
- }
- }
break;
}
case LFUN_HTMLURL: {
InsetCommandParams p("htmlurl");
- bv->owner()->getDialogs().createUrl(p.getAsString());
+ string const data = InsetCommandMailer::params2string("url", p);
+ bv->owner()->getDialogs().show("url", data, 0);
break;
}
case LFUN_URL: {
InsetCommandParams p("url");
- bv->owner()->getDialogs().createUrl(p.getAsString());
+ string const data = InsetCommandMailer::params2string("url", p);
+ bv->owner()->getDialogs().show("url", data, 0);
break;
}
#if 0
case LFUN_INSET_LIST:
case LFUN_INSET_THEOREM:
+ case LFUN_INSET_CAPTION:
#endif
case LFUN_INSERT_NOTE:
- case LFUN_INSERT_URL:
- case LFUN_INSET_CAPTION:
+ case LFUN_INSERT_BIBITEM:
case LFUN_INSET_ERT:
- case LFUN_INSET_EXTERNAL:
case LFUN_INSET_FLOAT:
case LFUN_INSET_FOOTNOTE:
case LFUN_INSET_MARGINAL:
case LFUN_INSET_WIDE_FLOAT:
case LFUN_INSET_WRAP:
case LFUN_TABULAR_INSERT:
+ // Open the inset, and move the current selection
+ // inside it.
+ doInsertInset(this, cmd, true, true);
+ break;
+
+ case LFUN_INSERT_URL:
+ case LFUN_INSET_EXTERNAL:
case LFUN_INDEX_INSERT:
- case LFUN_INDEX_PRINT:
+ // Just open the inset
+ doInsertInset(this, cmd, true, false);
+ break;
+
+ case LFUN_INDEX_PRINT:
case LFUN_PARENTINSERT:
case LFUN_TOC_INSERT:
- {
- Inset * inset = createInset(cmd);
- if (inset) {
- bool gotsel = false;
- if (selection.set()) {
- cutSelection(bv, true, false);
- gotsel = true;
- }
- if (bv->insertInset(inset)) {
- inset->edit(bv);
- if (gotsel)
- bv->owner()->dispatch(FuncRequest(LFUN_PASTESELECTION));
- }
- else
- delete inset;
- }
+ // do nothing fancy
+ doInsertInset(this, cmd, false, false);
break;
- }
-
default:
- return Inset::UNDISPATCHED;
+ return UNDISPATCHED;
}
- return Inset::DISPATCHED;
+ return DISPATCHED;
}