diff -r 57d4cdd99204 -r edfc90759b9f imageeditor/ImageEditorUI/src/HorizontalSlider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imageeditor/ImageEditorUI/src/HorizontalSlider.cpp Fri Jan 29 13:53:17 2010 +0200 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "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: +* Ixonos Plc +* +* Description: +* +*/ + + +// INCLUDE +#include +#include +#include +#include +#include + +#include +#include +#include "ResolutionUtil.h" +#include "ImageEditorUiDefs.h" +#include "HorizontalSlider.h" +#include "CustomControlPanics.h" + +// constants +const TInt KBorderPartsNum = 9; +const TInt KSliderPartsNum = 4; + +//============================================================================= +EXPORT_C CHorizontalSlider* CHorizontalSlider::NewL(const TRect& aRect, const CCoeControl& aControl) + { + CHorizontalSlider* self = CHorizontalSlider::NewLC(aRect, aControl); + CleanupStack::Pop(self); + return self; + } + +//============================================================================= +EXPORT_C CHorizontalSlider* CHorizontalSlider::NewLC(const TRect& aRect, const CCoeControl& aControl) + { + CHorizontalSlider* self = new (ELeave) CHorizontalSlider; + CleanupStack::PushL(self); + self->ConstructL(aRect, aControl); + return self; + } + +//============================================================================= +EXPORT_C CHorizontalSlider::~CHorizontalSlider() + { + iBorders.ResetAndDestroy(); + iScrollBar.ResetAndDestroy(); + if (iIcon) + { + delete iIcon; + } + } + +//============================================================================= +void CHorizontalSlider::ConstructL(const TRect& aRect, const CCoeControl& aControl) + { + SetContainerWindowL(aControl); + SetRect(aRect); + + TInt variant = 0; + TFileName iconFile (KImageEditorUiMifFile); + + // create popup and slider graphics + for ( TInt i = 0; i < KBorderPartsNum; ++i ) + { + CEikImage* image = new (ELeave) CEikImage; + + image->CreatePictureFromFileL(iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_center + 2*i, + EMbmImageeditoruiQgn_graf_popup_trans_center_mask + 2*i); + + CleanupStack::PushL( image ); + image->SetContainerWindowL( *this ); +// image->SetPictureOwnedExternally( ETrue ); + iBorders.AppendL( image ); + CleanupStack::Pop( image ); + } + for ( TInt i = 0; i < KSliderPartsNum; ++i ) + { + CEikImage* image = new (ELeave) CEikImage; + + image->CreatePictureFromFileL(iconFile, + EMbmImageeditoruiQgn_graf_nslider_imed_end_left + 2*i, + EMbmImageeditoruiQgn_graf_nslider_imed_end_left_mask + 2*i); + + CleanupStack::PushL( image ); + image->SetContainerWindowL( *this ); +// image->SetPictureOwnedExternally( ETrue ); + iScrollBar.AppendL( image ); + CleanupStack::Pop( image ); + } + + ActivateL(); + } + +//============================================================================= +CHorizontalSlider::CHorizontalSlider() + { + // no implementation required + } + +//============================================================================= +EXPORT_C TInt CHorizontalSlider::CountComponentControls() const + { + TInt count = iBorders.Count(); + count += iScrollBar.Count(); + if (iIcon) + { + count++; + } + + return count; + } + +//============================================================================= +void CHorizontalSlider::Draw(const TRect& /*aRect*/) const + { + // determine popup border layouts + AknLayoutUtils::LayoutControl( iBorders[0], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g1().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[1], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g2().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[2], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g3().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[3], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g4().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[4], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g5().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[5], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g6().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[6], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g7().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[7], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g8().LayoutLine() ); + AknLayoutUtils::LayoutControl( iBorders[8], Rect(), AknLayoutScalable_Avkon::bg_tb_trans_pane_g9().LayoutLine() ); + // Images need to be resized separately, because the standard LayoutImage + // tries to preserve the aspect ratio and we don't want that. + // + for ( TInt i = 0; i < iBorders.Count(); ++i ) + { + AknIconUtils::SetSize( + const_cast( iBorders[i]->Bitmap() ), + iBorders[i]->Size(), EAspectRatioNotPreserved ); + } + + // determine icon layout + AknLayoutUtils::LayoutControl( iIcon, Rect(), AknLayoutScalable_Apps::popup_imed_adjust2_window_g1().LayoutLine() ); + AknIconUtils::SetSize( + const_cast( iIcon->Bitmap() ), + iIcon->Size(), EAspectRatioNotPreserved ); + + // determine caption layout + TAknLayoutText layoutText; + layoutText.LayoutText( Rect(), AknLayoutScalable_Apps::popup_imed_adjust2_window_t1() ); + TRgb color = layoutText.Color(); + layoutText.DrawText( SystemGc(), iText, ETrue, color ); + + // determine scrollbar layouts + TAknWindowComponentLayout l = AknLayoutScalable_Apps::slider_imed_adjust_pane(); + TAknWindowLineLayout lineLayout = l.LayoutLine(); + TAknLayoutRect layoutRect; + layoutRect.LayoutRect(Rect(), lineLayout); + AknLayoutUtils::LayoutControl( iScrollBar[0], layoutRect.Rect(), AknLayoutScalable_Apps::slider_imed_adjust_pane_g1().LayoutLine() ); + AknLayoutUtils::LayoutControl( iScrollBar[1], layoutRect.Rect(), AknLayoutScalable_Apps::slider_imed_adjust_pane_g2().LayoutLine() ); + AknLayoutUtils::LayoutControl( iScrollBar[2], layoutRect.Rect(), AknLayoutScalable_Apps::slider_imed_adjust_pane_g3().LayoutLine() ); + AknLayoutUtils::LayoutControl( iScrollBar[3], layoutRect.Rect(), AknLayoutScalable_Apps::slider_imed_adjust_pane_g4().LayoutLine() ); + for ( TInt i = 0; i < iScrollBar.Count(); ++i ) + { + AknIconUtils::SetSize( + const_cast( iScrollBar[i]->Bitmap() ), + iScrollBar[i]->Size(), EAspectRatioNotPreserved ); + } + + // determine scrollbar marker layout + if ( iMinimumValue <= iMaximumValue ) + { + TUint length = iMaximumValue - iMinimumValue; // length of the slider + TUint pixelsFromMin = iPosition - iMinimumValue; // tab position from the beginning + + TReal factor = 0.0; + if (iMinimumValue < iMaximumValue ) + { + factor = (TReal) pixelsFromMin / length; // tab position from the beginning in percentage + } + + TUint sliderTabWidth = iScrollBar[KSliderPartsNum - 1]->Size().iWidth; // slider tab width + + // slider bitmap is actually a bit longer but this resolves the problem + // where the tab is drawn outside of the slider when in maximum position + TUint sliderBitmapWidth = layoutRect.Rect().Width() - sliderTabWidth; + + TInt tabPositionFromMinInPixels = (TInt) ((factor * sliderBitmapWidth + 0.5) - (sliderBitmapWidth / 2)); // calculate tab position + + TRect markerRect = layoutRect.Rect(); + markerRect.iTl.iX += tabPositionFromMinInPixels; + + AknLayoutUtils::LayoutControl( iScrollBar[KSliderPartsNum - 1], markerRect, AknLayoutScalable_Apps::slider_imed_adjust_pane_g4().LayoutLine() ); + + AknIconUtils::SetSize( + const_cast( iScrollBar[KSliderPartsNum - 1]->Bitmap() ), + iScrollBar[KSliderPartsNum - 1]->Size(), EAspectRatioNotPreserved ); + } + } + +//============================================================================= +EXPORT_C CCoeControl* CHorizontalSlider::ComponentControl(TInt aIndex) const + { + if ( aIndex < iBorders.Count() ) + { + return iBorders[aIndex]; + } + + if ( aIndex < iBorders.Count() + iScrollBar.Count()) + { + return iScrollBar[aIndex - iBorders.Count()]; + } + return iIcon; + } + +// setters + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetIcon(CEikImage* aIcon) + { + iIcon = aIcon; + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetCaption(const TDesC& aText) + { + iText = aText; + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetMinimum(TInt aValue) + { + iMinimumValue = aValue; + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetMaximum(TInt aValue) + { + iMaximumValue = aValue; + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetStep(TUint aValue) + { + iStep = aValue; + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetStepAmount(TUint8 aValue) + { + iNumberOfSteps = aValue; + + if(aValue == 0) + { + iStep = 0; + } + else + { + iStep = (iMaximumValue-iMinimumValue) / aValue; + } + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::SetPosition(TInt aValue) + { + __ASSERT_ALWAYS( aValue >= iMinimumValue, Panic(EHorizontalSliderPanicIndexUnderflow) ); + __ASSERT_ALWAYS( aValue <= iMaximumValue, Panic(EHorizontalSliderPanicIndexOverflow) ); + + iPosition = aValue; + } + +// getters + +//============================================================================= +EXPORT_C TInt CHorizontalSlider::Minimum() const + { + return iMinimumValue; + } + +//============================================================================= +EXPORT_C TInt CHorizontalSlider::Maximum() const + { + return iMaximumValue; + } + +//============================================================================= +EXPORT_C TInt CHorizontalSlider::Step() const + { + return iStep; + } + +//============================================================================= +EXPORT_C TInt CHorizontalSlider::Position() const + { + return iPosition; + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::Increment() + { + iPosition += iStep; + if(iPosition > iMaximumValue) + { + iPosition = iMaximumValue; + } + } + +//============================================================================= +EXPORT_C void CHorizontalSlider::Decrement() + { + iPosition -= iStep; + if(iPosition < iMinimumValue) + { + iPosition = iMinimumValue; + } + } + +// End of File