[Tizen] Temporarily modified so that window is no null
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / tizen-wayland / widget-application-impl-tizen.cpp
index b9354c6..2b4b480 100644 (file)
@@ -21,6 +21,7 @@
 // INTERNAL INCLUDE
 #include <dali/public-api/adaptor-framework/widget.h>
 #include <dali/public-api/adaptor-framework/widget-impl.h>
+#include <dali/internal/adaptor/common/adaptor-impl.h>
 #include <dali/internal/system/common/environment-variables.h>
 #include <dali/internal/system/tizen-wayland/widget-controller-tizen.h>
 
@@ -46,9 +47,26 @@ int OnInstanceInit(widget_base_instance_h instanceHandle, bundle *content, int w
 
   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();
-  window.ShowIndicator(Dali::Window::INVISIBLE);
+  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
+  {
+    if(Internal::Adaptor::Adaptor::GetImplementation(application->GetAdaptor()).IsMultipleWindowSupported())
+    {
+      window = Dali::Window::New(PositionSize(0,0,w,h) ,"", false);
+      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
@@ -64,7 +82,7 @@ int OnInstanceInit(widget_base_instance_h instanceHandle, bundle *content, int w
   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 );
@@ -157,8 +175,7 @@ int OnInstanceResize(widget_base_instance_h instanceHandle, int w, int h, void *
 
   // 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);
 
@@ -244,9 +261,11 @@ void WidgetApplicationTizen::AddWidgetCreatingFunctionPair( CreateWidgetFunction
 
 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;
     }
@@ -255,18 +274,19 @@ WidgetApplicationTizen::CreateWidgetFunctionPair WidgetApplicationTizen::GetWidg
   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();
@@ -274,14 +294,45 @@ Dali::Widget WidgetApplicationTizen::GetWidget( widget_base_instance_h widgetBas
 
 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()