diff -r c52421ed5f07 -r a1caeb42b3a3 uifw/EikStd/dlgsrc/EIKDPAGE.CPP --- a/uifw/EikStd/dlgsrc/EIKDPAGE.CPP Mon Jun 21 15:57:43 2010 +0300 +++ b/uifw/EikStd/dlgsrc/EIKDPAGE.CPP Thu Jul 15 18:56:19 2010 +0300 @@ -94,7 +94,8 @@ public: enum TFlags { - ELineHandlerCalled + ELineHandlerCalled, + EDragEventsAllowed // turned on when dragging is allowed }; static CDialogPageExtension* NewL(); ~CDialogPageExtension(); @@ -131,7 +132,6 @@ TBool iExternalScrollbar; TBool iIsDoubleQuery; TBool iFocusedClicked; - TInt iPreviousThumbPosition; TBool iPreviousThumbDirection; MTouchFeedback* iFeedback; TBitFlags iFlags; @@ -495,7 +495,6 @@ thisLine->iIsFormControl = aFormControl ; if ( aFormControl ) { - thisLine->GetAknLayoutValuesL() ; // should cause the control to have size. if ( iFormFlags ) thisLine->SetFormFlags( iFormFlags ) ; } @@ -1329,27 +1328,6 @@ 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 - { - _AKNTRACE_FUNC_ENTER; - ASSERT(iLines); - const TInt numLines=iLines->Count(); - ASSERT(numLines>0); - if (aLine<0) - aLine=0; - else if (aLine>=numLines) - aLine=numLines-1; - _AKNTRACE( "[%s][%s][%d]", "CEikDialogPage", __FUNCTION__, (*iLines)[aLine]->Position().iY ); - _AKNTRACE_FUNC_EXIT; - return (*iLines)[aLine]->Position().iY; // TPREMOVAL +iDataWinPos.iY; - } void CEikDialogPage::ExposeLine(TInt aLine, TBool aForceResize, TBool aShowWholeLine) // @@ -1523,13 +1501,31 @@ } iLines->SetRect( Rect(), iScroll->Top(), iScroll->Middle(), iScroll->Bottom() ); - iExtension->iInitialLayoutDone = ETrue; UpdatePhysics(); - if ( ( count > 0 ) && ( iCurrentLine >= 0 ) ) + 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. @@ -1633,7 +1629,7 @@ if ( i != iCurrentLine ) { - DrawNow(); + DrawDeferred(); } break; @@ -1678,7 +1674,7 @@ { RecordLineL( i ); } - DrawNow(); + DrawDeferred(); break; } } @@ -1737,16 +1733,10 @@ KAknsIIDQsnFrInput, KAknsIIDDefault ) ; } - } - } - } -void CEikDialogPage::DrawVerticalLine() const - { - } void CEikDialogPage::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType) { @@ -1823,7 +1813,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) @@ -1878,54 +1868,6 @@ } -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; @@ -1990,21 +1932,12 @@ 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()*/ ); + TRect scrollBarParent( MainPane().Size() ); AknLayoutUtils::LayoutVerticalScrollBar(iPageContainer->ScrollBar(), scrollBarParent, layout.LayoutLine()); if(!ScbState() && iCurrentLine!=-1 && iCurrentLine < iLines->Count() ) @@ -2047,7 +1980,6 @@ 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); @@ -2423,7 +2355,7 @@ if ( iExtension->iUsesSingleClick && iExtension->iSetInitialFocusDone ) { - ShowFocus( EFalse ); + ShowFocus( EFalse, EFalse ); } const TInt numLines=iLines->Count() ; @@ -2545,9 +2477,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() ) { @@ -2707,8 +2636,6 @@ aLine->iIsFormControl = iFormControl ; if ( iFormFlags ) aLine->SetFormFlags( iFormFlags ) ; - - aLine->GetAknLayoutValuesL() ; // should cause the control to have size. } }; @@ -2822,14 +2749,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) @@ -3001,6 +2920,8 @@ } } } + + iExtension->iFlags.Set( CDialogPageExtension::EDragEventsAllowed ); } if ( aPointerEvent.iType == TPointerEvent::EDrag ) @@ -3008,7 +2929,9 @@ _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(); @@ -3074,7 +2997,8 @@ if ( !textSelected ) { - if ( !iPhysics->StartFlick( drag, iExtension->iStartTime ) ) + if ( !iExtension->iFlags.IsSet( CDialogPageExtension::EDragEventsAllowed ) + || !iPhysics->StartFlick( drag, iExtension->iStartTime ) ) { iExtension->iScrolling = EFalse; @@ -3106,6 +3030,8 @@ } } } + + iExtension->iFlags.Clear( CDialogPageExtension::EDragEventsAllowed ); } // forward pointer event to line's observer @@ -3186,13 +3112,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; @@ -3201,6 +3127,16 @@ 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() ); } @@ -3267,7 +3203,7 @@ // --------------------------------------------------------------------------- // void CEikDialogPage::ScrollCacheByPixels( - TInt /*aDelta*/, const TDesC& /*aDebugMsg*/, TBool aDrawNow ) + TInt /*aDelta*/, TBool aDrawNow ) { if ( iLines->Count() <= 0 ) return; @@ -3302,17 +3238,16 @@ { if ( upperItem != iExtension->iTopItem || bottomItem != iExtension->iBottomItem ) { - if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionDragging ) - { - iExtension->Feedback( *this, ETouchFeedbackSensitiveList ); - } - else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking ) + switch(iPhysics->OngoingPhysicsAction()) { - iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() ); - } - else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionBouncing ) - { - iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() ); + case CAknPhysics::EAknPhysicsActionBouncing: + case CAknPhysics::EAknPhysicsActionDragging: + case CAknPhysics::EAknPhysicsActionFlicking: + iExtension->SilentFeedback( *this, + ETouchFeedbackSensitiveList, TPointerEvent() ); + break; + default: + break; } } } @@ -3320,17 +3255,16 @@ { if ( upperItem < iExtension->iTopItem || bottomItem > iExtension->iBottomItem ) { - if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionDragging ) - { - iExtension->Feedback( *this, ETouchFeedbackSensitiveList ); - } - else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionFlicking ) + switch(iPhysics->OngoingPhysicsAction()) { - iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() ); - } - else if( iPhysics->OngoingPhysicsAction() == CAknPhysics::EAknPhysicsActionBouncing ) - { - iExtension->SilentFeedback( *this, ETouchFeedbackSensitiveList, TPointerEvent() ); + case CAknPhysics::EAknPhysicsActionBouncing: + case CAknPhysics::EAknPhysicsActionDragging: + case CAknPhysics::EAknPhysicsActionFlicking: + iExtension->SilentFeedback( *this, + ETouchFeedbackSensitiveList, TPointerEvent() ); + break; + default: + break; } } } @@ -3395,6 +3329,7 @@ void CEikDialogPage::Synchronize() { iExtension->iScrolling = EFalse; + iExtension->iFlags.Clear( CDialogPageExtension::EDragEventsAllowed ); iLines->MoveLineToScreen( iCurrentLine, iPhysics->ViewTopY(), ETrue ); } @@ -3477,22 +3412,6 @@ // --------------------------------------------------------------------------- -// CEikDialogPage::ScrollByPixels -// --------------------------------------------------------------------------- -// -void CEikDialogPage::ScrollByPixels( TInt aDelta ) - { - if ( aDelta != 0 ) - { - iLines->ScrollByPixels( aDelta ); - TRAP_IGNORE( UpdateScrollBarL() ); - DrawNow(); - TRAP_IGNORE( RecordLinesL() ); - } - } - - -// --------------------------------------------------------------------------- // CEikDialogPage::RemovePressedDownHighlight // --------------------------------------------------------------------------- // @@ -3592,12 +3511,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 )