browserutilities/browserdialogsprovider/Src/BrowserSelectElementListBox.cpp
changeset 0 dd21522fd290
child 68 92a765b5b3e7
--- /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 <AknSfld.h>
+
+// CONSTANTS
+#include "BrowserDialogsProviderConstants.h"
+
+#include "eikon.hrh"
+
+
+// ================= MEMBER FUNCTIONS =======================
+// ====== TBrCtlFavouritesListboxFilterTextArray =======
+
+TBrCtlSelectElementFilterTextArray::TBrCtlSelectElementFilterTextArray(
+                            const CArrayFix<TBrCtlSelectOptionData>& 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<TBrCtlSelectOptionData>& 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<TBrCtlSelectOptionData>& 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<TInt>(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<KSearchFieldBuferLength> 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<CGulIcon>* array =
+                            ItemDrawer()->ColumnData()->IconArray();
+
+        array->ResetAndDestroy();
+        delete array;
+
+        STATIC_CAST( CBrowserSelectElementItemDrawer*,
+                                            iItemDrawer )->LoadIconsL();
+        }
+    }
+
+//  End of File