diff -r fc42a86c98e3 -r 694fa80c203c textinput/peninputhwrtrui/src/truiappradiobutton.cpp --- a/textinput/peninputhwrtrui/src/truiappradiobutton.cpp Wed Jun 23 04:57:58 2010 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,545 +0,0 @@ -/* -* Copyright (c) 2007 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: Implement of class CTruiRadioButton -* -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef RD_TACTILE_FEEDBACK -#include -#endif //RD_TACTILE_FEEDBACK - -#include "truiappradiobutton.h" -#include "truiradiobuttonobserver.h" -#include "truicontainerbase.h" - -// The amount of icons of bitmap files for ratio button -const TInt KRadioButtonIconCounts = 2; - -const TInt KSpaceBetweenItems = 10; - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// Two-phased constructor. -// --------------------------------------------------------------------------- -// -CTruiRadioButton* CTruiRadioButton::NewL( CCoeControl* aParent, - TSelectionType aSelectionType, - MTruiRadioButtonObserver* aObserver ) - { - CTruiRadioButton* self = CTruiRadioButton::NewLC( aParent, aSelectionType, - aObserver ); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// Two-phased constructor. -// --------------------------------------------------------------------------- -// -CTruiRadioButton* CTruiRadioButton::NewLC( CCoeControl* aParent, - TSelectionType aSelectionType, - MTruiRadioButtonObserver* aObserver ) - { - CTruiRadioButton* self = new ( ELeave ) CTruiRadioButton( aObserver, - aSelectionType ); - CleanupStack::PushL( self ); - self->ConstructL( aParent ); - return self; - } - -// ----------------------------------------------------------------------------- -// CTruiHwrBox::CTruiHwrBox() -// C++ default constructor can NOT contain any code, that might leave. -// ----------------------------------------------------------------------------- -// -CTruiRadioButton::CTruiRadioButton( MTruiRadioButtonObserver* aObserver, - TSelectionType aSelectionType ) - :iObserver( aObserver ), iSelectionType( aSelectionType ) - { - // No implementation required - } - - -// ----------------------------------------------------------------------------- -// CTruiRadioButton::ConstructL() -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::ConstructL( CCoeControl* aParent ) - { - SetContainerWindowL( *aParent ); - CreateBitmapForRadioButtonL(); - #ifdef RD_TACTILE_FEEDBACK - iTactileSupported = FeatureManager::FeatureSupported( KFeatureIdTactileFeedback ); - #endif // RD_TACTILE_FEEDBACK - } - -// ----------------------------------------------------------------------------- -// Convert texts into Label and update them in radio buttons. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::HandleItemAdditionL() - { - // Re-init control array - delete iControlArray; - iControlArray = NULL; - if ( iTextArray.Count() > 0 ) - { - iControlArray = new (ELeave) CArrayPtrFlat - ( iTextArray.Count() ); - } - // text layout - // Add items for radio button - for ( TInt i = 0; i < iTextArray.Count(); i++ ) - { - // Create label - CEikLabel* label = new (ELeave) CEikLabel(); - CleanupStack::PushL( label ); - label->SetContainerWindowL( *this ); - label->SetObserver( this ); - label->SetTextL( *iTextArray[i] ); - - // Add label to control array - iControlArray->AppendL( label ); - CleanupStack::Pop( label ); - } - } - -// ----------------------------------------------------------------------------- -// Add one item to radio button. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::AddItem( const HBufC* aText, TRadioButtonStatus aStatus ) - { - iTextArray.Append( aText ); - iStatusArray.Append( aStatus ); - } - -// ----------------------------------------------------------------------------- -// CTruiRadioButton::~CTruiRadioButton() -// Destructor. -// ----------------------------------------------------------------------------- -// -CTruiRadioButton::~CTruiRadioButton() - { - iStatusArray.Close(); - iTextArray.ResetAndDestroy(); - if ( iControlArray ) - { - iControlArray->ResetAndDestroy(); - delete iControlArray; - } - delete iRadioButtonSelectedBmp; - delete iRadioButtonSelectedBmpm; - delete iRadioButtonNonSelectedBmp; - delete iRadioButtonNonSelectedBmpm; - iIconLayout.Close(); - } - -// --------------------------------------------------------------------------- -// Handles an event from an observed control. -// --------------------------------------------------------------------------- -// -void CTruiRadioButton::HandleControlEventL( CCoeControl* aControl,TCoeEvent aEventType ) - { - TInt index; - for ( index = 0; index < iControlArray->Count(); index++ ) - { - if ( aControl == iControlArray->At( index ) ) - { - break; - } - } - if ( iSelectionType == ERadioButton ) - { - HandlePointerRadioButtonL( index, aEventType ); - } - else - { - HandlePointerCheckBox( index, aEventType ); - } - DrawNow(); - } - -// --------------------------------------------------------------------------- -// Handle pointer on radio button. -// --------------------------------------------------------------------------- -// -void CTruiRadioButton::HandlePointerRadioButtonL( TInt aIndex, TCoeEvent aEventType ) - { - if ( aIndex < iStatusArray.Count() && aEventType == EEventRequestFocus ) - { - for ( TInt i = 0; i < iStatusArray.Count(); i++ ) - { - if ( i == aIndex ) - { - if ( iStatusArray[aIndex] == ENonSelected ) - { - iStatusArray[aIndex] = ESelected; - if ( iObserver ) - { - iObserver->SelectChangedL( aIndex ); - } - } - } - else - { - iStatusArray[i] = ENonSelected; - } - } - } - } - -// --------------------------------------------------------------------------- -// Handle pointer on checkbox. -// --------------------------------------------------------------------------- -// -void CTruiRadioButton::HandlePointerCheckBox( TInt aIndex, TCoeEvent aEventType ) - { - if ( aIndex < iControlArray->Count() && aEventType == EEventRequestFocus ) - { - iStatusArray[aIndex] = ( iStatusArray[aIndex] == ENonSelected ) - ? ESelected : ENonSelected; - } - } - -// --------------------------------------------------------------------------- -// Handles an event from an observed control. -// --------------------------------------------------------------------------- -// -void CTruiRadioButton::SizeChanged() - { - LoadIconsLayout( 0 ); - for ( TInt i = 0; i < iIconLayout.Count(); i++ ) - { - TSize iconSize = iIconLayout[i].Rect().Size(); - AknIconUtils::SetSize( iRadioButtonSelectedBmp, iconSize ); - AknIconUtils::SetSize( iRadioButtonSelectedBmpm, iconSize ); - AknIconUtils::SetSize( iRadioButtonNonSelectedBmpm, iconSize ); - AknIconUtils::SetSize( iRadioButtonNonSelectedBmpm, iconSize ); - } - // list_single_hwr_training_symbol_option_pane_t1 - if ( iControlArray && iTextArray.Count() > 0 ) - { - for ( TInt i = 0; i < iTextArray.Count(); i++ ) - { - TAknTextComponentLayout option_pane_t1_layout = - AknLayoutScalable_Apps:: - list_single_hwr_training_symbol_option_pane_t1( 0 ); - CEikLabel* label = static_cast( iControlArray->At( i ) ); - AknLayoutUtils::LayoutLabel( label, - Rect(), - iMultilineLayout ); - // Set color for label - TRgb labelColor = KRgbBlack; - TInt error = GetCachedLabelTextColor( labelColor ); - if ( error == KErrNone ) - { - TRAP_IGNORE( label->OverrideColorL( EColorLabelText, labelColor ) ); - } - TRAP_IGNORE( ClipToFitLabelL( label, i ) ); - // Set font for label - if ( TBidiText::ScriptDirectionality( User::Language() ) - == TBidiText::ERightToLeft ) - { // arabic,hebrew, set text RTL - label->SetLabelAlignment( ELayoutAlignBidi ); - } - } - } - } - -// ----------------------------------------------------------------------------- -// Draws control to given area -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::Draw( const TRect& /*aRect*/ ) const - { - CWindowGc& gc = SystemGc(); - // Gets the control's extent - TRect rect( Rect() ); - // Clears the screen - Window().SetBackgroundColor( TRgb( ~0 ) ); - - TSize pixSize = iRadioButtonSelectedBmp->SizeInPixels(); - for ( TInt i = 0; i < iStatusArray.Count(); i++ ) - { - TPoint tl( rect.iTl.iX, rect.iTl.iY + pixSize.iWidth * i - + KSpaceBetweenItems * i ); - if ( iStatusArray[i] == ESelected ) - { - iIconLayout[0].DrawImage( gc, iRadioButtonSelectedBmp, iRadioButtonSelectedBmpm ); - } - else if ( iStatusArray[i] == ENonSelected ) - { - iIconLayout[0].DrawImage( gc, iRadioButtonNonSelectedBmp, - iRadioButtonNonSelectedBmpm ); - } - } - } - -// ----------------------------------------------------------------------------- -// Gets the number of controls contained in a compound control. -// ----------------------------------------------------------------------------- -// -TInt CTruiRadioButton::CountComponentControls() const - { - if ( iControlArray ) - { - return iControlArray->Count(); - } - return 0; - } - -// ----------------------------------------------------------------------------- -// Gets an indexed component of a compound control. -// ----------------------------------------------------------------------------- -// -CCoeControl* CTruiRadioButton::ComponentControl( TInt aIndex ) const - { - if ( iControlArray && aIndex < iControlArray->Count() ) - { - return iControlArray->At( aIndex ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// From class CCoeControl. -// Handles a change to the control's resources. -// --------------------------------------------------------------------------- -// -void CTruiRadioButton::HandleResourceChange( TInt aType ) - { - CCoeControl::HandleResourceChange( aType ); - if ( aType == KAknsMessageSkinChange && iControlArray ) - { - TRgb labelColor = KRgbBlack; - TInt error = GetCachedLabelTextColor( labelColor ); - if ( error == KErrNone ) - { - for ( TInt i = 0; i < iControlArray->Count(); i++ ) - { - CCoeControl* label = iControlArray->At( i ); - TRAP_IGNORE( label->OverrideColorL( EColorLabelText, labelColor ) ); - } - } - TRAP_IGNORE( CreateBitmapForRadioButtonL() ); - SizeChanged(); - } - } - -// ----------------------------------------------------------------------------- -// Gets an indexed component of a compound control. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::HandlePointerEventL( const TPointerEvent& aPointerEvent ) - { - if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) - { - // Click the area of icon - TSize pixSize = iRadioButtonSelectedBmp->SizeInPixels(); - TRect rect( Rect() ); - for ( TInt i = 0; i < iControlArray->Count(); i++ ) - { - if ( iIconLayout[i].Rect().Contains( aPointerEvent.iPosition ) ) - { - // Handle the event to point on Icon - HandleControlEventL( iControlArray->At( i ), - EEventRequestFocus ); - } - } - #ifdef RD_TACTILE_FEEDBACK - if ( iTactileSupported ) - { - MTouchFeedback::Instance()->InstantFeedback( ETouchFeedbackBasic ); - } - #endif // RD_TACTILE_FEEDBACK - } - CCoeControl::HandlePointerEventL( aPointerEvent ); - } - -// ----------------------------------------------------------------------------- -// Return the control's minisize. -// ----------------------------------------------------------------------------- -// -TSize CTruiRadioButton::MinimumSize() - { - TInt miniWidth = 0; - TInt miniHeight = 0; - for ( TInt i = 0; i < iControlArray->Count(); i++ ) - { - TSize itemMiniSize = iControlArray->At( i )->Size(); - miniHeight += itemMiniSize.iHeight + KSpaceBetweenItems * i; - miniWidth = itemMiniSize.iWidth - + iRadioButtonSelectedBmp->SizeInPixels().iWidth; - } - return TSize( miniWidth, miniHeight ); - } - -// ----------------------------------------------------------------------------- -// Create radio button's bitmap. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::CreateBitmapForRadioButtonL() - { - delete iRadioButtonSelectedBmp; - delete iRadioButtonSelectedBmpm; - delete iRadioButtonNonSelectedBmp; - delete iRadioButtonNonSelectedBmpm; - // Read resource file - TResourceReader reader; - TInt btnResource; - if ( iSelectionType == ERadioButton ) - { - btnResource = R_AVKON_SETTING_PAGE_RADIOBUTTON_ICONS; - } - else - { - btnResource= R_AVKON_SETTING_PAGE_CHECKBOX_ICONS; - } - iEikonEnv->CreateResourceReaderLC( reader, btnResource ); - reader.ReadInt16(); //not needed, simple or complex - HBufC* bmpFile = reader.ReadHBufCL(); - CleanupStack::PushL( bmpFile ); - TInt count = reader.ReadInt16(); // count - if( count < KRadioButtonIconCounts ) - { - User::Leave(KErrCorrupt); - } - TInt32 bmpSelected = reader.ReadInt32(); - TInt32 bmpSelectedM = reader.ReadInt32(); - TInt32 bmpNonSelected = reader.ReadInt32(); - TInt32 bmpNonSelectedM = reader.ReadInt32(); - CleanupStack::Pop( bmpFile ); - CleanupStack::PopAndDestroy(); // reader - - CleanupStack::PushL( bmpFile ); - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - AknsUtils::CreateColorIconL( skin, - KAknsIIDQgnIndiRadiobuttOn, - KAknsIIDQsnIconColors, - EAknsCIQsnIconColorsCG14, - iRadioButtonSelectedBmp, - iRadioButtonSelectedBmpm, - *bmpFile, - bmpSelected, - bmpSelectedM, - KRgbBlack - ); - - AknsUtils::CreateColorIconL( skin, - KAknsIIDQgnIndiRadiobuttOff, - KAknsIIDQsnIconColors, - EAknsCIQsnIconColorsCG14, - iRadioButtonNonSelectedBmp, - iRadioButtonNonSelectedBmpm, - *bmpFile, - bmpNonSelected, - bmpNonSelectedM, - KRgbBlack - ); - CleanupStack::PopAndDestroy( bmpFile ); - } - -// --------------------------------------------------------------------------- -// Get cached color of skin for label control -// --------------------------------------------------------------------------- -// -TInt CTruiRadioButton::GetCachedLabelTextColor( TRgb& aColor ) - { - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - // Set pen color to the color of test in main area - return AknsUtils::GetCachedColor( skin, - aColor, - KAknsIIDQsnTextColors, - EAknsCIQsnTextColorsCG6 ); - } - -// --------------------------------------------------------------------------- -// Load layouts for icons from LAF. -// --------------------------------------------------------------------------- -// -void CTruiRadioButton::LoadIconsLayout( TInt aVarity ) - { - TRect rect = Rect(); - iIconLayout.Reset(); - // Caculate list_single_hwr_training_symbol_option_pane_g1 for line1 - TAknWindowComponentLayout icon_checked_layout = - AknLayoutScalable_Apps::list_single_hwr_training_symbol_option_pane_g1 - ( aVarity ); - TAknLayoutRect icon_checked_layout_rect; - icon_checked_layout_rect.LayoutRect( rect, icon_checked_layout ); - iIconLayout.Append( icon_checked_layout_rect ); - } -// ----------------------------------------------------------------------------- -// Convert logical name to visual name for label when needed. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::ConvertToVisualForEdwinL( CEikLabel* aLabel, - const TDesC& aLogicalTxt, - const CFont& aFont, - TInt aLineWidth ) - { - HBufC* visualText = HBufC::NewLC( aLogicalTxt.Length() - + TBidiLogicalToVisual::KMinCharAvailable - + KExtraSize ); - TPtr visualTextPtr = visualText->Des(); - AknBidiTextUtils::ConvertToVisualAndClip( aLogicalTxt, visualTextPtr, - aFont, aLineWidth, aLineWidth ); - aLabel->SetTextL( *visualText ); - aLabel->SetLabelAlignment( ELayoutAlignBidi ); - CleanupStack::PopAndDestroy( visualText ); - } - -// ----------------------------------------------------------------------------- -// Clip text of editor to fit editor width. -// ----------------------------------------------------------------------------- -// -void CTruiRadioButton::ClipToFitLabelL( CEikLabel* aLabel, TInt aIndex ) - { - if ( aLabel && aLabel->Size().iWidth > 0 ) - { - // Get font fo editor from LAF - const CFont* edwinFont = AknLayoutUtils::FontFromId - ( iMultilineLayout.FontId() ); - // Prepare text to set into editor - HBufC* textInArray = iTextArray[aIndex]; - // Create a new HBufC to store text for editor - HBufC* edwinText = HBufC::NewLC( textInArray->Length() - + KExtraSize ); - TPtr edwinTextPtr = edwinText->Des(); - edwinTextPtr.Copy( *textInArray ); - // Clip text for editor - AknTextUtils::ClipToFit( edwinTextPtr, *edwinFont, - aLabel->Size().iWidth ); - aLabel->SetTextL( *edwinText ); - CleanupStack::PopAndDestroy( edwinText ); - } - } -