--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/plugins/ResizePlugin/src/ResizeControl.cpp Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,625 @@
+/*
+* 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:
+*
+*/
+
+
+/// INCLUDES
+#include <resize.mbg>
+#include <resize.rsg>
+#include <aknutils.h>
+#include <aknglobalnote.h>
+#include <ConeResLoader.h>
+#include <stringloader.h>
+#include "SingleParamControl.h"
+#include "SystemParameters.h"
+#include "ResizeControl.h"
+#include "ImageEditorResizePlugin.h"
+#include "PluginInfo.h"
+
+/// CONSTANTS
+_LIT (KPgnResourceFile, "resize.rsc");
+_LIT (KResourceDir, "\\resource\\apps\\");
+
+const TInt KResizeHSTitleIndex = 0;
+const TInt KMinDimension = 25;
+const TInt KMaxCaptionLength = 50;
+
+//=============================================================================
+CResizeControl * CResizeControl::NewL (const TRect& aRect, CCoeControl* aParent)
+{
+ CResizeControl * self = new (ELeave) CResizeControl;
+ CleanupStack::PushL (self);
+ self->ConstructL (aRect, aParent);
+ CleanupStack::Pop (); // self
+ return self;
+}
+
+//=============================================================================
+CResizeControl::CResizeControl()
+{
+ // EMPTY
+}
+
+//=============================================================================
+CResizeControl::~CResizeControl()
+{
+ delete iControl;
+ iControl = NULL;
+ iParamArray.Reset();
+// iEditorView = NULL;
+ iSysPars = NULL;
+ iPluginInfo = NULL;
+ iParameters = NULL;
+ delete iBufBitmap;
+}
+
+//=============================================================================
+void CResizeControl::ConstructL (
+ const TRect & aRect,
+ CCoeControl * aParent
+ )
+{
+ // Set parent
+ SetContainerWindowL (*aParent);
+
+
+ iControl = CSingleParamControl::NewL (aRect, aParent);
+ ((CSingleParamControl *)iControl)->SetParObserver ( (MSingleParControlObserver*)this );
+// aPluginControl = iControl;
+
+ // Activate control
+ ActivateL();
+}
+
+//=============================================================================
+void CResizeControl::SetView (CAknView * aView)
+{
+ ((CSingleParamControl *)iControl)->SetView(aView);
+// iEditorView = aView;
+}
+
+//=============================================================================
+void CResizeControl::SetSelectedUiItemL (CPluginInfo * aItem)
+{
+ iPluginInfo = aItem;
+}
+
+//=============================================================================
+void CResizeControl::PrepareL ()
+{
+
+}
+
+//=============================================================================
+TKeyResponse CResizeControl::OfferKeyEventL (
+ const TKeyEvent & aKeyEvent,
+ TEventCode aType
+ )
+{
+ TKeyResponse response = EKeyWasNotConsumed;
+
+ if ( Busy() )
+ {
+ response = EKeyWasConsumed;
+ }
+ else if (aType != EEventKey )
+ {
+ switch (aKeyEvent.iScanCode)
+ {
+ // Just consume these keys (No EEventKey type event delivered for
+ // these keys so this must be done here)
+ case EStdKeyRightShift:
+ case EStdKeyLeftShift:
+ {
+ response = EKeyWasConsumed;
+ break;
+ }
+ }
+ }
+ else if (EEventKey == aType)
+ {
+ switch (aKeyEvent.iCode)
+ {
+ // Just consume the keys
+ case 0x31: // 1
+ case 0x32: // 2
+ case 0x33: // 3
+ case 0x37: // 7
+ case 0x38: // 8
+ case 0x39: // 9
+ case EKeyDownArrow:
+ case EStdKeyDecVolume:
+ case 0x30:
+ case EKeyUpArrow:
+ case EStdKeyIncVolume:
+ case 0x35:
+ case 0x2a: // *
+ case 0x23: // #
+// case EKeyLeftArrow:
+// case EKeyRightArrow:
+ {
+ response = EKeyWasConsumed;
+ break;
+ }
+ case 0x34: // 4
+ {
+ TKeyEvent kevent;
+ TEventCode ecode = EEventKey;
+ kevent.iCode = EKeyLeftArrow;
+ iControl->OfferKeyEventL(kevent, ecode);
+
+ response = EKeyWasConsumed;
+ break;
+ }
+ case 0x36: // 6
+ {
+ TKeyEvent kevent;
+ TEventCode ecode = EEventKey;
+ kevent.iCode = EKeyRightArrow;
+ iControl->OfferKeyEventL(kevent, ecode);
+
+ response = EKeyWasConsumed;
+ break;
+ }
+ default:
+ {
+ response = iControl->OfferKeyEventL(aKeyEvent, aType);
+ }
+ }
+ }
+ return response;
+}
+
+//=============================================================================
+void CResizeControl::HandlePointerEventL( const TPointerEvent &aPointerEvent )
+{
+ return iControl->HandlePointerEventL( aPointerEvent );
+}
+
+//=============================================================================
+TInt CResizeControl::CountComponentControls() const
+{
+ TInt count(0);
+ if (iControl)
+ {
+ ++count;
+ }
+ return count;
+}
+
+//=============================================================================
+CCoeControl * CResizeControl::ComponentControl (TInt aIndex) const
+{
+ switch (aIndex)
+ {
+ case 0:
+ {
+ return iControl;
+ }
+ default:
+ {
+ return 0;
+ }
+ }
+}
+
+
+//=============================================================================
+void CResizeControl::HandlePluginCommandL (const TInt aCommand)
+ {
+ return ((CSingleParamControl *)iControl)->HandlePluginCommandL(aCommand);
+
+/*
+ switch(aCommand)
+ {
+ case EPgnSoftkeyIdCancel:
+ {
+ iEditorView->HandleCommandL (EImageEditorCancelPlugin);
+ break;
+ }
+ case EPgnSoftkeyIdOk:
+ {
+ if ( iControl->Position() != iInitPosition )
+ {
+ ((CImageEditorUIView*)iEditorView)->
+ ShowConfirmationNoteL(iPluginInfo->Parameters()[KResolutionChangedTextIndex] );
+ iEditorView->HandleCommandL (EImageEditorApplyPlugin);
+
+ }
+ else
+ {
+ iEditorView->HandleCommandL (EImageEditorCancelPlugin);
+ }
+ }
+ }
+*/
+ }
+
+
+//=============================================================================
+TInt CResizeControl::GetSoftkeyIndexL ()
+{
+ return 0;
+}
+
+/*
+//=============================================================================
+TPtrC CResizeControl::GetNaviPaneTextL (
+ TBool& aLeftNaviPaneScrollButtonVisibile,
+ TBool& aRightNaviPaneScrollButtonVisible )
+{
+ aLeftNaviPaneScrollButtonVisibile = EFalse;
+ aRightNaviPaneScrollButtonVisible = EFalse;
+
+ // .loc file parameter format strings
+ _LIT(KParameter1, "%0N");
+ _LIT(KParameter2, "%1N");
+
+ // Getting string from resources
+ TPtrC ptr = iPluginInfo->Parameters()[KStatusPaneTextIndex];
+
+ // Finding format patterns
+ TInt pos1 = ptr.Find(KParameter1);
+ TInt pos2 = ptr.Find(KParameter2);
+
+ if(pos1 == KErrNotFound || pos2 == KErrNotFound)
+ {
+ User::Leave(KSIEEInternal);
+ }
+
+ // Clear navi pane
+ iNaviPaneText.Zero();
+
+ // Add new text and replace format strings with new resolution
+ iNaviPaneText.Append(ptr.Left(pos1));
+ iNaviPaneText.AppendNum (iSize.iWidth);
+ iNaviPaneText.Append (ptr.Mid(pos1 + 3, pos2 - (pos1 + 3)));
+ iNaviPaneText.AppendNum (iSize.iHeight);
+ iNaviPaneText.Append (ptr.Mid(pos2 + 3));
+
+ return iNaviPaneText;
+ }
+*/
+
+//=============================================================================
+TBitField CResizeControl::GetDimmedMenuItems ()
+{
+ return TBitField();
+}
+
+//=============================================================================
+void CResizeControl::SetSystemParameters (CSystemParameters * aSysPars, CImageEditorResizePlugin* aParent)
+{
+ iSysPars = aSysPars;
+ ComputeAndSetSliderParameters(aParent);
+}
+
+//=============================================================================
+void CResizeControl::SizeChanged()
+{
+ iControl->SetRect(Rect());
+}
+
+//=============================================================================
+void CResizeControl::Draw (const TRect & aRect) const
+{
+ // Fill the background with black
+ CWindowGc & gc = SystemGc();
+ gc.SetPenStyle (CGraphicsContext::ESolidPen);
+ gc.SetPenColor (KRgbBlack);
+ gc.SetBrushStyle (CGraphicsContext::ESolidBrush);
+ gc.SetBrushColor (KRgbBlack);
+
+ if ( iPreview && iPreview->Handle() )
+ {
+
+ if ( ((CSingleParamControl *)iControl)->Position() == iInitPosition )
+ {
+ gc.BitBlt ( TPoint(0,0), iPreview );
+ }
+ else
+ {
+ gc.Clear (aRect);
+
+ TReal ratio = (TReal)iSize.iHeight / (TReal)iOrigSize.iHeight;
+ TInt w = (TInt)(ratio * (TReal)Rect().Width());
+ TInt h = (TInt)(ratio * (TReal)Rect().Height());
+
+ TRect target;
+ target.iTl.iX = ((Rect().Width() - w) >> 1);
+ target.iTl.iY = ((Rect().Height() - h) >> 1);
+ target.iBr.iX = ((Rect().Width() + w) >> 1) + 1;
+ target.iBr.iY = ((Rect().Height() + h) >> 1) + 1;
+ TRect rect ( iPreview->SizeInPixels() );
+ //rect.iBr.iX++;
+ //rect.iBr.iY++;
+
+ gc.DrawBitmap (target, iPreview, rect);
+ }
+ }
+}
+
+
+//=============================================================================
+void CResizeControl::ComputeAndSetSliderParameters (CImageEditorResizePlugin* aParent)
+{
+ // Store image size
+ TInt width =
+ (iSysPars->ViewPortRect().iBr.iX -
+ iSysPars->ViewPortRect().iTl.iX);
+
+ TInt height =
+ (iSysPars->ViewPortRect().iBr.iY -
+ iSysPars->ViewPortRect().iTl.iY);
+
+ iOrigSize = TSize (
+ (TInt)(iSysPars->Scale() * width + 0.5),
+ (TInt)(iSysPars->Scale() * height + 0.5)
+ );
+
+ ComputeImageSizes();
+
+ // Set slider properties
+ TInt count = iParamArray.Count();
+ if ( count > 0 )
+ {
+ ((CSingleParamControl *)iControl)->SetSliderMinimumAndMaximum(0, iParamArray.Count() - 1);
+ }
+ else
+ {
+ ((CSingleParamControl *)iControl)->SetSliderMinimumAndMaximum(0, 0);
+ }
+ ((CSingleParamControl *)iControl)->SetSliderStep(1);
+
+ iInitPosition = 0;
+ width = (TInt)(iSysPars->Scale() * width + 0.5);
+ height = (TInt)(iSysPars->Scale() * height + 0.5);
+ for (TInt i = 0; i < iParamArray.Count(); ++i)
+ {
+ if ( (width == iParamArray[i]) || ((height == iParamArray[i])) )
+ {
+ ((CSingleParamControl *)iControl)->SetSliderPosition(i);
+ iInitPosition = i;
+ }
+ }
+
+ ComputeSizeAndScale();
+
+ TFileName iconFile (KResourceDir);
+ TBuf<256> readbuf;
+ User::LeaveIfError ( aParent->GetProperty (KCapIconName, readbuf) );
+ iconFile.Append(readbuf);
+ CEikImage* icon = new (ELeave) CEikImage;
+ icon->CreatePictureFromFileL(iconFile,
+ EMbmResizeQgn_indi_imed_downple_super);
+
+ ((CSingleParamControl *)iControl)->SetIcon(icon);
+
+ // Get caption from plugin properties
+ User::LeaveIfError ( aParent->GetProperty (KCapPluginParamNames, readbuf) );
+ TLex parser;
+ parser.Assign (readbuf);
+ TInt tempval = 0;
+ parser.Val ( tempval );
+ iParameters = (CDesCArray *)tempval;
+
+ // Format the resolutions
+ TBuf< KMaxCaptionLength > caption_temp;
+ TBuf< KMaxCaptionLength > caption;
+ StringLoader::Format( caption_temp, (*iParameters)[KResizeHSTitleIndex], 0, iSize.iWidth );
+ StringLoader::Format( caption, caption_temp, 1, iSize.iHeight );
+ ((CSingleParamControl *)iControl)->SetCaption( caption );
+}
+
+
+//=============================================================================
+void CResizeControl::ComputeSizeAndScale()
+{
+ // Compute current image size and scale
+ TReal ar = (TReal)iOrigSize.iWidth / (TReal)iOrigSize.iHeight;
+ if ( iOrigSize.iHeight < iOrigSize.iWidth )
+ {
+ iSize.iHeight = iParamArray[ ((CSingleParamControl *)iControl)->Position() ];
+ iSize.iWidth = (TReal)(ar * iSize.iHeight) + 0.5;
+ }
+ else
+ {
+ iSize.iWidth = iParamArray[ ((CSingleParamControl *)iControl)->Position() ];
+ iSize.iHeight = (TReal)(iSize.iWidth / ar) + 0.5;
+
+ }
+
+ iSysPars->Scale() =
+ (TReal)iSize.iHeight /
+ (TReal)((iSysPars->ViewPortRect().iBr.iY -
+ iSysPars->ViewPortRect().iTl.iY));
+}
+
+//=============================================================================
+void CResizeControl::ComputeImageSizes()
+{
+
+ const TSize KQSXGASize(2592, 1944);
+ const TSize KQXGASize(2048, 1536);
+ const TSize KUXGASize(1600, 1200);
+ const TSize KSXGASize(1280, 960);
+ const TSize KSVGASize(800, 600);
+ const TSize KVGASize(640, 480);
+ const TSize KQVGASize(320, 240);
+
+#ifdef RESIZE_CIF_SIZES_SUPPORTED
+ const TSize KCIFSize(352, 288);
+ const TSize KQCIFSize(176, 144);
+ const TSize KSubQCIFSize(128, 96);
+#endif
+
+#ifdef RESIZE_CIF_SIZES_SUPPORTED
+ PopulateParamArray(KSubQCIFSize);
+ PopulateParamArray(KQCIFSize);
+#endif
+
+ PopulateParamArray(KQVGASize);
+
+#ifdef RESIZE_CIF_SIZES_SUPPORTED
+ PopulateParamArray(KCIFSize);
+#endif
+
+ PopulateParamArray(KVGASize);
+ PopulateParamArray(KSVGASize);
+ PopulateParamArray(KSXGASize);
+ PopulateParamArray(KUXGASize);
+ PopulateParamArray(KQSXGASize);
+
+ // Landscape
+ if (iOrigSize.iHeight < iOrigSize.iWidth)
+ {
+ iParamArray.Append(iOrigSize.iHeight);
+ }
+ else
+ {
+ iParamArray.Append(iOrigSize.iWidth);
+ }
+}
+
+//=============================================================================
+void CResizeControl::PopulateParamArray(const TSize& aTargetSize )
+{
+
+ TReal origRatio = 0.0;
+ if (iOrigSize.iWidth < iOrigSize.iHeight)
+ {
+ origRatio = (TReal)iOrigSize.iHeight / iOrigSize.iWidth;
+ }
+ else
+ {
+ origRatio = (TReal)iOrigSize.iWidth / iOrigSize.iHeight;
+
+ }
+
+ TReal targetRatio = (TReal)aTargetSize.iWidth / aTargetSize.iHeight;
+
+ if (aTargetSize.iWidth < iOrigSize.iWidth && aTargetSize.iHeight < iOrigSize.iHeight)
+ {
+
+ // Landscape
+ if (iOrigSize.iHeight < iOrigSize.iWidth)
+ {
+ if (origRatio > targetRatio)
+ {
+ TInt h = (TReal)(aTargetSize.iWidth * iOrigSize.iHeight) / iOrigSize.iWidth + 0.5;
+
+ if (h > KMinDimension)
+ {
+ iParamArray.Append(h);
+ }
+
+
+ }
+ else
+ {
+ iParamArray.Append(aTargetSize.iHeight);
+
+ }
+ }
+ // Portrait
+ else
+ {
+ if (origRatio > targetRatio)
+ {
+ TInt w = (TReal)(aTargetSize.iWidth * iOrigSize.iWidth) / iOrigSize.iHeight + 0.5;
+
+ if (w > KMinDimension)
+ {
+ iParamArray.Append(w);
+ }
+ }
+ else
+ {
+ iParamArray.Append(aTargetSize.iHeight);
+
+ }
+ }
+ }
+}
+
+//=============================================================================
+void CResizeControl::ParamOperation (const TParamOperation aOperation)
+{
+ switch (aOperation)
+ {
+ case EParamOperationSubtract:
+ case EParamOperationAdd:
+ {
+ ComputeSizeAndScale();
+
+ // Format the resolutions to caption text
+ TBuf< KMaxCaptionLength > caption_temp;
+ TBuf< KMaxCaptionLength > caption;
+ StringLoader::Format( caption_temp, (*iParameters)[KResizeHSTitleIndex], 0, iSize.iWidth );
+ StringLoader::Format( caption, caption_temp, 1, iSize.iHeight );
+ ((CSingleParamControl *)iControl)->SetCaption( caption );
+
+ break;
+ }
+ case EParamOperationDefault:
+ {
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+}
+
+TReal CResizeControl::GetParam () const
+{
+ return 0;
+}
+
+void CResizeControl::ShowPopupNote ()
+ {
+ if (iOrigSize != iSize)
+ {
+ // Read resource
+ TFileName resourcefile;
+ resourcefile.Append(KPgnResourcePath);
+ resourcefile.Append(KPgnResourceFile);
+ User::LeaveIfError( CompleteWithAppPath( resourcefile ) );
+
+ // Get reference to application file session
+ RFs & fs = CEikonEnv::Static()->FsSession();
+
+ // Implementation of RConeResourceLoader uses BaflUtils::NearestLanguageFile
+ // to search for a localised resource in proper search order
+ RConeResourceLoader resLoader( *CEikonEnv::Static() );
+ resLoader.OpenL ( resourcefile );
+ CleanupClosePushL(resLoader);
+
+ TBuf<256> readbuf;
+ CEikonEnv::Static()->ReadResourceAsDes16L(readbuf, R_SIE_RESIZE_RESOLUTION_CHANGED);
+ CleanupStack::PopAndDestroy(); // resLoader
+
+
+ CAknGlobalNote * globalnote = CAknGlobalNote::NewLC();
+ globalnote->ShowNoteL (EAknGlobalConfirmationNote, readbuf);
+ CleanupStack::PopAndDestroy(); // globalnote
+ }
+ }
+
+
+// End of File