1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTEXTVIEW_HXX
21 #define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTEXTVIEW_HXX
23 #include "PresenterTheme.hxx"
24 #include <com/sun/star/accessibility/XAccessibleText.hpp>
25 #include <com/sun/star/awt/Size.hpp>
26 #include <com/sun/star/geometry/RealPoint2D.hpp>
27 #include <com/sun/star/geometry/RealSize2D.hpp>
28 #include <com/sun/star/i18n/XBreakIterator.hpp>
29 #include <com/sun/star/i18n/XScriptTypeDetector.hpp>
30 #include <com/sun/star/rendering/XCanvas.hpp>
31 #include <com/sun/star/style/ParagraphAdjust.hpp>
32 #include <com/sun/star/text/XText.hpp>
33 #include <com/sun/star/uno/XComponentContext.hpp>
34 #include <cppuhelper/compbase1.hxx>
35 #include <cppuhelper/basemutex.hxx>
38 namespace sdext
{ namespace presenter
{
40 class PresenterTextCaret
44 const ::boost::function
<css::awt::Rectangle(const sal_Int32
,const sal_Int32
)>&
45 rCharacterBoundsAccess
,
46 const ::boost::function
<void(const css::awt::Rectangle
&)>&
48 ~PresenterTextCaret();
53 sal_Int32
GetParagraphIndex() const { return mnParagraphIndex
;}
54 sal_Int32
GetCharacterIndex() const { return mnCharacterIndex
;}
56 const sal_Int32 nParagraphIndex
,
57 const sal_Int32 nCharacterIndex
);
59 bool IsVisible() const { return mbIsCaretVisible
;}
61 /** Set a (possibly empty) functor that broadcasts changes of the caret
62 position. This is used when a PresenterTextView object is set at
63 the accessibility object so that accessibility events can be sent
64 when the caret changes position.
66 void SetCaretMotionBroadcaster (
67 const ::boost::function
<void(sal_Int32
,sal_Int32
,sal_Int32
,sal_Int32
)>& rBroadcaster
);
69 css::awt::Rectangle
GetBounds() const;
72 sal_Int32 mnParagraphIndex
;
73 sal_Int32 mnCharacterIndex
;
74 sal_Int32 mnCaretBlinkTaskId
;
75 bool mbIsCaretVisible
;
76 const ::boost::function
<css::awt::Rectangle(const sal_Int32
,const sal_Int32
)> maCharacterBoundsAccess
;
77 const ::boost::function
<void(const css::awt::Rectangle
&)> maInvalidator
;
78 ::boost::function
<void(sal_Int32
,sal_Int32
,sal_Int32
,sal_Int32
)> maBroadcaster
;
79 css::awt::Rectangle maCaretBounds
;
83 typedef ::boost::shared_ptr
<PresenterTextCaret
> SharedPresenterTextCaret
;
85 //===== PresenterTextParagraph ================================================
87 class PresenterTextParagraph
90 PresenterTextParagraph (
91 const sal_Int32 nParagraphIndex
,
92 const css::uno::Reference
<css::i18n::XBreakIterator
>& rxBreakIterator
,
93 const css::uno::Reference
<css::i18n::XScriptTypeDetector
>& rxScriptTypeDetector
,
94 const css::uno::Reference
<css::text::XTextRange
>& rxTextRange
,
95 const SharedPresenterTextCaret
& rpCaret
);
98 const css::uno::Reference
<css::rendering::XCanvas
>& rxCanvas
,
99 const css::geometry::RealSize2D
& rSize
,
100 const PresenterTheme::SharedFontDescriptor
& rpFont
,
101 const css::rendering::ViewState
& rViewState
,
102 css::rendering::RenderState
& rRenderState
,
103 const double nTopOffset
,
104 const double nClipTop
,
105 const double nClipBottom
);
107 double GetTotalTextHeight();
109 void SetCharacterOffset (const sal_Int32 nCharacterOffset
);
110 sal_Int32
GetCharacterCount() const;
111 sal_Unicode
GetCharacter (const sal_Int32 nGlobalCharacterIndex
) const;
112 OUString
GetText() const;
113 css::accessibility::TextSegment
GetTextSegment (
114 const sal_Int32 nOffset
,
115 const sal_Int32 nGlobalCharacterIndex
,
116 const sal_Int16 nTextType
) const;
117 css::accessibility::TextSegment
GetWordTextSegment (
118 const sal_Int32 nOffset
,
119 const sal_Int32 nIndex
) const;
120 css::accessibility::TextSegment
CreateTextSegment (
121 sal_Int32 nStartIndex
,
122 sal_Int32 nEndIndex
) const;
123 css::awt::Rectangle
GetCharacterBounds (
124 sal_Int32 nGlobalCharacterIndex
,
125 const bool bCaretBox
);
126 void SetupCellArray (
127 const PresenterTheme::SharedFontDescriptor
& rpFont
);
131 const PresenterTheme::SharedFontDescriptor
& rpFont
);
132 sal_Int32
GetWordBoundary(
133 const sal_Int32 nLocalCharacterIndex
,
134 const sal_Int32 nDistance
);
135 sal_Int32
GetCaretPosition() const;
136 void SetCaretPosition (const sal_Int32 nPosition
) const;
137 void SetOrigin (const double nXOrigin
, const double nYOrigin
);
138 css::awt::Point
GetRelativeLocation() const;
139 css::awt::Size
GetSize();
142 OUString msParagraphText
;
143 const sal_Int32 mnParagraphIndex
;
144 SharedPresenterTextCaret mpCaret
;
146 /** A portion of a string that encodes one unicode cell. It describes
147 number of characters in the unicode string that make up the cell and its
148 width in pixel (with respect to some configuration that is stored
149 externally or implicitly).
154 Cell (const sal_Int32 nCharacterIndex
, const sal_Int32 nCharacterCount
, const double nCellWidth
);
155 sal_Int32 mnCharacterIndex
;
156 sal_Int32 mnCharacterCount
;
163 Line (const sal_Int32 nLineStartCharacterIndex
, const sal_Int32 nLineEndCharacterIndex
);
164 sal_Int32 mnLineStartCharacterIndex
;
165 sal_Int32 mnLineEndCharacterIndex
;
166 sal_Int32 mnLineStartCellIndex
;
167 sal_Int32 mnLineEndCellIndex
;
168 css::uno::Reference
<css::rendering::XTextLayout
> mxLayoutedLine
;
171 css::uno::Sequence
<css::geometry::RealRectangle2D
> maCellBoxes
;
173 void ProvideLayoutedLine (
174 const OUString
& rsParagraphText
,
175 const PresenterTheme::SharedFontDescriptor
& rpFont
,
176 const sal_Int8 nTextDirection
);
177 void ProvideCellBoxes();
178 bool IsEmpty() const;
181 css::uno::Reference
<css::i18n::XBreakIterator
> mxBreakIterator
;
182 css::uno::Reference
<css::i18n::XScriptTypeDetector
> mxScriptTypeDetector
;
183 ::std::vector
<Line
> maLines
;
184 ::std::vector
<sal_Int32
> maWordBoundaries
;
185 // Offset of the top of the paragraph with respect to the origin of the
186 // whole text (specified by mnXOrigin and mnYOrigin).
187 double mnVerticalOffset
;
194 css::style::ParagraphAdjust meAdjust
;
195 sal_Int8 mnWritingMode
;
196 /// The index of the first character in this paragraph with respect to
198 sal_Int32 mnCharacterOffset
;
199 ::std::vector
<Cell
> maCells
;
203 css::i18n::Boundary
& rCurrentLine
,
204 const sal_Int32 nWordBoundary
,
205 const PresenterTheme::SharedFontDescriptor
& rpFont
);
207 css::i18n::Boundary
& rCurrentLine
);
208 sal_Int8
GetTextDirection() const;
209 bool IsTextReferencePointLeft() const;
211 typedef ::boost::shared_ptr
<PresenterTextParagraph
> SharedPresenterTextParagraph
;
213 /** A simple text view that paints text onto a given canvas.
215 class PresenterTextView
220 const css::uno::Reference
<css::uno::XComponentContext
>& rxContext
,
221 const css::uno::Reference
<css::rendering::XCanvas
>& rxCanvas
,
222 const ::boost::function
<void(const css::awt::Rectangle
&)>& rInvalidator
);
223 void SetText (const css::uno::Reference
<css::text::XText
>& rxText
);
224 void SetTextChangeBroadcaster (const ::boost::function
<void()>& rBroadcaster
);
226 void SetLocation (const css::geometry::RealPoint2D
& rLocation
);
227 void SetSize (const css::geometry::RealSize2D
& rSize
);
228 double GetTotalTextHeight();
230 void SetFont (const PresenterTheme::SharedFontDescriptor
& rpFont
);
236 /** Move the caret forward or backward by character or by word.
238 Should be either -1 or +1 to move caret backwards or forwards,
242 css::accessibility::AccessibleTextType constants.
245 const sal_Int32 nDistance
,
246 const sal_Int16 nTextType
);
248 void Paint (const css::awt::Rectangle
& rUpdateBox
);
250 SharedPresenterTextCaret
GetCaret() const;
252 sal_Int32
GetParagraphCount() const;
253 SharedPresenterTextParagraph
GetParagraph (const sal_Int32 nParagraphIndex
) const;
256 css::uno::Reference
<css::rendering::XCanvas
> mxCanvas
;
258 css::uno::Reference
<css::i18n::XBreakIterator
> mxBreakIterator
;
259 css::uno::Reference
<css::i18n::XScriptTypeDetector
> mxScriptTypeDetector
;
260 css::geometry::RealPoint2D maLocation
;
261 css::geometry::RealSize2D maSize
;
262 PresenterTheme::SharedFontDescriptor mpFont
;
263 ::std::vector
<SharedPresenterTextParagraph
> maParagraphs
;
264 SharedPresenterTextCaret mpCaret
;
267 const ::boost::function
<void(const css::awt::Rectangle
&)> maInvalidator
;
268 bool mbIsFormatPending
;
269 sal_Int32 mnCharacterCount
;
270 ::boost::function
<void()> maTextChangeBroadcaster
;
272 void RequestFormat();
274 SharedPresenterTextParagraph
GetParagraphForCharacterIndex (const sal_Int32 nCharacterIndex
) const;
275 css::awt::Rectangle
GetCaretBounds (
276 const sal_Int32 nParagraphIndex
,
277 const sal_Int32 nCharacterIndex
) const;
280 } } // end of namespace ::sdext::presenter
284 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */