TextSelectionToolbar and Style Properties added 10/41310/12
authorAgnelo Vaz <agnelo.vaz@samsung.com>
Tue, 9 Jun 2015 13:13:34 +0000 (14:13 +0100)
committerAgnelo Vaz <agnelo.vaz@samsung.com>
Wed, 17 Jun 2015 10:15:28 +0000 (11:15 +0100)
Change-Id: Ie6f58e42eaba78e659ad589572ab6ce5028732b2
Signed-off-by: Agnelo Vaz <agnelo.vaz@samsung.com>
16 files changed:
build/tizen/configure.ac
build/tizen/dali-toolkit/Makefile.am
dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h
dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp [new file with mode: 0644]
dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h [new file with mode: 0644]
dali-toolkit/devel-api/file.list
dali-toolkit/images/selection-popup-bg#.png [new file with mode: 0755]
dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp
dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h
dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp [new file with mode: 0644]
dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h [new file with mode: 0644]
dali-toolkit/internal/file.list
dali-toolkit/internal/text/text-controller-impl.cpp
dali-toolkit/internal/text/text-controller-impl.h
dali-toolkit/styles/dali-toolkit-default-theme.json
dali-toolkit/styles/mobile/dali-toolkit-default-theme.json

index 006e192..6fb8b47 100644 (file)
@@ -45,6 +45,12 @@ AC_ARG_ENABLE([debug],
               [enable_debug=$enableval],
               [enable_debug=no])
 
+AC_ARG_ENABLE([i18n],
+              [AC_HELP_STRING([--enable-i18n],
+                              [Turns on internationalisation])],
+              [enable_i18n=$enableval],
+              [enable_i18n=no])
+
 # option to build JavaScript plugin
 # configure settings and output
 # --enable-javascript        // enable_javascript = yes
@@ -67,8 +73,9 @@ if test "x$enable_debug" = "xno" -a "x$enable_exportall" = "xno"; then
   DALI_TOOLKIT_CFLAGS="$DALI_TOOLKIT_CFLAGS -fvisibility=hidden -DHIDE_DALI_INTERNALS"
 fi
 
-
-
+if test "x$enable_i18n" = "xyes"; then
+  DALI_TOOLKIT_CFLAGS="$DALI_TOOLKIT_CFLAGS -DDGETTEXT_ENABLED "
+fi
 
 # Tizen Profile options
 AC_ARG_ENABLE([profile],
index b1d8989..0319ac1 100644 (file)
@@ -101,6 +101,7 @@ develapishadereffectsdir =      $(develapidir)/shader-effects
 develapitransitioneffectsdir =  $(develapidir)/transition-effects
 develapistylingdir =            $(develapidir)/styling
 develapitoolbardir =            $(develapicontrolsdir)/tool-bar
+develapitextselectionpopupdir = $(develapicontrolsdir)/text-controls
 
 # devel headers
 develapibloomview_HEADERS =         $(devel_api_bloom_view_header_files)
@@ -120,6 +121,7 @@ develapistyling_HEADERS =           $(devel_api_styling_header_files)
 develapisuperblurview_HEADERS =     $(devel_api_super_blur_view_header_files)
 develapitoolbar_HEADERS =           $(devel_api_tool_bar_header_files)
 develapitransitioneffects_HEADERS = $(devel_api_transition_effects_header_files)
+develapitextselectionpopup_HEADERS = $(devel_api_text_selection_popup_header_files)
 
 # public api source
 publicapidir =                  $(topleveldir)/public-api
index 2243f2d..69df315 100644 (file)
@@ -56,15 +56,18 @@ public:
   };
 
   /**
-   * @brief An enumeration of properties belonging to the TextLabel class.
+   * @brief An enumeration of properties belonging to the TextSelectionPopup class.
    */
   struct Property
   {
     enum
     {
 
-      POPUP_MAX_SIZE,                           ///< name "popup-max-size",                The max size the Popup can be,                  type VECTOR2
-      POPUP_BACKGROUND_IMAGE,                   ///< name "popup-background-image",        The image to display for popup background       type STRING
+      POPUP_MAX_SIZE =  PROPERTY_START_INDEX,   ///< name "popup-max-size",                The maximum size the Popup can be,              type VECTOR2
+      POPUP_MIN_SIZE,                           ///< name "popup-min-size",                The minimum size the Popup can be,              type VECTOR2
+      OPTION_MAX_SIZE,                          ///< name "option-max-size",               The maximum size an option can be,              type VECTOR2
+      OPTION_MIN_SIZE,                          ///< name "option-min-size",               The minimum size an option can be,              type VECTOR2
+      OPTION_DIVIDER_SIZE,                      ///< name "option-divider-size",           The size of the divider between options         type VECTOR2
       POPUP_CLIPBOARD_BUTTON_ICON_IMAGE,        ///< name "popup-clipboard-button-image",  The image to use as the popup clipboard icon,   type STRING
       POPUP_CUT_BUTTON_ICON_IMAGE,              ///< name "popup-cut-button-image",        The image to use as the popup cut icon,         type STRING
       POPUP_COPY_BUTTON_ICON_IMAGE,             ///< name "popup-copy-button-image",       The image to use as the popup copy icon,        type STRING
@@ -138,6 +141,6 @@ public: // Not intended for application developers
 
 } // namespace Toolkit
 
-} // namepsace Dali
+} // namespace Dali
 
 #endif // __DALI_TOOLKIT_TEXT_SELECTION_POPUP_H__
diff --git a/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp
new file mode 100644 (file)
index 0000000..453b12d
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h>
+
+using namespace Dali;
+
+namespace Dali
+{
+
+namespace Toolkit
+{
+
+TextSelectionToolbar TextSelectionToolbar::New()
+{
+  return Internal::TextSelectionToolbar::New();
+}
+
+TextSelectionToolbar::TextSelectionToolbar()
+{
+}
+
+TextSelectionToolbar::TextSelectionToolbar( const TextSelectionToolbar& handle )
+: Control( handle )
+{
+}
+
+TextSelectionToolbar& TextSelectionToolbar::operator=( const TextSelectionToolbar& handle )
+{
+  if( &handle != this )
+  {
+    Control::operator=( handle );
+  }
+  return *this;
+}
+
+TextSelectionToolbar::~TextSelectionToolbar()
+{
+}
+
+void TextSelectionToolbar::AddOption( Actor& option )
+{
+  GetImpl(*this).AddOption(option);
+}
+
+
+void TextSelectionToolbar::AddDivider( Actor& divider )
+{
+  GetImpl(*this).AddDivider( divider );
+}
+
+void TextSelectionToolbar::ResizeDividers( Size& size )
+{
+  GetImpl(*this).ResizeDividers( size );
+}
+
+TextSelectionToolbar TextSelectionToolbar::DownCast( BaseHandle handle )
+{
+  return Control::DownCast<TextSelectionToolbar, Internal::TextSelectionToolbar>(handle);
+}
+
+TextSelectionToolbar::TextSelectionToolbar( Internal::TextSelectionToolbar& implementation )
+: Control(implementation)
+{
+}
+
+TextSelectionToolbar::TextSelectionToolbar( Dali::Internal::CustomActor* internal )
+: Control( internal )
+{
+  VerifyCustomActorPointer<Internal::TextSelectionToolbar>( internal );
+}
+
+
+} // namespace Toolkit
+
+} // namespace Dali
diff --git a/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h
new file mode 100644 (file)
index 0000000..31fca5c
--- /dev/null
@@ -0,0 +1,154 @@
+#ifndef __DALI_TOOLKIT_TEXT_SELECTION_TOOLBAR_H__
+#define __DALI_TOOLKIT_TEXT_SELECTION_TOOLBAR_H__
+
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/control.h>
+
+namespace Dali
+{
+
+namespace Toolkit
+{
+
+namespace Internal DALI_INTERNAL
+{
+class TextSelectionToolbar;
+}
+
+/**
+ * @brief A control which provides a Popup with a number of buttons
+ *
+ * The style of the pop can be set through style sheets, this includes the images for the buttons
+ * A Show and Hide API is provided.
+ *
+ * If the buttons exceed the size constraints of the popup then it will offer scrolling.
+ *
+ *
+ */
+class DALI_IMPORT_API TextSelectionToolbar : public Control
+{
+public:
+
+  /**
+   * @brief The start and end property ranges for this control.
+   */
+  enum PropertyRange
+  {
+    PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+  };
+
+  /**
+   * @brief An enumeration of properties belonging to the TextSelectionToolbar class.
+   */
+  struct Property
+  {
+    enum
+    {
+      MAX_SIZE =  PROPERTY_START_INDEX   ///< name "popup-max-size",                The maximum size the Popup can be,              type VECTOR2
+    };
+  };
+
+  /**
+   * Create the TextSelectionToolbar control.
+   * @return A handle to the TextSelectionToolbar control.
+   */
+  static TextSelectionToolbar New();
+
+  /**
+   * @brief Creates an empty handle.
+   */
+  TextSelectionToolbar();
+
+  /**
+   * @brief Copy constructor.
+   *
+   * @param[in] handle The handle to copy from.
+   */
+  TextSelectionToolbar( const TextSelectionToolbar& handle );
+
+  /**
+   * @brief Assignment operator.
+   *
+   * @param[in] handle The handle to copy from.
+   * @return A reference to this.
+   */
+  TextSelectionToolbar& operator=( const TextSelectionToolbar& handle );
+
+  /**
+   * @brief Destructor
+   *
+   * This is non-virtual since derived Handle types must not contain data or virtual methods.
+   */
+  ~TextSelectionToolbar();
+
+
+  /**
+   * @brief Add a option to the the Tool bar
+   * @param[in] option Option actor to add
+   */
+  void AddOption( Actor& option );
+
+  /**
+   * @brief Add a divider to the the Tool bar
+   * @param[in] divider Actor to be used as divider
+   */
+  void AddDivider( Actor& divider );
+
+  /**
+   *  @brief ResizeDividers
+   *  @param[in] size New size of dividers, provide 0 for height to automatically set height
+   */
+  void ResizeDividers( Size& size );
+
+  /**
+   * @brief Downcast a handle to TextSelectionToolbar.
+   *
+   * If the BaseHandle points is a TextSelectionToolbar the downcast returns a valid handle.
+   * If not the returned handle is left empty.
+   *
+   * @param[in] handle Handle to an object
+   * @return handle to a TextSelectionToolbar or an empty handle
+   */
+  static TextSelectionToolbar DownCast( BaseHandle handle );
+
+public: // Not intended for application developers
+
+  /**
+   * @brief Creates a handle using the Toolkit::Internal implementation.
+   *
+   * @param[in] implementation The Control implementation.
+   */
+  DALI_INTERNAL TextSelectionToolbar( Internal::TextSelectionToolbar& implementation );
+
+  /**
+   * @brief Allows the creation of this Control from an Internal::CustomActor pointer.
+   *
+   * @param[in]  internal  A pointer to the internal CustomActor.
+   */
+  explicit DALI_INTERNAL TextSelectionToolbar( Dali::Internal::CustomActor* internal );
+
+}; // Class TextSelectionToolbar
+
+} // namespace Toolkit
+
+} // namespace Dali
+
+#endif // __DALI_TOOLKIT_TEXT_SELECTION_TOOLBAR_H__
index ae50ba3..d669daf 100755 (executable)
@@ -17,6 +17,7 @@ devel_api_src_files = \
   $(devel_api_src_dir)/controls/slider/slider.cpp \
   $(devel_api_src_dir)/controls/super-blur-view/super-blur-view.cpp \
   $(devel_api_src_dir)/controls/text-controls/text-selection-popup.cpp \
+  $(devel_api_src_dir)/controls/text-controls/text-selection-toolbar.cpp \
   $(devel_api_src_dir)/controls/tool-bar/tool-bar.cpp \
   $(devel_api_src_dir)/focus-manager/keyinput-focus-manager.cpp \
   $(devel_api_src_dir)/styling/style-manager.cpp \
@@ -137,8 +138,9 @@ devel_api_shader_effects_header_files = \
 devel_api_super_blur_view_header_files = \
   $(devel_api_src_dir)/controls/super-blur-view/super-blur-view.h
 
-devel_api_text_selection_popup_header_files = \
-  $(devel_api_src_dir)/controls/text-controls/text-selection-popup.h
+devel_api_text_controls_header_files = \
+  $(devel_api_src_dir)/controls/text-controls/text-selection-popup.h \
+  $(devel_api_src_dir)/controls/text-controls/text-selection-toolbar.h
 
 devel_api_tool_bar_header_files = \
   $(devel_api_src_dir)/controls/tool-bar/tool-bar.h
diff --git a/dali-toolkit/images/selection-popup-bg#.png b/dali-toolkit/images/selection-popup-bg#.png
new file mode 100755 (executable)
index 0000000..3eac19f
Binary files /dev/null and b/dali-toolkit/images/selection-popup-bg#.png differ
index d66a70a..be7834a 100644 (file)
 #include <dali/public-api/images/resource-image.h>
 #include <dali/public-api/math/vector2.h>
 #include <dali/public-api/math/vector4.h>
+#include <dali/devel-api/object/type-registry-helper.h>
 #include <libintl.h>
 #include <cfloat>
 
-// todo Move this to adaptor??
-#define GET_LOCALE_TEXT(string) dgettext("elementary", string)
-
 namespace Dali
 {
 
@@ -45,15 +43,14 @@ namespace Internal
 
 namespace
 {
-const Dali::Vector4 DEFAULT_POPUP_BACKGROUND( Dali::Vector4( .20f, 0.29f, 0.44f, 1.0f ) );
-const Dali::Vector4 DEFAULT_POPUP_BACKGROUND_PRESSED( Dali::Vector4( 0.07f, 0.10f, 0.17f, 1.0f ) );
-const Dali::Vector4 DEFAULT_POPUP_LINE_COLOR( Dali::Vector4( 0.36f, 0.45f, 0.59f, 1.0f ) );
+// todo Move this to adaptor??
+#define GET_LOCALE_TEXT(string) dgettext("elementary", string)
+
+const Dali::Vector4 DEFAULT_POPUP_LINE_COLOR( Dali::Vector4( 0.69f, 0.93f, 0.93f, 1.0f ) );
 const Dali::Vector4 DEFAULT_OPTION_ICON( Dali::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );
 const Dali::Vector4 DEFAULT_OPTION_ICON_PRESSED( Dali::Vector4( 0.5f, 1.0f, 1.0f, 1.0f ) );
-const Dali::Vector4 DEFAULT_OPTION_TEXT( Dali::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );
-const Dali::Vector4 DEFAULT_OPTION_TEXT_PRESSED( Dali::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );
 
-const std::string DEFAULT_POPUP_BACKGROUND_IMAGE( DALI_IMAGE_DIR "popup_bubble_bg.#.png" );
+const std::string DEFAULT_POPUP_BACKGROUND_IMAGE( DALI_IMAGE_DIR "selection-popup-bg#.png" );
 const std::string OPTION_ICON_CLIPBOARD( DALI_IMAGE_DIR "copy_paste_icon_clipboard.png" );
 const std::string OPTION_ICON_COPY( DALI_IMAGE_DIR "copy_paste_icon_copy.png" );
 const std::string OPTION_ICON_CUT( DALI_IMAGE_DIR "copy_paste_icon_cut.png" );
@@ -61,20 +58,27 @@ const std::string OPTION_ICON_PASTE( DALI_IMAGE_DIR "copy_paste_icon_paste.png"
 const std::string OPTION_ICON_SELECT( DALI_IMAGE_DIR "copy_paste_icon_select.png" );
 const std::string OPTION_ICON_SELECT_ALL( DALI_IMAGE_DIR "copy_paste_icon_select_all.png" );
 
-const Dali::Vector2 DEFAULT_POPUP_MAX_SIZE( 450.0f, 100.0f ); ///< The maximum size of the popup.
-
-const Dali::Vector2 OPTION_ICON_SIZE( 65.0f, 65.0f );       ///< The size of the icon.
 const float OPTION_MARGIN_WIDTH( 10.f );          ///< The margin between the right or lefts edge and the text or icon.
-const float OPTION_MAX_WIDTH( 110.0f );          ///< The maximum width of the option   //todo Make Property
-const float OPTION_MIN_WIDTH( 86.0f );           ///< The minimum width of the option. //todo Make Property
-const float POPUP_DIVIDER_WIDTH( 3.f );        ///< The size of the divider.
 
-const Dali::Vector2 POPUP_TAIL_SIZE( 20.0f, 16.0f ); ///< The size of the tail.
-const float POPUP_TAIL_Y_OFFSET( 5.f );        ///< The y offset of the tail (when its position is on the bottom).
-const float POPUP_TAIL_TOP_Y_OFFSET( 3.f );    ///< The y offset of the tail (when its position is on the top).
+#ifdef DGETTEXT_ENABLED
 
-const float HIDE_POPUP_ANIMATION_DURATION( 0.2f ); ///< Duration of popup hide animation in seconds.
-const float SHOW_POPUP_ANIMATION_DURATION( 0.2f ); ///< Duration of popup show animation in seconds.
+#define POPUP_CUT_STRING GET_LOCALE_TEXT("IDS_COM_BODY_CUT")
+#define POPUP_COPY_STRING GET_LOCALE_TEXT("IDS_COM_BODY_COPY")
+#define POPUP_PASTE_STRING GET_LOCALE_TEXT("IDS_COM_BODY_PASTE")
+#define POPUP_SELECT_STRING GET_LOCALE_TEXT("IDS_COM_SK_SELECT")
+#define POPUP_SELECT_ALL_STRING GET_LOCALE_TEXT("IDS_COM_BODY_SELECT_ALL")
+#define POPUP_CLIPBOARD_STRING GET_LOCALE_TEXT("IDS_COM_BODY_CLIPBOARD")
+
+#else
+
+#define POPUP_CUT_STRING  "Cut"
+#define POPUP_COPY_STRING  "Copy"
+#define POPUP_PASTE_STRING  "Paste"
+#define POPUP_SELECT_STRING  "Select"
+#define POPUP_SELECT_ALL_STRING  "Select All"
+#define POPUP_CLIPBOARD_STRING  "Clipboard"
+
+#endif
 
 const char* const OPTION_SELECT_WORD = "option-select_word";                       // "Select Word" popup option.
 const char* const OPTION_SELECT_ALL("option-select_all");                          // "Select All" popup option.
@@ -83,14 +87,30 @@ const char* const OPTION_COPY("option-copy");
 const char* const OPTION_PASTE("option-paste");                                    // "Paste" popup option.
 const char* const OPTION_CLIPBOARD("option-clipboard");                            // "Clipboard" popup option.
 
-} // namespace
+BaseHandle Create()
+{
+  return Toolkit::TextSelectionPopup::New();
+}
 
-//// Comparison function for ButtonRequirement Priority
-//bool TextSelectionPopup::PriorityCompare( ButtonRequirement const& a, ButtonRequirement const& b )
-//{
-//  return a.priority < b.priority;
-//}
+// Setup properties, signals and actions using the type-registry.
 
+DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionPopup, Toolkit::Control, Create );
+
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-max-size", VECTOR2,   POPUP_MAX_SIZE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-min-size", VECTOR2,   POPUP_MIN_SIZE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "option-max-size", VECTOR2,   OPTION_MAX_SIZE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "option-min-size", VECTOR2,   OPTION_MIN_SIZE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "option-divider-size", VECTOR2,   OPTION_DIVIDER_SIZE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-clipboard-button-image", STRING, POPUP_CLIPBOARD_BUTTON_ICON_IMAGE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-cut-button-image", STRING, POPUP_CUT_BUTTON_ICON_IMAGE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-copy-button-image", STRING, POPUP_COPY_BUTTON_ICON_IMAGE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-paste-button-image", STRING, POPUP_PASTE_BUTTON_ICON_IMAGE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-select-button-image", STRING, POPUP_SELECT_BUTTON_ICON_IMAGE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-select-all-button-image", STRING, POPUP_SELECT_ALL_BUTTON_ICON_IMAGE )
+
+DALI_TYPE_REGISTRATION_END()
+
+} // namespace
 
 Dali::Toolkit::TextSelectionPopup TextSelectionPopup::New()
 {
@@ -119,49 +139,63 @@ void TextSelectionPopup::SetProperty( BaseObject* object, Property::Index index,
     {
       case Toolkit::TextSelectionPopup::Property::POPUP_MAX_SIZE:
       {
-       impl.SetPopupMaxSize( value.Get< Vector2 >() );
+       impl.SetDimensionToCustomise( POPUP_MAXIMUM_SIZE, value.Get< Vector2 >() );
        break;
       }
-      case Toolkit::TextSelectionPopup::Property::POPUP_BACKGROUND_IMAGE:
+      case Toolkit::TextSelectionPopup::Property::POPUP_MIN_SIZE:
       {
-        ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_BACKGROUND, image );
+        impl.SetDimensionToCustomise( POPUP_MINIMUM_SIZE, value.Get< Vector2 >() );
+        break;
+      }
+      case Toolkit::TextSelectionPopup::Property::OPTION_MAX_SIZE:
+      {
+        impl.SetDimensionToCustomise( OPTION_MAXIMUM_SIZE, value.Get< Vector2 >() );
+        break;
+      }
+      case Toolkit::TextSelectionPopup::Property::OPTION_MIN_SIZE:
+      {
+        impl.SetDimensionToCustomise( OPTION_MINIMUM_SIZE, value.Get< Vector2>() );
+        break;
+      }
+      case Toolkit::TextSelectionPopup::Property::OPTION_DIVIDER_SIZE:
+      {
+        impl.SetDimensionToCustomise( OPTION_DIVIDER_SIZE, value.Get< Vector2>() );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_CLIPBOARD_BUTTON_ICON_IMAGE:
       {
         ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_CLIPBOARD_BUTTON, image );
+        impl.SetButtonImage( CLIPBOARD, image );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_CUT_BUTTON_ICON_IMAGE:
       {
         ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_CUT_BUTTON_ICON, image );
+        impl.SetButtonImage( CUT, image );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_COPY_BUTTON_ICON_IMAGE:
       {
         ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_COPY_BUTTON_ICON, image );
+        impl.SetButtonImage( COPY, image );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_PASTE_BUTTON_ICON_IMAGE:
       {
         ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_PASTE_BUTTON_ICON, image );
+        impl.SetButtonImage( PASTE, image );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_BUTTON_ICON_IMAGE:
       {
         ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_SELECT_BUTTON_ICON, image );
+        impl.SetButtonImage( SELECT, image );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_ALL_BUTTON_ICON_IMAGE:
       {
         ResourceImage image = ResourceImage::New( value.Get< std::string >() );
-        impl.SetPopupImage( POPUP_SELECT_ALL_BUTTON_ICON, image );
+        impl.SetButtonImage( SELECT_ALL, image );
         break;
       }
     } // switch
@@ -182,21 +216,27 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
     {
       case Toolkit::TextSelectionPopup::Property::POPUP_MAX_SIZE:
       {
-        value = impl.GetPopupMaxSize();
+        value = impl.GetDimensionToCustomise( POPUP_MAXIMUM_SIZE );
         break;
       }
-      case Toolkit::TextSelectionPopup::Property::POPUP_BACKGROUND_IMAGE:
+      case Toolkit::TextSelectionPopup::Property::OPTION_MAX_SIZE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_BACKGROUND ) );
-        if( image )
-        {
-          value = image.GetUrl();
-        }
+        value = impl.GetDimensionToCustomise( OPTION_MAXIMUM_SIZE );
+        break;
+      }
+      case Toolkit::TextSelectionPopup::Property::OPTION_MIN_SIZE:
+      {
+        value = impl.GetDimensionToCustomise( OPTION_MINIMUM_SIZE );
+        break;
+      }
+      case Toolkit::TextSelectionPopup::Property::OPTION_DIVIDER_SIZE:
+      {
+        value = impl.GetDimensionToCustomise( OPTION_DIVIDER_SIZE );
         break;
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_CLIPBOARD_BUTTON_ICON_IMAGE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_CLIPBOARD_BUTTON ) );
+        ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( CLIPBOARD ) );
         if( image )
         {
           value = image.GetUrl();
@@ -205,7 +245,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_CUT_BUTTON_ICON_IMAGE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_CUT_BUTTON_ICON ) );
+        ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( CUT ) );
         if( image )
         {
           value = image.GetUrl();
@@ -214,7 +254,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_COPY_BUTTON_ICON_IMAGE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_COPY_BUTTON_ICON ) );
+        ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( COPY ) );
         if( image )
         {
           value = image.GetUrl();
@@ -223,7 +263,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_PASTE_BUTTON_ICON_IMAGE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_PASTE_BUTTON_ICON ) );
+        ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( PASTE ) );
         if( image )
         {
           value = image.GetUrl();
@@ -232,7 +272,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_BUTTON_ICON_IMAGE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_SELECT_BUTTON_ICON ) );
+        ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( SELECT ) );
         if( image )
         {
           value = image.GetUrl();
@@ -241,7 +281,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
       }
       case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_ALL_BUTTON_ICON_IMAGE:
       {
-        ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_SELECT_ALL_BUTTON_ICON ) );
+        ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( SELECT_ALL ) );
         if( image )
         {
           value = image.GetUrl();
@@ -258,106 +298,160 @@ void TextSelectionPopup::OnInitialize()
   CreatePopup();
 }
 
-void TextSelectionPopup::OnRelayout( const Vector2& size, RelayoutContainer& container )
+void TextSelectionPopup::SetDimensionToCustomise( const PopupCustomisations& settingToCustomise, const Size& dimension )
 {
+  switch( settingToCustomise )
+  {
+    case POPUP_MAXIMUM_SIZE :
+    {
+      Actor self = Self();
+      mMaxSize = dimension;
+      if ( mToolbar )
+      {
+        mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, mMaxSize );
+      }
+      break;
+    }
+    case POPUP_MINIMUM_SIZE :
+    {
+      Actor self = Self();
+      mMinSize = dimension;
+      // Option can not be smaller than this if only one.
+      break;
+    }
+    case OPTION_MAXIMUM_SIZE :
+    {
+      mOptionMaxSize = dimension;
+      // Option max size not currently currently supported
 
+      break;
+    }
+    case OPTION_MINIMUM_SIZE :
+    {
+      mOptionMinSize = dimension;
+      // Option min size not currently currently supported
+      break;
+    }
+    case OPTION_DIVIDER_SIZE :
+    {
+      mOptionDividerSize = dimension;
+      if ( mToolbar )
+      {
+        // Resize Dividers not currently supported
+      }
+      break;
+    }
+  } // switch
 }
 
-void TextSelectionPopup::SetPopupMaxSize( const Size& maxSize )
+Size TextSelectionPopup::GetDimensionToCustomise( const PopupCustomisations& settingToCustomise )
 {
-  mMaxSize = maxSize;
-}
+  switch( settingToCustomise )
+  {
+    case POPUP_MAXIMUM_SIZE :
+    {
+      return mMaxSize;
+    }
+    case POPUP_MINIMUM_SIZE :
+    {
+      return mMinSize;
+    }
+    case OPTION_MAXIMUM_SIZE :
+    {
+      return mOptionMaxSize;
+    }
+    case OPTION_MINIMUM_SIZE :
+    {
+      return mOptionMinSize;
+    }
+    case OPTION_DIVIDER_SIZE :
+    {
+      return mOptionDividerSize;
+    }
+  } // switch
 
-const Dali::Vector2& TextSelectionPopup::GetPopupMaxSize() const
-{
-  return mMaxSize;
+  return Size::ZERO;
 }
 
-void TextSelectionPopup::SetPopupImage( PopupParts part, Dali::Image image )
+void TextSelectionPopup::SetButtonImage( Buttons button, Dali::Image image )
 {
-   switch ( part )
-   {
-   case POPUP_BACKGROUND :
+   switch ( button )
    {
-     mBackgroundImage = image;
-   }
    break;
-   case POPUP_CLIPBOARD_BUTTON :
+   case CLIPBOARD:
    {
      mClipboardIconImage  = image;
    }
    break;
-   case POPUP_CUT_BUTTON_ICON :
+   case CUT :
    {
      mCutIconImage = image;
    }
    break;
-   case POPUP_COPY_BUTTON_ICON :
+   case COPY :
    {
      mCopyIconImage = image;
    }
    break;
-   case POPUP_PASTE_BUTTON_ICON :
+   case PASTE :
    {
      mPasteIconImage = image;
    }
    break;
-   case POPUP_SELECT_BUTTON_ICON :
+   case SELECT :
    {
      mSelectIconImage = image;
    }
    break;
-   case POPUP_SELECT_ALL_BUTTON_ICON :
+   case SELECT_ALL :
    {
      mSelectAllIconImage = image;
    }
    break;
-
+   default :
+   {
+     DALI_ASSERT_DEBUG( "TextSelectionPopup SetPopupImage Unknown Button" );
+   }
    } // switch
 }
 
-Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part )
+Dali::Image TextSelectionPopup::GetButtonImage( Buttons button )
 {
-  switch ( part )
+  switch ( button )
   {
-  case POPUP_BACKGROUND :
-  {
-    return mBackgroundImage;
-  }
-  break;
-  case POPUP_CLIPBOARD_BUTTON :
+  case CLIPBOARD :
   {
     return mClipboardIconImage;
   }
   break;
-  case POPUP_CUT_BUTTON_ICON :
+  case CUT :
   {
     return mCutIconImage;
   }
   break;
-  case POPUP_COPY_BUTTON_ICON :
+  case COPY :
   {
     return mCopyIconImage;
   }
   break;
-  case POPUP_PASTE_BUTTON_ICON :
+  case PASTE :
   {
     return mPasteIconImage;
   }
   break;
-  case POPUP_SELECT_BUTTON_ICON :
+  case SELECT :
   {
     return mSelectIconImage;
   }
   break;
-  case POPUP_SELECT_ALL_BUTTON_ICON :
+  case SELECT_ALL :
   {
     return mSelectAllIconImage;
   }
   break;
   default :
   {
-    DALI_ASSERT_DEBUG( "Unknown Popup Part" );
+    DALI_ASSERT_DEBUG( "TextSelectionPopup GetPopupImage Unknown Button" );
   }
   } // switch
 
@@ -373,66 +467,56 @@ Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part )
    {
      mCutIconImage = ResourceImage::New( OPTION_ICON_CUT );
    }
-   mOrderListOfButtons.push_back( ButtonRequirement( ButtonsCut, mCutOptionPriority, OPTION_CUT, GET_LOCALE_TEXT("IDS_COM_BODY_CUT"), mCutIconImage, true ) );
+   mOrderListOfButtons.push_back( ButtonRequirement( CUT, mCutOptionPriority, OPTION_CUT, POPUP_CUT_STRING , mCutIconImage, false ) );
 
    if ( !mCopyIconImage )
    {
      mCopyIconImage = ResourceImage::New( OPTION_ICON_COPY );
    }
-   mOrderListOfButtons.push_back( ButtonRequirement( ButtonsCopy, mCopyOptionPriority, OPTION_COPY, GET_LOCALE_TEXT("IDS_COM_BODY_COPY"), mCopyIconImage, true ) );
+   mOrderListOfButtons.push_back( ButtonRequirement( COPY, mCopyOptionPriority, OPTION_COPY, POPUP_COPY_STRING, mCopyIconImage, false ) );
 
    if ( !mPasteIconImage )
    {
      mPasteIconImage = ResourceImage::New( OPTION_ICON_PASTE );
    }
-   mOrderListOfButtons.push_back( ButtonRequirement( ButtonsPaste, mPasteOptionPriority, OPTION_PASTE, GET_LOCALE_TEXT("IDS_COM_BODY_PASTE"), mPasteIconImage, true ) );
+   mOrderListOfButtons.push_back( ButtonRequirement( PASTE, mPasteOptionPriority, OPTION_PASTE, POPUP_PASTE_STRING, mPasteIconImage, false ) );
 
    if ( !mSelectIconImage )
    mSelectIconImage = ResourceImage::New( OPTION_ICON_SELECT );
-   mOrderListOfButtons.push_back( ButtonRequirement( ButtonsSelect, mSelectOptionPriority, OPTION_SELECT_WORD, GET_LOCALE_TEXT("IDS_COM_SK_SELECT"), mSelectIconImage, true ) );
+   mOrderListOfButtons.push_back( ButtonRequirement( SELECT, mSelectOptionPriority, OPTION_SELECT_WORD, POPUP_SELECT_STRING, mSelectIconImage, true ) );
 
    if ( !mSelectAllIconImage )
    {
     mSelectAllIconImage = ResourceImage::New( OPTION_ICON_SELECT_ALL );
    }
-   mOrderListOfButtons.push_back( ButtonRequirement( ButtonsSelectAll, mSelectAllOptionPriority, OPTION_SELECT_ALL, GET_LOCALE_TEXT("IDS_COM_BODY_SELECT_ALL"), mSelectAllIconImage, true ) );
+   mOrderListOfButtons.push_back( ButtonRequirement( SELECT_ALL, mSelectAllOptionPriority, OPTION_SELECT_ALL, POPUP_SELECT_ALL_STRING, mSelectAllIconImage, true ) );
 
    if ( !mClipboardIconImage )
    {
      mClipboardIconImage = ResourceImage::New( OPTION_ICON_CLIPBOARD );
    }
-   mOrderListOfButtons.push_back( ButtonRequirement( ButtonsClipboard, mClipboardOptionPriority, OPTION_CLIPBOARD, GET_LOCALE_TEXT("IDS_COM_BODY_CLIPBOARD"), mClipboardIconImage, true ) );
+   mOrderListOfButtons.push_back( ButtonRequirement( CLIPBOARD, mClipboardOptionPriority, OPTION_CLIPBOARD, POPUP_CLIPBOARD_STRING, mClipboardIconImage, false ) );
 
    // Sort the buttons according their priorities.
    std::sort( mOrderListOfButtons.begin(), mOrderListOfButtons.end(), TextSelectionPopup::ButtonPriorityCompare() );
  }
 
- void TextSelectionPopup::CreateBackground()
- {
-   if ( mBackgroundImage )
-   {
-     SetBackgroundImage (  mBackgroundImage );
-   }
-
-   SetBackgroundColor( mBackgroundColor );
- }
-
- void TextSelectionPopup::AddOption( Dali::Toolkit::TableView& parent, const std::string& name, const std::string& caption, const Image iconImage, bool finalOption, bool showIcons, bool showCaption, std::size_t& indexInTable )
+ void TextSelectionPopup::AddOption( const std::string& name, const std::string& caption, const Image iconImage, bool showDivider, bool showIcons, bool showCaption  )
  {
    // 1. Create the backgrounds for the popup option both normal and pressed.
    // Both containers will be added to a button.
 
-   Toolkit::TableView optionContainer = Toolkit::TableView::New( (showIcons)?2:1 , 1 );
+   Toolkit::TableView optionContainer = Toolkit::TableView::New( (showIcons&showCaption)?2:1 , 1 );
    optionContainer.SetDrawMode( DrawMode::OVERLAY );
-   optionContainer.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
-   optionContainer.SetMinimumSize( Vector2( OPTION_MIN_WIDTH, 0 ) );
+   optionContainer.SetFitHeight( 0 );
    optionContainer.SetFitWidth( 0 );
 
-   Toolkit::TableView  optionPressedContainer = Toolkit::TableView::New( (showIcons)?2:1 , 1 );
+   Toolkit::TableView  optionPressedContainer = Toolkit::TableView::New( (showIcons&showCaption)?2:1 , 1 );
    optionPressedContainer.SetDrawMode( DrawMode::OVERLAY );
-   optionPressedContainer.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
-   optionPressedContainer.SetMinimumSize( Vector2( OPTION_MIN_WIDTH, 0 ) );
+   optionPressedContainer.SetFitHeight( 0 );
    optionPressedContainer.SetFitWidth( 0 );
+   optionPressedContainer.SetBackgroundColor(Color::RED); //todo member variable
+
 #ifdef DECORATOR_DEBUG
    optionContainer.SetName("optionContainer");
    optionPressedContainer.SetName("optionPressedContainer");
@@ -441,112 +525,83 @@ Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part )
 
    if ( showCaption )
    {
-   Toolkit::TextLabel captionTextLabel = Toolkit::TextLabel::New();
-   captionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption );
-   optionContainer.SetFitHeight( 0 );
-
-   Toolkit::TextLabel pressedCaptionTextLabel = Toolkit::TextLabel::New();
-   pressedCaptionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption );
-   optionPressedContainer.SetFitHeight( 0 );
-
-   captionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH );
-   captionTextLabel.SetMaximumSize( Vector2( OPTION_MAX_WIDTH - 2.f * OPTION_MARGIN_WIDTH , FLT_MAX ) ); //todo FLT_MAX Size negotiation feature needed
-
-   pressedCaptionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH );
-   pressedCaptionTextLabel.SetMaximumSize( Vector2( OPTION_MAX_WIDTH - 2.f * OPTION_MARGIN_WIDTH , FLT_MAX) ); //todo FLT_MAX Size negotiation feature needed
-
-   optionContainer.AddChild( captionTextLabel, Toolkit::TableView::CellPosition( 1, 0 )  ); // todo Labels need ellipsis or similar
-   optionPressedContainer.AddChild( pressedCaptionTextLabel, Toolkit::TableView::CellPosition( 1, 0 )  ); // todo Labels need ellipsis or similar
+     Toolkit::TextLabel captionTextLabel = Toolkit::TextLabel::New();
+     captionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption );
+     captionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
+
+     Toolkit::TextLabel pressedCaptionTextLabel = Toolkit::TextLabel::New();
+     pressedCaptionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption );
+     pressedCaptionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
+
+     Padding padding;
+     padding.left = 24.0f;
+     padding.right = 24.0f;
+     padding.top = 13.0f;
+     padding.bottom = 14.0f;
+     captionTextLabel.SetPadding( padding );
+     pressedCaptionTextLabel.SetPadding( padding );
+
+     optionContainer.AddChild( captionTextLabel, Toolkit::TableView::CellPosition(( showIcons&showCaption)?1:0, 0 )  );
+     optionPressedContainer.AddChild( pressedCaptionTextLabel, Toolkit::TableView::CellPosition(( showIcons&showCaption)?1:0, 0 ) );
    }
 
+   // 3. Create the icons
    if ( showIcons )
    {
-     // 3. Create the icons
      ImageActor pressedIcon = ImageActor::New(  iconImage );
      ImageActor icon = ImageActor::New(  iconImage );
-     icon.SetName("image-icon-2014");
+
      icon.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
      pressedIcon.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
+     icon.SetColor( mIconColor );
      pressedIcon.SetColor( mIconPressedColor );
-     optionContainer.SetFitHeight( 0 );
-     optionPressedContainer.SetFitHeight( 0 );
+
+     if ( showCaption & showIcons )
+     {
+       optionContainer.SetFitHeight( 1 );
+       optionContainer.SetFitWidth( 1 );
+       optionPressedContainer.SetFitHeight( 1 );
+       optionPressedContainer.SetFitWidth( 1 );
+     }
+
      optionContainer.AddChild( icon, Toolkit::TableView::CellPosition( 0, 0 )  );
      optionPressedContainer.AddChild( pressedIcon, Toolkit::TableView::CellPosition( 0, 0 )  );
+
      icon.SetPadding( Padding( 10.0f, 10.0f, 10.0f, 10.0f ) );
      pressedIcon.SetPadding( Padding( 10.0f, 10.0f, 10.0f, 10.0f ) );
    }
 
-   // 5. Create a option.
+   // 4. Create a option.
    Toolkit::PushButton option = Toolkit::PushButton::New();
    option.SetName( name );
    option.SetAnimationTime( 0.0f );
-   option.SetSize( OPTION_ICON_SIZE );
+   option.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
    //option.ClickedSignal().Connect( this, &TextInputPopup::OnButtonPressed );
 
-   // 6. Set the normal option image.
+   // 5. Set the normal option image.
    option.SetButtonImage( optionContainer );
 
-   // 7. Set the pressed option image
+   // 6. Set the pressed option image
    option.SetSelectedImage( optionPressedContainer );
 
-   // 9 Add option to table view
-   parent.SetFitWidth( indexInTable );
-   parent.AddChild( option, Toolkit::TableView::CellPosition( 0, indexInTable )  );
-   indexInTable++;
+   // 7 Add option to tool bar
+   mToolbar.AddOption( option );
 
-   // 10. Add the divider
-   if( !finalOption )
+   // 8. Add the divider
+   if( showDivider )
    {
-     const Size size( POPUP_DIVIDER_WIDTH, 0.0f ); // Height FILL_TO_PARENT
+     const Size size( mOptionDividerSize.width, 0.0f ); // Height FILL_TO_PARENT
 
      ImageActor divider = Toolkit::CreateSolidColorActor( Color::WHITE );
-
      divider.SetSize( size );
      divider.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::HEIGHT );
-     parent.SetFitWidth( indexInTable );
-     parent.AddChild( divider, Toolkit::TableView::CellPosition( 0, indexInTable )  );
-     indexInTable++;
+     divider.SetColor( mLineColor );
+     mToolbar.AddDivider( divider );
    }
  }
 
- void TextSelectionPopup::SetUpPopup()
- {
-   Actor self = Self();
-   self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
-
-   // Create Layer and Stencil.
-   mStencilLayer = Layer::New();
-   mStencilLayer.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
-   mStencilLayer.SetParentOrigin( ParentOrigin::CENTER );
-
-   ImageActor stencil = CreateSolidColorActor( Color::RED );
-   stencil.SetDrawMode( DrawMode::STENCIL );
-   stencil.SetVisible( true );
-   stencil.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
-   stencil.SetParentOrigin( ParentOrigin::CENTER );
-
-   Actor scrollview = Actor::New(); //todo make a scrollview
-   scrollview.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
-   scrollview.SetParentOrigin( ParentOrigin::CENTER );
-
-   mTableOfButtons.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
-   mTableOfButtons.SetFitHeight( 0 );
-   mTableOfButtons.SetParentOrigin( ParentOrigin::CENTER );
-
-   mStencilLayer.Add( stencil );
-   mStencilLayer.Add( scrollview );
-   scrollview.Add( mTableOfButtons );
-   self.Add( mStencilLayer );
-   //self.Add ( mTableOfButtons );
- }
-
- void TextSelectionPopup::AddPopupOptions( bool createTail, bool showIcons, bool showCaptions )
+ std::size_t TextSelectionPopup::GetNumberOfEnabledOptions()
  {
-   mContentSize = Vector2::ZERO;
-
-   // Add the options into the buttons container.
-
-   // 1. Determine how many buttons are active and should be added to container.
    std::size_t numberOfOptions = 0u;
    for( std::vector<ButtonRequirement>::const_iterator it = mOrderListOfButtons.begin(), endIt = mOrderListOfButtons.end(); ( it != endIt ); ++it )
    {
@@ -557,56 +612,59 @@ Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part )
      }
    }
 
-   // 2. Iterate list of buttons and add active ones.
-   std::size_t optionsAdded = 0u;
-
-   numberOfOptions = ( numberOfOptions*2 ) - 1 ; // Last Option does not get a divider so -1 or if only one option then also no divider
-
-   mTableOfButtons = Dali::Toolkit::TableView::New( 1, numberOfOptions );
+   return numberOfOptions;
+ }
 
+ void TextSelectionPopup::AddPopupOptionsToToolbar( bool showIcons, bool showCaptions )
+ {
+   // Iterate list of buttons and add active ones to Toolbar
+   std::size_t numberOfOptionsRequired =  GetNumberOfEnabledOptions();
+   std::size_t numberOfOptionsAdded = 0u;
    for( std::vector<ButtonRequirement>::const_iterator it = mOrderListOfButtons.begin(), endIt = mOrderListOfButtons.end(); ( it != endIt ); ++it )
    {
      const ButtonRequirement& button( *it );
      if ( button.enabled )
      {
-       AddOption( mTableOfButtons, button.name, button.caption, button.icon, optionsAdded == numberOfOptions - 1, showIcons, showCaptions, optionsAdded ); // -1 to ignore the last divider
+       numberOfOptionsAdded++;
+       AddOption(  button.name, button.caption, button.icon, ( numberOfOptionsAdded < numberOfOptionsRequired ) , showIcons, showCaptions );
      }
    }
  }
 
  void TextSelectionPopup::CreatePopup()
  {
-   if ( !mStencilLayer )
+   Actor self = Self();
+   CreateOrderedListOfPopupOptions();  //todo Currently causes all options to be shown
+   self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+   SetBackgroundImage( NinePatchImage::New( DEFAULT_POPUP_BACKGROUND_IMAGE ) );
+
+   if ( !mToolbar )
    {
-     CreateOrderedListOfPopupOptions();  //todo Currently causes all options to be shown
-     CreateBackground();
-     AddPopupOptions( true, true, false );  // todo false so not to show Labels until ellipses or similar possible.
-     SetUpPopup();
+     mToolbar = Toolkit::TextSelectionToolbar::New();
+     mToolbar.SetParentOrigin( ParentOrigin::CENTER );
+     mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, mMaxSize );
+     self.Add( mToolbar );
+     AddPopupOptionsToToolbar( mShowIcons, mShowCaptions );
    }
-
-   mStencilLayer.RaiseToTop();
  }
 
 TextSelectionPopup::TextSelectionPopup()
-: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ),
-  mMaxSize ( DEFAULT_POPUP_MAX_SIZE ),
-  mVisiblePopUpSize( DEFAULT_POPUP_MAX_SIZE ),
-  mRequiredPopUpSize( DEFAULT_POPUP_MAX_SIZE ),
-  mBackgroundColor( DEFAULT_POPUP_BACKGROUND ),
-  mBackgroundPressedColor( DEFAULT_POPUP_BACKGROUND_PRESSED ),
+: Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ),
+  mToolbar(),
+  mMaxSize(),
+  mMinSize(),
+  mOptionDividerSize( Size( 2.0f, 0.0f) ),
   mLineColor( DEFAULT_POPUP_LINE_COLOR ),
   mIconColor( DEFAULT_OPTION_ICON ),
   mIconPressedColor( DEFAULT_OPTION_ICON_PRESSED ),
-  mTextColor( DEFAULT_OPTION_TEXT ),
-  mTextPressedColor( DEFAULT_OPTION_TEXT_PRESSED ),
   mSelectOptionPriority( 1 ),
   mSelectAllOptionPriority ( 2 ),
   mCutOptionPriority ( 3 ),
   mCopyOptionPriority ( 4 ),
   mPasteOptionPriority ( 5 ),
   mClipboardOptionPriority( 6 ),
-  mShowIcons( true ),
-  mShowCaptions( false )
+  mShowIcons( false ),
+  mShowCaptions( true )
 {
 }
 
@@ -620,3 +678,5 @@ TextSelectionPopup::~TextSelectionPopup()
 } // namespace Toolkit
 
 } // namespace Dali
+
+
index 892c563..34c2235 100644 (file)
@@ -22,6 +22,7 @@
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/public-api/controls/table-view/table-view.h>
 #include <dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h>
+#include <dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h>
 
 // EXTERNAL INCLUDES
 #include <dali/public-api/actors/image-actor.h>
@@ -38,15 +39,14 @@ namespace Internal
 
 namespace
 {
-enum PopupParts
+
+enum PopupCustomisations
 {
-  POPUP_BACKGROUND,
-  POPUP_CLIPBOARD_BUTTON,
-  POPUP_CUT_BUTTON_ICON,
-  POPUP_COPY_BUTTON_ICON,
-  POPUP_PASTE_BUTTON_ICON,
-  POPUP_SELECT_BUTTON_ICON,
-  POPUP_SELECT_ALL_BUTTON_ICON,
+  POPUP_MAXIMUM_SIZE,
+  POPUP_MINIMUM_SIZE,
+  OPTION_MAXIMUM_SIZE,
+  OPTION_MINIMUM_SIZE,
+  OPTION_DIVIDER_SIZE
 };
 
 } // namespace
@@ -57,19 +57,19 @@ public:
 
   enum Buttons
   {
-    ButtonsCut,
-    ButtonsCopy,
-    ButtonsPaste,
-    ButtonsSelect,
-    ButtonsSelectAll,
-    ButtonsClipboard,
-    ButtonsEnumEnd
+    CUT,
+    COPY,
+    PASTE,
+    SELECT,
+    SELECT_ALL,
+    CLIPBOARD,
+    ENUM_END
   };
 
   struct ButtonRequirement
   {
     ButtonRequirement()
-    : id( ButtonsEnumEnd ),
+    : id( ENUM_END ),
       priority( 0u ),
       name(),
       caption(),
@@ -106,11 +106,6 @@ public:
       }
   };
 
-//  static inline bool ButtonPriorityCompare( ButtonRequirement a, ButtonRequirement b )
-//  {
-//    return a.priority < b.priority ? true : false;
-//  }
-
   /**
    * @copydoc Dali::Toollkit::TextSelectionPopup::New()
    */
@@ -135,81 +130,55 @@ public:
    */
   static Property::Value GetProperty( BaseObject* object, Property::Index index );
 
-  void CreatePopup();
-
-  void DestroyPopup();
-
 private: // From Control
 
   /**
    * @copydoc Control::OnInitialize()
    */
- virtual void OnInitialize();
-
-//  /**
-//   * @copydoc Control::GetNaturalSize()
-//   */
-//  virtual Vector3 GetNaturalSize();
-//
-//  /**
-//   * @copydoc Control::GetHeightForWidth()
-//   */
-//  virtual float GetHeightForWidth( float width );
+  virtual void OnInitialize();
 
-  /**
-   * @copydoc Control::OnInitialize()
-   */
-  virtual void OnRelayout( const Vector2& size, RelayoutContainer& container );
-//
-//  /**
-//   * Received for single & double taps
-//   */
-//  virtual void OnTap( const TapGesture& tap );
-//
-//  /**
-//   * @copydoc Text::ControlInterface::RequestTextRelayout()
-//   */
-//  virtual void RequestTextRelayout();
+private: // Implementation
 
   /**
-   * Set max size of Popup
-   * @param[in] maxSize Size (Vector2)
+   * @brief Method to set the dimension or dimension constraint on certain aspects of the Popup.
+   *
+   * @param[in] settingToCustomise The setting for the PopupCustomisations enum that can be customised
+   * @param[in] dimension The size to customise with
    */
-  void SetPopupMaxSize( const Size& maxSize );
+  void SetDimensionToCustomise( const PopupCustomisations& settingToCustomise, const Size& dimension );
 
   /**
-   * Get Max size of Popup
-   * @return Vector2 the max size of the Popup
+   * @brief Method to get the dimension or dimension constraint on certain aspects of the Popup that was previously customised
+   *
+   * @param[in] setting The setting from the PopupCustomisations enum
    */
-  const Dali::Vector2& GetPopupMaxSize() const;
+  Size GetDimensionToCustomise( const PopupCustomisations& setting );
 
   /**
-   * @brief Sets the image for the given part of the Popup.
+   * @brief Sets the image for the given button of the Popup.
    *
-   * @param[in] part  The part of the pop from the Enum PopupParts
+   * @param[in] button  The button the image should be used for from the Buttons Enum.
    * @param[in] image The image to use.
    */
- void SetPopupImage( PopupParts part, Dali::Image image );
+ void SetButtonImage( Buttons button, Dali::Image image );
 
   /**
-   * @brief Retrieves the image of the given part used by the popup
+   * @brief Retrieves the image of the given button used by the popup
    *
-   * @param[in] part The part of the popup
-   * @return The image used for that part.
+   * @param[in] button The button to get the image from
+   * @return The image used for that button.
    */
-  Dali::Image GetPopupImage( PopupParts part );
+  Dali::Image GetButtonImage( Buttons button );
 
   void CreateOrderedListOfPopupOptions();
 
-  void CreateBackground();
-
-  void AddOption( Dali::Toolkit::TableView& parent, const std::string& name, const std::string& caption, const Image iconImage, bool finalOption, bool showIcons, bool showCaption, std::size_t& indexInTable  );
+  void AddOption( const std::string& name, const std::string& caption, const Image iconImage, bool showDivider, bool showIcons, bool showCaption );
 
-  void SetUpPopup();
+  std::size_t GetNumberOfEnabledOptions();
 
-  void AddPopupOptions( bool createTail, bool showIcons, bool showCaptions );
+  void AddPopupOptionsToToolbar(  bool showIcons, bool showCaptions );
 
-private: // Implementation
+  void CreatePopup();
 
   /**
    * Construct a new TextField.
@@ -229,11 +198,12 @@ private:
 
 private: // Data
 
-  Dali::Toolkit::TableView mTableOfButtons;                          // Actor which holds all the buttons, sensitivity can be set on buttons via this actor
-  Layer mStencilLayer;                                // Layer to enable clipping when buttons exceed popup
 
-  // Images to be used by the Popup
-  Image mBackgroundImage;
+  Dali::Toolkit::TextSelectionToolbar mToolbar;
+
+  Dali::Toolkit::TableView mTableOfButtons;           // Actor which holds all the buttons, sensitivity can be set on buttons via this actor
+
+  // Images to be used by the Popup buttons
   Image mCutIconImage;
   Image mCopyIconImage;
   Image mPasteIconImage;
@@ -241,29 +211,18 @@ private: // Data
   Image mSelectIconImage;
   Image mSelectAllIconImage;
 
-  ImageActor mBackground;                             // The background popup panel
-  ImageActor mTail;                                   // The tail for the popup
-  ImageActor mTailEffect;   //todo remove                          // the tail effect
-  ImageActor mTailLine;     //todo remove                          // The border/outline around the tail
-
-  Size mMaxSize;                                      // Max size of the Popup
-  Size mVisiblePopUpSize;                             // Visible Size of popup excluding content that needs scrolling.
-  Size mRequiredPopUpSize;                            // Total size of popup including any invisible margin
+  Size mMaxSize;                       // Maximum size of the Popup
+  Size mMinSize;                       // Minimum size of the Popup
 
-  Vector4 mNinePatchMargins;                          // Margins between the edge of the cropped image and the nine patch rect (left, right, top, bottom).
-
-  Size mContentSize;                                  // Size of Content (i.e. Buttons)
-  //Animation mAnimation;                               // Popup Hide/Show animation.
+  Size mOptionMaxSize;                 // Maximum size of an Option button
+  Size mOptionMinSize;                 // Minimum size of an Option button
+  Size mOptionDividerSize;             // Size of divider line
 
   std::vector<ButtonRequirement> mOrderListOfButtons; // List of buttons in the order to be displayed and a flag to indicate if needed.
 
-  Vector4 mBackgroundColor;             // Color of the background of the text input popup
-  Vector4 mBackgroundPressedColor;      // Color of the option background.
   Vector4 mLineColor;                   // Color of the line around the text input popup
   Vector4 mIconColor;                   // Color of the popup icon.
   Vector4 mIconPressedColor;            // Color of the popup icon when pressed.
-  Vector4 mTextColor;                   // Color of the popup text.
-  Vector4 mTextPressedColor;            // Color of the popup text when pressed.
 
   // Priority of Options/Buttons in the Cut and Paste pop-up, higher priority buttons are displayed first, left to right.
   std::size_t mSelectOptionPriority;    // Position of Select Button
@@ -305,3 +264,4 @@ inline const Toolkit::Internal::TextSelectionPopup& GetImpl( const Toolkit::Text
 } // namespace Dali
 
 #endif // __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_POPUP_H__
+
diff --git a/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp
new file mode 100644 (file)
index 0000000..4b25f77
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/images/resource-image.h>
+#include <dali/public-api/math/vector2.h>
+#include <dali/public-api/math/vector4.h>
+#include <dali/devel-api/object/type-registry-helper.h>
+#include <iostream>
+#include <libintl.h>
+#include <cfloat>
+
+namespace Dali
+{
+
+namespace Toolkit
+{
+
+namespace Internal
+{
+
+namespace
+{
+const Dali::Vector2 DEFAULT_MAX_SIZE( 400.0f, 65.0f ); ///< The maximum size of the Toolbar.
+
+} // namespace
+
+BaseHandle Create()
+{
+  return Toolkit::TextSelectionToolbar::New();
+}
+
+// Setup properties, signals and actions using the type-registry.
+
+DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionToolbar, Toolkit::Control, Create );
+
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "max-size", VECTOR2, MAX_SIZE )
+
+DALI_TYPE_REGISTRATION_END()
+
+Dali::Toolkit::TextSelectionToolbar TextSelectionToolbar::New()
+{
+  // Create the implementation, temporarily owned by this handle on stack
+  IntrusivePtr< TextSelectionToolbar > impl = new TextSelectionToolbar();
+
+  // Pass ownership to CustomActor handle
+  Dali::Toolkit::TextSelectionToolbar handle( *impl );
+
+  // Second-phase init of the implementation
+  // This can only be done after the CustomActor connection has been made...
+  impl->Initialize();
+
+  return handle;
+}
+
+void TextSelectionToolbar::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
+{
+  Toolkit::TextSelectionToolbar selectionPopup = Toolkit::TextSelectionToolbar::DownCast( Dali::BaseHandle( object ) );
+
+  if( selectionPopup )
+  {
+    TextSelectionToolbar& impl( GetImpl( selectionPopup ) );
+
+    switch( index )
+    {
+      case Toolkit::TextSelectionToolbar::Property::MAX_SIZE:
+      {
+       impl.SetPopupMaxSize( value.Get< Vector2 >() );
+       break;
+      }
+
+    } // switch
+  } // TextSelectionToolbar
+}
+
+Property::Value TextSelectionToolbar::GetProperty( BaseObject* object, Property::Index index )
+{
+  Property::Value value;
+
+  Toolkit::TextSelectionToolbar selectionPopup = Toolkit::TextSelectionToolbar::DownCast( Dali::BaseHandle( object ) );
+
+  if( selectionPopup )
+  {
+    TextSelectionToolbar& impl( GetImpl( selectionPopup ) );
+
+    switch( index )
+    {
+      case Toolkit::TextSelectionToolbar::Property::MAX_SIZE:
+      {
+        value = impl.GetPopupMaxSize();
+        break;
+      }
+    } // switch
+  }
+  return value;
+}
+
+void TextSelectionToolbar::OnInitialize()
+{
+  SetUp();
+}
+
+void TextSelectionToolbar::SetPopupMaxSize( const Size& maxSize )
+{
+  mMaxSize = maxSize;
+}
+
+const Dali::Vector2& TextSelectionToolbar::GetPopupMaxSize() const
+{
+  return mMaxSize;
+}
+
+void TextSelectionToolbar::SetUp()
+{
+  Actor self = Self();
+  self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+
+  // Create Layer and Stencil.
+  mStencilLayer = Layer::New();
+  mStencilLayer.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+  mStencilLayer.SetParentOrigin( ParentOrigin::CENTER );
+  mStencilLayer.SetMaximumSize( mMaxSize );
+
+  ImageActor stencil = CreateSolidColorActor( Color::RED );
+  stencil.SetDrawMode( DrawMode::STENCIL );
+  stencil.SetVisible( true );
+  stencil.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
+  stencil.SetParentOrigin( ParentOrigin::CENTER );
+
+  Actor scrollview = Actor::New(); //todo make a scrollview
+  scrollview.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+  scrollview.SetParentOrigin( ParentOrigin::CENTER );
+
+  // Toolbar needs at least one option, adding further options with increase it's size
+  mTableOfButtons = Dali::Toolkit::TableView::New( 1, 1 );
+  mTableOfButtons.SetFitHeight( 0 );
+  mTableOfButtons.SetParentOrigin( ParentOrigin::CENTER );
+
+  mStencilLayer.Add( stencil );
+  mStencilLayer.Add( scrollview );
+  scrollview.Add( mTableOfButtons );
+  self.Add( mStencilLayer );
+
+  mStencilLayer.RaiseToTop();
+}
+
+void TextSelectionToolbar::AddOption( Actor& option )
+{
+  mTableOfButtons.AddChild( option, Toolkit::TableView::CellPosition( 0, mIndexInTable )  );
+  mTableOfButtons.SetFitWidth( mIndexInTable );
+  mIndexInTable++;
+}
+
+void TextSelectionToolbar::AddDivider( Actor& divider )
+{
+  AddOption( divider );
+  mDividerIndexes.PushBack( mIndexInTable );
+}
+
+void TextSelectionToolbar::ResizeDividers( Size& size )
+{
+  for( unsigned int i = 0; i < mDividerIndexes.Count(); ++i )
+  {
+    Actor divider = mTableOfButtons.GetChildAt( Toolkit::TableView::CellPosition( 0, mDividerIndexes[ i ] ) );
+    divider.SetSize( size );
+  }
+  RelayoutRequest();
+}
+
+TextSelectionToolbar::TextSelectionToolbar()
+: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ),
+  mMaxSize ( DEFAULT_MAX_SIZE ),
+  mIndexInTable( 0 ),
+  mDividerIndexes()
+{
+}
+
+TextSelectionToolbar::~TextSelectionToolbar()
+{
+}
+
+
+} // namespace Internal
+
+} // namespace Toolkit
+
+} // namespace Dali
diff --git a/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h
new file mode 100644 (file)
index 0000000..fb85e95
--- /dev/null
@@ -0,0 +1,165 @@
+#ifndef __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__
+#define __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__
+
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/controls/table-view/table-view.h>
+#include <dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h>
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/actors/layer.h>
+
+namespace Dali
+{
+
+namespace Toolkit
+{
+
+namespace Internal
+{
+
+namespace
+{
+
+} // namespace
+
+class TextSelectionToolbar : public Control
+{
+public:
+
+  /**
+   * @copydoc Dali::Toollkit::TextSelectionToolbar::New()
+   */
+  static Toolkit::TextSelectionToolbar New();
+
+  // Properties
+
+  /**
+   * @brief Called when a property of an object of this type is set.
+   * @param[in] object The object whose property is set.
+   * @param[in] index The property index.
+   * @param[in] value The new property value.
+   */
+  static void SetProperty( BaseObject* object, Property::Index index, const Property::Value& value );
+
+  /**
+   * @brief Called to retrieve a property of an object of this type.
+   *
+   * @param[in] object The object whose property is to be retrieved.
+   * @param[in] index The property index.
+   * @return The current value of the property.
+   */
+  static Property::Value GetProperty( BaseObject* object, Property::Index index );
+
+  /**
+   *  @copydoc TextSelectionToolbar::AddOption
+   */
+  void AddOption( Actor& option );
+
+  /**
+   *  @copydoc TextSelectionToolbar::AddDivider
+   */
+  void AddDivider( Actor& divider );
+
+  /**
+   * @copydoc ResizeDividers
+   */
+  void ResizeDividers( Size& size );
+
+private: // From Control
+
+  /**
+   * @copydoc Control::OnInitialize()
+   */
+ virtual void OnInitialize();
+
+  /**
+   * @brief Set max size of Popup
+   * @param[in] maxSize Size (Vector2)
+   */
+  void SetPopupMaxSize( const Size& maxSize );
+
+  /**
+   * @brief Get Max size of Popup
+   * @return Vector2 the max size of the Popup
+   */
+  const Dali::Vector2& GetPopupMaxSize() const;
+
+  /**
+   * @brief Set up the parts that make the Toolbar
+   */
+  void SetUp();
+
+private: // Implementation
+
+  /**
+   * Construct a new TextField.
+   */
+  TextSelectionToolbar();
+
+  /**
+   * A reference counted object may only be deleted by calling Unreference()
+   */
+  virtual ~TextSelectionToolbar();
+
+private:
+
+  // Undefined copy constructor and assignment operators
+  TextSelectionToolbar(const TextSelectionToolbar&);
+  TextSelectionToolbar& operator=(const TextSelectionToolbar& rhs);
+
+private: // Data
+
+  Dali::Toolkit::TableView mTableOfButtons;           // Actor which holds all the buttons, sensitivity can be set on buttons via this actor
+  Layer mStencilLayer;                                // Layer to enable clipping when buttons exceed popup
+
+  Size mMaxSize;                                      // Max size of the Toolbar
+  unsigned int mIndexInTable;                         // Index in table to add option
+  Dali::Vector< unsigned int > mDividerIndexes;       // Vector of indexes in the Toolbar that contain dividers.
+
+};
+
+} // namespace Internal
+
+// Helpers for public-api forwarding methods
+
+inline Toolkit::Internal::TextSelectionToolbar& GetImpl( Toolkit::TextSelectionToolbar& textSelectionToolbar )
+{
+  DALI_ASSERT_ALWAYS( textSelectionToolbar );
+
+  Dali::RefObject& handle = textSelectionToolbar.GetImplementation();
+
+  return static_cast<Toolkit::Internal::TextSelectionToolbar&>(handle);
+}
+
+inline const Toolkit::Internal::TextSelectionToolbar& GetImpl( const Toolkit::TextSelectionToolbar& textSelectionToolbar )
+{
+  DALI_ASSERT_ALWAYS( textSelectionToolbar );
+
+  const Dali::RefObject& handle = textSelectionToolbar.GetImplementation();
+
+  return static_cast<const Toolkit::Internal::TextSelectionToolbar&>(handle);
+}
+
+} // namespace Toolkit
+
+} // namespace Dali
+
+#endif // __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__
index c1536f0..f5a9b35 100644 (file)
@@ -46,6 +46,7 @@ toolkit_src_files = \
    $(toolkit_src_dir)/controls/text-controls/text-field-impl.cpp \
    $(toolkit_src_dir)/controls/text-controls/text-label-impl.cpp \
    $(toolkit_src_dir)/controls/text-controls/text-selection-popup-impl.cpp \
+   $(toolkit_src_dir)/controls/text-controls/text-selection-toolbar-impl.cpp \
    $(toolkit_src_dir)/controls/tool-bar/tool-bar-impl.cpp \
    $(toolkit_src_dir)/focus-manager/accessibility-focus-manager-impl.cpp \
    $(toolkit_src_dir)/focus-manager/keyboard-focus-manager-impl.cpp \
index 18d7930..2c59665 100644 (file)
@@ -128,7 +128,7 @@ EventData::EventData( DecoratorPtr decorator )
   mDecoratorUpdated( false ),
   mCursorBlinkEnabled( true ),
   mGrabHandleEnabled( true ),
-  mGrabHandlePopupEnabled( false ),
+  mGrabHandlePopupEnabled( true ),
   mSelectionEnabled( false ),
   mHorizontalScrollingEnabled( true ),
   mVerticalScrollingEnabled( false ),
@@ -532,7 +532,7 @@ void Controller::Impl::OnHandleEvent( const Event& event )
 
     if( Event::GRAB_HANDLE_EVENT == event.type )
     {
-      ChangeState ( EventData::EDITING );
+      ChangeState ( EventData::GRAB_HANDLE_PANNING );
 
       if( handleNewPosition != mEventData->mPrimaryCursorPosition )
       {
@@ -542,6 +542,8 @@ void Controller::Impl::OnHandleEvent( const Event& event )
     }
     else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type )
     {
+      ChangeState ( EventData::SELECTION_HANDLE_PANNING );
+
       if( handleNewPosition != mEventData->mLeftSelectionPosition )
       {
         mEventData->mLeftSelectionPosition = handleNewPosition;
@@ -550,6 +552,8 @@ void Controller::Impl::OnHandleEvent( const Event& event )
     }
     else if( Event::RIGHT_SELECTION_HANDLE_EVENT == event.type )
     {
+      ChangeState ( EventData::SELECTION_HANDLE_PANNING );
+
       if( handleNewPosition != mEventData->mRightSelectionPosition )
       {
         mEventData->mRightSelectionPosition = handleNewPosition;
@@ -560,14 +564,12 @@ void Controller::Impl::OnHandleEvent( const Event& event )
   else if( ( HANDLE_RELEASED == state ) ||
            ( HANDLE_STOP_SCROLLING == state ) )
   {
-    if( mEventData->mGrabHandlePopupEnabled )
-    {
-      ChangeState( EventData::EDITING_WITH_POPUP );
-    }
     if( Event::GRAB_HANDLE_EVENT == event.type )
     {
       mEventData->mUpdateCursorPosition = true;
 
+      ChangeState( EventData::EDITING_WITH_POPUP );
+
       if( HANDLE_STOP_SCROLLING == state )
       {
         // The event.p2 and event.p3 are in decorator coords. Need to transforms to text coords.
@@ -579,6 +581,10 @@ void Controller::Impl::OnHandleEvent( const Event& event )
         mEventData->mScrollAfterUpdateCursorPosition = true;
       }
     }
+    else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type || Event::RIGHT_SELECTION_HANDLE_EVENT )
+    {
+      ChangeState( EventData::SELECTING );
+    }
     mEventData->mDecoratorUpdated = true;
   }
   else if( HANDLE_SCROLLING == state )
@@ -590,7 +596,16 @@ void Controller::Impl::OnHandleEvent( const Event& event )
 
     ClampHorizontalScroll( actualSize );
 
-   mEventData->mDecoratorUpdated = true;
+    if( Event::GRAB_HANDLE_EVENT == event.type )
+    {
+      ChangeState( EventData::GRAB_HANDLE_PANNING );
+    }
+    else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type || Event::RIGHT_SELECTION_HANDLE_EVENT )
+    {
+      ChangeState( EventData::SELECTION_HANDLE_PANNING );
+    }
+
+    mEventData->mDecoratorUpdated = true;
   }
 }
 
@@ -659,6 +674,10 @@ void Controller::Impl::ChangeState( EventData::State newState )
       mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false );
       mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true );
       mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true );
+      if( mEventData->mGrabHandlePopupEnabled )
+      {
+        mEventData->mDecorator->SetPopupActive( true );
+      }
       mEventData->mDecoratorUpdated = true;
     }
     else if( EventData::EDITING == mEventData->mState )
@@ -672,6 +691,10 @@ void Controller::Impl::ChangeState( EventData::State newState )
       mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false );
       mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false );
       mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false );
+      if( mEventData->mGrabHandlePopupEnabled )
+      {
+        mEventData->mDecorator->SetPopupActive( false );
+      }
       mEventData->mDecoratorUpdated = true;
     }
     else if( EventData::EDITING_WITH_POPUP == mEventData->mState )
@@ -681,11 +704,14 @@ void Controller::Impl::ChangeState( EventData::State newState )
       {
         mEventData->mDecorator->StartCursorBlink();
       }
-      mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false );
       if( mEventData->mSelectionEnabled )
       {
-        mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true );
-        mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true );
+        mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false );
+        mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false );
+      }
+      else
+      {
+        mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true );
       }
       if( mEventData->mGrabHandlePopupEnabled )
       {
@@ -693,6 +719,35 @@ void Controller::Impl::ChangeState( EventData::State newState )
       }
       mEventData->mDecoratorUpdated = true;
     }
+    else if ( EventData::SELECTION_HANDLE_PANNING == mEventData->mState )
+    {
+      mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_NONE );
+      mEventData->mDecorator->StopCursorBlink();
+      mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false );
+      mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true );
+      mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true );
+      if( mEventData->mGrabHandlePopupEnabled )
+      {
+        mEventData->mDecorator->SetPopupActive( false );
+      }
+      mEventData->mDecoratorUpdated = true;
+    }
+    else if ( EventData::GRAB_HANDLE_PANNING == mEventData->mState )
+    {
+      mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
+      if( mEventData->mCursorBlinkEnabled )
+      {
+        mEventData->mDecorator->StartCursorBlink();
+      }
+      mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true );
+      mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false );
+      mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false );
+      if( mEventData->mGrabHandlePopupEnabled )
+      {
+        mEventData->mDecorator->SetPopupActive( false );
+      }
+      mEventData->mDecoratorUpdated = true;
+    }
   }
 }
 
index fa502a7..1a797b3 100644 (file)
@@ -100,7 +100,9 @@ struct EventData
     INACTIVE,
     SELECTING,
     EDITING,
-    EDITING_WITH_POPUP
+    EDITING_WITH_POPUP,
+    GRAB_HANDLE_PANNING,
+    SELECTION_HANDLE_PANNING
   };
 
   EventData( DecoratorPtr decorator );
index f850715..fcfae07 100644 (file)
@@ -37,6 +37,12 @@ distributing this software or its derivatives.
       "font-style":"Regular",
       "point-size":18
     },
+    "textselectionpopup":
+    {
+      "popup-max-size":[400,100],
+      "popup-min-size":[100,65],
+      "background-color":[0.0,0.0,0.0,1.0]
+    },
     "textfield":
     {
       "font-family":"HelveticaNeue",
index 8deaa50..7c4099e 100644 (file)
@@ -84,7 +84,12 @@ distributing this software or its derivatives.
     {
       "point-size":10
     },
-
+    "textselectionpopup":
+    {
+      "popup-max-size":[400,100],
+      "popup-min-size":[100,65],
+      "background-color":[0.0,0.0,0.0,1.0]
+    },
     "scrollview":
     {
       "overshoot-effect-color":"B018"