cmmanager/cmmgr/Framework/Src/uncatdlg.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 12 Mar 2010 15:44:18 +0200
branchRCL_3
changeset 12 ea6e024ea6f9
parent 8 2e6c4614c58e
child 24 c45d4fe2ff0a
permissions -rw-r--r--
Revision: 201007 Kit: 201008

/*
* 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 <avkon.hrh>
#include <eikdef.h>
#include <eikenv.h>
#include <eikedwin.h>
#include <cmmanager.rsg>
#include <aknnavide.h>
#include <akntitle.h>
#include <eikmenup.h>
#include <data_caging_path_literals.hrh>
#include <StringLoader.h>
#include <AknIconArray.h>

#include "cmmanager.hrh"
#include "uncatdlg.h"
#include "cmlistitem.h"
#include "cmlistitemlist.h"
#include <cmpluginbaseeng.h>
#include <cmpluginbase.h>
#include "cmdestinationimpl.h"
#include <cmcommonui.h>
#include <cmcommonconstants.h>    
#include <cmpbasesettingsdlg.h>
#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--;
                    }
                
                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();

                        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<TUint32>& 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<TUint32>& 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();
    }