diff -r 05bc53fe583b -r 83ca720e2b9a cmmanager/cmmgr/Framework/Src/uncatdlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmmanager/cmmgr/Framework/Src/uncatdlg.cpp Wed Sep 01 12:23:51 2010 +0100 @@ -0,0 +1,455 @@ +/* +* Copyright (c) 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: Implementation of CUncatDlg. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cmmanager.hrh" +#include "uncatdlg.h" +#include "cmlistitem.h" +#include "cmlistitemlist.h" +#include +#include +#include "cmdestinationimpl.h" +#include +#include +#include +#include "cmlistboxmodel.h" +#include "selectdestinationdlg.h" +#include "cmlogger.h" + +using namespace CMManager; + +// --------------------------------------------------------------------------- +// CUncatDlg::ConstructAndRunLD +// Constructs the dialog and runs it. +// --------------------------------------------------------------------------- +// +TInt CUncatDlg::ConstructAndRunLD( TUint32 aHighlight, + TUint32& aSelected ) + { + CleanupStack::PushL( this ); + iHighlight = aHighlight; + iSelected = &aSelected; + ConstructL( R_CM_MENUBAR ); + PrepareLC(R_CM_DIALOG); + CleanupStack::Pop( this ); // it will be PushL-d by ExecuteLD... + iModel = new( ELeave ) CCmListboxModel(); + //destructed in base class destructor + iInfoPopupNoteController = CAknInfoPopupNoteController::NewL(); + + // Trace changes in CommsDat + iCmManager->WatcherRegisterL( this ); + + return RunLD(); + } + +// --------------------------------------------------------------------------- +// CUncatDlg::NewL() +// Two-phase dconstructor, second phase is ConstructAndRunLD +// --------------------------------------------------------------------------- +// +CUncatDlg* CUncatDlg::NewL(CCmManagerImpl* aCmManager ) + { + CUncatDlg* self = new (ELeave) CUncatDlg( aCmManager ); + return self; + } + +// --------------------------------------------------------------------------- +// CUncatDlg::CUncatDlg() +// --------------------------------------------------------------------------- +// +CUncatDlg::CUncatDlg( CCmManagerImpl* aCmManager ) + : CCmDlg( aCmManager, NULL, NULL ) + , iCmUncatItems(KCmArraySmallGranularity) + { + CLOG_CREATE; + CLOG_ATTACH( this, iCmManager ); + } + +// --------------------------------------------------------------------------- +// CUncatDlg::~CUncatDlg +// Destructor +// --------------------------------------------------------------------------- +// +CUncatDlg::~CUncatDlg() + { + CLOG_WRITE( "CUncatDlg::~CUncatDlg" ); + CleanupUncatArray(); + CLOG_CLOSE; + } + +// --------------------------------------------------------------------------- +// CUncatDlg::DynInitMenuPaneL +// --------------------------------------------------------------------------- +// +void CUncatDlg::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + TBool hideAdd ( EFalse ); + TBool hideMove ( EFalse ); + TBool hideCopy( EFalse ); + TBool hidePrioritise( EFalse ); + + CCmDlg::DynInitMenuPaneL( aResourceId, aMenuPane ); + if ( aResourceId == R_CM_MENU ) + { + // There are no destinatons to move to OR + // the highlighted connection method is in use + if ( !iCmManager->DestinationCountL() ) + { + hideMove = ETrue; + } + + // No priorities in Uncategorized -> always disabled + hidePrioritise = ETrue; + + aMenuPane->SetItemDimmed( ECmManagerUiCmdCmAdd, hideAdd ); + aMenuPane->SetItemDimmed( ECmManagerUiCmdCmPrioritise, hidePrioritise ); + aMenuPane->SetItemDimmed( ECmManagerUiCmdCmCopyToOtherDestination, hideCopy ); + aMenuPane->SetItemDimmed( ECmManagerUiCmdCmCopyToOtherDestination, hideMove ); + } + } + +// --------------------------------------------------------------------------- +// CUncatDlg::InitTextsL +// called before the dialog is shown +// to initialize localized textual data +// --------------------------------------------------------------------------- +// +void CUncatDlg::InitTextsL() + { + // set pane text if neccessary... + // pane text needed if not pop-up... + HBufC* primary = + iEikonEnv->AllocReadResourceLC( R_CMMANAGERUI_EMPTY_METHOD_VIEW_PRIMARY ); + HBufC* secondary = + iEikonEnv->AllocReadResourceLC( R_CMMANAGERUI_EMPTY_METHOD_VIEW_SECONDARY ); + CDesCArrayFlat* items = new (ELeave) CDesCArrayFlat(2); + CleanupStack::PushL(items); + items->AppendL(primary->Des()); + items->AppendL(secondary->Des()); + HBufC* emptyText = + StringLoader::LoadLC( R_TWO_STRING_FOR_EMPTY_VIEW , *items); + iListbox->View()->SetListEmptyTextL( *emptyText ); + CleanupStack::PopAndDestroy( emptyText ); + CleanupStack::PopAndDestroy( items ); + CleanupStack::PopAndDestroy( secondary ); + CleanupStack::PopAndDestroy( primary ); + + iStatusPane = iEikonEnv->AppUiFactory()->StatusPane(); + iTitlePane = + ( CAknTitlePane* )iStatusPane->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ); + + iOldTitleText = iTitlePane->Text()->AllocL(); + HBufC* name = StringLoader::LoadLC( R_CMMANAGERUI_DEST_UNCATEGORIZED ); + iTitlePane->SetTextL( *name ); + CleanupStack::PopAndDestroy( name ); + iNaviPane = ( CAknNavigationControlContainer* ) + iStatusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ); + iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC ); + iNaviPane->PushL( *iNaviDecorator ); + } + +// --------------------------------------------------------------------------- +// CUncatDlg::ProcessCommandL +// --------------------------------------------------------------------------- +// +void CUncatDlg::ProcessCommandL( TInt aCommandId ) + { + if ( MenuShowing() ) + { + HideMenu(); + } + + switch ( aCommandId ) + { + case ECmManagerUiCmdCmMoveToOtherDestination: + { + if ( CurrentCML()->GetBoolAttributeL( ECmConnected ) ) + { + TCmCommonUi::ShowNoteL( R_QTN_SET_NOTE_AP_IN_USE_EDIT, + TCmCommonUi::ECmErrorNote ); + } + else + { + // The selected item will be at the same position + TInt selected = iListbox->CurrentItemIndex(); + TInt noi = iListbox->Model()->NumberOfItems(); + // If it is the last then the previous will be selected. + if( ( selected == noi-1 ) && ( selected > 0 )) + { + selected--; + } + + TRAPD( err, CCmDlg::ProcessCommandL( + ECmManagerUiCmdCmCopyToOtherDestination ) ); + if ( err == KErrCancel ) + { + break; + } + else + { + User::LeaveIfError( err ); + } + + if ( iListbox->Model()->NumberOfItems() ) + { + //first item cannot be deleted + iListbox->ScrollToMakeItemVisible( selected); + iListbox->SetCurrentItemIndexAndDraw( selected ); + } + else + { + TCmCommonUi::ShowNoteL( R_QTN_NETW_CONSET_INFO_UNCAT_EMPTY, + TCmCommonUi::ECmInfoNote ); + iCmManager->WatcherUnRegister(); + TryExitL( KDialogUserBack ); + } + } + } + break; + + case EAknSoftkeyClear: + case ECmManagerUiCmdCmDelete: + { + CCmPluginBase* cm = CurrentCML(); + + if ( cm->GetBoolAttributeL( ECmProtected ) ) + { + TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED, + TCmCommonUi::ECmErrorNote ); + + break; + } + + if ( cm->GetBoolAttributeL( ECmIsLinked ) )//same check as KErrLocked below + { + TCmCommonUi::ShowNoteL( R_QTN_NETW_CONSET_INFO_CANNOT_DELETE_VIRTUAL_REF, + TCmCommonUi::ECmErrorNote ); + + break; + } + + if ( cm->GetBoolAttributeL( ECmConnected ) )//same check as KErrInUse below + { + TCmCommonUi::ShowNoteL( R_CMMANAGERUI_INFO_CM_IN_USE_CANNOT_DELETE, + TCmCommonUi::ECmErrorNote ); + + break; + } + + HBufC* cmName = cm->GetStringAttributeL(ECmName); + CleanupStack::PushL(cmName); + + if ( TCmCommonUi::ShowConfirmationQueryL( + R_CMMANAGERUI_QUEST_CM_DELETE, *cmName ) ) + { + TRAPD( err, CurrentCML()->DeleteL( ETrue ) ); + + switch ( err ) + { + case KErrInUse: + { + TCmCommonUi::ShowNoteL + ( R_CMMANAGERUI_INFO_CM_IN_USE_CANNOT_DELETE, + TCmCommonUi::ECmErrorNote ); + } + break; + + case KErrLocked: + { + TCmCommonUi::ShowNoteL + ( R_QTN_NETW_CONSET_INFO_CANNOT_DELETE_VIRTUAL_REF, + TCmCommonUi::ECmErrorNote ); + } + break; + + case KErrNone: + { + HandleListboxDataChangeL(); + iListbox->HandleItemRemovalL(); + + if ( !iListbox->Model()->NumberOfItems() ) + { + TCmCommonUi::ShowNoteL( R_QTN_NETW_CONSET_INFO_UNCAT_EMPTY, + TCmCommonUi::ECmInfoNote ); + iCmManager->WatcherUnRegister(); + TryExitL( KDialogUserBack ); + } + } + break; + + default: + { + } + } + + } + CleanupStack::PopAndDestroy( cmName ); + + } + break; + + case ECmManagerUiCmdCmAdd: + case ECmManagerUiCmdCmCopyToOtherDestination: + case ECmManagerUiCmdCmPrioritise: + { + TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED, + TCmCommonUi::ECmErrorNote ); + } + break; + + default: + { + CCmDlg::ProcessCommandL(aCommandId); + } + } + } + +// --------------------------------------------------------------------------- +// CUncatDlg::CurrentCML +// called before the dialog is shown to initialize listbox data +// --------------------------------------------------------------------------- +// +CCmPluginBase* CUncatDlg::CurrentCML() + { + return CMByIndexL( iListbox->CurrentItemIndex() ); + } + +// --------------------------------------------------------------------------- +// CUncatDlg::CMByIndexL +// a connection method in the list +// --------------------------------------------------------------------------- +// +CCmPluginBase* CUncatDlg::CMByIndexL( TInt aIndex ) + { + TInt anIndex = iItemIndex[aIndex]; + if( !iCmUncatItems[anIndex].iPlugin ) + { + iCmUncatItems[anIndex].iPlugin = + iCmManager->GetConnectionMethodL( + iCmUncatItems[anIndex].iCmId ); + } + return iCmUncatItems[anIndex].iPlugin; + } + +// --------------------------------------------------------------------------- +// CUncatDlg::CMCount +// number of cms in the list +// --------------------------------------------------------------------------- +// +TInt CUncatDlg::CMCount() + { + return iCmUncatItems.Count(); + } + +// -------------------------------------------------------------------------- +// CUncatDlg::ConstructCMArrayL +// -------------------------------------------------------------------------- +// +void CUncatDlg::ConstructCMArrayL( RArray& aCmIds ) + { + // empty the array - reuse + CleanupUncatArray( ETrue ); + iCmManager->ConnectionMethodL( aCmIds, EFalse ); + CleanupClosePushL( aCmIds ); + + for( TInt i = 0; i < aCmIds.Count(); ++i ) + { + TUncatItem item; + + item.iPlugin = NULL; + item.iCmId = aCmIds[i]; + + User::LeaveIfError( iCmUncatItems.Append( item ) ); + } + + CleanupStack::Pop( &aCmIds ); + } + +// -------------------------------------------------------------------------- +// CCmDlg::ClearHiddenCMsFromArrayL +// -------------------------------------------------------------------------- +// +void CUncatDlg::ClearHiddenCMsFromArrayL( RArray& aCmIds ) + { + TBool hidden( EFalse ); + TInt err( KErrNone ); + for ( TInt index = 0; index < aCmIds.Count(); index++ ) + { + TUint recId = aCmIds[index]; + TRAP( err, hidden = iCmManager->GetConnectionMethodInfoBoolL( recId, ECmHidden ) ); + if ( err || hidden ) + { + aCmIds.Remove( index ); + index--; + // Remove the same item from iCmUncatItems array + for( TInt i = 0; i < iCmUncatItems.Count(); i++ ) + { + if( iCmUncatItems[i].iCmId == recId ) + { + iCmUncatItems.Remove( i ); + break; + } + } + } + } + } + + +// -------------------------------------------------------------------------- +// CUncatDlg::CleanupUncatArray +// -------------------------------------------------------------------------- +// +void CUncatDlg::CleanupUncatArray( TBool aReuseArray ) + { + CLOG_WRITE( "CUncatDlg::CleanupUncatArray" ); + for ( TInt i = 0; i < iCmUncatItems.Count(); ++i ) + { + CCmPluginBase* cm = iCmUncatItems[i].iPlugin; + delete cm; + } + + if ( aReuseArray ) + { + iCmUncatItems.Reset(); + } + else + { + iCmUncatItems.Close(); + } + } + +// -------------------------------------------------------------------------- +// CUncatDlg::CommsDatChangesL +// -------------------------------------------------------------------------- +// +void CUncatDlg::CommsDatChangesL() + { + // Update list box + HandleListboxDataChangeL(); + }