#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;
else if (vbt->cursor.y() > last)
vbt->setCursorFromCoordinates(0, last);
- owner_->updateLayoutChoice();
+ 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();
}
}
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;
}
+// 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;
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);
- } 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;