imageeditor/ImageEditorUI/src/HorizontalSlider.cpp
changeset 1 edfc90759b9f
--- /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