diff -r 000000000000 -r dd21522fd290 browserutilities/browserdialogsprovider/Src/BrowserSelectElementListBox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/browserdialogsprovider/Src/BrowserSelectElementListBox.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,541 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +* +*/ + + +// INCLUDE FILES +#include "BrowserSelectElementListBox.h" +#include "BrowserSelectElementModel.h" +#include "BrowserSelectElementItemDrawer.h" + +#include + +// CONSTANTS +#include "BrowserDialogsProviderConstants.h" + +#include "eikon.hrh" + + +// ================= MEMBER FUNCTIONS ======================= +// ====== TBrCtlFavouritesListboxFilterTextArray ======= + +TBrCtlSelectElementFilterTextArray::TBrCtlSelectElementFilterTextArray( + const CArrayFix& aOptions ) + : iOptions ( aOptions ) + { + } + +// --------------------------------------------------------- +// TBrCtlFavouritesListboxFilterTextArray::MdcaCount +// --------------------------------------------------------- +// +TInt TBrCtlSelectElementFilterTextArray::MdcaCount() const + { + return iOptions.Count(); + } + + +// --------------------------------------------------------- +// TBrCtlFavouritesListboxFilterTextArray::MdcaPoint +// --------------------------------------------------------- +// +TPtrC TBrCtlSelectElementFilterTextArray::MdcaPoint ( TInt aIndex ) const + { + return iOptions.At( aIndex ).Text(); + } + + + + +// ================= MEMBER FUNCTIONS ======================= +// ====== TBrCtlSelectElementItemTextArray ======= + +TBrCtlSelectElementItemTextArray::TBrCtlSelectElementItemTextArray( + const CArrayFix& aOptions ) + : iOptions( aOptions ) + { + iText = NULL; + } + +TBrCtlSelectElementItemTextArray::~TBrCtlSelectElementItemTextArray() + { + delete iText; + } + +// ---------------------------------------------------------------------------- +// TBrCtlSelectElementItemTextArray::AddPrefixLC +// ---------------------------------------------------------------------------- +// +HBufC* TBrCtlSelectElementItemTextArray::AddPrefixLC( + const TDesC& aText, + TBool aIsOptionGroup ) const + { + // title = prefix + text + zero terminator + TPtrC prefix( aIsOptionGroup ? KPrefixOptionGroup : KPrefixOption ); + HBufC* title = HBufC::NewL( prefix.Length() + aText.Length() + 1 ); + + CleanupStack::PushL( title ); + + // Copy the text + HBufC* buf = HBufC::NewL( aText.Length() ); + TPtr ptr = buf->Des(); + ptr.Copy( aText ); + title->Des().Append( prefix ); + title->Des().Append( ptr ); + title->Des().ZeroTerminate(); + + delete buf; + + return title; + } + +// ---------------------------------------------------------------------------- +// TBrCtlSelectElementItemTextArray::FormatTextL +// ---------------------------------------------------------------------------- +// +void TBrCtlSelectElementItemTextArray::FormatTextL( + const TBrCtlSelectOptionData& optionData ) + { + // free the previous text + if ( iText ) + { + delete iText; + iText = NULL; + } + + // save the text in the right format + HBufC* title = AddPrefixLC( optionData.Text(), optionData.IsOptGroup() ); + CleanupStack::Pop(); // title + iText = title; + } + +// ---------------------------------------------------------------------------- +// TBrCtlSelectElementItemTextArray::MdcaCount +// ---------------------------------------------------------------------------- +// +TPtrC TBrCtlSelectElementItemTextArray::MdcaPoint( TInt aIndex ) const + { + TBrCtlSelectElementItemTextArray* self = + CONST_CAST( TBrCtlSelectElementItemTextArray*, this ); + + // prepare the new text + TRAPD( err, self->FormatTextL( iOptions.At( aIndex ) ) ); + + if ( !err ) + { + return iText->Des(); + } + else + { + return TPtrC( KNullDesC ); + } + } + + + +// ================= MEMBER FUNCTIONS ========================================= + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::CBrowserSelectElementListBox +// ---------------------------------------------------------------------------- +// +CBrowserSelectElementListBox::CBrowserSelectElementListBox( + const TBrCtlSelectOptionType aBrCtlSelectOptionType, + const CArrayFix& aOptions ) : + iOptions( aOptions ), + iBrCtlSelectOptionType( aBrCtlSelectOptionType ) + { + } + + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::ConstructL +// ---------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::ConstructL( const CCoeControl& aParent ) + { + iHasNotMoved = ETrue; + iModel = CBrowserSelectElementModel::NewL( iOptions ); + STATIC_CAST (CBrowserSelectElementModel*,iModel)->SetItemArray(); + CreateItemDrawerL(); + + CEikListBox::ConstructL( &aParent, EAknListBoxMultiselectionList ); + + // this method call is required for correct support of + // pictographs in S60 Japanese + EnableExtendedDrawingL(); + + SetSelectionIndexesL(); + ItemDrawer()->FormattedCellData()->SetControl(this); + ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); + } + + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::CreateItemDrawerL +// ---------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::CreateItemDrawerL() + { + CFormattedCellListBoxData* data = CPopupFormattedListBoxData::NewL(); + CleanupStack::PushL( data ); + iItemDrawer = new (ELeave) CBrowserSelectElementItemDrawer + ( *Model(), *LatinBold13(), *data, iBrCtlSelectOptionType, iOptions ); + CleanupStack::Pop(); // data + STATIC_CAST( CBrowserSelectElementItemDrawer*, + iItemDrawer )->LoadIconsL(); + } + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::OfferKeyEventL +// ---------------------------------------------------------------------------- +// +TKeyResponse CBrowserSelectElementListBox::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse resp; + TInt index = CurrentItemIndex(); + iHasNotMoved = EFalse; + switch ( aKeyEvent.iCode ) + { + case EKeyEscape: + ReportEventL( MCoeControlObserver::EEventRequestCancel ); + resp = EKeyWasConsumed; + break; + case EKeyLeftUpArrow: // Northwest + case EStdKeyDevice10: // : Extra KeyEvent supports diagonal event simulator wedge + case EKeyUpArrow: // North + case EKeyRightUpArrow: // Northeast + case EStdKeyDevice11: // : Extra KeyEvent supports diagonal event simulator wedge + + for ( ;( --index >= 0 );) + { + + if (!(iOptions.At(((CBrowserSelectElementModel*)Model())->Filter() + ->FilteredItemIndex(index)).IsOptGroup())) // find the previous option + { + break; + } + } + + if ( index >= 0 ) + { + SetCurrentItemIndexAndDraw( index ); + } + else // no previous option + { + if ( TopItemIndex() != 0 ) + { + // show the invisible part + SetTopItemIndex( 0 ); + DrawNow(); + } + } + resp = EKeyWasConsumed; + break; + + case EKeyLeftDownArrow: // Southwest + case EStdKeyDevice13: // : Extra KeyEvent supports diagonal event simulator wedge + case EKeyDownArrow: // South + case EKeyRightDownArrow: // Southeast + case EStdKeyDevice12: // : Extra KeyEvent supports diagonal event simulator wedge + { + TInt count = 0; + + //Findbox is visible, accept only filtered items. + // + if ( ((CBrowserSelectElementModel*)Model())->Filter() ) + { + count = ((CBrowserSelectElementModel*)Model())->Filter() + ->FilteredNumberOfItems(); + } + + for ( ;( ++index < count ); ) + { + + if ( !(iOptions.At(((CBrowserSelectElementModel*)Model())->Filter() + ->FilteredItemIndex(index)).IsOptGroup()) ) // find the next option + { + break; + } + } + + if ( index < count ) + { + SetCurrentItemIndexAndDraw( index ); + } + resp = EKeyWasConsumed; + } + break; + + case EKeyOK: + case EKeyEnter: + { + + if ( iBrCtlSelectOptionType != ESelectTypeMultiple ) + { + // select the current item + View()->ClearSelection(); + View()->SelectItemL( index ); + resp = EKeyWasConsumed; + // need to report the event because might be onpick + ReportListBoxEventL + ( MEikListBoxObserver::EEventEnterKeyPressed ); + + } + else + { + if (index >= 0 && !(iOptions.At(((CBrowserSelectElementModel*)Model())-> + Filter()->FilteredItemIndex(index)).IsOptGroup())) + { + resp = CEikListBox::OfferKeyEventL + ( aKeyEvent, aType ); + + ReportListBoxEventL + ( MEikListBoxObserver::EEventEnterKeyPressed ); + } + else + { + // Avoid to select optiongroup text + resp = EKeyWasConsumed; + } + } + } + break; + + default: + // workaround for autoselection problem + // (Ok softkey selects focused item) + if ( aKeyEvent.iCode != EKeyApplicationF ) + { + resp = CEikListBox::OfferKeyEventL( aKeyEvent, aType ); + } + else + { + resp = EKeyWasConsumed; + } + } + + return resp; + } + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::HandlePointerEventL +// ---------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + CAknSingleGraphicPopupMenuStyleListBox::HandlePointerEventL(aPointerEvent); + TInt index = CurrentItemIndex(); + iHasNotMoved = EFalse; + switch (aPointerEvent.iType) + { + case TPointerEvent::EButton1Up: + if ( iBrCtlSelectOptionType != ESelectTypeMultiple ) + { + // select the current item + View()->ClearSelection(); + View()->SelectItemL( index ); + ReportListBoxEventL( MEikListBoxObserver::EEventEnterKeyPressed ); + } + else + { + if (index >= 0 && !(iOptions.At(((CBrowserSelectElementModel*)Model())-> + Filter()->FilteredItemIndex(index)).IsOptGroup())) + { + View()->ToggleItemL(index); + ReportListBoxEventL( MEikListBoxObserver::EEventEnterKeyPressed ); + } + } + break; + default: + break; + } + } + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::FocusChanged +// ---------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::FocusChanged( TDrawNow aDrawNow ) + { + // Do nothing until the listbox is fully constructed + // The dialogpage sets the focus before calling ConstructL + if ( iView ) + { + CEikListBox::FocusChanged( aDrawNow ); + } + } + +// ---------------------------------------------------------------------------- +// CBrowserSelectElementListBox::SizeChanged +// ---------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::SizeChanged() + { + CAknSingleGraphicPopupMenuStyleListBox::SizeChanged(); + AdjustHighlight(); + } + +// ---------------------------------------------------------------------------- +// CBrCtlSelectElementListBox::SetSelectionIndexesL +// ---------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::SetSelectionIndexesL() + { + CListBoxView::CSelectionIndexArray* arrayOfSelectionIndexes; + arrayOfSelectionIndexes = new (ELeave) CArrayFixFlat(10); + CleanupStack::PushL( arrayOfSelectionIndexes ); + for ( TInt ii = 0; ii < iOptions.Count(); ++ii ) + { + if ( iOptions.At( ii ).IsSelected() || iOptions.At( ii ).IsOptGroup() ) + { + arrayOfSelectionIndexes->AppendL( ii ); + } + } + CEikListBox::SetSelectionIndexesL( arrayOfSelectionIndexes ); + CleanupStack::PopAndDestroy(); // arrayOfSelectionIndexes + AdjustHighlight(); + } + + +//----------------------------------------------------------------------------- +// CBrowserSelectElementListBox::HighlightSelectableItem +//----------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::HighlightSelectableItem() + { + AdjustHighlight(); + } + + +//----------------------------------------------------------------------------- +// CBrowserSelectElementListBox::AdjustHighlight +//----------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::AdjustHighlight() + { + const CListBoxView::CSelectionIndexArray* selection = SelectionIndexes(); + TInt count = Min( iOptions.Count(), Model()->NumberOfItems() ); + TInt i; + TBool filterExist = EFalse; + TBool notFound = ETrue; + + //at first time the highlight should be on the item + //which was selected last time + if ( iHasNotMoved ) + { + for ( i = 0 ; i < count ; i++ ) + { + if ( iOptions.At( i ).IsSelected() ) + { + ScrollToMakeItemVisible( i ); + SetCurrentItemIndexAndDraw( i ); + break; + } + } + return; + } + + if ( ( (CBrowserSelectElementModel*)Model() )->Filter() ) + { + filterExist = ETrue; + count = ( (CBrowserSelectElementModel*) Model() )-> + Filter()->FilteredNumberOfItems(); + } + + for ( i = 0 ; i < count ; i++ ) + { + TInt index = i; + + if ( filterExist ) + { + index = ( (CBrowserSelectElementModel*) Model() )-> + Filter()-> + FilteredItemIndex( i ); + } + + TBrCtlSelectOptionData optdat = iOptions.At( index ); + + if ( !optdat.IsOptGroup() && filterExist ) // find the next option + { + TPtrC data(optdat.Text()); + TBuf criteria; + ( (CAknSearchField*)( ((CAknFilteredTextListBoxModel*)Model()) + ->Filter()->FindBox() ) )->GetSearchText( criteria ); + + if ( AknFind::IsFindMatch( data,criteria ) ) + { + notFound = EFalse; + break; + } + } + } + + if ( notFound ) + { + for ( i = 0; i < count; i++ ) + { + if (iOptions.At( i ).IsSelected() ) + { + ScrollToMakeItemVisible( i ); + SetCurrentItemIndexAndDraw( i ); + break; + } + } + return; + } + + if ( i < count) + { + ScrollToMakeItemVisible(i); + SetCurrentItemIndexAndDraw( i ); + } + else if ( selection->Count() ) // selected array except the optgrup becaue optg always selected + { + for ( i = 0 ; i < selection->Count() ; i++ ) + { + if ( !iOptions.At( selection->At( i ) ).IsOptGroup() ) + { // make visible (scroll ) and highlight it + ScrollToMakeItemVisible( selection->At( i ) ); + SetCurrentItemIndexAndDraw( selection->At( i ) ); + break; + } + } + } + } +//----------------------------------------------------------------------------- +// CBrowserSelectElementListBox::HandleResourceChangeL +//----------------------------------------------------------------------------- +// +void CBrowserSelectElementListBox::HandleResourceChangeL( TInt aType ) + { + if ( aType == KAknsMessageSkinChange ) + { + CArrayPtr* array = + ItemDrawer()->ColumnData()->IconArray(); + + array->ResetAndDestroy(); + delete array; + + STATIC_CAST( CBrowserSelectElementItemDrawer*, + iItemDrawer )->LoadIconsL(); + } + } + +// End of File