javauis/lcdui_akn/lcdui/src/CMIDChoiceGroupListBox.cpp
branchRCL_3
changeset 66 2455ef1f5bbc
child 77 7cee158cb8cd
equal deleted inserted replaced
65:ae942d28ec0e 66:2455ef1f5bbc
       
     1 /*
       
     2 * Copyright (c) 2003-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  The CMIDChoiceGroup listbox
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "CMIDChoiceGroupListBox.h"
       
    20 // API for iChoiceControl
       
    21 #include "CMIDChoiceGroupControl.h"
       
    22 #include "CMIDChoiceGroupModel.h"
       
    23 
       
    24 #include <e32def.h>
       
    25 // using for CColumnListBoxData related to colors
       
    26 // and in HandleResourceChange function - setting icon array
       
    27 #include <eikclbd.h>
       
    28 #include <AknsFrameBackgroundControlContext.h>
       
    29 #include <AknUtils.h>
       
    30 #include <AknsDrawUtils.h>
       
    31 #include <skinlayout.cdl.h>
       
    32 #include <layoutmetadata.cdl.h>
       
    33 
       
    34 // LAF
       
    35 // AknLayoutScalable_Avkon::list_single_pane_cp2
       
    36 #include <aknlayoutscalable_avkon.cdl.h> // LAF
       
    37 
       
    38 #include <j2me/jdebug.h>
       
    39 
       
    40 #undef  TRAP_INSTRUMENTATION_LEAVE
       
    41 #define TRAP_INSTRUMENTATION_LEAVE(aResult) DEBUG_INT2("In CMIDChoiceGroupListBox.cpp, trapped method was called at line %D and got exception %D", __LINE__, aResult);
       
    42 
       
    43 
       
    44 CMIDChoiceGroupListBox::CMIDChoiceGroupListBox(CMIDChoiceGroupControl* aChoiceControl)
       
    45         : CAknColumnListBox()
       
    46         , iChoiceControl(aChoiceControl)
       
    47 #ifdef RD_JAVA_S60_RELEASE_9_2
       
    48         , iHighlight(EFalse)
       
    49         , iTopVisibleItemIndex(KErrNotFound)
       
    50 #endif // RD_JAVA_S60_RELEASE_9_2
       
    51 {
       
    52     ASSERT(iChoiceControl);
       
    53 }
       
    54 
       
    55 CMIDChoiceGroupListBox::~CMIDChoiceGroupListBox()
       
    56 {
       
    57 }
       
    58 
       
    59 // Constructs the listbox with the model created and owned outside.
       
    60 // Makes sure the EKeepModel flag is set, in order to not destroy
       
    61 // the model when listbox is destroyed
       
    62 void CMIDChoiceGroupListBox::ConstructL(
       
    63     const CCoeControl* aParent,
       
    64     TInt aFlags,
       
    65     CMIDChoiceGroupModel* aModel)
       
    66 {
       
    67     // Model is owned outside, set it here, so that when
       
    68     // CCAknColumnListBox::ConstructL() calls CreateModelL(),
       
    69     // it is already in place. Absolutely make sure that the
       
    70     // model owned outside flag is set
       
    71     iModel = aModel;
       
    72     aFlags |= EKeepModel;
       
    73 
       
    74     CAknColumnListBox::ConstructL(aParent, aFlags);
       
    75     iListBoxFlags &= ~ELoopScrolling;
       
    76 
       
    77     if (iChoiceControl->ChoiceType() == MMIDChoiceGroup::EPopup)
       
    78     {
       
    79         TAknLayoutRect layoutRect;
       
    80         // layout in respect of the screen as only the height is needed
       
    81         layoutRect.LayoutRect(iEikonEnv->ScreenDevice()->SizeInPixels(), AknLayoutScalable_Avkon::list_single_pane_cp2(0).LayoutLine());
       
    82         SetItemHeightL(layoutRect.Rect().Height());
       
    83     }
       
    84 #ifndef RD_JAVA_FOR_S60_5_0_w49_2008
       
    85     else
       
    86     {
       
    87         // Disable flick/panning functionality
       
    88         // Disbled in OMJ DisableScrolling( ETrue );
       
    89     }
       
    90 #endif // RD_JAVA_FOR_S60_5_0_w49_2008
       
    91 
       
    92 #ifdef RD_SCALABLE_UI_V2
       
    93     SetAllowStrayPointers();
       
    94 #endif
       
    95 
       
    96 #ifdef RD_TACTILE_FEEDBACK
       
    97     iFeedback = MTouchFeedback::Instance();
       
    98 #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
       
    99     iFeedback->EnableFeedbackForControl(this, FALSE);
       
   100 #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK
       
   101 #endif //RD_TACTILE_FEEDBACK
       
   102 
       
   103 }
       
   104 
       
   105 // Overridden, because CEikListBox returns EKeyWasConsumed when
       
   106 // up is pressed on the first item, or down on last. We need to
       
   107 // return not consumed in order to make the form move focus
       
   108 // to other items
       
   109 // Offers key events to the listbox
       
   110 TKeyResponse CMIDChoiceGroupListBox::OfferKeyEventL(
       
   111     const TKeyEvent& aKeyEvent,
       
   112     TEventCode aType)
       
   113 {
       
   114     // First save the currently selected item
       
   115     TInt oldCurrent = iView->CurrentItemIndex();
       
   116 
       
   117     TKeyResponse resp = EKeyWasNotConsumed;
       
   118 
       
   119 #ifdef RD_JAVA_S60_RELEASE_9_2
       
   120     if (iChoiceControl->ChoiceType() != MMIDChoiceGroup::EPopup)
       
   121     {
       
   122         if (aType != EEventKey || iHighlight)
       
   123         {
       
   124             // Do not pass the EEventKey to ListBox in case of first
       
   125             // HW key action after highlight was disabled.
       
   126             resp = CAknColumnListBox::OfferKeyEventL(aKeyEvent, aType);
       
   127         }
       
   128         else
       
   129         {
       
   130             // This is first HW key action after highlight was disabled:
       
   131             // highlight should be enabled
       
   132             UpdateTopVisibleItemIndex();
       
   133             if (iTopVisibleItemIndex > KErrNotFound)
       
   134             {
       
   135                 // First top visible element should be highlighted
       
   136                 iView->SetCurrentItemIndex(iTopVisibleItemIndex);
       
   137 
       
   138                 // Item drawer must know, that highlight should be enabled
       
   139                 // from now.
       
   140                 if (IsHighlightNeeded(oldCurrent,aKeyEvent))
       
   141                 {
       
   142                     SingleClickDisableHighlightL(EFalse);
       
   143                 }
       
   144                 resp = EKeyWasConsumed;
       
   145                 iTopVisibleItemIndex = KErrNotFound;
       
   146             }
       
   147             // Enable highlight flag for this ChoiceGroup, even if top visible
       
   148             // element wasn't found (ChoiceGroup is now fully invisible).
       
   149             iHighlight = ETrue;
       
   150         }
       
   151     }
       
   152     else
       
   153     {
       
   154         // For popup ChoiceGroup, handle key events in usual way
       
   155         resp = CAknColumnListBox::OfferKeyEventL(aKeyEvent, aType);
       
   156     }
       
   157 #else
       
   158     // Let the ListBox handle the key
       
   159     resp = CAknColumnListBox::OfferKeyEventL(aKeyEvent, aType);
       
   160 #endif // RD_JAVA_S60_RELEASE_9_2
       
   161 
       
   162     if (iChoiceControl->ChoiceType() != MMIDChoiceGroup::EPopup)
       
   163     {
       
   164         // If the key was up or down, and the current item did not change,
       
   165         // we were apparently already on the first or last item.
       
   166         // Return  EKeyWasNotConsumed so that the form knows to transfer focus
       
   167         // BUT ONLY if not used in a popup (otherwise the form will get it and
       
   168         // move focus under the popup)
       
   169         if (!IsHighlightNeeded(oldCurrent,aKeyEvent))
       
   170         {
       
   171             resp = EKeyWasNotConsumed;
       
   172         }
       
   173     }
       
   174 
       
   175     //For Popup ChoiceGroup in landscape mode we have to redraw listbox
       
   176     //to display background properly
       
   177     if (iChoiceControl->ChoiceType() == MMIDChoiceGroup::EPopup &&
       
   178             Layout_Meta_Data::IsLandscapeOrientation() &&
       
   179             (aKeyEvent.iCode == EKeyUpArrow ||
       
   180              aKeyEvent.iCode == EKeyDownArrow))
       
   181     {
       
   182         DrawDeferred();
       
   183     }
       
   184 
       
   185     return resp;
       
   186 }
       
   187 
       
   188 
       
   189 // Overridden in order to prevent the listbox from creating its
       
   190 // own model.
       
   191 void CMIDChoiceGroupListBox::CreateModelL()
       
   192 {
       
   193     // Model should've already been given
       
   194     ASSERT(iModel);
       
   195     if (!iModel)
       
   196     {
       
   197         User::Leave(KErrArgument);
       
   198     }
       
   199 }
       
   200 
       
   201 void CMIDChoiceGroupListBox::SizeChanged()
       
   202 {
       
   203     // Because SizeChanged() is the only method called by CAknPopupList during a screen
       
   204     // resolution change, we must call these two in here. If we don't,
       
   205     // open popup dialogs do not update their content during a screen resolution change
       
   206     // @see CMIDChoiceGroupListBox::HandleResolutionChange() and CAknPopupList::HandleResolutionChange().
       
   207     if (iChoiceControl->ChoiceType() == MMIDChoiceGroup::EPopup)
       
   208     {
       
   209         TRAP_IGNORE(
       
   210             iChoiceControl->SetupColumnsL(ItemDrawer()->ColumnData());
       
   211             TAknLayoutRect layoutRect;
       
   212             // layout in respect of the screen as only the height is needed
       
   213             layoutRect.LayoutRect(iEikonEnv->ScreenDevice()->SizeInPixels(), AknLayoutScalable_Avkon::list_single_pane_cp2(0).LayoutLine());
       
   214             SetItemHeightL(layoutRect.Rect().Height());
       
   215         );
       
   216     }
       
   217 
       
   218     CAknColumnListBox::SizeChanged();
       
   219 
       
   220     // Assure that non-popup choicegroup is updated correctly visually
       
   221     // after dynamic resolution change.
       
   222     TInt lbHeight = Rect().Height();
       
   223     TInt lbItemHeight = iItemHeight;
       
   224 
       
   225     // check that listbox's size is already set
       
   226     if ((lbHeight > 0) && (lbItemHeight > 0) && (lbHeight >= lbItemHeight) &&
       
   227             iChoiceControl &&
       
   228             (iChoiceControl->ChoiceType() != MMIDChoiceGroup::EPopup))
       
   229     {
       
   230         TInt topItemIndex = TopItemIndex();
       
   231         TInt bottomItemIndex = BottomItemIndex();
       
   232         TInt currentItemIndex = CurrentItemIndex();
       
   233         TInt numOfItems = (Model()) ? Model()->NumberOfItems() : 0;
       
   234 
       
   235         // check that listbox-view is set correctly
       
   236         if ((topItemIndex >= 0) && (bottomItemIndex >= topItemIndex) &&
       
   237                 (bottomItemIndex < numOfItems) &&
       
   238                 (currentItemIndex >= topItemIndex) &&
       
   239                 (currentItemIndex <= bottomItemIndex))
       
   240         {
       
   241             // number of actually/possible visible items
       
   242             TInt numOfActuallyVisibleItems = bottomItemIndex - topItemIndex + 1;
       
   243             TInt numOfPossiblyVisibleItems = lbHeight / lbItemHeight;
       
   244 
       
   245             // detect if it is possible to display more items than it is
       
   246             // currently displayed (this indicates that listbox-view is not
       
   247             // updated correctly after dynamic resolution change) and
       
   248             // eventually update listbox-view's top-item-index
       
   249             if ((numOfPossiblyVisibleItems > numOfActuallyVisibleItems) &&
       
   250                     (topItemIndex >= numOfPossiblyVisibleItems -
       
   251                      numOfActuallyVisibleItems))
       
   252             {
       
   253                 topItemIndex -= numOfPossiblyVisibleItems -
       
   254                                 numOfActuallyVisibleItems;
       
   255                 SetTopItemIndex(topItemIndex);
       
   256             }
       
   257         }
       
   258     }
       
   259 }
       
   260 
       
   261 void CMIDChoiceGroupListBox::Draw(const TRect& aRect) const
       
   262 {
       
   263     //For Popup ChoiceGroup we have to draw its background,
       
   264     //because native side doesn't do that properly.
       
   265     if (iChoiceControl->ChoiceType() == MMIDChoiceGroup::EPopup)
       
   266     {
       
   267         CWindowGc& gc = SystemGc();
       
   268         MAknsControlContext* cc = NULL;
       
   269         //create background context:
       
   270         //KAknsIIDQsnFrPopupCenter - id of proper background
       
   271         //for popup dialog, background is without borders
       
   272         TRAP_IGNORE(cc = CAknsBasicBackgroundControlContext::NewL(
       
   273                              KAknsIIDQsnFrPopupCenter,
       
   274                              aRect,
       
   275                              EFalse));
       
   276         if (cc)
       
   277         {
       
   278             //draw background
       
   279             AknsDrawUtils::DrawBackground(
       
   280                 AknsUtils::SkinInstance(),
       
   281                 cc,
       
   282                 NULL,
       
   283                 gc,
       
   284                 Position(), //current listobox position on popup dialog
       
   285                 aRect,
       
   286                 KAknsDrawParamDefault);
       
   287         }
       
   288     }
       
   289 
       
   290     CAknColumnListBox::Draw(aRect);
       
   291 }
       
   292 
       
   293 TTypeUid::Ptr CMIDChoiceGroupListBox::MopSupplyObject(TTypeUid aId)
       
   294 {
       
   295     if (iChoiceControl->ChoiceType() != MMIDChoiceGroup::EPopup)
       
   296     {
       
   297         return iChoiceControl->MopSupplyObject(aId);
       
   298     }
       
   299     else // no skinned background in popup list
       
   300     {
       
   301         return CAknColumnListBox::MopSupplyObject(aId);
       
   302     }
       
   303 }
       
   304 
       
   305 /** This is currently only used for the open popup choice group items. For the normal
       
   306 closed items at the moment form won't pass the notification to them. They are instead
       
   307 recreated on a screen resolution change. See CMIChoiceGroupItem::ResolutionChange() and
       
   308 CMIChoiceGroupItem::ColorChange(). */
       
   309 void CMIDChoiceGroupListBox::HandleResourceChange(TInt aType)
       
   310 {
       
   311     if (aType == KEikColorResourceChange ||
       
   312             aType == KAknsMessageSkinChange || aType == KUidValueCoeColorSchemeChangeEvent)
       
   313     {//skin or color scheme have changed
       
   314         TRAP_IGNORE(((CMIDChoiceGroupModel*)Model())->ReConstructSelectionIconsL());
       
   315         ItemDrawer()->ColumnData()->SetIconArray(((CMIDChoiceGroupModel*)Model())->IconArray(ETrue));
       
   316 
       
   317         SetTextColors();
       
   318     }
       
   319     else if (aType == KEikDynamicLayoutVariantSwitch)
       
   320     {
       
   321         // NOTE for the open popup choicegroup items:
       
   322         // CAknPopupList never calls HandleResourceChange() on the list box when aType
       
   323         // is KEikDynamicLayoutVariantSwitch so do not put any code here,
       
   324         // SizeChanged() will be called instead.
       
   325     }
       
   326 
       
   327     CAknColumnListBox::HandleResourceChange(aType);
       
   328 }
       
   329 
       
   330 /** Initialise the listbox text and background colors with values
       
   331     from LAF first, and then from the skin if this is supported. */
       
   332 void CMIDChoiceGroupListBox::SetTextColors()
       
   333 {
       
   334     CColumnListBoxData::TColors colors;
       
   335 
       
   336     colors.iText = AKN_LAF_COLOR_STATIC(215);
       
   337     colors.iHighlightedText = AKN_LAF_COLOR_STATIC(0);
       
   338 
       
   339     if (AknsUtils::AvkonSkinEnabled())
       
   340     {
       
   341         MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   342         TRgb color;
       
   343 
       
   344         // icon color, checkbox, radio button
       
   345         TInt error = AknsUtils::GetCachedColor(skin,
       
   346                                                color,
       
   347                                                KAknsIIDQsnIconColors,
       
   348                                                EAknsCIQsnIconColorsCG14);
       
   349 
       
   350         if (!error)
       
   351         {
       
   352             colors.iText = color;
       
   353         }
       
   354 
       
   355         // icon color, setting list highlight   checkbox, radio button
       
   356         error = AknsUtils::GetCachedColor(skin,
       
   357                                           color,
       
   358                                           KAknsIIDQsnIconColors,
       
   359                                           EAknsCIQsnIconColorsCG14);
       
   360 
       
   361         if (!error)
       
   362         {
       
   363             colors.iHighlightedText = color;
       
   364         }
       
   365     }
       
   366 
       
   367     View()->ItemDrawer()->SetTextColor(colors.iText);
       
   368     View()->ItemDrawer()->SetHighlightedTextColor(colors.iHighlightedText);
       
   369 }
       
   370 
       
   371 
       
   372 void CMIDChoiceGroupListBox::PositionChanged()
       
   373 {
       
   374     // Code copied from CEikListBox::SizeChanged()
       
   375     TRect clientRect = iBorder.InnerRect(Rect());
       
   376     SetViewRectFromClientRect(clientRect);
       
   377 }
       
   378 
       
   379 #ifdef RD_SCALABLE_UI_V2
       
   380 void CMIDChoiceGroupListBox::HandlePointerEventL(const TPointerEvent& aPointerEvent)
       
   381 {
       
   382 #ifdef RD_JAVA_S60_RELEASE_9_2
       
   383     if (aPointerEvent.iType == TPointerEvent::EButton1Down)
       
   384     {
       
   385         iUpEventSent = EFalse;
       
   386         iHighlight = EFalse;
       
   387         UpdateTopVisibleItemIndex();
       
   388     }
       
   389 #endif // RD_JAVA_S60_RELEASE_9_2   
       
   390 
       
   391     // In non-popup case, don't forward to base class the drag events
       
   392     // that occur outside the listbox
       
   393 
       
   394 #ifdef RD_TACTILE_FEEDBACK
       
   395     if ((aPointerEvent.iType == TPointerEvent::EButton1Down ||
       
   396             aPointerEvent.iType == TPointerEvent::EButton1Up) &&
       
   397             iChoiceControl->ChoiceType() == MMIDChoiceGroup::EPopup)
       
   398     {
       
   399 #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
       
   400         iFeedback->InstantFeedback(ETouchFeedbackList);
       
   401 #else
       
   402         iFeedback->InstantFeedback(ETouchFeedbackBasic);
       
   403 #endif //RD_JAVA_ADVANCED_TACTILE_FEEDBACK
       
   404     }
       
   405 #endif //RD_TACTILE_FEEDBACK
       
   406 
       
   407 #ifndef RD_JAVA_S60_RELEASE_9_2
       
   408     if (iChoiceControl->ChoiceType() != MMIDChoiceGroup::EPopup &&
       
   409             aPointerEvent.iType == TPointerEvent::EDrag)
       
   410     {
       
   411 
       
   412         if (!View()->ViewRect().Contains(aPointerEvent.iPosition))
       
   413         {
       
   414             return;
       
   415         }
       
   416         else
       
   417         {
       
   418 
       
   419             // this flag must be set in order that drag events can change
       
   420             // the focused listbox item
       
   421             iListBoxFlags |= ELeftDownInViewRect;
       
   422         }
       
   423     }
       
   424 #endif // RD_JAVA_S60_RELEASE_9_2
       
   425 
       
   426 #ifdef RD_JAVA_S60_RELEASE_9_2
       
   427     if (aPointerEvent.iType == TPointerEvent::EDrag && !iUpEventSent && iChoiceControl->Form()->PhysicsScrolling())
       
   428     {
       
   429         TPointerEvent pointerEvent = aPointerEvent;
       
   430         pointerEvent.iType = TPointerEvent::EButton1Up;
       
   431         CAknColumnListBox::HandlePointerEventL(pointerEvent);
       
   432         iUpEventSent = ETrue;
       
   433     }
       
   434     else if (!iUpEventSent)
       
   435     {
       
   436 #endif // RD_JAVA_S60_RELEASE_9_2         
       
   437         CAknColumnListBox::HandlePointerEventL(aPointerEvent);
       
   438 #ifdef RD_JAVA_S60_RELEASE_9_2
       
   439         if (aPointerEvent.iType == TPointerEvent::EButton1Up)
       
   440         {
       
   441             iUpEventSent = ETrue;
       
   442         }
       
   443     }
       
   444 
       
   445 #endif // RD_JAVA_S60_RELEASE_9_2    
       
   446 
       
   447     //For Popup ChoiceGroup in landscape mode we have to redraw listbox
       
   448     //to display background properly
       
   449     if (iChoiceControl->ChoiceType() == MMIDChoiceGroup::EPopup &&
       
   450             Layout_Meta_Data::IsLandscapeOrientation())
       
   451     {
       
   452         DrawDeferred();
       
   453     }
       
   454 }
       
   455 #endif
       
   456 
       
   457 /**
       
   458  * Checks if highlight is needed
       
   459  * Returns EFalse if there should be no highlight
       
   460  */
       
   461 TBool CMIDChoiceGroupListBox::IsHighlightNeeded(TInt aCurrentSelected,
       
   462         const TKeyEvent& aKeyEvent)
       
   463 {
       
   464     // If the key was up or down, and the current item did not change,
       
   465     // we were apparently already on the first or last item.
       
   466     // Return  EFalse when highlight should be lost
       
   467     TBool isHighlightNeeded = ETrue;
       
   468     TInt newCurrent = iView->CurrentItemIndex();
       
   469     TBool change = aCurrentSelected != newCurrent;
       
   470     TInt lastItemIdx = KErrNotFound;
       
   471 
       
   472     if (iModel)
       
   473     {
       
   474         lastItemIdx = iModel->NumberOfItems() - 1;
       
   475     }
       
   476     if ((aKeyEvent.iCode == EKeyUpArrow) && !change && (newCurrent == 0))
       
   477     {
       
   478         isHighlightNeeded = EFalse;
       
   479     }
       
   480     if ((aKeyEvent.iCode == EKeyDownArrow) && !change &&
       
   481             (newCurrent == lastItemIdx))
       
   482     {
       
   483         isHighlightNeeded = EFalse;
       
   484     }
       
   485     return isHighlightNeeded;
       
   486 }
       
   487 
       
   488 #ifdef RD_JAVA_S60_RELEASE_9_2
       
   489 /**
       
   490  * Returns index of ChoiceGroup element, which is the first
       
   491  * visible element in ChoiceGroup from top of Form.
       
   492  * Used in CMIDChoiceGroupControl, which needs to know
       
   493  * current element for possible scrolling
       
   494  * (@see CMIDChoiceGroupControl::RequestScrollIfNeededL()).
       
   495  */
       
   496 TInt CMIDChoiceGroupListBox::TopVisibleItemIndex()
       
   497 {
       
   498     return iTopVisibleItemIndex;
       
   499 }
       
   500 
       
   501 /**
       
   502  * Fuction calculates index of element, which is the first
       
   503  * visible element in ChoiceGroup from top of Form.
       
   504  */
       
   505 void CMIDChoiceGroupListBox::UpdateTopVisibleItemIndex()
       
   506 {
       
   507     if (!iHighlight)
       
   508     {
       
   509         // There is touch interaction, so we need index for element,
       
   510         // which will be highlighted, when user starts using HW keys
       
   511         if (iPosition.iY < 0)
       
   512         {
       
   513             // ChoiceGroup is now partially visible and its top edge is
       
   514             // above the Form top edge.
       
   515 
       
   516             // Calculate index of first (partially) visible element
       
   517             iTopVisibleItemIndex = Abs(iPosition.iY) / iView->ItemHeight();
       
   518             TRect lbitemRect = TRect(
       
   519                                    iView->ItemPos(iTopVisibleItemIndex),
       
   520                                    iView->ItemSize(iTopVisibleItemIndex));
       
   521             if (lbitemRect.iTl.iY < 0)
       
   522             {
       
   523                 // Item is really partially visible.
       
   524                 // Because we don't want index of partially visible item,
       
   525                 // move index to next item
       
   526                 iTopVisibleItemIndex++;
       
   527             }
       
   528             if (iTopVisibleItemIndex >= iModel->NumberOfItems())
       
   529             {
       
   530                 // ChoiceGroup is fully invisible (whole rect is above
       
   531                 // the Form top edge): no element is visible now
       
   532                 iTopVisibleItemIndex = KErrNotFound;
       
   533             }
       
   534         }
       
   535         else
       
   536         {
       
   537             // Top item idge is lower than top edge of Form - is visible
       
   538             iTopVisibleItemIndex = 0;
       
   539         }
       
   540     }
       
   541     else
       
   542     {
       
   543         // In case of HW keys interaction, there is no highlight,
       
   544         //  so we don't need highlight any element
       
   545         iTopVisibleItemIndex = KErrNotFound;
       
   546     }
       
   547 }
       
   548 /**
       
   549  * Fuction sets ESingleClickDisabledHighlight - item drawer flags
       
   550  * and reports current highlight element change event
       
   551  */
       
   552 void CMIDChoiceGroupListBox::SingleClickDisableHighlightL(TBool aDisable)
       
   553 {
       
   554     // Item drawer must know, that highlight should be enabled/disabled
       
   555     // when listbox element taped
       
   556     CColumnListBoxItemDrawer* drawer = ItemDrawer();
       
   557     if (drawer)
       
   558     {
       
   559         if (aDisable)
       
   560         {
       
   561             if (iHighlight)
       
   562             {
       
   563                 // Set flags in Item drawer so that highlight could be disabled
       
   564                 drawer->SetFlags(CListItemDrawer::ESingleClickDisabledHighlight);
       
   565                 iHighlight = EFalse;
       
   566                 iTopVisibleItemIndex = KErrNotFound;
       
   567             }
       
   568         }
       
   569         else
       
   570         {
       
   571             // Set flags in Item drawer so that highlight could be enabled
       
   572             drawer->ClearFlags(CListItemDrawer::ESingleClickDisabledHighlight);
       
   573         }
       
   574     }
       
   575     // Report, that current highlighted element changed
       
   576     ReportEventL(MCoeControlObserver::EEventStateChanged);
       
   577     DrawNow();
       
   578 }
       
   579 
       
   580 void CMIDChoiceGroupListBox::SetHighlight(TBool aVisible)
       
   581 {
       
   582     iHighlight = aVisible;
       
   583 }
       
   584 
       
   585 TBool CMIDChoiceGroupListBox::GetHighlight()
       
   586 {
       
   587     return iHighlight;
       
   588 }
       
   589 #endif // RD_JAVA_S60_RELEASE_9_2