imageeditor/ImageEditorUI/src/VerticalSlider.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorUI/src/VerticalSlider.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,369 @@
+/*
+* 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 "VerticalSlider.h"
+#include "CustomControlPanics.h"
+#include <ImageEditorUi.mbg>
+#include "ResolutionUtil.h"
+#include "ImageEditorUiDefs.h"
+#include <fbs.h>
+#include <aknutils.h>
+#include <AknIconUtils.h>
+
+
+// CONSTANTS
+const TInt KStandardSliderWidth     = 7;
+const TInt KStandardSliderHeight    = 132;
+const TInt KStandardSliderTabWidth  = 7;
+const TInt KStandardSliderTabHeight = 12;
+
+const TInt KDoubleSliderWidth       = 13;
+const TInt KDoubleSliderHeight      = 244;
+const TInt KDoubleSliderTabWidth    = 13;
+const TInt KDoubleSliderTabHeight   = 24;
+
+const TInt KQVGASliderWidth         = 10;
+const TInt KQVGASliderHeight        = 188;
+const TInt KQVGASliderTabWidth      = 10;
+const TInt KQVGASliderTabHeight     = 18;
+
+const TInt KHVGASliderWidth         = 13;
+const TInt KHVGASliderHeight        = 244;
+const TInt KHVGASliderTabWidth      = 13;
+const TInt KHVGASliderTabHeight     = 24;
+
+const TInt KVGASliderWidth          = 20;
+const TInt KVGASliderHeight         = 376;
+const TInt KVGASliderTabWidth       = 20;
+const TInt KVGASliderTabHeight      = 36;
+
+const TInt KQHDSliderWidth          = 13;
+const TInt KQHDSliderHeight         = 244;
+const TInt KQHDSliderTabWidth       = 13;
+const TInt KQHDSliderTabHeight      = 24;
+
+//=============================================================================
+EXPORT_C CVerticalSlider* CVerticalSlider::NewL(const TRect& aRect, const CCoeControl& aControl)
+    {
+    CVerticalSlider* self = CVerticalSlider::NewLC(aRect, aControl);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+//=============================================================================
+EXPORT_C CVerticalSlider* CVerticalSlider::NewLC(const TRect& aRect, const CCoeControl& aControl)
+    {
+    CVerticalSlider* self = new (ELeave) CVerticalSlider;
+    CleanupStack::PushL(self);
+    self->ConstructL(aRect, aControl);
+    return self;
+    }
+
+//=============================================================================
+EXPORT_C CVerticalSlider::~CVerticalSlider()
+    {
+    delete iSliderBg;
+	delete iSliderBgMask;
+	delete iSliderTab;
+	delete iSliderTabMask;
+    }
+
+//=============================================================================
+void CVerticalSlider::ConstructL(const TRect& /*aRect*/, const CCoeControl& aControl)
+    {
+	SetContainerWindowL(aControl);
+	
+    // Load the bitmaps
+    LoadBitmapL( iSliderBg, iSliderBgMask, EMbmImageeditoruiQgn_graf_ied_vslider, EMbmImageeditoruiQgn_graf_ied_vslider_mask );
+    LoadBitmapL( iSliderTab, iSliderTabMask, EMbmImageeditoruiQgn_graf_ied_vtab, EMbmImageeditoruiQgn_graf_ied_vtab_mask );
+    SetBitmapSize();
+
+	ActivateL();
+    }
+
+//=============================================================================
+CVerticalSlider::CVerticalSlider()
+    {
+    // no implementation required
+    }
+
+//=============================================================================
+EXPORT_C TInt CVerticalSlider::CountComponentControls() const
+    {
+    return 0;
+    }
+
+//=============================================================================
+void CVerticalSlider::Draw(const TRect& /*aRect*/) const
+{
+    if ( iMinimumValue <= iMaximumValue )
+    {
+        TUint height = iMaximumValue - iMinimumValue; // height of the slider
+        TUint pixelsFromMin = iPosition - iMinimumValue; // tab position from the beginning
+    
+        TReal factor = 0.0;
+        if (iMinimumValue < iMaximumValue )
+        {
+            factor = (TReal) pixelsFromMin / height; // tab position from the beginning in percentage
+        }
+        TUint sliderTabHeight = iSliderTab->SizeInPixels().iHeight; // slider tab height
+
+        // 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 sliderBitmapHeight = iSliderBg->SizeInPixels().iHeight - sliderTabHeight;
+    
+        TUint tabPositionFromMinInPixels = (TUint) (factor * sliderBitmapHeight + 0.5); // calculate tab position
+
+        // top left coordinate
+        const TPoint tl = Rect().iTl;
+
+        CWindowGc& gc = SystemGc();
+
+        // draw actual slider using mask bitmap
+        TRect bgRect(TPoint(0,0), iSliderBg->SizeInPixels());
+        gc.BitBltMasked(tl, iSliderBg, bgRect, iSliderBgMask, ETrue);
+
+        // draw the tab using mask bitmap
+        TRect tabRect(TPoint(0,0),iSliderTab->SizeInPixels());
+        gc.BitBltMasked(TPoint(tl.iX, tl.iY+tabPositionFromMinInPixels), iSliderTab, tabRect, iSliderTabMask, ETrue);
+    }
+}
+
+//=============================================================================
+EXPORT_C CCoeControl* CVerticalSlider::ComponentControl(TInt /*aIndex*/) const
+    {
+    return NULL;
+    }
+
+//=============================================================================
+EXPORT_C TSize CVerticalSlider::MinimumSize()
+	{
+	TSize size = iSliderBg->SizeInPixels();
+	return size;
+	}
+
+// setters
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::SetMinimum(TInt aValue)
+	{
+	iMinimumValue = aValue;
+	}
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::SetMaximum(TInt aValue)
+	{
+	iMaximumValue = aValue;
+	}
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::SetStep(TUint aValue)
+	{
+	iStep = aValue;
+	}
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::SetStepAmount(TUint8 aValue)
+	{
+	iNumberOfSteps = aValue;
+	
+	if(aValue == 0)
+		{
+		iStep = 0;
+		}
+	else
+		{
+		iStep = (iMaximumValue-iMinimumValue) / aValue;
+		}
+	}
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::SetPosition(TInt aValue)
+	{
+	__ASSERT_ALWAYS( aValue >= iMinimumValue, Panic(EVerticalSliderPanicIndexUnderflow) );
+	__ASSERT_ALWAYS( aValue <= iMaximumValue, Panic(EVerticalSliderPanicIndexOverflow) );
+
+	iPosition = aValue;
+	}
+
+// getters
+
+//=============================================================================
+EXPORT_C TInt CVerticalSlider::Minimum() const
+	{
+	return iMinimumValue;
+	}
+
+//=============================================================================
+EXPORT_C TInt CVerticalSlider::Maximum() const
+	{
+	return iMaximumValue;
+	}
+
+//=============================================================================
+EXPORT_C TInt CVerticalSlider::Step() const
+	{
+	return iStep;
+	}
+
+//=============================================================================
+EXPORT_C TInt CVerticalSlider::Position() const
+	{
+	return iPosition;
+	}
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::Increment()
+	{
+	iPosition += iStep;
+	if(iPosition > iMaximumValue)
+		{
+		iPosition = iMaximumValue;
+		}
+	}
+
+//=============================================================================
+EXPORT_C void CVerticalSlider::Decrement()
+	{
+	iPosition -= iStep;
+	if(iPosition < iMinimumValue)
+		{
+		iPosition = iMinimumValue;
+		}
+	}
+
+
+//=============================================================================
+void CVerticalSlider::LoadBitmapL( CFbsBitmap*& aBitmap, CFbsBitmap*& aMask, TInt aBitmapId, TInt aMaskId ) const
+{
+
+    TFileName iconFile( KImageEditorUiMifFile );
+    User::LeaveIfError( CompleteWithAppPath(iconFile) );
+
+    // Get ids for bitmap and mask
+    AknIconUtils::CreateIconL(
+        aBitmap,
+        aMask,
+        iconFile,
+        aBitmapId,
+        aMaskId
+        );
+
+
+}
+
+//=============================================================================
+void CVerticalSlider::SetBitmapSize() const
+{
+
+    __ASSERT_ALWAYS( iSliderBg && iSliderTab, Panic(EVerticalSliderPanicBitmapsNotLoaded) );
+
+    //  Get the screen mode from the Resolution Util
+    TInt screenMode = CResolutionUtil::Self()->GetScreenMode();
+
+    TSize sliderSize;
+    TSize tabSize;
+
+    switch( screenMode )
+    {
+        // small screen sizes
+        case CResolutionUtil::EStandard:
+        case CResolutionUtil::EStandardFullScreen:
+        case CResolutionUtil::EStandardLandscape:
+        case CResolutionUtil::EStandardLandscapeFullScreen:
+        case CResolutionUtil::ESquare:
+        case CResolutionUtil::ESquareFullScreen:
+        case CResolutionUtil::ESquareRotated:
+        case CResolutionUtil::ESquareRotatedFullScreen:
+        {
+            sliderSize = TSize (KStandardSliderWidth, KStandardSliderHeight);
+            tabSize = TSize (KStandardSliderTabWidth, KStandardSliderTabHeight);
+            break;
+        }
+
+        // QVGA
+        case CResolutionUtil::EQVGA:
+        case CResolutionUtil::EQVGAFullScreen:
+        case CResolutionUtil::EQVGALandscape:
+        case CResolutionUtil::EQVGALandscapeFullScreen:
+        {
+            sliderSize = TSize (KQVGASliderWidth, KQVGASliderHeight);
+            tabSize = TSize (KQVGASliderTabWidth, KQVGASliderTabHeight);
+            break;
+        }
+       
+        case CResolutionUtil::EDouble:
+        case CResolutionUtil::EDoubleFullScreen:
+        case CResolutionUtil::EDoubleLandscape:
+        case CResolutionUtil::EDoubleLandscapeFullScreen:
+        {
+            sliderSize = TSize (KDoubleSliderWidth, KDoubleSliderHeight);
+            tabSize = TSize (KDoubleSliderTabWidth, KDoubleSliderTabHeight);
+            break;
+        }
+        
+        // HVGA
+        case CResolutionUtil::EHVGA:
+        case CResolutionUtil::EHVGAFullScreen:
+        case CResolutionUtil::EHVGALandscape:
+        case CResolutionUtil::EHVGALandscapeFullScreen:
+        {
+            sliderSize = TSize (KHVGASliderWidth, KHVGASliderHeight);
+            tabSize = TSize (KHVGASliderTabWidth, KHVGASliderTabHeight);
+            break;
+        }
+        
+        // VGA
+        case CResolutionUtil::EVGA:
+        case CResolutionUtil::EVGAFullScreen:
+        case CResolutionUtil::EVGALandscape:
+        case CResolutionUtil::EVGALandscapeFullScreen:
+        {
+            sliderSize = TSize (KVGASliderWidth, KVGASliderHeight);
+            tabSize = TSize (KVGASliderTabWidth, KVGASliderTabHeight);
+            break;
+        }
+        
+        // QHD
+        case CResolutionUtil::EQHD:
+        case CResolutionUtil::EQHDFullScreen:
+        case CResolutionUtil::EQHDLandscape:
+        case CResolutionUtil::EQHDLandscapeFullScreen:
+        {
+            sliderSize = TSize (KQHDSliderWidth, KQHDSliderHeight);
+            tabSize = TSize (KQHDSliderTabWidth, KQHDSliderTabHeight);
+            break;
+        }
+        
+        default:
+        {
+            sliderSize = TSize (KStandardSliderWidth, KStandardSliderHeight);
+            tabSize = TSize (KStandardSliderTabWidth, KStandardSliderTabHeight);
+            break;
+        }
+    }
+    
+    // Set size for scalable icons - MUST BE CALLED BEFORE ICON IS USABLE
+    AknIconUtils::SetSize( iSliderBg, sliderSize );
+    AknIconUtils::SetSize( iSliderTab, tabSize );
+
+}
+
+// End of File