defaultapplicationsettings/server/src/das_srvmime_dlg.cpp
changeset 0 254040eb3b7d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/defaultapplicationsettings/server/src/das_srvmime_dlg.cpp	Thu Dec 17 08:46:07 2009 +0200
@@ -0,0 +1,530 @@
+/*
+* Copyright (c) 2005-2008 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 the Services & MIME view class
+*
+*/
+
+
+
+// System includes
+#include <e32base.h>
+#include <AknIconArray.h> 
+#include <gulicon.h>
+#include <AknsUtils.h>
+#include <avkon.mbg>
+
+#include <featmgr.h>
+#include <hlplch.h>
+
+#include <aknlists.h>
+#include <barsread.h>
+#include <e32def.h>
+#include <eikclbd.h>
+#include <eikmenub.h>
+
+#include <defaultappserver.rsg>
+#include <StringLoader.h>
+#include <uikon.hrh>
+#include <aknPopup.h>
+#include <akntitle.h>
+#include <aknsfld.h>
+#include <featmgr.h>
+
+#include <aknsettingitemlist.h> 
+
+#include "das_srvmime_dlg.h"
+#include "das_servmimeapps.h"
+#include "das_appui.h"
+#include "das_app.h"
+#include "das.hrh"
+#include "das.hlp.hrh"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Symbian 2-phased constructor
+// ---------------------------------------------------------------------------
+//    
+CDefaultAppSrvMimeDlg* CDefaultAppSrvMimeDlg::NewL(CDefaultAppAppUi* aAppUi)
+    {
+    //we first need to create a CDefaultAppServMimeApps instance
+    TInt *selected;
+    if(aAppUi->iReloadDlgAdvanced)
+    {
+    	//some settings for the advanced view
+    	selected=&(aAppUi->iSelectedItemAdvanced);
+    }
+    else
+    {
+        //some settings for the simple view
+    	selected=&(aAppUi->iSelectedItemSimple);
+    };
+    
+    //create the dialog instance (ownership of servMimeApps is passed to the dialog
+    CDefaultAppSrvMimeDlg *dialog=new(ELeave)CDefaultAppSrvMimeDlg(aAppUi, selected);
+    CleanupStack::PushL(dialog);
+    dialog->ConstructL(R_DAS_MENUBAR); 
+    CleanupStack::Pop(dialog);
+    return dialog;
+    }
+
+// ---------------------------------------------------------------------------
+// C++ Constructor
+// ---------------------------------------------------------------------------
+//    
+CDefaultAppSrvMimeDlg::CDefaultAppSrvMimeDlg(CDefaultAppAppUi* aAppUi, TInt *aSelected) : 
+    CAknSelectionListDialog(*aSelected, &aAppUi->iServMimeApps->iList, NULL), 
+    iDefaultAppUi(aAppUi), iSelected(aSelected), iOkToExit(EFalse)
+    {
+    //no implementation necessary
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//    
+CDefaultAppSrvMimeDlg::~CDefaultAppSrvMimeDlg()
+    {
+    if ( iDefaultAppUi )
+        {
+        iDefaultAppUi->SetDialogExist( EFalse );
+        }
+    
+    if ( iPopupList )
+        {
+        iPopupList->CancelPopup();
+        iPopupList = NULL;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class From CAknSelectionListDialog
+// This function is called when buttons/softkeys are pressed, to check if the dlg should exit.
+// We make the checkings and return the result.
+// ---------------------------------------------------------------------------
+//   
+TBool CDefaultAppSrvMimeDlg::OkToExitL(TInt aButtonId)
+    {
+    CAknSelectionListDialog::OkToExitL(aButtonId);
+    if ( aButtonId == EAknSoftkeyOptions && iPopupList )
+    	{
+    	iPopupList->CancelPopup();
+    	iPopupList = NULL;
+    	}
+    if(aButtonId == EAknSoftkeyBack || aButtonId == EAknCmdOpen || aButtonId == EAknSoftkeyOk)
+        {
+        ProcessCommandL(aButtonId);
+        };
+    if(aButtonId==EAknCmdEnd || aButtonId==EAknSoftkeyCancel)
+    	{
+    	iOkToExit=ETrue;
+    	iDefaultAppUi->iReloadDlg=EFalse;
+    	}
+    return iOkToExit;
+    }
+
+// ---------------------------------------------------------------------------
+// From class From CAknSelectionListDialog
+// This function is called when a command is issued by the user.
+// ---------------------------------------------------------------------------
+//
+void CDefaultAppSrvMimeDlg::ProcessCommandL(TInt aCommand)
+    {
+    CAknSelectionListDialog::ProcessCommandL(aCommand); //this hides the menu and takes care of find
+    iEnterKeyPressed=EFalse; 
+    
+    
+    *iSelected = ListBox()->CurrentItemIndex();
+    if (FindBox() && *iSelected != -1)
+	    *iSelected = STATIC_CAST(CAknFilteredTextListBoxModel*,ListBox()->Model())->Filter()->FilteredItemIndex(*iSelected);
+    // ATTENTION: If *iSelected is -1 it means that the list is empty!
+
+    
+    switch(aCommand)
+        {
+    case EDasCmdAdvanced:
+        //SwitchViewL();
+        
+        //make the dialog reload        
+        iDefaultAppUi->iReloadDlgAdvanced=ETrue;
+        iOkToExit=ETrue;
+        //force our exit
+        TryExitL(0);
+        
+        break;
+    case EAknCmdHelp:
+        HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), iDefaultAppUi->AppHelpContextL());
+        break;
+    case EDasCmdResetAll:
+    case EDasCmdResetSelected:
+        if(aCommand==EDasCmdResetSelected)
+        {
+        	if(*iSelected!=-1)
+        	    iDefaultAppUi->iServMimeApps->RestoreFactorySettingsL(*iSelected);
+        }   
+        else
+            iDefaultAppUi->iServMimeApps->RestoreFactorySettingsL(-1);
+            
+        //common code:
+        //reload the dialog
+        if(!iDefaultAppUi->iServMimeApps->iSimplifiedView)
+            iDefaultAppUi->iReloadDlgAdvanced=ETrue;
+        iOkToExit=ETrue;
+        //delete the iServMimeApps so that it will be reloaded next time
+        delete iDefaultAppUi->iServMimeApps;
+        iDefaultAppUi->iServMimeApps=NULL;
+        //force our exit
+        TryExitL(0);
+        break;
+    case EAknCmdExit:
+        //exit the server
+        iOkToExit=ETrue;
+        iDefaultAppUi->iReloadDlg=EFalse;
+        //force our exit
+        TryExitL(0);
+        break;
+    case EAknSoftkeyBack:
+        //we have 2 cases here: 
+        //if we are in the advanced view, we switch back to the simple view.
+        //if we are in the simple view, then we exit the server
+        if(iDefaultAppUi->iServMimeApps->iAppUid == KUidGS && !iDefaultAppUi->iServMimeApps->iSimplifiedView)
+            {
+            //switch back to simple view
+            //make the dialog reload
+            iDefaultAppUi->iReloadDlgAdvanced=EFalse;
+            iOkToExit=ETrue;
+            // no need to force our exit, we are comming from a TryExitL() 
+            }
+        else
+            {
+            //exit the server
+            iOkToExit=ETrue;
+            iDefaultAppUi->iReloadDlg=EFalse;
+            //tell AppUi that the exit is due a "Back" command
+            iDefaultAppUi->iExitBack=ETrue;
+            }
+        break;
+    case EAknCmdOpen:
+    case EAknSoftkeyOk:
+        //we have the index of the selected item in *iSelected
+        OpenMenuForSelectedServiceAndMimeL(*iSelected);
+        break;    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class From CAknSelectionListDialog
+// Called during the construction of the dialog. We build the list of elements here.
+// ---------------------------------------------------------------------------
+//    
+void CDefaultAppSrvMimeDlg::PreLayoutDynInitL()
+    {
+    CAknSelectionListDialog::PreLayoutDynInitL();
+    
+    CEikSettingsListBox* listbox=(CEikSettingsListBox*)ListBox();
+    // Ownership retained by us
+    listbox->CreateScrollBarFrameL( ETrue );
+    listbox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto );
+    listbox->UpdateScrollBarsL();   
+
+    //enable marquee
+    EnableMarqueeL();   
+        
+    //restore the selected item    
+    if(*iSelected >= 0)
+        {
+        listbox->SetCurrentItemIndex(*iSelected);
+        };
+        
+    //change the title
+    CEikStatusPane *statusPane=iDefaultAppUi->StatusPane();
+    if(statusPane && statusPane->PaneCapabilities(TUid::Uid(EEikStatusPaneUidTitle)).IsPresent())
+        {
+        CAknTitlePane *titlePane=(CAknTitlePane*)(statusPane->ControlL(TUid::Uid(EEikStatusPaneUidTitle)));
+        HBufC* titleString;
+        //load the correct title string
+        if(iDefaultAppUi->iReloadDlgAdvanced)
+            {
+                if(iDefaultAppUi->iClientUid == KUidGS)
+                    //User activated advanced view in Control Panel
+                    titleString=StringLoader::LoadLC(R_DA_TITLE_ADVANCED);
+                else //Client is some application other than Control Panel; load app specific view.
+                    titleString=StringLoader::LoadLC(R_DA_TITLE_APP);
+            }
+        else //Simple view in Control Panel
+            titleString=StringLoader::LoadLC(R_DA_TITLE_MAIN);
+        titlePane->SetTextL(*titleString);
+        CleanupStack::PopAndDestroy(titleString);
+        };
+    
+    ListBox()->AddItemChangeObserverL( this );
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CAknDialog.
+// Called when the menu is initialized.
+// ---------------------------------------------------------------------------
+//
+void CDefaultAppSrvMimeDlg::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
+    {
+    if (aResourceId != R_DAS_MENU) return;
+    __ASSERT_ALWAYS(iDefaultAppUi->iServMimeApps,User::Leave(KErrGeneral));
+    
+    // for !iSimplifiedView dim the EDasCmdAdvanced
+    if(!iDefaultAppUi->iServMimeApps->iSimplifiedView)
+        aMenuPane->SetItemDimmed(EDasCmdAdvanced, ETrue);    
+    
+    // if the Client is not observing when we are exiting, then dim the Exit
+    if(iDefaultAppUi->iServMimeApps->iFlagNoObserver)
+        aMenuPane->SetItemDimmed(EAknCmdExit, ETrue);
+    
+    // Help should be displayed only if the feature is supported
+    // according to Feature Manager
+    if (!FeatureManager::FeatureSupported(KFeatureIdHelp))
+        {
+        aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue);
+        }
+		//if the findbox already exists, dim the find menu item.
+    if ( FindBox()->IsVisible() )
+        {
+        aMenuPane->SetItemDimmed(EAknCmdFindPopupActivated, ETrue);
+        }
+    
+    CTextListBoxModel* modelSm = ( ( CEikSettingsListBox* )ListBox() )->Model();  // not taking ownership
+    TInt itemCount = modelSm->NumberOfItems();
+		//if the listbox is empty, dim the change menu item.
+    if (itemCount == 0)
+        {
+        aMenuPane->SetItemDimmed(EAknCmdOpen, ETrue);
+        }
+    
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// Called to get the help context.
+// ---------------------------------------------------------------------------
+//
+void CDefaultAppSrvMimeDlg::GetHelpContext(TCoeHelpContext& aContext) const
+    {
+    aContext.iMajor = KUidDefaultAppServer;
+    
+    //check if we have proper values
+    if(!iDefaultAppUi->iServMimeApps)
+        aContext.iContext = KDA_HLP_MAIN;
+    else
+        {
+        //check for GS client
+        if (iDefaultAppUi->iServMimeApps->iAppUid == KUidGS)
+            {
+            //the client is GS. Check for simplified or advanced view
+            if (iDefaultAppUi->iServMimeApps->iSimplifiedView)
+                aContext.iContext = KDA_HLP_MAIN;
+            else
+                aContext.iContext = KDA_HLP_ADVANCED;
+            }
+        else
+            {
+            //this is not GS client
+            aContext.iContext = KDA_HLP_APPLICATION;
+            };
+        };
+    }
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// Called to get the help context.
+// ---------------------------------------------------------------------------
+//    
+void CDefaultAppSrvMimeDlg::SizeChanged()
+    {
+    CAknSelectionListDialog::SizeChanged(); 
+    }
+   
+    
+// ---------------------------------------------------------------------------
+// Enables marquee for the list elements.
+// ---------------------------------------------------------------------------
+//  
+void CDefaultAppSrvMimeDlg::EnableMarqueeL()
+    {
+    CFormattedCellListBoxData *tmp=((CEikSettingsListBox*)(ListBox()))->ItemDrawer()->FormattedCellData();
+    
+    tmp->SetMarqueeParams(KMaxTInt, 6, 2000000, 10000); // Magic: loop forever
+    tmp->EnableMarqueeL(ETrue);
+    }
+
+
+// ---------------------------------------------------------------------------
+// Loads icons from a file and sets them in the drawer for iSavedGamesList
+// ---------------------------------------------------------------------------
+//  
+CArrayPtr<CGulIcon>* CDefaultAppSrvMimeDlg::GetPopupListIconsL() const
+    {
+    // CGulIcon class packages two bitmaps: icon image and its mask
+    // CAknIconArray inherits from CArrayPtrFlat
+    CArrayPtr<CGulIcon>* iconList = new (ELeave) 
+                                 CAknIconArray(2);
+    CleanupStack::PushL(iconList);
+    
+    TFileName iconFile( AknIconUtils::AvkonIconFileName() );
+    MAknsSkinInstance* skinInstance;
+    CFbsBitmap* newIconBmp = NULL;
+    CFbsBitmap* newIconBmpMask = NULL;
+    CGulIcon* newIcon = NULL;
+    
+    skinInstance = AknsUtils::SkinInstance();
+              
+    //creating blank icon
+    AknsUtils::CreateIconLC(skinInstance,KAknsIIDQgnPropEmpty,
+                           newIconBmp,newIconBmpMask,iconFile,
+                           EMbmAvkonQgn_prop_empty,
+                           EMbmAvkonQgn_prop_empty_mask);
+    
+    newIcon = CGulIcon::NewL(newIconBmp,newIconBmpMask);
+    
+    CleanupStack::Pop(2);//newIconBmp & newIconBmpMask
+    CleanupStack::PushL(newIcon);
+    iconList->AppendL(newIcon);
+    
+    CleanupStack::Pop(newIcon);     
+              
+    //creating TICK mark icon
+    AknsUtils::CreateIconLC(skinInstance,KAknsIIDQgnPropSubCurrent,
+                           newIconBmp,newIconBmpMask,iconFile,
+                           EMbmAvkonQgn_prop_sub_current,
+                           EMbmAvkonQgn_prop_sub_current_mask);
+    
+    newIcon = CGulIcon::NewL(newIconBmp,newIconBmpMask);
+    
+    CleanupStack::Pop(2);//newIconBmp & newIconBmpMask
+    CleanupStack::PushL(newIcon);
+    iconList->AppendL(newIcon);
+
+    CleanupStack::Pop(newIcon);
+    
+    CleanupStack::Pop(iconList);
+
+    newIconBmp = NULL;
+    newIconBmpMask = NULL;
+    newIcon = NULL;
+
+    return iconList;
+    }
+        
+    
+// ---------------------------------------------------------------------------
+// Pops-up a menu list with the Applications for the selected Service & MIME item
+// ---------------------------------------------------------------------------
+//  
+void CDefaultAppSrvMimeDlg::OpenMenuForSelectedServiceAndMimeL(TInt aSelectedIndex)
+    {
+    if(!iDefaultAppUi->iServMimeApps)User::Leave(KErrNotFound);
+    if(aSelectedIndex<0)return; //there is no selected item (list is empty)
+    
+    CAknSingleGraphicPopupMenuStyleListBox *selectedServiceAndMime = new (ELeave) CAknSingleGraphicPopupMenuStyleListBox;
+    CleanupStack::PushL(selectedServiceAndMime);
+    
+    if ( iPopupList != NULL )
+    	{
+        iPopupList->CancelPopup();
+        iPopupList = NULL;
+    	}
+    
+    iPopupList = CAknPopupList::NewL(selectedServiceAndMime, R_AVKON_SOFTKEYS_OK_CANCEL);
+    selectedServiceAndMime->ConstructL(iPopupList,EAknListBoxMenuList);
+    selectedServiceAndMime->CreateScrollBarFrameL (ETrue);
+    selectedServiceAndMime->ScrollBarFrame()->SetScrollBarVisibilityL( 
+            CEikScrollBarFrame::EOff, 
+            CEikScrollBarFrame::EAuto );
+
+    //construct icons
+    CArrayPtr<CGulIcon>* icons=GetPopupListIconsL();
+    selectedServiceAndMime->ItemDrawer()->ColumnData()->SetIconArray(icons); // passing ownership of icons
+    
+    
+    //populate the applications list
+    CTextListBoxModel* modelApps = selectedServiceAndMime->Model();  // not taking ownership
+    modelApps->SetOwnershipType (ELbmOwnsItemArray);
+    CDesCArray* applications = STATIC_CAST(CDesCArray*, modelApps->ItemTextArray());
+    HBufC* listTitle=NULL;
+    iDefaultAppUi->iServMimeApps->GetApplicationsListL(aSelectedIndex, *applications, listTitle);
+    
+    
+    //set the title of the list
+    CleanupStack::PushL(listTitle);
+    iPopupList->SetTitleL(*listTitle);
+    CleanupStack::PopAndDestroy(listTitle);
+    //
+    TInt popupOk = iPopupList->ExecuteLD();
+    iPopupList = NULL;
+    
+    if(popupOk)
+        {
+        TInt selected = selectedServiceAndMime->CurrentItemIndex();
+        
+        //update the default in the array & list
+        //get the list array first
+        CTextListBoxModel* modelSm = ((CEikSettingsListBox*)ListBox())->Model();  // not taking ownership
+        //modelSm->SetOwnershipType (ELbmOwnsItemArray);
+        CDesCArray* servicesAndMimesArray = STATIC_CAST(CDesCArray*, modelSm->ItemTextArray());
+        //do the update
+        iDefaultAppUi->iServMimeApps->UpdateDefaultL(aSelectedIndex,selected,servicesAndMimesArray);
+        //redraw the list
+        DrawNow();
+        }
+    CleanupStack::PopAndDestroy(selectedServiceAndMime);
+    }
+
+// ---------------------------------------------------------------------------
+// OfferKeyEventL from ccoecontrol
+// ---------------------------------------------------------------------------
+// 
+TKeyResponse CDefaultAppSrvMimeDlg::OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType)
+    {
+    if ( aKeyEvent.iCode == EKeyBackspace )
+        {
+        if ( FindBox()->TextLength() >0 )
+            {
+            return FindBox()->OfferKeyEventL( aKeyEvent, aType );
+            }
+        }
+    return CAknSelectionListDialog::OfferKeyEventL( aKeyEvent ,aType );
+    }
+
+// -----------------------------------------------------------------------------
+// CDefaultAppSrvMimeDlg::ListBoxItemsChanged (from MListBoxItemChangeObserver)
+// 
+// -----------------------------------------------------------------------------
+//
+void CDefaultAppSrvMimeDlg::ListBoxItemsChanged( CEikListBox* aListBox )
+    {
+    if ( aListBox )
+        {
+        CEikButtonGroupContainer& cba = ButtonGroupContainer();
+        CTextListBoxModel* modelSm = ((CEikSettingsListBox*)aListBox)->Model();  // not taking ownership
+        TInt itemCount = modelSm->NumberOfItems();
+        if (itemCount == 0)
+            {
+            cba.MakeCommandVisible(EAknCmdOpen, EFalse);
+            }
+        else
+            {
+            cba.MakeCommandVisible(EAknCmdOpen, ETrue);
+            }
+        }
+    }
+