Reducing control size from 256 bytes to 224 by reordering data members and bitfieldin...
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / public-api / controls / control-impl.cpp
index 9347f6a..d26e2f4 100644 (file)
@@ -1,33 +1,35 @@
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Flora License, Version 1.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://floralicense.org/license/
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an AS IS BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
 
 #include <dali-toolkit/public-api/controls/control-impl.h>
 
-#include <boost/thread/tss.hpp>
 #include <stack>
 
 #include <dali/integration-api/debug.h>
 
-#include "dali-toolkit/internal/controls/style-change-processor.h"
 #include "dali-toolkit/internal/controls/relayout-controller.h"
 #include "dali-toolkit/internal/controls/relayout-helper.h"
 #include "dali-toolkit/public-api/focus-manager/keyinput-focus-manager.h"
 #include "dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h"
 #include <dali-toolkit/public-api/controls/control.h>
 
+#include <dali-toolkit/public-api/styling/style-manager.h>
+#include <dali-toolkit/internal/styling/style-manager-impl.h>
+
 namespace Dali
 {
 
@@ -237,23 +239,24 @@ public:
   // Construction & Destruction
   Impl(Control& controlImpl)
   : mControlImpl(controlImpl),
-    mInitialized( false ),
+    mBackground( NULL ),
+    mKeyEventSignalV2(),
     mPinchGestureDetector(),
     mPanGestureDetector(),
     mTapGestureDetector(),
     mLongPressGestureDetector(),
     mStartingPinchScale(),
-    mLockSetSize( false ),
-    mWidthPolicy( Toolkit::Control::Fixed ),
-    mHeightPolicy( Toolkit::Control::Fixed ),
     mSize(),
     mSetSize(),
     mMinimumSize(),
     mMaximumSize( MAX_FLOAT_VALUE, MAX_FLOAT_VALUE, MAX_FLOAT_VALUE ),
+    mLockSetSize( false ),
+    mWidthPolicy( Toolkit::Control::Fixed ),
+    mHeightPolicy( Toolkit::Control::Fixed ),
+    mFlags( Control::CONTROL_BEHAVIOUR_NONE ),
     mIsKeyboardNavigationSupported(false),
     mIsKeyboardFocusGroup(false),
-    mKeyEventSignalV2(),
-    mBackground( NULL )
+    mInitialized( false )
   {
   }
 
@@ -494,39 +497,30 @@ public:
   // Data
 
   Control& mControlImpl;
-
-  bool mInitialized:1;
-
+  Background* mBackground;           ///< Only create the background if we use it
   ConnectionTracker mConnectionTracker; // signal connection tracker
+  Toolkit::Control::KeyEventSignalV2 mKeyEventSignalV2;
 
   // Gesture Detection
-
   PinchGestureDetector     mPinchGestureDetector;
   PanGestureDetector       mPanGestureDetector;
   TapGestureDetector       mTapGestureDetector;
   LongPressGestureDetector mLongPressGestureDetector;
-
   Vector3 mStartingPinchScale;       ///< The scale when a pinch gesture starts
 
-  // Relayout and size negotiation
-
-  bool mLockSetSize;                 ///< Used to avoid. Can't be a bitfield as a reference to this member is used in SetSizeLock helper class.
-
-  Toolkit::Control::SizePolicy mWidthPolicy;  ///< Stores the width policy.
-  Toolkit::Control::SizePolicy mHeightPolicy; ///< Stores the height policy.
-
   Vector3 mSize;                     ///< Stores the current control's size.
   Vector3 mSetSize;                  ///< Always stores the size set through the Actor's API. Useful when reset to the initial size is needed.
   Vector3 mMinimumSize;              ///< Stores the control's minimum size.
   Vector3 mMaximumSize;              ///< Stores the control's maximum size.
 
-  bool mIsKeyboardNavigationSupported;  ///< Stores whether keyboard navigation is supported by the control.
-  bool mIsKeyboardFocusGroup;        ///< Stores whether the control is a focus group.
-
-  Toolkit::Control::KeyEventSignalV2 mKeyEventSignalV2;
+  bool mLockSetSize;                 ///< Used to avoid. Can't be a bitfield as a reference to this member is used in SetSizeLock helper class.
 
-  // Background
-  Background* mBackground;           ///< Only create the background if we use it
+  Toolkit::Control::SizePolicy mWidthPolicy:3;  ///< Stores the width policy. 3 bits covers 8 values
+  Toolkit::Control::SizePolicy mHeightPolicy:3; ///< Stores the height policy. 3 bits covers 8 values
+  ControlBehaviour mFlags:4;           ///< Flags passed in from constructor. Need to increase this size when new enums are added
+  bool mIsKeyboardNavigationSupported:1;  ///< Stores whether keyboard navigation is supported by the control.
+  bool mIsKeyboardFocusGroup:1;        ///< Stores whether the control is a focus group.
+  bool mInitialized:1;
 
   // Properties - these need to be members of Internal::Control::Impl as they need to functions within this class.
   static PropertyRegistration PROPERTY_1;
@@ -549,7 +543,7 @@ PropertyRegistration Control::Impl::PROPERTY_7( CONTROL_TYPE, "key-input-focus",
 Toolkit::Control Control::New()
 {
   // Create the implementation, temporarily owned on stack
-  IntrusivePtr<Control> controlImpl = new Control( false );
+  IntrusivePtr<Control> controlImpl = new Control( CONTROL_BEHAVIOUR_NONE );
 
   // Pass ownership to handle
   Toolkit::Control handle( *controlImpl );
@@ -563,22 +557,23 @@ Toolkit::Control Control::New()
 
 Control::~Control()
 {
-  if( mImpl->mInitialized )
-  {
-    // Unregister only if control has been initialized.
-    Internal::StyleChangeProcessor::Unregister( this );
-  }
   delete mImpl;
 }
 
 void Control::Initialize()
 {
-  // Register with the style change processor so we are informed when the default style changes
-  Internal::StyleChangeProcessor::Register( this );
 
   // Calling deriving classes
   OnInitialize();
 
+  if( mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS )
+  {
+    Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+
+    // Register for style changes
+    styleManager.StyleChangeSignal().Connect( this, &ControlImpl::DoStyleChange );
+  }
+
   mImpl->mInitialized = true;
 }
 
@@ -735,6 +730,11 @@ Actor Control::GetBackgroundActor() const
   return Actor();
 }
 
+void Control::OnThemeChange( Toolkit::StyleManager styleManager )
+{
+  GetImpl( styleManager ).ApplyThemeStyle( GetOwner() );
+}
+
 void Control::OnPinch(PinchGesture pinch)
 {
   if (pinch.state == Gesture::Started)
@@ -767,7 +767,7 @@ void Control::OnChildAdd(Actor& child)
     return;
   }
 
-  // Request for relayout.
+  // Request for relayout as we may need to position the new child and old ones
   RelayoutRequest();
 
   // Notify derived classes.
@@ -782,7 +782,7 @@ void Control::OnChildRemove(Actor& child)
     return;
   }
 
-  // Request for relayout.
+  // Request for relayout as we may need to re-position the old child
   RelayoutRequest();
 
   // Notify derived classes.
@@ -847,6 +847,11 @@ bool Control::OnAccessibilityPan(PanGesture gesture)
   return false; // Accessibility pan gesture is not handled by default
 }
 
+bool Control::OnAccessibilityTouch(const TouchEvent& touchEvent)
+{
+  return false; // Accessibility touch event is not handled by default
+}
+
 bool Control::OnAccessibilityValueChange(bool isIncrease)
 {
   return false; // Accessibility value change action is not handled by default
@@ -885,12 +890,32 @@ bool Control::DoAction(BaseObject* object, const std::string& actionName, const
 {
   bool ret = false;
 
+  if( object && (actionName == Toolkit::Control::ACTION_CONTROL_ACTIVATED) )
+  {
+    Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) );
+    if( control )
+    {
+      // if cast succeeds there is an implementation so no need to check
+      control.GetImplementation().OnActivated();
+    }
+  }
+
   return ret;
 }
 
-void Control::DoActivatedAction(const PropertyValueContainer& attributes)
+void Control::DoStyleChange( Toolkit::StyleManager styleManager, StyleChange change )
 {
-  OnActivated();
+  if( change.themeChange )
+  {
+    OnThemeChange( styleManager );
+  }
+  else if( change.defaultFontChange || change.defaultFontSizeChange )
+  {
+    // This OnStyleChange(StyleChange change ) is deprecated, use OnFontChange instead
+    OnStyleChange( change );
+
+    OnFontChange( change.defaultFontChange, change.defaultFontSizeChange );
+  }
 }
 
 Toolkit::Control::KeyEventSignalV2& Control::KeyEventSignal()
@@ -1029,7 +1054,12 @@ void Control::ClearKeyInputFocus()
 
 void Control::RelayoutRequest()
 {
-  Internal::RelayoutController::Get().Request();
+  // unfortunate double negative but thats to guarantee new controls get size negotiation
+  // by default and have to "opt-out" if they dont want it
+  if( !(mImpl->mFlags & NO_SIZE_NEGOTIATION) )
+  {
+    Internal::RelayoutController::Request();
+  }
 }
 
 void Control::Relayout( Vector2 size, ActorSizeContainer& container )
@@ -1218,6 +1248,13 @@ Control::Control( bool requiresTouchEvents )
 {
 }
 
+Control::Control( ControlBehaviour behaviourFlags )
+: CustomActorImpl( behaviourFlags & REQUIRES_TOUCH_EVENTS ),
+  mImpl(new Impl(*this))
+{
+  mImpl->mFlags = behaviourFlags;
+}
+
 } // namespace Internal
 
 } // namespace Toolkit