diff -r f1bdd6b078d1 -r 2cb9bae34d17 textinput/peninputcommonctrls/src/peninputrangebar/peninputrangebar.cpp --- a/textinput/peninputcommonctrls/src/peninputrangebar/peninputrangebar.cpp Tue Jul 06 14:38:41 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1349 +0,0 @@ -/* -* 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: Implementation of range bar -* -*/ - - -// system includes -//#include -#include -#include -#include -#include -#include - -// user includes -#include -#include -#include -#include -#include -#include - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::CAknFepCtrlRangeBar -// C++ constructor -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C CAknFepCtrlRangeBar::CAknFepCtrlRangeBar(CFepUiLayout* aUiLayout, TInt aControlId, - TButtonGroupStyle aStyle) -: CControlGroup(aUiLayout, aControlId, EFalse), iFirstTimeConstruct(ETrue) - { - iStyle = aStyle; - //iActionStyle = ERangeBarActionStyleHide; - iActionStyle = ERangeBarUsingIndicatorStyle; - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::~CAknFepCtrlRangeBar -// C++ destructor -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C CAknFepCtrlRangeBar::~CAknFepCtrlRangeBar() - { - iIndicators.ResetAndDestroy(); - iIndicators.Close(); - iCellRects.Close(); - iCellInnerRects.Close(); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::NewL -// Two-phased constructor. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C CAknFepCtrlRangeBar* CAknFepCtrlRangeBar::NewL(CFepUiLayout* aUiLayout, TInt aControlId, - TButtonGroupStyle aStyle) - { - CAknFepCtrlRangeBar* self = new (ELeave) CAknFepCtrlRangeBar (aUiLayout, aControlId, aStyle); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::NewLC -// Two-phased constructor. -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C CAknFepCtrlRangeBar* CAknFepCtrlRangeBar::NewLC(CFepUiLayout* aUiLayout, - TInt aControlId, - TButtonGroupStyle aStyle) - { - CAknFepCtrlRangeBar* self = new (ELeave) CAknFepCtrlRangeBar (aUiLayout, aControlId, aStyle); - CleanupStack::PushL(self); - self->ConstructL(); - return self; - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ConstructL -// Construct the instance -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::ConstructL() - { - // Construct the base control first - CControlGroup::ConstructL(); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::HandlePointerDownEventL -// Implement the pointer down handler -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -CFepUiBaseCtrl* CAknFepCtrlRangeBar::HandlePointerDownEventL(const TPoint& aPoint) - { - CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerDownEventL( aPoint ); - return ctrl; - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SizeChanged -// Implement the SizeChanged handler -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SizeChanged(const TRect aRect) - { - SetCellRect(aRect); - - if( iCellChanged ) - { - SetRect(aRect); - - iActionStyle == ERangeBarUsingIndicatorStyle ? - UpdateIndicatorRectForUsingIndicatorStyle(EFalse) : - UpdateIndicatorRect(EFalse); - } - else - { - iIsReloadImages = ETrue; - SetWholeRect(); - //Draw(); - SetIndicatorRect(); - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ConstructFromResourceL -// Construct the range bar from the resource -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::ConstructFromResourceL(TResourceReader& aReader) - { - //destroy all previous range buttons - - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - CAknFepCtrlCommonButton* button = iIndicators[ ii ]->iIndicator; - if (button) - { - RemoveControl(button); - } - } - - iIndicators.ResetAndDestroy(); - - const TInt countRanges = aReader.ReadInt16(); - - if (countRanges <= 0) - { - User::Leave(KErrArgument); - } - - // Create range indicator buttons - for (TInt ii = 0; ii < countRanges; ++ii) - { - AddRangeL(aReader); - } - - const TInt defaultRangeIndex = aReader.ReadInt16(); - - if (defaultRangeIndex >= 0 && defaultRangeIndex < iIndicators.Count()) - { - SetRange(iIndicators[defaultRangeIndex]->iInputRange); - } - - iFirstTimeConstruct = EFalse; - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetIndicatorRect() -// Re-calculate the position and layout -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -void CAknFepCtrlRangeBar::SetIndicatorRect() - { - TRect rect(iIndicatorRect); - TInt count = iIndicators.Count(); - TInt lastPos = -1; - - for (TInt ii = 0; ii < count; ++ii) - { - if ( ii != 0 && - (iActionStyle != ERangeBarUsingIndicatorStyle || - lastPos != iIndicators[ii]->iPosIdx ) ) - { - if (iStyle == EBtnGroupVertical) - { - rect.Move(0, iIndicatorRect.Height()); - } - else - { - rect.Move(iIndicatorRect.Width(), 0); - } - } - lastPos = iIndicators[ii]->iPosIdx; - - TRect innerRect; - AknPenImageUtils::CalculateGraphicRect( rect, innerRect ); - - if (iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) - { - static_cast(iIndicators[ii]->iIndicator)-> - SizeChanged(rect, innerRect, iIsReloadImages); - } - else - { - static_cast(iIndicators[ii]->iIndicator)-> - SizeChanged(rect, innerRect, iIsReloadImages); - } - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::Draw() -// Re-calculate the position and layout -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::Draw() - { - if(!AbleToDraw()) - return; - - CControlGroup::Draw(); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::RefreshUI -// Refresh the component -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::RefreshUI() - { - // this function not called anymore - SetIndicatorRect(); - - // Flush the gc memory to the LCD device - UpdateArea(iEraseRect, EFalse); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::HandleControlEvent -// responding on button up event -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl, - const TDesC& /*aEventData*/) - { - if (aEventType == EEventButtonUp) - { - // get aCtrl's index - TBool ctrlExist = EFalse; - TInt ctrlIndex = 0; - - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if ((iIndicators[ii]->iIndicator == aCtrl) - && (!(iIndicators[ii]->iIndicator->IsDimmed()))) - { - ctrlExist = ETrue; - ctrlIndex = ii; - break; - } - } - - if (!ctrlExist) - { - return; - } - - TBool needSendEvent = EFalse; - - // aCtrl's index is ctrlIndex - if ( (ActiveControl() != aCtrl) - || (iIndicators[ctrlIndex]->iCtrlType == EButtonTypePopupMode) ) - { - needSendEvent = ETrue; - } - else // press active button again - { - // only meaningful when it is multimode button - if (iIndicators[ctrlIndex]->iCtrlType == EButtonTypeMultiMode) - { - CAknFepCtrlMultiModeButton* button = static_cast(iIndicators[ctrlIndex]->iIndicator); - - // change range: user press mixed range multimode button, and range is changed - if (iIndicators[ctrlIndex]->iRangeType == ERangeTypeMixed) - { - if ((button->NextMode() != KErrNotFound) && - (button->RangeOfGivenMode(button->CurrentMode()) != - button->RangeOfGivenMode(button->NextMode()))) - { - // change range - ReportEventToObserver(iEventIdForRange, - button->RangeOfGivenMode(button->NextMode())); - } - else if (button->RangeOfGivenMode(button->CurrentMode()) == - button->RangeOfGivenMode(button->NextMode())) - { - // mixed range multimode button: change case - ReportEventToObserver(iEventIdForCase, button->NextMode()); - } - } - else - { - // single range multimode button: change case - ReportEventToObserver(iEventIdForCase, button->NextMode()); - } - } - else - { - if ( iIndicators[ctrlIndex]->iInputRange != iInputRange ) - { - needSendEvent = ETrue; - } - } - } - - if ( needSendEvent ) - { - // press another button instead of active button, it will send range event - if ((iIndicators[ctrlIndex]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[ctrlIndex]->iRangeType == ERangeTypeMixed)) - { - CAknFepCtrlMultiModeButton* button = - static_cast(aCtrl); - - if ((button) && - (button->IsGivenRangeSupported( - button->RangeOfGivenMode(button->CurrentMode())))) - { - ReportEventToObserver(iEventIdForRange, - button->RangeOfGivenMode(button->CurrentMode())); - } - } - else - { - // for single range multimode button and normal button - ReportEventToObserver(iEventIdForRange, iIndicators[ctrlIndex]->iInputRange); - } - } - - // make sure the normal button press effect for : - // using indicator style, and EIndicatorActionStyleNormal - if (iActionStyle == ERangeBarUsingIndicatorStyle && - iIndicators[ctrlIndex]->iActionStyle == EIndicatorActionStyleNormal && - iIndicators[ctrlIndex]->iIndicator->IsActive()) - { - iIndicators[ctrlIndex]->iIndicator->SetHighlight(EFalse); - } - - if ( iActionStyle == ERangeBarUsingIndicatorStyle && - iIndicators[ctrlIndex]->iActionStyle != EIndicatorActionStyleHighLight ) - { - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if(iIndicators[ ii ]->iActionStyle == EIndicatorActionStyleHighLight - && ii != ctrlIndex) - { - iIndicators[ ii ]->iIndicator->SetHighlight( - iIndicators[ ii ]->iIndicator->IsActive() ); - } - } - } - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetRange -// set current input range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C TBool CAknFepCtrlRangeBar::SetRange(const TInt aRange) - { - // if set range in a mixed range multimode button, - // should use detailed range, but not mixed range - TBool ret = EFalse; - - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - CAknFepCtrlCommonButton* button = iIndicators[ ii ]->iIndicator; - - if ((button) && (!(button->IsDimmed()))) - { - if ((iIndicators[ii]->iInputRange == aRange) || - ((iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[ii]->iRangeType == ERangeTypeMixed) && - (static_cast(button)->IsGivenRangeSupported(aRange)))) - { - // 1st condition: normal button or single range multimode button - // 2nd condition: mixed range multimode button - if (!(iIndicators[ii]->iInputRange == aRange)) - { - // mixed range multimode button - static_cast(button)->SetRange(aRange); - } - - iInputRange = aRange; - - SetActiveCtrl(button); - - ret = ETrue; - } - else - { - button->SetActive(EFalse); - } - } - } - - if ( iActionStyle == ERangeBarActionStyleHighLight ) - { - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - iIndicators[ ii ]->iIndicator->SetHighlight( iIndicators[ ii ]->iIndicator->IsActive() ); - } - } - else - { - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if(iIndicators[ ii ]->iActionStyle == EIndicatorActionStyleHighLight) - { - iIndicators[ ii ]->iIndicator->SetHighlight( iIndicators[ ii ]->iIndicator->IsActive() ); - } - } - } - return ret; - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetCaseL -// set mode of given range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetCaseL(const TInt aRange, const TInt aModeIndex) - { - // aRange is detailed range, it only meaningful for multimodebutton - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - CAknFepCtrlMultiModeButton* button = static_cast - (iIndicators[ii]->iIndicator); - if ((iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) && - ((iIndicators[ii]->iInputRange == aRange) || - ((iIndicators[ii]->iRangeType == ERangeTypeMixed) && - (button->IsGivenRangeSupported(aRange))))) - { - if (iIndicators[ii]->iRangeType == ERangeTypeMixed) - { - button->SetRange(aRange); - } - - if (button->IsActive()) - { - button->SetCurrentModeL(EBtnBmpActive, aModeIndex); - } - else - { - button->SetCurrentModeL(EBtnBmpNonActive, aModeIndex); - } - - break; - } - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetPermittedRanges -// set permitted ranges -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetPermittedRanges(const TInt aPermitted) - { - // aPermitted only include detailed range, not mixed - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - TBool needDimButton = EFalse; - CAknFepCtrlCommonButton* button= iIndicators[ii]->iIndicator; - - if ((iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[ii]->iRangeType == ERangeTypeMixed)) - { - // mixed multi button - RArray rangeList; - TRAP_IGNORE(static_cast - (button)->GetRangeListL(rangeList)); - - needDimButton = ETrue; - TInt disableIdx = -1; - - for (TInt ii = 0; ii < rangeList.Count(); ii++) - { - if (aPermitted & rangeList[ii]) - { - static_cast(button)->SetPermittedRange( - rangeList[ii], ETrue); - needDimButton = EFalse; - } - else - { - static_cast(button)->SetPermittedRange( - rangeList[ii], EFalse); - disableIdx = ii; - } - } - - // disable mode can only after permitted modes are all setted. - if ( disableIdx >= 0 ) - { - static_cast(button)->DisableOneModes( - rangeList[disableIdx]); - } - - rangeList.Reset(); - rangeList.Close(); - } - else if (!(aPermitted & iIndicators[ii]->iInputRange)) - { - // disable a normal or single range multi button - needDimButton = ETrue; - - if (iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) - { - TRAP_IGNORE(static_cast(button)->SetCurrentModeL( - EBtnBmpNonActive , 0)); - } - } - - if (needDimButton) - { - button->SetDimmed(ETrue); - button->SetActive(EFalse); - } - else - { - button->SetDimmed(EFalse); - } - } - - if ( iActionStyle == ERangeBarUsingIndicatorStyle ) - { - for(TInt n = 0; n < iIndicators.Count(); n++) - { - for( TInt m = n+1; m < iIndicators.Count(); m++ ) - { - if( iIndicators[n]->iPosIdx == iIndicators[m]->iPosIdx ) - { - TBool nDimmed = iIndicators[n]->iIndicator->IsDimmed(); - TBool mDimmed = iIndicators[m]->iIndicator->IsDimmed(); - - if ( nDimmed != mDimmed ) - { - iIndicators[n]->iIndicator->Hide(nDimmed); - iIndicators[m]->iIndicator->Hide(mDimmed); - } - } - } - } - } - //RefreshUI(); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetPermittedRange -// set permitted ranges -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetPermittedRange(const TInt aRangeId, TBool aPermit) - { - // this function has take consideration of mixed range multimodebutton - // aRangeId is detailed range here - TBool needDimButton = EFalse; - TBool findButton = EFalse; - TInt buttonIdx = 0; - - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - CAknFepCtrlCommonButton* button = iIndicators[ii]->iIndicator; - - if ((iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[ii]->iRangeType == ERangeTypeMixed)) - { - // mixed multi button - if (static_cast(button)->IsGivenRangeSupported(aRangeId)) - { - findButton = ETrue; - buttonIdx = ii; - - static_cast(button)->SetPermittedRange(aRangeId, - aPermit); - - RArray rangeList; - - TRAP_IGNORE(static_cast(button)->GetRangeListL( - rangeList)); - - if ( (!aPermit) && (rangeList.Count() == 1) ) - { - needDimButton = ETrue; - } - - rangeList.Reset(); - rangeList.Close(); - - break; - } - } - else - { - // normal or single range multi button - if (iIndicators[ii]->iInputRange == aRangeId) - { - findButton = ETrue; - buttonIdx = ii; - - if (!aPermit) - { - needDimButton = ETrue; - - if (iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) - { - TRAP_IGNORE( - static_cast(button)->SetCurrentModeL( - EBtnBmpNonActive , 0)); - } - } - break; - } - } - } - - if (findButton) - { - CAknFepCtrlCommonButton* button = iIndicators[buttonIdx]->iIndicator; - - if (!needDimButton) - { - button->SetDimmed(EFalse); - } - else - { - button->SetDimmed(ETrue); - button->SetActive(EFalse); - } - } - - //RefreshUI(); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetPermittedCase -// set permitted ranges -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetPermittedCase(const TInt aRangeId, - const TInt aRealCaseId, - TBool aPermit) - { - // aRangeId is detailed range here - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if (((iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[ii]->iInputRange == aRangeId)) || - ((iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[ii]->iRangeType == ERangeTypeMixed) && - (static_cast(iIndicators[ii]->iIndicator)->IsGivenRangeSupported(aRangeId)))) - { - // single range multimode button OR mixed range multimode button - static_cast(iIndicators[ii]->iIndicator)->SetPermittedModes(aRangeId, aRealCaseId, aPermit); - break; - } - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::HideRange -// hide given range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::HideRange(const TInt aRange) - { - // mixed range multimode button is not considerred here - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - if ( ( iIndicators[ ii ] ) && - ( iIndicators[ ii ]->iInputRange == aRange ) && - ( !iIndicators[ ii ]->iIsHide)) - { - iIndicators[ii]->iIndicator->Hide(ETrue); - - iIndicators[ ii ]->iIsHide = ETrue; - - if( iCellChanged ) - { - UpdateIndicatorRect(EFalse); - } - else - { - SetWholeRect(); - iIsReloadImages = EFalse; - //Draw(); - SetIndicatorRect(); - } - - break; - } - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::HideRangeUsingIndicatorStyle -// hide given range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::HideRangeUsingIndicatorStyle(const TInt aRange) - { - // mixed range multimode button is not considerred here - TInt indiIdx = IndicatorIdxByRange(aRange); - - if (indiIdx == KErrNotFound) - return; - - HideRangeForHidingIndicatorStyle(indiIdx, ETrue); - - UpdateIndicatorRectForUsingIndicatorStyle(EFalse); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ShowRange -// show given range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::ShowRange(const TInt aRange) - { - // mixed range multimode button is not considerred here - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - if ( ( iIndicators[ ii ] ) && - ( iIndicators[ ii ]->iInputRange == aRange ) && - ( iIndicators[ ii ]->iIsHide)) - { - iIndicators[ii]->iIndicator->Hide(EFalse); - iIndicators[ ii ]->iIsHide = EFalse; - - if( iCellChanged ) - { - UpdateIndicatorRect(ETrue); - } - else - { - SetWholeRect(); - iIsReloadImages = EFalse; - - //Draw(); - SetIndicatorRect(); - } - - break; - } - } - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ShowRangeUsingIndicatorStyle -// show given range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::ShowRangeUsingIndicatorStyle(const TInt aRange) - { - // mixed range multimode button is not considerred here - TInt indiIdx = IndicatorIdxByRange(aRange); - - if (indiIdx == KErrNotFound) - return; - - HideRangeForHidingIndicatorStyle(indiIdx, EFalse); - - UpdateIndicatorRectForUsingIndicatorStyle(EFalse); - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::AddRangeL -// add range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::AddRangeL(TResourceReader& aReader) - { - const TInt16 rangeId = aReader.ReadInt16(); - const TInt16 rangeType = aReader.ReadInt16(); - const TInt16 ctrlId = aReader.ReadInt16(); - const TInt16 ctrlType = aReader.ReadInt16(); - const TInt32 resId = aReader.ReadInt32(); - const TInt actionStyle = aReader.ReadInt16(); - TBool hide = aReader.ReadInt16(); - TInt posidx = aReader.ReadInt16(); - - CAknFepCtrlCommonButton* button = NULL; - - if (ctrlType != EButtonTypeMultiMode) - { - // normal button - button = CAknFepCtrlCommonButton::NewLC(UiLayout(), ctrlId, - KAknsIIDQsnFrFunctionButtonNormal, - KAknsIIDQsnFrFunctionButtonPressed, - KAknsIIDQsnFrFunctionButtonInactive ); - button->SetResourceId(resId); - button->ConstructFromResourceL(); - } - else - { - // Multiple display type button - button = CAknFepCtrlMultiModeButton::NewLC(UiLayout(), ctrlId, - KAknsIIDQsnFrFunctionButtonNormal, - KAknsIIDQsnFrFunctionButtonPressed, - KAknsIIDQsnFrFunctionButtonInactive); - - button->SetResourceId(resId); - button->ConstructFromResourceL(); - } - - button->AddEventObserver( this ); - - AddControlL( button ); - CleanupStack::Pop(button); // button - - TAknFepRangeIndicator* indicator = new (ELeave) TAknFepRangeIndicator; - CleanupStack::PushL( indicator ); - - indicator->iCtrlType = ctrlType; - indicator->iInputRange = rangeId; - indicator->iRangeType = rangeType; - indicator->iCtrlId = ctrlId; - //indicator->iIsHide = EFalse; - indicator->iIsHide = hide; - if (hide) - button->Hide(ETrue); - indicator->iIndicator = button; - indicator->iActionStyle = actionStyle; - indicator->iPosIdx = posidx; - - User::LeaveIfError( iIndicators.Append(indicator) ); - CleanupStack::Pop(indicator); // indicator - } - -// --------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::GetCase -// get mode of given range -// (other items were commented in a header). -// --------------------------------------------------------------------------- -// -EXPORT_C TInt CAknFepCtrlRangeBar::GetCase(TInt aRange) const - { - // get current real case of aRange - // aRange is detailed range here, for mixed range multimode button, it contained in one range of it - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - if (iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) - { - CAknFepCtrlMultiModeButton* button = static_cast - (iIndicators[ii]->iIndicator); - - if ( ( (iIndicators[ii]->iRangeType == ERangeTypeMixed) && - (button->IsGivenRangeSupported(aRange)) && - ((button->RangeOfGivenMode(button->CurrentMode()) == aRange)) ) - || (iIndicators[ii]->iInputRange == aRange)) - { - return button->GetRealCaseByMode(button->CurrentMode()); - } - } - } - - return KErrNotFound; - } - -// ----------------------------------------------------------------------------- -// Implementation of CAknFepCtrlRangeBar::SetFont -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetFont(const CFont* aFont) - { - iFont = aFont; - - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if (iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) - { - static_cast(iIndicators[ii]->iIndicator)->SetFont(iFont); - - break; - } - } - } - -// ----------------------------------------------------------------------------- -// Implementation of CAknFepCtrlRangeBar::Move -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::Move(const TPoint& aOffset) - { - CControlGroup::Move(aOffset); - - iIndicatorRect.Move(aOffset); - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetEventIdForRange -// set event id when range is clicked -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetEventIdForRange(TInt aEventId) - { - iEventIdForRange = aEventId; - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetEventIdForCase -// set event id when case is clicked -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetEventIdForCase(TInt aEventId) - { - iEventIdForCase = aEventId; - } - - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ShowAllRanges -// Display all ranges whether it is IsHide -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::ShowAllRanges() - { - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - iIndicators[ii]->iIsHide = EFalse; - iIndicators[ii]->iIndicator->Hide(EFalse); - } - - if( iCellChanged ) - { - iActionStyle == ERangeBarUsingIndicatorStyle ? - UpdateIndicatorRectForUsingIndicatorStyle(EFalse) : - UpdateIndicatorRect(EFalse); - } - else - { - SetWholeRect(); - iIsReloadImages = EFalse; - //Draw(); - SetIndicatorRect(); - } - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetWholeRect -// Set rect of whole range bar -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CAknFepCtrlRangeBar::SetWholeRect() - { - if (iStyle == EBtnGroupVertical) - { - SetRect(TRect(iIndicatorRect.iTl, - TPoint(iIndicatorRect.iTl.iX + iIndicatorRect.Width(), - iIndicatorRect.iTl.iY + - iIndicatorRect.Height() * (NumOfControls() - NumOfHidedRange())))); - } - else - { - SetRect(TRect(iIndicatorRect.iTl, - TPoint(iIndicatorRect.iTl.iX + - iIndicatorRect.Width() * (NumOfControls() - NumOfHidedRange()), - iIndicatorRect.iTl.iY + iIndicatorRect.Height()))); - } - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::NumOfHidedRange -// Get number of hided input ranges -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CAknFepCtrlRangeBar::NumOfHidedRange() - { - TInt numOfHidedRange = 0; - - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - if (iIndicators[ ii ]->iIsHide) - { - numOfHidedRange++; - } - } - - return numOfHidedRange; - } - - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::SetActionStyle -// set action style -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::SetActionStyle(TRangeBarActionStyle aActionStyle) - { - iActionStyle = aActionStyle; - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::IndicatorIdxByRange -// get indicator index by range -// ----------------------------------------------------------------------------- -// -TInt CAknFepCtrlRangeBar::IndicatorIdxByRange(TInt aRange) - { - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - if ( IsMixedRange(ii) ) - { - CAknFepCtrlMultiModeButton* button = static_cast - (iIndicators[ii]->iIndicator); - if ( button->RangeOfGivenMode(button->NextMode()) == aRange || - button->RangeOfGivenMode(button->CurrentMode()) == aRange ) - { - return ii; - } - } - else if (iIndicators[ii]->iInputRange == aRange) - { - return ii; - } - } - - return KErrNotFound; - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ActiveRange -// active range -// ----------------------------------------------------------------------------- -// -EXPORT_C void CAknFepCtrlRangeBar::ActiveRange(TInt aRange) - { - TInt indiIdx = IndicatorIdxByRange(aRange); - - if (indiIdx == KErrNotFound) - return; - - if (iActionStyle == ERangeBarActionStyleHide || - (iActionStyle == ERangeBarUsingIndicatorStyle && - iIndicators[indiIdx]->iActionStyle == EIndicatorActionStyleHide)) - { - TBool needChange = EFalse; - - if (!iIndicators[indiIdx]->iIndicator->IsDimmed() && iIndicators[indiIdx]->iIndicator) - { - needChange = ETrue; - iInputRange = iIndicators[indiIdx]->iInputRange; - SetActiveCtrl(iIndicators[indiIdx]->iIndicator); - } - - if (needChange) - { - if (iActionStyle == ERangeBarActionStyleHide) - { - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - if (ii == indiIdx) - { - iIndicators[ii]->iIndicator->Hide(ETrue); - iIndicators[ii]->iIsHide = ETrue; - } - else if (iIndicators[ii]->iIsHide) - { - iIndicators[ii]->iIsHide = EFalse; - iIndicators[ii]->iIndicator->Hide(EFalse); - } - } - if (iCellChanged ) - { - UpdateIndicatorRect( EFalse ); - } - else - { - SetWholeRect(); - iIsReloadImages = EFalse; - //Draw(); - SetIndicatorRect(); - } - } - else - { - HideRangeForHidingIndicatorStyle(indiIdx, ETrue); - UpdateIndicatorRectForUsingIndicatorStyle(EFalse); - } - } - } - else - { - // whole range bar's action style is highlight, or it depends on each indicator's - // action style, which is highlight or just visible - SetRange(aRange); - } - - for (TInt ii = 0; ii < iIndicators.Count(); ++ii) - { - TBool highlight = - iIndicators[ii]->iIndicator->IsActive() && !iIndicators[ii]->iIndicator->Hiden(); - iIndicators[ii]->iIndicator->SetHighlight(highlight); - } - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::IsMixedRange -// Judge if button in given index has mixed range -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TBool CAknFepCtrlRangeBar::IsMixedRange(const TInt aIndex) - { - if ((aIndex >= 0) && - (aIndex <= iIndicators.Count()-1) && - (iIndicators[aIndex]->iCtrlType == EButtonTypeMultiMode) && - (iIndicators[aIndex]->iRangeType == ERangeTypeMixed)) - { - return ETrue; - } - - return EFalse; - } - -// ----------------------------------------------------------------------------- -// CAknFepCtrlRangeBar::ReportEventToObserver -// Report range or case event to observer -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CAknFepCtrlRangeBar::ReportEventToObserver(const TInt aEventId, const TInt aEventData) - { - TPtrC ptr; - TInt sendData = aEventData; - ptr.Set(reinterpret_cast(&sendData),sizeof(aEventData)); - - ReportEvent(aEventId, ptr); - } - -EXPORT_C void CAknFepCtrlRangeBar::SetDispalyCellRectsL( const RArray& aRects, - const RArray& aInnerRects ) - { - iCellChanged = ETrue; - iCellRects.Close(); - iCellInnerRects.Close(); - for( TInt i = 0; i < aRects.Count(); i++ ) - { - iCellRects.AppendL( aRects[i] ); - } - - for( TInt i = 0; i < aInnerRects.Count(); i++ ) - { - iCellInnerRects.AppendL( aInnerRects[i] ); - } - - iActionStyle == ERangeBarUsingIndicatorStyle ? - UpdateIndicatorRectForUsingIndicatorStyle(ETrue) : - UpdateIndicatorRect(ETrue); - } - -void CAknFepCtrlRangeBar::UpdateIndicatorRect( TBool aUpdateImage) - { - TInt index = 0; - for (TInt ii = 0; ii < iIndicators.Count() && iCellRects.Count() > 0; ++ii) - { - TPoint offset( iIndicatorRect.iTl.iX, iIndicatorRect.iTl.iY ); - if (!iIndicators[ii]->iIsHide ) - { - CAknFepCtrlCommonButton* button = iIndicators[ii]->iIndicator; - if( button ) - { - TInt n = index++; - TRect btnRect( iCellRects[n] ); - TRect btnInnerRect( iCellInnerRects[n] ); - //btnRect.Move( offset ); - if (iIndicators[ii]->iCtrlType == EButtonTypeMultiMode) - { - static_cast(iIndicators[ii]->iIndicator)-> - SizeChanged(btnRect, btnInnerRect, aUpdateImage); - } - else - { - static_cast(iIndicators[ii]->iIndicator)-> - SizeChanged(btnRect, btnInnerRect, aUpdateImage); - } - } - if( index == iCellRects.Count() ) - break; - } - } - } - -void CAknFepCtrlRangeBar::UpdateIndicatorRectForUsingIndicatorStyle(TBool aUpdateImage) - { - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if (/*!iIndicators[ii]->iIsHide && */ - iIndicators[ii]->iIndicator && - iIndicators[ii]->iPosIdx >= 0 && - iIndicators[ii]->iPosIdx < iCellRects.Count()) - { - iIndicators[ii]->iIndicator->SizeChanged(iCellRects[iIndicators[ii]->iPosIdx], - iCellInnerRects[iIndicators[ii]->iPosIdx], - aUpdateImage); - } - } - } - -void CAknFepCtrlRangeBar::HideRangeForHidingIndicatorStyle(TInt aIdx, - TBool aHide) - { - RArray permitRangeInxArray; - TInt maxPos = 0; - - // Get all the permitted range index array - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - maxPos = iIndicators[ii]->iPosIdx > maxPos ? iIndicators[ii]->iPosIdx : maxPos; - - if( !(iIndicators[ii]->iIndicator->IsDimmed() ) && iIndicators[ii]->iPosIdx >=0 ) - { - permitRangeInxArray.Append(ii); - } - } - - TBool showAllPermittedRange = ETrue; - - // compare the position for every permitted range - if( permitRangeInxArray.Count() == maxPos + 1 ) - { - for(TInt n = 0; n < permitRangeInxArray.Count(); n++) - { - for( TInt m = n+1; m < permitRangeInxArray.Count(); m++ ) - { - if( iIndicators[permitRangeInxArray[n]]->iPosIdx == - iIndicators[permitRangeInxArray[m]]->iPosIdx ) - { - showAllPermittedRange = EFalse; - break; - } - } - } - } - else - { - showAllPermittedRange = EFalse; - } - - permitRangeInxArray.Reset(); - permitRangeInxArray.Close(); - - if( !showAllPermittedRange ) // hide style - { - if (iIndicators[aIdx]->iIsHide != aHide && - iIndicators[aIdx]->iIndicator) - { - TBool canShowNext = ETrue; - - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if (ii != aIdx && iIndicators[ii]->iPosIdx == iIndicators[aIdx]->iPosIdx) - { - if ( iIndicators[ii]->iIndicator->IsDimmed() ) - { - canShowNext = EFalse; - } - else - { - iIndicators[ii]->iIndicator->Hide(!aHide); - iIndicators[ii]->iIsHide = !aHide; - } - - if (aHide) - break; - } - } - - iIndicators[aIdx]->iIndicator->Hide( canShowNext && aHide); - iIndicators[aIdx]->iIsHide = canShowNext && aHide; - } - } - else - { - // Set the range for special state - for (TInt ii = 0; ii < iIndicators.Count(); ii++) - { - if( iIndicators[ii]->iIndicator->IsDimmed() ) - { - iIndicators[ii]->iIndicator->Hide(ETrue); - iIndicators[ii]->iIsHide = ETrue; - } - else - { - iIndicators[ii]->iIndicator->Hide(EFalse); - iIndicators[ii]->iIsHide = EFalse; - } - } - - } - } -// End Of File