Optimization to reduce Handle size by 50%
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / public-api / focus-manager / keyinput-focus-manager.h
1 #ifndef __DALI_TOOLKIT_KEYINPUT_FOCUS_MANAGER_H__
2 #define __DALI_TOOLKIT_KEYINPUT_FOCUS_MANAGER_H__
3
4 /*
5  * Copyright (c) 2014 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 // INTERNAL INCLUDES
22 #include <dali/dali.h>
23 #include <dali-toolkit/public-api/controls/control.h>
24
25 namespace Dali DALI_IMPORT_API
26 {
27
28 namespace Toolkit
29 {
30
31 namespace Internal DALI_INTERNAL
32 {
33 class KeyInputFocusManager;
34 }
35
36 /**
37  * KeyInputFocusManager
38  * This class provides the functionality of registering for keyboard events for controls.
39  * The keyinput focus manager maintains a stack of controls, With the last added control receiving
40  * all the keyboard events first. And if the conrol doesn't consume the event it is passed to
41  * the next control in the stack. If none of the controls in the stack consume the key event then
42  * UnhandledKeyEventSignal() is emitted.
43  */
44
45  class KeyInputFocusManager : public BaseHandle
46  {
47  public:
48   //Signal Names
49   static const char* const SIGNAL_KEY_INPUT_FOCUS_CHANGED;
50   static const char* const SIGNAL_UNHANDLED_KEY_EVENT;
51
52   // KeyInputFocusChanged
53   typedef SignalV2< void (Control, Control) > KeyInputFocusChangedSignalV2;
54
55   // Unhandled Key Event
56   typedef SignalV2< void (const KeyEvent&) > UnhandledKeyEventSignalV2;
57
58  public:
59
60   /**
61    * Create a KeyInputFocusManager handle; this can be initialised with KeyInputFocusManager::Get()
62    * Calling member functions with an uninitialised handle is not allowed.
63    */
64   KeyInputFocusManager();
65
66   /**
67    * @brief Destructor
68    *
69    * This is non-virtual since derived Handle types must not contain data or virtual methods.
70    */
71   ~KeyInputFocusManager();
72
73   /**
74    * Get the singleton of KeyInputFocusManager object.
75    * @return A handle to the KeyInputFocusManager control.
76    */
77   static KeyInputFocusManager Get();
78
79   /**
80    * Sets keyboard focus for a control.
81    * Note: A control can be set to be in focus and still not receive all the key events if another control has over ridden it.
82    * As the key input focus mechanism works like a stack, the top most control receives all the key events, and passes on the
83    * unhandled events to the controls below in the stack. A control in the stack will regain key input focus when there are no more
84    * controls above it in the focus stack.
85    *
86    * @pre The Control is not in the focus stack. If it is allready present in the top of the stack it results in a no-op, If it is
87    * present in the stack but not on the top of the stack, then the control is moved to the top of the focus stack.
88    * @param[in] control The Control to receive keyboard input
89    */
90   void SetFocus(Control control);
91
92   /**
93    * Query for the control that is currently set to be on top of the fcous stack and receives all
94    * keyboard input events first.
95    * @return Pointer to the control set to receive keyboard inputs.
96    */
97   Control GetCurrentFocusControl() const;
98
99   /**
100    * Removes focus for the given control, The control will no longer receive events from keyboard.
101    * @param [in] control which should be removed from focus.
102    */
103   void RemoveFocus(Control control);
104
105   /**
106    * Queries whether a control is currently part of the focus stack.
107    * @param [in] control which should be queried.
108    * @return True if it is part of the foucus stack False otherwise.
109    */
110   bool IsKeyboardListener(Control control);
111
112  public: // Signals
113
114   /**
115    * This signal is emitted when the key input focus control changes.
116    * Two control parameters are sent as part of this signal, the first being the signal that now has the focus, the second
117    * being the one that has lost focus.
118    * A callback of the following type may be connected:
119    * @code
120    *   void YourCallback(Control focusGainedControl, Control focusLostActor);
121    * @endcode
122    * @return The signal to connect to.
123    */
124   KeyInputFocusChangedSignalV2& KeyInputFocusChangedSignal();
125
126   /**
127    * This signal is emitted when a key event was received, and none of the focused controls on the stage have consumed it.
128    * A callback of the following type may be connected:
129    * @code
130    *   void YourCallbackName(const KeyEvent& event);
131    * @endcode
132    * @return The signal to connect to.
133    */
134   UnhandledKeyEventSignalV2& UnhandledKeyEventSignal();
135
136 private:
137
138   KeyInputFocusManager(Internal::KeyInputFocusManager *impl);
139
140 }; // class KeyInputFocusManager
141
142 } // namespace Toolkit
143
144 } // namespace Dali
145
146 #endif // __DALI_TOOLKIT_KEYINPUT_FOCUS_MANAGER_H__