+ Vector3 size = Vector3::ZERO;
+
+ bool horizontalAlignment = mTextLabelAlignment == BEGIN || mTextLabelAlignment == END; // label and visual side by side
+
+ // Get natural size of foreground ( largest of the possible visuals )
+ Size largestProvidedVisual;
+ Size labelSize = Size::ZERO;
+
+ bool foreGroundVisualUsed = false;
+
+ for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++ )
+ {
+ Toolkit::Visual::Base visual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND] );
+ Size visualSize;
+ if ( visual )
+ {
+ visual.GetNaturalSize( visualSize );
+ largestProvidedVisual.width = std::max(largestProvidedVisual.width, visualSize.width );
+ largestProvidedVisual.height = std::max(largestProvidedVisual.height, visualSize.height );
+ foreGroundVisualUsed = true;
+ }
+ }
+
+ if ( !foreGroundVisualUsed ) // If foreground visual not supplied then use the background visual to calculate Natural size
+ {
+ for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++ )
+ {
+ Toolkit::Visual::Base visual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[state][BACKGROUND] );
+ Size visualSize;
+ if ( visual )
+ {
+ visual.GetNaturalSize( visualSize );
+ largestProvidedVisual.width = std::max(largestProvidedVisual.width, visualSize.width );
+ largestProvidedVisual.height = std::max(largestProvidedVisual.height, visualSize.height );
+ }
+ }
+ }
+
+ // Get horizontal padding total
+ if ( largestProvidedVisual.width > 0 ) // if visual exists
+ {
+ size.width += largestProvidedVisual.width + mForegroundPadding.left + mForegroundPadding.right;
+ }
+ // Get vertical padding total
+ if ( largestProvidedVisual.height > 0 )
+ {
+ size.height += largestProvidedVisual.height + mForegroundPadding.top + mForegroundPadding.bottom;
+ }
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize visual Size(%f,%f)\n",
+ largestProvidedVisual.width, largestProvidedVisual.height );
+
+ // Get natural size of label if text has been set
+ if ( mTextStringSetFlag )
+ {
+ Toolkit::Visual::Base visual = GetVisual( Toolkit::Button::Property::LABEL );
+
+ if ( visual )
+ {
+ visual.GetNaturalSize( labelSize );
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize labelSize(%f,%f) padding(%f,%f)\n",
+ labelSize.width, labelSize.height, mLabelPadding.left + mLabelPadding.right, mLabelPadding.top + mLabelPadding.bottom);
+
+ labelSize.width += mLabelPadding.left + mLabelPadding.right;
+ labelSize.height += mLabelPadding.top + mLabelPadding.bottom;
+
+ // Add label size to height or width depending on alignment position
+ if ( horizontalAlignment )
+ {
+ size.width += labelSize.width;
+ size.height = std::max(size.height, labelSize.height );
+ }
+ else
+ {
+ size.height += labelSize.height;
+ size.width = std::max(size.width, labelSize.width );
+ }
+ }
+ }
+
+ if( size.width < 1 && size.height < 1 )
+ {
+ // if no image or label then use Control's natural size
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize Using control natural size\n");
+ size = Control::GetNaturalSize();
+ }
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "Button GetNaturalSize (%f,%f)\n", size.width, size.height );
+
+ return size;
+}
+
+void Button::OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension )
+{
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnSetResizePolicy\n");
+ RelayoutRequest();
+}
+
+/**
+ * Visuals are sized and positioned in this function.
+ * Whilst the control has it's size negotiated it has to size it's visuals explicitly here.
+ */
+
+void Button::OnRelayout( const Vector2& size, RelayoutContainer& container )
+{
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout targetSize(%f,%f) ptr(%p) state[%d]\n", size.width, size.height, this, mButtonState );
+
+ Toolkit::Visual::Base currentVisual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[mButtonState][FOREGROUND] );
+
+ Toolkit::Visual::Base currentBackGroundVisual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[mButtonState][BACKGROUND] );
+
+ // Sizes and padding set to zero, if not present then values will no effect calculations.
+ Vector2 visualPosition = Vector2::ZERO;
+ Vector2 labelPosition = Vector2::ZERO;
+ Size visualSize = Size::ZERO;
+ Padding foregroundVisualPadding = Padding(0.0f, 0.0f, 0.0f, 0.0f );
+ Padding labelVisualPadding = Padding(0.0f, 0.0f, 0.0f, 0.0f );
+
+ if ( mTextStringSetFlag )
+ {
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Label padding setting padding:%f,%f,%f,%f\n", mLabelPadding.y, mLabelPadding.x, mLabelPadding.width,mLabelPadding.height );
+ labelVisualPadding = mLabelPadding;
+ }
+
+ if ( currentVisual )
+ {
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Foreground Visual setting padding:%f,%f,%f,%f\n", mForegroundPadding.y, mForegroundPadding.x, mForegroundPadding.width,mForegroundPadding.height );
+ currentVisual.GetNaturalSize( visualSize );
+ foregroundVisualPadding = mForegroundPadding;
+ }
+
+ Toolkit::Align::Type visualAnchorPoint = Toolkit::Align::TOP_BEGIN;
+
+ Vector2 visualAndPaddingSize = Vector2( ( foregroundVisualPadding.x + visualSize.width + foregroundVisualPadding.y ),
+ ( foregroundVisualPadding.width + visualSize.height + foregroundVisualPadding.height ));
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout visualAndPaddingSize(%f,%f)\n", visualAndPaddingSize.width, visualAndPaddingSize.height);
+
+ // Text Visual should take all space available after foreground visual size and all padding is considered.
+ // Remaining Space priority, Foreground padding, foreground visual, Text padding then Text visual.
+ Size remainingSpaceForText = Size::ZERO;
+
+ switch ( mTextLabelAlignment )
+ {
+ case BEGIN :
+ {
+ visualAnchorPoint = Toolkit::Align::TOP_END;
+ visualPosition.x = foregroundVisualPadding.right;
+ visualPosition.y = foregroundVisualPadding.top;
+
+ labelPosition.x = labelVisualPadding.x;
+ labelPosition.y = labelVisualPadding.top;
+
+ remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y;
+ remainingSpaceForText.height = size.height - labelVisualPadding.top - labelVisualPadding.bottom;
+ break;
+ }
+ case END :
+ {
+ visualAnchorPoint = Toolkit::Align::TOP_BEGIN;
+ visualPosition.x = foregroundVisualPadding.left;
+ visualPosition.y = foregroundVisualPadding.top;
+
+ labelPosition.x = visualAndPaddingSize.width + labelVisualPadding.x;
+ labelPosition.y = labelVisualPadding.top;
+
+ remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y;
+ remainingSpaceForText.height = size.height - labelVisualPadding.top - labelVisualPadding.bottom;
+ break;
+ }
+ case TOP :
+ {
+ visualAnchorPoint = Toolkit::Align::BOTTOM_END;
+ visualPosition.x = foregroundVisualPadding.left;
+ visualPosition.y = foregroundVisualPadding.bottom;
+
+ labelPosition.x = labelVisualPadding.left;
+ labelPosition.y = labelVisualPadding.top;
+
+ remainingSpaceForText.width = size.width - labelVisualPadding.x - labelVisualPadding.y;
+ remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.top - labelVisualPadding.bottom;
+
+ break;
+ }
+ case BOTTOM :
+ {
+ visualAnchorPoint = Toolkit::Align::TOP_END;
+ visualPosition.x = foregroundVisualPadding.left;
+ visualPosition.y = foregroundVisualPadding.top;
+
+ labelPosition.x = labelVisualPadding.left;
+ labelPosition.y = visualAndPaddingSize.height + labelVisualPadding.top;
+
+ remainingSpaceForText.width = size.width - labelVisualPadding.x - labelVisualPadding.y;
+ remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.top - labelVisualPadding.bottom;
+
+ break;
+ }
+ }
+
+ if ( currentBackGroundVisual )
+ {
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual background size to(%f,%f)\n", size.width, size.height);
+
+ Property::Map visualTransform;
+
+ visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, size )
+ .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) );
+
+ currentBackGroundVisual.SetTransformAndSize( visualTransform, size );
+ }
+
+ if ( currentVisual )
+ {
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual size to(%f,%f)\n", visualSize.width, visualSize.height);
+
+ Property::Map visualTransform;
+
+ visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, visualSize )
+ .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, visualPosition )
+ .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
+ .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
+ .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
+ .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, visualAnchorPoint );
+
+ currentVisual.SetTransformAndSize( visualTransform, size );
+ }
+
+ if ( mTextStringSetFlag )
+ {
+ Toolkit::Visual::Base textVisual = GetVisual( Toolkit::Button::Property::LABEL ); // No need to search for Label visual if no text set.
+
+ if ( textVisual )
+ {
+ if ( !currentVisual )
+ {
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Only Text\n");
+ labelPosition.x = labelVisualPadding.left;
+ labelPosition.y = labelVisualPadding.height;
+ }
+
+ Vector2 preSize = Vector2( static_cast< int >( remainingSpaceForText.x ), static_cast< int >( remainingSpaceForText.y ));
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size(%f,%f) text Position(%f,%f) \n", remainingSpaceForText.width, remainingSpaceForText.height, labelPosition.x, labelPosition.y);
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size -- (%f,%f) text Position(%f,%f) \n", preSize.width, preSize.height, labelPosition.x, labelPosition.y);
+
+
+ Property::Map textVisualTransform;
+ textVisualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, preSize )
+ .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, labelPosition )
+ .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
+ .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) )
+ .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
+ .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, visualAnchorPoint );
+
+ textVisual.SetTransformAndSize( textVisualTransform, size );
+ }
+ }
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout selected (%s) \n", IsSelected()?"yes":"no" );
+
+ DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout << \n");
+}
+
+void Button::OnTap(Actor actor, const TapGesture& tap)
+{
+ // Prevents Parent getting a tap event
+}
+
+void Button::SetUpTimer( float delay )
+{
+ mAutoRepeatingTimer = Dali::Timer::New( static_cast<unsigned int>( 1000.f * delay ) );
+ mAutoRepeatingTimer.TickSignal().Connect( this, &Button::AutoRepeatingSlot );
+ mAutoRepeatingTimer.Start();
+}
+
+bool Button::AutoRepeatingSlot()
+{
+ bool consumed = false;
+ if( !IsDisabled() )
+ {
+ // Restart the autorepeat timer.