Setting layout already in use
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / control / control-data-impl.cpp
index 6468ad5..a8387ee 100755 (executable)
@@ -36,6 +36,7 @@
 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
 #include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/devel-api/controls/control-wrapper-impl.h>
+#include <dali-toolkit/devel-api/layouting/bin-layout.h>
 #include <dali-toolkit/devel-api/layouting/layout-item.h>
 #include <dali-toolkit/internal/styling/style-manager-impl.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
@@ -1440,15 +1441,35 @@ Toolkit::Internal::LayoutItemPtr Control::Impl::GetLayout() const
 
 void Control::Impl::SetLayout( Toolkit::Internal::LayoutItem& layout )
 {
-  DALI_LOG_INFO( gLogFilterLayout, Debug::Verbose, "Control::SetLayout control:%s  existing layout:%s\n",
+  DALI_LOG_INFO( gLogFilterLayout, Debug::Verbose, "Control::SetLayout control:%s  replacing existing layout:%s\n",
                                    mControlImpl.Self().GetName().c_str(),
                                    mLayout?"true":"false" );
+  // Check if layout already has an owner.
+  auto control = Toolkit::Control::DownCast( layout.GetOwner() );
+  if ( control )
+  {
+    // If the owner is not this control then the owning control can no longer own it.
+    Dali::Toolkit::Control handle( mControlImpl.GetOwner() );
+    if( control != handle )
+    {
+      DALI_LOG_INFO( gLogFilterLayout, Debug::Verbose, "Control::SetLayout Layout already in use, %s will now have a BinLayout\n",
+                                                        control.GetName().c_str() );
+      Toolkit::BinLayout binLayout = Toolkit::BinLayout::New();
+      // Previous owner of the layout gets a BinLayout instead of the layout.
+      DevelControl::SetLayout( control, binLayout ) ;
+    }
+    else
+    {
+      return; // layout is already set to this control.
+    }
+  }
 
   if( mLayout )
   {
     mLayout->Unparent();
     mLayout.Reset();
   }
+
   mLayout = &layout;
 
   auto controlHandle = Toolkit::Control::DownCast( mControlImpl.Self() ); // Get a handle of this control implementation without copying internals.
@@ -1457,11 +1478,11 @@ void Control::Impl::SetLayout( Toolkit::Internal::LayoutItem& layout )
 
 void Control::Impl::RemoveLayout()
 {
-  if( mLayout )
-  {
-    mLayout->Unparent();
-    mLayout.Reset();
-  }
+  DALI_LOG_INFO( gLogFilterLayout, Debug::Verbose, "Control::Impl::RemoveLayout\n");
+
+  Toolkit::BinLayout binLayout = Toolkit::BinLayout::New();
+
+  mControlImpl.mImpl->SetLayout( GetImplementation( binLayout ) ) ;
 }
 
 void Control::Impl::SetLayoutingRequired( bool layoutingRequired )