#include <config.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
#include "BufferView_pimpl.h"
-#include "frontends/WorkArea.h"
-#include "frontends/screen.h"
-#include "frontends/LyXScreenFactory.h"
-#include "frontends/WorkAreaFactory.h"
-#include "frontends/Dialogs.h"
-#include "frontends/Alert.h"
-#include "frontends/FileDialog.h"
-#include "frontends/mouse_state.h"
-#include "lyxtext.h"
-#include "lyxrow.h"
-#include "paragraph.h"
-#include "frontends/LyXView.h"
+#include "bufferlist.h"
+#include "bufferview_funcs.h"
#include "commandtags.h"
-#include "lyxfunc.h"
#include "debug.h"
-#include "bufferview_funcs.h"
-#include "TextCache.h"
-#include "bufferlist.h"
-#include "lyxrc.h"
-#include "intl.h"
-// added for Dispatch functions
-#include "lyx_cb.h"
-#include "lyx_main.h"
+#include "factory.h"
#include "FloatList.h"
+#include "funcrequest.h"
#include "gettext.h"
+#include "intl.h"
+#include "iterators.h"
+#include "lyx_cb.h" // added for Dispatch functions
+#include "lyx_main.h"
+#include "lyxfind.h"
+#include "lyxfunc.h"
+#include "lyxtext.h"
+#include "lyxrc.h"
+#include "lyxrow.h"
+#include "paragraph.h"
#include "ParagraphParameters.h"
+#include "TextCache.h"
#include "undo_funcs.h"
-#include "funcrequest.h"
-#include "insets/insetbib.h"
-#include "insets/insettext.h"
-#include "insets/insetlatexaccent.h"
-#include "insets/insettoc.h"
-#include "insets/insetindex.h"
-#include "insets/insetref.h"
-#include "insets/insetinclude.h"
-#include "insets/insetcite.h"
-#include "insets/insetgraphics.h"
-#include "insets/insetmarginal.h"
#include "insets/insetfloatlist.h"
+#include "insets/insetgraphics.h"
+#include "insets/insetinclude.h"
+#include "insets/insetref.h"
+#include "insets/insettext.h"
+
+#include "frontends/Alert.h"
+#include "frontends/Dialogs.h"
+#include "frontends/FileDialog.h"
+#include "frontends/LyXView.h"
+#include "frontends/LyXScreenFactory.h"
+#include "frontends/mouse_state.h"
+#include "frontends/screen.h"
+#include "frontends/WorkArea.h"
+#include "frontends/WorkAreaFactory.h"
#include "mathed/formulabase.h"
#include <boost/bind.hpp>
#include <boost/signals/connection.hpp>
+#include "BoostFormat.h"
#include <unistd.h>
#include <sys/wait.h>
void BufferView::Pimpl::buffer(Buffer * b)
{
lyxerr[Debug::INFO] << "Setting buffer in BufferView ("
- << b << ")" << endl;
+ << b << ')' << endl;
if (buffer_) {
buffer_->delUser(bv_);
// set current buffer
buffer_ = b;
- if (bufferlist.getState() == BufferList::CLOSING) return;
+ // if we're quitting lyx, don't bother updating stuff
+ if (quitting)
+ return;
// if we are closing the buffer, use the first buffer as current
if (!buffer_) {
bool selection = false;
bool mark_set = false;
- owner_->prohibitInput();
+ owner_->busy(true);
owner_->message(_("Formatting document..."));
// bv_->text->owner(bv_);
if (lyxerr.debugging())
textcache.show(lyxerr, "resizeCurrentBuffer");
+
+ buffer_->resizeInsets(bv_);
} else {
bv_->text = new LyXText(bv_);
bv_->text->init(bv_);
bv_->text->first_y = screen().topCursorVisible(bv_->text->cursor, bv_->text->first_y);
switchKeyMap();
- owner_->allowInput();
+ owner_->busy(false);
updateScrollbar();
LyXText const & t = *bv_->text;
lyxerr[Debug::GUI] << "Updating scrollbar: h " << t.height << ", first_y "
- << t.first_y << ", default height " << t.defaultHeight() << endl;
+ << t.first_y << ", default height " << defaultRowHeight() << endl;
- workarea().setScrollbarParams(t.height, t.first_y, t.defaultHeight());
+ workarea().setScrollbarParams(t.height, t.first_y, defaultRowHeight());
}
LyXText * vbt = bv_->text;
- int const height = vbt->defaultHeight();
+ int const height = defaultRowHeight();
int const first = static_cast<int>((bv_->text->first_y + height));
int const last = static_cast<int>((bv_->text->first_y + workarea().workHeight() - height));
}
LyXText const * t = bv_->text;
- int const line_height = t->defaultHeight();
+ int const line_height = defaultRowHeight();
// The new absolute coordinate
int new_first_y = t->first_y + lines * line_height;
scrollDocView(new_first_y);
// Update the scrollbar.
- workarea().setScrollbarParams(t->height, t->first_y, t->defaultHeight());
+ workarea().setScrollbarParams(t->height, t->first_y, defaultRowHeight());
}
return;
}
- /* FIXME */
- extern void reapSpellchecker(void);
- reapSpellchecker();
-
if (!bv_->theLockingInset()) {
screen().cursorToggle(bv_);
} else {
}
+Change const BufferView::Pimpl::getCurrentChange()
+{
+ if (!bv_->buffer()->params.tracking_changes)
+ return Change(Change::UNCHANGED);
+
+ LyXText * t(bv_->getLyXText());
+
+ if (!t->selection.set())
+ return Change(Change::UNCHANGED);
+
+ LyXCursor const & cur(t->selection.start);
+ return cur.par()->lookupChangeFull(cur.pos());
+}
+
+
void BufferView::Pimpl::beforeChange(LyXText * text)
{
toggleSelection();
bv_->text->cursor.pos());
if (i > 0) {
ostringstream str;
- str << _("Saved bookmark") << ' ' << i;
- owner_->message(str.str().c_str());
+#if USE_BOOST_FORMAT
+ str << boost::format(_("Saved bookmark %1$d")) % i;
+#else
+ str << _("Saved bookmark ") << i;
+#endif
+ owner_->message(STRCONV(str.str()));
}
}
update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
if (i > 0) {
ostringstream str;
- str << _("Moved to bookmark") << ' ' << i;
- owner_->message(str.str().c_str());
+#if USE_BOOST_FORMAT
+ str << boost::format(_("Moved to bookmark %1$d")) % i;
+#else
+ str << _("Moved to bookmark ") << i;
+#endif
+ owner_->message(STRCONV(str.str()));
}
}
initpath = trypath;
}
- FileDialog fileDlg(bv_->owner(),
- _("Select LyX document to insert"),
+ FileDialog fileDlg(_("Select LyX document to insert"),
LFUN_FILE_INSERT,
make_pair(string(_("Documents|#o#O")),
string(lyxrc.document_path)),
string(AddPath(system_lyxdir, "examples"))));
FileDialog::Result result =
- fileDlg.Select(initpath,
+ fileDlg.open(initpath,
_("*.lyx| LyX Documents (*.lyx)"));
if (result.first == FileDialog::Later)
string const disp_fn(MakeDisplayPath(filename));
ostringstream s1;
- s1 << _("Inserting document") << ' '
- << disp_fn << " ...";
- owner_->message(s1.str().c_str());
+#if USE_BOOST_FORMAT
+ s1 << boost::format(_("Inserting document %1$s...")) % disp_fn;
+#else
+ s1 << _("Inserting document ") << disp_fn << _("...");
+#endif
+ owner_->message(STRCONV(s1.str()));
bool const res = bv_->insertLyXFile(filename);
if (res) {
ostringstream str;
- str << _("Document") << ' ' << disp_fn
- << ' ' << _("inserted.");
- owner_->message(str.str().c_str());
+#if USE_BOOST_FORMAT
+ str << boost::format(_("Document %1$s inserted.")) % disp_fn;
+#else
+ str << _("Document ") << disp_fn << _(" inserted.");
+#endif
+ owner_->message(STRCONV(str.str()));
} else {
ostringstream str;
- str << _("Could not insert document") << ' '
- << disp_fn;
- owner_->message(str.str().c_str());
+#if USE_BOOST_FORMAT
+ str << boost::format(_("Could not insert document %1$s")) % disp_fn;
+#else
+ str << _("Could not insert document ") << disp_fn;
+#endif
+ owner_->message(STRCONV(str.str()));
}
}
-bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
+void BufferView::Pimpl::trackChanges()
{
+ Buffer * buf(bv_->buffer());
+ bool const tracking(buf->params.tracking_changes);
+
+ if (!tracking) {
+ ParIterator const end = buf->par_iterator_end();
+ for (ParIterator it = buf->par_iterator_begin(); it != end; ++it) {
+ (*it)->trackChanges();
+ }
+ buf->params.tracking_changes = true;
+
+ // we cannot allow undos beyond the freeze point
+ buf->undostack.clear();
+ } else {
+ bv_->update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ bv_->text->setCursor(bv_, &(*buf->paragraphs.begin()), 0);
+#warning changes FIXME
+ //moveCursorUpdate(false);
+
+ bool found = lyxfind::findNextChange(bv_);
+ if (found) {
+ owner_->getDialogs().showMergeChanges();
+ return;
+ }
+
+ ParIterator const end = buf->par_iterator_end();
+ for (ParIterator it = buf->par_iterator_begin(); it != end; ++it) {
+ (*it)->untrackChanges();
+ }
+ buf->params.tracking_changes = false;
+ }
+
+ buf->redostack.clear();
+}
+
+
+bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in)
+{
+ // Make sure that the cached BufferView is correct.
+ FuncRequest ev = ev_in;
+ ev.setView(bv_);
+
lyxerr[Debug::ACTION] << "BufferView::Pimpl::Dispatch:"
- << " action[" << ev.action <<"]"
- << " arg[" << ev.argument << "]"
- << " x[" << ev.x << "]"
- << " y[" << ev.y << "]"
- << " button[" << ev.button() << "]"
+ << " action[" << ev.action << ']'
+ << " arg[" << ev.argument << ']'
+ << " x[" << ev.x << ']'
+ << " y[" << ev.y << ']'
+ << " 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) {
owner_->getLyXFunc().setMessage(currentState(bv_));
break;
- case LFUN_INSERT_LABEL:
- MenuInsertLabel(bv_, ev.argument);
- break;
-
- case LFUN_REF_INSERT:
- if (ev.argument.empty()) {
- InsetCommandParams p("ref");
- owner_->getDialogs().createRef(p.getAsString());
- } else {
- InsetCommandParams p;
- p.setFromString(ev.argument);
-
- InsetRef * inset = new InsetRef(p, *buffer_);
- if (!insertInset(inset))
- delete inset;
- else
- updateInset(inset, true);
- }
- break;
+ case LFUN_INSERT_LABEL: {
+ // Try and generate a valid label
+ string const contents = ev.argument.empty() ?
+ getPossibleLabel(*bv_) : ev.argument;
+ InsetCommandParams icp("label", contents);
+ string data = InsetCommandMailer::params2string("label", icp);
+ owner_->getDialogs().show("label", data, 0);
+ }
+ break;
case LFUN_BOOKMARK_SAVE:
savePosition(strToUnsignedInt(ev.argument));
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(FuncRequest(bv_, ev.action, ev.argument));
+ mathDispatch(ev);
break;
- case LFUN_CITATION_INSERT:
- {
- InsetCommandParams p;
- p.setFromString(ev.argument);
+ case LFUN_INSET_APPLY: {
+ string const name = ev.getArg(0);
- InsetCitation * inset = new InsetCitation(p);
- if (!insertInset(inset))
- delete inset;
- else {
- inset->setLoadingBuffer(bv_->buffer(), false);
- updateInset(inset, true);
+ InsetBase * base = owner_->getDialogs().getOpenInset(name);
+ Inset * inset = 0;
+ if (base) {
+ // This works both for 'original' and 'mathed' insets.
+ // Note that the localDispatch performs updateInset
+ // also.
+ base->localDispatch(ev);
+ } else {
+ inset = createInset(ev);
+ if (inset && insertInset(inset)) {
+ updateInset(inset, true);
+ } else {
+ delete inset;
+ }
}
-
- }
- break;
- case LFUN_INSERT_BIBTEX:
- {
- // ale970405+lasgoutt970425
- // The argument can be up to two tokens separated
- // by a space. The first one is the bibstyle.
- string const db = token(ev.argument, ' ', 0);
- string bibstyle = token(ev.argument, ' ', 1);
- if (bibstyle.empty())
- bibstyle = "plain";
-
- InsetCommandParams p("BibTeX", db, bibstyle);
- InsetBibtex * inset = new InsetBibtex(p);
-
- if (insertInset(inset)) {
- if (ev.argument.empty())
- inset->edit(bv_);
- } else
- delete inset;
- }
- break;
-
- // BibTeX data bases
- case LFUN_BIBDB_ADD:
- {
- InsetBibtex * inset =
- static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
- if (inset) {
- inset->addDatabase(ev.argument);
+ 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();
}
}
break;
- case LFUN_BIBDB_DEL:
- {
- InsetBibtex * inset =
- static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
- if (inset)
- inset->delDatabase(ev.argument);
- }
- break;
-
- case LFUN_BIBTEX_STYLE:
- {
- InsetBibtex * inset =
- static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
- if (inset)
- inset->setOptions(ev.argument);
- }
- break;
-
case LFUN_CHILD_INSERT:
{
InsetInclude::Params p;
}
break;
+ case LFUN_TRACK_CHANGES:
+ trackChanges();
+ break;
+
+ case LFUN_MERGE_CHANGES:
+ owner_->getDialogs().showMergeChanges();
+ break;
+
+ case LFUN_ACCEPT_ALL_CHANGES: {
+ bv_->update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ bv_->text->setCursor(bv_, &(*bv_->buffer()->paragraphs.begin()), 0);
+#warning FIXME changes
+ //moveCursorUpdate(false);
+
+ while (lyxfind::findNextChange(bv_)) {
+ bv_->getLyXText()->acceptChange(bv_);
+ }
+ update(bv_->text,
+ BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ break;
+ }
+
+ case LFUN_REJECT_ALL_CHANGES: {
+ bv_->update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
+ bv_->text->setCursor(bv_, &(*bv_->buffer()->paragraphs.begin()), 0);
+#warning FIXME changes
+ //moveCursorUpdate(false);
+
+ while (lyxfind::findNextChange(bv_)) {
+ bv_->getLyXText()->rejectChange(bv_);
+ }
+ update(bv_->text,
+ BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ break;
+ }
+
+ case LFUN_ACCEPT_CHANGE: {
+ bv_->getLyXText()->acceptChange(bv_);
+ update(bv_->text,
+ BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ break;
+ }
+
+ case LFUN_REJECT_CHANGE: {
+ bv_->getLyXText()->rejectChange(bv_);
+ update(bv_->text,
+ BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
+ break;
+ }
+
case LFUN_UNKNOWN_ACTION:
ev.errorMessage(N_("Unknown function!"));
break;