diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknTransparentCameraSettingPage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknTransparentCameraSettingPage.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,738 @@ +/* +* Copyright (c) 2002-2009 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: +* Support for transparent camera setting pages +* +* +*/ + + +#include "AknTransparentCameraSettingPage.h" + +// For icon support +#include +#include +#include + +// lists +#include + +#include +// Used for setting 1 in the radio button +_LIT(KOneSlashT, "1\t"); + +enum TAknTransparentCameraSettingPagePanicCodes + { + EAknPanicTransparentCameraSettingPageIndexOutOfRange + }; + +GLDEF_C void Panic(TAknTransparentCameraSettingPagePanicCodes aPanic) + { + _LIT(KPanicCat,"AknTransparentCameraSettingPage"); + User::Panic(KPanicCat, aPanic); + } + +NONSHARABLE_CLASS(CAknTransparentCameraSettingPageExtension) : public CBase + { + friend class CAknTransparentCameraSettingPage; + +public: + static CAknTransparentCameraSettingPageExtension* NewL( + CCoeControl& aOwner ); + ~CAknTransparentCameraSettingPageExtension(); + +private: + CAknTransparentCameraSettingPageExtension( CCoeControl& aOwner ); + void ConstructL(); +public: //data + + CFbsBitmap* iBackground; + // Background bitmap's top left corner. + TPoint iBitmapPosition; + // Background bitmap will be drawn inside this rect (ie. it will be cropped + // if the rect is smaller than the actual bitmap) + TRect iBitmapClipRect; + TBool iDrawFullBackground; + TBool iDrawBackgroundBitmap; + TBool iFullScreenMode; + + TBool iReplaceNaviPane; //replace navi pane with empty contents? + TBool iReturn; //user select okay or cancel? + TInt iUpdateMode; + CActiveSchedulerWait iWait; //owned + + /** + * Extension flags definition. + */ + enum TFlags + { + ESingleClickEnabled + }; + + /** + * Extension flags. + */ + TBitFlags iFlags; + }; + +CAknTransparentCameraSettingPageExtension* CAknTransparentCameraSettingPageExtension::NewL( + CCoeControl& aOwner ) + { + CAknTransparentCameraSettingPageExtension* self = + new (ELeave) CAknTransparentCameraSettingPageExtension( aOwner ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CAknTransparentCameraSettingPageExtension::~CAknTransparentCameraSettingPageExtension() + { + if(iWait.IsStarted()) + { + CAknEnv::StopSchedulerWaitWithBusyMessage(iWait); + } + } + +CAknTransparentCameraSettingPageExtension::CAknTransparentCameraSettingPageExtension( + CCoeControl& aOwner ) + : iDrawFullBackground(ETrue), iDrawBackgroundBitmap(ETrue), + iReplaceNaviPane(ETrue), + iUpdateMode(CAknSettingPage::EUpdateWhenAccepted) + { + if ( static_cast( + aOwner.ControlEnv()->AppUi() )->IsSingleClickCompatible() ) + { + iFlags.Set( ESingleClickEnabled ); + } + } + +void CAknTransparentCameraSettingPageExtension::ConstructL() + { + } + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + + +EXPORT_C CAknTransparentCameraSettingPage::CAknTransparentCameraSettingPage( TInt aResourceId, TInt& aCurrentSelectionItem, const MDesCArray* aItemArray): + CAknListBoxSettingPage(aResourceId), iOldSelectionIndex(aCurrentSelectionItem), iCurrentSelectionIndex(aCurrentSelectionItem), iItemArray(aItemArray) + { + AKNTASHOOK_ADD( this, "CAknTransparentCameraSettingPage" ); + } + + +EXPORT_C CAknTransparentCameraSettingPage::CAknTransparentCameraSettingPage( + const TDesC* aSettingText, + TInt aSettingNumber, + TInt aControlType, + TInt aEditorResourceId, + TInt aSettingPageResourceId, + TInt& aCurrentSelectionIndex, + const MDesCArray* aItemArray ) + : CAknListBoxSettingPage( + aSettingText, + aSettingNumber, + aControlType, + aEditorResourceId, + aSettingPageResourceId ), + iOldSelectionIndex(aCurrentSelectionIndex), + iCurrentSelectionIndex(aCurrentSelectionIndex), + iItemArray(aItemArray) + { + AKNTASHOOK_ADD( this, "CAknTransparentCameraSettingPage" ); + } + + +/** + * Destructor + * + */ +EXPORT_C CAknTransparentCameraSettingPage::~CAknTransparentCameraSettingPage() + { + AKNTASHOOK_REMOVE(); + delete(iInternalItemArray); + if (iExtension) + delete iExtension; + } + +EXPORT_C void CAknTransparentCameraSettingPage::ConstructL() + { + BaseConstructL( KAknSettingPageNoEmbeddedSoftKeys ); + + SetDrawBackground(EFalse); // Enable transparent drawing + + GenerateInternalArrayAndGiveToListBoxL(); + + iExtension = CAknTransparentCameraSettingPageExtension::NewL( *this ); + + // This updates the CBA + CheckAndSetDataValidity(); + UpdateCbaL(); + + // Only a reference to the CBase object; not owned + CAknSetStyleListBox* listBox = ListBoxControl(); + + CreateBitmapArrayAndGiveToListBoxL(); + + listBox->ItemDrawer()->FormattedCellData()->SetDrawBackground( EFalse ); + listBox->ItemDrawer()->FormattedCellData()->ToggleDropShadows( ETrue ); + + // Range should be within the valid indices, or -1: + // So valid range is >= -1 and also < Count. + __ASSERT_ALWAYS( iCurrentSelectionIndex >= -1, Panic( EAknPanicTransparentCameraSettingPageIndexOutOfRange) ); + __ASSERT_ALWAYS( iCurrentSelectionIndex < iInternalItemArray->Count(), Panic( EAknPanicTransparentCameraSettingPageIndexOutOfRange) ); + + listBox->View()->CalcBottomItemIndex(); + // Set initial highlight to the top element + if (FocusToFirstItem()) + {// Set initial highlight to the top element + if ( iInternalItemArray->Count() > 0 ) + listBox->SetCurrentItemIndex( 0 ); + } + if (FocusToSelectedItem()) + {// Set initial highlight to the current element. + if ( iInternalItemArray->Count() > 0 ) + { + if (iCurrentSelectionIndex != -1) + listBox->SetCurrentItemIndex( iCurrentSelectionIndex ); + else + listBox->SetCurrentItemIndex( 0 ); // Set at the top if selected is -1 + } + } + + listBox->SetListBoxObserver(this); + + // Set the current "pushed in" indication + if ( iCurrentSelectionIndex != -1 ) + listBox->View()->SelectItemL( iCurrentSelectionIndex ); + + // Set the scroller indication off + listBox->CreateScrollBarFrameL(ETrue); + listBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOff); + + // Need to do this to set up the scroll bar model + listBox->UpdateScrollBarsL(); + + if(!IsBackgroundDrawingEnabled()) + listBox->ScrollBarFrame()->DrawBackground(EFalse, EFalse); + + + // Force a size changed + SizeChanged(); + + // Construct an appropriate control context for the contained editor areas. + // Context produced is owned by CAknSettingPage. + SetEditedItemFrameIID( KAknsIIDQsnFrSetOpt, KAknsIIDQsnFrSetOptCenter ); +} + +//--------------------------------------------------------------------------------------------- +// Note: please call CAknSettingPage::ConstructL() before call this function! +//--------------------------------------------------------------------------------------------- +// +EXPORT_C TBool CAknTransparentCameraSettingPage::ExecuteLD( + enum CAknSettingPage::TAknSettingPageUpdateMode aMode, + TBool aReplaceNaviPane ) + { + iExtension->iReplaceNaviPane = aReplaceNaviPane; + if(aReplaceNaviPane) + { + return CAknSettingPage::ExecuteLD( aMode ); + } + + CleanupStack::PushL( this ); // Matching Pop is in AttemptExitL + iExtension->iUpdateMode = aMode; + + DynamicInitL(); + ActivateL(); + DrawNow(); + + EditorControl()->SetObserver( this ); + iEikonEnv->EikAppUi()->AddToStackL(this,ECoeStackPriorityDialog); + + if ( PostDisplayCheckL() ) + { + if (!iExtension->iWait.IsStarted()) + { + iExtension->iWait.Start(); + } + } + else + AttemptExitL(EFalse); + + iEikonEnv->EikAppUi()->RemoveFromStack(this); + CleanupStack::Pop(); // this + + TBool res=iExtension->iReturn; + delete (this); + + return res; + } + +//--------------------------------------------------------------------------------------------- +// Set the flags in extension to indicate user accept settings or cancel it. +//--------------------------------------------------------------------------------------------- +// +void CAknTransparentCameraSettingPage::AttemptExitL(TBool aAccept) + { + if ( OkToExitL( aAccept ) ) + { + DismissL( aAccept ); + iExtension->iReturn = aAccept; + + if ( iExtension->iWait.IsStarted() ) + { + CAknEnv::StopSchedulerWaitWithBusyMessage( iExtension->iWait ); + } + else + { + StopActiveScheduler(); + } + } + } + +//--------------------------------------------------------------------------------------------- +// Update settings according to update mode +//--------------------------------------------------------------------------------------------- +// +EXPORT_C void CAknTransparentCameraSettingPage::HandleControlEventL( + CCoeControl* /*aControl*/,TCoeEvent aEventType) + { + if ( aEventType == EEventStateChanged && iExtension && + iExtension->iUpdateMode == EUpdateWhenChanged ) + { + UpdateSettingL(); + } + } + +//--------------------------------------------------------------------------------------------- +// Process user command by modifying flags in extension +//--------------------------------------------------------------------------------------------- +// +EXPORT_C void CAknTransparentCameraSettingPage::ProcessCommandL(TInt aCommandId) + { + if(iExtension->iReplaceNaviPane) + { + CAknSettingPage::ProcessCommandL(aCommandId); + return; + } + + if(!IsEditable() && !(aCommandId == EAknSoftkeyBack || aCommandId == EAknSoftkeyCancel)) + { + return; + } + + HideMenu(); + + // Respond to softkey events + switch (aCommandId) + { + case EAknSoftkeyOk: + case EAknSoftkeySelect: + case EAknSoftkeyDone: + SelectCurrentItemL(); // has non-trivial implemenations in listbox type + // controls to put the selection on the current item + AttemptExitL(ETrue); + break; + case EAknSoftkeyBack: + case EAknSoftkeyCancel: + AttemptExitL(EFalse); + break; + case EAknSoftkeyOptions: + DisplayMenuL(); + break; + default: + break; + } + } + +EXPORT_C void CAknTransparentCameraSettingPage::HandleListBoxEventL(CEikListBox* /*aListBox*/, + MEikListBoxObserver::TListBoxEvent aEventType) + { + switch ( aEventType ) + { + case MEikListBoxObserver::EEventItemSingleClicked: + case MEikListBoxObserver::EEventEnterKeyPressed: + case MEikListBoxObserver::EEventItemDoubleClicked: + case MEikListBoxObserver::EEventItemActioned: + { + SelectCurrentItemL(); + AttemptExitL( ETrue ); + break; + } + + case MEikListBoxObserver::EEventFlickStopped: // fallthrough + case MEikListBoxObserver::EEventPanningStopped: + { + // The current item index (highlighted item) of the listbox control + // has been changed when starting the dragging / flicking, so + // it must be reverted back to represent the same item as + // the current selection in the setting page. + // Only in single click enabled applications. + if ( iExtension && + iExtension->iFlags.IsSet( + CAknTransparentCameraSettingPageExtension::ESingleClickEnabled ) ) + { + ListBoxControl()->View()->SetCurrentItemIndex( + iCurrentSelectionIndex ); + } + break; + } + + default: + break; + } + } + + +EXPORT_C void CAknTransparentCameraSettingPage::UpdateSettingL() + { + } + +EXPORT_C CAknSetStyleListBox* CAknTransparentCameraSettingPage::ListBoxControl() const + { + return STATIC_CAST( CAknSetStyleListBox*, EditorControl()); + } + +EXPORT_C void CAknTransparentCameraSettingPage::DynamicInitL() + { + } + +void CAknTransparentCameraSettingPage::SetRadioButtonSelectionL( TInt aPushed ) + { + // reference listbox's view; not owned here + CListBoxView* view = ListBoxControl()->View(); + view->SelectItemL( aPushed ); + if ( aPushed != iOldSelectionIndex ) + { + view->DeselectItem( iOldSelectionIndex ); + iOldSelectionIndex = aPushed; + } + } + +EXPORT_C void CAknTransparentCameraSettingPage::SelectCurrentItemL() + { + iCurrentSelectionIndex = ListBoxControl()->CurrentItemIndex(); + SetRadioButtonSelectionL( iCurrentSelectionIndex ); + UpdateSettingL(); + if( iSettingPageObserver ) + iSettingPageObserver->HandleSettingPageEventL(this, MAknSettingPageObserver::EEventSettingChanged); + } + + +EXPORT_C void CAknTransparentCameraSettingPage::SetItemArrayAndSelectionL( const MDesCArray* aItemArray, TInt aPushed ) + { + SetRadioButtonSelectionL(0); // Put the selection into a known state + iItemArray = aItemArray; + GenerateInternalArrayAndGiveToListBoxL(); + + // This updates the CBA + CheckAndSetDataValidity(); + UpdateCbaL(); + SizeChanged(); + SetRadioButtonSelectionL(aPushed); + + DrawDeferred(); + } + +void CAknTransparentCameraSettingPage::GenerateInternalArrayAndGiveToListBoxL() + { + + delete iInternalItemArray; + iInternalItemArray = 0; + + // Make a new owned text array from the input one with the "Pushed in" icon index: + iInternalItemArray = new(ELeave)CDesCArrayFlat(1); + TInt nItems = iItemArray->MdcaCount(); + + for (TInt ii=0; iiMdcaPoint(ii)).Length() + KOneSlashT().Length(); + HBufC* newText = HBufC::NewMaxLC( newLen ); + TPtr newTPtr = newText->Des(); + newTPtr.Copy( KOneSlashT ); + newTPtr.Append( iItemArray->MdcaPoint(ii) ); + // A copy of the new buffer goes to the internal itemarray: + iInternalItemArray->AppendL(newTPtr); + CleanupStack::PopAndDestroy(); // newText + } + + // Only a reference to the CBase object; not owned + CAknSetStyleListBox* listBox = ListBoxControl(); + + // Set the text data + CTextListBoxModel* model=listBox->Model(); + model->SetItemTextArray(iInternalItemArray); + model->SetOwnershipType(ELbmDoesNotOwnItemArray); + + } + +/** + * Writes the internal state of the control and its components to aStream. + * Does nothing in release mode. + * Designed to be overidden and base called by subclasses. + */ +#ifndef _DEBUG +EXPORT_C void CAknTransparentCameraSettingPage::WriteInternalStateL(RWriteStream& /*aWriteStream*/) const + {} +#else +EXPORT_C void CAknTransparentCameraSettingPage::WriteInternalStateL(RWriteStream& aWriteStream) const + { + CAknSettingPage::WriteInternalStateL(aWriteStream); + } +#endif + +/** +* Handles the size change events. +*/ +EXPORT_C void CAknTransparentCameraSettingPage::SizeChanged() + { + CAknListBoxSettingPage::SizeChanged(); + } + +/** +* Draws the setting page on top of the camera feed. +*/ +EXPORT_C void CAknTransparentCameraSettingPage::Draw(const TRect &/*aRect*/) const + { + + // The draw is called only when setting page is drawn the first time + // After first time, the drawing is only made on relevant parts in + // ChangeBackground-method + + TRect parentRect = Rect(); // this will be used a lot in this routine + + CWindowGc& gc = SystemGc(); + + MAknsControlContext* ccBg = AknsDrawUtils::ControlContext(this); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + // Draw black background if full screen in use + if (iExtension->iFullScreenMode) + { + gc.SetBrushStyle(CGraphicsContext::ESolidBrush); + gc.SetPenStyle(CGraphicsContext::ENullPen); + gc.SetBrushColor(KRgbBlack); + gc.DrawRect(parentRect); // in fullscreen control size is EScreen + } + else // draw skinbackground + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + TRect bgRect(TPoint(0, 0), mainPaneRect.Size()); + + if (iExtension->iDrawBackgroundBitmap && ccBg != NULL && skin != NULL) + { + AknsDrawUtils::DrawBackground (skin, + ccBg, + NULL, + gc, + parentRect.iTl, + parentRect, + KAknsDrawParamDefault); + } + else + { + gc.SetBrushStyle(CGraphicsContext::ESolidBrush); + gc.SetPenStyle(CGraphicsContext::ENullPen); + gc.SetBrushColor(KRgbWhite); + gc.DrawRect (bgRect); + } + } + + // draw viewfinder if available + if(iExtension->iBackground) + { + gc.SetClippingRect(iExtension->iBitmapClipRect); + + gc.BitBlt(iExtension->iBitmapPosition, iExtension->iBackground); + gc.CancelClippingRect(); + } + } + +void CAknTransparentCameraSettingPage::CreateBitmapArrayAndGiveToListBoxL() + { + // This method is more or less a verbatim copy of + // CAknPopupField::InitialiseRadioButtonBitmapsL + + CAknSetStyleListBox* listBox = ListBoxControl(); + + // In case CAknPopupSettingList has already created the icons + if ( listBox->ItemDrawer()->FormattedCellData()->IconArray() ) + { + listBox->ItemDrawer()->FormattedCellData()->IconArray()->ResetAndDestroy(); + delete (listBox->ItemDrawer()->FormattedCellData()->IconArray()); + } + + TResourceReader reader; + + iCoeEnv->CreateResourceReaderLC(reader, R_AVKON_SETTING_PAGE_RADIOBUTTON_ICONS); + + reader.ReadInt16(); //not needed, simple or complex + + HBufC* bmpFile = reader.ReadHBufCL(); + TInt count = reader.ReadInt16(); // count + + if(count<2) + User::Leave(KErrCorrupt); + + TInt32 bmpSelected = reader.ReadInt32(); + TInt32 bmpSelectedM = reader.ReadInt32(); + TInt32 bmp = reader.ReadInt32(); + TInt32 bmpM = reader.ReadInt32(); + CleanupStack::PopAndDestroy(); // reader + + if (bmpFile == NULL) + User::Leave(KErrCorrupt); + + CleanupStack::PushL(bmpFile); + + CArrayPtr* icons = new(ELeave) CAknIconArray(4); + // put on the cleanup stack until ownership is transferred + CleanupStack::PushL( icons ); + + // create normally colored icons + CreateIconAndAddToArrayL( icons, + KAknsIIDQgnIndiRadiobuttOn, + EAknsCIQsnIconColorsCG14, + *bmpFile, + bmpSelected, + bmpSelectedM ); + + CreateIconAndAddToArrayL( icons, + KAknsIIDQgnIndiRadiobuttOff, + EAknsCIQsnIconColorsCG14, + *bmpFile, + bmp, + bmpM ); + + // create highlight colored icons + CreateIconAndAddToArrayL( icons, + KAknsIIDQgnIndiRadiobuttOn, + EAknsCIQsnIconColorsCG18, + *bmpFile, + bmpSelected, + bmpSelectedM ); + + CreateIconAndAddToArrayL( icons, + KAknsIIDQgnIndiRadiobuttOff, + EAknsCIQsnIconColorsCG18, + *bmpFile, + bmp, + bmpM ); + + + __ASSERT_DEBUG(listBox != NULL, Panic(EAknPanicRadioButtonSettingPageListDoesntExist)); + listBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( icons ); // ownership transferred + listBox->ItemDrawer()->FormattedCellData()->UseHighlightIconSwapping( ETrue ); + CleanupStack::Pop(); // icons - ownership now transferred; do not destroy + CleanupStack::PopAndDestroy(); // bmpfile + } +/** + * Reserved method derived from CCoeControl + */ +EXPORT_C void CAknTransparentCameraSettingPage::Reserved_2() + { + } + +/** +* Setting Page reserved methods +*/ +EXPORT_C void CAknTransparentCameraSettingPage::CAknSettingPage_Reserved_1() + { + } +EXPORT_C void CAknTransparentCameraSettingPage::CAknSettingPage_Reserved_2() + { + } +/** +* CAknListBoxSettingPage-derived reserved methods +*/ +EXPORT_C void CAknTransparentCameraSettingPage::CAknListBoxSettingPage_Reserved_1() + { + } + +EXPORT_C void CAknTransparentCameraSettingPage::ChangeBackground(CFbsBitmap* aBitmap) + { + iExtension->iBackground = aBitmap; + + if (iExtension->iBackground) + { + DrawNow(); + } + } + +EXPORT_C void CAknTransparentCameraSettingPage::SetBitmapPositionAndClipRect( + const TPoint aPoint, const TRect aRect) + { + SetBitmapPositionAndClipRect(aPoint, aRect, EFalse); + } + +EXPORT_C void CAknTransparentCameraSettingPage::SetBitmapPositionAndClipRect( + const TPoint aPoint, const TRect aRect, const TBool aFullScreenUsed) + { + iExtension->iBitmapPosition = aPoint; + iExtension->iBitmapClipRect = aRect; + iExtension->iFullScreenMode = aFullScreenUsed; + + + // cannot redraw here because the skin context is not updated + if(aFullScreenUsed) + { + TRect newRect; + iExtension->iDrawBackgroundBitmap = EFalse; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, newRect); + SetRect(newRect); + } + else + { + iExtension->iDrawBackgroundBitmap = ETrue; + } + } + +EXPORT_C void CAknTransparentCameraSettingPage::HandleResourceChange(TInt aType) + { + if( aType == KAknsMessageSkinChange ) + { + TRAP_IGNORE( CreateBitmapArrayAndGiveToListBoxL() ); + } + + CAknListBoxSettingPage::HandleResourceChange(aType); + } + +EXPORT_C TKeyResponse CAknTransparentCameraSettingPage::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType) + { + + // Only handle other key events if we're focused + TKeyResponse response = CAknSettingPage::OfferKeyEventL(aKeyEvent, aType); + + if (IsFocused()) + { + if (EditorControl()) + { + // Abstraction of key events: Escape is handled like Cancel + // OK is handled like select. + if ( aType == EEventKey && response == EKeyWasConsumed) + if ( aKeyEvent.iScanCode == EStdKeyUpArrow || + aKeyEvent.iScanCode == EStdKeyDownArrow ) + ChangeBackground(iExtension->iBackground); + } + } + + return response; // Keys can fall through to menus + + } + +// End of File