uifw/AvKon/src/AknIndicatorContainer.cpp
branchRCL_3
changeset 9 aabf2c525e0f
parent 0 2f259fa3e83a
child 10 9f56a4e1b8ab
equal deleted inserted replaced
4:8ca85d2f0db7 9:aabf2c525e0f
   110     TPoint                      iPositionRelativeToScreen;
   110     TPoint                      iPositionRelativeToScreen;
   111     CAknIndicatorDataObserver*  iDataObserver;
   111     CAknIndicatorDataObserver*  iDataObserver;
   112     TInt                        iFlags;
   112     TInt                        iFlags;
   113     TBool                       iIncallBubbleDisabled;
   113     TBool                       iIncallBubbleDisabled;
   114     TBool                       iIsForeground;
   114     TBool                       iIsForeground;
   115     TBool                       iIsActiveIdle;
   115     CEikStatusPaneBase*         iStatusPane;
       
   116     MTouchFeedback*             iFeedback;
   116     };
   117     };
   117 
   118 
   118 
   119 
   119 CAknIndicatorContainerExtension* CAknIndicatorContainerExtension::NewL(
   120 CAknIndicatorContainerExtension* CAknIndicatorContainerExtension::NewL(
   120     CAknIndicatorContainer* aIndicatorContainer )
   121     CAknIndicatorContainer* aIndicatorContainer )
   138         iDataObserver =
   139         iDataObserver =
   139             new (ELeave) CAknIndicatorDataObserver( iIndicatorContainer );
   140             new (ELeave) CAknIndicatorDataObserver( iIndicatorContainer );
   140         }
   141         }
   141 
   142 
   142     TRAP_IGNORE( CCoeEnv::Static()->AddMessageMonitorObserverL( *this ) );
   143     TRAP_IGNORE( CCoeEnv::Static()->AddMessageMonitorObserverL( *this ) );
       
   144     
       
   145     iFeedback = MTouchFeedback::Instance();
       
   146     if ( iFeedback &&
       
   147          iIndicatorContainer->iIndicatorContext ==
       
   148                  CAknIndicatorContainer::EUniversalIndicators )
       
   149         {
       
   150         // Tactile feedback is only used for universal indicator pane.
       
   151         CFeedbackSpec* fbSpec = CFeedbackSpec::New();
       
   152         if ( fbSpec )
       
   153             {
       
   154             fbSpec->AddFeedback( ETouchEventStylusDown,
       
   155                                  ETouchFeedbackSensitiveButton );
       
   156             fbSpec->AddFeedback( ETouchEventStylusUp,
       
   157                                  ETouchFeedbackSensitiveButton,
       
   158                                  ETouchFeedbackVibra );
       
   159 
       
   160             iFeedback->SetFeedbackArea( iIndicatorContainer,
       
   161                                         0,
       
   162                                         iIndicatorContainer->Rect(),
       
   163                                         fbSpec );
       
   164             delete fbSpec; 
       
   165             }  
       
   166         }
   143     }
   167     }
   144 
   168 
   145 
   169 
   146 CAknIndicatorContainerExtension::CAknIndicatorContainerExtension(
   170 CAknIndicatorContainerExtension::CAknIndicatorContainerExtension(
   147     CAknIndicatorContainer* aIndicatorContainer )
   171     CAknIndicatorContainer* aIndicatorContainer )
   148     : iIndicatorContainer( aIndicatorContainer )
   172     : iIndicatorContainer( aIndicatorContainer )
   149     {
   173     {
   150     iSmallStatusPaneLayout      = AknStatuspaneUtils::SmallLayoutActive();
   174     iSmallStatusPaneLayout      = AknStatuspaneUtils::SmallLayoutActive();
   151     iIncallBubbleAllowedInUsual = ETrue;
   175     iIncallBubbleAllowedInUsual = ETrue;
   152     iIsForeground = static_cast<CAknAppUi*>( CEikonEnv::Static()->EikAppUi() )->IsForeground();
   176     iIsForeground = static_cast<CAknAppUi*>( CEikonEnv::Static()->EikAppUi() )->IsForeground();
   153     iIsActiveIdle = AknStatuspaneUtils::IsActiveIdle();
   177     iStatusPane = CEikStatusPaneBase::Current();
   154     }
   178     }
   155 
   179 
   156 
   180 
   157 CAknIndicatorContainerExtension::~CAknIndicatorContainerExtension()
   181 CAknIndicatorContainerExtension::~CAknIndicatorContainerExtension()
   158     {
   182     {
   159     delete iPictoInterface;
   183     delete iPictoInterface;
   160     delete iDataObserver;
   184     delete iDataObserver;
   161 
   185 
   162     CCoeEnv::Static()->RemoveMessageMonitorObserver( *this );
   186     CCoeEnv::Static()->RemoveMessageMonitorObserver( *this );
       
   187     
       
   188     MTouchFeedback* feedback = MTouchFeedback::Instance();
       
   189     if ( feedback )
       
   190         {
       
   191         feedback->RemoveFeedbackForControl( iIndicatorContainer );
       
   192         }
   163     }
   193     }
   164 
   194 
   165 
   195 
   166 void CAknIndicatorContainerExtension::DrawPictographArea()
   196 void CAknIndicatorContainerExtension::DrawPictographArea()
   167     {
   197     {
   607         {
   637         {
   608         SetContainerWindowNonFading(
   638         SetContainerWindowNonFading(
   609             AknStatuspaneUtils::ExtendedStaconPaneActive() ||
   639             AknStatuspaneUtils::ExtendedStaconPaneActive() ||
   610             ( AknStatuspaneUtils::StaconPaneActive() &&
   640             ( AknStatuspaneUtils::StaconPaneActive() &&
   611               !AknStatuspaneUtils::IdleLayoutActive() ) );
   641               !AknStatuspaneUtils::IdleLayoutActive() ) );
       
   642         
       
   643         if ( iExtension && iExtension->iFeedback )
       
   644             {
       
   645             iExtension->iFeedback->ChangeFeedbackArea( this,
       
   646                                                        0,
       
   647                                                        Rect() );
       
   648             }
   612         }
   649         }
   613 
   650 
   614     AknsUtils::RegisterControlPosition( this );
   651     AknsUtils::RegisterControlPosition( this );
   615     if ( iExtension && DrawableWindow() )
   652     if ( iExtension && DrawableWindow() )
   616         {
   653         {
   826     }
   863     }
   827 
   864 
   828 
   865 
   829 EXPORT_C void CAknIndicatorContainer::Draw( const TRect& /*aRect*/ ) const
   866 EXPORT_C void CAknIndicatorContainer::Draw( const TRect& /*aRect*/ ) const
   830     {
   867     {
   831     if ( iExtension->iIsActiveIdle )
   868     if ( iExtension->iStatusPane && 
       
   869          iExtension->iStatusPane->IsTransparent() )
   832         {
   870         {
   833         return;
   871         return;
   834         }
   872         }
   835 
   873 
   836     // Don't allow normal background drawing if
   874     // Don't allow normal background drawing if
  1033 EXPORT_C void CAknIndicatorContainer::HandlePointerEventL(
  1071 EXPORT_C void CAknIndicatorContainer::HandlePointerEventL(
  1034     const TPointerEvent& aPointerEvent )
  1072     const TPointerEvent& aPointerEvent )
  1035     {
  1073     {
  1036     CAknControl::HandlePointerEventL( aPointerEvent );
  1074     CAknControl::HandlePointerEventL( aPointerEvent );
  1037 
  1075 
  1038     if ( AknLayoutUtils::PenEnabled() && iExtension )
  1076     // Pointer events are only handled in the universal indicator container.
       
  1077     if ( iExtension && iIndicatorContext == EUniversalIndicators )
  1039         {
  1078         {
  1040         TRect rect( Rect() );
  1079         TRect rect( Rect() );
  1041 
  1080 
  1042         // The indicator popup is launched if both the down and up
  1081         // The indicator popup is launched if both the down and up
  1043         // pointer events happen in the indicator pane area.
  1082         // pointer events happen in the indicator pane area.
  1049                 if ( rect.Contains( aPointerEvent.iPosition ) )
  1088                 if ( rect.Contains( aPointerEvent.iPosition ) )
  1050                     {
  1089                     {
  1051                     // set flag that down was inside indicator
  1090                     // set flag that down was inside indicator
  1052                     iExtension->iFlags |=
  1091                     iExtension->iFlags |=
  1053                         EAknIndicatorsButton1DownInIndicatorPaneRect;
  1092                         EAknIndicatorsButton1DownInIndicatorPaneRect;
  1054 
       
  1055                     if ( iIndicatorContext == EUniversalIndicators &&
       
  1056                          iExtension->iFlags & EAknIndicatorsButton1DownInIndicatorPaneRect
       
  1057                           )
       
  1058                         {
       
  1059                         MTouchFeedback* feedback = MTouchFeedback::Instance();
       
  1060 
       
  1061                         if ( feedback )
       
  1062                             {
       
  1063                             feedback->InstantFeedback( this, ETouchFeedbackSensitiveButton );
       
  1064                             }
       
  1065                         }
       
  1066                     }
  1093                     }
  1067                 break;
  1094                 break;
  1068                 }
  1095                 }
  1069 
  1096 
  1070             case TPointerEvent::EButton1Up:
  1097             case TPointerEvent::EButton1Up:
  1071                 {
  1098                 {
  1072                 // Currently the small digital clock pane and universal
  1099                 // Currently the small digital clock pane, universal
  1073                 // indicator pane are regarded as one touch responsive area from
  1100                 // indicator pane and battery pane (in status pane layouts
  1074                 // which the universal indicator popup should open on tap,
  1101                 // where it's adjacent to universal indicator or digital
  1075                 // so upon pointer up event it must be checked here if
  1102                 // clock pane) are regarded as one touch responsive
  1076                 // the down event happened inside this control, but the up event
  1103                 // area from which the universal indicator popup should
  1077                 // inside digital clock pane area.
  1104                 // open on tap, so upon pointer up event it must be checked
       
  1105                 // here if the down event happened inside this control,
       
  1106                 // but the up event inside digital clock or battery pane area.
  1078                 CEikStatusPaneBase* sp = CEikStatusPaneBase::Current();
  1107                 CEikStatusPaneBase* sp = CEikStatusPaneBase::Current();
  1079                 TRect clockRect( 0, 0, 0, 0 );
  1108                 TBool pointerUpInClockArea( EFalse );
       
  1109                 TBool pointerUpInBatteryArea( EFalse );
  1080 
  1110 
  1081                 if ( sp )
  1111                 if ( sp )
  1082                     {
  1112                     {
  1083                     CCoeControl* clockPane = sp->ContainerControlL(
  1113                     CCoeControl* clockPane = sp->ContainerControlL(
  1084                         TUid::Uid( EEikStatusPaneUidDigitalClock ) );
  1114                         TUid::Uid( EEikStatusPaneUidDigitalClock ) );
  1085                     if ( clockPane )
  1115                     if ( clockPane )
  1086                         {
  1116                         {
  1087                         clockRect = TRect( clockPane->PositionRelativeToScreen(),
  1117                         TRect clockRect( clockPane->PositionRelativeToScreen(),
  1088                                            clockPane->Size() );
  1118                                          clockPane->Size() );
       
  1119                         pointerUpInClockArea =
       
  1120                             clockRect.Contains( aPointerEvent.iParentPosition );
  1089                         }
  1121                         }
       
  1122                     
       
  1123                     if ( !AknStatuspaneUtils::ExtendedFlatLayoutActive() )
       
  1124                         {
       
  1125                         CCoeControl* batteryPane = sp->ContainerControlL(
       
  1126                             TUid::Uid( EEikStatusPaneUidBattery ) );
       
  1127                         if ( batteryPane )
       
  1128                             {
       
  1129                             TRect batteryRect(
       
  1130                                 batteryPane->PositionRelativeToScreen(),
       
  1131                                 batteryPane->Size() );
       
  1132                             pointerUpInBatteryArea =
       
  1133                                 batteryRect.Contains( aPointerEvent.iParentPosition );
       
  1134                             }
       
  1135                         }
  1090                     }
  1136                     }
  1091 
  1137 
  1092                 // if indicator's rect contains pointer up position
  1138                 // if indicator's rect contains pointer up position
  1093                 if ( iIndicatorContext == EUniversalIndicators &&
  1139                 if ( ( iExtension->iFlags & EAknIndicatorsButton1DownInIndicatorPaneRect &&
  1094                      ( ( iExtension->iFlags & EAknIndicatorsButton1DownInIndicatorPaneRect &&
       
  1095                          rect.Contains( aPointerEvent.iPosition ) ) ||
  1140                          rect.Contains( aPointerEvent.iPosition ) ) ||
  1096                        clockRect.Contains( aPointerEvent.iParentPosition ) ) )
  1141                        pointerUpInClockArea ||
  1097                     {
  1142                        pointerUpInBatteryArea )
  1098                     MTouchFeedback* feedback = MTouchFeedback::Instance();
  1143                     {
  1099                     if ( feedback )
  1144                     if ( iExtension->iFeedback &&
       
  1145                          ( pointerUpInClockArea || pointerUpInBatteryArea ) )
  1100                         {
  1146                         {
  1101                         feedback->InstantFeedback( this,
  1147                         // The pointer down was received in another control,
  1102                                                    ETouchFeedbackSensitiveButton,
  1148                         // so the tactile feedback must be given directly.
  1103                                                    ETouchFeedbackVibra,
  1149                         iExtension->iFeedback->InstantFeedback(
  1104                                                    aPointerEvent );
  1150                             this,
       
  1151                             ETouchFeedbackSensitiveButton,
       
  1152                             ETouchFeedbackVibra,
       
  1153                             aPointerEvent );
  1105                         }
  1154                         }
       
  1155 
  1106                     CAknSmallIndicator* indicatorNotifier = CAknSmallIndicator::NewLC( TUid::Uid( 0 ) );
  1156                     CAknSmallIndicator* indicatorNotifier = CAknSmallIndicator::NewLC( TUid::Uid( 0 ) );
  1107                     indicatorNotifier->HandleIndicatorTapL();
  1157                     indicatorNotifier->HandleIndicatorTapL();
  1108                     CleanupStack::PopAndDestroy( indicatorNotifier );
  1158                     CleanupStack::PopAndDestroy( indicatorNotifier );
  1109                     }
  1159                     }
       
  1160 
  1110                 // Up happened, reset button down flag
  1161                 // Up happened, reset button down flag
  1111                 iExtension->iFlags &=
  1162                 iExtension->iFlags &=
  1112                     ( ~EAknIndicatorsButton1DownInIndicatorPaneRect );
  1163                     ( ~EAknIndicatorsButton1DownInIndicatorPaneRect );
  1113                 break;
  1164                 break;
  1114                 }
  1165                 }