diff -r 1fc85118c3ae -r 870918037e16 landmarksui/uicontrols/src/CLmkAppSelectorImplBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/uicontrols/src/CLmkAppSelectorImplBase.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,590 @@ +/* +* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: This is a base class for Selector implementation +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "LmkConsts.h" +#include "CLmkSelectorIconMgr.h" +#include "MLmkListMemento.h" +#include "CLmkUiUtils.h" +#include "CLmkSingleGraphicLBModel.h" +#include "CLmkDoubleGraphicLBModel.h" +#include "CLmkAppSelectorImplBase.h" +#include "MLmkMskObserver.h" +#include "CLmkLmItemListProvider.h" +#include + +#include + + +const TInt KTextLimit( 40 ); +_LIT(KFetchingData, " "); +#if defined(_DEBUG) +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT( KPanicMsg, "CLmkAppSelectorImplBase" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +} // namespace + +#endif +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::CLmkAppSelectorImplBase +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkAppSelectorImplBase::CLmkAppSelectorImplBase( + CPosLandmarkDatabase& aDb, + TBool aFindBox ) + : CLmkSelectorImplBase( aDb ), + iFindBox( aFindBox ) + { + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::BaseConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLmkAppSelectorImplBase::BaseConstructL() + { + CLmkSelectorImplBase::BaseConstructL(); + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::~CLmkAppSelectorImplBase +// ----------------------------------------------------------------------------- +// +CLmkAppSelectorImplBase::~CLmkAppSelectorImplBase() + { + delete iListBox; + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::StoreMemento +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkAppSelectorImplBase::StoreMemento() + { + __ASSERT_DEBUG( iListBox && iListProvider, Panic( KLmkPanicNullMember ) ); + Store( *iListBox, *iListProvider, iFindBox ); + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::RestoreMemento +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkAppSelectorImplBase::RestoreMemento() + { + __ASSERT_DEBUG( iListBox && iListProvider, Panic( KLmkPanicNullMember ) ); + Restore( *iListBox, *iListProvider, iFindBox ); + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::ListVisibleItemCount +// ----------------------------------------------------------------------------- +// +TInt CLmkAppSelectorImplBase::ListVisibleItemCount() + { + __ASSERT_DEBUG( iListBox, Panic( KLmkPanicNullMember ) ); + return iListBox->Model()->NumberOfItems(); + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::ListMarkedItemCountL +// ----------------------------------------------------------------------------- +// +TInt CLmkAppSelectorImplBase::ListMarkedItemCountL() + { + __ASSERT_DEBUG( iListBox, Panic( KLmkPanicNullMember ) ); + const CArrayFix* markedIndexes = NULL; + if ( iFindBox ) + { + CAknFilteredTextListBoxModel* model = + static_cast( iListBox->Model() ); + model->Filter()->UpdateSelectionIndexesL(); + markedIndexes = model->Filter()->SelectionIndexes(); + } + else + { + markedIndexes = iListBox->SelectionIndexes(); + } + return markedIndexes->Count(); + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::CreateListBoxL +// ----------------------------------------------------------------------------- +// +CEikTextListBox& CLmkAppSelectorImplBase::CreateListBoxL( + CCoeControl* aParent, + TInt aControlType, + TInt aFlags, + TInt aEmptyLBPrimResource,TInt aEmptyLBSecResource ) + { + if ( iListBox ) + { + delete iListBox; + iListBox = NULL; + } + + // For maintaining empty listbox resource + iEmptyLBPrimResource = aEmptyLBPrimResource; + iEmptyLBSecResource = aEmptyLBSecResource; + + TBool isFormattedCellListBox = EFalse; + switch ( aControlType ) + { + case EAknCtSingleGraphicListBox: + { + iListBox = new( ELeave ) CAknSingleGraphicStyleListBox; + break; + } + case EAknCtDoubleGraphicListBox: + { + iListBox = new( ELeave ) CAknDoubleGraphicStyleListBox; + isFormattedCellListBox = ETrue; + break; + } + default: + { + User::Leave( KErrNotSupported ); + break; + } + } + + iListBox->SetMopParent(aParent); + iListBox->SetParent(aParent); + iListBox->ConstructL( aParent, aFlags ); + + HBufC* textForFetchingData; + textForFetchingData = HBufC::NewL(20); + CleanupStack::PushL(textForFetchingData); // textForFetchingData + *textForFetchingData = KFetchingData; + iListBox->View()->SetListEmptyTextL( *textForFetchingData); + CleanupStack::PopAndDestroy(); // textForFetchingData. + + // create icon array & icons + CAknIconArray* icons = SetupIconMgrLC(); + TFileName* iconFile = CLmkUiUtils::AvkonIconFileLC(); + iIconMgr->SetIconAtIndexZeroL( *iconFile, + KAknsIIDQgnIndiMarkedAdd, + EMbmAvkonQgn_indi_marked_add, + EMbmAvkonQgn_indi_marked_add_mask ); + + if ( isFormattedCellListBox ) + { + ( static_cast( iListBox ) ) + ->ItemDrawer()->FormattedCellData()->SetIconArray( icons ); + ((CEikFormattedCellListBox*)iListBox)->ItemDrawer()->FormattedCellData() + ->EnableMarqueeL( ETrue ); + } + else + { + ( static_cast( iListBox ) ) + ->ItemDrawer()->ColumnData()->SetIconArray( icons ); + ((CEikColumnListBox*)iListBox)->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); + } + CleanupStack::PopAndDestroy(); // iconFile + CleanupStack::Pop( icons ); // ownership was transferred + + // create listbox model for listbox + CreateListBoxModelL( *iListBox, aControlType, *iListProvider ); + return *iListBox; + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::HandleListProviderEvent +// ----------------------------------------------------------------------------- +// +void CLmkAppSelectorImplBase::HandleListProviderEvent( + TLmkListProviderEventType aEvent ) + { + if( !iListBox ) + return; + + if ( aEvent == ELmkEventItemAdditionComplete ) + { + TRAPD( error, iListBox->HandleItemAdditionL() ); + if ( error != KErrNone ) + { + iListBox->Reset(); + iListBox->DrawNow(); + } + return; + } + if ( aEvent == ELmkEventListReady || aEvent == ELmkEventFindListReady ) + { + TBool handled( EFalse ); + TRAPD( error, handled = HandleEventListReadyL() ); + if ( !handled || error != KErrNone ) + { + //CLmkLmItemListProvider& lstpr = static_cast( *iListProvider ); + //TInt currentItemIndex = lstpr.SelectedIndex(iNewLmkItemId); //iListBox->CurrentItemIndex(); + TInt currentItemIndex = iListBox->CurrentItemIndex(); + TRAP( error, iListBox->HandleItemAdditionL() ); + if( currentItemIndex >= 0 && currentItemIndex < iListBox->Model()->NumberOfItems() ) + iListBox->SetCurrentItemIndex(currentItemIndex); + if ( error != KErrNone ) + { + iListBox->DrawNow(); + } + } + } + + TInt count = static_cast(iListBox->Model())->ItemTextArray()->MdcaCount(); + if( count == 0 ) + { + TRAPD( error, MakeEmptyTextListBoxL( *iListBox, iEmptyLBPrimResource,iEmptyLBSecResource )); + if( error != KErrNone ) + { + return; + } + } + + //Enable Find box only if at least one item is there in the list box + if( count ) + { + if( aEvent != ELmkEventFindListReady ) + { + TRAP_IGNORE( ShowFindBoxL( ETrue ) ); + } + CLmkSelectorImplBase::HandleListProviderEvent( aEvent ); + } + else + { + if ( aEvent == ELmkEventFindListReady ) + { + TRAPD( error, MakeEmptyTextListBoxL( *iListBox, iEmptyLBPrimResource,iEmptyLBSecResource, ETrue )); + if( error != KErrNone ) + { + return; + } + } + else + { + TRAPD( error, MakeEmptyTextListBoxL( *iListBox, iEmptyLBPrimResource,iEmptyLBSecResource )); + if( error != KErrNone ) + { + return; + } + TRAP_IGNORE( ShowFindBoxL( EFalse ) ); + } + } + if(iMskObserver) + { + TRAP_IGNORE(iMskObserver->UpdateMskContainerL()); + } + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::HandleListProviderError +// ----------------------------------------------------------------------------- +// +void CLmkAppSelectorImplBase::HandleListProviderError( TInt /*aError*/ ) + { + if ( iListBox ) + { + iListBox->Reset(); + TRAPD( error, iListBox->HandleItemAdditionL() ); + if ( error != KErrNone ) + { + iListBox->DrawNow(); + } + } + } + +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::MakeEmptyTextListBoxL +// ---------------------------------------------------- +// + void CLmkAppSelectorImplBase::MakeEmptyTextListBoxL( + CEikTextListBox& aListBox, + TInt aResourcePrimText ,TInt aResourceSecText, TBool aRequestFromFindBox ) const + { + _LIT( KNChar,"\n" ); + + if (aRequestFromFindBox) + { + HBufC* text1 = StringLoader::LoadLC( R_LMK_EMPTY_NO_MATCH, const_cast( iEnv )); + TPtr ptr1 = text1->Des(); + aListBox.View()->SetListEmptyTextL( ptr1 ); + CleanupStack::PopAndDestroy(text1); + } + else + { + HBufC* text1 = StringLoader::LoadLC( aResourcePrimText, const_cast( iEnv )); + HBufC* text2 = StringLoader::LoadLC( aResourceSecText, const_cast( iEnv )); + + TPtr ptr1 = text1->Des(); + TPtr ptr2 = text2->Des(); + + HBufC* buffer = HBufC::NewLC(text1->Length() + text2->Length() + 2); + TPtr textFromResourceFile = buffer->Des(); + textFromResourceFile.Copy(ptr1); + textFromResourceFile.Append(KNChar); + textFromResourceFile.Append(ptr2); + + aListBox.View()->SetListEmptyTextL( textFromResourceFile ); + CleanupStack::PopAndDestroy(3);//buffer,text2,text1 + } + } + +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::CreateListBoxModelL +// ---------------------------------------------------- +// +void CLmkAppSelectorImplBase::CreateListBoxModelL( + CEikTextListBox& aListBox, + TInt aControlType, + CLmkListProviderBase& aProvider ) const + { + CLmkSelectorLBModelBase* lbModel = NULL; + // create listbox model, pass ownership + switch( aControlType ) + { + case EAknCtSingleGraphicListBox: + { + lbModel = CLmkSingleGraphicLBModel::NewL( aProvider ); + break; + } + case EAknCtDoubleGraphicListBox: + { + lbModel = CLmkDoubleGraphicLBModel::NewL( aProvider ); + break; + } + default: + { + User::Leave( KErrNotSupported ); + break; + } + } + aListBox.Model()->SetItemTextArray( lbModel ); + aListBox.Model()->SetOwnershipType( ELbmOwnsItemArray ); + } + +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::HandleEventListReadyL() +// ---------------------------------------------------- +// +TBool CLmkAppSelectorImplBase::HandleEventListReadyL() + { + // default implementation + return EFalse; + } + +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::CreateFindBoxL() +// ---------------------------------------------------- +// +EXPORT_C CAknSearchField* CLmkAppSelectorImplBase::CreateFindBoxL( + const CCoeControl &aParent) + { + CAknFilteredTextListBoxModel* model = + static_cast ( iListBox->Model() ); + iSearchBox = + CAknSearchField::NewL( aParent, CAknSearchField::ESearch, NULL, KTextLimit ); + + // Creates CAknListBoxFilterItems object. + model->CreateFilterL( iListBox, iSearchBox ); + +#ifdef RD_SCALABLE_UI_V2 + iFilter = model->Filter(); + iSearchBox->SetObserver(this); +#endif// RD_SCALABLE_UI_V2 + iSearchBox->SetFocus( EFalse ); + iSearchBox->MakeVisible( EFalse ); //by defult disable the find box + return iSearchBox; + } + +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::ShowFindBoxL() +// ---------------------------------------------------- +// +void CLmkAppSelectorImplBase::ShowFindBoxL( TBool aVisible ) + { + const TRect rect(iListBox->Parent()->Rect()); + if (iSearchBox) + { + // iSearchBox->ResetL(); + iSearchBox->SetFocus(aVisible); + iSearchBox->MakeVisible(aVisible); + static_cast + (iListBox->View())->SetFindEmptyListState(aVisible); + + if (aVisible && iListBox && iSearchBox) + { + AknLayoutUtils::LayoutControl(iListBox, rect, + AKN_LAYOUT_WINDOW_list_gen_pane(1)); + AknLayoutUtils::LayoutControl(iSearchBox, rect, + AKN_LAYOUT_WINDOW_find_pane); + if (iSearchBox->IsVisible() && iListBox->IsVisible()) + { + // The correct line position to use is 2, which corresponds + // EABColumn in Avkon (not a public enumeration, + // hence hard-coding used here) + const TInt KSeparatorLinePos = 2; + iSearchBox->SetLinePos(KSeparatorLinePos); + } + } + else if (iListBox) + { + AknLayoutUtils::LayoutControl(iListBox, rect, + AKN_LAYOUT_WINDOW_list_gen_pane(0)); + } + iSearchBox->DrawDeferred(); + } + + if ( !aVisible ) + { + iListBox->SetRect(rect); + iListBox->DrawDeferred(); + } + } +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::HandleScreenSizeChange() +// ---------------------------------------------------- +// +void CLmkAppSelectorImplBase::HandleScreenSizeChange() + { + // Dummy implementation in base class. + } + +// ---------------------------------------------------- +// CLmkAppLmSelectorImpl::AttachToAIWMenuL() +// ---------------------------------------------------- +// +void CLmkAppSelectorImplBase::AttachToAIWMenuL( + TInt /*aMenuResourceId*/, + TInt /*aInterestResourceId*/) + { + // Dummy function + } + +// ---------------------------------------------------- +// CLmkAppSelectorImplBase::AttachInterestL() +// ---------------------------------------------------- +// +void CLmkAppSelectorImplBase::AttachInterestL ( + TInt /*aInterestResourceId*/) + { + // Dummy function + } + + +// ---------------------------------------------------- +// CLmkAppLmSelectorImpl::InitializeMenuPaneL() +// ---------------------------------------------------- +// +void CLmkAppSelectorImplBase::InitializeMenuPaneL( + CEikMenuPane& /*aMenuPane */, + TInt /* aMenuResourceId */) + { + // Dummy function + } + +// ----------------------------------------------------------------------------- +// CLmkAppLmSelectorImpl::ExecuteAIWCallCmdL() +// ----------------------------------------------------------------------------- +// +void CLmkAppSelectorImplBase::ExecuteAIWCallCmdL( + TInt /*aCommandId*/ ) + { + // Dummy function + } + +// ----------------------------------------------------------------------------- +// CLmkAppLmSelectorImpl::IsThisLandmarkFieldDefined +// ----------------------------------------------------------------------------- +// +TBool CLmkAppSelectorImplBase::IsLmWithThisFieldExistL ( TLmkAppCmdId /*aFieldId*/) + { + // Dummy function + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CLmkAppLmSelectorImpl::MarkedIndexes +// ----------------------------------------------------------------------------- +// +EXPORT_C const CArrayFix* CLmkAppSelectorImplBase::MarkedIndexes() + { + const CArrayFix* markedIndexes = NULL; + markedIndexes = iListBox->SelectionIndexes(); + return markedIndexes; + } +// ----------------------------------------------------------------------------- +// CLmkAppLmSelectorImpl::CurrentItemIndex +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CLmkAppSelectorImplBase::CurrentItemIndex() + { + return iListBox->CurrentItemIndex(); + } +// ----------------------------------------------------------------------------- +// CLmkAppLmSelectorImpl::SetMskObserver +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkAppSelectorImplBase::SetMskObserver(MLmkMskObserver* aMskObserver) + { + iMskObserver = aMskObserver; + } + +// ----------------------------------------------------------------------------- +// CLmkAppSelectorImplBase::ServiceCmdByMenuCmd +// ----------------------------------------------------------------------------- +// +TInt CLmkAppSelectorImplBase::ServiceCmdByMenuCmd( TInt /*aMenuCmd*/ ) + { + //dummy function + return 0; + } + +CAknSearchField* CLmkAppSelectorImplBase::FindBox() + { + return iSearchBox; + } + +#ifdef RD_SCALABLE_UI_V2 +void CLmkAppSelectorImplBase::HandleControlEventL( CCoeControl* aControl,TCoeEvent aEventType ) + { + //Update the listbox a sper the search criteria + if (iFilter) + { + iFilter->HandleControlEventL(aControl, aEventType); + } + } +#endif //RD_SCALABLE_UI_V2 +// End of File