X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=c93966b2572a838ba79ea99d6626935ccb4e0614;hb=1acedf11da79f509da706bc8d6d2f491c9676087;hp=d6dcbaa67baa82d76219f707fc754a49e4750448;hpb=62799a670722f4e631155f49d3aeb53a4165874a;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index d6dcbaa67b..c93966b257 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -58,6 +58,7 @@ #include "insets/InsetText.h" #include "frontends/alert.h" +#include "frontends/Application.h" #include "frontends/Delegates.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" @@ -67,6 +68,7 @@ #include "support/convert.h" #include "support/debug.h" +#include "support/ExceptionMessage.h" #include "support/FileFilterList.h" #include "support/filetools.h" #include "support/gettext.h" @@ -176,6 +178,7 @@ void gotoInset(BufferView * bv, vector const & codes, tmpcur.clearSelection(); bv->setCursor(tmpcur); + bv->showCursor(); } @@ -478,6 +481,29 @@ ScrollbarParameters const & BufferView::scrollbarParameters() const } +docstring BufferView::toolTip(int x, int y) const +{ + // Get inset under mouse, if there is one. + Inset const * covering_inset = getCoveringInset(buffer_.text(), x, y); + if (!covering_inset) + // No inset, no tooltip... + return docstring(); + return covering_inset->toolTip(*this, x, y); +} + + +docstring BufferView::contextMenu(int x, int y) const +{ + // Get inset under mouse, if there is one. + Inset const * covering_inset = getCoveringInset(buffer_.text(), x, y); + if (covering_inset) + return covering_inset->contextMenu(*this, x, y); + + // FIXME: Do something more elaborate here. + return from_ascii("edit"); +} + + void BufferView::scrollDocView(int value) { int const offset = value - d->scrollbarParameters_.position; @@ -719,7 +745,7 @@ void BufferView::showCursor() 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(); @@ -761,7 +787,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) 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; @@ -805,6 +831,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) case LFUN_SCREEN_UP: case LFUN_SCREEN_DOWN: + case LFUN_SCROLL: flag.enabled(true); break; @@ -897,6 +924,8 @@ bool BufferView::dispatch(FuncRequest const & cmd) cur.clearSelection(); if (!cur.textUndo()) cur.message(_("No further undo information")); + else + processUpdateFlags(Update::Force | Update::FitCursor); break; case LFUN_REDO: @@ -904,6 +933,8 @@ bool BufferView::dispatch(FuncRequest const & cmd) cur.clearSelection(); if (!cur.textRedo()) cur.message(_("No further redo information")); + else + processUpdateFlags(Update::Force | Update::FitCursor); break; case LFUN_FONT_STATE: @@ -949,6 +980,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) if (b == &buffer_) { // Set the cursor setCursor(makeDocIterator(par, 0)); + showCursor(); } else { // Switch to other buffer view and resend cmd theLyXFunc().dispatch(FuncRequest( @@ -1102,7 +1134,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) break; } - case LFUN_WORDS_COUNT: { + case LFUN_STATISTICS: { DocIterator from, to; if (cur.selection()) { from = cur.selectionBegin(); @@ -1111,24 +1143,30 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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."); - } - - Alert::information(_("Count words"), message); + 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(_("Statistics"), message); } break; @@ -1137,10 +1175,15 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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, buffer_); + } 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 @@ -1164,9 +1207,11 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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; } @@ -1186,6 +1231,10 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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. @@ -1266,7 +1315,8 @@ void BufferView::resize(int width, int height) } -Inset const * BufferView::getCoveringInset(Text const & text, int x, int y) +Inset const * BufferView::getCoveringInset(Text const & text, + int x, int y) const { TextMetrics & tm = d->text_metrics_[&text]; Inset * inset = tm.checkInsetHit(x, y); @@ -1375,6 +1425,27 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0) } +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(scroll_quantity); + if (scroll_value) + scroll(scroll_step * scroll_value); + } +} + + void BufferView::scroll(int y) { if (y > 0) @@ -1454,7 +1525,7 @@ void BufferView::gotoLabel(docstring const & label) it->getLabelList(buffer_, labels); if (find(labels.begin(), labels.end(), label) != labels.end()) { setCursor(it); - processUpdateFlags(Update::FitCursor); + showCursor(); return; } } @@ -1518,6 +1589,8 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old) if (!changed) return false; + d->cursor_ = cur; + updateLabels(buffer_); updateMetrics(); @@ -1673,7 +1746,7 @@ void BufferView::updateMetrics() int y1 = d->anchor_ypos_ - anchor_pm.ascent(); // We are now just above the anchor paragraph. pit_type pit1 = d->anchor_pit_ - 1; - for (; pit1 >= 0 && y1 > 0; --pit1) { + for (; pit1 >= 0 && y1 >= 0; --pit1) { tm.redoParagraph(pit1); ParagraphMetrics & pm = tm.par_metrics_[pit1]; y1 -= pm.descent();