4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Alfredo Braustein
8 * \author Lars Gullik Bjønnes
10 * \author Jürgen Vigna
12 * Full author contact details are available in file CREDITS.
18 #include "CoordCache.h"
20 #include "MetricsInfo.h"
21 #include "TextMetrics.h"
22 #include "update_flags.h"
24 #include "support/types.h"
26 #include <boost/tuple/tuple.hpp>
27 #include <boost/utility.hpp>
28 #include <boost/signal.hpp>
36 namespace support { class FileName; }
47 class ParagraphMetrics;
48 class ViewMetricsInfo;
50 /// Scrollbar Parameters.
51 struct ScrollbarParameters
53 void reset(int h = 0, int p = 0, int l = 0)
60 /// Total document height in pixels.
62 /// Current position in the document in pixels.
64 /// Line-scroll amount in pixels.
68 /// Screen view of a Buffer.
70 * A BufferView encapsulates a view onto a particular
71 * buffer, and allows access to operate upon it. A view
72 * is a sliding window of the entire document rendering.
73 * It is the official interface between the LyX core and
74 * the frontend WorkArea.
80 class BufferView : boost::noncopyable {
83 BufferView(Buffer & buffer);
87 /// return the buffer being viewed.
89 Buffer const * buffer() const;
91 /// perform pending metrics updates.
92 /** \c Update::FitCursor means first to do a FitCursor, and to
93 * force an update if screen position changes.
94 * \c Update::Force means to force an update in any case.
95 * \retval true if a screen redraw is needed
97 bool update(Update::flags flags = Update::FitCursor | Update::Force);
99 /// move the screen to fit the cursor.
100 /// Only to be called with good y coordinates (after a bv::metrics)
102 /// reset the scrollbar to reflect current view position.
103 void updateScrollbar();
104 /// return the Scrollbar Parameters.
105 ScrollbarParameters const & scrollbarParameters() const;
107 /// Save the current position as bookmark.
108 /// if idx == 0, save to temp_bookmark
109 void saveBookmark(unsigned int idx);
110 /// goto a specified position, try top_id first, and then bottom_pit
111 /// return the bottom_pit and top_id of the new paragraph
112 boost::tuple<pit_type, pos_type, int> moveToPosition(
113 pit_type bottom_pit, ///< Paragraph pit, used when par_id is zero or invalid.
114 pos_type bottom_pos, ///< Paragraph pit, used when par_id is zero or invalid.
115 int top_id, ///< Paragraph ID, \sa Paragraph
116 pos_type top_pos ///< Position in the \c Paragraph
118 /// return the current change at the cursor.
119 Change const getCurrentChange() const;
121 /// move cursor to the named label.
122 void gotoLabel(docstring const & label);
124 /// set the cursor based on the given TeX source row.
125 void setCursorFromRow(int row);
127 /// center the document view around the cursor.
129 /// scroll document by the given number of lines of default height.
130 void scroll(int lines);
131 /// Scroll the view by a number of pixels.
132 void scrollDocView(int pixels);
133 /// Set the cursor position based on the scrollbar one.
134 void setCursorFromScrollbar();
136 /// return the pixel width of the document view.
137 int workWidth() const;
138 /// return the pixel height of the document view.
139 int workHeight() const;
141 /// translate and insert a character, using the correct keymap.
142 void translateAndInsert(char_type c, Text * t, Cursor & cur);
144 /// return true for events that will handle.
145 FuncStatus getStatus(FuncRequest const & cmd);
146 /// execute the given function.
147 /// \return the Update::flags for further metrics update.
148 Update::flags dispatch(FuncRequest const & argument);
150 /// request an X11 selection.
151 /// \return the selected string.
152 docstring const requestSelection();
153 /// clear the X11 selection.
154 void clearSelection();
156 /// resize method helper for \c WorkArea
159 void workAreaResize(int width, int height);
161 /// dispatch method helper for \c WorkArea
163 /// \retval true if a redraw is needed
164 bool workAreaDispatch(FuncRequest const & ev);
166 /// access to anchor.
167 pit_type anchor_ref() const;
169 /// access to full cursor.
171 /// access to full cursor.
172 Cursor const & cursor() const;
174 /// This will also open all relevant collapsable insets.
175 void setCursor(DocIterator const &);
176 /// Check deleteEmptyParagraphMechanism and update metrics if needed.
177 /// \retval true if an update was needed.
178 bool checkDepm(Cursor & cur, Cursor & old);
180 /// This is used when handling LFUN_MOUSE_PRESS.
181 bool mouseSetCursor(Cursor & cur);
183 /// sets the selection.
184 /* When \c backwards == false, set anchor
185 * to \c cur and cursor to \c cur + \c length. When \c
186 * backwards == true, set anchor to \c cur and cursor to \c
189 void putSelectionAt(DocIterator const & cur,
190 int length, bool backwards);
192 /// return the internal \c ViewMetricsInfo.
193 /// This is used specifically by the \c Workrea.
195 /// \sa ViewMetricsInfo
196 ViewMetricsInfo const & viewMetricsInfo();
197 /// update the internal \c ViewMetricsInfo.
198 /// \param singlepar indicates wether
199 void updateMetrics(bool singlepar = false);
202 TextMetrics const & textMetrics(Text const * t) const;
203 TextMetrics & textMetrics(Text const * t);
205 ParagraphMetrics const & parMetrics(Text const *, pit_type) const;
208 CoordCache & coordCache() {
212 CoordCache const & coordCache() const {
215 /// get this view's keyboard map handler.
216 Intl & getIntl() { return *intl_.get(); }
218 Intl const & getIntl() const { return *intl_.get(); }
220 /// This signal is emitted when some message shows up.
221 boost::signal<void(docstring)> message;
223 /// This signal is emitted when some dialog needs to be shown.
224 boost::signal<void(std::string name)> showDialog;
226 /// This signal is emitted when some dialog needs to be shown with
228 boost::signal<void(std::string name,
229 std::string data)> showDialogWithData;
231 /// This signal is emitted when some inset dialogs needs to be shown.
232 boost::signal<void(std::string name, std::string data,
233 Inset * inset)> showInsetDialog;
235 /// This signal is emitted when some dialogs needs to be updated.
236 boost::signal<void(std::string name,
237 std::string data)> updateDialog;
239 /// This signal is emitted when the layout at the cursor is changed.
240 boost::signal<void(docstring layout)> layoutChanged;
246 /// Search recursively for the the innermost inset that covers (x, y) position.
247 /// \retval 0 if no inset is found.
248 Inset const * getCoveringInset(
249 Text const & text, //< The Text where we start searching.
250 int x, //< x-coordinate on screen
251 int y //< y-coordinate on screen
259 ScrollbarParameters scrollbarParameters_;
262 ViewMetricsInfo metrics_info_;
264 CoordCache coord_cache_;
268 /// Estimated average par height for scrollbar.
271 void menuInsertLyXFile(std::string const & filen);
273 /// this is used to handle XSelection events in the right manner.
282 bool multiparsel_cache_;
284 pit_type anchor_ref_;
288 /// keyboard mapping object.
289 boost::scoped_ptr<Intl> const intl_;
291 /// last visited inset (kept to send setMouseHover(false) )
294 /// A map from a Text to the associated text metrics
295 typedef std::map<Text const *, TextMetrics> TextMetricsCache;
296 mutable TextMetricsCache text_metrics_;
302 #endif // BUFFERVIEW_H