[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / text-controls / text-selection-toolbar-impl.h
index fb85e95..36c7e56 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__
-#define __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__
+#ifndef DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H
+#define DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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.
  */
 
 // 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/scroll-bar/scroll-bar.h>
+#include <dali-toolkit/devel-api/controls/table-view/table-view.h>
 #include <dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h>
+#include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.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()
    */
@@ -57,7 +50,7 @@ public:
    * @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 );
+  static void SetProperty(BaseObject* object, Property::Index index, const Property::Value& value);
 
   /**
    * @brief Called to retrieve a property of an object of this type.
@@ -66,35 +59,61 @@ public:
    * @param[in] index The property index.
    * @return The current value of the property.
    */
-  static Property::Value GetProperty( BaseObject* object, Property::Index index );
+  static Property::Value GetProperty(BaseObject* object, Property::Index index);
 
   /**
-   *  @copydoc TextSelectionToolbar::AddOption
+   *  @copydoc Toolkit::TextSelectionToolbar::AddOption()
    */
-  void AddOption( Actor& option );
+  void AddOption(Actor& option);
 
   /**
-   *  @copydoc TextSelectionToolbar::AddDivider
+   *  @copydoc Toolkit::TextSelectionToolbar::AddDivider()
    */
-  void AddDivider( Actor& divider );
+  void AddDivider(Actor& divider);
 
   /**
-   * @copydoc ResizeDividers
+   * @copydoc Toolkit::TextSelectionToolbar::ResizeDividers()
    */
-  void ResizeDividers( Size& size );
+  void ResizeDividers(Size& size);
 
-private: // From Control
+  /**
+   * @copydoc Toolkit::TextSelectionToolbar::RaiseAbove()
+   */
+  void RaiseAbove(Actor target);
 
   /**
+   * Sets the scroll bar padding.
+   *
+   * @param[in] padding The padding value.
+   */
+  void SetScrollBarPadding(const Vector2& padding);
+
+  /**
+   * @return The padding value.
+   */
+  const Vector2& GetScrollBarPadding() const;
+
+  /**
+   * @copydoc Toolkit::TextSelectionToolbar::ScrollTo()
+   */
+  void ScrollTo(const Vector2& position);
+
+private: // From Control
+  /**
    * @copydoc Control::OnInitialize()
    */
- virtual void OnInitialize();
+  void OnInitialize() override;
+
+  /**
+  * @copydoc Control::OnRelayout()
+  */
+  void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
 
   /**
    * @brief Set max size of Popup
    * @param[in] maxSize Size (Vector2)
    */
-  void SetPopupMaxSize( const Size& maxSize );
+  void SetPopupMaxSize(const Size& maxSize);
 
   /**
    * @brief Get Max size of Popup
@@ -102,12 +121,40 @@ private: // From Control
    */
   const Dali::Vector2& GetPopupMaxSize() const;
 
+private: // Implementation
+  /**
+   * @copydoc Toolkit::TextSelectionToolbar::ConfigureScrollview()
+   */
+  void ConfigureScrollview(const Property::Map& properties);
+
+  /**
+   * @brief Set up scrollview to scroll Toolbar horizontally
+   */
+  void SetUpScrollView();
+
   /**
    * @brief Set up the parts that make the Toolbar
    */
   void SetUp();
 
-private: // Implementation
+  /**
+   * @brief Enable or disable the scroll-bar
+   *
+   * @param[in] enable True if the scroll-bar is required
+   */
+  void SetUpScrollBar(bool enable);
+
+  /**
+   * Toolbar has started to scroll
+   * @param[in] position current scroll view position
+   */
+  void OnScrollStarted(const Vector2& position);
+
+  /**
+   * Toolbar has stopped scrolling
+   * @param[in] position current scroll view position
+   */
+  void OnScrollCompleted(const Vector2& position);
 
   /**
    * Construct a new TextField.
@@ -120,38 +167,39 @@ private: // Implementation
   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.
-
+private:                                        // Data
+  Actor                      mToolbarActor;     ///< The actor used to house the toolbar.
+  Toolkit::TableView         mTableOfButtons;   ///< Actor which holds all the buttons, sensitivity can be set on buttons via this actor
+  Toolkit::ScrollView        mScrollView;       ///< Provides scrolling of Toolbar when content does not fit.
+  Toolkit::ScrollBar         mScrollBar;        ///< An horizontal scroll bar for the text's popup options.
+  RulerPtr                   mRulerX;           ///< Ruler to clamp horizontal scrolling. Updates on Relayout
+  Size                       mMaxSize;          ///< Max size of the Toolbar
+  Vector2                    mScrollBarPadding; ///< The padding used to position the scroll indicator.
+  unsigned int               mIndexInTable;     ///< Index in table to add option
+  Dali::Vector<unsigned int> mDividerIndexes;   ///< Vector of indexes in the Toolbar that contain dividers.
+  bool                       mFirstScrollEnd;   ///< Used for RTL mirroring. Avoids the overshoot to be shown the first time the popup is shown.
 };
 
 } // namespace Internal
 
 // Helpers for public-api forwarding methods
 
-inline Toolkit::Internal::TextSelectionToolbar& GetImpl( Toolkit::TextSelectionToolbar& textSelectionToolbar )
+inline Toolkit::Internal::TextSelectionToolbar& GetImpl(Toolkit::TextSelectionToolbar& textSelectionToolbar)
 {
-  DALI_ASSERT_ALWAYS( 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 )
+inline const Toolkit::Internal::TextSelectionToolbar& GetImpl(const Toolkit::TextSelectionToolbar& textSelectionToolbar)
 {
-  DALI_ASSERT_ALWAYS( textSelectionToolbar );
+  DALI_ASSERT_ALWAYS(textSelectionToolbar);
 
   const Dali::RefObject& handle = textSelectionToolbar.GetImplementation();
 
@@ -162,4 +210,4 @@ inline const Toolkit::Internal::TextSelectionToolbar& GetImpl( const Toolkit::Te
 
 } // namespace Dali
 
-#endif // __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__
+#endif // DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H