X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.h;h=92e898735065ac2f8146fbb7b14fd8a3f43fac80;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=5b277c4edc8e7dab79584040e114f90cfb3ecdc7;hpb=401b223dfbc457424e80e86e9b8125cbe7d69cea;p=lyx.git diff --git a/src/BufferView.h b/src/BufferView.h index 5b277c4edc..92e8987350 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -15,6 +15,8 @@ #ifndef BUFFER_VIEW_H #define BUFFER_VIEW_H +#include "DocumentClassPtr.h" +#include "TexRow.h" #include "update_flags.h" #include "support/strfwd.h" @@ -31,15 +33,20 @@ class Buffer; class Change; class CoordCache; class Cursor; +class CursorSlice; +class DispatchResult; class DocIterator; class DocumentClass; class FuncRequest; class FuncStatus; class Intl; class Inset; +class Length; +class PainterInfo; class ParIterator; class ParagraphMetrics; class Point; +class TexRow; class Text; class TextMetrics; @@ -52,15 +59,15 @@ enum CursorStatus { /// 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. @@ -99,6 +106,14 @@ public: /// left margin int leftMargin() const; + /// 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 true if the BufferView is at the top of the document. bool isTopScreen() const; @@ -113,9 +128,23 @@ public: */ void processUpdateFlags(Update::flags flags); - /// move the screen to fit the cursor. + /// return true if one shall move the screen to fit the cursor. /// Only to be called with good y coordinates (after a bv::metrics) - bool fitCursor(); + bool needsFitCursor() const; + + // 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; + + // Returns true if the row of text starting at (pit, pos) was scrolled + // at the last draw event. + bool hadHorizScrollOffset(Text const * text, + pit_type pit, pos_type pos) const; + /// reset the scrollbar to reflect current view position. void updateScrollbar(); /// return the Scrollbar Parameters. @@ -123,7 +152,7 @@ public: /// \return Tool tip for the given position. docstring toolTip(int x, int y) const; /// \return the context menu for the given position. - docstring contextMenu(int x, int y) const; + std::string contextMenu(int x, int y) const; /// Save the current position as bookmark. /// if idx == 0, save to temp_bookmark @@ -143,7 +172,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 *); @@ -152,20 +183,19 @@ public: void recenter(); /// Ensure that the BufferView cursor is visible. /// This method will automatically scroll and update the BufferView - /// if needed. - void showCursor(); + /// (metrics+drawing) if needed. + void showCursor(); /// Ensure the passed cursor \p dit is visible. /// This method will automatically scroll and update the BufferView - /// if needed. + /// (metrics+drawing) if needed. /// \param recenter Whether the cursor should be centered on screen - void showCursor(DocIterator const & dit, bool recenter = false); + void showCursor(DocIterator const & dit, bool recenter, + 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); - /// LFUN_SCROLL Helper. - void lfunScroll(FuncRequest const & cmd); /// scroll down document by the given number of pixels. int scrollDown(int pixels); /// scroll up document by the given number of pixels. @@ -173,7 +203,7 @@ public: /// scroll document by the given number of pixels. int scroll(int pixels); /// Scroll the view by a number of pixels. - void scrollDocView(int pixels); + void scrollDocView(int pixels, bool update); /// Set the cursor position based on the scrollbar one. void setCursorFromScrollbar(); @@ -188,9 +218,11 @@ public: size_t const & inlineCompletionUniqueChars() const; /// return the position in the buffer of the inline completion postfix. DocIterator const & inlineCompletionPos() const; + /// make sure inline completion position is OK + void resetInlineCompletionPos(); /// set the inline completion postfix and its position in the buffer. /// Updates the updateFlags in \c cur. - void setInlineCompletion(Cursor & cur, DocIterator const & pos, + void setInlineCompletion(Cursor const & cur, DocIterator const & pos, docstring const & completion, size_t uniqueChars = 0); /// translate and insert a character, using the correct keymap. @@ -199,8 +231,7 @@ public: /// \return true if we've made a decision bool getStatus(FuncRequest const & cmd, FuncStatus & flag); /// execute the given function. - /// \return true if the function has been processed. - bool dispatch(FuncRequest const & argument); + void dispatch(FuncRequest const & cmd, DispatchResult & dr); /// request an X11 selection. /// \return the selected string. @@ -228,6 +259,8 @@ public: /// sets cursor. /// This will also open all relevant collapsable 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); @@ -244,6 +277,9 @@ public: void putSelectionAt(DocIterator const & cur, int length, bool backwards); + /// selects the item at cursor if its paragraph is empty. + bool selectIfEmpty(DocIterator & cur); + /// update the internal \c ViewMetricsInfo. void updateMetrics(); @@ -259,7 +295,7 @@ public: CoordCache const & coordCache() const; /// - Point getPos(DocIterator const & dit, bool boundary) const; + 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 @@ -308,23 +344,36 @@ public: Inset * editedInset(std::string const & name) const; /// Associate an inset associated with given dialog name. void editInset(std::string const & name, Inset * inset); + /// + void clearLastInset(Inset * inset) const; + /// Is the mouse hovering a clickable inset or element? + bool clickableInset() const; + /// + void makeDocumentClass(); private: /// noncopyable BufferView(BufferView const &); void operator=(BufferView const &); - // the position relative to (0, baseline) of outermost paragraph - Point coordOffset(DocIterator const & dit, bool boundary) const; + /// the position relative to (0, baseline) of outermost paragraph + Point coordOffset(DocIterator const & dit) const; /// Update current paragraph metrics. /// \return true if no further update is needed. bool singleParUpdate(); + // Set the row on which the cursor lives. + void setCurrentRowSlice(CursorSlice const & rowSlice); + + // Check whether the row where the cursor lives needs to be scrolled. + // Update the drawing strategy if needed. + void checkCursorScrollOffset(PainterInfo & pi); + /// The minimal size of the document that is visible. Used /// when it is allowed to scroll below the document. int minVisiblePart(); - /// Search recursively for the the innermost inset that covers (x, y) position. + /// Search recursively for the innermost inset that covers (x, y) position. /// \retval 0 if no inset is found. Inset const * getCoveringInset( Text const & text, //< The Text where we start searching. @@ -332,8 +381,12 @@ private: int y //< y-coordinate on screen ) const; + /// Update the hovering status of the insets. This is called when + /// either the screen is updated or when the buffer has scolled. + void updateHoveredInset() const; + /// - void updateLayout(DocumentClass const * const oldlayout); + void updateDocumentClass(DocumentClassConstPtr olddc); /// int width_; ///