diff -r 000000000000 -r 79c6a41cd166 idlefw/plugins/shortcutplugin/src/caiscutsettingscontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/plugins/shortcutplugin/src/caiscutsettingscontainer.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,488 @@ +/* +* Copyright (c) 2005-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: Shortcut settings plug-in container. +* +*/ + + +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include + +#include +#include + +#include "caiscutsettingscontainer.h" +#include "caiscutsettingsmodel.h" +#include "caiscutsettingsbkmlist.h" +#include "caiscutsettingsitem.h" +#include "aiscutpluginprivatecrkeys.h" +#include "aiscutdefs.h" + +const TUid KUidAI = { 0x101F8701 }; // Active Standby Shortcuts help uid + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAiScutSettingsContainer::CAiScutSettingsContainer() +{ +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::ConstructL(const TRect& aRect) +{ + iListBox = new (ELeave) CAknSettingStyleListBox; + BaseConstructL(aRect, R_SCUT_SETTINGS_VIEW_TITLE, NULL); + + iOldType = EAiScutSettingTypeUndefined; + + CheckMiddleSoftkeyLabelL(); + + iModel->ActivateObservers(ETrue); +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CAiScutSettingsContainer::~CAiScutSettingsContainer() +{ + HideWaitNoteDialog(); +} + +// --------------------------------------------------------------------------- +// Sets pointer to settings plug-in model. +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::SetModel(CAiScutSettingsModel* aModel) +{ + iModel = aModel; +} + +// --------------------------------------------------------------------------- +// Chandles a setting change command. +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::HandleChangeCommandL() +{ + if ( iChangeProcessInProgress ) + { + return; + } + TBool changed = EFalse; + TInt current = iListBox->CurrentItemIndex(); + CAiScutSettingsItem* item = iModel->Item(current); + if (!item) + { + return ; + } + + TUint32 key = item->Key(); + TBool locked = (0 != (key & KScutFlagBitLocked)); + + if (locked) + { + HBufC* text = iCoeEnv->AllocReadResourceLC(R_SCUT_SETTINGS_TXT_FIXED_ITEM); + CAknInformationNote* note = new (ELeave) CAknInformationNote(ETrue); + note->ExecuteLD(*text); + CleanupStack::PopAndDestroy(text); + } + else + { + TAiScutSettingType oldType = item->Type(); + TInt newType = oldType; + + CDesCArrayFlat* array = iCoeEnv->ReadDesC16ArrayResourceL( + R_SCUT_CHANGE_TO_PAGE_LBX); + CleanupStack::PushL(array); + + CAknListQueryDialog* dialog = new(ELeave)CAknListQueryDialog(&newType); + CleanupStack::PushL(dialog); + dialog->PrepareLC(R_SCUT_LISTQUERY_CHANGE_TO_PAGE); + CleanupStack::Pop(dialog); + dialog->SetItemTextArray(array); + dialog->SetOwnershipType(ELbmDoesNotOwnItemArray); + iChangeProcessInProgress = ETrue; + if (dialog->RunLD()) + { + item = iModel->Item(current); + if (newType == EAiScutSettingTypeUrl) + { + changed = HandleUrlChangeCommandL(*item, (newType != oldType)); + } + else if (newType == EAiScutSettingTypeBookmark) + { + changed = HandleBookmarkChangeCommandL(*item, (newType != oldType)); + } + else + { + changed = HandleAppListChangeCommandL(*item, (newType != oldType)); + } + if ( changed ) + { + ResetCurrentListL(current); + } + + } + iChangeProcessInProgress = EFalse; + CleanupStack::PopAndDestroy(array); + } +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CAiScutSettingsContainer::IsChangeDialogShowing() +{ + return (iAppListDialog || iBkmListDialog || iEditDialog); +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::CloseChangeDialog() +{ + TKeyEvent keyEvent; + + keyEvent.iCode = EKeyEscape; + keyEvent.iScanCode = EStdKeyEscape; + keyEvent.iModifiers = 0; + keyEvent.iRepeats = 0; + + CCoeControl* dialog = NULL; + + if (iAppListDialog) + { + dialog = static_cast(iAppListDialog); + } + else if (iBkmListDialog) + { + dialog = static_cast(iBkmListDialog); + } + else if (iEditDialog) + { + dialog = static_cast(iEditDialog); + } + + if (dialog) + { + TRAP_IGNORE(dialog->OfferKeyEventL(keyEvent, EEventKey)); + } +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::ResetCurrentListL(TInt aIndex) +{ + if (iModel->MdcaCount() == 0) + { + iListBox->HandleItemRemovalL(); + } + else + { + iListBox->HandleItemAdditionL(); + } + + iListBox->SetCurrentItemIndex(aIndex); + + CheckMiddleSoftkeyLabelL(); +} + +// --------------------------------------------------------------------------- +// From CGSBaseContainer +// Constructs the settings listbox. +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::ConstructListBoxL(TInt /*aResLbxId*/) +{ + iListBox->ConstructL(this, EAknListBoxSelectionList); + + // Set empty listbox's text. + HBufC* text = iCoeEnv->AllocReadResourceLC(R_SCUT_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 CAiScutSettingsContainer::HandleAppListChangeCommandL(CAiScutSettingsItem& aItem, + TBool /*aNew*/) +{ + + TBool changed = EFalse; + + iChangeProcessStopped = EFalse; + + if (!iModel->AppList()->IsReady()) + { + ShowWaitNoteDialogL(); // Blocks until applist reports that it is ready. + } + // If wait note was "killed" then don't continue the change process + // If the process is not stopped here it could lead to situation where + // self is deleted before the ShowWaitNoteDialogL() returns + if ( iChangeProcessStopped ) + { + return EFalse; + } + + TUint32 key = aItem.Key(); + TBool optional = (0 != (key & KScutFlagBitOptionallyVisible)); + TBool scrollkey = (0 != ((key & 0xFFFF) < EAiScutSoftKeyLeft)); + + if (optional && scrollkey) + { + iModel->AppList()->AddExtraItemsL(); + } + + TInt index = iModel->AppList()->FindIndex(aItem); + TInt oldIndex = index; + + iAppListDialog = new (ELeave) CAknRadioButtonSettingPage( + R_SCUT_SETTINGS_APPLIST_PAGE, index, iModel->AppList()); + + iAppListDialog->SetSettingTextL(aItem.Title()); + iAppListDialog->ConstructL(); + + if (iAppListDialog->ExecuteLD(CAknSettingPage::EUpdateWhenChanged) && + index != oldIndex) + { + TUid uid; + TPtrC params; + TPtrC caption; + TAiScutSettingType type; + if (iModel->AppList()->GetDataByIndex(index, uid, params, caption, type) == KErrNone) + { + if ( type == EAiScutSettingTypeUrl ) + { + aItem.ChangeUrlL( params ); + } + else + { + aItem.ChangeApplicationL(uid, params, caption); + } + iModel->SaveItemL(aItem); + changed = ETrue; + } + } + + if (optional && scrollkey) + { + iModel->AppList()->RemoveExtraItemsL(); + } + + iAppListDialog = NULL; + return changed; +} + +// --------------------------------------------------------------------------- +// Chandles a setting change command to select bookmark from a list. +// --------------------------------------------------------------------------- +// +TBool CAiScutSettingsContainer::HandleBookmarkChangeCommandL(CAiScutSettingsItem& aItem, + TBool /*aNew*/) +{ + + TBool changed = EFalse; + iModel->BkmList()->GetBookmarkListL(); + TInt index = iModel->BkmList()->FindIndex(aItem); + TInt oldIndex = index; + + iBkmListDialog = new (ELeave) CAknRadioButtonSettingPage( + R_SCUT_SETTINGS_APPLIST_PAGE, index, iModel->BkmList()); + + iBkmListDialog->SetSettingTextL(aItem.Title()); + iBkmListDialog->ConstructL(); + + if (iBkmListDialog->ExecuteLD(CAknSettingPage::EUpdateWhenChanged) && + index != oldIndex) + { + TPtrC params; + TPtrC caption; + if (iModel->BkmList()->GetDataByIndex(index, params, caption) == KErrNone) + { + aItem.ChangeBookmarkL(params, caption); + iModel->SaveItemL(aItem); + changed = ETrue; + } + } + + iBkmListDialog = NULL; + return changed; +} + +// --------------------------------------------------------------------------- +// Chandles a setting change command to edit an URL. +// --------------------------------------------------------------------------- +// +TBool CAiScutSettingsContainer::HandleUrlChangeCommandL(CAiScutSettingsItem& aItem, + TBool aNew) +{ + TBool changed = EFalse; + HBufC* newUrl = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength); + TPtr urlPtr = newUrl->Des(); + + if (!aNew) + { + urlPtr.Copy(aItem.Value()); + } + + if (EditTextL(R_SCUT_TYPE_URL_PAGE , urlPtr)) + { + aItem.ChangeUrlL(urlPtr); + iModel->SaveItemL(aItem); + changed = ETrue; + } + + CleanupStack::PopAndDestroy(newUrl); + return changed; +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CAiScutSettingsContainer::EditTextL(TInt aResId, TDes& aDes) +{ + TBool ret = EFalse; + + iEditDialog = new (ELeave) CAknTextSettingPage(aResId, aDes); + + if (iEditDialog->ExecuteLD(CAknSettingPage::EUpdateWhenChanged)) + { + if (aDes.Length()) + { + ret = ETrue; + } + } + + iEditDialog = NULL; + + return ret; +} + +// --------------------------------------------------------------------------- +// Shows the wait note dialog. +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::ShowWaitNoteDialogL() +{ + if (!iWaitDialog) + { + iWaitDialog = new (ELeave) CAknWaitDialog( + (reinterpret_cast (&iWaitDialog)), + ETrue // aVisibilityDelayOff + ); + iWaitDialog->ExecuteLD(R_SCUT_WAIT_NOTE); + } +} + +// --------------------------------------------------------------------------- +// Hides the wait note dialog. +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::HideWaitNoteDialog() +{ + if (iWaitDialog) + { + TRAP_IGNORE(iWaitDialog->ProcessFinishedL()); // deletes the dialog. + iWaitDialog = NULL; + } +} + +void CAiScutSettingsContainer::StopShortcutChangeProcess() +{ + iChangeProcessStopped = ETrue; + HideWaitNoteDialog(); + if ( IsChangeDialogShowing() ) + { + CloseChangeDialog(); + } +} + +// --------------------------------------------------------------------------- +// Gets Help +// --------------------------------------------------------------------------- +// +void CAiScutSettingsContainer::GetHelpContext(TCoeHelpContext& aContext) const +{ + aContext.iMajor = KUidAI; + //aContext.iContext = KSET_HLP_PERSONAL_SHORTCUTS; // This is specified in HRH file +} + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TKeyResponse CAiScutSettingsContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType) +{ + switch (aKeyEvent.iCode) + { + case EKeyUpArrow: + case EKeyDownArrow: + { + TKeyResponse resp = iListBox->OfferKeyEventL(aKeyEvent, aType); + return resp; + } + + 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 CAiScutSettingsContainer::CheckMiddleSoftkeyLabelL() +{ + CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); + if (cba) + { + cba->MakeCommandVisible(EAiScutSettingsCmdChange, (iModel->MdcaCount() != 0)); + } +} + +// End of File.