uifw/AvKon/src/AknIndicatorContainer.cpp
branchRCL_3
changeset 9 aabf2c525e0f
parent 0 2f259fa3e83a
child 10 9f56a4e1b8ab
--- a/uifw/AvKon/src/AknIndicatorContainer.cpp	Fri Feb 19 23:04:46 2010 +0200
+++ b/uifw/AvKon/src/AknIndicatorContainer.cpp	Fri Mar 12 15:43:43 2010 +0200
@@ -112,7 +112,8 @@
     TInt                        iFlags;
     TBool                       iIncallBubbleDisabled;
     TBool                       iIsForeground;
-    TBool                       iIsActiveIdle;
+    CEikStatusPaneBase*         iStatusPane;
+    MTouchFeedback*             iFeedback;
     };
 
 
@@ -140,6 +141,29 @@
         }
 
     TRAP_IGNORE( CCoeEnv::Static()->AddMessageMonitorObserverL( *this ) );
+    
+    iFeedback = MTouchFeedback::Instance();
+    if ( iFeedback &&
+         iIndicatorContainer->iIndicatorContext ==
+                 CAknIndicatorContainer::EUniversalIndicators )
+        {
+        // Tactile feedback is only used for universal indicator pane.
+        CFeedbackSpec* fbSpec = CFeedbackSpec::New();
+        if ( fbSpec )
+            {
+            fbSpec->AddFeedback( ETouchEventStylusDown,
+                                 ETouchFeedbackSensitiveButton );
+            fbSpec->AddFeedback( ETouchEventStylusUp,
+                                 ETouchFeedbackSensitiveButton,
+                                 ETouchFeedbackVibra );
+
+            iFeedback->SetFeedbackArea( iIndicatorContainer,
+                                        0,
+                                        iIndicatorContainer->Rect(),
+                                        fbSpec );
+            delete fbSpec; 
+            }  
+        }
     }
 
 
@@ -150,7 +174,7 @@
     iSmallStatusPaneLayout      = AknStatuspaneUtils::SmallLayoutActive();
     iIncallBubbleAllowedInUsual = ETrue;
     iIsForeground = static_cast<CAknAppUi*>( CEikonEnv::Static()->EikAppUi() )->IsForeground();
-    iIsActiveIdle = AknStatuspaneUtils::IsActiveIdle();
+    iStatusPane = CEikStatusPaneBase::Current();
     }
 
 
@@ -160,6 +184,12 @@
     delete iDataObserver;
 
     CCoeEnv::Static()->RemoveMessageMonitorObserver( *this );
+    
+    MTouchFeedback* feedback = MTouchFeedback::Instance();
+    if ( feedback )
+        {
+        feedback->RemoveFeedbackForControl( iIndicatorContainer );
+        }
     }
 
 
@@ -609,6 +639,13 @@
             AknStatuspaneUtils::ExtendedStaconPaneActive() ||
             ( AknStatuspaneUtils::StaconPaneActive() &&
               !AknStatuspaneUtils::IdleLayoutActive() ) );
+        
+        if ( iExtension && iExtension->iFeedback )
+            {
+            iExtension->iFeedback->ChangeFeedbackArea( this,
+                                                       0,
+                                                       Rect() );
+            }
         }
 
     AknsUtils::RegisterControlPosition( this );
@@ -828,7 +865,8 @@
 
 EXPORT_C void CAknIndicatorContainer::Draw( const TRect& /*aRect*/ ) const
     {
-    if ( iExtension->iIsActiveIdle )
+    if ( iExtension->iStatusPane && 
+         iExtension->iStatusPane->IsTransparent() )
         {
         return;
         }
@@ -1035,7 +1073,8 @@
     {
     CAknControl::HandlePointerEventL( aPointerEvent );
 
-    if ( AknLayoutUtils::PenEnabled() && iExtension )
+    // Pointer events are only handled in the universal indicator container.
+    if ( iExtension && iIndicatorContext == EUniversalIndicators )
         {
         TRect rect( Rect() );
 
@@ -1051,32 +1090,23 @@
                     // set flag that down was inside indicator
                     iExtension->iFlags |=
                         EAknIndicatorsButton1DownInIndicatorPaneRect;
-
-                    if ( iIndicatorContext == EUniversalIndicators &&
-                         iExtension->iFlags & EAknIndicatorsButton1DownInIndicatorPaneRect
-                          )
-                        {
-                        MTouchFeedback* feedback = MTouchFeedback::Instance();
-
-                        if ( feedback )
-                            {
-                            feedback->InstantFeedback( this, ETouchFeedbackSensitiveButton );
-                            }
-                        }
                     }
                 break;
                 }
 
             case TPointerEvent::EButton1Up:
                 {
-                // Currently the small digital clock pane and universal
-                // indicator pane are regarded as one touch responsive area from
-                // which the universal indicator popup should open on tap,
-                // so upon pointer up event it must be checked here if
-                // the down event happened inside this control, but the up event
-                // inside digital clock pane area.
+                // Currently the small digital clock pane, universal
+                // indicator pane and battery pane (in status pane layouts
+                // where it's adjacent to universal indicator or digital
+                // clock pane) are regarded as one touch responsive
+                // area from which the universal indicator popup should
+                // open on tap, so upon pointer up event it must be checked
+                // here if the down event happened inside this control,
+                // but the up event inside digital clock or battery pane area.
                 CEikStatusPaneBase* sp = CEikStatusPaneBase::Current();
-                TRect clockRect( 0, 0, 0, 0 );
+                TBool pointerUpInClockArea( EFalse );
+                TBool pointerUpInBatteryArea( EFalse );
 
                 if ( sp )
                     {
@@ -1084,29 +1114,50 @@
                         TUid::Uid( EEikStatusPaneUidDigitalClock ) );
                     if ( clockPane )
                         {
-                        clockRect = TRect( clockPane->PositionRelativeToScreen(),
-                                           clockPane->Size() );
+                        TRect clockRect( clockPane->PositionRelativeToScreen(),
+                                         clockPane->Size() );
+                        pointerUpInClockArea =
+                            clockRect.Contains( aPointerEvent.iParentPosition );
+                        }
+                    
+                    if ( !AknStatuspaneUtils::ExtendedFlatLayoutActive() )
+                        {
+                        CCoeControl* batteryPane = sp->ContainerControlL(
+                            TUid::Uid( EEikStatusPaneUidBattery ) );
+                        if ( batteryPane )
+                            {
+                            TRect batteryRect(
+                                batteryPane->PositionRelativeToScreen(),
+                                batteryPane->Size() );
+                            pointerUpInBatteryArea =
+                                batteryRect.Contains( aPointerEvent.iParentPosition );
+                            }
                         }
                     }
 
                 // if indicator's rect contains pointer up position
-                if ( iIndicatorContext == EUniversalIndicators &&
-                     ( ( iExtension->iFlags & EAknIndicatorsButton1DownInIndicatorPaneRect &&
+                if ( ( iExtension->iFlags & EAknIndicatorsButton1DownInIndicatorPaneRect &&
                          rect.Contains( aPointerEvent.iPosition ) ) ||
-                       clockRect.Contains( aPointerEvent.iParentPosition ) ) )
+                       pointerUpInClockArea ||
+                       pointerUpInBatteryArea )
                     {
-                    MTouchFeedback* feedback = MTouchFeedback::Instance();
-                    if ( feedback )
+                    if ( iExtension->iFeedback &&
+                         ( pointerUpInClockArea || pointerUpInBatteryArea ) )
                         {
-                        feedback->InstantFeedback( this,
-                                                   ETouchFeedbackSensitiveButton,
-                                                   ETouchFeedbackVibra,
-                                                   aPointerEvent );
+                        // The pointer down was received in another control,
+                        // so the tactile feedback must be given directly.
+                        iExtension->iFeedback->InstantFeedback(
+                            this,
+                            ETouchFeedbackSensitiveButton,
+                            ETouchFeedbackVibra,
+                            aPointerEvent );
                         }
+
                     CAknSmallIndicator* indicatorNotifier = CAknSmallIndicator::NewLC( TUid::Uid( 0 ) );
                     indicatorNotifier->HandleIndicatorTapL();
                     CleanupStack::PopAndDestroy( indicatorNotifier );
                     }
+
                 // Up happened, reset button down flag
                 iExtension->iFlags &=
                     ( ~EAknIndicatorsButton1DownInIndicatorPaneRect );