4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
8 * \author Lars Gullik Bjønnes
11 * Full author contact details are available in file CREDITS.
18 #include "dispatchresult.h"
21 #include "lyxlayout_ptr_fwd.h"
22 #include "ParagraphList.h"
47 /// This class encapsulates the main text data and operations in LyX
54 LyXFont getFont(Buffer const & buffer, Paragraph const & par,
57 void applyOuterFont(Buffer const & buffer, LyXFont &) const;
59 LyXFont getLayoutFont(Buffer const & buffer, pit_type pit) const;
61 LyXFont getLabelFont(Buffer const & buffer,
62 Paragraph const & par) const;
64 void setCharFont(Buffer const & buffer, pit_type pit, pos_type pos,
65 LyXFont const & font);
67 void setCharFont(Buffer const & buffer, pit_type pit, pos_type pos,
68 LyXFont const & font, bool toggleall);
70 /// what you expect when pressing <enter> at cursor position
71 void breakParagraph(LCursor & cur, bool keep_layout = false);
73 /// set layout over selection
74 void setLayout(Buffer const & buffer, pit_type start, pit_type end,
75 std::string const & layout);
76 /// Set given layout to current cursor position.
77 /// FIXME: replace LCursor with DocIterator.
78 void setLayout(LCursor & cur, std::string const & layout);
80 /// what type of depth change to make
85 /// Increase or decrease the nesting depth of the selected paragraph(s)
86 /// FIXME: replace LCursor with DocIterator.
87 void changeDepth(LCursor & cur, DEPTH_CHANGE type);
89 /// Returns whether something would be changed by changeDepth
90 /// FIXME: replace LCursor with DocIterator.
91 bool changeDepthAllowed(LCursor & cur, DEPTH_CHANGE type) const;
93 /// Set font over selection paragraphs and rebreak.
94 /// FIXME: replace LCursor with DocIterator.
95 void setFont(LCursor & cur, LyXFont const &, bool toggleall = false);
98 void toggleFree(LCursor & cur, LyXFont const &, bool toggleall = false);
101 /// FIXME: replace LCursor with DocIterator.
102 docstring getStringToIndex(LCursor const & cur);
104 /// insert a character at cursor position
105 /// FIXME: replace LCursor with DocIterator.
106 void insertChar(LCursor & cur, char_type c);
107 /// insert an inset at cursor position
108 /// FIXME: replace LCursor with DocIterator.
109 void insertInset(LCursor & cur, InsetBase * inset);
111 /// draw text (only used for insets)
112 void draw(PainterInfo & pi, int x, int y) const;
113 /// draw textselection
114 void drawSelection(PainterInfo & pi, int x, int y) const;
116 /// try to handle that request
117 /// FIXME: replace LCursor with DocIterator.
118 void dispatch(LCursor & cur, FuncRequest & cmd);
119 /// do we want to handle this event?
120 bool getStatus(LCursor & cur, FuncRequest const & cmd,
121 FuncStatus & status) const;
123 /// read-only access to individual paragraph
124 Paragraph const & getPar(pit_type pit) const { return pars_[pit]; }
125 /// read-write access to individual paragraph
126 Paragraph & getPar(pit_type pit) { return pars_[pit]; }
127 // Returns the current font and depth as a message.
128 /// FIXME: replace LCursor with DocIterator.
129 docstring currentState(LCursor & cur);
131 /** returns row near the specified
132 * y-coordinate in given paragraph (relative to the screen).
134 /// FIXME: move to TextMetrics.
135 Row const & getRowNearY(BufferView const & bv, int y,
138 /// returns the paragraph number closest to screen y-coordinate.
139 /// This method uses the BufferView CoordCache to locate the
140 /// paragraph. The y-coodinate is allowed to be off-screen and
141 /// the CoordCache will be automatically updated if needed. This is
142 /// the reason why we need a non const BufferView and why this
143 /// method is non-const.
144 /// FIXME: move to TextMetrics.
145 pit_type getPitNearY(BufferView & bv, int y);
147 /** Find the word under \c from in the relative location
148 * defined by \c word_location.
149 * @param from return here the start of the word
150 * @param to return here the end of the word
152 void getWord(CursorSlice & from, CursorSlice & to, word_location const);
153 /// just selects the word the cursor is in
154 void selectWord(LCursor & cur, word_location loc);
156 /// what type of change operation to make
161 /// accept or reject the selected change
162 void acceptOrRejectChange(LCursor & cur, ChangeOp op);
164 /// returns true if par was empty and was removed
165 bool setCursor(LCursor & cur, pit_type par, pos_type pos,
166 bool setfont = true, bool boundary = false);
168 void setCursor(CursorSlice &, pit_type par, pos_type pos);
170 void setCursorIntern(LCursor & cur, pit_type par,
171 pos_type pos, bool setfont = true, bool boundary = false);
173 void setCurrentFont(LCursor & cur);
176 void recUndo(LCursor & cur, pit_type first, pit_type last) const;
178 void recUndo(LCursor & cur, pit_type first) const;
180 /// sets cursor only within this LyXText.
181 /// x,y are screen coordinates
182 void setCursorFromCoordinates(LCursor & cur, int x, int y);
184 /// sets cursor recursively descending into nested editable insets
186 \return the inset pointer if x,y is covering that inset
187 \param x,y are absolute screen coordinates.
188 \retval inset is non-null if the cursor is positionned inside
190 /// FIXME: move to TextMetrics.
191 InsetBase * editXY(LCursor & cur, int x, int y);
193 /// Move cursor one line up.
195 * Returns true if an update is needed after the move.
197 /// FIXME: move to TextMetrics.
198 bool cursorUp(LCursor & cur);
199 /// Move cursor one line down.
201 * Returns true if an update is needed after the move.
203 /// FIXME: move to TextMetrics.
204 bool cursorDown(LCursor & cur);
205 /// Move cursor one position left
207 * Returns true if an update is needed after the move.
209 bool cursorLeft(LCursor & cur);
210 /// Move cursor one position right
212 * Returns true if an update is needed after the move.
214 bool cursorRight(LCursor & cur);
216 bool cursorLeftOneWord(LCursor & cur);
218 bool cursorRightOneWord(LCursor & cur);
220 bool cursorUpParagraph(LCursor & cur);
222 bool cursorDownParagraph(LCursor & cur);
224 /// FIXME: move to TextMetrics.
225 bool cursorHome(LCursor & cur);
227 /// FIXME: move to TextMetrics.
228 bool cursorEnd(LCursor & cur);
230 void cursorPrevious(LCursor & cur);
232 void cursorNext(LCursor & cur);
234 bool cursorTop(LCursor & cur);
236 bool cursorBottom(LCursor & cur);
237 /// Erase character at cursor. Honour change tracking
238 /// FIXME: replace LCursor with DocIterator.
239 bool erase(LCursor & cur);
240 /// Delete character before cursor. Honour CT
241 /// FIXME: replace LCursor with DocIterator.
242 bool backspace(LCursor & cur);
243 // Dissolve the inset under cursor
244 /// FIXME: replace LCursor with DocIterator.
245 bool dissolveInset(LCursor & cur);
247 bool selectWordWhenUnderCursor(LCursor & cur, word_location);
253 text_capitalization = 1,
257 /// Change the case of the word at cursor position.
258 void changeCase(LCursor & cur, TextCase action);
259 /// Transposes the character at the cursor with the one before it
260 void charsTranspose(LCursor & cur);
262 /** the DTP switches for paragraphs. LyX will store the top settings
263 always in the first physical paragraph, the bottom settings in the
264 last. When a paragraph is broken, the top settings rest, the bottom
265 settings are given to the new one.
267 void setParagraph(LCursor & cur,
268 Spacing const & spacing,
270 docstring const & labelwidthstring,
273 /* these things are for search and replace */
275 /// needed to insert the selection
276 /// FIXME: replace LCursor with DocIterator.
277 void insertStringAsLines(LCursor & cur, docstring const & str);
278 /// needed to insert the selection
279 /// FIXME: replace LCursor with DocIterator.
280 void insertStringAsParagraphs(LCursor & cur, docstring const & str);
282 /// Returns an inset if inset was hit, or 0 if not.
283 InsetBase * checkInsetHit(BufferView &, int x, int y);
286 /// FIXME: move to TextMetrics.
287 int singleWidth(Buffer const &, Paragraph const & par,
290 /// FIXME: move to TextMetrics.
291 int singleWidth(Paragraph const & par, pos_type pos, char_type c,
292 LyXFont const & Font) const;
294 /// return the color of the canvas
295 LColor_color backgroundColor() const;
298 * Returns the left beginning of the text.
299 * This information cannot be taken from the layout object, because
300 * in LaTeX the beginning of the text fits in some cases
301 * (for example sections) exactly the label-width.
303 /// FIXME: move to TextMetrics.
304 int leftMargin(Buffer const &, int max_width, pit_type pit, pos_type pos) const;
305 int leftMargin(Buffer const &, int max_width, pit_type pit) const;
307 /// access to our paragraphs
308 ParagraphList const & paragraphs() const { return pars_; }
309 ParagraphList & paragraphs() { return pars_; }
310 /// return true if this is the main text
311 bool isMainText(Buffer const &) const;
313 /// is this row the last in the text?
314 /// FIXME: move to TextMetrics.
315 bool isLastRow(pit_type pit, Row const & row) const;
316 /// is this row the first in the text?
317 /// FIXME: move to TextMetrics.
318 bool isFirstRow(pit_type pit, Row const & row) const;
321 double spacing(Buffer const & buffer, Paragraph const & par) const;
322 /// make a suggestion for a label
323 /// FIXME: replace LCursor with DocIterator.
324 docstring getPossibleLabel(LCursor & cur) const;
325 /// is this paragraph right-to-left?
326 bool isRTL(Buffer const &, Paragraph const & par) const;
328 bool checkAndActivateInset(LCursor & cur, bool front);
331 void write(Buffer const & buf, std::ostream & os) const;
332 /// returns whether we've seen our usual 'end' marker
333 bool read(Buffer const & buf, LyXLex & lex, ErrorList & errorList);
336 /// FIXME: move to TextMetrics.
337 int cursorX(BufferView const &, CursorSlice const & cursor,
338 bool boundary) const;
340 /// FIXME: move to TextMetrics.
341 int cursorY(BufferView const & bv, CursorSlice const & cursor,
342 bool boundary) const;
344 /// delete double spaces, leading spaces, and empty paragraphs around old cursor.
345 /// \retval true if a change has happened and we need a redraw.
346 /// FIXME: replace LCursor with DocIterator. This is not possible right
347 /// now because recordUndo() is called which needs a LCursor.
348 bool deleteEmptyParagraphMechanism(LCursor & cur,
349 LCursor & old, bool & need_anchor_change);
351 /// delete double spaces, leading spaces, and empty paragraphs
352 /// from \first to \last paragraph
353 void deleteEmptyParagraphMechanism(pit_type first, pit_type last, bool trackChanges);
356 /// the current font settings
357 LyXFont current_font;
359 LyXFont real_current_font;
361 int background_color_;
368 /// our 'outermost' font. This is handed down from the surrounding
369 // inset through the pi/mi parameter (pi.base.font)
375 /// return past-the-last paragraph influenced by a layout
377 pit_type undoSpan(pit_type pit);
379 // fix the cursor `cur' after a characters has been deleted at `where'
380 // position. Called by deleteEmptyParagraphMechanism
381 void fixCursorAfterDelete(CursorSlice & cur, CursorSlice const & where);
383 // At cursor position 0, try to merge the paragraph with the one before it.
384 // Ignore change tracking, i.e., physically remove the end-of-par character
385 bool backspacePos0(LCursor & cur);
388 void deleteWordForward(LCursor & cur);
390 void deleteWordBackward(LCursor & cur);
392 void deleteLineForward(LCursor & cur);
395 /// set 'number' font property
396 void number(LCursor & cur);
398 /// paste plain text at current cursor.
399 /// \param str string to paste
400 /// \param asParagraphs whether to paste as paragraphs or as lines
401 void pasteString(LCursor & cur, docstring const & str,