#include "gettext.h"
#include "intl.h"
#include "insetiterator.h"
+#include "LaTeXFeatures.h"
#include "lyx_cb.h" // added for Dispatch functions
#include "lyx_main.h"
#include "lyxfind.h"
#include "frontends/Alert.h"
#include "frontends/Dialogs.h"
#include "frontends/FileDialog.h"
+#include "frontends/font_metrics.h"
#include "frontends/LyXView.h"
#include "frontends/LyXScreenFactory.h"
#include "frontends/screen.h"
#include "graphics/Previews.h"
+#include "support/convert.h"
#include "support/filefilterlist.h"
#include "support/filetools.h"
#include "support/forkedcontr.h"
-#include "support/path_defines.h"
-#include "support/tostr.h"
+#include "support/package.h"
#include "support/types.h"
#include <boost/bind.hpp>
using lyx::support::IsDirWriteable;
using lyx::support::MakeDisplayPath;
using lyx::support::MakeAbsPath;
-using lyx::support::strToUnsignedInt;
-using lyx::support::system_lyxdir;
+using lyx::support::package;
using std::endl;
using std::istringstream;
cursor_ = LCursor(*bv_);
anchor_ref_ = 0;
offset_ref_ = 0;
-
+
// if we're quitting lyx, don't bother updating stuff
if (quitting)
anchor_ref_ = int(t.paragraphs().size()) - 1;
offset_ref_ = 0;
}
-
+
lyxerr[Debug::GUI]
<< "Updating scrollbar: height: " << t.paragraphs().size()
<< " curr par: " << bv_->cursor().bottom().pit()
int const first = height;
int const last = workarea().workHeight() - height;
LCursor & cur = bv_->cursor();
-
+
bv_funcs::CurStatus st = bv_funcs::status(bv_, cur);
switch (st) {
bool BufferView::Pimpl::fitCursor()
{
if (bv_funcs::status(bv_, bv_->cursor()) == bv_funcs::CUR_INSIDE) {
- int asc, des;
- bv_->cursor().getDim(asc, des);
+ LyXFont const font = bv_->cursor().getFont();
+ int const asc = font_metrics::maxAscent(font);
+ int const des = font_metrics::maxDescent(font);
Point p = bv_funcs::getPos(bv_->cursor());
if (p.y_ - asc >= 0 && p.y_ + des < bv_->workHeight())
return false;
{
lyxerr << "BufferView::Pimpl::update(fc=" << fitcursor << ", fu="
<< forceupdate << ") buffer: " << buffer_ << endl;
-
+
// check needed to survive LyX startup
if (buffer_) {
// update macro store
bv_->cursor().paragraph().id(),
bv_->cursor().pos());
if (i > 0)
- owner_->message(bformat(_("Saved bookmark %1$s"), tostr(i)));
+ owner_->message(bformat(_("Saved bookmark %1$d"), i));
}
min(par->size(), saved_positions[i].par_pos));
if (i > 0)
- owner_->message(bformat(_("Moved to bookmark %1$s"), tostr(i)));
+ owner_->message(bformat(_("Moved to bookmark %1$d"), i));
}
make_pair(string(_("Documents|#o#O")),
string(lyxrc.document_path)),
make_pair(string(_("Examples|#E#e")),
- string(AddPath(system_lyxdir(), "examples"))));
+ string(AddPath(package().system_support(), "examples"))));
FileDialog::Result result =
fileDlg.open(initpath,
case LFUN_MARK_ON:
case LFUN_SETMARK:
case LFUN_CENTER:
+ case LFUN_WORDS_COUNT:
flag.enabled(true);
break;
-
+
case LFUN_BOOKMARK_GOTO:
- flag.enabled(bv_->isSavedPosition(strToUnsignedInt(cmd.argument)));
+ flag.enabled(bv_->isSavedPosition(convert<unsigned int>(cmd.argument)));
break;
case LFUN_TRACK_CHANGES:
flag.enabled(true);
flag.setOnOff(buf->params().tracking_changes);
break;
+ case LFUN_OUTPUT_CHANGES: {
+ LaTeXFeatures features(*buf, buf->params(), false);
+ flag.enabled(buf && buf->params().tracking_changes
+ && features.isAvailable("dvipost"));
+ flag.setOnOff(buf->params().output_changes);
+ break;
+ }
+
case LFUN_MERGE_CHANGES:
case LFUN_ACCEPT_CHANGE: // what about these two
case LFUN_REJECT_CHANGE: // what about these two
break;
case LFUN_BOOKMARK_SAVE:
- savePosition(strToUnsignedInt(cmd.argument));
+ savePosition(convert<unsigned int>(cmd.argument));
break;
case LFUN_BOOKMARK_GOTO:
- restorePosition(strToUnsignedInt(cmd.argument));
+ restorePosition(convert<unsigned int>(cmd.argument));
break;
case LFUN_REF_GOTO: {
trackChanges();
break;
+ case LFUN_OUTPUT_CHANGES: {
+ Buffer * buf = bv_->buffer();
+ bool const state = buf->params().output_changes;
+ buf->params().output_changes = !state;
+ break;
+ }
+
case LFUN_MERGE_CHANGES:
owner_->getDialogs().show("changes");
break;
bv_->center();
break;
+ case LFUN_WORDS_COUNT: {
+ DocIterator from, to;
+ if (cur.selection()) {
+ from = cur.selectionBegin();
+ to = cur.selectionEnd();
+ } else {
+ from = doc_iterator_begin(bv_->buffer()->inset());
+ to = doc_iterator_end(bv_->buffer()->inset());
+ }
+ int const count = countWords(from, to);
+ string message;
+ if (count != 1) {
+ if (cur.selection())
+ message = bformat(_("%1$d words in selection."),
+ count);
+ else
+ message = bformat(_("%1$d words in document."),
+ count);
+ }
+ else {
+ if (cur.selection())
+ message = _("One word in selection.");
+ else
+ message = _("One word in document.");
+ }
+
+ Alert::information(_("Count words"), message);
+ }
+ break;
default:
return false;
}
int pit1 = pit;
int pit2 = pit;
size_t npit = text->paragraphs().size();
- lyxerr << "npit: " << npit << " pit1: " << pit1
+ lyxerr << "npit: " << npit << " pit1: " << pit1
<< " pit2: " << pit2 << endl;
- // rebreak anchor par
+ // rebreak anchor par
text->redoParagraph(pit);
int y0 = text->getPar(pit1).ascent() - offset_ref_;
-
+
// redo paragraphs above cursor if necessary
int y1 = y0;
while (y1 > 0 && pit1 > 0) {
y1 -= text->getPar(pit1).descent();
}
-
+
// take care of ascent of first line
y1 -= text->getPar(pit1).ascent();
y1 = 0;
anchor_ref_ = 0;
}
-
+
// redo paragraphs below cursor if necessary
int y2 = y0;
while (y2 < bv.workHeight() && pit2 < int(npit) - 1) {
y2 += text->getPar(pit2).ascent();
}
- // take care of descent of last line
+ // take care of descent of last line
y2 += text->getPar(pit2).descent();
// the coordinates of all these paragraphs are correct, cache them
theCoords.pars_[text][pit] = Point(0, y);
y += text->getPar(pit).descent();
}
-
+
lyxerr << "bv:metrics: y1: " << y1 << " y2: " << y2 << endl;
return ViewMetricsInfo(pit1, pit2, y1, y2);
}