diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknRadioButtonSettingPage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknRadioButtonSettingPage.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,501 @@ +/* +* 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 Radio button style popup setting pages +* +* +*/ + + +#include "aknradiobuttonsettingpage.h" + +// For icon support +#include +#include + +// lists +#include + +// For icon array support +#include + +#include +// Used for setting 1 in the radio button +_LIT(KOneSlashT, "1\t"); + +enum TAknRadioButtonSettingPagePanicCodes + { + EAknPanicRadioButtonSettingPageIndexOutOfRange + }; + +GLDEF_C void Panic(TAknRadioButtonSettingPagePanicCodes aPanic) + { + _LIT(KPanicCat,"AknRadioButtonSettingPage"); + User::Panic(KPanicCat, aPanic); + } + + +// ---------------------------------------------------------------------------- +// Extension class definition +// ---------------------------------------------------------------------------- +// +NONSHARABLE_CLASS( CAknRadioButtonSettingPageExtension ) : public CBase + { +public: // Data + CAknRadioButtonSettingPageExtension( CCoeControl& aOwner ); + ~CAknRadioButtonSettingPageExtension(); + + // This CBase object is owned. Note that this depends upon the ownership flag given + // to the CTextListBoxModel object + CDesCArrayFlat* iInternalItemArray; + + TInt iOldFocusedItemIndex; // Index of item that was focused before pointer down event + TBool iIsDragged; + + /** + * Extension flags definition. + */ + enum TFlags + { + ESingleClickEnabled + }; + + /** + * Extension flags. + */ + TBitFlags iFlags; + }; +// end of CAknRadioButtonSettingPageExtension class definition + + +CAknRadioButtonSettingPageExtension::CAknRadioButtonSettingPageExtension( + CCoeControl& aOwner ) : + iOldFocusedItemIndex(-1), iIsDragged( EFalse ) + { + if ( static_cast( + aOwner.ControlEnv()->AppUi() )->IsSingleClickCompatible() ) + { + iFlags.Set( ESingleClickEnabled ); + } + } + +CAknRadioButtonSettingPageExtension::~CAknRadioButtonSettingPageExtension() + { + } + + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + + +EXPORT_C CAknRadioButtonSettingPage::CAknRadioButtonSettingPage( TInt aResourceId, TInt& aCurrentSelectionItem, const MDesCArray* aItemArray): + CAknListBoxSettingPage(aResourceId), iOldSelectionIndex(aCurrentSelectionItem), iCurrentSelectionIndex(aCurrentSelectionItem), iItemArray(aItemArray) + { + AKNTASHOOK_ADD( this, "CAknRadioButtonSettingPage" ); + } + + +EXPORT_C CAknRadioButtonSettingPage::CAknRadioButtonSettingPage( + 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, "CAknRadioButtonSettingPage" ); + } + + +/** + * Destructor + * + */ +EXPORT_C CAknRadioButtonSettingPage::~CAknRadioButtonSettingPage() + { + AKNTASHOOK_REMOVE(); + if ( iExtension ) + { + delete iExtension->iInternalItemArray; + delete iExtension; + } + } + +EXPORT_C void CAknRadioButtonSettingPage::ConstructL() + { + BaseConstructL(); + + // Construct an appropriate control context for the contained editor areas. + // Context produced is owned by CAknSettingPage. + SetEditedItemFrameIID( KAknsIIDQsnFrSetOpt, KAknsIIDQsnFrSetOptCenter ); + + GenerateInternalArrayAndGiveToListBoxL(); + + // This updates the CBA + CheckAndSetDataValidity(); + UpdateCbaL(); + + // Only a reference to the CBase object; not owned + CAknSetStyleListBox* listBox = ListBoxControl(); + + InitialiseRadioButtonBitmapsL(); + + if (!iExtension) + { + iExtension = new (ELeave) CAknRadioButtonSettingPageExtension( *this ); + } + + // Range should be within the valid indices, or -1: + // So valid range is >= -1 and also < Count. + __ASSERT_ALWAYS( iCurrentSelectionIndex >= -1, Panic( EAknPanicRadioButtonSettingPageIndexOutOfRange) ); + __ASSERT_ALWAYS( iCurrentSelectionIndex < iExtension->iInternalItemArray->Count(), Panic( EAknPanicRadioButtonSettingPageIndexOutOfRange) ); + + listBox->View()->CalcBottomItemIndex(); + // Set initial highlight to the top element + if (FocusToFirstItem()) + {// Set initial highlight to the top element + if ( iExtension->iInternalItemArray->Count() > 0 ) + listBox->SetCurrentItemIndex( 0 ); + } + if (FocusToSelectedItem()) + {// Set initial highlight to the current element. + if ( iExtension->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 ) + { + TBool redrawDisabled = listBox->View()->RedrawDisabled(); + listBox->View()->SetDisableRedraw(ETrue); + listBox->View()->SelectItemL( iCurrentSelectionIndex ); + listBox->View()->SetDisableRedraw(redrawDisabled); + } + + // Set the scroller indication to appear when needed + listBox->CreateScrollBarFrameL(ETrue, ETrue); + listBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto); + + listBox->ItemDrawer()->FormattedCellData()->SetDrawScrollbarBackground( EFalse ); + // Need to do this to set up the scroll bar model + listBox->ScrollBarFrame()->VerticalScrollBar()->SetMopParent(this); + listBox->UpdateScrollBarsL(); + + if(!IsBackgroundDrawingEnabled()) + listBox->ScrollBarFrame()->DrawBackground(EFalse, EFalse); + + // Force a size changed + SizeChanged(); +} + + +EXPORT_C void CAknRadioButtonSettingPage::HandleListBoxEventL(CEikListBox* /*aListBox*/, + MEikListBoxObserver::TListBoxEvent aEventType) + { + if (!iExtension) + { + iExtension = new (ELeave) CAknRadioButtonSettingPageExtension( *this ); + } + + switch ( aEventType ) + { + case MEikListBoxObserver::EEventItemSingleClicked: + case MEikListBoxObserver::EEventItemDoubleClicked: + { + 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( + CAknRadioButtonSettingPageExtension::ESingleClickEnabled ) ) + { + ListBoxControl()->View()->SetCurrentItemIndex( + iCurrentSelectionIndex ); + } + break; + } + + default: + break; + } + } + +EXPORT_C void CAknRadioButtonSettingPage::UpdateSettingL() + { + } + +EXPORT_C CAknSetStyleListBox* CAknRadioButtonSettingPage::ListBoxControl() const + { + return STATIC_CAST( CAknSetStyleListBox*, EditorControl()); + } + +EXPORT_C void CAknRadioButtonSettingPage::DynamicInitL() + { + } + +void CAknRadioButtonSettingPage::SetRadioButtonSelectionL( TInt aPushed ) + { + if ( aPushed != iOldSelectionIndex ) + { + CListBoxView* view = ListBoxControl()->View(); + view->DeselectItem( iOldSelectionIndex ); + iOldSelectionIndex = aPushed; + view->SelectItemL( aPushed ); + } + } + +EXPORT_C void CAknRadioButtonSettingPage::SelectCurrentItemL() + { + iCurrentSelectionIndex = ListBoxControl()->CurrentItemIndex(); + SetRadioButtonSelectionL( iCurrentSelectionIndex ); + UpdateSettingL(); + if( iSettingPageObserver ) + iSettingPageObserver->HandleSettingPageEventL(this, MAknSettingPageObserver::EEventSettingChanged); + } + + +EXPORT_C void CAknRadioButtonSettingPage::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 CAknRadioButtonSettingPage::GenerateInternalArrayAndGiveToListBoxL() + { + if (!iExtension) + { + iExtension = new (ELeave) CAknRadioButtonSettingPageExtension( *this ); + } + + delete iExtension->iInternalItemArray; + iExtension->iInternalItemArray = 0; + + // Make a new owned text array from the input one with the "Pushed in" icon index: + iExtension->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: + iExtension->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(iExtension->iInternalItemArray); + model->SetOwnershipType(ELbmDoesNotOwnItemArray); + + } + + +void CAknRadioButtonSettingPage::InitialiseRadioButtonBitmapsL() + { + // 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 + } + +/** + * 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 CAknRadioButtonSettingPage::WriteInternalStateL(RWriteStream& /*aWriteStream*/) const + {} +#else +EXPORT_C void CAknRadioButtonSettingPage::WriteInternalStateL(RWriteStream& aWriteStream) const + { + CAknSettingPage::WriteInternalStateL(aWriteStream); + } +#endif + +//--------------------------------------------------------------------------------------- +// CAknRadioButtonSettingPage::HandlePointerEventL() +// Handles pointer events by removing Shift and Control button modifiers from it and +// sends modified pointerevent to CEikListbox. This prevents multiselection +//--------------------------------------------------------------------------------------- +// + +EXPORT_C void CAknRadioButtonSettingPage::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + TPointerEvent& event = const_cast( aPointerEvent ); + event.iModifiers &= ~EModifierShift; + event.iModifiers &= ~EModifierCtrl; + + CAknListBoxSettingPage::HandlePointerEventL( aPointerEvent ); + } + +EXPORT_C void* CAknRadioButtonSettingPage::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + + +/** + * Reserved method derived from CCoeControl + */ +EXPORT_C void CAknRadioButtonSettingPage::Reserved_2() + { + } + +/** +* Setting Page reserved methods +*/ +EXPORT_C void CAknRadioButtonSettingPage::HandleResourceChange(TInt aType) + { + if( aType == KAknsMessageSkinChange ) + { + TRAP_IGNORE( InitialiseRadioButtonBitmapsL() ); + } + + CAknListBoxSettingPage::HandleResourceChange(aType); + } + +EXPORT_C void CAknRadioButtonSettingPage::CAknSettingPage_Reserved_1() + { + } + +EXPORT_C void CAknRadioButtonSettingPage::CAknSettingPage_Reserved_2() + { + } +/** +* CAknListBoxSettingPage-derived reserved methods +*/ +EXPORT_C void CAknRadioButtonSettingPage::CAknListBoxSettingPage_Reserved_1() + { + } + +// End of File