2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "widget-application-impl.h"
23 #include <widget-impl.h>
24 #include <widget-controller.h>
35 int OnInstanceInit(widget_base_instance_h instanceHandle, bundle *content, int w, int h, void *classData)
38 widget_base_context_get_id(instanceHandle, &id);
40 widget_base_class_on_create(instanceHandle, content, w, h);
42 Dali::Internal::Adaptor::WidgetApplication* application = static_cast<Dali::Internal::Adaptor::WidgetApplication*>(classData);
44 // After DALi can support multi window, this part should be changed.
45 Dali::Window window = application->GetWindow();
46 window.ShowIndicator(Dali::Window::INVISIBLE);
47 Any nativeHandle = window.GetNativeHandle();
48 Ecore_Wl_Window * wlWindow = AnyCast<Ecore_Wl_Window*>( nativeHandle );
49 widget_base_context_window_bind( instanceHandle, id, wlWindow );
50 window.SetSize( Dali::Window::WindowSize( w, h ) );
52 Dali::WidgetApplication::CreateWidgetFunction createFunction = application->GetWidgetCreatingFunction(std::string(id));
54 Dali::Widget widgetInstance = createFunction();
56 Dali::Internal::Adaptor::Widget::Impl *widgetImpl = new Dali::Internal::Adaptor::Widget::Impl(instanceHandle);
58 Internal::Adaptor::GetImplementation(widgetInstance).SetImpl( widgetImpl );
60 bundle_raw *bundleRaw;
62 bundle_encode(content, &bundleRaw, &len);
63 char* encodedContent = reinterpret_cast< char* >( bundleRaw );
64 std::string encodedContentString( encodedContent );
66 application->AddWidget( instanceHandle, widgetInstance );
67 Internal::Adaptor::GetImplementation(widgetInstance).OnCreate( encodedContentString, window );
73 int OnInstanceDestroy(widget_base_instance_h instanceHandle, widget_base_destroy_type_e reason, bundle *content, void *classData)
75 Dali::Internal::Adaptor::WidgetApplication* application = static_cast<Dali::Internal::Adaptor::WidgetApplication*>(classData);
77 // Get Dali::Widget instance.
78 Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
80 Dali::Widget::Termination::Type destroyReason = Dali::Widget::Termination::TEMPORARY;
82 if(reason == WIDGET_BASE_DESTROY_TYPE_PERMANENT)
84 destroyReason = Dali::Widget::Termination::PERMANENT;
87 bundle_raw *bundleRaw;
89 bundle_encode(content, &bundleRaw, &len);
90 char* encodedContent = reinterpret_cast< char* >( bundleRaw );
91 std::string encodedContentString( encodedContent );
92 Internal::Adaptor::GetImplementation(widgetInstance).OnTerminate( encodedContentString, destroyReason );
95 widget_base_class_on_destroy(instanceHandle, reason, content);
97 application->DeleteWidget( instanceHandle );
102 int OnInstancePause(widget_base_instance_h instanceHandle, void *classData)
104 widget_base_class_on_pause(instanceHandle);
106 Dali::Internal::Adaptor::WidgetApplication* application = static_cast<Dali::Internal::Adaptor::WidgetApplication*>(classData);
108 // Get Dali::Widget instance.
109 Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
111 Internal::Adaptor::GetImplementation(widgetInstance).OnPause();
116 int OnInstanceResume(widget_base_instance_h instanceHandle, void *classData)
118 widget_base_class_on_resume(instanceHandle);
120 Dali::Internal::Adaptor::WidgetApplication* application = static_cast<Dali::Internal::Adaptor::WidgetApplication*>(classData);
122 // Get Dali::Widget instance.
123 Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
125 Internal::Adaptor::GetImplementation(widgetInstance).OnResume();
130 int OnInstanceResize(widget_base_instance_h instanceHandle, int w, int h, void *classData)
132 widget_base_class_on_resize(instanceHandle, w, h);
134 Dali::Internal::Adaptor::WidgetApplication* application = static_cast<Dali::Internal::Adaptor::WidgetApplication*>(classData);
136 // Get Dali::Widget instance.
137 Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
139 Dali::Window window = application->GetWindow();
140 window.SetSize( Dali::Window::WindowSize(w, h) );
141 Internal::Adaptor::GetImplementation(widgetInstance).OnResize(window);
146 int OnInstanceUpdate(widget_base_instance_h instanceHandle, bundle *content, int force, void *classData)
148 widget_base_class_on_update(instanceHandle, content, force);
150 Dali::Internal::Adaptor::WidgetApplication* application = static_cast<Dali::Internal::Adaptor::WidgetApplication*>(classData);
152 // Get Dali::Widget instance.
153 Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
155 bundle_raw *bundleRaw;
157 bundle_encode(content, &bundleRaw, &len);
158 char* encodedContent = reinterpret_cast< char* >( bundleRaw );
159 std::string encodedContentString( encodedContent );
160 Internal::Adaptor::GetImplementation(widgetInstance).OnUpdate( encodedContentString, force );
167 } // anonymous namespace
172 WidgetApplicationPtr WidgetApplication::New(
175 const std::string& stylesheet)
177 WidgetApplicationPtr widgetApplication( new WidgetApplication (argc, argv, stylesheet ) );
178 return widgetApplication;
181 WidgetApplication::WidgetApplication( int* argc, char** argv[], const std::string& stylesheet )
182 :Application(argc, argv, stylesheet, Dali::WidgetApplication::OPAQUE, PositionSize(), Framework::WIDGET)
186 WidgetApplication::~WidgetApplication()
191 void WidgetApplication::RegisterWidgetCreatingFunction( const std::string& widgetName, Dali::WidgetApplication::CreateWidgetFunction createFunction )
193 AddWidgetCreatingFunction( widgetName, createFunction );
195 // Register widget class to widget framework
196 widget_base_class cls = widget_base_class_get_default();
197 cls.ops.create = OnInstanceInit;
198 cls.ops.destroy = OnInstanceDestroy;
199 cls.ops.pause = OnInstancePause;
200 cls.ops.resume = OnInstanceResume;
201 cls.ops.resize = OnInstanceResize;
202 cls.ops.update = OnInstanceUpdate;
204 widget_base_class_add(cls, widgetName.c_str(), this);
207 void WidgetApplication::AddWidgetCreatingFunction( const std::string& widgetName, Dali::WidgetApplication::CreateWidgetFunction createFunction )
209 mCreateWidgetFunctionContainer.push_back( CreateWidgetFunctionPair(widgetName, createFunction) );
212 Dali::WidgetApplication::CreateWidgetFunction WidgetApplication::GetWidgetCreatingFunction( const std::string& widgetName )
214 for( CreateWidgetFunctionContainer::const_iterator iter = mCreateWidgetFunctionContainer.begin(); iter != mCreateWidgetFunctionContainer.end(); ++iter )
216 if( widgetName.find((*iter).first) != std::string::npos )
218 return (*iter).second;
225 void WidgetApplication::AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget )
227 mWidgetInstanceContainer.push_back( WidgetInstancePair(widgetBaseInstance, widget) );
230 Dali::Widget WidgetApplication::GetWidget( widget_base_instance_h widgetBaseInstance )
232 for( WidgetInstanceContainer::const_iterator iter = mWidgetInstanceContainer.begin(); iter != mWidgetInstanceContainer.end(); ++iter )
234 if( (*iter).first == widgetBaseInstance )
236 return (*iter).second;
239 return Dali::Widget();
242 void WidgetApplication::DeleteWidget( widget_base_instance_h widgetBaseInstance )
244 for( WidgetInstanceContainer::const_iterator iter = mWidgetInstanceContainer.begin(); iter != mWidgetInstanceContainer.end(); ++iter )
246 if( (*iter).first == widgetBaseInstance )
248 mWidgetInstanceContainer.erase(iter);
254 } // namespace Adaptor
256 } // namespace Internal