TextView - Right to Left implementation.
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / internal / controls / text-view / text-view-impl.h
1 #ifndef __DALI_TOOLKIT_INTERNAL_TEXT_VIEW_H__
2 #define __DALI_TOOLKIT_INTERNAL_TEXT_VIEW_H__
3
4 /*
5  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali-toolkit/public-api/controls/control-impl.h>
23 #include <dali-toolkit/public-api/controls/text-view/text-view.h>
24 #include <dali-toolkit/internal/controls/text-view/text-actor-cache.h>
25 #include <dali-toolkit/internal/controls/text-view/text-view-processor-types.h>
26
27 namespace Dali
28 {
29
30 namespace Toolkit
31 {
32
33 namespace Internal
34 {
35
36 /**
37  * TextView is a custom control for text aligning and multiline support
38  */
39 class TextView : public Control
40 {
41 public:
42
43   // Properties
44   enum
45   {
46     TEXTVIEW_PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
47     TEXTVIEW_PROPERTY_END_INDEX = TEXTVIEW_PROPERTY_START_INDEX + 1000 ///< Reserving 1000 property indices
48   };
49
50   /**
51    * Internal exceed policy with the valid combinations.
52    */
53   enum ExceedPolicy
54   {
55     Original,             ///< Original size (even if it exceeds the witdh or the height).
56     OriginalFade,         ///< Original size if it exceeds the width but faded if it exceeds the height.
57     OriginalShrink,       ///< Shrunk if it exceeds the height.
58     SplitOriginal,        ///< Split if it exceeds the width but no action if it exceeds the height.
59     SplitFade,            ///< Split if it exceeds the width and faded if it exceeds the height.
60     SplitShrink,          ///< Split if it exceeds the width and shrunk if it exceeds the height.
61     SplitEllipsizeEnd,    ///< Split if it exceeds the width and ellipsize if it exceeds the height.
62     Fade,                 ///< Faded if it exceeds any boundary.
63     FadeOriginal,         ///< Faded if it exceeds the width but no action if it exceeds the height.
64     ShrinkOriginal,       ///< Shrunk if it exceeds the width but no action if it exceeds the height.
65     ShrinkFade,           ///< Shrunk if it exceeds the width and faded if it exceeds the height.
66     Shrink,               ///< Shrunk if it exceeds any boundary.
67     EllipsizeEndOriginal, ///< Ellipsized by the end if it exceeds the width but no action if it exceeds the height.
68     EllipsizeEnd          ///< Ellipsized by the end if it exceeds the width and/or the height.
69   };
70
71   // Between two OnRelaidOut methods, several calls to InsertTextAt, RemoveTextFrom or SetText can happen.
72   // TextViewProcessorMetadata stores the type of operation. A vector stores all operations between two OnRelaidOut calls.
73
74   enum TextViewProcessorMetadataType
75   {
76     TextSet,             ///< Sets new text.
77     TextInserted,        ///< Inserts text into current text.
78     TextReplaced,        ///< Replaces some text from current text.
79     TextRemoved,         ///< Removes some text from current text.
80     NewLineHeight,       ///< Sets a new line height offset.
81     NewStyle             ///< Sets a new style to the whole text.
82   };
83
84   /**
85    * Stores info about which data structures need to be modified when the OnRelaidOut() method is called
86    */
87   struct TextViewProcessorMetadata
88   {
89     TextViewProcessorMetadata();
90
91     TextViewProcessorMetadataType    mType;               ///< Stores the type of operation.
92     std::size_t                      mPosition;           ///< Character position within the text.
93     std::size_t                      mNumberOfCharacters; ///< Number of characters to be removed/replaced.
94     MarkupProcessor::StyledTextArray mText;               ///< The new text.
95     TextStyle::Mask                  mStyleMask;          ///< The style mask.
96   };
97
98   /**
99    * Defines which operations have to be done in the relayout process.
100    */
101   enum RelayoutOperationMask
102   {
103     NO_RELAYOUT = 0x0,                         ///< Does nothing.
104     RELAYOUT_REMOVE_TEXT_ACTORS = 0x1,         ///< Removes current text-actors from the text-view.
105     RELAYOUT_SIZE_POSITION = 0x2,              ///< Calculates size and position of the text but it doesn't calculate alignment.
106     RELAYOUT_ALIGNMENT = 0x4,                  ///< Aligns the whole text.
107     RELAYOUT_VISIBILITY = 0x8,                 ///< Calculates the visibility.
108     RELAYOUT_INITIALIZE_TEXT_ACTORS = 0x10,    ///< Initialize text-actors (create handles).
109     RELAYOUT_TEXT_ACTOR_UPDATE = 0x20,         ///< Updates text-actors (set size, position, style, ...)
110     RELAYOUT_INSERT_TO_TEXT_VIEW = 0x40,       ///< Adds the text-actors to the text-view.
111     RELAYOUT_ALL = 0xFF                        ///< Does all operations.
112   };
113
114   //////////////////////////////////////////////
115
116   /**
117    * Create a new TextView.
118    * @return A smart-pointer to the newly allocated TextView.
119    */
120   static Toolkit::TextView New();
121
122   /**
123    * @copydoc SetText( const std::string& text )
124    */
125   void SetText( const std::string& text );
126
127   /**
128    * @copydoc SetText( const StyledTextArray& text )
129    */
130   void SetText( const MarkupProcessor::StyledTextArray& text );
131
132   /**
133    * @copydoc InsertTextAt( std::size_t position, const std::string& text )
134    */
135   void InsertTextAt( std::size_t position, const std::string& text );
136
137   /**
138    * @copydoc InsertTextAt( std::size_t position, const std::string& text )
139    */
140   void InsertTextAt( std::size_t position, const MarkupProcessor::StyledTextArray& text );
141
142   /**
143    * @copydoc RemoveTextFrom( std::size_t position, std::size_t numberOfCharacters )
144    */
145   void RemoveTextFrom( std::size_t position, std::size_t numberOfCharacters );
146
147   /**
148    * @copydoc ReplaceTextFromTo( std::size_t position, std::size_t numberOfCharacters, const std::string& text )
149    */
150   void ReplaceTextFromTo( std::size_t position, std::size_t numberOfCharacters, const std::string& text );
151
152   /**
153    * @copydoc ReplaceTextFromTo( std::size_t position, std::size_t numberOfCharacters, const std::string& text )
154    */
155   void ReplaceTextFromTo( std::size_t position, std::size_t numberOfCharacters, const MarkupProcessor::StyledTextArray& text );
156
157   /**
158    * @copydoc GetText()
159    */
160   std::string GetText() const;
161
162   /**
163    * @copydoc SetLineHeightOffset()
164    */
165   void SetLineHeightOffset( PointSize offset );
166
167   /**
168    * @copydoc GetLineHeightOffset()
169    */
170   PointSize GetLineHeightOffset() const;
171
172   /**
173    * @copydoc SetStyleToCurrentText()
174    */
175   void SetStyleToCurrentText( const TextStyle& style, TextStyle::Mask mask );
176
177   /**
178    * @copydoc SetTextAlignment( Toolkit::Alignment::Type align )
179    */
180   void SetTextAlignment( Toolkit::Alignment::Type align );
181
182   /**
183    * @copydoc GetTextAlignment()
184    */
185   Toolkit::Alignment::Type GetTextAlignment() const;
186
187   /**
188    * @copydoc SetMultilinePolicy()
189    */
190   void SetMultilinePolicy( Toolkit::TextView::MultilinePolicy policy );
191
192   /**
193    * @copydoc GetMultilinePolicy()
194    */
195   Toolkit::TextView::MultilinePolicy GetMultilinePolicy() const;
196
197   /**
198    * @copydoc SetWidthExceedPolicy()
199    */
200   void SetWidthExceedPolicy( Toolkit::TextView::ExceedPolicy policy );
201
202   /**
203    * @copydoc GetWidthExceedPolicy()
204    */
205   Toolkit::TextView::ExceedPolicy GetWidthExceedPolicy() const;
206
207   /**
208    * @copydoc SetHeightExceedPolicy()
209    */
210   void SetHeightExceedPolicy( Toolkit::TextView::ExceedPolicy policy );
211
212   /**
213    * @copydoc GetHeightExceedPolicy()
214    */
215   Toolkit::TextView::ExceedPolicy GetHeightExceedPolicy() const;
216
217   /**
218    * @copydoc SetLineJustification()
219    */
220   void SetLineJustification( Toolkit::TextView::LineJustification justification );
221
222   /**
223    * @copydoc GetLineJustification()
224    */
225   Toolkit::TextView::LineJustification GetLineJustification() const;
226
227   /**
228    * @copydoc SetFadeBoundary()
229    */
230   void SetFadeBoundary( const Toolkit::TextView::FadeBoundary& fadeBoundary );
231
232   /**
233    * @copydoc GetFadeBoundary()
234    */
235   const Toolkit::TextView::FadeBoundary& GetFadeBoundary() const;
236
237   /**
238    * @copydoc SetEllipsizeText()
239    */
240   void SetEllipsizeText( const std::string& ellipsizeText );
241
242   /**
243    * @copydoc SetEllipsizeText()
244    */
245   void SetEllipsizeText( const MarkupProcessor::StyledTextArray& ellipsizeText );
246
247   /**
248    * @copydoc SetEllipsizeText()
249    */
250   void SetEllipsizeText( const Text& ellipsizeText, const Vector<TextStyle*>& ellipsizeStyles );
251
252   /**
253    * @copydoc GetEllipsizeText()
254    */
255   std::string GetEllipsizeText() const;
256
257   /**
258    * Checks if relayout the text is needed. If it is, it relais out the text
259    * by calling DoRelayOut().
260    */
261   void GetTextLayoutInfo();
262
263   /**
264    * Calls GetTextLayoutInfo() and fills the given data structure.
265    *
266    * @see GetTextLayoutInfo()
267    */
268   void GetTextLayoutInfo( Toolkit::TextView::TextLayoutInfo& textLayoutInfo );
269
270   /**
271    * @copydoc SetSortModifier()
272    */
273   void SetSortModifier( float depthOffset );
274
275   /**
276    * @copydoc SetSnapshotModeEnabled()
277    */
278   void SetSnapshotModeEnabled( bool enable );
279
280   /**
281    * @copydoc IsSnapshotModeEnabled()
282    */
283   bool IsSnapshotModeEnabled() const;
284
285   /**
286    * @brief Sets whether markup processing should be carried out.
287    *
288    * @param[in] enable whether markup processing is carried out or not.
289    */
290   void SetMarkupProcessingEnabled( bool enable );
291
292   /**
293    * @brief Returns whether markup processing is enabled or not
294    *
295    * @return true is markup processing is enabled
296    */
297   bool IsMarkupProcessingEnabled() const;
298
299   /**
300    * @copydoc SetScrollEnabled()
301    */
302   void SetScrollEnabled( bool enable );
303
304   /**
305    * @copydoc IsScrollEnabled()
306    */
307   bool IsScrollEnabled() const;
308
309   /**
310    * @copydoc SetScrollPosition()
311    * @see DoSetScrollPosition()
312    */
313   void SetScrollPosition( const Vector2& position );
314
315   /**
316    * @copydoc GetScrollPosition()
317    */
318   const Vector2& GetScrollPosition() const;
319
320   /**
321    * @copydoc IsScrollPositionTrimmed()
322    */
323   bool IsScrollPositionTrimmed() const;
324
325   /**
326    * @copydoc ScrolledSignal()
327    */
328   Toolkit::TextView::ScrolledSignalV2& ScrolledSignal();
329
330   /**
331    * Connects a callback function with the object's signals.
332    * @param[in] object The object providing the signal.
333    * @param[in] tracker Used to disconnect the signal.
334    * @param[in] signalName The signal to connect to.
335    * @param[in] functor A newly allocated FunctorDelegate.
336    * @return True if the signal was connected.
337    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
338    */
339   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
340
341   // Properties
342
343   /**
344    * Called when a property of an object of this type is set.
345    * @param[in] object The object whose property is set.
346    * @param[in] index The property index.
347    * @param[in] value The new property value.
348    */
349   static void SetProperty( BaseObject* object, Property::Index index, const Property::Value& value );
350
351   /**
352    * Called to retrieve a property of an object of this type.
353    * @param[in] object The object whose property is to be retrieved.
354    * @param[in] index The property index.
355    * @return The current value of the property.
356    */
357   static Property::Value GetProperty( BaseObject* object, Property::Index index );
358
359
360 private: // From Control
361
362   /**
363    * @copydoc Toolkit::Control::OnInitialize()
364    */
365   virtual void OnInitialize();
366
367   /**
368    * @copydoc Toolkit::Control::OnFontChange( )
369    */
370   virtual void OnFontChange( bool defaultFontChange, bool defaultFontSizeChange );
371
372   /**
373    * @copydoc Toolkit::Control::OnControlSizeSet()
374    */
375   virtual void OnControlSizeSet( const Vector3& size );
376
377   /**
378    * @copydoc Toolkit::Control::OnRelaidOut()
379    *
380    * Removes text-actor and calls DoRelayOut()..
381    */
382   virtual void OnRelaidOut( Vector2 size, ActorSizeContainer& container );
383
384   /**
385    * Retrieves the text-view's natural size.
386    *
387    * @return The natural size.
388    */
389   virtual Vector3 GetNaturalSize();
390
391   /**
392    * Retrieves the text-view's \e height for a given \e width.
393    *
394    * @param[in] width The given \e width.
395    *
396    * @return The \e height for the given \e width.
397    */
398   virtual float GetHeightForWidth( float width );
399
400   /**
401    * Retrieves the text-view's \e width for a given \e height.
402    *
403    * @param[in] height The given \e height.
404    *
405    * @return The \e width for the given \e height.
406    */
407   virtual float GetWidthForHeight( float height );
408
409 protected:
410
411   /**
412    * Construct a new TextView.
413    */
414   TextView();
415
416   /**
417    * A reference counted object may only be deleted by calling Unreference()
418    */
419   virtual ~TextView();
420
421 private:
422
423   // Undefined
424   TextView( const TextView& );
425
426   // Undefined
427   TextView& operator=( const TextView& rhs );
428
429   /**
430    * Executes synchronously relayout operations such as set, insert, remove or replace text, etc.
431    */
432   void PerformTextViewProcessorOperations();
433
434   /**
435    * Optimizes some text-view processor operations.
436    */
437   void OptimizeTextViewProcessorOperations();
438
439   /**
440    * Synchronously relays-out all text-actors.
441    *
442    * Perform text-view-processor operations, sets the new size and position of text-actors and adds them to the text-view.
443    *
444    * @param[in] textViewSize The new text-view's size.
445    * @param[in] relayoutOperationMask Defines which operations need to be done in the relayout process.
446    */
447   void DoRelayOut( const Size& textViewSize, RelayoutOperationMask relayoutOperationMask );
448
449   /**
450    * Process Snapshot. It refresh the render-task in order to generate a new snapshot image.
451    *
452    * ProcessSnapshot is called from OnRelaidOut() only if text has been relaid out.
453    * It creates a new image buffer only if the size of the text has changed.
454    *
455    * @param[in] textViewSize The new text-view's size.
456    */
457   void ProcessSnapshot( const Size& textViewSize );
458
459   /**
460    * Aligns the offscreen rendering camera actor to cover the whole text and the resulting image actor accordingly with the text view's alignment.
461    *
462    * @param[in] textViewSize The text view's size.
463    * @param[in] offscreenSize The offscreen's frame buffer's size.
464    */
465   void AlignOffscreenCameraActor( const Size& textViewSize, const Size& offscreenSize );
466
467   /**
468    * Callback called when the render task has processed.
469    *
470    * It makes the root actor invisible.
471    *
472    * @param[in] renderTask The processed render task.
473    */
474   void RenderTaskFinished( Dali::RenderTask& renderTask );
475
476   /**
477    * Destroys offscreen rendering resources.
478    *
479    * It disconects the render task finished signal from the TextView::RenderTaskFinished() method,
480    * removes the render task from the render task list and resets the offscreen camera actor, root actor,
481    * image actor and the frame buffer.
482    */
483   void DestroyOffscreenRenderingResources();
484
485   /**
486    * Called when text-view is scrolled.
487    *
488    * Sets the new scroll position. @see DoSetScrollPosition()
489    *
490    * @param[in] actor Handle of the text-view.
491    * @param[in] gesture Data structure with the parameters of the gesture.
492    */
493   void OnTextPan( Actor actor, PanGesture gesture );
494
495   /**
496    * Ensures the text-view's boundaries are fully covered of text.
497    *
498    * i.e. if the text-view's size is 100x100 and the text's size is 150x100, the scroll position
499    * can be in the range -50,0 and 50,0.
500    */
501   void TrimScrollPosition();
502
503   /**
504    * Called from SetScrollPosition() and OnTextPan()
505    *
506    * Updates the stored scroll position ensuring the text-view is always covered with text by calling
507    * TrimScrollPosition(), calculates the difference with the previous one and emits the Toolkit::TextView::SignalScrolled() signal.
508    *
509    * @param[in] position The new scroll position.
510    */
511   void DoSetScrollPosition( const Vector2& position );
512
513   /**
514    * Combines width and height exceed policies.
515    *
516    * This method is a big switch() which combines two exceed policies into one.
517    * The aim is avoid this switch inside the relayout code.
518    *
519    * i.e.  Width policy = Split. Height policy = Original. Internally the policy is SplitOriginal.
520    */
521   void CombineExceedPolicies();
522
523   /**
524    * Retrieves the text-view's root actor which stores all text-actors.
525    * It could be the text-view itself or an actor used in the snapshot mode.
526    *
527    * @return the root actor.
528    */
529   Actor GetRootActor() const;
530
531   /**
532    * Creates the ellipsize text layout.
533    */
534   void CreateEllipsizeLayout();
535
536   /**
537    * Handle SetProperty for markup processing.
538    * @param[in] propertyValue The new property value.
539    */
540   void OnMarkupEnabledPeopertySet( Property::Value propertyValue );
541
542   /**
543    * Handles SetProperty for multiline policy.
544    * @param[in] propertyValue The new property value.
545    */
546   void OnMultilinePolicyPropertySet( Property::Value propertyValue );
547
548   /**
549    * Handles SetProperty for width exceed policy.
550    * @param[in] propertyValue The new property value.
551    */
552   void OnWidthExceedPolicyPropertySet( Property::Value propertyValue );
553
554   /**
555    * Handles SetProperty for height exceed policy.
556    * @param[in] propertyValue The new property value.
557    */
558   void OnHeightExceedPolicyPropertySet( Property::Value propertyValue );
559
560   /**
561    * Handles SetProperty for line justification.
562    * @param[in] propertyValue The new property value.
563    */
564   void OnLineJustificationPropertySet( Property::Value propertyValue );
565
566   /**
567    * Handles SetProperty for fade boundary.
568    * @param[in] propertyValue The new property value.
569    */
570   void OnFadeBoundaryPropertySet( Property::Value propertyValue );
571
572   /**
573    * Handles SetProperty for alignment property.
574    * @param[in] propertyIndex The property index.
575    * @param[in] propertyValue The new property value.
576    */
577   void OnAlignmentPropertySet( Property::Index propertyIndex, Property::Value propertyValue );
578
579   /**
580    * Handles GetProperty for horizontal alignment property.
581    * @return The property value of horizontal alignment.
582    */
583   std::string OnHorizontalAlignmentPropertyGet();
584
585   /**
586    * Handles GetProperty for vertical alignment property.
587    * @return The property value of vertical alignment.
588    */
589   std::string OnVerticalAlignmentPropertyGet();
590
591 public:
592
593   /**
594    * The parameters which affects the layout of the text.
595    */
596   struct LayoutParameters
597   {
598     /**
599      * Default constructor.
600      */
601     LayoutParameters();
602
603     /**
604      * Default destructor.
605      */
606     ~LayoutParameters();
607
608     /**
609      * Constructor
610      */
611     LayoutParameters( Toolkit::TextView::MultilinePolicy     multilinePolicy,
612                       Toolkit::TextView::ExceedPolicy        widthExceedPolicy,
613                       Toolkit::TextView::ExceedPolicy        heightExceedPolicy,
614                       Toolkit::Alignment::Type               alignment,
615                       Toolkit::TextView::LineJustification   lineJustification,
616                       float                                  lineHeightOffset,
617                       bool                                   markUpEnabled );
618
619     /**
620      * Copy constructor
621      */
622     LayoutParameters( const LayoutParameters& layoutParameters );
623
624     /**
625      * Assignment operator.
626      */
627     LayoutParameters& operator=( const LayoutParameters& layoutParameters );
628
629     Toolkit::TextView::MultilinePolicy   mMultilinePolicy;     ///< Stores the multiline policy.
630     TextView::ExceedPolicy               mExceedPolicy;        ///< Stores a combination of both policies.
631     Toolkit::TextView::ExceedPolicy      mWidthExceedPolicy;   ///< Stores the text width exceed policy.
632     Toolkit::TextView::ExceedPolicy      mHeightExceedPolicy;  ///< Stores the text height exceed policy.
633     Toolkit::Alignment::Type             mHorizontalAlignment; ///< Stores the horizontal alignment for the whole text.
634     Toolkit::Alignment::Type             mVerticalAlignment;   ///< Stores the vertical alignment for the whole text.
635     Toolkit::TextView::LineJustification mLineJustification;   ///< Stores the line justification.
636     float                                mLineHeightOffset;    ///< Line height offset to be addded to the font line height (measured in PointSize).
637     bool                                 mMarkUpEnabled:1;     ///< Is markup string scanning enabled.
638   };
639
640   /**
641    * Some parameters which affects the text view visualization.
642    */
643   struct VisualParameters
644   {
645     /**
646      * Default constructor.
647      */
648     VisualParameters();
649
650     /**
651      * Copy constructor.
652      */
653     VisualParameters( const VisualParameters& visualParameters );
654
655     /**
656      * Assignment operator.
657      */
658     VisualParameters& operator=( const VisualParameters& visualParameters );
659
660     Toolkit::TextView::FadeBoundary mFadeBoundary;            ///< Fade boundary used in fade mode.
661     float                           mSortModifier;            ///< Stores the sort modifier for all text-actors.
662     Vector2                         mCameraScrollPosition;    ///< The scroll offset.
663     bool                            mSnapshotModeEnabled:1;   ///< Whether text-view is rendered offscreen.
664     bool                            mScrollEnabled:1;         ///< Whether the text scroll is enabled.
665     bool                            mScrollPositionTrimmed:1; ///< Whether the last scroll position set was trimmed.
666   };
667
668   /**
669    * The results of the relayout process.
670    */
671   struct RelayoutData
672   {
673     /**
674      * Default constructor.
675      */
676     RelayoutData();
677
678     /**
679      * Copy constructor
680      */
681     RelayoutData( const RelayoutData& relayoutData );
682
683     /**
684      * Assignment operator.
685      */
686     RelayoutData& operator=( const RelayoutData& relayoutData );
687
688     Size                                            mTextViewSize;                ///< The text-view's size used to relaid-out the text.
689     float                                           mShrinkFactor;                ///< Shrink factor used when the exceed policy contains ShrinkToFit.
690     TextViewProcessor::TextLayoutInfo               mTextLayoutInfo;              ///< Stores metrics, layout info (size, direction, type of word) and text-actor info for the whole text.
691     std::vector<int>                                mCharacterLogicalToVisualMap; ///< Reorder map that stores each character's visual (output) index according to its logical (input) index
692     std::vector<int>                                mCharacterVisualToLogicalMap; ///< Reorder map that stores each character's logical (input) index according to its visual (output) index
693     std::vector<RenderableActor>                    mGlyphActors;                 ///< Stores handles of those text-actors which are currently added to the text-view.
694     std::vector<RenderableActor>                    mEllipsizedGlyphActors;       ///< Stores handles of those text-actors which are used to ellipsize the text.
695     Toolkit::TextView::CharacterLayoutInfoContainer mCharacterLayoutInfoTable;    ///< Stores layout info per character sorted by the character's visual index.
696     Toolkit::TextView::LineLayoutInfoContainer      mLines;                       ///< Stores an index to the first character of each line.
697     Size                                            mTextSizeForRelayoutOption;   ///< Stores the text size after relayout.
698     TextActorCache                                  mTextActorCache;              ///< Stores previously created text-actors to be reused.
699   };
700
701 private:
702
703   MarkupProcessor::StyledTextArray       mCurrentStyledText;           ///< text currently displayed by the view
704   std::vector<TextViewProcessorMetadata> mTextViewProcessorOperations; ///< Stores all relayout operations which arrive between two consecutive OnRelaidOut() calls.
705
706   LayoutParameters                       mLayoutParameters;            ///< Stores some layout parameters in a struct. To be passed in layout functions.
707   VisualParameters                       mVisualParameters;            ///< Some parameters which afects text-view visualization.
708   RelayoutData                           mRelayoutData;                ///< struct with text-view's data structures used to pass all of them in one parameter.
709   RelayoutOperationMask                  mRelayoutOperations;          ///< Which relayout operations have to be done.
710
711   Layer                                  mOffscreenRootActor;          ///< Root actor for offscreen rendering.
712   ImageActor                             mOffscreenImageActor;         ///< Image actor for offscreen rendering.
713   CameraActor                            mOffscreenCameraActor;        ///< Camera actor for offscreen rendering.
714   Size                                   mCurrentOffscreenSize;        ///< Current used ofscreen size.
715   FrameBufferImage                       mFrameBufferImage;            ///< Frame buffer used for offscreen rendering.
716   RenderTask                             mRenderTask;                  ///< Used to generate an offscreen rendering.
717
718   PanGestureDetector                     mPanGestureDetector;          ///< Pan gesture for text scrolling.
719
720   /**
721    * Helper class used to prevent the modification of some members.
722    */
723   struct Lock
724   {
725     Lock( bool& lock )
726     : mLock( lock )
727     {
728       mLock = true;
729     }
730
731     ~Lock()
732     {
733       mLock = false;
734     }
735
736     bool& mLock;
737   };
738
739   bool                                            mLockPreviousSnapshotMode;      ///< Whether previous stored snapshot mode should be modified.
740   bool                                            mPreviousSnapshotModeEnabled:1; ///< Stores the previous snapshot mode value.
741   bool                                            mMarkUpEnabled:1;               ///< enable to scan for mark-up
742
743   Toolkit::TextView::ScrolledSignalV2             mScrolledSignalV2;              ///< Signal emitted when text is scrolled.
744 };
745
746 } // namespace Internal
747
748 // Helpers for public-api forwarding methods
749
750 inline Internal::TextView& GetImpl( TextView& textView )
751 {
752   DALI_ASSERT_ALWAYS( textView );
753
754   RefObject& handle = textView.GetImplementation();
755
756   return static_cast< Internal::TextView& >( handle );
757 }
758
759 inline const Internal::TextView& GetImpl( const TextView& textView )
760 {
761   DALI_ASSERT_ALWAYS( textView );
762
763   const RefObject& handle = textView.GetImplementation();
764
765   return static_cast< const Internal::TextView& >( handle );
766 }
767
768 } // namespace Toolkit
769
770 } // namespace Dali
771
772 #endif // __DALI_TOOLKIT_INTERNAL_ITEM_VIEW_H__