Dali::Internal::Adaptor::WidgetApplicationTizen* application = static_cast<Dali::Internal::Adaptor::WidgetApplicationTizen*>(classData);
- // After DALi can support multi window, this part should be changed.
- Dali::Window window = application->GetWindow();
+ Dali::Window window;
+ if( application->GetWidgetCount() == 0)
+ {
+ window = application->GetWindow();
+ DALI_LOG_RELEASE_INFO("Widget Instance use default Window(win:%p), so it need to bind widget (%dx%d) (id:%s) \n",window, w, h, std::string(id).c_str());
+ }
+ else
+ {
+ window = Dali::Window::New(PositionSize(0,0,w,h) ,"", false);
+ if( window )
+ {
+ DALI_LOG_RELEASE_INFO("Widget Instance create new Window (win:%p, cnt:%d) (%dx%d) (id:%s )\n", window, application->GetWidgetCount(), w, h, std::string(id).c_str());
+ }
+ else
+ {
+ DALI_LOG_ERROR("This device can't support Multi Widget. it means UI may not be properly drawn.");
+ window = application->GetWindow();
+ }
+ }
+
Any nativeHandle = window.GetNativeHandle();
#ifdef ECORE_WAYLAND2
Dali::WidgetApplication::CreateWidgetFunction createFunction = pair.second;
Dali::Widget widgetInstance = createFunction( pair.first );
- application->AddWidget( instanceHandle, widgetInstance );
+ application->AddWidget( instanceHandle, widgetInstance , window );
Dali::Internal::Adaptor::Widget::Impl *widgetImpl = new Dali::Internal::Adaptor::WidgetImplTizen(instanceHandle);
Internal::Adaptor::GetImplementation(widgetInstance).SetImpl( widgetImpl );
// Get Dali::Widget instance.
Dali::Widget widgetInstance = application->GetWidget( instanceHandle );
-
- Dali::Window window = application->GetWindow();
+ Dali::Window window = application->GetWindowFromWidget( instanceHandle );
window.SetSize( Dali::Window::WindowSize(w, h) );
Internal::Adaptor::GetImplementation(widgetInstance).OnResize(window);
WidgetApplicationTizen::CreateWidgetFunctionPair WidgetApplicationTizen::GetWidgetCreatingFunctionPair( const std::string& widgetName )
{
+ int idx = widgetName.find(":");
+ std::string widgetID = widgetName.substr( idx + 1 );
for( CreateWidgetFunctionContainer::const_iterator iter = mCreateWidgetFunctionContainer.begin(); iter != mCreateWidgetFunctionContainer.end(); ++iter )
{
- if( widgetName.find((*iter).first) != std::string::npos )
+ if( widgetID.compare((*iter).first) == 0)
{
return *iter;
}
return CreateWidgetFunctionPair( "", NULL );
}
-void WidgetApplicationTizen::AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget )
+void WidgetApplicationTizen::AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget , Dali::Window window )
{
mWidgetInstanceContainer.push_back( WidgetInstancePair(widgetBaseInstance, widget) );
+ mWindowInstanceContainer.push_back( WindowInstancePair(widgetBaseInstance, window) );
}
-Dali::Widget WidgetApplicationTizen::GetWidget( widget_base_instance_h widgetBaseInstance )
+Dali::Widget WidgetApplicationTizen::GetWidget( widget_base_instance_h widgetBaseInstance ) const
{
- for( WidgetInstanceContainer::const_iterator iter = mWidgetInstanceContainer.begin(); iter != mWidgetInstanceContainer.end(); ++iter )
+ for( auto&& iter : mWidgetInstanceContainer )
{
- if( (*iter).first == widgetBaseInstance )
+ if( (iter).first == widgetBaseInstance )
{
- return (*iter).second;
+ return (iter).second;
}
}
return Dali::Widget();
void WidgetApplicationTizen::DeleteWidget( widget_base_instance_h widgetBaseInstance )
{
- for( WidgetInstanceContainer::const_iterator iter = mWidgetInstanceContainer.begin(); iter != mWidgetInstanceContainer.end(); ++iter )
+ // Delete WidgetInstance
+ auto widgetInstance = std::find_if( mWidgetInstanceContainer.begin(),
+ mWidgetInstanceContainer.end(),
+ [widgetBaseInstance]( WidgetInstancePair pair )
+ { return (pair.first == widgetBaseInstance); } );
+
+ if(widgetInstance != mWidgetInstanceContainer.end())
{
- if( (*iter).first == widgetBaseInstance )
+ mWidgetInstanceContainer.erase(widgetInstance);
+ }
+
+ // Delete WindowInstance
+ auto windowInstance = std::find_if( mWindowInstanceContainer.begin(),
+ mWindowInstanceContainer.end(),
+ [widgetBaseInstance]( WindowInstancePair pair )
+ { return (pair.first == widgetBaseInstance); } );
+
+ if(windowInstance != mWindowInstanceContainer.end())
+ {
+ mWindowInstanceContainer.erase(windowInstance);
+ }
+}
+
+Dali::Window WidgetApplicationTizen::GetWindowFromWidget( widget_base_instance_h widgetBaseInstance ) const
+{
+ for( auto&& iter : mWindowInstanceContainer )
+ {
+ if( (iter).first == widgetBaseInstance )
{
- mWidgetInstanceContainer.erase(iter);
- break;
+ Dali::Window ret = (iter).second;
+ return ret;
}
}
+ return Dali::Window();
+}
+
+int WidgetApplicationTizen::GetWidgetCount()
+{
+ return mWidgetInstanceContainer.size();
}
void WidgetApplicationTizen::OnInit()
// INTERNAL INCLUDES
#include <dali/internal/adaptor/common/application-impl.h>
#include <dali/internal/system/common/widget-application-impl.h>
+#include <dali/devel-api/adaptor-framework/window-devel.h>
namespace Dali
{
/**
* Add widget_base_instance_h - Widget instance pair to container.
*/
- void AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget );
+ void AddWidget( widget_base_instance_h widgetBaseInstance, Dali::Widget widget , Dali::Window window );
/**
* Find and get Widget instance in container by widget_base_instance_h.
*/
- Dali::Widget GetWidget( widget_base_instance_h widgetBaseInstance );
+ Dali::Widget GetWidget( widget_base_instance_h widgetBaseInstance ) const;
/**
* Delete widget_base_instance_h - Widget instance pair in container.
*/
void DeleteWidget( widget_base_instance_h widgetBaseInstance );
+ /**
+ * Find and get Window instance in container by widget_base_instance_h.
+ */
+ Dali::Window GetWindowFromWidget( widget_base_instance_h widgetBaseInstance ) const;
+
+ /**
+ * Get the number of created widget.
+ */
+ int32_t GetWidgetCount();
+
protected:
/**
CreateWidgetFunctionContainer mCreateWidgetFunctionContainer;
WidgetInstanceContainer mWidgetInstanceContainer;
+ typedef std::pair< widget_base_instance_h, Dali::Window > WindowInstancePair;
+ typedef std::vector< WindowInstancePair > WindowInstanceContainer;
+ WindowInstanceContainer mWindowInstanceContainer;
};
} // namespace Adaptor
Internal::Adaptor::Window* window = Internal::Adaptor::Window::New(posSize, name, "", isTransparent);
Dali::Adaptor& adaptor = Internal::Adaptor::Adaptor::Get();
- Integration::SceneHolder sceneHolder = Integration::SceneHolder( window );
- Internal::Adaptor::Adaptor::GetImplementation( adaptor ).AddWindow( sceneHolder, name, "", isTransparent );
+ if( Internal::Adaptor::Adaptor::GetImplementation( adaptor ).IsMultipleWindowSupported() )
+ {
+ Integration::SceneHolder sceneHolder = Integration::SceneHolder( window );
+ Internal::Adaptor::Adaptor::GetImplementation( adaptor ).AddWindow( sceneHolder, name, "", isTransparent );
- return Window(window);
+ return Window(window);
+ }
+ else
+ {
+ DALI_LOG_ERROR("This device can't support multiple windows.\n");
+ return Window();
+ }
}
Window Window::New(PositionSize posSize, const std::string& name, const std::string& className, bool isTransparent)
Internal::Adaptor::Window* window = Internal::Adaptor::Window::New(posSize, name, className, isTransparent);
Dali::Adaptor& adaptor = Internal::Adaptor::Adaptor::Get();
- Integration::SceneHolder sceneHolder = Integration::SceneHolder( window );
- Internal::Adaptor::Adaptor::GetImplementation( adaptor ).AddWindow( sceneHolder, name, className, isTransparent );
-
- return Window(window);
+ if( Internal::Adaptor::Adaptor::GetImplementation( adaptor ).IsMultipleWindowSupported() )
+ {
+ Integration::SceneHolder sceneHolder = Integration::SceneHolder( window );
+ Internal::Adaptor::Adaptor::GetImplementation( adaptor ).AddWindow( sceneHolder, name, className, isTransparent );
+
+ return Window(window);
+ }
+ else
+ {
+ DALI_LOG_ERROR("This device can't support multiple windows.\n");
+ return Window();
+ }
}
Window::Window()