idlefw/plugins/mcsplugin/settings/src/mcspluginsettingscontainer.cpp
changeset 0 79c6a41cd166
child 1 844b978f8d5e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/mcsplugin/settings/src/mcspluginsettingscontainer.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,503 @@
+/*
+* Copyright (c) 2009 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:  Shortcut settings plug-in container.
+*
+*/
+
+
+#include <aknlists.h>
+#include <AknWaitDialog.h>
+#include <aknnotewrappers.h>
+#include <eikbtgpc.h>
+#include <gslistbox.h>
+#include <gsfwviewuids.h>
+#include <aknradiobuttonsettingpage.h>
+#include <akntextsettingpage.h>
+#include <centralrepository.h>
+#include <StringLoader.h>
+#include <hlplch.h>
+
+// For CActiveFavouritesDbNotifier
+#include <ActiveFavouritesDbNotifier.h> 
+#include <mcspluginsettingsres.rsg>
+
+#include "mcspluginsettingscontainer.h"
+#include "mcspluginsettingsmodel.h"
+#include "mcspluginsettingsbkmlist.h"
+#include "mcspluginsettings.hrh"
+
+const TUid KUidAI = { 0x102750FB }; // Active Standby Shortcuts help uid
+
+_LIT(KSET_HLP_HOME_SCREEN_SHORTCUTS, "SET_HLP_HOME_SCREEN_SHORTCUTS"); 
+_LIT( KMyMenuData, "matrixmenudata" );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// First-phase construction
+// ---------------------------------------------------------------------------
+//
+CMCSPluginSettingsContainer::CMCSPluginSettingsContainer()
+{
+}
+
+// ---------------------------------------------------------------------------
+// Second-phase construction
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::ConstructL( const TRect& aRect )
+    {
+    iListBox = new (ELeave) CAknSettingStyleListBox;
+    BaseConstructL(aRect, R_AI_MCS_SETTINGS_VIEW_TITLE, NULL);
+    StartObservingL();
+    CheckMiddleSoftkeyLabelL();
+    }
+
+// ---------------------------------------------------------------------------
+// Tells the settings container to start observing for changes
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::StartObservingL()
+    {
+    // registering to bookmarks db. changes observing
+    User::LeaveIfError( iBookmarkSession.Connect() );
+    User::LeaveIfError( iBookmarkDb.Open( iBookmarkSession, KBrowserBookmarks ) );
+
+    iBookmarkDbObserver = new (ELeave) CActiveFavouritesDbNotifier(
+                                        iBookmarkDb, *this );
+    iBookmarkDbObserver->Start();
+
+    // registering to mailbox db. changes observing
+    iMsvSession = CMsvSession::OpenAsObserverL( *this );
+    
+    // registering to matrix menu events observing
+    iMenu.OpenL( KMyMenuData );
+    TInt err = iNotifier.Open( iMenu ); 
+    if ( err == KErrNone )
+        {
+        iNotifyWatcher = CMCSPluginWatcher::NewL( CMCSPluginWatcher::ENotify );
+        iNotifier.Notify( 0,
+            RMenuNotifier::EItemsAddedRemoved | RMenuNotifier::EItemsReordered,
+        iNotifyWatcher->iStatus );
+        iNotifyWatcher->WatchNotify( this );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Tells the settings container to stop observing for changes
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::StopObserving()
+    {
+    if( iBookmarkDbObserver )
+        {
+        delete iBookmarkDbObserver;
+        iBookmarkDbObserver = NULL;
+        }
+    iBookmarkDb.Close();
+    iBookmarkSession.Close();
+
+    if( iMsvSession )
+        {
+        delete iMsvSession;
+        iMsvSession = NULL;
+        }
+    
+    iNotifier.Close();
+    iMenu.Close();
+    
+    if ( iNotifyWatcher )
+        {
+        if ( iNotifyWatcher->IsActive() )
+        	{
+            iNotifyWatcher->Cancel();
+        	}
+        delete iNotifyWatcher;
+        iNotifyWatcher = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMCSPluginSettingsContainer::~CMCSPluginSettingsContainer()
+    {
+    StopObserving();
+    }
+
+// ---------------------------------------------------------------------------
+// Sets pointer to settings plug-in model.
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::SetModel( CMCSPluginSettingsModel* aModel )
+{
+    iModel = aModel;
+}
+
+// ---------------------------------------------------------------------------
+// Handles a setting change command.
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::HandleChangeCommandL()
+{       
+    TInt current = iListBox->CurrentItemIndex();
+    TInt appListIndex = iModel->ItemId( current );
+    if ( appListIndex < -1 )
+    {
+        appListIndex = -1;
+    }
+
+    if ( iModel->Item( current ).locked )
+        {
+        HBufC* text = iCoeEnv->AllocReadResourceLC( R_AI_MCS_SETTINGS_TXT_FIXED_ITEM );
+        CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );
+        note->ExecuteLD( *text );
+        CleanupStack::PopAndDestroy( text );
+        }
+    else
+        {
+        TInt selection( KErrNotFound );
+        TBool changed( EFalse );
+        CDesCArrayFlat* array = iCoeEnv->ReadDesC16ArrayResourceL(
+            R_AI_MCS_CHANGE_TO_PAGE_LBX );
+        CleanupStack::PushL( array );
+
+        CAknListQueryDialog* dialog = new ( ELeave ) CAknListQueryDialog( &selection );
+        CleanupStack::PushL( dialog );
+        dialog->PrepareLC( R_AI_MCS_LISTQUERY_CHANGE_TO_PAGE );
+        CleanupStack::Pop( dialog );
+        dialog->SetItemTextArray( array );
+        dialog->SetOwnershipType( ELbmDoesNotOwnItemArray );
+        if ( dialog->RunLD() )
+            {
+
+            TSettingItem itm = iModel->Item( current );
+
+            // user wants to select bookmark
+            if ( selection == 1 )
+                {
+
+                // if the last selected item was application, set selected item to -1
+                if ( itm.type == EApplication )
+                    {
+                        appListIndex = -1;
+                    }
+
+                changed = HandleBookmarkChangeCommandL( appListIndex, current );
+
+                }
+            // user wants to select application
+            else if ( selection == 0 )
+                {
+
+                // if the last selected item was bookmark, set selected item to -1
+                if ( itm.type == EBookmark )
+                    {
+                        appListIndex = -1;
+                    }
+
+                changed = HandleAppListChangeCommandL( appListIndex, current );
+
+                }
+            if ( changed )
+                {
+                    ResetCurrentListL( current );
+                }
+
+            }
+        CleanupStack::PopAndDestroy( array );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handles a help command.
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::HandleHelpCommandL()
+{
+    CArrayFixFlat<TCoeHelpContext>* array = 
+        new ( ELeave ) CArrayFixFlat<TCoeHelpContext>( 1 );
+    CleanupStack::PushL( array );
+    array->AppendL( GetHelpContext() );
+    HlpLauncher::LaunchHelpApplicationL( CCoeEnv::Static()->WsSession(), array );
+    CleanupStack::Pop( array );
+}
+
+// ---------------------------------------------------------------------------
+// Helper method which indicates if the Applist or Bkmlist is showing
+// ---------------------------------------------------------------------------
+//
+TBool CMCSPluginSettingsContainer::IsChangeDialogShowing()
+{
+    return ( iAppListDialog || iBkmListDialog );
+}
+
+// ---------------------------------------------------------------------------
+// Method for closing change dialog (app or bkm) if it is beeing shown
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::CloseChangeDialog()
+{
+    TKeyEvent keyEvent;
+
+    keyEvent.iCode      = EKeyEscape;
+    keyEvent.iScanCode  = EStdKeyEscape;
+    keyEvent.iModifiers = 0;
+    keyEvent.iRepeats   = 0;
+
+    CCoeControl* dialog = NULL;
+
+    if ( iAppListDialog )
+    {
+        dialog = static_cast< CCoeControl* >( iAppListDialog );
+    }
+    else if ( iBkmListDialog )
+    {
+        dialog = static_cast< CCoeControl* >( iBkmListDialog );
+    }
+
+    if ( dialog )
+    {
+        TRAP_IGNORE( dialog->OfferKeyEventL( keyEvent, EEventKey ) );
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Refreshes current list..
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::ResetCurrentListL( TInt aIndex )
+{
+    if (iModel->MdcaCount() == 0)
+    {
+        iListBox->HandleItemRemovalL();
+    }
+    else
+    {
+        iListBox->HandleItemAdditionL();
+    }
+
+    iListBox->SetCurrentItemIndex( aIndex );
+    CheckMiddleSoftkeyLabelL();
+}
+
+// ---------------------------------------------------------------------------
+// From class MMsvSessionObserver.
+// Handles an event from the message server.
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::HandleSessionEventL(
+                                                     TMsvSessionEvent aEvent,
+                                                     TAny* /*aArg1*/,
+                                                     TAny* /*aArg2*/,
+                                                     TAny* /*aArg3*/ )
+    {
+    switch ( aEvent )
+        {
+    case EMsvEntriesCreated:
+        // fall-through intended here
+    case EMsvEntriesDeleted:
+        // fall-through intended here
+    case EMsvEntriesChanged:
+        {
+        if ( IsChangeDialogShowing() )
+            {
+            CloseChangeDialog();
+            }
+        iModel->UpdateAppListL();
+        }
+        break;
+    default:
+        break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From CGSBaseContainer
+// Constructs the settings listbox.
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::ConstructListBoxL(TInt /*aResLbxId*/)
+{
+    iListBox->ConstructL(this, EAknListBoxSelectionList);
+
+    // Set empty listbox's text.
+    HBufC* text = iCoeEnv->AllocReadResourceLC(R_AI_MCS_SETTINGS_TXT_ALL_FIXED);
+    iListBox->View()->SetListEmptyTextL(*text);
+    CleanupStack::PopAndDestroy(text);
+
+    iListBox->Model()->SetItemTextArray(iModel);
+    iListBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray);
+}
+
+// ---------------------------------------------------------------------------
+// Chandles a setting change command to select application from a list.
+// ---------------------------------------------------------------------------
+//
+TBool CMCSPluginSettingsContainer::HandleAppListChangeCommandL( const TInt& aIndex,
+                                                                const TInt& aSettingIndex )
+{
+    
+    TBool changed = EFalse;
+
+    TInt index = aIndex;
+    TInt oldIndex = index;
+
+    iAppListDialog = new (ELeave) CAknRadioButtonSettingPage(
+        R_AI_MCS_SETTINGS_APPLIST_PAGE, index, iModel->AppList());
+
+    HBufC* title = StringLoader::LoadLC( R_AI_MCS_SETTINGS_TXT_LINKN, aSettingIndex + 1, iCoeEnv );
+    iAppListDialog->SetSettingTextL( title->Des() );
+    iAppListDialog->ConstructL();
+
+    if (iAppListDialog->ExecuteLD(CAknSettingPage::EUpdateWhenChanged) &&
+        index != oldIndex)
+        {
+        changed = iModel->ReplaceItemL( iListBox->CurrentItemIndex(), index , EApplication );
+        }
+
+    CleanupStack::PopAndDestroy( title );
+    iAppListDialog = NULL;
+
+    return changed;
+}
+
+// ---------------------------------------------------------------------------
+// Chandles a setting change command to select bookmark from a list.
+// ---------------------------------------------------------------------------
+//
+TBool CMCSPluginSettingsContainer::HandleBookmarkChangeCommandL( const TInt& aIndex, 
+                                                                 const TInt& aSettingIndex )
+    {
+    TBool changed = EFalse;
+
+    TInt index = aIndex;
+    TInt oldIndex = index;
+
+    iBkmListDialog = new (ELeave) CAknRadioButtonSettingPage(
+        R_AI_MCS_SETTINGS_APPLIST_PAGE, index, iModel->BkmList());
+
+    HBufC* title = StringLoader::LoadLC( R_AI_MCS_SETTINGS_TXT_LINKN, aSettingIndex + 1, iCoeEnv );
+    iBkmListDialog->SetSettingTextL( title->Des() );
+    iBkmListDialog->ConstructL();
+
+    if (iBkmListDialog->ExecuteLD(CAknSettingPage::EUpdateWhenChanged) &&
+        index != oldIndex)
+        {
+        changed = iModel->ReplaceItemL( iListBox->CurrentItemIndex(), index , EBookmark );
+        }
+
+    CleanupStack::PopAndDestroy( title );
+    iBkmListDialog = NULL;
+    return changed;
+    }
+
+// ---------------------------------------------------------------------------
+// Gets Help
+// ---------------------------------------------------------------------------
+//
+TCoeHelpContext CMCSPluginSettingsContainer::GetHelpContext() const
+{
+    TCoeContextName helpString;
+
+    helpString.Copy( KSET_HLP_HOME_SCREEN_SHORTCUTS );
+
+    // set UID and topic of Help to display
+    return TCoeHelpContext( KUidAI, helpString );
+}
+
+// ---------------------------------------------------------------------------
+// Offers a key event.
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CMCSPluginSettingsContainer::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent, TEventCode aType)
+{
+    switch (aKeyEvent.iCode)
+    {
+    case EKeyLeftArrow:
+    case EKeyRightArrow:
+        // Listbox takes all event even if it doesn't use them:
+        return EKeyWasNotConsumed;
+
+    default:
+        break;
+    }
+    // Now it's iListBox's job to process the key event
+    return iListBox->OfferKeyEventL(aKeyEvent, aType);
+}
+
+// ---------------------------------------------------------------------------
+// Checks if there is a need to update the middle softkey label.
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::CheckMiddleSoftkeyLabelL()
+{
+    CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+    if (cba)
+    {
+        cba->MakeCommandVisible(EAiScutSettingsCmdChange, (iModel->MdcaCount() != 0));
+    }
+}
+
+// -----------------------------------------------------------------------------
+// From class MFavouritesDbObserver.
+// Handles database event.
+// -----------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::HandleFavouritesDbEventL(RDbNotifier::TEvent aEvent)
+    {
+    switch ( aEvent )
+        {
+        case RDbNotifier::ECommit   :
+            // fall-through intended here
+        case RDbNotifier::ERecover  :
+            // fall-through intended here
+        case RDbNotifier::ERollback :
+            {
+            if ( IsChangeDialogShowing() )
+                {
+                CloseChangeDialog();
+                }
+            iModel->UpdateBkmListL();
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// From class MMCSPluginWatcherObserver.
+// Handles matrix menu event.
+// -----------------------------------------------------------------------------
+//
+void CMCSPluginSettingsContainer::HandleNotifyL()
+    {
+    if ( IsChangeDialogShowing() )
+        {
+        CloseChangeDialog();
+        }
+    iModel->UpdateAppListL();
+    
+    // Notification must be activated again
+    iNotifyWatcher->Cancel();
+    iNotifier.Notify( 0,
+        RMenuNotifier::EItemsAddedRemoved | RMenuNotifier::EItemsReordered,
+        iNotifyWatcher->iStatus );
+    iNotifyWatcher->WatchNotify( this );
+    }
+
+// End of File.