X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FBufferView.h;h=bfd523aa5705c353b301aede43566fba8adba3de;hb=26ba2a65838731ce639a09539f617cb0f0be3b22;hp=bfdb0bac429ac912613f1b08344534ef65a497f4;hpb=f6c6416f289af0e21486c7a157dac7e5fab98623;p=lyx.git diff --git a/src/BufferView.h b/src/BufferView.h index bfdb0bac42..bfd523aa57 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -15,7 +15,9 @@ #ifndef BUFFER_VIEW_H #define BUFFER_VIEW_H +#include "CoordCache.h" #include "DocumentClassPtr.h" +#include "TexRow.h" #include "update_flags.h" #include "support/strfwd.h" @@ -25,23 +27,25 @@ namespace lyx { namespace support { class FileName; } +namespace frontend { struct CaretGeometry; } namespace frontend { class Painter; } namespace frontend { class GuiBufferViewDelegate; } class Buffer; class Change; -class CoordCache; class Cursor; class CursorSlice; +class Dimension; class DispatchResult; class DocIterator; -class DocumentClass; class FuncRequest; class FuncStatus; class Intl; class Inset; -class PainterInfo; -class ParIterator; +class InsetMathNest; +class Length; +class MathData; +class MathRow; class ParagraphMetrics; class Point; class Text; @@ -53,18 +57,28 @@ enum CursorStatus { CUR_BELOW }; +/// How to show cursor +enum ScrollType { + // Make sure row if visible (do nothing if it is visible already) + SCROLL_VISIBLE, + // Force cursor to be on top of screen + SCROLL_TOP, + // Force cursor to be at center of screen + SCROLL_CENTER +}; + /// Scrollbar Parameters. struct ScrollbarParameters { + // These parameters are normalized against the screen geometry and pixel + // coordinates. Position 0 corresponds to the top the the screen. ScrollbarParameters() - : min(0), max(0), position(0), single_step(1), page_step(1) + : min(0), max(0), single_step(1), page_step(1) {} /// Minimum scrollbar position in pixels. int min; /// Maximum scrollbar position in pixels. int max; - /// Current position in the document in pixels. - int position; /// Line-scroll amount in pixels. int single_step; /// Page-scroll amount in pixels. @@ -94,14 +108,38 @@ public: Buffer & buffer(); Buffer const & buffer() const; + /// Copy cursor and vertical offset information from \c bv + void copySettingsFrom(BufferView const & bv); + /// void setFullScreen(bool full_screen) { full_screen_ = full_screen; } + /// default value for the margins + int defaultMargin() const; /// right margin int rightMargin() const; - /// left margin int leftMargin() const; + /// top margin + int topMargin() const; + /// bottom margin + int bottomMargin() const; + + docstring const & searchRequestCache() const; + void setSearchRequestCache(docstring const & text); + + /// return the on-screen size of this length + /* + * This is a wrapper around Length::inPixels that uses the + * bufferview width as width and the EM value of the default + * document font. + */ + int inPixels(Length const & len) const; + + /** Return the number of pixels equivalent to \c pix pixels at + * 100dpi and 100% zoom. + */ + int zoomedPixels(int pix) const; /// \return true if the BufferView is at the top of the document. bool isTopScreen() const; @@ -109,11 +147,12 @@ public: /// \return true if the BufferView is at the bottom of the document. bool isBottomScreen() const; - /// perform pending metrics updates. - /** \c Update::FitCursor means first to do a FitCursor, and to + /// Add \p flags to current update flags and trigger an update. + /* If this method is invoked several times before the update + * actually takes place, the effect is cumulative. + * \c Update::FitCursor means first to do a FitCursor, and to * force an update if screen position changes. * \c Update::Force means to force an update in any case. - * \retval true if a screen redraw is needed */ void processUpdateFlags(Update::flags flags); @@ -124,21 +163,25 @@ public: // Returns the amount of horizontal scrolling applied to the // top-level row where the cursor lies int horizScrollOffset() const; + // Returns the amount of horizontal scrolling applied to the + // row of text starting at (pit, pos) + int horizScrollOffset(Text const * text, + pit_type pit, pos_type pos) const; - // Points to the top-level row where the cursor lies (during draw). - CursorSlice const & currentRowSlice() const; - - // Points to the top-level row where the cursor lied at last draw event. - CursorSlice const & lastRowSlice() const; - - /// reset the scrollbar to reflect current view position. - void updateScrollbar(); + /// reset the scrollbar parameters to reflect current view position. + void updateScrollbarParameters(); /// return the Scrollbar Parameters. ScrollbarParameters const & scrollbarParameters() const; /// \return Tool tip for the given position. docstring toolTip(int x, int y) const; /// \return the context menu for the given position. std::string contextMenu(int x, int y) const; + /// \return the math inset with a context menu for the given position + Inset const * mathContextMenu(InsetMathNest const * inset, + CoordCache::Insets const & inset_cache, int x, int y) const; + /// \return the clickable math inset for the given position + Inset const * clickableMathInset(InsetMathNest const * inset, + CoordCache::Insets const & inset_cache, int x, int y) const; /// Save the current position as bookmark. /// if idx == 0, save to temp_bookmark @@ -158,7 +201,9 @@ public: void gotoLabel(docstring const & label); /// set the cursor based on the given TeX source row. - void setCursorFromRow(int row); + bool setCursorFromRow(int row); + /// set the cursor based on the given start and end TextEntries. + bool setCursorFromEntries(TexRow::TextEntry start, TexRow::TextEntry end); /// set cursor to the given inset. Return true if found. bool setCursorFromInset(Inset const *); @@ -169,17 +214,17 @@ public: /// This method will automatically scroll and update the BufferView /// (metrics+drawing) if needed. void showCursor(); + /// Ensure the passed cursor \p dit is visible. /// This method will automatically scroll and update the BufferView /// (metrics+drawing) if needed. - /// \param recenter Whether the cursor should be centered on screen - void showCursor(DocIterator const & dit, bool recenter, - bool update); + /// \param how Use this scroll strategy + /// \param force If true, update screen after scrolling + void showCursor(DocIterator const & dit, ScrollType how, bool update); /// Scroll to the cursor. - void scrollToCursor(); - /// Scroll to the cursor. - /// \param recenter Whether the cursor should be centered on screen - bool scrollToCursor(DocIterator const & dit, bool recenter); + /// \param how Use this scroll strategy + /// \return true if screen was scrolled + bool scrollToCursor(DocIterator const & dit, ScrollType how); /// scroll down document by the given number of pixels. int scrollDown(int pixels); /// scroll up document by the given number of pixels. @@ -199,7 +244,7 @@ public: /// return the inline completion postfix. docstring const & inlineCompletion() const; /// return the number of unique characters in the inline completion. - size_t const & inlineCompletionUniqueChars() const; + size_t inlineCompletionUniqueChars() const; /// return the position in the buffer of the inline completion postfix. DocIterator const & inlineCompletionPos() const; /// make sure inline completion position is OK @@ -219,7 +264,7 @@ public: /// request an X11 selection. /// \return the selected string. - docstring const requestSelection(); + docstring requestSelection(); /// clear the X11 selection. void clearSelection(); @@ -231,9 +276,6 @@ public: /// \sa WorkArea void mouseEventDispatch(FuncRequest const & ev); - /// access to anchor. - pit_type anchor_ref() const; - /// CursorStatus cursorStatus(DocIterator const & dit) const; /// access to full cursor. @@ -241,8 +283,10 @@ public: /// access to full cursor. Cursor const & cursor() const; /// sets cursor. - /// This will also open all relevant collapsable insets. + /// This will also open all relevant collapsible insets. void setCursor(DocIterator const &); + /// set the selection up to dit. + void setCursorSelectionTo(DocIterator const & dit); /// Check deleteEmptyParagraphMechanism and update metrics if needed. /// \retval true if an update was needed. bool checkDepm(Cursor & cur, Cursor & old); @@ -258,13 +302,21 @@ public: */ void putSelectionAt(DocIterator const & cur, int length, bool backwards); + /// set a selection between \p from and \p to + void setSelection(DocIterator const & from, + DocIterator const & to); /// selects the item at cursor if its paragraph is empty. bool selectIfEmpty(DocIterator & cur); - /// update the internal \c ViewMetricsInfo. + /// Ditch all metrics information and rebuild it. Set the update + /// flags and the draw strategy flags accordingly. void updateMetrics(); + // this is the "nodraw" drawing stage: only set the positions of the + // insets in metrics cache. + void updatePosCache(); + /// TextMetrics const & textMetrics(Text const * t) const; TextMetrics & textMetrics(Text const * t); @@ -276,18 +328,32 @@ public: /// CoordCache const & coordCache() const; + /// + bool hasMathRow(MathData const * cell) const; + /// + MathRow const & mathRow(MathData const * cell) const; + /// + void setMathRow(MathData const * cell, MathRow const & mrow); + /// Point getPos(DocIterator const & dit) const; /// is the paragraph of the cursor visible ? bool paragraphVisible(DocIterator const & dit) const; - /// is the cursor currently visible in the view - bool cursorInView(Point const & p, int h) const; - /// get the position and height of the cursor - void cursorPosAndHeight(Point & p, int & h) const; - - + /// is the caret currently visible in the view + bool caretInView() const; + /// get the position and height of the caret + void caretPosAndDim(Point & p, Dimension & dim) const; + /// compute the shape of the caret + void buildCaretGeometry(bool complet); + /// the shape of the caret + frontend::CaretGeometry const & caretGeometry() const; + + /// Returns true when metrics have been computed at least once + bool ready() const { return width_ > 0 && height_ > 0; } + /// Returns true when the BufferView is not ready for drawing + bool busy() const; /// - void draw(frontend::Painter & pain); + void draw(frontend::Painter & pain, bool paint_caret); /// get this view's keyboard map handler. Intl & getIntl(); @@ -306,7 +372,7 @@ public: /// This signal is emitted when some dialog needs to be shown with /// some data. void showDialog(std::string const & name, std::string const & data, - Inset * inset = 0); + Inset * inset = nullptr); /// This signal is emitted when some dialogs needs to be updated. void updateDialog(std::string const & name, std::string const & data); @@ -319,7 +385,7 @@ public: // Insert plain text file (if filename is empty, prompt for one) void insertPlaintextFile(support::FileName const & f, bool asParagraph); /// - void insertLyXFile(support::FileName const & f); + void insertLyXFile(support::FileName const & f, bool const ignorelang = false); /// save temporary bookmark for jump back navigation void bookmarkEditPosition(); /// Find and return the inset associated with given dialog name. @@ -332,6 +398,16 @@ public: bool clickableInset() const; /// void makeDocumentClass(); + /// Are we currently performing a selection with the mouse? + bool mouseSelecting() const; + + /// Reference value for statistics (essentially subtract this from the actual value to see relative counts) + /// (words/chars/chars no blanks) + int stats_ref_value_w() const; + int stats_ref_value_c() const; + int stats_ref_value_nb() const; + //signals need for update in gui + bool stats_update_trigger(); private: /// noncopyable @@ -343,6 +419,15 @@ private: /// Update current paragraph metrics. /// \return true if no further update is needed. bool singleParUpdate(); + /** Helper for the public updateMetrics() and for processUpdateFlags() + * * When \c force is true, get rid of all paragraph metrics and + rebuild them anew. + * * When it is false, keep the paragraphs that are still visible in + * WorkArea and rebuild the missing ones. + * + * This does also set the anchor paragraph and its position correctly + */ + void updateMetrics(bool force); // Set the row on which the cursor lives. void setCurrentRowSlice(CursorSlice const & rowSlice);