#include "LyXFunc.h"
#include "Layout.h"
#include "LyXRC.h"
-#include "MenuBackend.h"
#include "MetricsInfo.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "support/convert.h"
#include "support/debug.h"
+#include "support/ExceptionMessage.h"
#include "support/FileFilterList.h"
#include "support/filetools.h"
#include "support/gettext.h"
else if (d->anchor_pit_ == max_pit)
d->anchor_ypos_ = height_ - offset - row_dim.descent();
else
- d->anchor_ypos_ = offset + pm.ascent() - height_ / 2;
+ d->anchor_ypos_ = defaultRowHeight() * 2 - offset - row_dim.descent();
updateMetrics();
buffer_.changed();
case LFUN_SCREEN_RECENTER:
case LFUN_BIBTEX_DATABASE_ADD:
case LFUN_BIBTEX_DATABASE_DEL:
- case LFUN_WORDS_COUNT:
+ case LFUN_STATISTICS:
case LFUN_NEXT_INSET_TOGGLE:
flag.enabled(true);
break;
case LFUN_SCREEN_UP:
case LFUN_SCREEN_DOWN:
+ case LFUN_SCROLL:
flag.enabled(true);
break;
break;
}
- case LFUN_WORDS_COUNT: {
+ case LFUN_STATISTICS: {
DocIterator from, to;
if (cur.selection()) {
from = cur.selectionBegin();
from = doc_iterator_begin(buffer_.inset());
to = doc_iterator_end(buffer_.inset());
}
- int const count = countWords(from, to);
+ int const words = countWords(from, to);
+ int const chars = countChars(from, to, false);
+ int const chars_blanks = countChars(from, to, true);
docstring 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.");
- }
+ if (cur.selection())
+ message = _("Statistics for the selection:\n");
+ else
+ message = _("Statistics for the document:\n");
+ if (words != 1)
+ message += bformat(_("\n%1$d words"), words);
+ else
+ message += _("\nOne word");
+ if (chars_blanks != 1)
+ message += bformat(_("\n%1$d characters (including blanks)"),
+ chars_blanks);
+ else
+ message += _("\nOne character (including blanks)");
+ if (chars != 1)
+ message += bformat(_("\n%1$d characters (excluding blanks)"),
+ chars);
+ else
+ message += _("\nOne character (excluding blanks)");
- Alert::information(_("Count words"), message);
+ Alert::information(_("Statistics"), message);
}
break;
buffer_.params().compressed = !buffer_.params().compressed;
break;
- case LFUN_BUFFER_TOGGLE_EMBEDDING:
+ case LFUN_BUFFER_TOGGLE_EMBEDDING: {
// turn embedding on/off
- buffer_.embeddedFiles().enable(!buffer_.params().embedded);
+ try {
+ buffer_.embeddedFiles().enable(!buffer_.params().embedded);
+ } catch (ExceptionMessage const & message) {
+ Alert::error(message.title_, message.details_);
+ }
break;
+ }
case LFUN_NEXT_INSET_TOGGLE: {
// this is the real function we want to invoke
if (!cur.result().dispatched())
cur.dispatch(tmpcmd);
- if (cur.result().dispatched())
- cur.clearSelection();
-
+ if (!cur.result().dispatched())
+ // It did not work too; no action needed.
+ break;
+ cur.clearSelection();
+ processUpdateFlags(Update::SinglePar | Update::FitCursor);
break;
}
break;
}
+ case LFUN_SCROLL:
+ lfunScroll(cmd);
+ break;
+
case LFUN_SCREEN_UP_SELECT:
case LFUN_SCREEN_DOWN_SELECT: {
// Those two are not ready yet for consumption.
}
+void BufferView::lfunScroll(FuncRequest const & cmd)
+{
+ string const scroll_type = cmd.getArg(0);
+ int const scroll_step =
+ (scroll_type == "line")? d->scrollbarParameters_.lineScrollHeight
+ : (scroll_type == "page")? height_ : 0;
+ if (scroll_step == 0)
+ return;
+ string const scroll_quantity = cmd.getArg(1);
+ if (scroll_quantity == "up")
+ scrollUp(scroll_step);
+ else if (scroll_quantity == "down")
+ scrollDown(scroll_step);
+ else {
+ int const scroll_value = convert<int>(scroll_quantity);
+ if (scroll_value)
+ scroll(scroll_step * scroll_value);
+ }
+}
+
+
void BufferView::scroll(int y)
{
if (y > 0)
if (!changed)
return false;
+ d->cursor_ = cur;
+
updateLabels(buffer_);
updateMetrics();