--- /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 <fbs.h>
+#include <aknutils.h>
+#include <ImageEditorUI.rsg>
+#include <AknLayoutScalable_Avkon.cdl.h>
+#include <AknLayoutScalable_Apps.cdl.h>
+
+#include <AknIconUtils.h>
+#include <ImageEditorUi.mbg>
+#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<CFbsBitmap*>( 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<CFbsBitmap*>( 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<CFbsBitmap*>( 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<CFbsBitmap*>( 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