cmmanager/cmmgr/Framework/Src/cmdesticonmap.cpp
branchRCL_3
changeset 26 0a9e01492035
parent 1 40cb640ef159
--- a/cmmanager/cmmgr/Framework/Src/cmdesticonmap.cpp	Tue May 11 16:35:05 2010 +0300
+++ b/cmmanager/cmmgr/Framework/Src/cmdesticonmap.cpp	Tue May 25 13:08:02 2010 +0300
@@ -285,9 +285,6 @@
     iFirstVisibleRow = 0;
     iAnimated = EFalse;
     iCursorPos = TPoint( 0, 0 );
-    iNumPages = ( iRows / iExtension->iMaxVisibleRows ) + 
-                ( iRows % iExtension->iMaxVisibleRows ? 1 : 0 );
-    iCurrentPage = 1;
     
     // Create and set the scb visible even though there is nothing to scroll   
     delete iSBFrame; iSBFrame=NULL;
@@ -364,9 +361,9 @@
     // Main pane without softkeys
     TRect mainPaneRect;
     if ( !AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect ) )
-    {
-    mainPaneRect = iAvkonAppUi->ClientRect();
-    }
+        {
+        mainPaneRect = iAvkonAppUi->ClientRect();
+        }
     
     // Dialog layout, check variety first
     TAknLayoutScalableParameterLimits iconMapDialogVariety = 
@@ -409,10 +406,14 @@
     // if more lines than possible to show, use the default 
     // ( the biggest grid ) variety
     if ( varietyNumber < 0 )
-       varietyNumber = 0;
+        {
+        varietyNumber = 0;
+        }
     // if zero rows, use the minimum
     else if ( iRows<=0 )
-       varietyNumber -= 1;
+        {
+        varietyNumber -= 1;
+        }
     
     //add the varietyoffset
     varietyNumber += maxVarietyOffset;
@@ -528,32 +529,20 @@
     {
     if ( AknLayoutUtils::PenEnabled() )
         {
-        TInt newGridX; // For the whole
-        TInt newGridY; // For the whole grid.
+        TInt xInPixels = aPointerEvent.iPosition.iX - iGridTopLeft.iX;
         TInt yInPixels = aPointerEvent.iPosition.iY - iGridTopLeft.iY;
-        newGridY = yInPixels / iGridItemHeight;
-        if ( ( aPointerEvent.iPosition.iX - iGridTopLeft.iX ) < 0 )
-            {
-            newGridX = -1;
-            }
-        else
-            {
-            newGridX = ( aPointerEvent.iPosition.iX - iGridTopLeft.iX )
-                                                        / iGridItemWidth;
-            }
+        TInt newGridX = xInPixels / iGridItemWidth;
+        TInt newGridY = yInPixels / iGridItemHeight;
+        TInt globalY = newGridY + iFirstVisibleRow;
 
         // The pointer has been set down or dragged into the area of the grid. 
-        // (it might be in the "white space" at the end of the grid)
-        if ( ( yInPixels >= 0 && yInPixels < iGridItemHeight 
-                * iExtension->iMaxVisibleRows) &&
-            // When the pointer is in rows except the recent icon row
-                ( ( ( ( newGridY + iFirstVisibleRow ) != 0 ) && 
-                newGridX < iMaxColumns && newGridX >= 0 ) ||
-            // When the pointer is in the recent icon row
-                ( ( newGridY + iFirstVisibleRow == 0 ) && 
-                ( newGridX < iMaxColumns ) ) ) )
+        // Also, it may NOT be in the "empty slots" at the end of the grid.
+        if ( xInPixels >= 0 &&
+                yInPixels >= 0 && 
+                newGridX < iMaxColumns &&
+                yInPixels < iGridItemHeight * iExtension->iMaxVisibleRows &&
+                globalY * iMaxColumns + newGridX + 1 <= iConsArray->Count() )
             {
-            TUint globalY = newGridY + iFirstVisibleRow;
             // For any action to be taken, the pointer event must either be a
             // Button1Down or a drag event which has originated from a
             // Button1Down in to the grid.
@@ -727,11 +716,15 @@
     // if more lines than possible to show, use the default 
     // ( the biggest grid ) variety
     if ( varietyNumber < 0 )
-       varietyNumber = 0;
+        {
+        varietyNumber = 0;
+        }
     // if zero rows, use the minimum
     else if ( iRows<=0 )
-       varietyNumber -= 1;
-    
+        {
+        varietyNumber -= 1;
+        }
+
     //add the varietyoffset
     varietyNumber += maxVarietyOffset;
     
@@ -749,10 +742,9 @@
         else
             {
             varietyNumber = 3;
-            }            
-        
-        }       
-    
+            }
+        }
+
     TAknLayoutRect popupGridLayRect;
     popupGridLayRect.LayoutRect( mainPaneRect, 
           AknLayoutScalable_Avkon::popup_grid_graphic_window( varietyNumber ) );
@@ -832,8 +824,7 @@
         {
         // save the old info for the magnitudes of the SCT grid
         TInt oldMaxColumns = iMaxColumns;
-        //TInt oldMaxRows = 0;
-        //oldMaxRows = iRows;
+
         // calculate the new magnitudes
         DoLayout();
         
@@ -1023,7 +1014,7 @@
 
         TPoint pos = iGridTopLeft;
 
-        TInt endX = pos.iX + iGridItemWidth * iMaxColumns + 1;
+        TInt endX = pos.iX + iGridItemWidth * iMaxColumns;
         TInt endY = pos.iY + iGridItemHeight * fullRows;
 
         TInt ii = 0;
@@ -1039,7 +1030,7 @@
                 pos.iX += iGridItemWidth;
                 }
 
-                pos = iGridTopLeft;
+            pos = iGridTopLeft;
 
             // Draw full horizontal lines
             for ( ii = 0 ; ii <= fullRows ; ii++ )
@@ -1074,9 +1065,8 @@
                 }
             }
         
-        TInt iconIndex = ( iCurrentPage - 1 ) * 
-                         ( iMaxColumns * iExtension->iMaxVisibleRows );
-        TInt lCnt =  iConsArray->Count(); 
+        TInt iconIndex = iFirstVisibleRow * iMaxColumns;
+        TInt lCnt = iConsArray->Count(); 
         cursorPos = iCursorPos.iX + iCursorPos.iY * iMaxColumns;
         if ( lCnt > 0 )
             {
@@ -1086,7 +1076,7 @@
                   j < lCnt && i < numberOfIconsToBeDrawn;
                   j++, i++ )
                 {
-                DrawItem( gc, CursorRect( i ), j, cursorPos == i, EFalse );        
+                DrawItem( gc, i, j, cursorPos == i, EFalse );        
                 }     
             }
             
@@ -1101,18 +1091,22 @@
 //
 void CCmDestinationIconMap::DrawItem( 
     CWindowGc& aGc,
-    const TRect& aSctPosition,
+    TInt index,
     TInt aIconIndex,
     TBool aHighlighted,
     TBool aDrawBackground ) const
     {
+    TRect sctPosition = CursorRect( index );
     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
     MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
     
-    TBool skins = AknsDrawUtils::Background( skin,cc,aGc, aSctPosition );    
+    TBool skins = AknsDrawUtils::Background( skin,cc,aGc, sctPosition );    
     TRgb color;
     if ( !skins )
+        {
         aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+        }
+    
     if ( aHighlighted )
         {
         TRgb colorHightLightRect = AKN_LAF_COLOR( 215 );
@@ -1121,10 +1115,10 @@
                                    KAknsIIDQsnLineColors, 
                                    EAknsCIQsnLineColorsCG7 );
         aGc.SetPenColor( colorHightLightRect );
-        aGc.DrawRect( aSctPosition );
+        aGc.DrawRect( sctPosition );
 
         // Shrink by one pixel in all directions.
-        TRect innerRect = aSctPosition;
+        TRect innerRect = sctPosition;
         innerRect.Shrink( 1,1 );
 
         color = AKN_LAF_COLOR( 210 );
@@ -1137,7 +1131,7 @@
         }
     else if ( aDrawBackground )
         {
-        TRect innerRect = aSctPosition;
+        TRect innerRect = sctPosition;
         aGc.SetBrushColor( AKN_LAF_COLOR( 0 ) );
         if ( !skins )
             {
@@ -1159,13 +1153,8 @@
 
             CGulIcon* bitmap = NULL;
             bitmap = iConsArray->At( aIconIndex );
-            TInt numIconsInaPage = iExtension->iMaxVisibleRows * iMaxColumns;
-            TInt cellIndex = aIconIndex;
-            if ( aIconIndex >= numIconsInaPage )
-                {
-                cellIndex = aIconIndex % numIconsInaPage;
-                }
-            aGc.BitBltMasked( CursorPoint( cellIndex ),
+
+            aGc.BitBltMasked( CursorPoint( index ),
                             bitmap->Bitmap(),
                             cellRect,
                             bitmap->Mask(),
@@ -1218,7 +1207,7 @@
 
     Window().Invalidate( rect );
     Window().BeginRedraw( rect );
-    DrawItem( SystemGc(), rect, iconIndex, aHighlighted, ETrue );
+    DrawItem( SystemGc(), aCursorPos, iconIndex, aHighlighted, ETrue );
     Window().EndRedraw();
     SystemGc().DiscardFont();
     }
@@ -1272,10 +1261,14 @@
 void CCmDestinationIconMap::MoveCursorL( TInt aDeltaX, TInt aDeltaY )
     {           
     if ( iIsMirrored )
+        {
         aDeltaX = -aDeltaX;
+        }
     
     if ( ( iConsArray->Count() < 8 ) )
-       return;
+        {
+        return;
+        }
 
     iOldCursorPos = iCursorPos;
     TInt oldFirstVisibleRow = iFirstVisibleRow;
@@ -1443,11 +1436,6 @@
             }
         }
        
-    //TInt increment( 1 );
-    //if ( aDeltaY < 0 || aDeltaX < 0 )
-    //    {
-    ////    increment = -1;
-    //    }
     if ( iRows > iExtension->iMaxVisibleRows && 
         ( iOldCursorPos.iY + oldFirstVisibleRow != 
           iCursorPos.iY + iFirstVisibleRow ) )
@@ -1571,17 +1559,13 @@
     TAknWindowComponentLayout scrollbarLayout = 
                                     AknLayoutScalable_Avkon::scroll_pane_cp5();
     
-    iCurrentPage = ( iFirstVisibleRow / iExtension->iMaxVisibleRows ) + 1;
-
-    vSbarModel.iScrollSpan = iNumPages * iExtension->iMaxVisibleRows;
+    vSbarModel.iScrollSpan = iRows;
     vSbarModel.iThumbSpan = iExtension->iMaxVisibleRows;
     
-    if ( iSBFrame && iSBFrame->TypeOfVScrollBar() == 
-         CEikScrollBarFrame::EDoubleSpan )
+    if ( iSBFrame->TypeOfVScrollBar() == CEikScrollBarFrame::EDoubleSpan )
         {    
         // For EDoubleSpan type scrollbar
-        vSbarModel.iThumbPosition = ( iCurrentPage - 1 ) * 
-                                    iExtension->iMaxVisibleRows;
+        vSbarModel.iThumbPosition = iFirstVisibleRow;
         TAknDoubleSpanScrollBarModel hDsSbarModel( hSbarModel );
         TAknDoubleSpanScrollBarModel vDsSbarModel( vSbarModel );
         
@@ -1675,7 +1659,8 @@
             else if ( location == AknLayoutUtils::EAknCbaLocationLeft )
                {
                maxVarietyOffset = varietyOffset + varietyOffset; // 2*
-               }   
+               }
+
             TInt varietyNumber = varietyOffset - iRows - 1; 
             
             // if more lines than possible to show, use the default 
@@ -1886,7 +1871,7 @@
     TInt cellHeight = cellRect.Height();
     
     // calculate the number of items fitting to grid
-    iExtension->iMaxVisibleRows = 3;//gridHeight / cellHeight;
+    iExtension->iMaxVisibleRows = 3; //gridHeight / cellHeight;
     
     // Store the item height
     TAknLayoutRect secondRowLayRect;
@@ -1913,9 +1898,13 @@
         case EEikScrollPageUp:
             {           
             // nothing done if we are already on the first page.
-            if ( iFirstVisibleRow != 0 )
-                {               
-                iFirstVisibleRow -= iExtension->iMaxVisibleRows;             
+            if ( iFirstVisibleRow > 0 )
+                {
+                iFirstVisibleRow -= iExtension->iMaxVisibleRows;
+                if ( iFirstVisibleRow < 0 )
+                    {
+                    iFirstVisibleRow = 0;
+                    }
                 update = ETrue;
                 }
             UpdateScrollIndicatorL();
@@ -1926,10 +1915,13 @@
         case EEikScrollPageDown:
             {           
             // nothing done if we are already on the last page.
-            if ( iFirstVisibleRow != iRows/iExtension->iMaxVisibleRows * 
-                                     iExtension->iMaxVisibleRows )
+            if ( iFirstVisibleRow < iRows - iExtension->iMaxVisibleRows ) 
                 {
                 iFirstVisibleRow += iExtension->iMaxVisibleRows;
+                if ( iFirstVisibleRow > iRows - iExtension->iMaxVisibleRows )
+                    {   
+                    iFirstVisibleRow = iRows - iExtension->iMaxVisibleRows;
+                    }
                 update = ETrue;
                 }
             UpdateScrollIndicatorL();
@@ -1937,13 +1929,10 @@
             break;   
                
         case EEikScrollThumbDragVert:
-            {           
-            TInt thumbPosition;         
-            TInt halfPage = iExtension->iMaxVisibleRows/2;
+            {        	
             // Ask which type of scrollbar is shown
-            //CAknAppUi* appUi = iAvkonAppUi;            
-            TBool isDoubleSpan = 
-                CEikScrollBarFrame::EDoubleSpan == iSBFrame->TypeOfVScrollBar();
+            TInt thumbPosition;
+            TBool isDoubleSpan = ( CEikScrollBarFrame::EDoubleSpan == iSBFrame->TypeOfVScrollBar() );
             if ( isDoubleSpan )
                 {
                 thumbPosition = static_cast <const TAknDoubleSpanScrollBarModel*>( 
@@ -1953,24 +1942,10 @@
                 {
                 thumbPosition = aScrollBar->Model()->iThumbPosition;
                 }
-
-            // If the slider is in the range of less then a half page from a 
-            // possible correct thumb position. thus 0 <= iFirstVisibleRow - 
-            // thumbPosition < halfPage. Or in the other direction:
-            // 0 <= thumbPosition - iFirstVisibleRow < halfPage
-            if ( !( ( 0 <= iFirstVisibleRow - thumbPosition &&
-                        iFirstVisibleRow - thumbPosition < halfPage )||                         
-                  ( 0 <= thumbPosition - iFirstVisibleRow && 
-                        thumbPosition - iFirstVisibleRow < halfPage ) ) )
-                {               
-                TReal toRound = thumbPosition / 
-                                ( TReal )iExtension->iMaxVisibleRows;
-                if ( toRound * 2 > ( TInt )toRound * 2 + 1 )
-                    {
-                    toRound++;
-                    }                  
-                iFirstVisibleRow = ( TInt )toRound * 
-                                   iExtension->iMaxVisibleRows;
+            
+            if ( thumbPosition != iFirstVisibleRow )
+                {
+                iFirstVisibleRow = thumbPosition;
                 update = ETrue;
                 }
             }
@@ -1978,6 +1953,19 @@
         
         case EEikScrollThumbReleaseVert:
             {
+            // Ask which type of scrollbar is shown
+            TBool isDoubleSpan = 
+                CEikScrollBarFrame::EDoubleSpan == iSBFrame->TypeOfVScrollBar();
+            if ( isDoubleSpan )
+                {
+                iFirstVisibleRow = static_cast <const TAknDoubleSpanScrollBarModel*>( 
+                                            aScrollBar->Model() )->FocusPosition();
+                }
+            else
+                {
+                iFirstVisibleRow = aScrollBar->Model()->iThumbPosition;
+                }
+            update = ETrue;
             UpdateScrollIndicatorL();
             }
             break;
@@ -1988,53 +1976,11 @@
         case EEikScrollPageRight: // flow through
         case EEikScrollThumbDragHoriz: // flow through
         case EEikScrollThumbReleaseHoriz: // flow through
-            // do nothing
-            break;  
-            
         default: 
             // do nothing
             break; 
         }
-        
-    // If we have moved down to the last page we check that the cursor is in 
-    // a place where it can be drawn.       
-    if ( iFirstVisibleRow == 
-         iRows/iExtension->iMaxVisibleRows * iExtension->iMaxVisibleRows )
-        {
-        // the old cursor is set to a "safe" position where it at least can be.
-        iOldCursorPos.iX = 0;
-        iOldCursorPos.iY = 0;                                                    
-        // if the last page has only one line which isn't filled complitely.
-        if ( ( iConsArray->Count() % iMaxColumns - 1 < iCursorPos.iX ) && 
-             ( iRows % iExtension->iMaxVisibleRows ) == 1 )
-            {
-            iCursorPos.iX = iConsArray->Count()%iMaxColumns - 1;
-            }                        
-        // If the cursor is in a position where it would go unto a spot without 
-        // a icon when scrolled.
-        if ( iCursorPos.iY + iFirstVisibleRow >= iRows )
-            {                        
-            if ( iConsArray->Count() % iMaxColumns > iCursorPos.iX )
-                {                                                      
-                iCursorPos.iY = iRows - 1 - iFirstVisibleRow;                             
-                }
-            else
-                {                            
-                iCursorPos.iY = iRows - 2 - iFirstVisibleRow;
-                } 
-            }
-        // If the cursor is actually on the last row, but is still in the
-        // area where there is now icons. ( the rest of the last row )
-        if ( ( iConsArray->Count() <= ( iFirstVisibleRow + iCursorPos.iY ) 
-                                        * iMaxColumns + iCursorPos.iX ) &&
-             ( iCursorPos.iY + iFirstVisibleRow + 1 == iRows ) )
-            {
-            iCursorPos.iY--;
-            }
-        // if the corrections did not help and the cursor is in the area
-        // where there is a valid row, but no icons anymore
-        }
-        
+                
     // to avoid flicker we draw only if there really was something new to draw.
     if ( update )
         {