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 { |
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 } |