diff -r aecbbf00d063 -r d48ab3b357f1 uifw/EikStd/dlgsrc/EIKDPAGE.CPP --- a/uifw/EikStd/dlgsrc/EIKDPAGE.CPP Tue Aug 31 15:28:30 2010 +0300 +++ b/uifw/EikStd/dlgsrc/EIKDPAGE.CPP Wed Sep 01 12:16:19 2010 +0100 @@ -56,7 +56,7 @@ #include #include #include - +#include "akntrace.h" // // Global constants. // @@ -94,20 +94,31 @@ public: enum TFlags { - ELineHandlerCalled + ELineHandlerCalled, + EDragEventsAllowed // turned on when dragging is allowed }; 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(); @@ -121,7 +132,6 @@ TBool iExternalScrollbar; TBool iIsDoubleQuery; TBool iFocusedClicked; - TInt iPreviousThumbPosition; TBool iPreviousThumbDirection; MTouchFeedback* iFeedback; TBitFlags iFlags; @@ -141,8 +151,8 @@ TInt iLastTouchedLine; TPoint iSynchronizedPosition; TBool iScrolling; - TBool iScrolled; TBool iInitialLayoutDone; + TBool iSetInitialFocusDone; TBool iHandlingResourceChange; TInt iCapturingItem; // record the center point Y value of current view when touch down an item @@ -159,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() @@ -200,76 +212,89 @@ } void CDialogPageExtension::HandleFormFeedback( - CEikDialogPage* aDPage, + const CEikDialogPage& aDPage, const TPointerEvent& aPointerEvent, TInt aTouchedLineIndex, TInt aCurrentLine ) { - // note, that iFormControl is checked in Feedback() - if ( aPointerEvent.iType == TPointerEvent::EButton1Down && - aCurrentLine != aTouchedLineIndex && aDPage->LineOnPageOrNull( 0 ) ) - { - // feedback for edit/view mode form, when non-focused line is clicked - // feedback for focused item is responsibility of the item - // no feedback with focus change when single click is enabled - if ( !iUsesSingleClick ) - { - Feedback( aDPage, ETouchFeedbackSensitiveItem ); - } - iFocusItemChanged = ETrue; - } - - else if ( aPointerEvent.iType == TPointerEvent::EButton1Down && - aTouchedLineIndex == aCurrentLine && aDPage->LineOnPageOrNull( 0 ) ) + CEikCaptionedControl* firstLine( aDPage.LineOnPageOrNull( 0 ) ); + + if( aDPage.IsEditable() ) { - // 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, ETouchFeedbackBasicItem ); - 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 ) + // note, that iFormControl is checked in Feedback() + if ( aPointerEvent.iType == TPointerEvent::EButton1Down && + aCurrentLine != aTouchedLineIndex && + firstLine ) + { + // feedback for edit mode form, when non-focused line is clicked + // feedback for focused item is responsibility of the item + // no feedback with focus change when single click is enabled + if ( !iUsesSingleClick ) + { + Feedback( aDPage, ETouchFeedbackSensitiveList ); + } + iFocusItemChanged = ETrue; + } + else if ( firstLine ) { - SilentFeedback( aDPage, ETouchFeedbackBasicItem, aPointerEvent ); + if ( aPointerEvent.iType == TPointerEvent::EButton1Down && + aTouchedLineIndex == aCurrentLine ) + { + // Feedback for edit 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() ) { 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() ) { - iFeedback->InstantFeedback( aDPage, aFeedback, ETouchFeedbackVibra, aPointerEvent ); + iFeedback->InstantFeedback( &aDPage, + aFeedback, + ETouchFeedbackVibra, + aPointerEvent ); } } + class CAknPaneScroll : public CBase { public: @@ -332,6 +357,7 @@ CEikDialogPage::~CEikDialogPage() { + _AKNTRACE_FUNC_ENTER; AKNTASHOOK_REMOVE(); // Page observer needs to be nulled or an already deleted instance is // called when pointer up event is handled. This is valid only for dialogs @@ -341,12 +367,15 @@ delete iLines; delete iScroll; delete iExtension; + _AKNTRACE_FUNC_EXIT; } CEikDialogPage* CEikDialogPage::NewL(TInt aPageId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver) { + _AKNTRACE_FUNC_ENTER; CEikDialogPage* self=CEikDialogPage::NewLC(aPageId,aViewWin,aSBFrame,aParent,aPageObserver); CleanupStack::Pop(); + _AKNTRACE_FUNC_EXIT; return self; } @@ -364,27 +393,33 @@ CEikDialogPage* CEikDialogPage::NewLC(TInt aPageId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver) { + _AKNTRACE_FUNC_ENTER; CEikDialogPage* self=new(ELeave) CEikDialogPage(aPageId,aViewWin,aSBFrame,aPageObserver); CleanupStack::PushL(self); CommonConstructCodeBetweenNewL(*self,aParent); AKNTASHOOK_ADDL( self, "CEikDialogPage" ); + _AKNTRACE_FUNC_EXIT; return self; } CEikDialogPage* CEikDialogPage::NewL(TInt aPageId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver,TResourceReader& aReader) { + _AKNTRACE_FUNC_ENTER; CEikDialogPage* self=CEikDialogPage::NewLC(aPageId,aViewWin,aSBFrame,aParent,aPageObserver,aReader); CleanupStack::Pop(); + _AKNTRACE_FUNC_EXIT; return self; } CEikDialogPage* CEikDialogPage::NewLC(TInt aPageId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver,TResourceReader& aReader) { + _AKNTRACE_FUNC_ENTER; CEikDialogPage* self=new(ELeave) CEikDialogPage(aPageId,aViewWin,aSBFrame,aPageObserver); CleanupStack::PushL(self); CommonConstructCodeBetweenNewL(*self,aParent); self->ConstructFromResourceL(aReader); AKNTASHOOK_ADDL( self, "CEikDialogPage" ); + _AKNTRACE_FUNC_EXIT; return self; } @@ -393,12 +428,15 @@ : iPageObserver(aPageObserver), iPageId(aPageId),iCurrentLine(-1) { + _AKNTRACE_FUNC_ENTER; SetBlank(); SetComponentsToInheritVisibility(); + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::ConstructL() { + _AKNTRACE_FUNC_ENTER; iLines=new(ELeave)CEikCapCArray(KLineArrayGranularity); SetContainerWindowL( *iPageContainer ); Window().SetPointerGrab(ETrue); @@ -407,10 +445,12 @@ iScroll = new(ELeave)CAknPaneScroll(this); iScroll->SetLines(iLines); iExtension = CDialogPageExtension::NewL(); + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::ConstructFromResourceL(TResourceReader& aReader, TBool aFormControl ) { + _AKNTRACE_FUNC_ENTER; iFormControl = aFormControl ; if ( IsForm() ) @@ -435,6 +475,7 @@ iCoeEnv->CreateResourceReaderLC(indirectReader,indirectRid); ConstructFromResourceL(indirectReader); CleanupStack::PopAndDestroy(); + _AKNTRACE_FUNC_EXIT; return; } @@ -454,7 +495,6 @@ thisLine->iIsFormControl = aFormControl ; if ( aFormControl ) { - thisLine->GetAknLayoutValuesL() ; // should cause the control to have size. if ( iFormFlags ) thisLine->SetFormFlags( iFormFlags ) ; } @@ -468,17 +508,21 @@ iScroll = new(ELeave)CAknPaneScroll(this); } iScroll->SetLines(iLines); + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::ConstructFormFromResourceL( TResourceReader& aReader ) { + _AKNTRACE_FUNC_ENTER; iFormFlags = TInt16(aReader.ReadInt16()) ; iFormLayout = (iFormFlags&EEikFormUseDoubleSpacedFormat) ? EDouble : ESingle; ConstructFromResourceL( aReader, ETrue ) ; + _AKNTRACE_FUNC_EXIT; } CCoeControl* CEikDialogPage::CreateLineByTypeL(const TDesC& aCaption,TInt aLineId,TInt aControlType,TAny* aReturnValue) { + _AKNTRACE_FUNC_ENTER; ShowFocus( EFalse, EFalse ) ; // Turn the focus off the current line. CEikCaptionedControl* line=new(ELeave) CEikCaptionedControl; CleanupStack::PushL(line); @@ -514,21 +558,24 @@ // physics engine needs to be updated when lines are added after the initial layout UpdatePhysics(); - + _AKNTRACE_FUNC_EXIT; return line->iControl; } CEikCaptionedControl* CEikDialogPage::ConstructLineL(TInt aResourceId) { + _AKNTRACE_FUNC_ENTER; TResourceReader resourceReader; iCoeEnv->CreateResourceReaderLC(resourceReader,aResourceId); CEikCaptionedControl* line=ConstructLineL(resourceReader); CleanupStack::PopAndDestroy(); // resourceReader + _AKNTRACE_FUNC_EXIT; return line; } CEikCaptionedControl* CEikDialogPage::ConstructLineL(TResourceReader& aReader) { + _AKNTRACE_FUNC_ENTER; CEikCaptionedControl* line=new(ELeave) CEikCaptionedControl; CleanupStack::PushL(line); line->iIsFormControl=iFormControl; @@ -550,11 +597,13 @@ if (indirectRid) CleanupStack::PopAndDestroy(); CleanupStack::Pop(); // line + _AKNTRACE_FUNC_EXIT; return line; } void CEikDialogPage::ConstructByTypeL(TInt aType,CEikCaptionedControl* aLine,CCoeControl* aContainer) { + _AKNTRACE_FUNC_ENTER; SEikControlInfo controlInfo=EikControlFactory::CreateByTypeL(aType); if (!controlInfo.iControl) controlInfo=CreateCustomControlL(aType); @@ -588,6 +637,7 @@ aLine->SetTrailerL(tmp->Des()); CleanupStack::PopAndDestroy(); // tmp } + _AKNTRACE_FUNC_EXIT; } SEikControlInfo CEikDialogPage::CreateCustomControlL(TInt aControlType) @@ -598,6 +648,7 @@ void CEikDialogPage::SetActiveL() { + _AKNTRACE_FUNC_ENTER; ActivateL(); MakeVisible(ETrue); @@ -633,22 +684,22 @@ AknsUtils::RegisterControlPosition(capCtrl->iTrailer); AknsUtils::RegisterControlPosition(capCtrl->iBitmap); - if ( capCtrl->iIsFormControl && iCurrentLine != i) - { - - if (capCtrl->ControlIsAnEdwin(capCtrl->iControlType)) + if ( capCtrl->iIsFormControl && iCurrentLine != i) { - CEikEdwin *edwin = (CEikEdwin*)capCtrl->iControl; - TRAP_IGNORE(edwin->TextView()->SetDocPosL(0) - ); + if (capCtrl->ControlIsAnEdwin(capCtrl->iControlType)) + { + CEikEdwin *edwin = (CEikEdwin*)capCtrl->iControl; + TRAP_IGNORE( edwin->TextView()->SetDocPosL( 0 ) ); + } } - } - } + + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::SetActiveAndFocusL() { + _AKNTRACE_FUNC_ENTER; SetActiveL(); SetEditableL(iIsEditable, ETrue); //When active a page, need to show the focus in that page. @@ -661,16 +712,20 @@ ExposeLine( iCurrentLine, EFalse ); UpdateScrollBarL(); + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::SetInactiveL() { + _AKNTRACE_FUNC_ENTER; MakeEdwinScrollbarsVisibleL(EFalse); MakeVisible(EFalse); + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::MakeEdwinScrollbarsVisibleL(TBool aVisible) { + _AKNTRACE_FUNC_ENTER; const TInt numLines=iLines->Count(); for (TInt ii=0;iiCount(); @@ -718,26 +775,26 @@ continue; ChangeFocusTo(ii); focusSet=ETrue; - - if ( IsForm() ) - { - // move line with initial focus to the screen - iLines->MoveLineToScreen( ii, iPhysics->ViewTopY(), ETrue ); - } break; } - + iExtension->iSetInitialFocusDone = ETrue; + _AKNTRACE( "return focusSet;: [%d]", focusSet ); + _AKNTRACE_FUNC_EXIT; return focusSet; } TKeyResponse CEikDialogPage::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) { + _AKNTRACE_FUNC_ENTER; TKeyResponse response=EKeyWasNotConsumed; if (!(PageContainer()->PageSelector()->Dialg()->DialogFlags() & EEikDialogFlagDontEatUpDownEvents)) { if (aType != EEventKey) - return response; + { + _AKNTRACE_FUNC_EXIT; + return response; + } } const TInt numLines=iLines->Count(); @@ -761,11 +818,13 @@ || aKeyEvent.iCode==EKeyPrevious )) response=OfferUpDownKeyEventL(aKeyEvent,aType,ENonCyclic); + _AKNTRACE_FUNC_EXIT; return response; } TKeyResponse CEikDialogPage::OfferUpDownKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType,TFocusNavigationMode aFocusNavigationMode) { + _AKNTRACE_FUNC_ENTER; TKeyResponse response=EKeyWasNotConsumed; if (aType==EEventKey) { @@ -802,12 +861,10 @@ switch (aFocusNavigationMode) { case ECyclic: - iExtension->iScrolled = ETrue; response=HandleCyclicFocusNavigationKeyL(aKeyEvent); break; case ENonCyclic: - iExtension->iScrolled = ETrue; response=HandleNonCyclicFocusNavigationKeyL(aKeyEvent); break; @@ -822,7 +879,7 @@ if (response==EKeyWasConsumed) UpdateScrollBarThumb(); - + _AKNTRACE_FUNC_EXIT; return response; } @@ -931,6 +988,7 @@ void CEikDialogPage::SetDimmed(TBool aDimmed) { + _AKNTRACE_FUNC_ENTER; CCoeControl::SetDimmed(aDimmed); const TInt numLines=iLines->Count(); @@ -940,13 +998,18 @@ thisLine->iControl->SetDimmed(aDimmed); thisLine->CheckDimmedDisplayState(); } + _AKNTRACE_FUNC_EXIT; } TBool CEikDialogPage::RotateFocusByL(TInt aDelta) { + _AKNTRACE_FUNC_ENTER; TInt numLines=iLines->Count(); if (numLines == 0) + { + _AKNTRACE_FUNC_EXIT; return(EFalse); + } // If form is in view mode and highlight is hidden then the first // navigation key press just displays the highlight. @@ -970,7 +1033,7 @@ HandleHighlightTimer(); } } - + _AKNTRACE_FUNC_EXIT; return ETrue; } @@ -999,21 +1062,27 @@ ChangeFocusToAndExposeL(currentLine); LineChangedL((*iLines)[currentLine]->iId); iExtension->iFocusedClicked = ETrue; + _AKNTRACE_FUNC_EXIT; return(ETrue); } - + _AKNTRACE_FUNC_EXIT; return EFalse; } void CEikDialogPage::ChangeFocusToAndExposeL( TInt aLine, TBool /*aShowWholeControl*/ ) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "CEikDialogPage::ChangeFocusToAndExposeL() aLine: [%d]", aLine ); if ( aLine < 0 || aLine == iCurrentLine ) + { + _AKNTRACE_FUNC_EXIT; return; + } TInt oldLine = iCurrentLine; if( aLine != iCurrentLine ) - (*iLines)[iCurrentLine]->ScrollBackEditor(); + (*iLines)[iCurrentLine]->ScrollBackEditorL(); ChangeFocusTo( aLine ); ExposeLine( iCurrentLine, EFalse ); @@ -1031,6 +1100,7 @@ DrawDeferred(); } + _AKNTRACE_FUNC_EXIT; } TInt CEikDialogPage::TopFocusableLine() const @@ -1059,12 +1129,14 @@ TBool CEikDialogPage::LineIsFocusable(TInt aLine) const { + _AKNTRACE_FUNC_ENTER; TBool focusable(ETrue); CEikCaptionedControl* line=(*iLines)[aLine]; if (line->IsNonFocusing() || line->IsDimmed() || !(line->IsVisible())) focusable=EFalse; - + _AKNTRACE( "focusable: [%d]", focusable ); + _AKNTRACE_FUNC_EXIT; return focusable; } @@ -1075,6 +1147,8 @@ void CEikDialogPage::InsertLineL(TInt aPosition,TInt aResourceId) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "aPosition: [%d]", aPosition ); // alteration is bloated but should not provide any side-effects. if (!iFormControl) { @@ -1098,11 +1172,14 @@ */ if (iCurrentLine>=aPosition) iCurrentLine++; + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::DeleteLine(TInt aLineId, TBool aRedraw) { + _AKNTRACE_FUNC_ENTER; TInt index( LineIndex( aLineId ) ) ; + _AKNTRACE( "Delete line index: [%d]", index ); if ( index == iCurrentLine ) // we're deleting the current line { // If this is the last line then move the focus to the line above. (becomes -1 if last line) @@ -1145,13 +1222,14 @@ TInt targetLine = iCurrentLine ; iCurrentLine = -1 ; ChangeFocusTo( targetLine ) ; - ExposeLine( targetLine, EFalse ) ; + ExposeLine( targetLine, ETrue ) ; ShowFocus( ETrue, EFalse ) ; } DrawNow(); TRAP_IGNORE(UpdateScrollBarL()); // if OOM, scrollbar will not be updated - No great loss. } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::AdjustAllIds(TInt aControlIdDelta) @@ -1161,8 +1239,9 @@ TInt CEikDialogPage::FocusLineL(TInt aLineId) { + _AKNTRACE_FUNC_ENTER; TInt lineIndex=LineIndex(aLineId); - + _AKNTRACE( "Delete line index: [%d]", lineIndex ); if (lineIndex==KErrNotFound) return KErrNotFound; @@ -1170,6 +1249,7 @@ // Show whole line, not scroll into line. ChangeFocusToAndExposeL(lineIndex, ETrue); LineChangedL(aLineId); + _AKNTRACE_FUNC_EXIT; return KErrNone; } @@ -1248,31 +1328,15 @@ return KErrNotFound; } -TInt CEikDialogPage::YPosToLine2(TInt aYPos) const - { - return iLines->YPosToLine( Rect(), iScroll->Top(), iScroll->Middle(), iScroll->Bottom(), aYPos ); - } - -TInt CEikDialogPage::LineToYPos(TInt& aLine) const -// -// Calcs YPos of line relative to the ViewWin and adjusts aLine if its out of bounds - { - ASSERT(iLines); - const TInt numLines=iLines->Count(); - ASSERT(numLines>0); - if (aLine<0) - aLine=0; - else if (aLine>=numLines) - aLine=numLines-1; - return (*iLines)[aLine]->Position().iY; // TPREMOVAL +iDataWinPos.iY; - } void CEikDialogPage::ExposeLine(TInt aLine, TBool aForceResize, TBool aShowWholeLine) // /* Exposes the given line so that its fully visible in the ViewWin */ { + _AKNTRACE_FUNC_ENTER; if ( iSize.iHeight == 0 || aLine == -1 ) { + _AKNTRACE_FUNC_EXIT; return; } @@ -1280,6 +1344,7 @@ if ( change == CAknPaneScroll::ENoChange && !aForceResize ) { + _AKNTRACE_FUNC_EXIT; return; } @@ -1319,6 +1384,38 @@ } } + // If control height is greater then screen. Make sure that edwin's cursor is visible + if (controlType == EEikCtEdwin && controlHeight > Rect().Height()) + { + CEikEdwin* edwin = dynamic_cast(capCtrl->iControl); + if (edwin) + { + TInt pos = edwin->CursorPos(); + TRect linerect; + TRAP_IGNORE( linerect = edwin->TextLayout()->GetLineRectL(pos, pos) ); + + TPoint capctrlpos = capCtrl->Position(); + TPoint edwinpos = edwin->Position(); + if (edwinpos.iY - capctrlpos.iY + (linerect.iTl.iY + linerect.iBr.iY)/2 > Rect().Height()/2) // cursor not fully visible + { + TInt offset = edwinpos.iY - capctrlpos.iY + (linerect.iTl.iY + linerect.iBr.iY)/2 - Rect().Height()/2; + if (topYPosOfControlWhichMustBeViewable + offset + Rect().Height() <= bottomYPosOfControlWhichMustBeViewable) + { + topYPosOfControlWhichMustBeViewable += offset; + bottomYPosOfControlWhichMustBeViewable = topYPosOfControlWhichMustBeViewable + Rect().Height(); + } + else + { + topYPosOfControlWhichMustBeViewable = bottomYPosOfControlWhichMustBeViewable - Rect().Height(); + } + } + else + { + bottomYPosOfControlWhichMustBeViewable = topYPosOfControlWhichMustBeViewable + Rect().Height(); + } + } + } + SetDataPosition( topYPosOfControlWhichMustBeViewable, bottomYPosOfControlWhichMustBeViewable, aForceResize ); if ( aLine != iLastExposedLine ) @@ -1326,10 +1423,13 @@ iLastExposedLine = aLine; iLastExposedLineViewWinYPosition = topYPosOfControlWhichMustBeViewable + idealDataWindowPosition; } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::SetDataPosition( TInt aTopY, TInt aBottomY, TBool aForceResize ) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "[%s][%s] aTopY: [%d]", "CEikDialogPage", __FUNCTION__, aTopY ); // update rect only if the currently focused control doesn't fit if ( iFormControl ) { @@ -1375,6 +1475,7 @@ iLines->MoveLineToScreen( iCurrentLine, iPhysics->ViewTopY(), ETrue ); } } + _AKNTRACE_FUNC_EXIT; } /* @@ -1416,6 +1517,56 @@ void CEikDialogPage::SizeChanged() { + _AKNTRACE_FUNC_ENTER; + if ( IsForm() ) + { + iExtension->iInitialLayoutDone = EFalse; + + iScroll->SetOutsideRect( Rect() ); + + // force each line to resize + TInt count = iLines->Count(); + + for ( TInt i = 0; i < count; ++i ) + { + (*iLines)[i]->HandleResourceChange( KEikDynamicLayoutVariantSwitch ); + } + + iLines->SetRect( Rect(), iScroll->Top(), iScroll->Middle(), iScroll->Bottom() ); + iExtension->iInitialLayoutDone = ETrue; + UpdatePhysics(); + + if ( iExtension->iScrolling + || iExtension->iFlags.IsSet( + CDialogPageExtension::EDragEventsAllowed ) ) + { + iPhysics->Stop(); + Synchronize(); + } + + if ( count > 0 && iCurrentLine != KErrNotFound ) + { + if ( iLastExposedLine != -1 ) + { + iLastExposedLineViewWinYPosition = + iLines->LineIndexToYPosition( iLastExposedLine, 0 ); + } + + ExposeLine( iCurrentLine, ETrue ); + + if ( Size() != TSize::EUninitialized ) + { + (*iLines)[iCurrentLine]->DrawDeferred(); + } + } + + TRAP_IGNORE( UpdateScrollBarL() ); // ignore any errors. + AknsUtils::RegisterControlPosition( this ); + + _AKNTRACE_FUNC_EXIT; + return; + } + // update form area's size to scroll control iScroll->SetOutsideRect( Rect() ); iLines->SetRect( Rect(), iScroll->Top(), iScroll->Middle(), iScroll->Bottom() ); @@ -1428,12 +1579,14 @@ TRAP_IGNORE( UpdateScrollBarL() ); // ignore any errors. AknsUtils::RegisterControlPosition( this ); - UpdatePhysics(); iExtension->iInitialLayoutDone = ETrue; + _AKNTRACE_FUNC_EXIT; } TSize CEikDialogPage::MinimumSize() { + _AKNTRACE( "[%s][%s] MinimumSize: w = %d, h = %d.", + "CEikDialogPage", __FUNCTION__, iLines->MinimumSize().iWidth, 0 ); return TSize( iLines->MinimumSize().iWidth, 0 ); // Can be zero height } @@ -1488,6 +1641,7 @@ */ void CEikDialogPage::HandleEdwinEventL(CEikEdwin* aEdwin,TEdwinEvent aEventType) { + _AKNTRACE_FUNC_ENTER; if ( IsForm() && ( aEventType == EEventTextUpdate || aEventType == EEventTextUpdateAPI ) ) { @@ -1507,7 +1661,7 @@ if ( i != iCurrentLine ) { - DrawNow(); + DrawDeferred(); } break; @@ -1517,13 +1671,17 @@ } if( iCurrentLine == iLastExposedLine || iCurrentLine == -1 ) + { + _AKNTRACE_FUNC_EXIT; return; + } if( aEventType == EEventNavigation || aEventType == EEventTextUpdate ) { ExposeLine( iCurrentLine, EFalse ); UpdateScrollBarL(); } + _AKNTRACE_FUNC_EXIT; } /** @@ -1531,10 +1689,13 @@ */ void CEikDialogPage::HandlePopupFieldEventL(CAknPopupField* aPopupField, TAknPopupFieldEvent aEventType, TInt /*aHint*/) { + _AKNTRACE_FUNC_ENTER; switch (aEventType) { case EAknPopupFieldEventValueChange: { + _AKNTRACE( "[%s][%s][%d] EAknPopupFieldEventValueChange", + "CEikDialogPage", __FUNCTION__, __LINE__ ); CEikCaptionedControl* line = NULL; for ( TInt i = 0; i < iLines->Count(); ++i ) { @@ -1545,7 +1706,7 @@ { RecordLineL( i ); } - DrawNow(); + DrawDeferred(); break; } } @@ -1553,6 +1714,8 @@ } case EAknPopupFieldEventModeChange: { + _AKNTRACE( "[%s][%s][%d] EAknPopupFieldEventModeChange", + "CEikDialogPage", __FUNCTION__, __LINE__ ); TInt index = iCurrentLine; if(iIsEditable && (iExtension->iPopFieldEvents != 0)) @@ -1564,8 +1727,8 @@ { iExtension->iPopFieldEvents = 1; } - - ReconsiderPageSize(); + + (*iLines)[iCurrentLine]->SetRect( (*iLines)[iCurrentLine]->Rect() ); ExposeLine( index, ETrue ); DrawNow(); @@ -1576,6 +1739,7 @@ default: break; } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::PrepareToDrawVerticalLine() const @@ -1601,19 +1765,14 @@ KAknsIIDQsnFrInput, KAknsIIDDefault ) ; } - } - } - } -void CEikDialogPage::DrawVerticalLine() const - { - } void CEikDialogPage::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType) { + _AKNTRACE_FUNC_ENTER; switch (aEventType) { case EEventPrepareFocusTransition: @@ -1665,6 +1824,7 @@ default: break; } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::PassOnEventL(CCoeControl* aControl,MCoeControlObserver::TCoeEvent aEvent) @@ -1685,7 +1845,7 @@ if (height > maxHeight) height = maxHeight; - TSize size = aEdwin->Size(); + TSize size( aEdwin->Size() ); TInt maximumEdwinHeight = aEdwin->MaximumHeight(); // ensure maxheight as dynamic construction may be done whilst form is of zero height. if ((maximumEdwinHeight > maxHeight) && maxHeight) @@ -1698,9 +1858,19 @@ size.iHeight = height; // Must force a size change on current captioned contrl even if control doesn't change size (so that edwin is resized by aknutils) - aEdwin->SetSize(size); - ReconsiderPageSize(); - ExposeLine(iCurrentLine, ETrue); + aEdwin->SetSize(size); + + if ( IsForm() ) + { + (*iLines)[iCurrentLine]->SetRect( (*iLines)[iCurrentLine]->Rect() ); + ExposeLine( iCurrentLine, ETrue ); + } + else + { + ReconsiderPageSize(); + ExposeLine(iCurrentLine, ETrue); + } + PrepareToDrawVerticalLine(); // do flushes here. /* improved redraw code @@ -1730,56 +1900,9 @@ } -static TInt CountNumberOfLines_Edwin(CEikEdwin *aEdwin, TRect aRect, TInt numOfLines) - { - TInt edwinLines = numOfLines; - TInt count = 0; - for(TInt i=0;iTextLayout()->FirstLineInBand(); - TInt docPos = aEdwin->TextLayout()->FirstCharOnLine(scrolledLines + i+1); - TPoint point; - aEdwin->TextLayout()->PosInBand(docPos, point); - TInt yPos = point.iY; - TRect lineRect; - aEdwin->TextLayout()->GetLineRect(yPos, lineRect); - lineRect.iTl += aEdwin->Position(); - lineRect.iBr += aEdwin->Position(); - if (aRect.Contains(lineRect.iTl) && aRect.Contains(lineRect.iBr)) - count++; - } - return count; - } -static TInt CountNumberOfLines_Ctrl(CCoeControl *aControl, TRect aRect) - { - TRect rect = TRect(aControl->Position(), aControl->Size()); - TInt count = 0; - if (aRect.Contains(rect.iTl) && aRect.Contains(rect.iBr)) - count ++; - return count; - } - -static TInt CountNumberOfVisibleLines(CEikCaptionedControl *aControl, TRect aClipRect) - { - TInt count = 0; - if (aControl->ControlIsAnEdwin(aControl->iControlType)) - count += CountNumberOfLines_Edwin((CEikEdwin*)aControl->iControl, aClipRect, aControl->NumberOfLines()); - else - count += CountNumberOfLines_Ctrl(aControl->iControl, aClipRect); - count += CountNumberOfLines_Ctrl(aControl->iCaption, aClipRect); - return count; - } - -static TInt NumberOfTextLinesVisible(CEikCapCArray *aLines, TInt aItem, TRect aClipRect) - { - if (aItem < 0) return 0; - CEikCaptionedControl *control = (*aLines)[aItem]; - return CountNumberOfVisibleLines(control, aClipRect); - } - - void CEikDialogPage::HandleScrollEventL(CEikScrollBar* aScrollBar,TEikScrollEvent aEventType) { + _AKNTRACE_FUNC_ENTER; iExtension->iHandlingScrollEvent = ETrue; switch (aEventType) @@ -1787,7 +1910,6 @@ case EEikScrollPageUp: case EEikScrollPageDown: case EEikScrollThumbDragVert: - iExtension->iScrolled = ETrue; iExtension->iScrolling = ETrue; iLines->MoveLineToScreen( iCurrentLine, 0, EFalse ); break; @@ -1813,6 +1935,7 @@ } iExtension->iHandlingScrollEvent = EFalse; + _AKNTRACE_FUNC_EXIT; } TBool CEikDialogPage::LineHandlerCalled() const @@ -1829,9 +1952,11 @@ void CEikDialogPage::UpdateScrollBarL() { + _AKNTRACE_FUNC_ENTER; // Only forms in S60 need dialog's scrollbar. if ( !iFormControl || !iPageContainer->ScrollBar() || iSize.iHeight == 0 || iSize.iWidth == 0 || iExtension->iHandlingScrollEvent ) { + _AKNTRACE_FUNC_EXIT; return; } @@ -1839,23 +1964,15 @@ if (scrollBar) { - TInt top = iScroll->Top(); - TInt middle = iScroll->Middle(); - TInt bottom = iScroll->Bottom(); - TRect parent( Rect() ); - TBool topmostPartial = top == -1; - iLines->CalcItemIndexes(top, middle, bottom, parent.Size()); - TInt extraLines = topmostPartial ? NumberOfTextLinesVisible(iLines, top-1, parent) : 0; - iExtension->iPreviousThumbPosition = iLines->NumberOfTextLinesBeforeLine( top - extraLines ); - // Using form layout, since this is used by AknForm only TAknWindowComponentLayout layout = TAknWindowComponentLayout::Compose( AknLayoutScalable_Avkon::listscroll_form_pane(), AknLayoutScalable_Avkon::scroll_pane_cp8()); - TRect scrollBarParent( MainPane().Size()/*mainPaneRect.Size()*/ ); - - AknLayoutUtils::LayoutVerticalScrollBar(iPageContainer->ScrollBar(), scrollBarParent, layout.LayoutLine()); + //Using Rect() instead of main pane rect for supporting partial input mode. + //TRect scrollBarParent( MainPane().Size() ); + AknLayoutUtils::LayoutVerticalScrollBar(iPageContainer->ScrollBar(), Rect(), layout.LayoutLine()); + if(!ScbState() && iCurrentLine!=-1 && iCurrentLine < iLines->Count() ) { CEikCaptionedControl *ctrl = (*iLines)[iCurrentLine]; @@ -1864,19 +1981,23 @@ CAknPopupField::EAknPopupFieldSelectionMode mode = ((CAknPopupField*)ctrl->iControl)->SelectionMode(); if (mode == CAknPopupField::EAknPopupFieldSelectionListMode) { + _AKNTRACE_FUNC_EXIT; return; } } UpdateScrollBarThumb(); } } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::UpdateScrollBarThumb() { + _AKNTRACE_FUNC_ENTER; if ( !iFormControl || !iPageContainer->ScrollBar() || ScbState() ) { + _AKNTRACE_FUNC_EXIT; return; } @@ -1892,11 +2013,11 @@ vertModel.iThumbSpan = iSize.iHeight - iSize.iHeight % 2; vertModel.iThumbPosition = Max( iPhysics->ViewTopY(), 0 ); - iExtension->iPreviousThumbPosition = vertModel.iThumbPosition; TRAP_IGNORE(scrollBar->SetModelL(&vertModel)); // won't leave now, but can't guarantee forever iPageContainer->ScrollBar()->Tile(&vertModel); iPageContainer->ScrollBar()->SetVFocusPosToThumbPos(vertModel.iThumbPosition); } + _AKNTRACE_FUNC_EXIT; } CCoeControl* CEikDialogPage::ComponentControl(TInt aIndex) const @@ -1963,6 +2084,7 @@ void CEikDialogPage::ShowFocus(TBool aFocus, TBool aRedraw) { + _AKNTRACE_FUNC_ENTER; if (iCurrentLine>=0) { if ( iExtension && iExtension->iUsesSingleClick && aFocus ) @@ -1977,14 +2099,43 @@ else (*iLines)[iCurrentLine]->DrawDeferred(); } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::ChangeFocusTo(TInt aLineIndex) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "CEikDialogPage::ChangeFocusTo() aLineIndex: [%d]", aLineIndex ); TInt oldLine = iCurrentLine; if (aLineIndex==iCurrentLine) return; + // If current line has settingslist open, close it + CEikCaptionedControl* currentLine = CurrentLine(); + if ( currentLine && + currentLine->ControlIsAPopfield( currentLine->ControlType() ) ) + { + CAknPopupField *field = ( CAknPopupField* )currentLine->iControl; + if ( field && field->SelectionMode() + == CAknPopupField::EAknPopupFieldSelectionListMode ) + { + TRAP_IGNORE( field->CloseSelectionListL() ); + } + } + // If new line is edwin, move cursor to the end of the string. + CEikCaptionedControl* theNewLine = (*iLines)[aLineIndex]; + if ( iExtension->iSetInitialFocusDone + && IsForm() + && theNewLine->ControlIsAnEdwin( theNewLine->iControlType ) + && theNewLine->iIsEditable ) + { + CEikEdwin* edwinPtr = STATIC_CAST( CEikEdwin*, theNewLine->iControl ); + if( edwinPtr->Text() ) + { + TRAP_IGNORE( edwinPtr->SetCursorPosL( edwinPtr->TextLength(), EFalse ) ); + } + } + ShowFocus( EFalse, EFalse ); iCurrentLine=aLineIndex; ShowFocus(ETrue, EFalse ); @@ -1992,15 +2143,23 @@ if ( ( oldLine != iCurrentLine && IsForm() ) && iExtension->iInitialLayoutDone ) { + // Set temporarily for EFalse to prevent one extra physics update + // because of two calls to iLines->MoveLineToScreen + iExtension->iInitialLayoutDone = EFalse; + if ( oldLine != -1 ) { iLines->MoveLineToScreen( oldLine, 0, EFalse ); - RecordLineL( oldLine ); + TRAP_IGNORE( RecordLineL( oldLine ) ); } - - RecordLineL( iCurrentLine ); + + // set back to correct value + iExtension->iInitialLayoutDone = ETrue; + + TRAP_IGNORE( RecordLineL( iCurrentLine ) ); iLines->MoveLineToScreen( iCurrentLine, iPhysics->ViewTopY(), ETrue ); } + _AKNTRACE_FUNC_EXIT; } TInt CEikDialogPage::FindLineIndex(const CCoeControl* aControl) const @@ -2026,7 +2185,8 @@ */ void CEikDialogPage::HandleResourceChange(TInt aType) { - if ( aType==KEikDynamicLayoutVariantSwitch ) + _AKNTRACE_FUNC_ENTER; + if ( aType==KEikDynamicLayoutVariantSwitch && !IsForm() ) { const TInt numLines=iLines->Count(); for ( TInt i=0; i < numLines; i++ ) @@ -2106,6 +2266,7 @@ break; } } + _AKNTRACE_FUNC_EXIT; } CCoeControl* CEikDialogPage::Control(TInt aLineId) const @@ -2149,11 +2310,13 @@ void CEikDialogPage::FocusChanged(TDrawNow /*aDrawNow*/) { + _AKNTRACE_FUNC_ENTER; if (iCurrentLine>=0 && !IsFocused()) { CEikCaptionedControl* currentLine=(*iLines)[iCurrentLine]; currentLine->SetCurrent(EFalse); } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::ResetLineMinimumSizes() @@ -2170,12 +2333,37 @@ Added Enter key as a special case... */ + if ( (iCurrentLine!=-1) && (iCurrentLine < iLines->Count()) ) + { if ( (*iLines)[iCurrentLine]->OfferHotKeys() || (*iLines)[iCurrentLine]->TakesEnterKey() && (aKeyEvent.iCode==EKeyEnter) - ) + ) + { + CEikCaptionedControl* currentLine = ( *iLines )[iCurrentLine]; + const TInt controlType( currentLine->iControlType ); + + if ( currentLine->ControlIsAnEdwin( controlType ) ) + { + CEikEdwin* edwin = ( CEikEdwin* )currentLine->iControl; + TBool readOnly = edwin->IsReadOnly(); + + // The control is an editor which is read-only, + // such as an on/off control + if ( readOnly ) + { + iPageObserver->HandleDialogPageEventL( + MEikDialogPageObserver::EDialogPageTapped ); + return EKeyWasConsumed; + } + } + if (!IsForm()|| iIsEditable) + { return (*iLines)[iCurrentLine]->iControl->OfferKeyEventL(aKeyEvent,aType); + } + } + } return EKeyWasNotConsumed; } @@ -2189,14 +2377,18 @@ void CEikDialogPage::SetEditableL( TBool aEditable, TBool /*aActivePage*/ ) { // Tell each of the controls on the page (which are part of a form) of their editable state. - + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "CEikDialogPage::SetEditableL() aEditable: [%d]", aEditable ); iIsEditable = aEditable; + TBool initialLayoutDone = iExtension->iInitialLayoutDone; + iExtension->iInitialLayoutDone = EFalse; + HighlightVisible( aEditable ); - if ( iExtension->iUsesSingleClick ) + if ( iExtension->iUsesSingleClick && iExtension->iSetInitialFocusDone ) { - ShowFocus( EFalse ); + ShowFocus( EFalse, EFalse ); } const TInt numLines=iLines->Count() ; @@ -2268,6 +2460,15 @@ { ExposeLine(iCurrentLine,ETrue); } + + iExtension->iInitialLayoutDone = initialLayoutDone; + + if ( IsForm() ) + { + UpdatePhysics(); + } + + _AKNTRACE_FUNC_EXIT; } TBool CEikDialogPage::AnythingToDisplay() const @@ -2295,6 +2496,7 @@ void CEikDialogPage::Draw(const TRect& /*aRect*/) const { + _AKNTRACE_FUNC_ENTER; if ( iFormControl ) { // added this to see if anything on the page is visible. @@ -2308,9 +2510,6 @@ // Have to call non const leaving function... Ignore the TRAP as result is cosmetic only. TRAP_IGNORE( const_cast(this)->DrawEmptyListL( windowGcRef ) ) ; } - else - DrawVerticalLine(); - if ( IsForm() ) { @@ -2338,6 +2537,7 @@ iExtension->iRecordingGc->FlushBuffer( targetRect, lineToSkip ); } } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPage::AfterAddingNewLinesL(TInt aNewLineAdded) @@ -2354,9 +2554,14 @@ * #3 call Register component on the line, to set up listeners, etc. * #4 Set the editable value to whatever the dialog page's editable value is. */ + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "aNewLineAdded: [%d]", aNewLineAdded ); __ASSERT_DEBUG(iLines && (aNewLineAdded<=iLines->Count()), Panic(EEikDialogPanicErrorDuringAddingLine)); if (aNewLineAdded== -1) + { + _AKNTRACE_FUNC_EXIT; return; // line has not been added yet. + } CEikCaptionedControl* lineAdded = iLines->At(aNewLineAdded); // if aNewLineAdded is zero, then there is no line above, else set value. CEikCaptionedControl* lineVisuallyAboveAndNumericallyBelow = @@ -2401,6 +2606,7 @@ if ( IsForm() && iSize.iHeight != 0 && aNewLineAdded != -1 ) iLines->MoveLineToScreen( aNewLineAdded, iPhysics->ViewTopY(), EFalse ); + _AKNTRACE_FUNC_EXIT; } TInt CEikDialogPage::GetFormFlags() const @@ -2463,8 +2669,6 @@ aLine->iIsFormControl = iFormControl ; if ( iFormFlags ) aLine->SetFormFlags( iFormFlags ) ; - - aLine->GetAknLayoutValuesL() ; // should cause the control to have size. } }; @@ -2578,14 +2782,6 @@ return EFalse; } -TSize CEikDialogPage::RealDataSize() const - { - if (iLines) - if (iLines->Count()>0) - return TRect((*iLines)[0]->Rect().iTl,(*iLines)[iLines->Count()-1]->Rect().iBr).Size(); - return iSize; - } - TInt CEikDialogPage::NumberOfLines() const { if (iLines) @@ -2611,8 +2807,10 @@ // void CEikDialogPage::HandleFormPointerEventL( const TPointerEvent& aPointerEvent ) { + _AKNTRACE_FUNC_ENTER; if ( LineHandlerCalled() ) { + _AKNTRACE_FUNC_EXIT; return; } @@ -2624,6 +2822,7 @@ if ( ( aPointerEvent.iType == TPointerEvent::EButton1Down && touchedLine == KErrNotFound ) || !iPhysics->CanBeStopped() ) { IgnoreEventsUntilNextPointerUp(); + _AKNTRACE_FUNC_EXIT; return; } @@ -2665,6 +2864,7 @@ if ( aPointerEvent.iType == TPointerEvent::EButton1Down && touchedLine != KErrNotFound ) { + _AKNTRACE( "TPointerEvent::EButton1Down" ); iExtension->iOldCenterY = iPhysics->ViewCenter().iY; TInt bottom = iExtension->iOldCenterY + iSize.iHeight - iSize.iHeight / 2; if ( bottom < 0 ) @@ -2693,11 +2893,18 @@ } } iExtension->iScrolling = EFalse; - iExtension->HandleFormFeedback( this, aPointerEvent, touchedLine, iCurrentLine ); + iExtension->HandleFormFeedback( *this, + aPointerEvent, + touchedLine, + iCurrentLine ); - TBool wasScrolling = ( iPhysics->OngoingPhysicsAction() != - CAknPhysics::EAknPhysicsActionNone ); - iPhysics->Stop(); + iExtension->iWasScrolling = ( iPhysics->OngoingPhysicsAction() != + CAknPhysics::EAknPhysicsActionNone ); + if(iExtension->iWasScrolling) + { + iPhysics->Stop(); + iExtension->Feedback( *this, ETouchFeedbackList ); + } iExtension->iLastTouchedLine = touchedLine; iExtension->iDragStartPosition = aPointerEvent.iPosition; iExtension->iLastPointerPos = aPointerEvent.iPosition; @@ -2709,10 +2916,17 @@ if ( iExtension->iUsesSingleClick ) { - if ( !wasScrolling ) + if ( !iExtension->iWasScrolling ) { - HighlightVisible( ETrue ); - HighlightTimerCallBack( this ); + if ( iFormFlags & EEikFormDisableHighlightInViewMode ) + { + HighlightVisible( EFalse ); + } + else + { + HighlightVisible( ETrue ); + HighlightTimerCallBack( this ); + } } } else @@ -2739,13 +2953,18 @@ } } } + + iExtension->iFlags.Set( CDialogPageExtension::EDragEventsAllowed ); } if ( aPointerEvent.iType == TPointerEvent::EDrag ) { + _AKNTRACE( "TPointerEvent::EDrag" ); TPoint drag( iExtension->iDragStartPosition - aPointerEvent.iPosition ); - if ( Abs( drag.iY ) > iPhysics->DragThreshold() ) + if ( Abs( drag.iY ) > iPhysics->DragThreshold() + && iExtension->iFlags.IsSet( + CDialogPageExtension::EDragEventsAllowed ) ) { iExtension->iHighlightTimer->Cancel(); @@ -2765,7 +2984,6 @@ } iExtension->iScrolling = ETrue; - iExtension->iScrolled = ETrue; iExtension->iLastPointerPos = aPointerEvent.iPosition; RemovePressedDownHighlight(); iLines->MoveLineToScreen( iCurrentLine, 0, EFalse ); @@ -2790,7 +3008,11 @@ if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) { - iExtension->HandleFormFeedback( this, aPointerEvent, touchedLine, iCurrentLine ); + _AKNTRACE( "TPointerEvent::EButton1Up" ); + iExtension->HandleFormFeedback( *this, + aPointerEvent, + touchedLine, + iCurrentLine ); if ( !IsEditable() && iExtension->iUsesSingleClick && HighlightVisible() ) { @@ -2808,11 +3030,14 @@ if ( !textSelected ) { - if ( !iPhysics->StartFlick( drag, iExtension->iStartTime ) ) + if ( !iExtension->iFlags.IsSet( CDialogPageExtension::EDragEventsAllowed ) + || !iPhysics->StartFlick( drag, iExtension->iStartTime ) ) { iExtension->iScrolling = EFalse; - if ( iPageObserver && GrabbingComponent() ) + if ( iPageObserver && GrabbingComponent() + && !iExtension->iWasScrolling + && touchedLine == iCurrentLine ) { iPageObserver->HandleDialogPageEventL( MEikDialogPageObserver::EDialogPageTapped ); } @@ -2825,17 +3050,21 @@ { // feedback is given every time when new item // appears to the screen -> follows the visual feedback - iExtension->SilentFeedback( this, ETouchFeedbackSensitiveItem, 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(); } } } + + iExtension->iFlags.Clear( CDialogPageExtension::EDragEventsAllowed ); } // forward pointer event to line's observer @@ -2863,12 +3092,12 @@ ( iExtension->iFocusedClicked || iExtension->iUsesSingleClick ) && !iExtension->iScrolling ) { - mskPress = ETrue; + mskPress = ETrue; callDefaultImplementation = EFalse; } - if ( callDefaultImplementation && ( iExtension->iFocusedClicked || - iExtension->iUsesSingleClick ) && newLine ) + iExtension->iUsesSingleClick ) && newLine && + !iExtension->iWasScrolling ) { if ( newLine->ControlIsAPopfield( controlType ) ) { @@ -2892,10 +3121,11 @@ { TKeyEvent key; key.iCode=EKeyOK; - key.iModifiers=0; + key.iModifiers=EModifierSpecial; key.iRepeats = 0; - CEikonEnv::Static()->SimulateKeyEventL( key, EEventKey ); + iEikonEnv->SimulateKeyEventL( key, EEventKey ); } + _AKNTRACE_FUNC_EXIT; } @@ -2905,6 +3135,7 @@ // void CEikDialogPage::UpdatePhysics() { + _AKNTRACE_FUNC_ENTER; if ( IsForm() ) { TPoint viewCenter( iSize.iWidth / 2, 0 ); @@ -2914,13 +3145,13 @@ viewCenter.iY = Abs( (*iLines)[0]->Rect().iTl.iY - iPosition.iY ); } - viewCenter.iY += iPhysics->ViewCenterDistance(); + TInt viewCenterDistance = iPhysics->ViewCenterDistance(); + viewCenter.iY += viewCenterDistance; if ( iExtension->iInitialLayoutDone ) { TInt oldScreenHeight = iPhysics->ViewSize().iHeight; - TInt delta = ( iPhysics->ViewCenterDistance() ) - - ( oldScreenHeight / 2 ); + TInt delta = ( viewCenterDistance ) - ( oldScreenHeight / 2 ); viewCenter = iPhysics->ViewCenter(); viewCenter.iY += delta; @@ -2929,9 +3160,20 @@ TSize worldSize( iLines->MinimumSize() ); worldSize.iHeight = Max( worldSize.iHeight, iSize.iHeight ); + // align to borders if those are crossed + if ( viewCenter.iY < viewCenterDistance ) + { + viewCenter.iY = viewCenterDistance; + } + else if ( viewCenter.iY > ( worldSize.iHeight - viewCenterDistance ) ) + { + viewCenter.iY = worldSize.iHeight - viewCenterDistance; + } + TRAP_IGNORE( iPhysics->InitPhysicsL( worldSize, iSize, viewCenter ) ); TRAP_IGNORE( UpdateScrollBarL() ); } + _AKNTRACE_FUNC_EXIT; } @@ -2964,9 +3206,10 @@ if ( LineIsFocusable( touchedLine ) ) { - TRAP_IGNORE( PrepareForFocusTransitionL() ); - ChangeFocusToAndExposeL( touchedLine ); - LineChangedL( (*iLines)[touchedLine]->iId ); + TRAP_IGNORE( PrepareForFocusTransitionL(); + ChangeFocusToAndExposeL( touchedLine ); + LineChangedL( (*iLines)[touchedLine]->iId ); + ); } } } @@ -2993,7 +3236,7 @@ // --------------------------------------------------------------------------- // void CEikDialogPage::ScrollCacheByPixels( - TInt /*aDelta*/, const TDesC& /*aDebugMsg*/, TBool aDrawNow ) + TInt /*aDelta*/, TBool aDrawNow ) { if ( iLines->Count() <= 0 ) return; @@ -3028,14 +3271,34 @@ { if ( upperItem != iExtension->iTopItem || bottomItem != iExtension->iBottomItem ) { - iExtension->SilentFeedback( this, ETouchFeedbackSensitiveItem, TPointerEvent() ); + switch(iPhysics->OngoingPhysicsAction()) + { + case CAknPhysics::EAknPhysicsActionBouncing: + case CAknPhysics::EAknPhysicsActionDragging: + case CAknPhysics::EAknPhysicsActionFlicking: + iExtension->SilentFeedback( *this, + ETouchFeedbackSensitiveList, TPointerEvent() ); + break; + default: + break; + } } } else if ( upperItem >= 0 || bottomItem < iLines->Count() ) { if ( upperItem < iExtension->iTopItem || bottomItem > iExtension->iBottomItem ) { - iExtension->SilentFeedback( this, ETouchFeedbackSensitiveItem, TPointerEvent() ); + switch(iPhysics->OngoingPhysicsAction()) + { + case CAknPhysics::EAknPhysicsActionBouncing: + case CAknPhysics::EAknPhysicsActionDragging: + case CAknPhysics::EAknPhysicsActionFlicking: + iExtension->SilentFeedback( *this, + ETouchFeedbackSensitiveList, TPointerEvent() ); + break; + default: + break; + } } } iExtension->iBottomItem = bottomItem; @@ -3054,6 +3317,14 @@ // void CEikDialogPage::UpdateLineInCache( CEikCaptionedControl* aLine ) { + _AKNTRACE_FUNC_ENTER; + + if ( !IsActivated() ) + { + _AKNTRACE_FUNC_EXIT; + return; + } + TInt lineIndex = iLines->FindLineIndex( aLine ); if ( lineIndex != KErrNotFound ) @@ -3080,6 +3351,7 @@ { UpdatePhysics(); } + _AKNTRACE_FUNC_EXIT; } @@ -3090,6 +3362,7 @@ void CEikDialogPage::Synchronize() { iExtension->iScrolling = EFalse; + iExtension->iFlags.Clear( CDialogPageExtension::EDragEventsAllowed ); iLines->MoveLineToScreen( iCurrentLine, iPhysics->ViewTopY(), ETrue ); } @@ -3127,6 +3400,7 @@ // void CEikDialogPage::RecordLinesL() { + _AKNTRACE_FUNC_ENTER; Parent()->Parent()->Parent()->SetCustomGc( iExtension->iRecordingGc ); iExtension->iRecordingGc->PurgeBuffer(); @@ -3142,6 +3416,7 @@ } Parent()->Parent()->Parent()->SetCustomGc( NULL ); + _AKNTRACE_FUNC_EXIT; } @@ -3151,6 +3426,8 @@ // void CEikDialogPage::RecordLineL( TInt aLine ) { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE( "CEikDialogPage::RecordLineL() aLine: [%d]", aLine ); Parent()->Parent()->Parent()->SetCustomGc( iExtension->iRecordingGc ); CEikCaptionedControl* line = (*iLines)[aLine]; @@ -3163,22 +3440,7 @@ } Parent()->Parent()->Parent()->SetCustomGc( NULL ); - } - - -// --------------------------------------------------------------------------- -// CEikDialogPage::ScrollByPixels -// --------------------------------------------------------------------------- -// -void CEikDialogPage::ScrollByPixels( TInt aDelta ) - { - if ( aDelta != 0 ) - { - iLines->ScrollByPixels( aDelta ); - TRAP_IGNORE( UpdateScrollBarL() ); - DrawNow(); - TRAP_IGNORE( RecordLinesL() ); - } + _AKNTRACE_FUNC_EXIT; } @@ -3197,7 +3459,7 @@ currentLine->SetPressedDownState( EFalse ); if ( IsForm() ) { - RecordLineL( iCurrentLine ); + TRAP_IGNORE( RecordLineL( iCurrentLine ) ); } } } @@ -3282,12 +3544,10 @@ CCoeControl* grabbingComponent = GrabbingComponent(); TBool callDefaultImplementation = ETrue; TBool focusItem = EFalse; - // YPosToLine is scaled to iDataWinPos, so add it to pointer Y position - TInt yPosition = aPointerEvent.iPosition.iY; // + iDataWinPos.iY; - TInt touchedLineIndex = YPosToLine2( yPosition ); + TInt touchedLineIndex = iLines->YPositionToLineIndex( aPointerEvent.iPosition.iY ); + // If the stylus is down and the touched line is already the current one, // mark this fact in iExtension->iFocusedClicked to be used later when the stylus is up. - if ( touchedLineIndex != KErrNotFound && iExtension->iCapturingItem != KErrNotFound && touchedLineIndex != iExtension->iCapturingItem ) @@ -3471,16 +3731,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 ); @@ -3499,7 +3762,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. @@ -3644,6 +3907,7 @@ TInt CEikDialogPageContainer::ActivateFirstPageL() { + _AKNTRACE_FUNC_ENTER; // Activate first page that isn't dimmed. // SetToolTips() ; const TInt numPages=iPageArray->Count(); @@ -3660,6 +3924,7 @@ thisPage->ReportPageChangedL(); iActivePage=ii; } + _AKNTRACE_FUNC_EXIT; return thisPage->PageId(); } } @@ -3674,6 +3939,7 @@ firstPage->ReportPageChangedL(); iActivePage=0; } + _AKNTRACE_FUNC_EXIT; return firstPage->PageId(); } @@ -4012,6 +4278,7 @@ void CEikDialogPageContainer::ActivateL() { + _AKNTRACE_FUNC_ENTER; // Pass the activate event to child controls always. CCoeControl::ActivateL(); // @@ -4039,6 +4306,7 @@ } } } + _AKNTRACE_FUNC_EXIT; } void CEikDialogPageContainer::FocusChanged(TDrawNow aDrawNow) @@ -4149,7 +4417,9 @@ CCoeControl::HandleResourceChange(aType); - if(aType==KEikDynamicLayoutVariantSwitch) + // if this is a form then its size has been set already by + // CEikDialog::HandleResourceChange + if ( aType == KEikDynamicLayoutVariantSwitch && !iForm ) { SizeChanged(); } @@ -4172,32 +4442,15 @@ iPageSelector = aPageSelector; } -void CEikDialogPageContainer::SetPageFormSized() +void CEikDialogPageContainer::SetPageFormSized(const TRect& aRect) { iForm = ETrue; // // Form layout - // - - /** Dialog page container and page have the same size */ - TRect mainPaneRect; - AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ); - mainPaneRect = TRect( mainPaneRect.Size() ); // Moving to point (0, 0) - TAknLayoutRect formPaneLt; - formPaneLt.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_form_pane().LayoutLine() ); - formPaneLt.LayoutRect( formPaneLt.Rect(), AknLayoutScalable_Avkon::list_form_gen_pane().LayoutLine() ); + // - // - // End of form layout - // - - if ( formPaneLt.Rect() != Rect() ) - { - // TODO: use static method to do variation between traditional scrolling and panning when available - //SetRect( formPaneLt.Rect() ); - SetRect( mainPaneRect ); - } + SetRect(aRect); /** Only forms have line highlight animations. Animation creation is delayed * here.