Attempted fix for AknLayout.lag appearing twice in the same location, but with different cases. This is a bit experimental as I'm doing it on a windows machine (case insensitive), so we'll see how we go.
/*
* 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 <aknlists.h>
#include <AknWaitDialog.h>
#include <aknnotewrappers.h>
#include <eikbtgpc.h>
#include <gslistbox.h>
#include <gsfwviewuids.h>
//#include <csxhelp/ai.hlp.hrh>
#include <aknradiobuttonsettingpage.h>
#include <akntextsettingpage.h>
#include <centralrepository.h>
#include <StringLoader.h>
#include <aiscutsettingsres.rsg>
#include <aiscuttexts.rsg>
#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<CCoeControl*>(iAppListDialog);
}
else if (iBkmListDialog)
{
dialog = static_cast<CCoeControl*>(iBkmListDialog);
}
else if (iEditDialog)
{
dialog = static_cast<CCoeControl*>(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<CEikDialog**> (&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.