Text - Methods added to find characters and retrieve sub-texts. 31/24231/8
authorVictor Cebollada <v.cebollada@samsung.com>
Mon, 7 Jul 2014 07:12:42 +0000 (08:12 +0100)
committerVíctor Cebollada <v.cebollada@samsung.com>
Wed, 16 Jul 2014 07:07:22 +0000 (00:07 -0700)
The only way to split a text in lines and words is retrieve
character per character and query if it's a white space or
a new line character.
Every time a character is requested, Text creates a Character
object with its implementation.
The Find methods retrieve all the positions of the white
space, new line character or any other character within the
given range saving the creation of all Character objects.

Change-Id: Ie6107edfef5db9eb6d54dd84ec9e662dead8a229
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
automated-tests/src/dali-internal/utc-Dali-Internal-Text.cpp
automated-tests/src/dali/utc-Dali-Character.cpp
automated-tests/src/dali/utc-Dali-Text.cpp
capi/dali/public-api/text/text.h
dali/internal/event/text/character-impl.cpp
dali/internal/event/text/character-impl.h
dali/internal/event/text/text-impl.cpp
dali/internal/event/text/text-impl.h
dali/public-api/text/text.cpp

index 629d6e1ca34617bab73c193f1199abf12f5bbd89..04de70587b5a48d81d7bd3bd8ff2ba6b239b46dd 100644 (file)
@@ -38,8 +38,24 @@ void utc_dali_internal_text_cleanup()
   test_return_value = TET_PASS;
 }
 
+int UtcDaliTextGetImplementation01(void)
+{
+  TestApplication application;
+
+  Text text( std::string( "Hello world" ) );
+
+  const Internal::Text& textImpl1 = text.GetImplementation();
+
+  DALI_TEST_CHECK( NULL != &textImpl1 );
+
+  Internal::Text& textImpl2 = text.GetImplementation();
+
+  DALI_TEST_CHECK( NULL != &textImpl2 );
+
+  END_TEST;
+}
 
-int UtcDaliTextGetImplementation(void)
+int UtcDaliTextGetImplementation02(void)
 {
   TestApplication application;
 
@@ -84,3 +100,14 @@ int UtcDaliTextGetImplementation(void)
   }
   END_TEST;
 }
+
+int UtcDaliTextGetTextArray(void)
+{
+  TestApplication application;
+
+  Text text( std::string( "Hello world" ) );
+
+  DALI_TEST_EQUALS( text.GetImplementation().GetTextArray().size(), 11u, TEST_LOCATION );
+
+  END_TEST;
+}
index 9f0a47c42d4cddcb802a6a2d33fc8de2fbc3b52c..fb99922a9af32742319f92e466b266be113fe743 100644 (file)
@@ -160,3 +160,21 @@ int UtcDaliCharacterIsNewLine(void)
   DALI_TEST_CHECK(!text[8].IsNewLine()); // 'f'
   END_TEST;
 }
+
+int UtcDaliCharacterGetImplementation(void)
+{
+  TestApplication application;
+
+  Text text( std::string( "Hello world" ) );
+  Character c = text[0];
+
+  const Internal::Character& characterImpl1 = c.GetImplementation();
+
+  DALI_TEST_CHECK( NULL != &characterImpl1 );
+
+  Internal::Character& characterImpl2 = c.GetImplementation();
+
+  DALI_TEST_CHECK( NULL != &characterImpl2 );
+
+  END_TEST;
+}
index 595e5bf6a04bbd25cf2ace9399a4bbac644e0fae..8ef7bd1636d9f0fcf59850512977ccf3198f3ac1 100644 (file)
@@ -45,6 +45,18 @@ int UtcDaliTextConstructor(void)
 
   DALI_TEST_CHECK( !someText.IsEmpty() );
 
+  Text someEmptyText( std::string( "" ) );
+
+  DALI_TEST_CHECK( someEmptyText.IsEmpty() );
+
+  Text someText2( Text( std::string( "Some text" ) ) );
+
+  DALI_TEST_CHECK( !someText2.IsEmpty() );
+
+  Text someEmptyText2( text );
+
+  DALI_TEST_CHECK( someEmptyText2.IsEmpty() );
+
   Character c = someText[0];
 
   Text cText( c );
@@ -86,7 +98,6 @@ int UtcDaliTextAssignmentOperator(void)
 
   Text someText4;
 
-  printf(" is text empty ? ...... %d \n", someText4.IsEmpty());
   // check for assignment of empty text
   someText2 = someText4;
   DALI_TEST_CHECK( someText2.IsEmpty() );
@@ -103,22 +114,28 @@ int UtcDaliTextSetGetText(void)
 {
   TestApplication application;
 
-  const std::string someText( "Some text");
+  const std::string someText( "Some text" );
+  const std::string someText2( "Some text2" );
 
   Text text;
   text.SetText( someText );
 
-  DALI_TEST_CHECK( someText == text.GetText() );
+  DALI_TEST_EQUALS( someText, text.GetText(), TEST_LOCATION );
+
+  text.SetText( someText2 );
+
+  DALI_TEST_EQUALS( someText2, text.GetText(), TEST_LOCATION );
 
   Character c = text[0];
   text.SetText( c );
 
-  DALI_TEST_CHECK( std::string("S") == text.GetText() );
+  DALI_TEST_EQUALS( std::string( "S" ), text.GetText(), TEST_LOCATION );
 
   Text text2;
   text2.SetText( text );
 
-  DALI_TEST_CHECK( text2.GetText() == text.GetText() );
+  DALI_TEST_EQUALS( text2.GetText(), text.GetText(), TEST_LOCATION );
+
   END_TEST;
 }
 
@@ -241,6 +258,12 @@ int UtcDaliTextAppend(void)
   emptyText.Append( text2 );
   DALI_TEST_CHECK( text2.GetText() == emptyText.GetText() );
 
+  // append a null text
+
+  Text emptyText2;
+  emptyText.Append( emptyText2 );
+  DALI_TEST_CHECK( text2.GetText() == emptyText.GetText() );
+
   END_TEST;
 }
 
@@ -252,6 +275,8 @@ int UtcDaliTextRemove01(void)
 
   bool assert1 = false;
   bool assert2 = false;
+  bool assert3 = false;
+
   try
   {
     text.Remove( 100, 3 );
@@ -274,7 +299,19 @@ int UtcDaliTextRemove01(void)
     assert2 = true;
   }
 
-  if( assert1 && assert2 )
+  try
+  {
+    text.SetText( std::string( "" ) );
+    text.Remove( 1, 300 );
+  }
+  catch( DaliException& e )
+  {
+    tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+    DALI_TEST_EQUALS( e.mCondition, "NULL != mImpl && \"Text::Remove: Text is uninitialized\"", TEST_LOCATION );
+    assert3 = true;
+  }
+
+  if( assert1 && assert2 && assert3 )
   {
     tet_result( TET_PASS );
   }
@@ -291,16 +328,164 @@ int UtcDaliTextRemove02(void)
 
   Text text01( std::string( "Some text") );
   Text text02( std::string( "Somext") );
-  Text text03( std::string( "") );
+  Text text03( std::string( "" ) );
+  Text text04( std::string( "Hello world" ) );
+  Text text05( std::string( "world" ) );
+
+  text01.Remove( 3u, 3u );
 
-  text01.Remove( 3, 3 );
+  DALI_TEST_EQUALS( text01.GetLength(), text02.GetLength(), TEST_LOCATION );
+  DALI_TEST_EQUALS( text01.GetText(), text02.GetText(), TEST_LOCATION );
+
+  text01.Remove( 0u, 0u );
 
   DALI_TEST_EQUALS( text01.GetLength(), text02.GetLength(), TEST_LOCATION );
   DALI_TEST_EQUALS( text01.GetText(), text02.GetText(), TEST_LOCATION );
 
-  text01.Remove( 0, 6 );
+  text01.Remove( 0u, 6u );
 
   DALI_TEST_EQUALS( text01.GetLength(), text03.GetLength(), TEST_LOCATION );
   DALI_TEST_EQUALS( text01.GetText(), text03.GetText(), TEST_LOCATION );
+
+  text04.Remove( 0u, 6u );
+
+  DALI_TEST_EQUALS( text04.GetLength(), text05.GetLength(), TEST_LOCATION );
+  DALI_TEST_EQUALS( text04.GetText(), text05.GetText(), TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliTextFind(void)
+{
+  TestApplication application;
+
+  Text text;
+  Character c1 = Text( std::string( "c" ) )[0u];
+  Character c2 = Text( std::string( "o" ) )[0u];
+  Vector<std::size_t> positions;
+
+  // Find in void text.
+
+  positions.Clear();
+  text.Find( c1, 0u, 0u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 0u, TEST_LOCATION );
+
+  positions.Clear();
+  text.Find( Text::WHITE_SPACE, 0u, 0u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 0u, TEST_LOCATION );
+
+  positions.Clear();
+  text.Find( Text::NEW_LINE, 0u, 0u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 0u, TEST_LOCATION );
+
+  // Find in text.
+
+  // Find 'c' and 'o'
+  text.SetText( std::string( "Hello world" ) );
+
+  positions.Clear();
+  text.Find( c1, 0u, 11u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 0u, TEST_LOCATION );
+
+  positions.Clear();
+  text.Find( c2, 0u, 11u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 2u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[0u], 4u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[1u], 7u, TEST_LOCATION );
+
+  // Find white space
+  text.SetText( std::string( "   Hello  world  \n" ) );
+
+  positions.Clear();
+  text.Find( Text::WHITE_SPACE, 0u, 17u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 8u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[0u], 0u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[1u], 1u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[2u], 2u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[3u], 8u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[4u], 9u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[5u], 15u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[6u], 16u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[7u], 17u, TEST_LOCATION );
+
+  // Find new line character
+  text.SetText( std::string( "\n\nHello\nworld\n\n" ) );
+
+  positions.Clear();
+  text.Find( Text::NEW_LINE, 0u, 14u, positions );
+  DALI_TEST_EQUALS( positions.Count(), 5u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[0u], 0u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[1u], 1u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[2u], 7u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[3u], 13u, TEST_LOCATION );
+  DALI_TEST_EQUALS( positions[4u], 14u, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliTextGetSubText(void)
+{
+  TestApplication application;
+
+  Text text;
+  Text subText;
+
+  // Get sub-text from a void text.
+
+  subText.SetText( "Hello" );
+  text.GetSubText( 0u, 1u, subText );
+  DALI_TEST_EQUALS( subText.GetText(), std::string( "Hello" ), TEST_LOCATION );
+
+  // Get sub-text.
+
+  text.SetText( std::string( "Hello world" ) );
+
+  // Access out of bounds
+  subText.SetText( "Hello" );
+  text.GetSubText( 30u, 31u, subText );
+  DALI_TEST_EQUALS( subText.GetText(), std::string( "Hello" ), TEST_LOCATION );
+  text.GetSubText( 0u, 31u, subText );
+  DALI_TEST_EQUALS( subText.GetText(), std::string( "Hello" ), TEST_LOCATION );
+  text.GetSubText( 30u, 1u, subText );
+  DALI_TEST_EQUALS( subText.GetText(), std::string( "Hello" ), TEST_LOCATION );
+
+  // Check it swaps the indices.
+  text.GetSubText( 8u, 2u, subText );
+  DALI_TEST_EQUALS( subText.GetText(), std::string( "row oll" ), TEST_LOCATION );
+
+  // Normal access.
+  subText.SetText( std::string( "" ) );
+  text.GetSubText( 4u, 6u, subText );
+  DALI_TEST_EQUALS( subText.GetText(), std::string( "o w" ), TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliTextIsWhiteSpaceNewLine(void)
+{
+  TestApplication application;
+
+  Text text;
+
+  // Query a void text.
+
+  DALI_TEST_CHECK( !text.IsWhiteSpace( 0u ) );
+  DALI_TEST_CHECK( !text.IsNewLine( 0u ) );
+
+  // Set a text
+  text.SetText( "Hello world\n" );
+
+  // Query out of bounds
+
+  DALI_TEST_CHECK( !text.IsWhiteSpace( 30u ) );
+  DALI_TEST_CHECK( !text.IsNewLine( 30u ) );
+
+  // Normal query.
+
+  DALI_TEST_CHECK( !text.IsWhiteSpace( 1u ) );
+  DALI_TEST_CHECK( !text.IsNewLine( 1u ) );
+  DALI_TEST_CHECK( text.IsWhiteSpace( 5u ) );
+  DALI_TEST_CHECK( text.IsNewLine( 11u ) );
+
   END_TEST;
 }
index ba29133365c8085f3f855ccd8ffd81357351e39b..851823bfaa4e15bc530ae14213220e64473c07e5 100644 (file)
@@ -29,6 +29,7 @@
 // INTERNAL INCLUDES
 #include <dali/public-api/common/dali-common.h>
 #include <dali/public-api/text/character.h>
+#include <dali/public-api/common/dali-vector.h>
 
 namespace Dali DALI_IMPORT_API
 {
@@ -43,6 +44,18 @@ namespace Internal DALI_INTERNAL
  */
 class Text
 {
+
+public:
+
+  /**
+   * @brief Enums special characters used to find their positions inside the text.
+   */
+  enum SpecialCharacter
+  {
+    WHITE_SPACE,
+    NEW_LINE
+  };
+
 public:
 
   /**
@@ -166,6 +179,58 @@ public:
    */
   void Remove( size_t position, size_t numberOfCharacters );
 
+  /**
+   * @brief Finds all the positions of the given \e character within the \e from, \e to range.
+   *
+   * @param[in] character The character to find.
+   * @param[in] from First position of the range.
+   * @param[in] to Last position of the range.
+   * @param[out] positions Contains all the positions of \e character within the \e from, \e to range.
+   */
+  void Find( const Character& character, std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const;
+
+  /**
+   * @brief Finds all the positions of either white space or new line character within the \e from, \e to range.
+   *
+   * @param[in] character One of white space or new line.
+   * @param[in] from First position of the range.
+   * @param[in] to Last position of the range.
+   * @param[out] positions Contains all the positions of \e character within the \e from, \e to range.
+   *
+   */
+  void Find( SpecialCharacter character, std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const;
+
+  /**
+   * @brief Retrieves a subtext withing the \e from, \e to range.
+   *
+   * If \e to is smaller than \e from, sub-text will be reversed.
+   *
+   * @note \e subText will be untouched if current text is not initialized of the range \e from, \e to is out of bounds.
+   *
+   * @param[in] from First position of the range.
+   * @param[in] to Last position of the range.
+   * @param[out] subText The subtext.
+   */
+  void GetSubText( std::size_t from, std::size_t to, Text& subText ) const;
+
+  /**
+   * @brief Whether the character in the \e index position is a white space.
+   *
+   * @param[in] index position of the character.
+   *
+   * @return \e true if the character pointed by \e index is a white space
+   */
+  bool IsWhiteSpace( std::size_t index ) const;
+
+  /**
+   * @brief Whether the character in the \e index position is a new line character.
+   *
+   * @param[in] index position of the character.
+   *
+   * @return \e true if the character pointed by \e index is a new line character.
+   */
+  bool IsNewLine( std::size_t index ) const;
+
 private:
 
   Internal::Text* mImpl; ///< Pointer to implementation object
index 183d30d4e862cf0265c8ec97da016b35e7d93605..f03c377c02c41292421def7b7608fecc5d1e41a5 100644 (file)
@@ -17,7 +17,6 @@
 
 // HEADER CLASS
 #include <dali/internal/event/text/character-impl.h>
-// INTERNAL INCLUDES
 
 namespace
 {
@@ -247,28 +246,11 @@ namespace Dali
 namespace Internal
 {
 
-Character::Character()
-: mCharacter( 0 )
-{
-}
-
 Character::Character( uint32_t character )
 : mCharacter( character )
 {
 }
 
-Character::Character( const Character& character )
-: mCharacter( character.mCharacter )
-{
-}
-
-Character& Character::operator=( const Character& character )
-{
-  mCharacter = character.mCharacter;
-
-  return *this;
-}
-
 Character::~Character()
 {
 }
@@ -301,13 +283,12 @@ bool Character::IsLeftToRight() const
 
 bool Character::IsWhiteSpace() const
 {
-  // TODO: It should cover unicode characters: http://en.wikipedia.org/wiki/Whitespace_character
-  return mCharacter <= CHAR_WHITE_SPACE;
+  return Character::IsWhiteSpace( mCharacter );
 }
 
 bool Character::IsNewLine() const
 {
-  return mCharacter == CHAR_NEW_LINE;
+  return Character::IsNewLine( mCharacter );
 }
 
 uint32_t Character::GetCharacter() const
@@ -320,6 +301,17 @@ void Character::SetCharacter( uint32_t character )
   mCharacter = character;
 }
 
+bool Character::IsWhiteSpace( uint32_t character )
+{
+  // TODO: It should cover unicode characters: http://en.wikipedia.org/wiki/Whitespace_character
+  return character <= CHAR_WHITE_SPACE;
+}
+
+bool Character::IsNewLine( uint32_t character )
+{
+  return character == CHAR_NEW_LINE;
+}
+
 } // namespace Internal
 
 } // namespace Dali
index c2a5f4c56b2ea982ab6ec2495cafcd945cc1e8b5..370a75eac08ae4f33f6c424480e70db59df1a438 100644 (file)
@@ -42,11 +42,6 @@ public:
 
 public:
 
-  /**
-   * @copydoc Dali::Character::Character().
-   */
-  Character();
-
   /**
    * Constructor.
    * Creates a Character with the given UTF-32 encoded character.
@@ -54,16 +49,6 @@ public:
    */
   Character( uint32_t character );
 
-  /**
-   * @copydoc Dali::Character::Character( const Character& character ).
-   */
-  Character( const Character& character );
-
-  /**
-   * @copydoc Dali::Character::operator=( const Character& character ).
-   */
-  Character& operator=( const Character& character );
-
   /**
    * Non virtual destructor.
    */
@@ -108,8 +93,38 @@ public:
    */
   void SetCharacter( uint32_t character );
 
+  /**
+   * Whether the given character is a white space.
+   *
+   * @param[in] character The character.
+   *
+   * @return \e true the given character is a white space.
+   */
+  static bool IsWhiteSpace( uint32_t character );
+
+  /**
+   * Whether the given character is a new line character.
+   *
+   * @param[in] character The character.
+   *
+   * @return \e true the given character is a new line character.
+   */
+  static bool IsNewLine( uint32_t character );
+
 private:
-  uint32_t mCharacter;
+
+  // Undefined constructor.
+  Character();
+
+  // Undefined copy constructor.
+  Character( const Character& character );
+
+  // Undefined assignment operator
+  Character& operator=( const Character& character );
+
+ private: //data
+
+  uint32_t mCharacter; ///< Stores the unicode of the character.
 };
 
 } // namespace Internal
index 9795a74d8a245949a95242b79a882e7583ebdf1e..d9d6aba5f5964c2d8e3dbaa00cfe5b6706b67b14 100644 (file)
@@ -38,14 +38,11 @@ Text::Text()
 Text::Text( const std::string& text )
 : mString()
 {
-  if( !text.empty() )
-  {
-    // minimize allocations for ascii strings
-    mString.reserve( text.size() );
+  // minimize allocations for ascii strings
+  mString.reserve( text.size() );
 
-    // break string into UTF-8 tokens
-    UTF8Tokenize( reinterpret_cast<const unsigned char*>( text.c_str() ), text.size(), mString );
-  }
+  // break string into UTF-8 tokens
+  UTF8Tokenize( reinterpret_cast<const unsigned char*>( text.c_str() ), text.size(), mString );
 }
 
 Text::Text( const Character& character )
@@ -75,11 +72,6 @@ void Text::GetText( std::string& text ) const
   }
 }
 
-void Text::SetText( const Text& text )
-{
-  mString = text.mString;
-}
-
 Text& Text::operator=( const Text& text )
 {
   mString = text.mString;
@@ -88,6 +80,11 @@ Text& Text::operator=( const Text& text )
 }
 
 Text::~Text()
+{
+  Clear();
+}
+
+void Text::Clear()
 {
   mString.clear();
 }
@@ -122,25 +119,84 @@ void Text::Append( const Dali::Text& text )
 
 void Text::Remove( size_t position, size_t numberOfCharacters )
 {
-  if( numberOfCharacters == 0 )
-  {
-    DALI_ASSERT_DEBUG( ( numberOfCharacters != 0 ) && ( "Text::Remove: numberOfCharacters is zero." ) );
-    return;
-  }
   DALI_ASSERT_ALWAYS( position < mString.size() && "Text::Remove: Character position is out of bounds" );
   DALI_ASSERT_ALWAYS( position + numberOfCharacters <= mString.size() && "Text::Remove: Character position + numberOfCharacters is out of bounds" );
 
   mString.erase( mString.begin() + position, mString.begin() + position + numberOfCharacters );
 }
 
-void Text::SetTextArray( const TextArray& textArray )
+void Text::Find( uint32_t character, std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const
 {
-  mString = textArray;
+  std::size_t position = from;
+
+  for( TextArray::const_iterator it = mString.begin() + from, endIt = mString.begin() + to + 1u; it != endIt; ++position, ++it )
+  {
+    if( *it == character )
+    {
+      positions.PushBack( position );
+    }
+  }
 }
 
-void Text::GetTextArray( TextArray& textArray ) const
+void Text::FindWhiteSpace( std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const
 {
-  textArray = mString;
+  std::size_t position = from;
+
+  for( TextArray::const_iterator it = mString.begin() + from, endIt = mString.begin() + to + 1u; it != endIt; ++position, ++it )
+  {
+    if( Character::IsWhiteSpace( *it ) )
+    {
+      positions.PushBack( position );
+    }
+  }
+}
+
+void Text::FindNewLine( std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const
+{
+  std::size_t position = from;
+
+  for( TextArray::const_iterator it = mString.begin() + from, endIt = mString.begin() + to + 1u; it != endIt; ++position, ++it )
+  {
+    if( Character::IsNewLine( *it ) )
+    {
+      positions.PushBack( position );
+    }
+  }
+}
+
+void Text::GetSubText( std::size_t from, std::size_t to, Text* subText ) const
+{
+  if( to < from )
+  {
+    const std::size_t length = mString.size();
+    const std::size_t rfrom = length - ( from + 1u );
+    const std::size_t rto = length - to;
+    subText->mString.insert( subText->mString.end(), mString.rbegin() + rfrom, mString.rbegin() + rto );
+  }
+  else
+  {
+    subText->mString.insert( subText->mString.end(), mString.begin() + from, mString.begin() + to + 1u );
+  }
+}
+
+bool Text::IsWhiteSpace( std::size_t index ) const
+{
+  if( index < mString.size() )
+  {
+    return Character::IsWhiteSpace( *( mString.begin() + index ) );
+  }
+
+  return false;
+}
+
+bool Text::IsNewLine( std::size_t index ) const
+{
+  if( index < mString.size() )
+  {
+    return Character::IsNewLine( *( mString.begin() + index ) );
+  }
+
+  return false;
 }
 
 const TextArray& Text::GetTextArray() const
index 355788de3ce6cd92874c544e8368cb87e997b8c9..ef5139f125f6126862418bffdd85cad21866e9a9 100644 (file)
@@ -70,15 +70,15 @@ public:
   ~Text();
 
   /**
-   * Converts stored text encoded in UTF-32 to a std::string encoded with UTF-8.
-   * @param [out] text The text resultant of the UTF-32 to UTF-8 conversion.
+   * Clears the text.
    */
-  void GetText( std::string& text ) const;
+  void Clear();
 
   /**
-   * @copydoc Dali::Text::SetText( const Text& text )
+   * Converts stored text encoded in UTF-32 to a std::string encoded with UTF-8.
+   * @param [out] text The text resultant of the UTF-32 to UTF-8 conversion.
    */
-  void SetText( const Text& text );
+  void GetText( std::string& text ) const;
 
   /**
    * @copydoc Dali::Text::operator[]()
@@ -106,16 +106,34 @@ public:
   void Remove( size_t position, size_t numberOfCharacters );
 
   /**
-   * Sets a UTF-32 endoded string.
-   * @param[in] textArray A UTF-32 endoded string.
+   * @copydoc Dali::Text::Find( const Character& character, std::size_t from, std::size_t to, Vector<std::size_t>& positions )
+   */
+  void Find( uint32_t character, std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const;
+
+  /**
+   * @copydoc Dali::Text::Find( SpecialCharacter character, std::size_t from, std::size_t to, Vector<std::size_t>& positions )
+   */
+  void FindWhiteSpace( std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const;
+
+  /**
+   * @copydoc Dali::Text::Find( SpecialCharacter character, std::size_t from, std::size_t to, Vector<std::size_t>& positions )
+   */
+  void FindNewLine( std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const;
+
+  /**
+   * @copydoc Dali::Text::GetSubText()
+   */
+  void GetSubText( std::size_t from, std::size_t to, Text* subText ) const;
+
+  /**
+   * @copydoc Dali::Text::IsWhiteSpace()
    */
-  void SetTextArray( const TextArray& textArray );
+  bool IsWhiteSpace( std::size_t index ) const;
 
   /**
-   * Retrieves a copy of the UTF-32 endoded string.
-   * @param[out] textArray A copy of the UTF-32 endoded string.
+   * @copydoc Dali::Text::IsNewLine()
    */
-  void GetTextArray( TextArray& textArray ) const;
+  bool IsNewLine( std::size_t index ) const;
 
   /**
    * Retrieves a reference to the UTF-32 encoded string.
@@ -125,7 +143,7 @@ public:
 
 private:
 
-  TextArray mString;
+  TextArray mString; ///< Stores an array of unicodes.
 };
 
 } // namespace Internal
index 6db3021a0c5a07f43ec3fa06a2d894bb536683ca..3beebbb024a8b83064b619ac5821e509c0e9b85d 100644 (file)
@@ -19,6 +19,7 @@
 #include <dali/public-api/text/text.h>
 
 // INTERNAL INCLUDES
+#include <dali/internal/event/text/character-impl.h>
 #include <dali/internal/event/text/text-impl.h>
 #include <dali/public-api/common/dali-common.h>
 
@@ -62,7 +63,7 @@ Text& Text::operator=( const Text& text )
       }
       else
       {
-        mImpl->SetTextArray( text.mImpl->GetTextArray() );
+        *mImpl = *text.mImpl;
       }
     }
   }
@@ -107,7 +108,7 @@ void Text::SetText( const Text& text )
     }
     else
     {
-      mImpl->SetTextArray( text.mImpl->GetTextArray() );
+      *mImpl = *text.mImpl;
     }
   }
   else
@@ -177,7 +178,13 @@ void Text::Remove( size_t position, size_t numberOfCharacters )
 {
   DALI_ASSERT_ALWAYS( NULL != mImpl && "Text::Remove: Text is uninitialized" );
 
-  if( ( 0 == position ) && ( mImpl->GetLength() == numberOfCharacters ) )
+  if( 0u == numberOfCharacters )
+  {
+    // nothing to remove.
+    return;
+  }
+
+  if( ( 0u == position ) && ( mImpl->GetLength() == numberOfCharacters ) )
   {
     // If all characters are removed, delete the internal implementation.
     delete mImpl;
@@ -189,6 +196,93 @@ void Text::Remove( size_t position, size_t numberOfCharacters )
   }
 }
 
+void Text::Find( const Character& character, std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const
+{
+  if( NULL == mImpl )
+  {
+    // nothing to find if the text is not initialized.
+    return;
+  }
+
+  mImpl->Find( character.GetImplementation().GetCharacter(), from, to, positions );
+}
+
+void Text::Find( SpecialCharacter character, std::size_t from, std::size_t to, Vector<std::size_t>& positions ) const
+{
+  // @note There is a different method to find a white space because it is a range of values.
+
+  if( NULL == mImpl )
+  {
+    // nothing to find if the text is not initialized.
+    return;
+  }
+
+  switch( character )
+  {
+    case WHITE_SPACE:
+    {
+      mImpl->FindWhiteSpace( from, to, positions );
+      break;
+    }
+    case NEW_LINE:
+    {
+      mImpl->FindNewLine( from, to, positions );
+      break;
+    }
+  }
+}
+
+void Text::GetSubText( std::size_t from, std::size_t to, Text& subText ) const
+{
+  if( NULL == mImpl )
+  {
+    // nothing to do if the text is not initialized.
+    return;
+  }
+
+  const std::size_t length = mImpl->GetLength();
+
+  if( ( from >= length ) || ( to >= length ) )
+  {
+    // out of bounds access.
+    return;
+  }
+
+  // Create an internal implementation if there isn't one.
+  if( NULL == subText.mImpl )
+  {
+    subText.mImpl = new Internal::Text();
+  }
+  else
+  {
+    subText.mImpl->Clear();
+  }
+
+  mImpl->GetSubText( from, to, subText.mImpl );
+}
+
+bool Text::IsWhiteSpace( std::size_t index ) const
+{
+  if( NULL == mImpl )
+  {
+    // not a white space if the text is not initialized.
+    return false;
+  }
+
+  return mImpl->IsWhiteSpace( index );
+}
+
+bool Text::IsNewLine( std::size_t index ) const
+{
+  if( NULL == mImpl )
+  {
+    // not a new line if the text is not initialized.
+    return false;
+  }
+
+  return mImpl->IsNewLine( index );
+}
+
 // Note: Theese two methods are needed to retrieve the internal implementation.
 //       As this class is pimpled but is not inheriting from BaseHandle, a method is needed in the public API.