diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/akndialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/akndialog.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,433 @@ +/* +* Copyright (c) 2002-2005 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: +* +*/ + +// AknDialog.cpp +// +// Copyright (c) 2001 Symbian Ltd. All rights reserved. +// + +#include +#include +#include +#include +#include "aknenv.h" +#include +#include +#include +#include +#include +#include "aknitemactionmenuregister.h" + +#include +#include +#include "AknUtils.h" + +#include +using namespace SkinLayout; + + + +class CAknDialogAttributes: public CBase + { +public: + ~CAknDialogAttributes() + { + delete iBgContext; + delete iBrushAndPenContext; + } +public: // data + TInt iAknDialogFlags; + CAknsFrameBackgroundControlContext* iBgContext; + CCoeBrushAndPenContext* iBrushAndPenContext; + TRect iOuterRect; + TRect iInnerRect; + TBool iNeedsUpdate; + }; + +/** + * Constructor + */ +EXPORT_C CAknDialog::CAknDialog() + { + } + + +/** + * Creates a menu using a menu resource. + * A menu resource MUST be specified - this function will Panic otherwise. If a menu is not required use CEikDialog! + */ +EXPORT_C void CAknDialog::ConstructL(TInt aMenuTitleResourceId) + { + if ( !iAttributes ) + { + AttributesL(); + } + + CreateMenuBarL(aMenuTitleResourceId); + + iAttributes->iAknDialogFlags &= ~EAknDialogFlagNotConstructed; + } + +/** + * + */ +EXPORT_C CAknDialog::~CAknDialog() + { + AknItemActionMenuRegister::SetConstructingMenuBarOwnerL( NULL ); + + if ( iCoeEnv->AppUi() && iAttributes ) + if (iAttributes->iAknDialogFlags&EAknDialogFlagDefaultSounds) // return original sound stack + { + iAvkonAppUiBase->KeySounds()->PopContext(); + } + + if (iMenuBar) + { + if ( iAttributes ) + { + iAttributes->iAknDialogFlags |= EAknDialogFlagDialogDeleted; + } + HideMenu(); + iEikonEnv->EikAppUi()->RemoveFromStack(iMenuBar); + delete iMenuBar; + } + delete iAttributes; + } + +EXPORT_C void CAknDialog::PrepareLC(TInt aResourceId) + { + if (!iMenuBar) + { + // PrepareLC has to keep ownership of "this". + CleanupStack::PushL(this); + CreateMenuBarL(R_AVKON_DIALOG_EMPTY_MENUBAR); // empty menu bar + CleanupStack::Pop(this); + } + CEikDialog::PrepareLC(aResourceId); + } + +EXPORT_C TInt CAknDialog::RunLD() + { + return CEikDialog::RunLD(); + } + +/** + * Swap the Application menu with the Form's menu before displaying + * + */ +EXPORT_C TInt CAknDialog::ExecuteLD(TInt aResourceId) + { + if ( iCoeEnv->AppUi() ) // Enable default tones while dialog / form is on screen + { + CleanupStack::PushL(this); + if (!iAttributes) + { + AttributesL(); + iAttributes->iAknDialogFlags |= EAknDialogFlagNotConstructed; // Way to indicate to SetEmphasis that other members are not accessible + } + + iAvkonAppUiBase->KeySounds()->PushContextL(R_AVKON_DEFAULT_SKEY_LIST); + iAttributes->iAknDialogFlags |= EAknDialogFlagDefaultSounds; + CleanupStack::Pop(); + } + + return ( CEikDialog::ExecuteLD(aResourceId) ); + } + +/** + *From MEikMenuObserver + * (called when menu is cancelled) + * Called also from destructor ( EAknDialogFlagDialogDeleted is set) + */ +EXPORT_C void CAknDialog::SetEmphasis(CCoeControl* aMenuControl,TBool aEmphasis) + { + if (!iAttributes + || iAttributes->iAknDialogFlags & EAknDialogFlagNotConstructed + || iAttributes->iAknDialogFlags & EAknDialogFlagDialogDeleted) + return; + + CEikAppUi* appUi = iEikonEnv->EikAppUi(); + appUi->RemoveFromStack(aMenuControl); + // Remove focus from aMenuControl because AppUi's RemoveFromStack won't do + // that. + aMenuControl->SetFocus( EFalse ); + TRAP_IGNORE(appUi->AddToStackL(aMenuControl, aEmphasis ? ECoeStackPriorityDialog : ECoeStackPriorityMenu)); + appUi->UpdateStackedControlFlags(this, aEmphasis ? ECoeStackFlagRefusesFocus : 0, ECoeStackFlagRefusesFocus); + appUi->UpdateStackedControlFlags(aMenuControl, aEmphasis ? 0 : ECoeStackFlagRefusesFocus, ECoeStackFlagRefusesFocus); + appUi->HandleStackChanged(); + } + +/** + * This function intialiases the items on the menu. It's used to disable and enable menu items and may be + * over ridden to add new ones. + * NOTE that it might be called with the 'wrong' ResourceId so it must do a check and not assume. + * + */ +EXPORT_C void CAknDialog::DynInitMenuPaneL(TInt /*aResourceId*/, CEikMenuPane* /*aMenuPane*/) + { + } + +/** + *From MEikCommandObserver + */ +EXPORT_C void CAknDialog::ProcessCommandL(TInt /* aCommandId */) + { + HideMenu(); + } + + +/** + * From CCoeControl + * + * If MMC is supported always process user input (MMC PIN requester does not seem + * to have focus when it pops up) + */ +EXPORT_C TKeyResponse CAknDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + if (IsFocused() || + (aType == EEventKey && aKeyEvent.iCode == EKeyEscape) + ) + return (CEikDialog::OfferKeyEventL(aKeyEvent, aType)); + else + return EKeyWasNotConsumed; + } + + + +/** + * + * From CEikDialog - If there is an Options key then pops up menu, otherwise exits. Override this if necessary. + */ +EXPORT_C TBool CAknDialog::OkToExitL(TInt aButtonId) + { + TBool retVal; + + if (iMenuBar) + HideMenu(); + + if (aButtonId == EAknSoftkeyOptions) + { + DisplayMenuL(); + retVal = EFalse; + } + else + { + retVal = ETrue; + } + + if (aButtonId == EAknSoftkeyMark || aButtonId == EAknSoftkeyUnmark) + { + retVal = EFalse; + } + + return retVal; + } + + +/** + * + */ +EXPORT_C void CAknDialog::DisplayMenuL() + { + iMenuBar->TryDisplayMenuBarL(); + } + +/** + * + */ +EXPORT_C void CAknDialog::HideMenu() + { + iMenuBar->StopDisplayingMenuBar(); + } + +EXPORT_C void CAknDialog::FocusChanged(TDrawNow aDrawNow) + { + if (!iAttributes || iAttributes->iAknDialogFlags & EAknDialogFlagDialogDeleted) + return; + TInt controlID = IdOfFocusControl(); + if (controlID) + Line(controlID)->SetFocus(IsFocused(), aDrawNow); + } + +/** + * + */ +EXPORT_C TBool CAknDialog::MenuShowing() const + { + return iMenuBar->IsDisplayed(); + } + + +EXPORT_C void CAknDialog::Reserved_MtsmPosition() + { + } + +EXPORT_C void CAknDialog::Reserved_MtsmObject() + { + } + +EXPORT_C void CAknDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + CEikDialog::HandlePointerEventL(aPointerEvent); + } + +EXPORT_C void* CAknDialog::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +void CAknDialog::CreateMenuBarL(TInt aMenuTitleResourceId) + { + if (iMenuBar) + { + // just replace the content if it doesn't already exist + iMenuBar->TitleArray()->ResetAndDestroy(); + iMenuBar->SetMenuTitleResourceId(aMenuTitleResourceId); + } + else + { + CEikMenuBar* newMenuBar = new (ELeave) CEikMenuBar(); + CleanupStack::PushL(newMenuBar); + newMenuBar->ConstructL(this, NULL, aMenuTitleResourceId); + iEikonEnv->EikAppUi()->AddToStackL(newMenuBar,ECoeStackPriorityMenu,ECoeStackFlagRefusesFocus); + iMenuBar=newMenuBar; + CleanupStack::Pop(); // now owned by this Dialog. + } + + AknItemActionMenuRegister::SetConstructingMenuBarOwnerL( this ); + } + +// +// UpdateBgContext is done here because we dont want to create huge icons +// always when dialog is launched. The icon is anyway used only when +// queries are used, so deferring its creation to MopSupplyObject; +// this saves considerable amount of time and memory for non-popup +// dialogs. SetFrameRects renders the qsn_fr_popup, so deferring that call. +// +static void UpdateBgContext(CAknDialogAttributes &aAttrs) + { + if (aAttrs.iNeedsUpdate) + { + TRect outerRect = aAttrs.iOuterRect; + TRect innerRect = aAttrs.iInnerRect; + aAttrs.iBgContext->SetFrameRects( outerRect, innerRect ); + aAttrs.iNeedsUpdate = EFalse; + } + } + +EXPORT_C TTypeUid::Ptr CAknDialog::MopSupplyObject(TTypeUid aId) + { + // Must test on the type of dialog before supplying an object + if ( Extension() ) { + if ( aId.iUid == MAknsControlContext::ETypeId && + Extension()->LayoutCategory() == CEikDialogExtension::EPopupLayout ) + { + if (!iAttributes) + { + TRAPD( err, AttributesL() ); + if ( err ) + { + delete iAttributes; + iAttributes = 0; + return CEikDialog::MopSupplyObject(aId); + } + else + { + iAttributes->iAknDialogFlags |= EAknDialogFlagNotConstructed; // Way to indicate to SetEmphasis that other members are not accessible + } + } + UpdateBgContext(*iAttributes); + return MAknsControlContext::SupplyMopObject(aId, iAttributes->iBgContext ); + } + } + if (aId.iUid == CEikMenuBar::ETypeId) + return aId.MakePtr(iMenuBar); + else + return CEikDialog::MopSupplyObject(aId); + } + +EXPORT_C void CAknDialog::Draw(const TRect& aRect) const + { + + CEikDialog::Draw(aRect); // Frame drawing done in eikdialog + } + +EXPORT_C void CAknDialog::SizeChanged() + { + if (iAttributes) + { + TRect windowRect = Rect(); + + TAknLayoutRect topLeft; + topLeft.LayoutRect(windowRect, Popup_windows_skin_placing__frame_general__Line_2()); + + TAknLayoutRect bottomRight; + bottomRight.LayoutRect(windowRect, Popup_windows_skin_placing__frame_general__Line_5()); + + TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr); + TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl); + + iAttributes->iOuterRect = outerRect; + iAttributes->iInnerRect = innerRect; + iAttributes->iNeedsUpdate = ETrue; + iAttributes->iBgContext->SetParentPos( PositionRelativeToScreen() ); + } + CEikDialog::SizeChanged(); + } + +EXPORT_C void CAknDialog::CEikDialog_Reserved_1() + { + } + +EXPORT_C void CAknDialog::CEikDialog_Reserved_2() + { + } + +EXPORT_C void CAknDialog::CAknDialog_Reserved() + { + } + +CAknDialogAttributes* CAknDialog::AttributesL() + { + if ( !iAttributes ) + { + iAttributes = new (ELeave) CAknDialogAttributes(); + + TRect windowRect = Rect(); + + TAknLayoutRect topLeft; + topLeft.LayoutRect(windowRect, Popup_windows_skin_placing__frame_general__Line_2()); + + TAknLayoutRect bottomRight; + bottomRight.LayoutRect(windowRect, ELayoutEmpty, 169, ELayoutEmpty, ELayoutEmpty, 2, 7,7); + bottomRight.LayoutRect(windowRect, Popup_windows_skin_placing__frame_general__Line_5()); + + TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr); + TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl); + + iAttributes->iBgContext = CAknsFrameBackgroundControlContext::NewL( + KAknsIIDQsnFrPopup, outerRect, innerRect, ETrue ); + + + if ( &Window() ) + iAttributes->iBgContext->SetParentPos( PositionRelativeToScreen() ); + } + + return iAttributes; + } + +// end of CAknDialog