Support paragraph tag <p> in markup
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / logical-model-impl.h
index 6842cf6..c54c523 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_TOOLKIT_TEXT_LOGICAL_MODEL_IMPL_H__
-#define __DALI_TOOLKIT_TEXT_LOGICAL_MODEL_IMPL_H__
+#ifndef DALI_TOOLKIT_TEXT_LOGICAL_MODEL_IMPL_H
+#define DALI_TOOLKIT_TEXT_LOGICAL_MODEL_IMPL_H
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <dali/public-api/object/ref-object.h>
 
 // INTERNAL INCLUDES
+#include <dali-toolkit/internal/text/anchor.h>
 #include <dali-toolkit/internal/text/bidirectional-line-info-run.h>
 #include <dali-toolkit/internal/text/bidirectional-paragraph-info-run.h>
+#include <dali-toolkit/internal/text/bounded-paragraph-run.h>
 #include <dali-toolkit/internal/text/color-run.h>
+#include <dali-toolkit/internal/text/embedded-item.h>
+#include <dali-toolkit/internal/text/font-description-run.h>
 #include <dali-toolkit/internal/text/font-run.h>
+#include <dali-toolkit/internal/text/paragraph-run.h>
 #include <dali-toolkit/internal/text/script-run.h>
+#include <dali-toolkit/internal/text/strikethrough-character-run.h>
+#include <dali-toolkit/internal/text/underlined-character-run.h>
 
 namespace Dali
 {
-
 namespace Toolkit
 {
-
 namespace Text
 {
-
 class LogicalModel;
 typedef IntrusivePtr<LogicalModel> LogicalModelPtr;
 struct InputStyle;
@@ -52,7 +56,6 @@ struct InputStyle;
 class LogicalModel : public RefObject
 {
 public:
-
   /**
    * @brief Create a new instance of a LogicalModel.
    *
@@ -69,7 +72,7 @@ public:
    *
    * @return The character's script.
    */
-  Script GetScript( CharacterIndex characterIndex ) const;
+  Script GetScript(CharacterIndex characterIndex) const;
 
   // Bidirectional support interface.
 
@@ -82,31 +85,53 @@ public:
    *
    * @return The character's direction.
    */
-  CharacterDirection GetCharacterDirection( CharacterIndex characterIndex ) const;
+  CharacterDirection GetCharacterDirection(CharacterIndex characterIndex) const;
 
   // Visual <--> Logical conversion tables.
 
   /**
-   * @brief Sets the visual to logical and the logical to visual map tables.
+   * @brief Retrieves the logical cursor index for the given visual cursor index.
    *
-   * Replaces any map tables previously set.
+   * @pre The method FetchBidirectionalLineInfo() must be called before. If the result of FetchBidirectionalLineInfo() is false,
+   *      then the character is not in a bidirectional line and the result will be invalid.
    *
-   * @note If the number of runs is zero the bidirectional info buffer is cleared.
+   * @param[in] visualCursorIndex The visual cursor index.
    *
-   * @param[in] bidirectionalInfo Pointer to a buffer with all the bidirectional info runs.
-   * @param[in] numberOfRuns The number of bidirectional info runs.
+   * @return The logical cursor index.
    */
-  void SetVisualToLogicalMap( const BidirectionalLineInfoRun* const bidirectionalInfo,
-                              Length numberOfRuns );
+  CharacterIndex GetLogicalCursorIndex(CharacterIndex visualCursorIndex);
 
   /**
    * @brief Retrieves the logical character index for the given visual character index.
    *
+   * @pre The method FetchBidirectionalLineInfo() must be called before. If the result of FetchBidirectionalLineInfo() is false,
+   *      then the character is not in a bidirectional line and the result will be invalid.
+   *
    * @param[in] visualCharacterIndex The visual character index.
    *
    * @return The logical character index.
    */
-  CharacterIndex GetLogicalCharacterIndex( CharacterIndex visualCharacterIndex ) const;
+  CharacterIndex GetLogicalCharacterIndex(CharacterIndex visualCharacterIndex);
+
+  /**
+   * @brief Fetch the bidirectional line info for the given character.
+   *
+   * Call GetBidirectionalLineInfo() to retrieve the last fetched line.
+   *
+   * @param[in] characterIndex The character index.
+   *
+   * @return @e true if the given @e character is in a bidirectional line.
+   */
+  bool FetchBidirectionalLineInfo(CharacterIndex characterIndex);
+
+  /**
+   * @brief Retrieves the last fetched bidirectional line info.
+   *
+   * @return The index of the bidirectional line info.
+   */
+  BidirectionalLineRunIndex GetBidirectionalLineInfo() const;
+
+  // Text style.
 
   /**
    * @brief Updates the text's style runs with the added or removed text.
@@ -114,7 +139,7 @@ public:
    * @param[in] index The character's index.
    * @param[in] numberOfCharacters The number of characters added or removed. If the value is negative the characters are removed.
    */
-  void UpdateTextStyleRuns( CharacterIndex index, int numberOfCharacters );
+  void UpdateTextStyleRuns(CharacterIndex index, int numberOfCharacters);
 
   /**
    * @brief Retrieves the text's style for the given character index.
@@ -122,42 +147,105 @@ public:
    * @param[in] index The character index.
    * @param[out] style The text's style in the given style.
    */
-  void RetrieveStyle( CharacterIndex index, InputStyle& style );
+  void RetrieveStyle(CharacterIndex index, InputStyle& style);
 
-protected:
+  /**
+   * @brief Clears the font description runs.
+   */
+  void ClearFontDescriptionRuns();
 
   /**
+   * @brief Clears the strikethrough runs.
+   */
+  void ClearStrikethroughRuns();
+
+  // Paragraphs
+
+  /**
+   * @brief Creates the paragraph info.
+   *
+   * @pre The line break info must be set.
+   *
+   * @param[in] startIndex The character from where the paragraph info is set.
+   * @param[in] numberOfCharacters The number of characters.
+   */
+  void CreateParagraphInfo(CharacterIndex startIndex,
+                           Length         numberOfCharacters);
+
+  /**
+   * @brief Find the paragraphs which contains the given characters.
+   *
+   * @param[in] index The first character's index of the run.
+   * @param[in] numberOfCharacters The number of characters of the run.
+   * @param[out] paragraphs Indices to the paragraphs which contain the characters.
+   */
+  void FindParagraphs(CharacterIndex             index,
+                      Length                     numberOfCharacters,
+                      Vector<ParagraphRunIndex>& paragraphs);
+
+  /**
+   * @brief Retrieves the number of bounded paragraph runs.
+   *
+   * @return The number of bounded paragraph runs.
+   */
+  Length GetNumberOfBoundedParagraphRuns() const;
+
+  /**
+   * @brief Retrieves the reference for bounded paragraph runs.
+   *
+   * @return The reference for bounded paragraph runs.
+   */
+  const Vector<BoundedParagraphRun>& GetBoundedParagraphRuns() const;
+
+  // Embedded images
+
+  /**
+   * @brief Clears the embedded images.
+   */
+  void ClearEmbeddedImages();
+
+  /**
+   * @brief Clears the anchors.
+   */
+  void ClearAnchors();
+
+protected:
+  /**
    * @brief A reference counted object may only be deleted by calling Unreference().
    */
   virtual ~LogicalModel();
 
 private:
-
   /**
    * @brief Private constructor.
    */
   LogicalModel();
 
   // Undefined
-  LogicalModel( const LogicalModel& handle );
+  LogicalModel(const LogicalModel& handle);
 
   // Undefined
-  LogicalModel& operator=( const LogicalModel& handle );
+  LogicalModel& operator=(const LogicalModel& handle);
 
 public:
-
   Vector<Character>                     mText;
   Vector<ScriptRun>                     mScriptRuns;
   Vector<FontRun>                       mFontRuns;
   Vector<ColorRun>                      mColorRuns;
+  Vector<ColorRun>                      mBackgroundColorRuns;
+  Vector<FontDescriptionRun>            mFontDescriptionRuns;
   Vector<LineBreakInfo>                 mLineBreakInfo;
-  Vector<WordBreakInfo>                 mWordBreakInfo;
+  Vector<ParagraphRun>                  mParagraphInfo;
   Vector<BidirectionalParagraphInfoRun> mBidirectionalParagraphInfo;
-  Vector<CharacterDirection>            mCharacterDirections;        ///< For each character, whether is right to left. ( @e flase is left to right, @e true right to left ).
+  Vector<CharacterDirection>            mCharacterDirections; ///< For each character, whether is right to left. ( @e flase is left to right, @e true right to left ).
   Vector<BidirectionalLineInfoRun>      mBidirectionalLineInfo;
-  Vector<CharacterIndex>                mLogicalToVisualMap;         ///< Bidirectional logical to visual conversion table.
-  Vector<CharacterIndex>                mVisualToLogicalMap;         ///< Bidirectional visual to logical conversion table.
-  Vector<CharacterIndex>                mVisualToLogicalCursorMap;   ///< Bidirectional visual to logical cursor conversion table.
+  Vector<EmbeddedItem>                  mEmbeddedItems;
+  Vector<Anchor>                        mAnchors;
+  Vector<UnderlinedCharacterRun>        mUnderlinedCharacterRuns;    ///< The underlined character run from markup-processor
+  Vector<StrikethroughCharacterRun>     mStrikethroughCharacterRuns; ///< The strikethrough character run from markup-processor
+  Vector<BoundedParagraphRun>           mBoundedParagraphRuns;       ///< The bounded paragraph is used to handle a paragraph mark-up tag and it's attributes. Like TextAlign, TextDirection, TextIndent, LineHeight, etc.
+
+  BidirectionalLineRunIndex mBidirectionalLineIndex; ///< The last fetched bidirectional line info.
 };
 
 } // namespace Text
@@ -166,4 +254,4 @@ public:
 
 } // namespace Dali
 
-#endif // __DALI_TOOLKIT_TEXT_LOGICAL_MODEL_IMPL_H__
+#endif // DALI_TOOLKIT_TEXT_LOGICAL_MODEL_IMPL_H