Add logic for prevent duplicated form id using on Form based Scene registrations...
[framework/osp/uifw.git] / src / ui / scenes / FUiScenes_SceneManagerImpl.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18  * @file        FUiScenes_SceneManagerImpl.h
19  * @brief       This is the header file of the _SceneManagerImpl class.
20  *
21  * This header file contains the declarations of the _SceneManagerImpl class.
22  */
23
24 #ifndef _FUI_SCENES_INTERNAL_SCENE_MANAGER_IMPL_H_
25 #define _FUI_SCENES_INTERNAL_SCENE_MANAGER_IMPL_H_
26
27
28 #include <libxml/parser.h>
29 #include <FBaseTypes.h>
30 #include <FBaseColIList.h>
31 #include <FBaseColLinkedListT.h>
32 #include <FBaseColHashMapT.h>
33 #include <FBaseColMultiHashMapT.h>
34 #include <FBaseString.h>
35 #include <FUi_Types.h>
36 #include <FUiControl.h>
37 #include <FUiAnimIFrameAnimatorEventListener.h>
38 #include <FUiAnimIAnimationTransactionEventListener.h>
39 #include <FUiScenesTypes.h>
40 #include <FUiScenesSceneManager.h>
41 #include "FUiScenes_ISceneControlEventListener.h"
42 #include "FUiScenes_SceneControlEvent.h"
43
44
45 namespace Tizen { namespace Ui { namespace Scenes
46 {
47
48 class SceneTransition;
49
50 class _SceneManagerImpl
51         : public Tizen::Base::Object
52         , virtual public Tizen::Ui::Animations::IFrameAnimatorEventListener
53         , virtual public Tizen::Ui::Animations::IAnimationTransactionEventListener
54         , virtual public _ISceneControlEventListener
55 {
56 public:
57         _SceneManagerImpl(void);
58         virtual ~_SceneManagerImpl(void);
59         result Construct(void);
60
61         result RegisterFormFactory(const IFormFactory& formFactory);
62         result RegisterPanelFactory(const IPanelFactory& panelFactory);
63         result RegisterScene(const SceneId& sceneId, const Tizen::Base::String& formId, const Tizen::Base::String& panelId);
64         result RegisterScene(const Tizen::Base::String& resourceId);
65         result UnregisterScene(const SceneId& sceneId);
66         result AddSceneManagerEventListener(ISceneManagerEventListener& sceneManagerEventListener);
67         result RemoveSceneManagerEventListener(ISceneManagerEventListener& sceneManagerEventListener);
68         result AddSceneEventListener(const SceneId& sceneId, ISceneEventListener& sceneEventListener);
69         result RemoveSceneEventListener(const SceneId& sceneId, ISceneEventListener& sceneEventListener);
70         result SetSceneAnimationProvider(const SceneId& sceneId, ISceneAnimationProvider* pSceneAnimationProvider);
71         result SetSceneTransitionPolicyProvider(ISceneTransitionPolicyProvider* pSceneTransitionPolicyProvider);
72         result SetFormTransitionAnimationDefaultValues(SceneTransitionAnimationType animationType, long duration,
73                                                                                                    Tizen::Ui::Animations::AnimationInterpolatorType interpolatorType);
74         result GoForward(const ForwardSceneTransition& sceneTransition, const Tizen::Base::Collection::IList* pArgs = null);
75         result GoForward(const SceneTransitionId& transitionId, const Tizen::Base::Collection::IList* pArgs = null);
76         result GoBackward(const BackwardSceneTransition& sceneTransition, const Tizen::Base::Collection::IList* pArgs = null);
77         result GoBackward(const SceneTransitionId& transitionId, const Tizen::Base::Collection::IList* pArgs = null);
78         Scene* GetCurrentScene(void) const;
79         SceneId GetCurrentSceneId(void) const;
80         bool IsSceneAlive(const SceneId& sceneId) const;
81         result DestroyScene(const SceneId& sceneId);
82         result BringCurrentSceneToTop(void);
83         result ClearSceneHistory(void);
84         result AddToSceneHistory(const SceneId& sceneId);
85         Tizen::Base::Collection::IListT<SceneId>* GetSceneHistoryN(void) const;
86
87         //
88         // Gets the implementation.
89         //
90         // @return              The implementation
91         // @param[in]   The interface instance pointer
92         // @since       2.0
93         //
94         static _SceneManagerImpl* GetInstance(SceneManager& pSceneManager);
95
96         //
97         // Gets the implementation.
98         //
99         // @return              The implementation
100         // @param[in]   The interface instance pointer
101         // @since       2.0
102         //
103         static const _SceneManagerImpl* GetInstance(const SceneManager& pSceneManager);
104
105         // Event handelers to asynchronous destroy the Scene.
106         virtual void OnFormTransitionAnimationFinished(Tizen::Ui::Animations::FrameAnimator &source, Tizen::Ui::Controls::Frame &frame,
107                                                                                                    Tizen::Ui::Controls::Form &form1, Tizen::Ui::Controls::Form &form2);
108         virtual void OnFormTransitionAnimationStarted(Tizen::Ui::Animations::FrameAnimator &source, Tizen::Ui::Controls::Frame &frame,
109                                                                                                   Tizen::Ui::Controls::Form &form1, Tizen::Ui::Controls::Form &form2);
110         virtual void OnFormTransitionAnimationStopped(Tizen::Ui::Animations::FrameAnimator &source, Tizen::Ui::Controls::Frame &frame,
111                                                                                                   Tizen::Ui::Controls::Form &form1, Tizen::Ui::Controls::Form &form2);
112         virtual void OnAnimationTransactionFinished(int transactionId);
113         virtual void OnAnimationTransactionStarted(int transactionId);
114         virtual void OnAnimationTransactionStopped(int transactionId);
115         virtual void OnSceneControlEventReceived(_SceneControlEventArg::SceneControlEventType eventType, const SceneId& sceneId);
116
117         // Internal operations
118         Scene* GetScene(SceneId& sceneId);
119         Tizen::Base::Collection::IListT<Scene*>* GetLiveSceneN(void) const;
120
121 private:
122         _SceneManagerImpl(const Scene& rhs);
123         _SceneManagerImpl& operator =(const Scene& rhs);
124
125         result GotoScene(bool forward, const SceneId& sceneId, SceneTransitionAnimationType animationType,
126                                          SceneHistoryOption historyOption, SceneDestroyOption destroyOption,
127                                          const Tizen::Base::Collection::IList* pArgs);
128         // Container query set
129         Scene* GetSceneFromContainer(const SceneId& sceneId) const;
130         Tizen::Ui::Controls::Form* GetFormFromContainer(const Tizen::Base::String& formId);
131         // Add to container set
132         void AddSceneToContainer(const SceneId& sceneId, Scene* pScene);
133         void RemoveSceneFromContainer(const SceneId& sceneId);
134         void AddFormToContainer(const Tizen::Base::String& formId, Tizen::Ui::Controls::Form* pForm);
135         void RemoveFormFromFormContainer(const Tizen::Base::String& formId);
136         void AddPanelToPanelContainer(Scene* pScene);
137         void RemovePanelFromPanelContainer(Scene* pScene);
138
139         void UpdateCurrentScene(Scene* pScene);
140         result AddHistory(const SceneId& sceneId);
141
142         // Panel Scene transition assister
143         void SwitchToPanel(const Tizen::Base::String& formId, Tizen::Ui::Controls::Panel* pPanel, bool useAnimator = false);
144
145         void AddControlToFrame(Tizen::Ui::Controls::Form& form, bool useAnimator = false);
146         void RemoveControlFromFrame(Tizen::Ui::Controls::Form& form);
147         result SetCurrentForm(Tizen::Ui::Controls::Form& form, bool useAnimator = false);
148         Tizen::Ui::Controls::Form* GetCurrentForm(void);
149         void AddControlToForm(Tizen::Ui::Controls::Form& baseForm, const Tizen::Ui::Controls::Panel& panel);
150         void RemoveControlFromForm(Tizen::Ui::Controls::Form& baseForm, const Tizen::Ui::Controls::Panel& panel);
151         void SetShowState(Tizen::Ui::Controls::Panel& targetPanel, bool state);
152         void DrawForm(Tizen::Ui::Controls::Form& form);
153         // Listener, Strategy - calling sub method.
154         bool CallListenerOnSceneTransitionStarted(const SceneId& currentSceneId, const SceneId& nextSceneId);
155         bool CallListenerOnSceneTransitionCompleted(const SceneId& previousSceneId, const SceneId& currentSceneId);
156         bool CallListenerPrepareAnimation(Tizen::Ui::Scenes::Scene& scene, const SceneId& sceneId, Tizen::Base::Collection::IList* pArgs,
157                                                                           SceneTransitionAnimationType type, bool formTransition);
158         bool CallListenerOnSceneActivatedN(Tizen::Ui::Scenes::Scene& scene, const SceneId& previousSceneId,
159                                                                            const SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs);
160         bool CallListenerOnSceneDeactivated(Tizen::Ui::Scenes::Scene& scene, const SceneId& currentSceneId,
161                                                                                 const SceneId& nextSceneId);
162         SceneId CallStretegyGetNextScene(const SceneId& currentSceneId, const Tizen::Base::Collection::IList* pArgs);
163         void DestroySceneAsync(const SceneId& sceneId);
164         void ReserveDestroyingScene(const SceneId& sceneId);
165         void DestroyReservedScene(void);
166         void DestroySiblingPanelScene(const SceneId& sceneId);
167         Tizen::Ui::Controls::Frame* GetFrame(void);
168         bool IsAnimationCompleted(void);
169         result SetInputEventEnableState(Tizen::Ui::Control& control, bool enableState);
170         result GetSceneTransition(const SceneTransitionId& transitionId, SceneTransition& sceneTransition) const;
171         result RegisterScene(xmlNodePtr pNode);
172         result RegisterSceneTransition(xmlNodePtr pNode);
173         result StopAllAnimations(void);
174
175 private:
176         SceneId __currentSceneId;
177         Scene* __pCurrentScene;
178         Tizen::Base::Collection::LinkedListT <ISceneManagerEventListener*> __sceneManagerEventListenerList;
179         Tizen::Base::Collection::HashMapT <SceneId, Scene*> __sceneContainer;
180         Tizen::Base::Collection::HashMapT <Tizen::Base::String, Tizen::Ui::Controls::Form*> __formContainer;
181         Tizen::Base::Collection::MultiHashMapT <Tizen::Base::String, Scene*> __formToPanelMultiMap;
182         Tizen::Base::Collection::LinkedListT<SceneId>   __sceneHistory;
183
184         IFormFactory* __pFormFactory;
185         IPanelFactory* __pPanelFactory;
186         ISceneTransitionPolicyProvider* __pPolicyProvider;
187
188         struct _AnimationDescription
189         {
190                 Tizen::Ui::Animations::FrameAnimatorFormTransitionAnimation animationType;
191                 long duration;
192                 Tizen::Ui::Animations::AnimationInterpolatorType interpolatorType;
193         };
194         _AnimationDescription __animationDescriptions[Tizen::Ui::Animations::FRAME_ANIMATOR_FORM_TRANSITION_ANIMATION_MAX];
195
196         class _SceneDescription
197         {
198         public:
199                 _SceneDescription(const Tizen::Base::String& descriptionFormId, const Tizen::Base::String& descriptionPanelId);
200                 const Tizen::Base::String formId;
201                 const Tizen::Base::String panelId;
202         };
203         Tizen::Base::Collection::HashMapT <Tizen::Base::String, _SceneDescription*> __sceneMap;
204         Tizen::Base::Collection::HashMapT <Tizen::Base::String, SceneTransition*> __transitionMap;
205         Tizen::Base::Collection::HashMapT <Tizen::Base::String, int> __formIdMap;
206
207         _SceneControlEvent      __sceneControlEvent;
208         SceneId __destroyReservedScene;
209         Tizen::Ui::Controls::Frame* __pCorrespondFrame;
210         Tizen::Ui::_ControlHandle __correspondFrameControlHandle;
211         bool __sceneTransitionProgressing;
212         Tizen::Base::Runtime::Mutex __sceneTransitionMutex;
213         Tizen::Ui::Controls::Form* __pDisabledForm;
214
215 }; // _SceneManagerImpl
216 } } } // Tizen::Ui::Scenes
217
218 #endif // _FUI_SCENES_INTERNAL_SCENE_MANAGER_IMPL_H_