diff -r 000000000000 -r c8caa15ef882 XDMSettingsUI/src/XDMPluginContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPluginContainer.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,462 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin main list container. +* +*/ + + + + +// INCLUDE FILES +#include "XDMExternalInterface.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SettingsData.h" +#include "XDMPluginContainer.h" + +#include + + + + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::CXDMPluginContainer() +// --------------------------------------------------------------------------- +// +CXDMPluginContainer::CXDMPluginContainer(CAknView* aView) : iView(aView) + { + + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::ConstructL(const TRect& aRect) +// Symbian OS two phased constructor +// +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::ConstructL( const TRect& aRect ) + { + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginContainer] ConstructL()" ) ); + #endif + + CEikStatusPane* sp = static_cast + ( CEikonEnv::Static()->EikAppUi() )->StatusPane(); + iTitlePane = static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + // Set title + + StringLoader::Load ( iTitle, R_STR_XDM_TITLE_PANE_TEXT ); + iTitlePane->SetTextL(iTitle);// FromResourceL( rReader ); + CreateWindowL(); // Makes the control a window-owning control + + // Main List creation and initialization + iMainList = new(ELeave) CAknSingleStyleListBox(); + iMainList->SetContainerWindowL(*this); + iMainList->ConstructL(this, EAknListBoxLoopScrolling); + + // Main list scroll bar issues + iMainList->CreateScrollBarFrameL(EFalse); + iMainList->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + + // Empty text processing + _LIT (KStringHeader, "%S\n%S"); + HBufC* emptyText = iEikonEnv->AllocReadResourceLC( R_STR_XDM_EMPTY_TEXT ); + HBufC* emptyText2 = iEikonEnv->AllocReadResourceLC( R_STR_XDM_EMPTY_TEXT_SEC); + HBufC* emptyFinal = HBufC::NewLC( + emptyText->Length() + emptyText2->Length() + 2 );// 2 is length of "\n" + emptyFinal->Des().Format(KStringHeader, emptyText, emptyText2); + + iMainList->SetListBoxObserver(this); + iMainList->View()->SetListEmptyTextL(*emptyFinal); + CleanupStack::PopAndDestroy(3, emptyText);//emptyText, emptyText2, emptyFinal + + // This call fails if Problems in XDM API, so leave if error + TRAPD(err,SetupListL()); + User::LeaveIfError(err); + + SetRect( aRect ); + ActivateL(); + + iEikMenuBar = new ( ELeave ) CEikMenuBar(); + iEikMenuBar->ConstructL( this, NULL, R_GS_XDM_SETTINGS_MAIN_MENUBAR ); + + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginContainer] Construct done" ) ); + #endif + + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::~CXDMPluginContainer() +// Destructor +// +// --------------------------------------------------------------------------- +// +CXDMPluginContainer::~CXDMPluginContainer() + { + if (iMainList) + { + delete iMainList; + } + + delete iEikMenuBar; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::SizeChanged() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::SizeChanged() + { + iMainList->SetRect(Rect()); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::CountComponentControls() const +// --------------------------------------------------------------------------- +// +TInt CXDMPluginContainer::CountComponentControls() const + { + return 1; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::ComponentControl() const +// --------------------------------------------------------------------------- +// +CCoeControl* CXDMPluginContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + return iMainList; + default: + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::EditCurrentItemL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::EditCurrentItemL() + { + TPtrC16 xDMSetName; + TPtrC16 xDMSetNameClipped; + xDMSetName.Set(iSettingListArray->MdcaPoint(iMainList->CurrentItemIndex())); + xDMSetNameClipped.Set(xDMSetName.Mid(1)); // remove '/t' from the begining + CXDMPlugin* iTempView = static_cast (iView); + iTempView->LoadSettingsViewL(EEditExisting, xDMSetNameClipped); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::GetCurrentSetNameLC() +// --------------------------------------------------------------------------- +// +HBufC* CXDMPluginContainer::GetCurrentSetNameLC() + { + TPtrC16 xDMSetName; + TPtrC16 xDMSetNameClipped; + xDMSetName.Set(iSettingListArray->MdcaPoint(iMainList->CurrentItemIndex())); + xDMSetNameClipped.Set(xDMSetName.Mid(1)); // remove '/t' from the begining + + HBufC* name = xDMSetNameClipped.AllocLC(); + TPtr ptr(name->Des()); + AknTextUtils::ConvertDigitsTo(ptr, EDigitTypeWestern ); + + return name; + } + + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::OfferKeyEventL() +// --------------------------------------------------------------------------- +// +TKeyResponse CXDMPluginContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if (iMainList) + { + // if cancel key is pressed and list is not empty, invoke deletion + if ((aKeyEvent.iCode == EKeyBackspace ) && (aType == EEventKey) && + iEikMenuBar->ItemSpecificCommandsEnabled() ) + { + if(!IsListEmpty()) + DeleteSetProcedureL(); + CXDMPlugin* iTempView = static_cast (iView); + iTempView->UpdateMskL(); + return EKeyWasConsumed; + } + else + { + return iMainList->OfferKeyEventL (aKeyEvent, aType); + } + } + return EKeyWasNotConsumed; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::HandleListBoxEventL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent) + { + // if the Select Key has been pressed + if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || + (aListBoxEvent == MEikListBoxObserver::EEventItemSingleClicked)) + { + EditCurrentItemL(); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::SetupListL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::SetupListL() + { + CTextListBoxModel* model = iMainList->Model(); + model->SetOwnershipType(ELbmOwnsItemArray); + + iSettingListArray = STATIC_CAST(CDesCArray*,model->ItemTextArray()); + LoadSettingsListArrayL(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::LoadSettingsListArrayL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::LoadSettingsListArrayL() + { + iTitlePane->SetTextL(iTitle); + _LIT (KStringHeader, "\t%S"); + TBuf myString; // maximum name + \t + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList = NULL; + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return; + } + CleanupStack::PushL(xdmSetList); + TInt xdmSetListCount = xdmSetList->Count(); + iSettingListArray->Reset(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + myString.Format(KStringHeader, &(xdmSetList->MdcaPoint(i))); + AknTextUtils::LanguageSpecificNumberConversion(myString); + iSettingListArray->AppendL (myString); + } + iSettingListArray->Sort(ECmpCollated); + CleanupStack::PopAndDestroy(2); //xdmSetList,settingIds + iMainList->HandleItemRemovalL(); + iMainList->HandleItemAdditionL(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::IsListEmpty() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginContainer::IsListEmpty() + { + if (iSettingListArray->Count()) + return EFalse; + return ETrue; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::IsLastItem() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginContainer::IsLastItem() + { + if (iSettingListArray->Count() == 1) + return ETrue; + return EFalse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::DeleteCurrentSetL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::DeleteCurrentSetL() + { + TXdmSettingsApi::RemoveCollectionL( GetCurrentSetIdL() ); + TInt deletedItemIndex = iMainList->CurrentItemIndex(); + iSettingListArray->Delete( deletedItemIndex ); + + AknListBoxUtils::HandleItemRemovalAndPositionHighlightL( + iMainList, deletedItemIndex, ETrue ); + iMainList->DrawNow(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::GetCurrentSetIdL() +// --------------------------------------------------------------------------- +// +TInt CXDMPluginContainer::GetCurrentSetIdL() + { + TInt myId(-1); + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList = NULL; + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return myId; + } + CleanupStack::PushL(xdmSetList); + + TInt xdmSetListCount = xdmSetList->Count(); + HBufC* currentSetName = GetCurrentSetNameLC(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((xdmSetList->MdcaPoint(i)).Compare(*currentSetName))) // if equal + { + myId = settingIds[i]; + break; + } + } + CleanupStack::PopAndDestroy(3); //xdmSetList,settingIds,currentSetName + return myId; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::LoadCollectionNamesL() +// --------------------------------------------------------------------------- +// +CDesCArray* CXDMPluginContainer::LoadCollectionNamesL(RArray& aSettingIDs) + { + CDesCArray* myArray = TXdmSettingsApi::CollectionNamesLC(aSettingIDs); + CleanupStack::Pop(1); // will be pop if above doesnt leave + return myArray; + } + +// --------------------------------------------------------- +// CXDMPluginContainer::GetHelpContext +// This function is called when Help application is launched +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CXDMPluginContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KGSXDMPluginUid; + aContext.iContext = KXDM_HLP_LIST_VIEW; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::DeleteSetProcedureL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::DeleteSetProcedureL() + { + HBufC* myDisplayMessage = NULL; + HBufC* currentSetName = GetCurrentSetNameLC(); + TPtr myname(currentSetName->Des()); + AknTextUtils::LanguageSpecificNumberConversion(myname); + + CAknQueryDialog* query = CAknQueryDialog::NewL(CAknQueryDialog::EConfirmationTone); + if (IsLastItem()) + myDisplayMessage = StringLoader::LoadLC(R_STR_XDM_CONF_DELETE_LAST, *currentSetName ); + else + myDisplayMessage = StringLoader::LoadLC(R_STR_XDM_CONF_DELETE, *currentSetName ); + + if ( query->ExecuteLD( R_CONFIRMATION_QUERY, *myDisplayMessage ) ) + { + DeleteCurrentSetL(); + } + CleanupStack::PopAndDestroy(2); //currentSetName, myDisplayMessage + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::HandleResourceChange() +// --------------------------------------------------------------------------- +void CXDMPluginContainer::HandleResourceChange( TInt aType ) + { + if ( aType == KAknsMessageSkinChange || + aType == KEikDynamicLayoutVariantSwitch ) + { + CXDMPlugin* iTempView = static_cast (iView); + iTempView->HandleResourceChangeManual(aType); + } + CCoeControl::HandleResourceChange( aType ); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::HandleResourceChangeManual() +// --------------------------------------------------------------------------- +void CXDMPluginContainer::HandleResourceChangeManual(TInt aType) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect); + SetRect( mainPaneRect ); + //DrawNow(); + + iMainList->HandleResourceChange(aType); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::FocusChanged +// Set focus on the selected listbox. For animated skins feature. +// --------------------------------------------------------------------------- +void CXDMPluginContainer::FocusChanged(TDrawNow aDrawNow) + { + if(iMainList) + { + iMainList->SetFocus( IsFocused(),aDrawNow ); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::SetFocusIfExist +// Set focus on the given set name +// --------------------------------------------------------------------------- +void CXDMPluginContainer::SetFocusIfExist(TDes& aSetName) + { + _LIT (KStringHeader, "\t%S"); + TBuf myString; // maximum name + \t + myString.Format(KStringHeader, &aSetName); + AknTextUtils::LanguageSpecificNumberConversion(myString); + + TInt xdmSetListCount = iSettingListArray->Count(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((iSettingListArray->MdcaPoint(i)).Compare(myString))) // if equal + { + iMainList->SetCurrentItemIndex(i); + break; + } + } + } + +// End of File