--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/defaultapplicationsettings/server/src/das_srvmime_dlg.cpp Wed Sep 01 12:33:30 2010 +0100
@@ -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);
+ }
+ }
+ }
+