Add Privilege tags to dali.doxy.in
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / text-controller.cpp
index f6544cb..e10556c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -446,26 +446,6 @@ const std::string& Controller::GetDefaultFontFamily() const
   return EMPTY_STRING;
 }
 
-void Controller::SetDefaultFontStyle( const std::string& style )
-{
-  if( NULL == mImpl->mFontDefaults )
-  {
-    mImpl->mFontDefaults = new FontDefaults();
-  }
-
-  mImpl->mFontDefaults->mFontStyle = style;
-}
-
-const std::string& Controller::GetDefaultFontStyle() const
-{
-  if( NULL != mImpl->mFontDefaults )
-  {
-    return mImpl->mFontDefaults->mFontStyle;
-  }
-
-  return EMPTY_STRING;
-}
-
 void Controller::SetDefaultFontWeight( FontWeight weight )
 {
   if( NULL == mImpl->mFontDefaults )
@@ -482,6 +462,11 @@ void Controller::SetDefaultFontWeight( FontWeight weight )
   mImpl->RequestRelayout();
 }
 
+bool Controller::IsDefaultFontWeightDefined() const
+{
+  return mImpl->mFontDefaults->weightDefined;
+}
+
 FontWeight Controller::GetDefaultFontWeight() const
 {
   if( NULL != mImpl->mFontDefaults )
@@ -508,6 +493,11 @@ void Controller::SetDefaultFontWidth( FontWidth width )
   mImpl->RequestRelayout();
 }
 
+bool Controller::IsDefaultFontWidthDefined() const
+{
+  return mImpl->mFontDefaults->widthDefined;
+}
+
 FontWidth Controller::GetDefaultFontWidth() const
 {
   if( NULL != mImpl->mFontDefaults )
@@ -534,6 +524,11 @@ void Controller::SetDefaultFontSlant( FontSlant slant )
   mImpl->RequestRelayout();
 }
 
+bool Controller::IsDefaultFontSlantDefined() const
+{
+  return mImpl->mFontDefaults->slantDefined;
+}
+
 FontSlant Controller::GetDefaultFontSlant() const
 {
   if( NULL != mImpl->mFontDefaults )
@@ -645,11 +640,25 @@ bool Controller::RemoveText( int cursorOffset,
 
       if( UPDATE_INPUT_STYLE == type )
       {
+        // Keep a copy of the current input style.
+        InputStyle currentInputStyle;
+        currentInputStyle.Copy( mImpl->mEventData->mInputStyle );
+
         // Set first the default input style.
         mImpl->RetrieveDefaultInputStyle( mImpl->mEventData->mInputStyle );
 
         // Update the input style.
         mImpl->mLogicalModel->RetrieveStyle( cursorIndex, mImpl->mEventData->mInputStyle );
+
+        // Compare if the input style has changed.
+        const bool hasInputStyleChanged = !currentInputStyle.Equal( mImpl->mEventData->mInputStyle );
+
+        if( hasInputStyleChanged )
+        {
+          const InputStyle::Mask styleChangedMask = currentInputStyle.GetInputStyleChangeMask( mImpl->mEventData->mInputStyle );
+          // Queue the input style changed signal.
+          mImpl->mEventData->mInputStyleChangedQueue.PushBack( styleChangedMask );
+        }
       }
 
       // Updates the text style runs by removing characters. Runs with no characters are removed.
@@ -901,7 +910,7 @@ void Controller::SetInputFontFamily( const std::string& fontFamily )
   if( NULL != mImpl->mEventData )
   {
     mImpl->mEventData->mInputStyle.familyName = fontFamily;
-    mImpl->mEventData->mInputStyle.familyDefined = true;
+    mImpl->mEventData->mInputStyle.isFamilyDefined = true;
 
     if( EventData::SELECTING == mImpl->mEventData->mState )
     {
@@ -955,31 +964,12 @@ const std::string& Controller::GetInputFontFamily() const
   return GetDefaultFontFamily();
 }
 
-void Controller::SetInputFontStyle( const std::string& fontStyle )
-{
-  if( NULL != mImpl->mEventData )
-  {
-    mImpl->mEventData->mInputStyle.fontStyle = fontStyle;
-  }
-}
-
-const std::string& Controller::GetInputFontStyle() const
-{
-  if( NULL != mImpl->mEventData )
-  {
-    return mImpl->mEventData->mInputStyle.fontStyle;
-  }
-
-  // Return the default font's style if there is no EventData.
-  return GetDefaultFontStyle();
-}
-
 void Controller::SetInputFontWeight( FontWeight weight )
 {
   if( NULL != mImpl->mEventData )
   {
     mImpl->mEventData->mInputStyle.weight = weight;
-    mImpl->mEventData->mInputStyle.weightDefined = true;
+    mImpl->mEventData->mInputStyle.isWeightDefined = true;
 
     if( EventData::SELECTING == mImpl->mEventData->mState )
     {
@@ -1018,6 +1008,18 @@ void Controller::SetInputFontWeight( FontWeight weight )
   }
 }
 
+bool Controller::IsInputFontWeightDefined() const
+{
+  bool defined = false;
+
+  if( NULL != mImpl->mEventData )
+  {
+    defined = mImpl->mEventData->mInputStyle.isWeightDefined;
+  }
+
+  return defined;
+}
+
 FontWeight Controller::GetInputFontWeight() const
 {
   if( NULL != mImpl->mEventData )
@@ -1033,7 +1035,7 @@ void Controller::SetInputFontWidth( FontWidth width )
   if( NULL != mImpl->mEventData )
   {
     mImpl->mEventData->mInputStyle.width = width;
-    mImpl->mEventData->mInputStyle.widthDefined = true;
+    mImpl->mEventData->mInputStyle.isWidthDefined = true;
 
     if( EventData::SELECTING == mImpl->mEventData->mState )
     {
@@ -1072,6 +1074,18 @@ void Controller::SetInputFontWidth( FontWidth width )
   }
 }
 
+bool Controller::IsInputFontWidthDefined() const
+{
+  bool defined = false;
+
+  if( NULL != mImpl->mEventData )
+  {
+    defined = mImpl->mEventData->mInputStyle.isWidthDefined;
+  }
+
+  return defined;
+}
+
 FontWidth Controller::GetInputFontWidth() const
 {
   if( NULL != mImpl->mEventData )
@@ -1087,7 +1101,7 @@ void Controller::SetInputFontSlant( FontSlant slant )
   if( NULL != mImpl->mEventData )
   {
     mImpl->mEventData->mInputStyle.slant = slant;
-    mImpl->mEventData->mInputStyle.slantDefined = true;
+    mImpl->mEventData->mInputStyle.isSlantDefined = true;
 
     if( EventData::SELECTING == mImpl->mEventData->mState )
     {
@@ -1126,6 +1140,18 @@ void Controller::SetInputFontSlant( FontSlant slant )
   }
 }
 
+bool Controller::IsInputFontSlantDefined() const
+{
+  bool defined = false;
+
+  if( NULL != mImpl->mEventData )
+  {
+    defined = mImpl->mEventData->mInputStyle.isSlantDefined;
+  }
+
+  return defined;
+}
+
 FontSlant Controller::GetInputFontSlant() const
 {
   if( NULL != mImpl->mEventData )
@@ -1141,6 +1167,7 @@ void Controller::SetInputFontPointSize( float size )
   if( NULL != mImpl->mEventData )
   {
     mImpl->mEventData->mInputStyle.size = size;
+    mImpl->mEventData->mInputStyle.isSizeDefined = true;
 
     if( EventData::SELECTING == mImpl->mEventData->mState )
     {
@@ -1195,6 +1222,7 @@ void Controller::SetInputLineSpacing( float lineSpacing )
   if( NULL != mImpl->mEventData )
   {
     mImpl->mEventData->mInputStyle.lineSpacing = lineSpacing;
+    mImpl->mEventData->mInputStyle.isLineSpacingDefined = true;
   }
 }
 
@@ -1604,6 +1632,33 @@ void Controller::ProcessModifyEvents()
   events.Clear();
 }
 
+bool Controller::IsInputStyleChangedSignalsQueueEmpty()
+{
+  return ( NULL == mImpl->mEventData ) || ( 0u == mImpl->mEventData->mInputStyleChangedQueue.Count() );
+}
+
+void Controller::ProcessInputStyleChangedSignals()
+{
+  if( NULL == mImpl->mEventData )
+  {
+    // Nothing to do.
+    return;
+  }
+
+  for( Vector<InputStyle::Mask>::ConstIterator it = mImpl->mEventData->mInputStyleChangedQueue.Begin(),
+         endIt = mImpl->mEventData->mInputStyleChangedQueue.End();
+       it != endIt;
+       ++it )
+  {
+    const InputStyle::Mask mask = *it;
+
+    // Emit the input style changed signal.
+    mImpl->mControlInterface.InputStyleChanged( mask );
+  }
+
+  mImpl->mEventData->mInputStyleChangedQueue.Clear();
+}
+
 void Controller::ResetText()
 {
   // Reset buffers.
@@ -1980,7 +2035,7 @@ void Controller::KeyboardFocusGainEvent()
       mImpl->ChangeState( EventData::EDITING );
       mImpl->mEventData->mUpdateCursorPosition = true; //If editing started without tap event, cursor update must be triggered.
     }
-
+    mImpl->NotifyImfMultiLineStatus();
     if( mImpl->IsShowingPlaceholderText() )
     {
       // Show alternative placeholder-text when editing
@@ -2363,31 +2418,27 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
   if( NULL != mImpl->mEventData )
   {
     DALI_LOG_INFO( gLogFilter, Debug::Concise, "TapEvent state:%d \n", mImpl->mEventData->mState );
+    EventData::State state( mImpl->mEventData->mState );
+    bool relayoutNeeded( false );   // to avoid unnecessary relayouts when tapping an empty text-field
 
-    if( 1u == tapCount )
+    if( mImpl->IsClipboardVisible() )
     {
-      // This is to avoid unnecessary relayouts when tapping an empty text-field
-      bool relayoutNeeded( false );
-
-      if( ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-          ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) )
+      if( EventData::INACTIVE == state || EventData::EDITING == state)
+      {
+        mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
+      }
+      relayoutNeeded = true;
+    }
+    else if( 1u == tapCount )
+    {
+      if( EventData::EDITING_WITH_POPUP == state || EventData::EDITING_WITH_PASTE_POPUP == state )
       {
         mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );  // If Popup shown hide it here so can be shown again if required.
       }
 
-      if( mImpl->IsShowingRealText() && ( EventData::INACTIVE != mImpl->mEventData->mState ) )
+      if( mImpl->IsShowingRealText() && ( EventData::INACTIVE != state ) )
       {
-        // Already in an active state so show a popup
-        if( !mImpl->IsClipboardEmpty() )
-        {
-          // Shows Paste popup but could show full popup with Selection options. ( EDITING_WITH_POPUP )
-          mImpl->ChangeState( EventData::EDITING_WITH_PASTE_POPUP );
-        }
-        else
-        {
-          // Show cursor and grabhandle on first tap, this matches the behaviour of tapping when already editing
-          mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
-        }
+        mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
         relayoutNeeded = true;
       }
       else
@@ -2398,7 +2449,7 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
           ResetText();
         }
 
-        if( EventData::INACTIVE == mImpl->mEventData->mState )
+        if( EventData::INACTIVE == state )
         {
           mImpl->ChangeState( EventData::EDITING );
         }
@@ -2408,18 +2459,6 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
         }
         relayoutNeeded = true;
       }
-
-      // Handles & cursors must be repositioned after Relayout() i.e. after the Model has been updated
-      if( relayoutNeeded )
-      {
-        Event event( Event::TAP_EVENT );
-        event.p1.mUint = tapCount;
-        event.p2.mFloat = x;
-        event.p3.mFloat = y;
-        mImpl->mEventData->mEventQueue.push_back( event );
-
-        mImpl->RequestRelayout();
-      }
     }
     else if( 2u == tapCount )
     {
@@ -2429,6 +2468,17 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
         SelectEvent( x, y, false );
       }
     }
+    // Handles & cursors must be repositioned after Relayout() i.e. after the Model has been updated
+    if( relayoutNeeded )
+    {
+      Event event( Event::TAP_EVENT );
+      event.p1.mUint = tapCount;
+      event.p2.mFloat = x;
+      event.p3.mFloat = y;
+      mImpl->mEventData->mEventQueue.push_back( event );
+
+      mImpl->RequestRelayout();
+    }
   }
 
   // Reset keyboard as tap event has occurred.
@@ -2480,7 +2530,7 @@ void Controller::LongPressEvent( Gesture::State state, float x, float y  )
 
         mImpl->RequestRelayout();
       }
-      else
+      else if( !mImpl->IsClipboardVisible() )
       {
         // Reset the imf manger to commit the pre-edit before selecting the text.
         mImpl->ResetImfManager();
@@ -2648,9 +2698,7 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt
     }
     case Toolkit::TextSelectionPopup::PASTE:
     {
-      std::string stringToPaste("");
-      mImpl->GetTextFromClipboard( 0, stringToPaste ); // Paste latest item from system clipboard
-      PasteText( stringToPaste );
+      mImpl->RequestGetTextFromClipboard(); // Request clipboard service to retrieve an item
       break;
     }
     case Toolkit::TextSelectionPopup::SELECT:
@@ -2749,9 +2797,6 @@ ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, cons
   {
     mImpl->mOperationsPending = ALL_OPERATIONS;
     mImpl->RequestRelayout();
-
-    // Do this last since it provides callbacks into application code
-    mImpl->mControlInterface.TextChanged();
   }
 
   std::string text;
@@ -2781,6 +2826,12 @@ ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, cons
 
   ImfManager::ImfCallbackData callbackData( ( retrieveText || retrieveCursor ), cursorPosition, text, false );
 
+  if( requestRelayout )
+  {
+    // Do this last since it provides callbacks into application code
+    mImpl->mControlInterface.TextChanged();
+  }
+
   return callbackData;
 }