Remove TextView and TextInput tests
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / push-button-impl.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "push-button-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/actors/image-actor.h>
23 #include <dali/public-api/object/type-registry.h>
24
25 // INTERNAL INCLUDES
26 #include <dali-toolkit/public-api/controls/text-view/text-view.h>
27
28 namespace Dali
29 {
30
31 namespace Toolkit
32 {
33
34 namespace Internal
35 {
36
37 namespace
38 {
39
40 const float TEXT_PADDING = 12.0f;
41
42 const float LABEL_DEPTH( 0.75f );
43 const float FOREGROUND_DEPTH( 0.5f );
44 const float BACKGROUND_DEPTH( 0.25f );
45
46 const float ANIMATION_TIME( 0.2f );
47
48 BaseHandle Create()
49 {
50   return Toolkit::PushButton::New();
51 }
52
53 TypeRegistration typeRegistration( typeid(Toolkit::PushButton), typeid(Toolkit::Button), Create );
54
55 } // unnamed namespace
56
57 namespace
58 {
59
60 /**
61  * Find the first image actor in the actor hierarchy
62  */
63 ImageActor FindImageActor( Actor root )
64 {
65   ImageActor imageActor = ImageActor::DownCast( root );
66   if( !imageActor && root )
67   {
68     for( unsigned int i = 0, numChildren = root.GetChildCount(); i < numChildren; ++i )
69     {
70       ImageActor childImageActor = FindImageActor( root.GetChildAt( i ) );
71       if( childImageActor )
72       {
73         return childImageActor;
74       }
75     }
76   }
77
78   return imageActor;
79 }
80
81 } // unnamed namespace
82
83 Dali::Toolkit::PushButton PushButton::New()
84 {
85   // Create the implementation, temporarily owned on stack
86   IntrusivePtr< PushButton > internalPushButton = new PushButton();
87
88   // Pass ownership to CustomActor
89   Dali::Toolkit::PushButton pushButton( *internalPushButton );
90
91   // Second-phase init of the implementation
92   // This can only be done after the CustomActor connection has been made...
93   internalPushButton->Initialize();
94
95   return pushButton;
96 }
97
98 PushButton::PushButton()
99 : Button(),
100   mSize(),
101   mPaintState( UnselectedState )
102 {
103   SetAnimationTime( ANIMATION_TIME );
104 }
105
106 PushButton::~PushButton()
107 {
108 }
109
110 void PushButton::SetButtonImage( Actor image )
111 {
112   Actor& buttonImage = GetButtonImage();
113   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
114
115   switch( mPaintState )
116   {
117     case UnselectedState:
118     {
119       if( buttonImage && buttonImage.GetParent() )
120       {
121         StopFadeOutAnimation();
122         FadeOutImage( Foreground, buttonImage );
123
124         buttonImage = image;
125
126         FadeInImage( buttonImage, 0.0f, 0 );
127
128         StartFadeOutAnimation();
129         StartFadeInAnimation();
130       }
131       else
132       {
133         buttonImage = image;
134         Self().Insert( 0, buttonImage );
135       }
136       break;
137     }
138     case UnselectedSelectedTransition: // FALLTHROUGH
139     case UnselectedDisabledTransition:
140     {
141       float opacity = 1.f;
142       if( fadeOutButtonImage )
143       {
144         opacity = fadeOutButtonImage.GetCurrentOpacity();
145       }
146       StopFadeOutAnimation();
147
148       // Replaces the button image.
149       buttonImage = image;
150
151       Self().Insert( 0, buttonImage );
152       FadeOutImage( Foreground, buttonImage, opacity );
153
154       StartFadeOutAnimation();
155       break;
156     }
157     case SelectedUnselectedTransition: // FALLTHROUGH
158     case DisabledUnselectedTransition:
159     {
160       StopFadeInAnimation();
161       Self().Remove( buttonImage );
162
163       buttonImage = image;
164
165       FadeInImage( buttonImage, 0.0f, 0 );
166       StartFadeInAnimation();
167       break;
168     }
169     default:
170       buttonImage = image;
171       break;
172   }
173
174   buttonImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
175   buttonImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
176   buttonImage.SetPosition( 0.f, 0.f, FOREGROUND_DEPTH );
177   buttonImage.SetResizePolicy( FILL_TO_PARENT, ALL_DIMENSIONS );
178   buttonImage.SetName( "BUTTON_IMAGE" );
179 }
180
181 void PushButton::SetSelectedImage( Actor image )
182 {
183   Actor& selectedImage = GetSelectedImage();
184   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
185
186   switch( mPaintState )
187   {
188     case SelectedState:
189     {
190       if( selectedImage && selectedImage.GetParent() )
191       {
192         StopFadeOutAnimation();
193         FadeOutImage( Foreground, selectedImage  );
194
195         selectedImage = image;
196
197         FadeInImage( selectedImage, 0.0f, 0 );
198
199         StartFadeOutAnimation();
200         StartFadeInAnimation();
201       }
202       else
203       {
204         selectedImage = image;
205         Self().Insert( 0, selectedImage );
206       }
207       break;
208     }
209     case SelectedUnselectedTransition: // FALLTHROUGH
210     case SelectedDisabledTransition:
211     {
212       float opacity = 1.f;
213       if( fadeOutButtonImage )
214       {
215         opacity = fadeOutButtonImage.GetCurrentOpacity();
216       }
217       StopFadeOutAnimation();
218
219       // Replaces the button image.
220       selectedImage = image;
221
222       Self().Insert( 0, selectedImage );
223       FadeOutImage( Foreground, selectedImage, opacity );
224
225       StartFadeOutAnimation();
226       break;
227     }
228     case UnselectedSelectedTransition: // FALLTHROUGH
229     case DisabledSelectedTransition:
230     {
231       StopFadeInAnimation();
232       Self().Remove( selectedImage );
233
234       selectedImage = image;
235
236       FadeInImage( selectedImage, 0.0f, 0 );
237       StartFadeInAnimation();
238       break;
239     }
240     default:
241       selectedImage = image;
242       break;
243   }
244
245   selectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
246   selectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
247   selectedImage.SetPosition( 0.f, 0.f, FOREGROUND_DEPTH );
248   selectedImage.SetResizePolicy( FILL_TO_PARENT, ALL_DIMENSIONS );
249 }
250
251 void PushButton::SetBackgroundImage( Actor image )
252 {
253   Actor& backgroundImage = GetBackgroundImage();
254   Actor& fadeOutBackgroundImage = GetFadeOutBackgroundImage();
255
256   switch( mPaintState )
257   {
258     case UnselectedState:             // FALLTHROUGH
259     case SelectedState:
260     case UnselectedSelectedTransition:
261     case SelectedUnselectedTransition:
262     {
263       if( backgroundImage && backgroundImage.GetParent() )
264       {
265         StopFadeOutAnimation();
266         FadeOutImage( Background, backgroundImage  );
267
268         backgroundImage = image;
269
270         FadeInImage( backgroundImage, 0.0f, 0 );
271
272         StartFadeOutAnimation();
273         StartFadeInAnimation();
274       }
275       else
276       {
277         backgroundImage = image;
278         Self().Insert( 0, backgroundImage );
279       }
280       break;
281     }
282     case UnselectedDisabledTransition: // FALLTHROUGH
283     case SelectedDisabledTransition:
284     {
285       float opacity = 1.f;
286       if( fadeOutBackgroundImage )
287       {
288         opacity = fadeOutBackgroundImage.GetCurrentOpacity();
289       }
290       StopFadeOutAnimation();
291
292       // Replaces the button image.
293       backgroundImage = image;
294
295       Self().Insert( 0, backgroundImage );
296       FadeOutImage( Background, backgroundImage, opacity );
297
298       StartFadeOutAnimation();
299       break;
300     }
301     case DisabledUnselectedTransition: // FALLTHROUGH
302     case DisabledSelectedTransition:
303     {
304       StopFadeInAnimation();
305       Self().Remove( backgroundImage );
306
307       backgroundImage = image;
308
309       FadeInImage( backgroundImage, 0.0f, 0 );
310       StartFadeInAnimation();
311       break;
312     }
313     default:
314       backgroundImage = image;
315       break;
316     }
317
318   backgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
319   backgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
320   backgroundImage.SetPosition( 0.f, 0.f, BACKGROUND_DEPTH );
321   backgroundImage.SetResizePolicy( FILL_TO_PARENT, ALL_DIMENSIONS );
322 }
323
324 void PushButton::SetDisabledImage( Actor image )
325 {
326   Actor& disabledImage = GetDisabledImage();
327   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
328
329   switch( mPaintState )
330   {
331     case DisabledUnselectedState: // FALLTHROUGH
332     case DisabledSelectedState:
333     {
334       if( disabledImage && disabledImage.GetParent() )
335       {
336         StopFadeOutAnimation();
337         FadeOutImage( Foreground, disabledImage  );
338
339         disabledImage = image;
340
341         FadeInImage( disabledImage, 0.0f, 0 );
342
343         StartFadeOutAnimation();
344         StartFadeInAnimation();
345       }
346       else
347       {
348         disabledImage = image;
349         Self().Add( disabledImage );
350       }
351       break;
352     }
353     case UnselectedDisabledTransition: // FALLTHROUGH
354     case SelectedDisabledTransition:
355     {
356       StopFadeInAnimation();
357       Self().Remove( disabledImage );
358
359       disabledImage = image;
360
361       FadeInImage( disabledImage, 0.0f, 0 );
362       StartFadeInAnimation();
363       break;
364     }
365     case DisabledUnselectedTransition: // FALLTHROUGH
366     case DisabledSelectedTransition:
367     {
368       float opacity = 1.f;
369       if( fadeOutButtonImage )
370       {
371         opacity = fadeOutButtonImage.GetCurrentOpacity();
372       }
373       StopFadeOutAnimation();
374
375       // Replaces the button image.
376       disabledImage = image;
377
378       Self().Add( disabledImage );
379       FadeOutImage( Foreground, disabledImage, opacity );
380
381       StartFadeOutAnimation();
382       break;
383     }
384     default:
385       disabledImage = image;
386       break;
387   }
388
389   disabledImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
390   disabledImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
391   disabledImage.SetPosition( 0.f, 0.f, FOREGROUND_DEPTH );
392   disabledImage.SetResizePolicy( FILL_TO_PARENT, ALL_DIMENSIONS );
393 }
394
395 void PushButton::SetDisabledBackgroundImage( Actor image )
396 {
397   Actor& disabledBackgroundImage = GetDisabledBackgroundImage();
398   Actor& fadeOutBackgroundImage = GetFadeOutBackgroundImage();
399
400   switch( mPaintState )
401   {
402     case DisabledUnselectedState: // FALLTHROUGH
403     case DisabledSelectedState:
404     {
405       if( disabledBackgroundImage && disabledBackgroundImage.GetParent() )
406       {
407         StopFadeOutAnimation();
408         FadeOutImage( Background, disabledBackgroundImage  );
409
410         disabledBackgroundImage = image;
411
412         FadeInImage( disabledBackgroundImage, 0.0f, 0 );
413
414         StartFadeOutAnimation();
415         StartFadeInAnimation();
416       }
417       else
418       {
419         disabledBackgroundImage = image;
420         Self().Add( disabledBackgroundImage );
421       }
422       break;
423     }
424     case UnselectedDisabledTransition: // FALLTHROUGH
425     case SelectedDisabledTransition:
426     {
427       StopFadeInAnimation();
428       Self().Remove( disabledBackgroundImage );
429
430       disabledBackgroundImage = image;
431
432       FadeInImage( disabledBackgroundImage, 0.0f, 0 );
433       StartFadeInAnimation();
434       break;
435     }
436     case DisabledUnselectedTransition: // FALLTHROUGH
437     case DisabledSelectedTransition:
438     {
439       float opacity = 1.f;
440       if( fadeOutBackgroundImage )
441       {
442         opacity = fadeOutBackgroundImage.GetCurrentOpacity();
443       }
444       StopFadeOutAnimation();
445
446       // Replaces the button image.
447       disabledBackgroundImage = image;
448
449       Self().Add( disabledBackgroundImage );
450       FadeOutImage( Background, disabledBackgroundImage, opacity );
451
452       StartFadeOutAnimation();
453       break;
454     }
455     default:
456       disabledBackgroundImage = image;
457       break;
458   }
459
460   disabledBackgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
461   disabledBackgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
462   disabledBackgroundImage.SetPosition( 0.f, 0.f, BACKGROUND_DEPTH );
463   disabledBackgroundImage.SetResizePolicy( FILL_TO_PARENT, ALL_DIMENSIONS );
464 }
465
466 void PushButton::OnButtonInitialize()
467 {
468   // Push button requires the Leave event.
469   Actor root = Self();
470   root.SetLeaveRequired( true );
471
472   // Set resize policy to natural size so that buttons will resize to background images
473   root.SetResizePolicy( USE_NATURAL_SIZE, ALL_DIMENSIONS );
474 }
475
476 void PushButton::OnLabelSet()
477 {
478   Actor& label = GetLabel();
479
480   if( label )
481   {
482     label.SetAnchorPoint( AnchorPoint::CENTER );
483     label.SetParentOrigin( ParentOrigin::CENTER );
484     label.SetPosition( 0.f, 0.f, LABEL_DEPTH );
485     label.SetSize( mSize );
486
487     Self().Add( label );
488   }
489 }
490
491 void PushButton::OnSelected( bool selected )
492 {
493   Actor& selectedImage = GetSelectedImage();
494   Actor& buttonImage = GetButtonImage();
495   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
496
497   switch( mPaintState )
498   {
499     case UnselectedState:
500     {
501       StopFadeOutAnimation();
502       FadeOutImage( Foreground, buttonImage );
503       FadeInImage( selectedImage, 0.0f, 0 );
504       StartFadeOutAnimation();
505       StartFadeInAnimation();
506
507       if( buttonImage || selectedImage )
508       {
509         mPaintState = UnselectedSelectedTransition;
510       }
511       else
512       {
513         mPaintState = SelectedState;
514       }
515       break;
516     }
517     case SelectedState:
518     {
519       StopFadeOutAnimation();
520       FadeOutImage( Foreground, selectedImage );
521       FadeInImage( buttonImage, 0.0f, 0 );
522       StartFadeOutAnimation();
523       StartFadeInAnimation();
524
525       if( buttonImage || selectedImage )
526       {
527         mPaintState = SelectedUnselectedTransition;
528       }
529       else
530       {
531         mPaintState = UnselectedState;
532       }
533       break;
534     }
535     case UnselectedSelectedTransition:
536     {
537       float opacity = 1.f;
538       if( fadeOutButtonImage )
539       {
540         opacity = fadeOutButtonImage.GetCurrentOpacity();
541       }
542       StopFadeOutAnimation( false );
543       StopFadeInAnimation();
544
545       FadeOutImage( Foreground, selectedImage, 1.f - opacity );
546       FadeInImage( buttonImage, opacity, 0 );
547
548       StartFadeOutAnimation();
549       StartFadeInAnimation();
550
551       if( buttonImage || selectedImage )
552       {
553         mPaintState = SelectedUnselectedTransition;
554       }
555       else
556       {
557         mPaintState = UnselectedState;
558       }
559       break;
560     }
561     case SelectedUnselectedTransition:
562     {
563       float opacity = 0.f;
564       if( fadeOutButtonImage )
565       {
566         opacity = 1.f - fadeOutButtonImage.GetCurrentOpacity();
567       }
568       StopFadeOutAnimation( false );
569       StopFadeInAnimation();
570
571       FadeOutImage( Foreground, buttonImage, 1.f - opacity );
572       FadeInImage( selectedImage, opacity, 0 );
573
574       StartFadeOutAnimation();
575       StartFadeInAnimation();
576
577       if( buttonImage || selectedImage )
578       {
579         mPaintState = UnselectedSelectedTransition;
580       }
581       else
582       {
583         mPaintState = SelectedState;
584       }
585       break;
586     }
587     default:
588     {
589       break;
590     }
591   }
592 }
593
594 void PushButton::OnDisabled( bool disabled )
595 {
596   Actor& buttonImage = GetButtonImage();
597   Actor& selectedImage = GetSelectedImage();
598   Actor& backgroundImage = GetBackgroundImage();
599   Actor& disabledImage = GetDisabledImage();
600   Actor& disabledBackgroundImage = GetDisabledBackgroundImage();
601   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
602
603   switch( mPaintState )
604   {
605   case UnselectedState:
606   {
607     if( disabled )
608     {
609       StopFadeOutAnimation();
610       FadeOutImage( Background, backgroundImage );
611       FadeOutImage( Foreground, buttonImage );
612       FadeInImage( disabledBackgroundImage, 0.0f, 0 );
613       FadeInImage( disabledImage, 0.0f, 0 );
614       StartFadeOutAnimation();
615       StartFadeInAnimation();
616
617       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
618       {
619         mPaintState = UnselectedDisabledTransition;
620       }
621       else
622       {
623         mPaintState = DisabledUnselectedState;
624       }
625     }
626     break;
627   }
628   case SelectedState:
629   {
630     if( disabled )
631     {
632       StopFadeOutAnimation();
633       FadeOutImage( Background, backgroundImage );
634       FadeOutImage( Foreground, selectedImage );
635       FadeInImage( disabledBackgroundImage, 0.0f, 0 );
636       FadeInImage( disabledImage, 0.0f, 0 );
637       StartFadeOutAnimation();
638       StartFadeInAnimation();
639
640       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
641       {
642         mPaintState = SelectedDisabledTransition;
643       }
644       else
645       {
646         mPaintState = DisabledSelectedState;
647       }
648     }
649     break;
650   }
651   case DisabledUnselectedState:
652   {
653     if( !disabled )
654     {
655       StopFadeOutAnimation();
656       FadeOutImage( Background, disabledBackgroundImage );
657       FadeOutImage( Foreground, disabledImage );
658       FadeInImage( backgroundImage, 0.0f, 0 );
659       FadeInImage( buttonImage, 0.0f, 0 );
660       StartFadeOutAnimation();
661       StartFadeInAnimation();
662
663       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
664       {
665         mPaintState = DisabledUnselectedTransition;
666       }
667       else
668       {
669         mPaintState = UnselectedState;
670       }
671     }
672     break;
673   }
674   case DisabledSelectedState:
675   {
676     if( !disabled )
677     {
678       StopFadeOutAnimation();
679       FadeOutImage( Background, disabledBackgroundImage );
680       FadeOutImage( Foreground, disabledImage );
681       FadeInImage( backgroundImage, 0.0f, 0 );
682       FadeInImage( selectedImage, 0.0f, 0 );
683       StartFadeOutAnimation();
684       StartFadeInAnimation();
685
686       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
687       {
688         mPaintState = DisabledSelectedTransition;
689       }
690       else
691       {
692         mPaintState = SelectedState;
693       }
694     }
695     break;
696   }
697   case UnselectedSelectedTransition:
698   {
699     if( disabled )
700     {
701       float opacity = 1.f;
702       if( fadeOutButtonImage )
703       {
704         opacity = fadeOutButtonImage.GetCurrentOpacity();
705       }
706       StopFadeOutAnimation();
707       StopFadeInAnimation();
708
709       FadeOutImage( Foreground, selectedImage, 1.f - opacity );
710       FadeOutImage( Background, backgroundImage );
711
712       FadeInImage( disabledImage, 0.0f, 0 );
713       FadeInImage( disabledBackgroundImage, 0.0f, 0 );
714
715       StartFadeOutAnimation();
716       StartFadeInAnimation();
717
718       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
719       {
720         mPaintState = SelectedDisabledTransition;
721       }
722       else
723       {
724         mPaintState = DisabledSelectedState;
725       }
726     }
727     break;
728   }
729   case SelectedUnselectedTransition:
730   {
731     if( disabled )
732     {
733       float opacity = 1.f;
734       if( fadeOutButtonImage )
735       {
736         opacity = fadeOutButtonImage.GetCurrentOpacity();
737       }
738       StopFadeOutAnimation();
739       StopFadeInAnimation();
740
741       FadeOutImage( Foreground, buttonImage, 1.f - opacity );
742       FadeOutImage( Background, backgroundImage );
743
744       FadeInImage( disabledImage, 0.0f, 0);
745       FadeInImage( disabledBackgroundImage, 0.0f, 0 );
746
747       StartFadeOutAnimation();
748       StartFadeInAnimation();
749
750       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
751       {
752         mPaintState = UnselectedDisabledTransition;
753       }
754       else
755       {
756         mPaintState = DisabledUnselectedState;
757       }
758     }
759     break;
760   }
761   case UnselectedDisabledTransition:
762   {
763     if( !disabled )
764     {
765       float opacity = 1.f;
766       if( fadeOutButtonImage )
767       {
768         opacity = fadeOutButtonImage.GetCurrentOpacity();
769       }
770       StopFadeOutAnimation( false );
771       StopFadeInAnimation();
772
773       FadeOutImage( Foreground, disabledImage, 1.f - opacity );
774       FadeOutImage( Background, disabledBackgroundImage, 1.f - opacity );
775       FadeInImage( buttonImage, opacity, 0 );
776       FadeInImage( backgroundImage, opacity, 0 );
777
778       StartFadeOutAnimation();
779       StartFadeInAnimation();
780
781       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
782       {
783         mPaintState = DisabledUnselectedTransition;
784       }
785       else
786       {
787         mPaintState = UnselectedState;
788       }
789     }
790     break;
791   }
792   case DisabledUnselectedTransition:
793   {
794     if( disabled )
795     {
796       float opacity = 1.f;
797       if( fadeOutButtonImage )
798       {
799         opacity = fadeOutButtonImage.GetCurrentOpacity();
800       }
801       StopFadeOutAnimation( false );
802       StopFadeInAnimation();
803
804       FadeOutImage( Foreground, buttonImage, 1.f - opacity );
805       FadeOutImage( Background, backgroundImage, 1.f - opacity );
806       FadeInImage( disabledImage, opacity, 0 );
807       FadeInImage( disabledBackgroundImage, opacity, 0 );
808
809       StartFadeOutAnimation();
810       StartFadeInAnimation();
811
812       if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
813       {
814         mPaintState = UnselectedDisabledTransition;
815       }
816       else
817       {
818         mPaintState = DisabledUnselectedState;
819       }
820     }
821     break;
822   }
823   case SelectedDisabledTransition:
824   {
825     if( !disabled )
826     {
827       float opacity = 1.f;
828       if( fadeOutButtonImage )
829       {
830         opacity = fadeOutButtonImage.GetCurrentOpacity();
831       }
832       StopFadeOutAnimation( false );
833       StopFadeInAnimation();
834
835       FadeOutImage( Foreground, disabledImage, 1.f - opacity );
836       FadeOutImage( Background, disabledBackgroundImage, 1.f - opacity );
837       FadeInImage( selectedImage, opacity, 0 );
838       FadeInImage( backgroundImage, opacity, 0 );
839
840       StartFadeOutAnimation();
841       StartFadeInAnimation();
842
843       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
844       {
845         mPaintState = DisabledSelectedTransition;
846       }
847       else
848       {
849         mPaintState = SelectedState;
850       }
851     }
852     break;
853   }
854   case DisabledSelectedTransition:
855   {
856     if( disabled )
857     {
858       float opacity = 1.f;
859       if( fadeOutButtonImage )
860       {
861         opacity = fadeOutButtonImage.GetCurrentOpacity();
862       }
863       StopFadeOutAnimation( false );
864       StopFadeInAnimation();
865
866       FadeOutImage( Foreground, selectedImage, 1.f - opacity );
867       FadeOutImage( Background, backgroundImage, 1.f - opacity );
868       FadeInImage( disabledImage, opacity, 0 );
869       FadeInImage( disabledBackgroundImage, opacity, 0 );
870
871       StartFadeOutAnimation();
872       StartFadeInAnimation();
873
874       if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
875       {
876         mPaintState = SelectedDisabledTransition;
877       }
878       else
879       {
880         mPaintState = DisabledSelectedState;
881       }
882     }
883     break;
884   }
885   default:
886     break;
887   }
888 }
889
890 void PushButton::OnPressed()
891 {
892   Actor& selectedImage = GetSelectedImage();
893   Actor& buttonImage = GetButtonImage();
894   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
895
896   switch( mPaintState )
897   {
898     case UnselectedState:
899     {
900       StopFadeOutAnimation();
901       FadeOutImage( Foreground, buttonImage );
902       FadeInImage( selectedImage, 0.0f, 0 );
903       StartFadeOutAnimation();
904       StartFadeInAnimation();
905
906       if( buttonImage || selectedImage )
907       {
908         mPaintState = UnselectedSelectedTransition;
909       }
910       else
911       {
912         mPaintState = SelectedState;
913       }
914       break;
915     }
916     case UnselectedSelectedTransition:
917     {
918       if( !IsAutoRepeating() )
919       {
920         mPaintState = SelectedUnselectedTransition;
921       }
922       break;
923     }
924     case SelectedUnselectedTransition:
925     {
926       float opacity = 1.f;
927       if( fadeOutButtonImage )
928       {
929         opacity = fadeOutButtonImage.GetCurrentOpacity();
930       }
931       StopFadeOutAnimation( false );
932       StopFadeInAnimation();
933
934       FadeOutImage( Foreground, buttonImage, 1.f - opacity );
935       FadeInImage( selectedImage, opacity, 0 );
936
937       StartFadeOutAnimation();
938       StartFadeInAnimation();
939
940       if( buttonImage || selectedImage )
941       {
942         mPaintState = UnselectedSelectedTransition;
943       }
944       else
945       {
946         mPaintState = SelectedState;
947       }
948       break;
949     }
950     default:
951       break;
952   }
953 }
954
955 void PushButton::OnReleased()
956 {
957   Actor& selectedImage = GetSelectedImage();
958   Actor& buttonImage = GetButtonImage();
959   Actor& fadeOutButtonImage = GetFadeOutButtonImage();
960
961   switch( mPaintState )
962   {
963     case SelectedState:
964     {
965       StopFadeOutAnimation();
966       FadeOutImage( Foreground, selectedImage );
967       FadeInImage( buttonImage, 0.0f, 0 );
968       StartFadeOutAnimation();
969       StartFadeInAnimation();
970
971       if( buttonImage || selectedImage )
972       {
973         mPaintState = SelectedUnselectedTransition;
974       }
975       else
976       {
977         mPaintState = UnselectedState;
978       }
979       break;
980     }
981     case UnselectedSelectedTransition:
982     {
983       float opacity = 1.f;
984       if( fadeOutButtonImage )
985       {
986         opacity = fadeOutButtonImage.GetCurrentOpacity();
987       }
988       StopFadeOutAnimation( false );
989       StopFadeInAnimation();
990
991       FadeOutImage( Foreground, selectedImage, 1.f - opacity );
992       FadeInImage( buttonImage, opacity, 0 );
993
994       StartFadeOutAnimation();
995       StartFadeInAnimation();
996
997       if( buttonImage || selectedImage )
998       {
999         mPaintState = SelectedUnselectedTransition;
1000       }
1001       else
1002       {
1003         mPaintState = UnselectedState;
1004       }
1005       break;
1006     }
1007     default:
1008     {
1009       break;
1010     }
1011   }
1012 }
1013
1014 void PushButton::OnClicked()
1015 {
1016   OnReleased();
1017 }
1018
1019 void PushButton::OnControlSizeSet( const Vector3& targetSize )
1020 {
1021   if( targetSize != mSize )
1022   {
1023     mSize = targetSize;
1024
1025     Actor& label = GetLabel();
1026
1027     if( label )
1028     {
1029       label.SetSize( mSize );
1030     }
1031   }
1032 }
1033
1034 Vector3 PushButton::GetNaturalSize()
1035 {
1036   Vector3 size = Control::GetNaturalSize();
1037
1038   const bool widthIsZero = EqualsZero( size.width );
1039   const bool heightIsZero = EqualsZero( size.height );
1040
1041   if( widthIsZero || heightIsZero )
1042   {
1043     // If background and background not scale9 try get size from that
1044     ImageActor imageActor = FindImageActor( GetButtonImage() );
1045     if( imageActor && imageActor.GetStyle() != ImageActor::STYLE_NINE_PATCH )
1046     {
1047       Vector3 imageSize = imageActor.GetNaturalSize();
1048
1049       if( widthIsZero )
1050       {
1051         size.width = imageSize.width;
1052       }
1053
1054       if( heightIsZero )
1055       {
1056         size.height = imageSize.height;
1057       }
1058     }
1059
1060     ImageActor backgroundImageActor = FindImageActor( GetBackgroundImage() );
1061     if( backgroundImageActor && backgroundImageActor.GetStyle() != ImageActor::STYLE_NINE_PATCH )
1062     {
1063       Vector3 imageSize = backgroundImageActor.GetNaturalSize();
1064
1065       if( widthIsZero )
1066       {
1067         size.width = std::max( size.width, imageSize.width );
1068       }
1069
1070       if( heightIsZero )
1071       {
1072         size.height = std::max( size.height, imageSize.height );
1073       }
1074     }
1075
1076     // If label, test against it's size
1077     Toolkit::TextView textView = Toolkit::TextView::DownCast( GetLabel() );
1078     if( textView )
1079     {
1080       Vector3 textViewSize = textView.GetNaturalSize();
1081
1082       if( widthIsZero )
1083       {
1084         size.width = std::max( size.width, textViewSize.width + TEXT_PADDING * 2.0f );
1085       }
1086
1087       if( heightIsZero )
1088       {
1089         size.height = std::max( size.height, textViewSize.height + TEXT_PADDING * 2.0f );
1090       }
1091     }
1092   }
1093
1094   return size;
1095 }
1096
1097 Actor& PushButton::GetFadeOutButtonImage()
1098 {
1099   return mFadeOutButtonContent;
1100 }
1101
1102 Actor& PushButton::GetFadeOutBackgroundImage()
1103 {
1104   return mFadeOutBackgroundContent;
1105 }
1106
1107 void PushButton::AddToFadeInAnimation( const Actor& actor )
1108 {
1109   if( !mFadeInAnimation )
1110   {
1111     mFadeInAnimation = Dali::Animation::New( GetAnimationTime() );
1112   }
1113
1114   mFadeInAnimation.OpacityTo( actor, 1.f );
1115 }
1116
1117 void PushButton::StartFadeInAnimation()
1118 {
1119   if( mFadeInAnimation )
1120   {
1121     mFadeInAnimation.FinishedSignal().Connect( this, &PushButton::FadeInAnimationFinished );
1122     mFadeInAnimation.Play();
1123   }
1124 }
1125
1126 void PushButton::StopFadeInAnimation()
1127 {
1128   if( mFadeInAnimation )
1129   {
1130     mFadeInAnimation.Clear();
1131     mFadeInAnimation.Reset();
1132   }
1133 }
1134
1135 void PushButton::AddToFadeOutAnimation( const Actor& actor )
1136 {
1137   if( !mFadeOutAnimation )
1138   {
1139     mFadeOutAnimation = Dali::Animation::New( GetAnimationTime() );
1140   }
1141
1142   mFadeOutAnimation.OpacityTo( actor, 0.f );
1143 }
1144
1145 void PushButton::StartFadeOutAnimation()
1146 {
1147   if( mFadeOutAnimation )
1148   {
1149     mFadeOutAnimation.FinishedSignal().Connect( this, &PushButton::FadeOutAnimationFinished );
1150     mFadeOutAnimation.Play();
1151   }
1152 }
1153
1154 void PushButton::StopFadeOutAnimation( bool remove )
1155 {
1156   if( mFadeOutAnimation )
1157   {
1158     mFadeOutAnimation.Clear();
1159     mFadeOutAnimation.Reset();
1160   }
1161
1162   if( remove )
1163   {
1164     Actor& fadeOutButtonImage = GetFadeOutButtonImage();
1165     Actor& fadeOutBackgroundImage = GetFadeOutBackgroundImage();
1166
1167     if( fadeOutButtonImage && fadeOutButtonImage.GetParent() )
1168     {
1169       fadeOutButtonImage.GetParent().Remove( fadeOutButtonImage );
1170     }
1171
1172     if( fadeOutBackgroundImage && fadeOutBackgroundImage.GetParent() )
1173     {
1174       fadeOutBackgroundImage.GetParent().Remove( fadeOutBackgroundImage );
1175     }
1176
1177     fadeOutButtonImage.Reset();
1178     fadeOutBackgroundImage.Reset();
1179   }
1180 }
1181
1182 void PushButton::FadeInImage( Actor& image, float opacity, int priority )
1183 {
1184   if( image )
1185   {
1186     image.SetOpacity( opacity );
1187     if( !image.GetParent() )
1188     {
1189       if( priority > -1 )
1190       {
1191         Self().Insert( priority, image );
1192       }
1193       else
1194       {
1195         Self().Add( image );
1196       }
1197     }
1198
1199     AddToFadeInAnimation( image );
1200   }
1201 }
1202
1203 void PushButton::FadeOutImage( ImageLayer layer, Actor& image, float opacity )
1204 {
1205   if( image )
1206   {
1207     Actor& fadeOutButtonImage = GetFadeOutButtonImage();
1208     Actor& fadeOutBackgroundImage = GetFadeOutBackgroundImage();
1209
1210     Actor& actorLayer = ( ( Background == layer ) ? fadeOutBackgroundImage : fadeOutButtonImage );
1211
1212     actorLayer = image;
1213     actorLayer.SetOpacity( opacity );
1214
1215     AddToFadeOutAnimation( actorLayer );
1216   }
1217 }
1218
1219 void PushButton::FadeOutAnimationFinished( Dali::Animation& source )
1220 {
1221   switch( mPaintState )
1222   {
1223     case UnselectedSelectedTransition:
1224     {
1225       mPaintState = SelectedState;
1226       break;
1227     }
1228     case SelectedUnselectedTransition:
1229     {
1230       mPaintState = UnselectedState;
1231       break;
1232     }
1233     case UnselectedDisabledTransition:
1234     {
1235       mPaintState = DisabledUnselectedState;
1236       break;
1237     }
1238     case DisabledUnselectedTransition:
1239     {
1240       mPaintState = UnselectedState;
1241       break;
1242     }
1243     case SelectedDisabledTransition:
1244     {
1245       mPaintState = DisabledSelectedState;
1246       break;
1247     }
1248     case DisabledSelectedTransition:
1249     {
1250       mPaintState = SelectedState;
1251       break;
1252     }
1253     default:
1254     {
1255       break;
1256     }
1257   }
1258
1259   StopFadeOutAnimation();
1260 }
1261
1262 void PushButton::FadeInAnimationFinished( Dali::Animation& source )
1263 {
1264   switch( mPaintState )
1265   {
1266     case UnselectedSelectedTransition:
1267     {
1268       mPaintState = SelectedState;
1269       break;
1270     }
1271     case SelectedUnselectedTransition:
1272     {
1273       mPaintState = UnselectedState;
1274       break;
1275     }
1276     case UnselectedDisabledTransition:
1277     {
1278       mPaintState = DisabledUnselectedState;
1279       break;
1280     }
1281     case DisabledUnselectedTransition:
1282     {
1283       mPaintState = UnselectedState;
1284       break;
1285     }
1286     case SelectedDisabledTransition:
1287     {
1288       mPaintState = DisabledSelectedState;
1289       break;
1290     }
1291     case DisabledSelectedTransition:
1292     {
1293       mPaintState = SelectedState;
1294       break;
1295     }
1296     default:
1297     {
1298       break;
1299     }
1300   }
1301
1302   StopFadeInAnimation();
1303 }
1304
1305 } // namespace Internal
1306
1307 } // namespace Toolkit
1308
1309 } // namespace Dali