diff -r 000000000000 -r eb1f2e154e89 textinput/peninputcommonctrls/src/peninputrangebar/peninputrangebar.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputcommonctrls/src/peninputrangebar/peninputrangebar.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1349 @@ +/* +* 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