#include "BufferView_pimpl.h"
#include "bufferlist.h"
#include "bufferview_funcs.h"
-#include "commandtags.h"
+#include "lfuns.h"
#include "debug.h"
#include "factory.h"
#include "FloatList.h"
#include <boost/bind.hpp>
#include <boost/signals/connection.hpp>
-#include "BoostFormat.h"
+#include "support/BoostFormat.h"
#include <unistd.h>
#include <sys/wait.h>
using std::min;
using lyx::pos_type;
+using namespace bv_funcs;
extern BufferList bufferlist;
resizecon = workarea().workAreaResize
.connect(boost::bind(&BufferView::Pimpl::workAreaResize, this));
dispatchcon = workarea().dispatch
- .connect(boost::bind(&BufferView::Pimpl::dispatch, this, _1));
+ .connect(boost::bind(&BufferView::Pimpl::workAreaDispatch, this, _1));
kpresscon = workarea().workAreaKeyPress
.connect(boost::bind(&BufferView::Pimpl::workAreaKeyPress, this, _1, _2));
selectioncon = workarea().selectionRequested
// FIXME: needed when ?
bv_->text->top_y(screen().topCursorVisible(bv_->text->cursor, bv_->text->top_y()));
- // Similarly, buffer-dependent dialogs should be updated or
+ // Buffer-dependent dialogs should be updated or
// hidden. This should go here because some dialogs (eg ToC)
// require bv_->text.
owner_->getDialogs().updateBufferDependent(true);
owner_->updateLayoutChoice();
owner_->updateWindowTitle();
+ if (buffer_) {
+ // Don't forget to update the Layout
+ string const layoutname =
+ bv_->text->cursor.par()->layout()->name();
+ owner_->setLayout(layoutname);
+ }
+
if (grfx::Previews::activated() && buffer_)
grfx::Previews::get().generateBufferPreviews(*buffer_);
}
dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));
- if (ret)
- updateScrollbar();
+ // We need to always update, in case we did a
+ // paste and we stayed anchored to a row, but
+ // the actual height of the doc changed ...
+ updateScrollbar();
return ret;
}
owner_->message(_("Formatting document..."));
if (bv_->text) {
- par = bv_->text->cursor.par();
+ par = &*bv_->text->cursor.par();
pos = bv_->text->cursor.pos();
- selstartpar = bv_->text->selection.start.par();
+ selstartpar = &*bv_->text->selection.start.par();
selstartpos = bv_->text->selection.start.pos();
- selendpar = bv_->text->selection.end.par();
+ selendpar = &*bv_->text->selection.end.par();
selendpos = bv_->text->selection.end.pos();
selection = bv_->text->selection.set();
mark_set = bv_->text->selection.mark();
switchKeyMap();
owner_->busy(false);
+ // reset the "Formatting..." message
+ owner_->clearMessage();
+
updateScrollbar();
return 0;
vbt->setCursorFromCoordinates(0, first);
else if (vbt->cursor.y() > last)
vbt->setCursorFromCoordinates(0, last);
+
+ owner_->updateLayoutChoice();
}
{
if (!bv_->theLockingInset() || !bv_->theLockingInset()->nodraw()) {
screen().update(*bv_);
- bool fitc = false;
- while (bv_->text->status() == LyXText::CHANGED_IN_DRAW) {
- bv_->text->fullRebreak();
- bv_->text->setCursor(bv_->text->cursor.par(),
- bv_->text->cursor.pos());
- if (bv_->text->selection.set()) {
- bv_->text->setCursor(bv_->text->selection.start,
- bv_->text->selection.start.par(),
- bv_->text->selection.start.pos());
- bv_->text->setCursor(bv_->text->selection.end,
- bv_->text->selection.end.par(),
- bv_->text->selection.end.pos());
- }
- fitc = true;
- bv_->text->postPaint(0);
- screen().update(*bv_);
- }
-
- // do this here instead of in the screen::update because of
- // the above loop!
bv_->text->clearPaint();
-
- if (fitc)
- fitCursor();
}
}
-// Values used when calling update:
-// -3 - update
-// -2 - update, move sel_cursor if selection, fitcursor
-// -1 - update, move sel_cursor if selection, fitcursor, mark dirty
-// 0 - update, move sel_cursor if selection, fitcursor
-// 1 - update, move sel_cursor if selection, fitcursor, mark dirty
-// 3 - update, move sel_cursor if selection
-//
-// update -
-// a simple redraw of the parts that need refresh
-//
-// move sel_cursor if selection -
-// the text's sel_cursor is moved if there is selection is progress
-//
-// fitcursor -
-// fitCursor() is called and the scrollbar updated
-//
-// mark dirty -
-// the buffer is marked dirty.
-//
-// enum {
-// UPDATE = 0,
-// SELECT = 1,
-// FITCUR = 2,
-// CHANGE = 4
-// };
-//
-// UPDATE_ONLY = UPDATE;
-// UPDATE_SELECT = UPDATE | SELECT;
-// UPDATE_SELECT_MOVE = UPDATE | SELECT | FITCUR;
-// UPDATE_SELECT_MOVE_AFTER_CHANGE = UPDATE | SELECT | FITCUR | CHANGE;
-//
-// update(-3) -> update(0) -> update(0) -> update(UPDATE)
-// update(-2) -> update(1 + 2) -> update(3) -> update(SELECT|FITCUR)
-// update(-1) -> update(1 + 2 + 4) -> update(7) -> update(SELECT|FITCUR|CHANGE)
-// update(1) -> update(1 + 2 + 4) -> update(7) -> update(SELECT|FITCUR|CHANGE)
-// update(3) -> update(1) -> update(1) -> update(SELECT)
void BufferView::Pimpl::update(LyXText * text, BufferView::UpdateCodes f)
{
- owner_->updateLayoutChoice();
-
if (!text->selection.set() && (f & SELECT)) {
text->selection.cursor = text->cursor;
}
if (text->inset_owner) {
text->inset_owner->setUpdateStatus(bv_, InsetText::NONE);
- updateInset(text->inset_owner, false);
+ updateInset(text->inset_owner);
} else {
update();
}
+}
+
+
+void BufferView::Pimpl::update(BufferView::UpdateCodes f)
+{
+ LyXText * text = bv_->text;
- if ((f & FITCUR)) {
- fitCursor();
+ if (!text->selection.set() && (f & SELECT)) {
+ text->selection.cursor = text->cursor;
}
- if ((f & CHANGE)) {
- buffer_->markDirty();
+ text->fullRebreak();
+
+ if (text->inset_owner) {
+ text->inset_owner->setUpdateStatus(bv_, InsetText::NONE);
+ updateInset(text->inset_owner);
+ } else {
+ update();
}
}
if (b != 0) buffer(b);
}
- Paragraph * par = buffer_->getParFromID(saved_positions[i].par_id);
+ Paragraph * par = &*buffer_->getParFromID(saved_positions[i].par_id);
if (!par)
return;
bv_->text->setCursor(par,
min(par->size(), saved_positions[i].par_pos));
- update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ update(BufferView::SELECT);
if (i > 0) {
ostringstream str;
#if USE_BOOST_FORMAT
new_y = t->cursor.y() - half_height;
}
+ // FIXME: look at this comment again ...
+
// FIXME: can we do this w/o calling screen directly ?
// This updates top_y() but means the fitCursor() call
// from the update(FITCUR) doesn't realise that we might
// pretty obfuscated way of updating t->top_y()
screen().draw(t, bv_, new_y);
- update(t, BufferView::SELECT | BufferView::FITCUR);
+ update(BufferView::SELECT);
}
// we cannot allow undos beyond the freeze point
buf->undostack.clear();
} else {
- bv_->update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ update(BufferView::SELECT);
bv_->text->setCursor(&(*buf->paragraphs.begin()), 0);
#warning changes FIXME
//moveCursorUpdate(false);
}
+// Doesn't go through lyxfunc, so we need to update the
+// layout choice etc. ourselves
+bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & ev_in)
+{
+ // e.g. Qt mouse press when no buffer
+ if (!available())
+ return false;
+
+ bool const res = dispatch(ev_in);
+
+ // FIXME: we should skip these when selecting
+ bv_->owner()->updateLayoutChoice();
+ bv_->owner()->updateToolbar();
+ bv_->fitCursor();
+
+ // slight hack: this is only called currently when
+ // we clicked somewhere, so we force through the display
+ // of the new status here.
+ bv_->owner()->clearMessage();
+
+ return res;
+}
+
+
bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in)
{
// Make sure that the cached BufferView is correct.
<< " button[" << ev.button() << ']'
<< endl;
- // e.g. Qt mouse press when no buffer
- if (!buffer_)
- return false;
-
LyXTextClass const & tclass = buffer_->params.getLyXTextClass();
switch (ev.action) {
// a tabular-inset
break;
- case LFUN_LAYOUT_COPY:
- bv_->copyEnvironment();
- break;
-
- case LFUN_LAYOUT_PASTE:
- bv_->pasteEnvironment();
- switchKeyMap();
- break;
-
case LFUN_FILE_INSERT:
MenuInsertLyXFile(ev.argument);
break;
restorePosition(strToUnsignedInt(ev.argument));
break;
- case LFUN_REF_GOTO:
- {
+ case LFUN_REF_GOTO: {
string label = ev.argument;
if (label.empty()) {
InsetRef * inset =
}
}
- if (!label.empty()) {
- //bv_->savePosition(0);
- if (!bv_->gotoLabel(label))
- Alert::alert(_("Error"),
- _("Couldn't find this label"),
- _("in current document."));
- }
+ if (!label.empty())
+ bv_->gotoLabel(label);
}
break;
owner_->getLyXFunc().handleKeyFunc(ev.action);
owner_->getIntl().getTransManager()
.TranslateAndInsert(ev.argument[0], bv_->getLyXText());
- update(bv_->getLyXText(),
- BufferView::SELECT
- | BufferView::FITCUR
- | BufferView::CHANGE);
+ update(bv_->getLyXText(), BufferView::SELECT);
}
break;
case LFUN_MATH_IMPORT_SELECTION: // Imports LaTeX from the X selection
case LFUN_MATH_DISPLAY: // Open or create a displayed math inset
case LFUN_MATH_MODE: // Open or create an inlined math inset
- case LFUN_GREEK: // Insert a single greek letter
mathDispatch(ev);
break;
case LFUN_INSET_APPLY: {
string const name = ev.getArg(0);
- InsetBase * base = owner_->getDialogs().getOpenInset(name);
- if (base) {
+ InsetBase * inset = owner_->getDialogs().getOpenInset(name);
+ if (inset) {
// This works both for 'original' and 'mathed' insets.
// Note that the localDispatch performs updateInset
// also.
FuncRequest fr(bv_, LFUN_INSET_MODIFY, ev.argument);
- base->localDispatch(fr);
+ inset->localDispatch(fr);
} else {
- Inset * inset = createInset(ev);
- if (inset && insertInset(inset)) {
- updateInset(inset, true);
- } else {
- delete inset;
- }
+ FuncRequest fr(bv_, LFUN_INSET_INSERT, ev.argument);
+ dispatch(fr);
}
+ }
+ break;
+
+ case LFUN_INSET_INSERT: {
+ Inset * inset = createInset(ev);
+ if (inset && insertInset(inset)) {
+ updateInset(inset);
- if (name == "bibitem") {
- // We need to do a redraw because the maximum
- // InsetBibitem width could have changed
+ string const name = ev.getArg(0);
+ if (name == "bibitem") {
+ // We need to do a redraw because the maximum
+ // InsetBibitem width could have changed
#warning please check you mean repaint() not update(),
#warning and whether the repaint() is needed at all
- bv_->repaint();
- bv_->fitCursor();
+ bv_->repaint();
+ bv_->fitCursor();
+ }
+ } else {
+ delete inset;
}
}
break;
break;
case LFUN_LAYOUT_PARAGRAPH: {
- Paragraph const * par = bv_->getLyXText()->cursor.par();
+ Paragraph const * par = &*bv_->getLyXText()->cursor.par();
if (!par)
break;
}
case LFUN_PARAGRAPH_UPDATE: {
- Paragraph const * par = bv_->getLyXText()->cursor.par();
+ Paragraph const * par = &*bv_->getLyXText()->cursor.par();
if (!par)
break;
}
}
- bv_->owner()->getDialogs().showThesaurus(arg);
+ bv_->owner()->getDialogs().show("thesaurus", arg);
}
break;
break;
case LFUN_ACCEPT_ALL_CHANGES: {
- bv_->update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ update(BufferView::SELECT);
bv_->text->setCursor(&(*bv_->buffer()->paragraphs.begin()), 0);
#warning FIXME changes
//moveCursorUpdate(false);
while (lyxfind::findNextChange(bv_)) {
bv_->getLyXText()->acceptChange();
}
- update(bv_->text,
- BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ update(BufferView::SELECT);
break;
}
case LFUN_REJECT_ALL_CHANGES: {
- bv_->update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ update(BufferView::SELECT);
bv_->text->setCursor(&(*bv_->buffer()->paragraphs.begin()), 0);
#warning FIXME changes
//moveCursorUpdate(false);
while (lyxfind::findNextChange(bv_)) {
bv_->getLyXText()->rejectChange();
}
- update(bv_->text,
- BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ update(BufferView::SELECT);
break;
}
case LFUN_ACCEPT_CHANGE: {
bv_->getLyXText()->acceptChange();
- update(bv_->text,
- BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ update(BufferView::SELECT);
break;
}
case LFUN_REJECT_CHANGE: {
bv_->getLyXText()->rejectChange();
- update(bv_->text,
- BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ update(BufferView::SELECT);
break;
}
beforeChange(bv_->text);
if (!lout.empty()) {
- update(bv_->text, BufferView::SELECT|BufferView::FITCUR);
+ update(BufferView::SELECT);
bv_->text->breakParagraph(bv_->buffer()->paragraphs);
- update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ update(BufferView::SELECT);
if (!bv_->text->cursor.par()->empty()) {
bv_->text->cursorLeft(bv_);
bv_->text->breakParagraph(bv_->buffer()->paragraphs);
- update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ update(BufferView::SELECT);
}
string lres = lout;
LYX_ALIGN_LAYOUT,
string(),
0);
- update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ update(BufferView::SELECT);
}
bv_->text->insertInset(inset);
- update(bv_->text, BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ update(BufferView::SELECT);
unFreezeUndo();
return true;
}
-void BufferView::Pimpl::updateInset(Inset * inset, bool mark_dirty)
+void BufferView::Pimpl::updateInset(Inset * inset)
{
if (!inset || !available())
return;
if (bv_->theLockingInset() == inset) {
if (bv_->text->updateInset(inset)) {
update();
- if (mark_dirty) {
- buffer_->markDirty();
- }
updateScrollbar();
return;
}
} else if (bv_->theLockingInset()->updateInsetInInset(bv_, inset)) {
if (bv_->text->updateInset(bv_->theLockingInset())) {
update();
- if (mark_dirty) {
- buffer_->markDirty();
- }
updateScrollbar();
return;
}
tl_inset = tl_inset->owner();
hideCursor();
if (tl_inset == inset) {
- update(bv_->text, BufferView::UPDATE);
+ update(BufferView::UPDATE);
if (bv_->text->updateInset(inset)) {
- if (mark_dirty) {
- update(bv_->text,
- BufferView::SELECT
- | BufferView::FITCUR
- | BufferView::CHANGE);
- } else {
- update(bv_->text, SELECT);
- }
+ update(BufferView::SELECT);
return;
}
} else if (static_cast<UpdatableInset *>(tl_inset)