uifw/EikStd/dlgsrc/EIKDPAGE.CPP
branchRCL_3
changeset 23 3d340a0166ff
parent 16 71dd06cfe933
child 25 941195f2d488
--- a/uifw/EikStd/dlgsrc/EIKDPAGE.CPP	Tue Apr 27 16:55:05 2010 +0300
+++ b/uifw/EikStd/dlgsrc/EIKDPAGE.CPP	Tue May 11 16:27:42 2010 +0300
@@ -99,15 +99,25 @@
     static CDialogPageExtension* NewL();
     ~CDialogPageExtension();
 
-    void Feedback( CEikDialogPage* aControl, TTouchLogicalFeedback aFeedback ) const;
+    void Feedback( const CEikDialogPage& aControl,
+                   TTouchLogicalFeedback aFeedback ) const;
+
     /**
-     * Produces vibra-only feedback. Event filtering by pointer event is used..
+     * Produces vibra-only feedback.
+     * Event filtering by pointer event is used.
      */
-    void SilentFeedback( CEikDialogPage* aDPage, 
+    void SilentFeedback( const CEikDialogPage& aDPage, 
                          TTouchLogicalFeedback aFeedback, 
                          const TPointerEvent& aPointerEvent ) const;
-    
-    void HandleFormFeedback( CEikDialogPage* aControl, const TPointerEvent& aPointerEvent, TInt aTouchedLineIndex, TInt aCurrentLine );
+
+    /**
+     * Produces feedback in cases where the captioned control itself
+     * doesn't do it.
+     */
+    void HandleFormFeedback( const CEikDialogPage& aDPage,
+                             const TPointerEvent& aPointerEvent,
+                             TInt aTouchedLineIndex,
+                             TInt aCurrentLine );
 
 protected:  
     void ConstructL();
@@ -141,7 +151,6 @@
     TInt iLastTouchedLine;
     TPoint iSynchronizedPosition;
     TBool iScrolling;
-    TBool iScrolled;
     TBool iInitialLayoutDone;
     TBool iSetInitialFocusDone;
     TBool iHandlingResourceChange;
@@ -160,6 +169,8 @@
     TBool iUsesSingleClick;
     // It is used to distinguish if the focus item has changed.
     TBool iFocusItemChanged;
+    // Boolean to check if form was scrolling on button down
+    TBool iWasScrolling;
     };
 
 CDialogPageExtension::CDialogPageExtension()
@@ -201,14 +212,18 @@
     }
 
 void CDialogPageExtension::HandleFormFeedback(
-    CEikDialogPage* aDPage,
+    const CEikDialogPage& aDPage,
     const TPointerEvent& aPointerEvent,
     TInt aTouchedLineIndex,
     TInt aCurrentLine )
     {
+    CEikCaptionedControl* firstLine( aDPage.LineOnPageOrNull( 0 ) );
+    TBool viewMode( !aDPage.IsEditable() );
+    
     // note, that iFormControl is checked in Feedback()
     if ( aPointerEvent.iType == TPointerEvent::EButton1Down &&
-        aCurrentLine != aTouchedLineIndex && aDPage->LineOnPageOrNull( 0 ) ) 
+         aCurrentLine != aTouchedLineIndex &&
+         firstLine ) 
         {
         // feedback for edit/view mode form, when non-focused line is clicked
         // feedback for focused item is responsibility of the item
@@ -219,58 +234,67 @@
             }
         iFocusItemChanged = ETrue;
         }
-
-    else if ( aPointerEvent.iType == TPointerEvent::EButton1Down &&
-        aTouchedLineIndex == aCurrentLine && aDPage->LineOnPageOrNull( 0 ) )
+    else if ( viewMode && firstLine )
         {
-        // Feedback for view mode form, when focused item is
-        // clicked. Basically same case as for msk simulation later on
-        // the function, but on pointer
-        // down. iExtension->iFocusedClicked is not valid here, since
-        // it can't be known in this phase whether user drags pointer
-        // away.
-        Feedback( aDPage, ETouchFeedbackList );
-        iFocusItemChanged = EFalse;
-        }
-
-    else if ( aPointerEvent.iType == TPointerEvent::EButton1Up &&
-            aDPage->LineOnPageOrNull( 0 ) )
-        {// when focus changed, it should not send feedback on up event.
-        //when up event comes, aTouchedLineIndex always equal to aCurrentLine
-        if ( !iFocusItemChanged )
+        if ( aPointerEvent.iType == TPointerEvent::EButton1Down &&
+             aTouchedLineIndex == aCurrentLine )
             {
-            SilentFeedback( aDPage, ETouchFeedbackList, aPointerEvent );
+            // Feedback for view mode form, when focused item is
+            // clicked. Basically same case as for msk simulation later on
+            // the function, but on pointer
+            // down. iExtension->iFocusedClicked is not valid here, since
+            // it can't be known in this phase whether user drags pointer
+            // away.
+            Feedback( aDPage, ETouchFeedbackList );
+            iFocusItemChanged = EFalse;
+            }
+        else if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+            {
+            // When focus changed, it should not send feedback on up event.
+            // When up event comes, aTouchedLineIndex always equal to
+            // aCurrentLine.
+            if ( !iFocusItemChanged )
+                {
+                SilentFeedback( aDPage, ETouchFeedbackList, aPointerEvent );
+                }
             }
         }
     }
 
-void CDialogPageExtension::Feedback( CEikDialogPage* aDPage, 
+
+void CDialogPageExtension::Feedback( const CEikDialogPage& aDPage, 
                                      TTouchLogicalFeedback aFeedback ) const
     {
-    if ( aDPage
-        && aDPage->IsForm()
-        && iFeedback
-        && !aDPage->IsDimmed()
-        && aDPage->IsVisible() )
+    if ( iFeedback &&
+         aDPage.IsForm() &&
+         !aDPage.IsDimmed() &&
+         aDPage.IsVisible() && 
+         aDPage.IsEditable() )
         {
         iFeedback->InstantFeedback( aFeedback );
         }
     }
 
-void CDialogPageExtension::SilentFeedback( CEikDialogPage* aDPage, 
-                                           TTouchLogicalFeedback aFeedback, 
-                                           const TPointerEvent& aPointerEvent ) const
+
+void CDialogPageExtension::SilentFeedback(
+    const CEikDialogPage& aDPage,
+    TTouchLogicalFeedback aFeedback,
+    const TPointerEvent& aPointerEvent ) const
     {
-    if ( aDPage
-        && aDPage->IsForm()
-        && iFeedback
-        && !aDPage->IsDimmed()
-        && aDPage->IsVisible() )
+    if ( iFeedback &&
+         aDPage.IsForm() &&
+         !aDPage.IsDimmed() &&
+         aDPage.IsVisible() &&
+         aDPage.IsEditable() )
         {
-        iFeedback->InstantFeedback( aDPage, aFeedback, ETouchFeedbackVibra, aPointerEvent );
+        iFeedback->InstantFeedback( &aDPage,
+                                    aFeedback,
+                                    ETouchFeedbackVibra,
+                                    aPointerEvent );
         }
     }
 
+
 class CAknPaneScroll : public CBase
 {
 public:
@@ -846,12 +870,10 @@
             switch (aFocusNavigationMode)
                 {
                 case ECyclic:
-                    iExtension->iScrolled = ETrue;                    
                     response=HandleCyclicFocusNavigationKeyL(aKeyEvent);
                     break;
                     
                 case ENonCyclic:
-                    iExtension->iScrolled = ETrue;                    
                     response=HandleNonCyclicFocusNavigationKeyL(aKeyEvent);
                     break;
                     
@@ -1069,7 +1091,7 @@
     TInt oldLine = iCurrentLine;
     
     if( aLine != iCurrentLine )
-        (*iLines)[iCurrentLine]->ScrollBackEditor();
+        (*iLines)[iCurrentLine]->ScrollBackEditorL();
     
     ChangeFocusTo( aLine );
     ExposeLine( iCurrentLine, EFalse );
@@ -1882,7 +1904,6 @@
         case EEikScrollPageUp:
         case EEikScrollPageDown:
         case EEikScrollThumbDragVert:
-            iExtension->iScrolled = ETrue;
             iExtension->iScrolling = ETrue;
             iLines->MoveLineToScreen( iCurrentLine, 0, EFalse );
             break;
@@ -2114,7 +2135,7 @@
         CEikEdwin* edwinPtr = STATIC_CAST( CEikEdwin*, theNewLine->iControl );
         if( edwinPtr->Text() )
         	{
-            edwinPtr->SetCursorPosL( edwinPtr->TextLength(), EFalse );       
+            TRAP_IGNORE( edwinPtr->SetCursorPosL( edwinPtr->TextLength(), EFalse ) );       
         	}
     	}
 
@@ -2128,10 +2149,10 @@
         if ( oldLine != -1 )
             {
             iLines->MoveLineToScreen( oldLine, 0, EFalse );
-            RecordLineL( oldLine );
+            TRAP_IGNORE( RecordLineL( oldLine ) );
             }
 
-		RecordLineL( iCurrentLine );
+		TRAP_IGNORE( RecordLineL( iCurrentLine ) );
 		iLines->MoveLineToScreen( iCurrentLine, iPhysics->ViewTopY(), ETrue );
 		}
     _AKNTRACE_FUNC_EXIT;
@@ -2845,10 +2866,13 @@
                 }
             }
         iExtension->iScrolling = EFalse;
-        iExtension->HandleFormFeedback( this, aPointerEvent, touchedLine, iCurrentLine );
+        iExtension->HandleFormFeedback( *this,
+                                        aPointerEvent,
+                                        touchedLine,
+                                        iCurrentLine );
         
-        TBool wasScrolling = ( iPhysics->OngoingPhysicsAction() != 
-            CAknPhysics::EAknPhysicsActionNone );
+        iExtension->iWasScrolling = ( iPhysics->OngoingPhysicsAction() != 
+        CAknPhysics::EAknPhysicsActionNone ); 
         iPhysics->Stop();
         iExtension->iLastTouchedLine = touchedLine;
         iExtension->iDragStartPosition = aPointerEvent.iPosition;
@@ -2861,10 +2885,17 @@
 
             if ( iExtension->iUsesSingleClick )
                 {
-                if ( !wasScrolling )
+                if ( !iExtension->iWasScrolling )
                     {
-                    HighlightVisible( ETrue );
-                    HighlightTimerCallBack( this );
+                    if ( iFormFlags & EEikFormDisableHighlightInViewMode )
+                        {
+                        HighlightVisible( EFalse );
+                        }                
+                    else
+                        {
+                        HighlightVisible( ETrue );
+                        HighlightTimerCallBack( this );
+                        }
                     }
                 }
             else
@@ -2918,7 +2949,6 @@
                     }
 
                 iExtension->iScrolling = ETrue;
-                iExtension->iScrolled = ETrue;
                 iExtension->iLastPointerPos = aPointerEvent.iPosition;
                 RemovePressedDownHighlight();
                 iLines->MoveLineToScreen( iCurrentLine, 0, EFalse );
@@ -2943,8 +2973,11 @@
     
     if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
         {
-    _AKNTRACE( "TPointerEvent::EButton1Up" );
-        iExtension->HandleFormFeedback( this, aPointerEvent, touchedLine, iCurrentLine );
+        _AKNTRACE( "TPointerEvent::EButton1Up" );
+        iExtension->HandleFormFeedback( *this,
+                                        aPointerEvent,
+                                        touchedLine,
+                                        iCurrentLine );
         if ( !IsEditable() && iExtension->iUsesSingleClick && 
              HighlightVisible() )
             {
@@ -2966,7 +2999,7 @@
                 {
                 iExtension->iScrolling = EFalse;
                 
-                if ( iPageObserver && GrabbingComponent() )
+                if ( iPageObserver && GrabbingComponent() && !iExtension->iWasScrolling )
                     {
                     iPageObserver->HandleDialogPageEventL( MEikDialogPageObserver::EDialogPageTapped );
                     }
@@ -2979,12 +3012,14 @@
                     {
                     // feedback is given every time when new item 
                     // appears to the screen -> follows the visual feedback
-                    iExtension->SilentFeedback( this, ETouchFeedbackSensitiveList, aPointerEvent );
+                    iExtension->SilentFeedback( *this,
+                                                ETouchFeedbackSensitiveList,
+                                                aPointerEvent );
+
                     // It might happen that there are no drag events between down and
                     // up if the distance is short enough.
                     iExtension->iHighlightTimer->Cancel();
                     iExtension->iScrolling = ETrue;
-                    iExtension->iScrolled = ETrue;
                     iLines->MoveLineToScreen( iCurrentLine, 0, EFalse );
                     RemovePressedDownHighlight();
                     }
@@ -3020,9 +3055,9 @@
         mskPress = ETrue;
         callDefaultImplementation = EFalse;
         }
-    
     if ( callDefaultImplementation && ( iExtension->iFocusedClicked || 
-            iExtension->iUsesSingleClick ) && newLine )
+            iExtension->iUsesSingleClick ) && newLine && 
+            !iExtension->iWasScrolling )
         {
         if ( newLine->ControlIsAPopfield( controlType ) )
             {
@@ -3048,7 +3083,7 @@
         key.iCode=EKeyOK;
         key.iModifiers=0;
         key.iRepeats = 0;
-        CEikonEnv::Static()->SimulateKeyEventL( key, EEventKey );
+        iEikonEnv->SimulateKeyEventL( key, EEventKey );
         }
     _AKNTRACE_FUNC_EXIT;
     }
@@ -3121,9 +3156,10 @@
         
         if ( LineIsFocusable( touchedLine ) )
             {
-            TRAP_IGNORE( PrepareForFocusTransitionL() );
-            ChangeFocusToAndExposeL( touchedLine );
-            LineChangedL( (*iLines)[touchedLine]->iId );
+            TRAP_IGNORE( PrepareForFocusTransitionL();
+                         ChangeFocusToAndExposeL( touchedLine );
+                         LineChangedL( (*iLines)[touchedLine]->iId );
+                       );
             }
         }
     }
@@ -3187,11 +3223,15 @@
             {
             if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionDragging )
                 {
-                iExtension->Feedback( this, ETouchFeedbackSensitiveList );
+                iExtension->Feedback( *this, ETouchFeedbackSensitiveList );
                 }
-            else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking)
+            else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking )
                 {
-                iExtension->SilentFeedback( this, ETouchFeedbackSensitiveList, TPointerEvent() );
+                iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() );
+                }
+            else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionBouncing )
+                {
+                iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() );
                 }
             }
         }
@@ -3201,11 +3241,15 @@
             {
             if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionDragging )
                 {
-                iExtension->Feedback( this, ETouchFeedbackSensitiveList );
+                iExtension->Feedback( *this, ETouchFeedbackSensitiveList );
                 }
-            else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking)
+            else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking )
                 {
-                iExtension->SilentFeedback( this, ETouchFeedbackSensitiveList, TPointerEvent() );
+                iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() );
+                }
+            else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionBouncing )
+                {
+                iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() );
                 }
             }
         }
@@ -3375,7 +3419,7 @@
             currentLine->SetPressedDownState( EFalse );
             if ( IsForm() )
                 {
-                RecordLineL( iCurrentLine );
+                TRAP_IGNORE( RecordLineL( iCurrentLine ) );
                 }
             }
         }
@@ -3649,16 +3693,19 @@
         clear = ETrue;
         }
         
-    if ( focusItem || iExtension->iFocusedClicked)
+    if ( focusItem || iExtension->iFocusedClicked )
         {
-        iExtension->HandleFormFeedback( this, aPointerEvent, touchedLineIndex, iCurrentLine );
+        iExtension->HandleFormFeedback( *this,
+                                        aPointerEvent,
+                                        touchedLineIndex,
+                                        iCurrentLine );
         }
                 
     if ( focusItem )
         {
         PrepareForFocusTransitionL();
         
-        (*iLines)[iCurrentLine]->ScrollBackEditor();
+        (*iLines)[iCurrentLine]->ScrollBackEditorL();
         ShowFocus( EFalse, EFalse );
         iCurrentLine = touchedLineIndex;
         ShowFocus( ETrue, EFalse );        
@@ -3677,7 +3724,7 @@
         key.iCode=EKeyOK;
         key.iModifiers=0;
         key.iRepeats = 0;
-        CEikonEnv::Static()->SimulateKeyEventL(key, EEventKey);
+        iEikonEnv->SimulateKeyEventL(key, EEventKey);
         // SimulateKeyEventL has to be last, because it can
         // possibly delete the dialog.. Must not do anything
         // to the dialog after the call.