Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SVX_UNOEDSRC_HXX
30 : : #define _SVX_UNOEDSRC_HXX
31 : :
32 : : #include <com/sun/star/accessibility/TextSegment.hpp>
33 : :
34 : : #include <tools/solar.h>
35 : : #include <i18npool/lang.h>
36 : : #include <tools/gen.hxx>
37 : : #include <vcl/mapmod.hxx>
38 : : #include <tools/string.hxx>
39 : : #include <tools/color.hxx>
40 : : #include <svl/poolitem.hxx>
41 : : #include <svl/itempool.hxx>
42 : : #include "editeng/editengdllapi.h"
43 : :
44 : : #include <list>
45 : :
46 : : struct ESelection;
47 : : struct EFieldInfo;
48 : : struct EBulletInfo;
49 : : class OutputDevice;
50 : : class String;
51 : : class SfxItemSet;
52 : : class SvxTextForwarder;
53 : : class SvxViewForwarder;
54 : : class SvxEditViewForwarder;
55 : : class SvxFieldItem;
56 : : class SfxBroadcaster;
57 : : class SvxUnoTextRangeBase;
58 : :
59 : : typedef std::list< SvxUnoTextRangeBase* > SvxUnoTextRangeBaseList;
60 : :
61 : : /** Wrapper class for unified EditEngine/Outliner access
62 : :
63 : : This class wraps a textual object, which might or might not
64 : : contain an EditEngine/Outliner. Is used e.g. for filling an
65 : : EditEngine with the content of a cell, note page or page template.
66 : : */
67 : 104143 : class EDITENG_DLLPUBLIC SvxEditSource
68 : : {
69 : : public:
70 : : virtual ~SvxEditSource();
71 : :
72 : : /// Returns a new reference to the same object. This is a shallow copy
73 : : virtual SvxEditSource* Clone() const = 0;
74 : :
75 : : /** Query the text forwarder
76 : :
77 : : @return the text forwarder, or NULL if the underlying object is dead
78 : : */
79 : : virtual SvxTextForwarder* GetTextForwarder() = 0;
80 : :
81 : : /** Query the view forwarder
82 : :
83 : : @return the view forwarder, or NULL if the underlying object
84 : : is dead, or if no view is available
85 : :
86 : : @derive default implementation provided, overriding is optional
87 : : */
88 : : virtual SvxViewForwarder* GetViewForwarder();
89 : :
90 : : /** Query the edit view forwarder
91 : :
92 : : @param bCreate
93 : : Determines whether an EditView should be created, if there is
94 : : none active. If set to sal_True, and the underlying object is
95 : : not in EditMode, the text forwarder changes and the object is
96 : : set to EditMode.
97 : :
98 : : @return the edit view forwarder, or NULL if the underlying
99 : : object is dead, or if no view is available (if bCreate is
100 : : sal_False, NULL is also returned if the object is not in
101 : : EditMode)
102 : :
103 : : @derive default implementation provided, overriding is optional
104 : :
105 : : @attention If this method is called with bCreate equal to
106 : : sal_True, all previously returned text forwarder can become
107 : : invalid
108 : : */
109 : : virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate = sal_False );
110 : :
111 : : /// Write back data to model
112 : : virtual void UpdateData() = 0;
113 : :
114 : : /** Returns broadcaster the underlying edit engine's events are sent from
115 : :
116 : : @derive default implementation provided, overriding is optional
117 : : */
118 : : virtual SfxBroadcaster& GetBroadcaster() const;
119 : :
120 : : /** adds the given SvxUnoTextRangeBase to the text object
121 : : capsulated by this SvxEditSource. This allows the text
122 : : object to inform all created text ranges about changes
123 : : and also allows to re use already created instances.
124 : : All SvxUnoTextRangeBase must remove itself with
125 : : removeRange() before theire deleted. */
126 : : virtual void addRange( SvxUnoTextRangeBase* pNewRange );
127 : :
128 : : /** removes the given SvxUnoTextRangeBase from the text
129 : : object capsulated by this SvxEditSource. This text range
130 : : will not be informed any longer of changes on the underlying
131 : : text and will also not re used anymore. */
132 : : virtual void removeRange( SvxUnoTextRangeBase* pOldRange );
133 : :
134 : : /** returns a const list of all text ranges that are registered
135 : : for the underlying text object. */
136 : : virtual const SvxUnoTextRangeBaseList& getRanges() const;
137 : : };
138 : :
139 : :
140 : : /** Contains an EditEngine or an Outliner and unifies access to them.
141 : :
142 : : The EditEngine-UNO objects use this class only. To reflect changes
143 : : not only in the EditEngine, but also in the model data, call
144 : : SvxEditSource::UpdateData(). This copies back the data to the model's
145 : : EditTextObject/OutlinerParaObject.
146 : : */
147 : 24483 : class EDITENG_DLLPUBLIC SvxTextForwarder
148 : : {
149 : : public:
150 : : virtual ~SvxTextForwarder();
151 : :
152 : : virtual sal_uInt16 GetParagraphCount() const = 0;
153 : : virtual sal_uInt16 GetTextLen( sal_uInt16 nParagraph ) const = 0;
154 : : virtual String GetText( const ESelection& rSel ) const = 0;
155 : : virtual SfxItemSet GetAttribs( const ESelection& rSel, sal_Bool bOnlyHardAttrib = 0 ) const = 0;
156 : : virtual SfxItemSet GetParaAttribs( sal_uInt16 nPara ) const = 0;
157 : : virtual void SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet ) = 0;
158 : : virtual void RemoveAttribs( const ESelection& rSelection, sal_Bool bRemoveParaAttribs, sal_uInt16 nWhich ) = 0;
159 : : virtual void GetPortions( sal_uInt16 nPara, std::vector<sal_uInt16>& rList ) const = 0;
160 : :
161 : : virtual sal_uInt16 GetItemState( const ESelection& rSel, sal_uInt16 nWhich ) const = 0;
162 : : virtual sal_uInt16 GetItemState( sal_uInt16 nPara, sal_uInt16 nWhich ) const = 0;
163 : :
164 : : virtual void QuickInsertText( const String& rText, const ESelection& rSel ) = 0;
165 : : virtual void QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel ) = 0;
166 : : virtual void QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel ) = 0;
167 : : virtual void QuickInsertLineBreak( const ESelection& rSel ) = 0;
168 : :
169 : : virtual XubString CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor ) = 0;
170 : : virtual void FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, xub_StrLen nPos ) = 0;
171 : :
172 : : virtual SfxItemPool* GetPool() const = 0;
173 : :
174 : : virtual const SfxItemSet* GetEmptyItemSetPtr() = 0;
175 : :
176 : : // implementation functions for XParagraphAppend and XTextPortionAppend
177 : : virtual void AppendParagraph() = 0;
178 : : virtual xub_StrLen AppendTextPortion( sal_uInt16 nPara, const String &rText, const SfxItemSet &rSet ) = 0;
179 : :
180 : : // XTextCopy
181 : : virtual void CopyText(const SvxTextForwarder& rSource) = 0;
182 : :
183 : : /** Query state of forwarder
184 : :
185 : : @return sal_False, if no longer valid
186 : : */
187 : : virtual sal_Bool IsValid() const = 0;
188 : :
189 : : /** Query language of character at given position on the underlying edit engine
190 : :
191 : : @param nPara[0 .. n-1]
192 : : Index of paragraph to query language in
193 : :
194 : : @param nIndex[0 .. m-1]
195 : : Index of character to query language of
196 : : */
197 : : virtual LanguageType GetLanguage( sal_uInt16 nPara, sal_uInt16 nIndex ) const = 0;
198 : :
199 : : /** Query number of fields in the underlying edit engine
200 : :
201 : : @param nPara[0 .. n-1]
202 : : Index of paragraph to query field number in
203 : : */
204 : : virtual sal_uInt16 GetFieldCount( sal_uInt16 nPara ) const = 0;
205 : :
206 : : /** Query information for given field number in the underlying edit engine
207 : :
208 : : @param nPara[0 .. n-1]
209 : : Index of paragraph to query field info in
210 : :
211 : : @param nField[0 .. m-1]
212 : : Index of field to query information of
213 : : */
214 : : virtual EFieldInfo GetFieldInfo( sal_uInt16 nPara, sal_uInt16 nField ) const = 0;
215 : :
216 : : /** Query information regarding bullets for given paragraph on the underlying edit engine
217 : :
218 : : @param nPara[0 .. n-1]
219 : : Index of paragraph to query bullet info on
220 : : */
221 : : virtual EBulletInfo GetBulletInfo( sal_uInt16 nPara ) const = 0;
222 : :
223 : : /** Query the bounding rectangle of the given character
224 : :
225 : : @param nPara[0 .. n]
226 : : Index of paragraph to query the bounds in. <p>The virtual
227 : : character after the last character of the represented text,
228 : : i.e. the one at position n is a special case. Because it does
229 : : not represent an existing character its bounding box is
230 : : defined in relation to preceding characters. It should be
231 : : rougly equivalent to the bounding box of some character when
232 : : inserted at the end of the text. Its height typically being
233 : : the maximal height of all the characters in the text or the
234 : : height of the preceding character, its width being at least
235 : : one pixel so that the bounding box is not degenerate.<br>
236 : :
237 : : @param nIndex[0 .. m-1]
238 : : Index of character to query the bounds of
239 : :
240 : : @return rectangle in logical coordinates, relative to upper
241 : : left corner of text. The coordinates returned here are to be
242 : : interpreted in the map mode given by GetMapMode().
243 : : */
244 : : virtual Rectangle GetCharBounds( sal_uInt16 nPara, sal_uInt16 nIndex ) const = 0;
245 : :
246 : : /** Query the bounding rectangle of the given paragraph
247 : :
248 : : @param nPara[0 .. n-1]
249 : : Index of paragraph to query the bounds of
250 : :
251 : : @return rectangle in logical coordinates, relative to upper
252 : : left corner of text. The coordinates returned here are to be
253 : : interpreted in the map mode given by GetMapMode().
254 : : */
255 : : virtual Rectangle GetParaBounds( sal_uInt16 nPara ) const = 0;
256 : :
257 : : /** Query the map mode of the underlying EditEngine/Outliner
258 : :
259 : : @return the map mode used on the EditEngine/Outliner. The
260 : : values returned by GetParaBounds() and GetCharBounds() are to
261 : : be interpreted in this map mode, the point given to
262 : : GetIndexAtPoint() is interpreted in this map mode.
263 : : */
264 : : virtual MapMode GetMapMode() const = 0;
265 : :
266 : : /** Query the reference output device of the underlying EditEngine/Outliner
267 : :
268 : : @return the OutputDevice used from the EditEngine/Outliner to
269 : : format the text. It should be used when performing e.g. font
270 : : calculations, since this is usually a printer with fonts and
271 : : resolution different from the screen.
272 : : */
273 : : virtual OutputDevice* GetRefDevice() const = 0;
274 : :
275 : : /** Query paragraph and character index of the character at the
276 : : given point. Returns sal_True on success, sal_False otherwise
277 : :
278 : : @param rPoint
279 : : Point to query text position of. Is interpreted in logical
280 : : coordinates, relativ to the upper left corner of the text, and
281 : : in the map mode given by GetMapMode()
282 : :
283 : : @param rPara[0 .. n-1]
284 : : Index of paragraph the point is within
285 : :
286 : : @param rIndex[0 .. m-1]
287 : : Index of character the point is over
288 : :
289 : : @return sal_True, if the point is over any text and both rPara and rIndex are valid
290 : :
291 : : */
292 : : virtual sal_Bool GetIndexAtPoint( const Point& rPoint, sal_uInt16& rPara, sal_uInt16& rIndex ) const = 0;
293 : :
294 : : /** Get the start and the end index of the word at the given index
295 : :
296 : : An index value on a word leads from the first character of
297 : : that word up to and including the last space before the next
298 : : word. The index values returned do not contain any leading or
299 : : trailing white-space. If the input indices are invalid,
300 : : sal_False is returned.
301 : :
302 : : @param nPara[0 .. n-1]
303 : : Index of paragraph to start the search in
304 : :
305 : : @param nIndex[0 .. m-1]
306 : : Index of character to query the search on
307 : :
308 : : @param rStart
309 : : Start index (in the same paragraph)
310 : :
311 : : @param rEnd
312 : : End index (in the same paragraph), this point to the last
313 : : character still contained in the query
314 : :
315 : : @return sal_True, if the result is non-empty
316 : : */
317 : : virtual sal_Bool GetWordIndices( sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt16& rStart, sal_uInt16& rEnd ) const = 0;
318 : :
319 : : /** Query range of similar attributes
320 : :
321 : : Please note that the range returned is half-open: [nStartIndex,nEndIndex)
322 : :
323 : : @param nStartIndex
324 : : Herein, the start index of the range of similar attributes is returned
325 : :
326 : : @param nEndIndex
327 : : Herein, the end index (exclusive) of the range of similar attributes is returned
328 : :
329 : : @param nIndex
330 : : The character index from which the range of similar attributed characters is requested
331 : :
332 : : @return sal_True, if the range has been successfully determined
333 : : */
334 : : virtual sal_Bool GetAttributeRun( sal_uInt16& nStartIndex, sal_uInt16& nEndIndex, sal_uInt16 nPara, sal_uInt16 nIndex ) const = 0;
335 : :
336 : : /** Query number of lines in the formatted paragraph
337 : :
338 : : @param nPara[0 .. n-1]
339 : : Index of paragraph to query number of lines in
340 : :
341 : : @return number of lines in given paragraph
342 : :
343 : : */
344 : : virtual sal_uInt16 GetLineCount( sal_uInt16 nPara ) const = 0;
345 : :
346 : : /** Query line length
347 : :
348 : : @param nPara[0 .. n-1]
349 : : Index of paragraph to query line length in
350 : :
351 : : @param nLine[0 .. m-1]
352 : : Index of line in paragraph to query line length of
353 : :
354 : : */
355 : : virtual sal_uInt16 GetLineLen( sal_uInt16 nPara, sal_uInt16 nLine ) const = 0;
356 : :
357 : : /** Query bounds of line in paragraph
358 : :
359 : : @param rStart [output param; 0 .. text_len]
360 : : The index in the paragraph text that belongs to the chara at the start of the line
361 : :
362 : : @param rEnd [output param; 0 .. text_len]
363 : : The index in the paragraph text that follows the last chara in the line
364 : :
365 : : @param nParagraph[0 .. n-1]
366 : : Index of paragraph to query line length in
367 : :
368 : : @param nLine[0 .. m-1]
369 : : Index of line in paragraph to query line length of
370 : :
371 : : */
372 : : virtual void GetLineBoundaries( /*out*/sal_uInt16 &rStart, /*out*/sal_uInt16 &rEnd, sal_uInt16 nParagraph, sal_uInt16 nLine ) const = 0;
373 : :
374 : : /** Query the line number for a index in the paragraphs text
375 : :
376 : : @param nPara[0 .. n-1]
377 : : Index of paragraph to query line length in
378 : :
379 : : @param nIndex[0 .. m-1]
380 : : Index of of the chara in the paragraph text
381 : :
382 : : @returns [0 .. k-1]
383 : : The line number of the chara in the paragraph
384 : : */
385 : : virtual sal_uInt16 GetLineNumberAtIndex( sal_uInt16 nPara, sal_uInt16 nIndex ) const = 0;
386 : :
387 : : /** Delete given text range and reformat text
388 : :
389 : : @param rSelection
390 : : The text range to be deleted
391 : :
392 : : @return sal_True if text has been successfully deleted
393 : : */
394 : : virtual sal_Bool Delete( const ESelection& rSelection ) = 0;
395 : :
396 : : /** Insert/Replace given text in given range and reformat text
397 : :
398 : : @param rText
399 : : Text to insert/replace
400 : :
401 : : @param rSel
402 : : Selection where text should be replaced. The empty selection inserts
403 : :
404 : : @return sal_True if text has been successfully inserted
405 : : */
406 : : virtual sal_Bool InsertText( const String& rText, const ESelection& rSel ) = 0;
407 : :
408 : : /** Updates the formatting
409 : :
410 : : @see EditEngine::QuickFormatDoc() for details
411 : :
412 : : @return sal_True if text have been successfully reformatted
413 : : */
414 : : virtual sal_Bool QuickFormatDoc( sal_Bool bFull=sal_False ) = 0;
415 : :
416 : : /** Get the outline depth of given paragraph
417 : :
418 : : @param nPara
419 : : Index of the paragraph to query the depth of
420 : :
421 : : @return the outline level of the given paragraph. The range is
422 : : [0,n), where n is the maximal outline level.
423 : : */
424 : : virtual sal_Int16 GetDepth( sal_uInt16 nPara ) const = 0;
425 : :
426 : : /** Set the outline depth of given paragraph
427 : :
428 : : @param nPara
429 : : Index of the paragraph to set the depth of
430 : :
431 : : @param nNewDepth
432 : : The depth to set on the given paragraph. The range is
433 : : [0,n), where n is the maximal outline level.
434 : :
435 : : @return sal_True, if depth could be successfully set. Reasons for
436 : : failure are e.g. the text does not support outline level
437 : : (EditEngine), or the depth range is exceeded.
438 : : */
439 : : virtual sal_Bool SetDepth( sal_uInt16 nPara, sal_Int16 nNewDepth ) = 0;
440 : :
441 : : virtual sal_Int16 GetNumberingStartValue( sal_uInt16 nPara );
442 : : virtual void SetNumberingStartValue( sal_uInt16 nPara, sal_Int16 nNumberingStartValue );
443 : :
444 : : virtual sal_Bool IsParaIsNumberingRestart( sal_uInt16 nPara );
445 : : virtual void SetParaIsNumberingRestart( sal_uInt16 nPara, sal_Bool bParaIsNumberingRestart );
446 : : };
447 : :
448 : : /** Encapsulates the document view for the purpose of unified
449 : : EditEngine/Outliner access.
450 : :
451 : : This one has to be different from the SvxEditViewForwarder, since
452 : : the latter is only valid in edit mode.
453 : : */
454 : 97735 : class EDITENG_DLLPUBLIC SvxViewForwarder
455 : : {
456 : : public:
457 : : virtual ~SvxViewForwarder();
458 : :
459 : : /** Query state of forwarder
460 : :
461 : : @return sal_False, if no longer valid
462 : : */
463 : : virtual sal_Bool IsValid() const = 0;
464 : :
465 : : /** Query visible area of the view containing the text
466 : :
467 : : @return the visible rectangle of the text, i.e. the part of
468 : : the EditEngine or Outliner that is currently on screen. The
469 : : values are already in screen coordinates (pixel), and have to
470 : : be relative to the EditEngine/Outliner's upper left corner.
471 : : */
472 : : virtual Rectangle GetVisArea() const = 0;
473 : :
474 : : /** Convert from logical, EditEngine-relative coordinates to screen coordinates
475 : :
476 : : @param rPoint
477 : : Point in logical, EditEngine-relative coordinates.
478 : :
479 : : @param rMapMode
480 : : The map mode to interpret the coordinates in.
481 : :
482 : : @return the point in screen coordinates
483 : : */
484 : : virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const = 0;
485 : :
486 : : /** Convert from screen to logical, EditEngine-relative coordinates
487 : :
488 : : @param rPoint
489 : : Point in screen coordinates
490 : :
491 : : @param rMapMode
492 : : The map mode to interpret the coordinates in.
493 : :
494 : : @return the point in logical coordinates.
495 : : */
496 : : virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const = 0;
497 : :
498 : : };
499 : :
500 : :
501 : : /** Encapsulates EditView and OutlinerView for the purpose of unified
502 : : EditEngine/Outliner access
503 : : */
504 [ - + ]: 139 : class SvxEditViewForwarder : public SvxViewForwarder
505 : : {
506 : : public:
507 : :
508 : : /** Query current selection.
509 : :
510 : : @param rSelection
511 : : Contains the current selection after method call
512 : :
513 : : @return sal_False, if there is no view or no selection (the empty selection _is_ a selection)
514 : :
515 : : */
516 : : virtual sal_Bool GetSelection( ESelection& rSelection ) const = 0;
517 : :
518 : : /** Set selection in view.
519 : :
520 : : @param rSelection
521 : : The selection to set
522 : :
523 : : @return sal_False, if there is no view or selection is invalid
524 : : */
525 : : virtual sal_Bool SetSelection( const ESelection& rSelection ) = 0;
526 : :
527 : : /** Copy current selection to clipboard.
528 : :
529 : : @return sal_False if no selection or no view (the empty selection _is_ a selection)
530 : : */
531 : : virtual sal_Bool Copy() = 0;
532 : :
533 : : /** Cut current selection to clipboard.
534 : :
535 : : @eturn sal_False if no selection or no view (the empty selection _is_ a selection)
536 : : */
537 : : virtual sal_Bool Cut() = 0;
538 : :
539 : : /** Paste clipboard into current selection.
540 : :
541 : : @return sal_False if no view or no selection (the empty selection _is_ a selection)
542 : : */
543 : : virtual sal_Bool Paste() = 0;
544 : :
545 : : };
546 : :
547 : : #endif
548 : :
549 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|