Merge "Empty Implementation for INPUT_METHOD_SETTINGS property" into tizen
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / control.h
1 #ifndef __DALI_TOOLKIT_CONTROL_H__
2 #define __DALI_TOOLKIT_CONTROL_H__
3
4 /*
5  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/actors/custom-actor.h>
23 #include <dali/public-api/common/dali-common.h>
24 #include <dali/public-api/events/long-press-gesture-detector.h>
25 #include <dali/public-api/events/pan-gesture-detector.h>
26 #include <dali/public-api/events/pinch-gesture-detector.h>
27 #include <dali/public-api/events/tap-gesture-detector.h>
28 #include <dali/public-api/events/tap-gesture-detector.h>
29 #include <dali/public-api/images/image.h>
30
31 namespace Dali
32 {
33
34 namespace Toolkit
35 {
36
37 //Forward declarations.
38
39 namespace Internal
40 {
41 class Control;
42 }
43
44 /**
45  * @brief Control is the base class for all controls.
46  *
47  * The implementation of the control must be supplied; see Internal::Control for more details.
48  * @see Internal::Control
49  *
50  * Signals
51  * | %Signal Name           | Method                                              |
52  * |------------------------|-----------------------------------------------------|
53  * | key-event              | @ref KeyEventSignal()                               |
54  * | key-input-focus-gained | @ref KeyInputFocusGainedSignal()                    |
55  * | key-input-focus-lost   | @ref KeyInputFocusLostSignal()                      |
56  * | tapped                 | @ref GetTapGestureDetector().DetectedSignal()       |
57  * | panned                 | @ref GetPanGestureDetector().DetectedSignal()       |
58  * | pinched                | @ref GetPinchGestureDetector().DetectedSignal()     |
59  * | long-pressed           | @ref GetLongPressGestureDetector().DetectedSignal() |
60  *
61  * Actions
62  * | %Action Name      | %Control method called                              |
63  * |-------------------|-----------------------------------------------------|
64  * | control-activated | %OnActivated()                                      |
65  */
66 class DALI_IMPORT_API Control : public CustomActor
67 {
68 public:
69
70   /**
71    * @brief The start and end property ranges for control.
72    */
73   enum PropertyRange
74   {
75     PROPERTY_START_INDEX = PROPERTY_REGISTRATION_START_INDEX,        ///< Start index is used by the property registration macro.
76     CONTROL_PROPERTY_START_INDEX = PROPERTY_START_INDEX,             ///< Start index of Control properties.
77     CONTROL_PROPERTY_END_INDEX = CONTROL_PROPERTY_START_INDEX + 1000 ///< Reserving 1000 property indices.
78   };
79
80   /**
81    * @brief An enumeration of properties belonging to the Control class.
82    */
83   struct Property
84   {
85     enum
86     {
87       STYLE_NAME = PROPERTY_START_INDEX,       ///< name "style-name",       @see SetStyleName,       type std::string
88       BACKGROUND_COLOR,                        ///< name "background-color", @see SetBackgroundColor, type Vector4
89       BACKGROUND_IMAGE,                        ///< name "background-image", @see SetBackgroundImage, type Map
90       KEY_INPUT_FOCUS,                         ///< name "key-input-focus",  @see SetKeyInputFocus,   type bool
91     };
92   };
93
94   /**
95    * @brief Describes the direction to move the keyboard focus towards.
96    */
97   enum KeyboardFocusNavigationDirection
98   {
99     Left,   ///< Move keyboard focus towards the left direction
100     Right,  ///< Move keyboard focus towards the right direction
101     Up,     ///< Move keyboard focus towards the up direction
102     Down    ///< Move keyboard focus towards the down direction
103   };
104
105   // Typedefs
106
107   /// @brief Key Event signal type;
108   typedef Signal<bool ( Control, const KeyEvent& ) > KeyEventSignalType;
109
110   /// @brief Key InputFocusType signal type;
111   typedef Signal<void ( Control ) > KeyInputFocusSignalType;
112
113 public: // Creation & Destruction
114
115   /**
116    * @brief Create a new instance of a Control.
117    *
118    * @return A handle to a new Control.
119    */
120   static Control New();
121
122   /**
123    * @brief Create an uninitialized Control handle.
124    *
125    * Only derived versions can be instantiated.  Calling member
126    * functions with an uninitialized Dali::Object is not allowed.
127    */
128   Control();
129
130   /**
131    * @brief Copy constructor.
132    *
133    * Creates another handle that points to the same real object
134    * @param[in] uiControl Handle to copy
135    */
136   Control(const Control& uiControl);
137
138   /**
139    * @brief Dali::Control is intended as a base class
140    *
141    * This is non-virtual since derived Handle types must not contain data or virtual methods.
142    */
143   ~Control();
144
145 public: // operators
146
147   /**
148    * @brief Assignment operator.
149    *
150    * Changes this handle to point to another real object
151    * @param[in] handle Object to assign this to
152    * @return reference to this
153    */
154   Control& operator=( const Control& handle );
155
156 public:
157
158   /**
159    * @brief Downcast an Object handle to Control.
160    *
161    * If handle points to a Control the downcast produces valid
162    * handle. If not the returned handle is left uninitialized.
163    *
164    * @param[in] handle Handle to an object
165    * @return handle to a Control or an uninitialized handle
166    */
167   static Control DownCast( BaseHandle handle );
168
169   // Key Input
170
171   /**
172    * @brief This sets the control to receive key events.
173    *
174    * The key event can originate from a virtual or physical keyboard.
175    * @pre The Control has been initialized.
176    * @pre The Control should be on the stage before setting keyboard focus.
177    * @return True if the control has foucs, False otherwise.
178    */
179   void SetKeyInputFocus();
180
181   /**
182    * @brief Quries whether the control has key input focus.
183    *
184    * Note: The control can be set to have the focus and still not receive all the key events if another control has over ridden it.
185    * As the key input focus mechanism works like a stack, the top most control receives all the key events, and passes on the
186    * unhandled events to the controls below in the stack. A control in the stack will regain key input focus when there are no more
187    * controls above it in the focus stack.
188    * To query for the conrol which is on top of the focus stack use Dali::Toolkit::KeyInputFocusManager::GetCurrentKeyboardFocusActor()
189    * @pre The Control has been initialized.
190    * @pre The Control should be on the stage before setting keyboard focus.
191    * @return true if this control has keyboard input focus
192    */
193   bool HasKeyInputFocus();
194
195   /**
196    * @brief Once an actor is Set to receive key input focus this function is called to stop it receiving key events.
197    *
198    * A check is performed to ensure it was previously set, if this check fails then nothing is done.
199    * @pre The Actor has been initialized.
200    */
201   void ClearKeyInputFocus();
202
203   // Gesture Detection
204
205   /**
206    * @brief Retrieves the pinch gesture detector of the control.
207    *
208    * @return The pinch gesture detector.
209    * @note Will return an empty handle if the control does not handle the gesture itself.
210    */
211   PinchGestureDetector GetPinchGestureDetector() const;
212
213   /**
214    * @brief Retrieves the pan gesture detector of the control.
215    *
216    * @return The pan gesture detector.
217    * @note Will return an empty handle if the control does not handle the gesture itself.
218    */
219   PanGestureDetector GetPanGestureDetector() const;
220
221   /**
222    * @brief Retrieves the tap gesture detector of the control.
223    *
224    * @return The tap gesture detector.
225    * @note Will return an empty handle if the control does not handle the gesture itself.
226    */
227   TapGestureDetector GetTapGestureDetector() const;
228
229   /**
230    * @brief Retrieves the long press gesture detector of the control.
231    *
232    * @return The long press gesture detector.
233    * @note Will return an empty handle if the control does not handle the gesture itself.
234    */
235   LongPressGestureDetector GetLongPressGestureDetector() const;
236
237   // Styling
238
239   /**
240    * @brief Sets the name of the style to be applied to the control.
241    *
242    * @param[in] styleName A string matching a style described in a stylesheet.
243    */
244   void SetStyleName( const std::string& styleName );
245
246   /**
247    * @brief Retrieves the name of the style to be applied to the control (if any).
248    *
249    * @return A string matching a style or an empty string.
250    */
251   const std::string& GetStyleName() const;
252
253   // Background
254
255   /**
256    * @brief Sets the background color of the control.
257    *
258    * @param[in] color The required background color of the control
259    *
260    * @note The background color fully blends with the actor color.
261    */
262   void SetBackgroundColor( const Vector4& color );
263
264   /**
265    * @brief Retrieves the background color of the control.
266    *
267    * @return The background color of the control.
268    */
269   Vector4 GetBackgroundColor() const;
270
271   /**
272    * @brief Sets an image as the background of the control.
273    *
274    * The color of this image is blended with the background color @see SetBackgroundColor
275    *
276    * @param[in] image The image to set as the background.
277    */
278   void SetBackgroundImage( Image image );
279
280   /**
281    * @brief Clears the background.
282    */
283   void ClearBackground();
284
285   // Signals
286
287   /**
288    * @brief This signal is emitted when key event is received.
289    *
290    * A callback of the following type may be connected:
291    * @code
292    *   bool YourCallbackName(Control control, const KeyEvent& event);
293    * @endcode
294    * The return value of True, indicates that the event should be consumed.
295    * Otherwise the signal will be emitted on the next parent of the actor.
296    * @pre The Control has been initialized.
297    * @return The signal to connect to.
298    */
299   KeyEventSignalType& KeyEventSignal();
300
301   /**
302    * @brief This signal is emitted when the control gets Key Input Focus
303    *
304    * A callback of the following type may be connected:
305    * @code
306    *   bool YourCallbackName( Control control );
307    * @endcode
308    * The return value of True, indicates that the event should be consumed.
309    * Otherwise the signal will be emitted on the next parent of the actor.
310    * @pre The Control has been initialized.
311    * @return The signal to connect to.
312    */
313   KeyInputFocusSignalType& KeyInputFocusGainedSignal();
314
315   /**
316    * @brief This signal is emitted when the control loses Key Input Focus
317    * which could be due to it being gained by another Control or Actor or just cleared from
318    * this control as no longer required.
319    *
320    * A callback of the following type may be connected:
321    * @code
322    *   bool YourCallbackName( Control control );
323    * @endcode
324    * The return value of True, indicates that the event should be consumed.
325    * Otherwise the signal will be emitted on the next parent of the actor.
326    * @pre The Control has been initialized.
327    * @return The signal to connect to.
328    */
329   KeyInputFocusSignalType& KeyInputFocusLostSignal();
330
331 public: // Intended for control developers
332
333   /**
334    * @brief Create an initialised Control.
335    *
336    * @param[in] implementation The implementation for this control.
337    * @return A handle to a newly allocated Dali resource.
338    *
339    * @note Should NOT be called to create a handle from the implementation. As stated, this allocates a NEW Dali resource.
340    */
341   explicit Control(Internal::Control& implementation);
342
343   /**
344    * @brief This constructor is used by CustomActor within Dali core to create additional Control handles
345    * using an Internal CustomActor pointer.
346    *
347    * @param [in] internal A pointer to a newly allocated Dali resource
348    */
349   explicit Control(Dali::Internal::CustomActor* internal);
350
351 public: // Templates for Deriving Classes
352
353   /**
354    * @brief Template to allow deriving controls to DownCast handles to deriving handle classes.
355    *
356    * @tparam     T       The handle class
357    * @tparam     I       The implementation class
358    * @param[in]  handle  Handle to an object
359    * @return Handle to a class T or an uninitialized handle.
360    * @see DownCast(BaseHandle)
361    */
362   template<typename T, typename I>
363   DALI_INTERNAL static T DownCast( BaseHandle handle )
364   {
365     T result;
366
367     CustomActor custom = Dali::CustomActor::DownCast( handle );
368     if ( custom )
369     {
370       CustomActorImpl& customImpl = custom.GetImplementation();
371
372       I* impl = dynamic_cast<I*>(&customImpl);
373
374       if (impl)
375       {
376         result = T(customImpl.GetOwner());
377       }
378     }
379
380     return result;
381   }
382
383   /**
384    * @brief Template to allow deriving controls to verify whether the Internal::CustomActor* is actually an
385    * implementation of their class.
386    *
387    * @tparam     I         The implementation class
388    * @param[in]  internal  Pointer to the Internal::CustomActor
389    */
390   template<typename I>
391   DALI_INTERNAL void VerifyCustomActorPointer(Dali::Internal::CustomActor* internal)
392   {
393     // Can have a NULL pointer so we only need to check if the internal implementation is our class
394     // when there is a value.
395     if (internal)
396     {
397       DALI_ASSERT_DEBUG(dynamic_cast<I*>(&CustomActor(internal).GetImplementation()));
398     }
399   }
400
401 };
402
403 } // namespace Toolkit
404
405 } // namespace Dali
406
407 #endif // __DALI_TOOLKIT_CONTROL_H__