imageeditor/plugins/FramePlugin/src/ImageEditorFrameControl.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/plugins/FramePlugin/src/ImageEditorFrameControl.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,636 @@
+/*
+* 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 <fbs.h>
+#include <f32file.h>
+#include <badesca.h>
+#include <gdi.h>
+#include <eikenv.h>
+#include <bitdev.h>
+#include <bautils.h>
+
+#include <aknview.h>
+#include <aknutils.h>
+#include <ConeResLoader.h>
+
+#ifdef RD_TACTILE_FEEDBACK 
+#include <touchfeedback.h>
+#endif /* RD_TACTILE_FEEDBACK  */
+
+#include "ImageEditorUI.hrh"
+#include "ImageEditorPluginBase.hrh"
+#include "Frame.hrh"
+#include "PluginInfo.h"
+#include "ImageEditorError.h"
+#include "ResolutionUtil.h"
+#include <frame.rsg>
+
+#include "ImageEditorFrameControl.h"
+#include "ImageEditorFramePlugin.h"
+#include "ImageEditorFramePlugin.pan"
+
+//#include "platform_security_literals.hrh"
+
+
+//	CONSTANTS
+const TInt KCurrentFrameIndex           = 1;
+const TInt KFrameChangeThreshold        = 30;
+const TInt KDirectionChangeThreshold    = 7;
+
+_LIT (KPgnResourceFile, "frame.rsc");
+_LIT (KFrameWild, "*.mbm");
+
+//=============================================================================
+CImageEditorFrameControl * CImageEditorFrameControl::NewL (
+	const TRect &		aRect,
+	CCoeControl	*		aParent
+	)
+{
+    CImageEditorFrameControl * self = new (ELeave) CImageEditorFrameControl;
+    CleanupStack::PushL (self);
+    self->ConstructL (aRect, aParent);
+    CleanupStack::Pop ();   // self
+    return self;
+}
+
+//=============================================================================
+CImageEditorFrameControl::CImageEditorFrameControl () :
+iState (EFrameControlStateMin)
+{
+    
+}
+
+//=============================================================================
+CImageEditorFrameControl::~CImageEditorFrameControl ()
+{
+    iMultiplicities.Close();
+
+    if (iFrameFileArray)
+        {
+        iFrameFileArray->Reset();
+        delete iFrameFileArray;
+        iFrameFileArray = NULL;
+        }
+    iEditorView = NULL;
+    iItem = NULL;
+}
+
+//=============================================================================
+void CImageEditorFrameControl::ConstructL (
+	const TRect &		/*aRect*/,
+	CCoeControl	*		aParent
+	)
+{
+
+	//	Set parent window
+	SetContainerWindowL (*aParent);
+   	
+   	iFrameFileArray = new (ELeave) CDesCArrayFlat (8);
+
+#ifdef RD_TACTILE_FEEDBACK 
+    iTouchFeedBack = MTouchFeedback::Instance();
+#endif /* RD_TACTILE_FEEDBACK  */
+    
+	//	Activate control
+    ActivateL();
+    
+    EnableDragEvents();
+}
+
+//=============================================================================
+void CImageEditorFrameControl::SetView (CAknView * aView)
+{
+    iEditorView = aView;
+}
+
+//=============================================================================
+void CImageEditorFrameControl::SetSelectedUiItemL (CPluginInfo * aItem)
+{
+    iItem = aItem;
+}
+
+//=============================================================================
+void CImageEditorFrameControl::PrepareL ()
+{
+	iState = EFrameControlStateInitializing;
+
+    //	Find frames
+    FindFramesL();
+
+	//	Select the first frame to be drawn
+    iCurrentFrameIndex = 0;
+    SetNaviPaneTextL();
+    
+    //	Load the first frame synchronously to avoid timing problems
+    SelectFrameL();
+    
+    iState = EFrameControlStateIdle;
+}
+
+//=============================================================================
+TKeyResponse CImageEditorFrameControl::OfferKeyEventL (
+    const TKeyEvent &   aKeyEvent,
+    TEventCode          aType
+    )
+{
+    TKeyResponse response = EKeyWasNotConsumed;
+
+    //  If busy, do not handle anything
+    if ( iState < EFrameControlStateIdle )
+    {
+        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;
+			}
+		}
+    }
+    //  We handle only event keys
+    else if (EEventKey == aType)
+    {
+
+		TBool rotated = CResolutionUtil::Self()->GetLandscape();
+
+		switch (aKeyEvent.iCode)
+		{
+
+			// Just consume these keys
+		    case 0x31: // 1
+		    case 0x33: // 3
+		    case 0x35: // 5
+            case 0x37: // 7
+		    case 0x39: // 9
+		    case 0x2a: // *
+		    case 0x23: // #
+			case EKeyDownArrow:
+			case EKeyUpArrow:
+			case EStdKeyIncVolume: // zoom in key
+			case EStdKeyDecVolume: // zoom out key
+			{
+				response = EKeyWasConsumed;
+                break;
+			}
+
+		    case 0x32: // 2
+			{
+				if (rotated)
+				{
+                	//  Switch to next frame
+	                NaviLeftL();					
+				}
+				response = EKeyWasConsumed;	
+                break;
+			}
+			case 0x38: // 8
+			{
+				if (rotated)
+				{
+                	//  Switch to next frame
+	                NaviRightL();					
+				}
+				response = EKeyWasConsumed;	
+                break;
+			}
+
+   		    case 0x34:   		    
+   		    {
+  				if (!rotated)
+				{
+		            //  Switch to previous frame
+		            NaviLeftL();
+				}
+				response = EKeyWasConsumed;
+                break;
+			}
+
+		    case 0x36:
+			{
+				if (!rotated)
+				{
+                	//  Switch to next frame
+	                NaviRightL();					
+				}
+				response = EKeyWasConsumed;	
+                break;
+			}
+
+			
+			case EKeyRightArrow:
+			{
+				NaviRightL();					
+				response = EKeyWasConsumed;	
+                break;			
+			}	           
+
+            case EKeyLeftArrow:
+            {
+            	NaviLeftL();					
+				response = EKeyWasConsumed;	
+                break;			
+            }
+            
+            case EKeyOK:
+            case EKeyEnter:
+            {
+				iEditorView->HandleCommandL (EImageEditorApplyPlugin);
+                response = EKeyWasConsumed;
+                break;
+            }
+
+			default:
+			{
+				break;
+			}
+		}
+	}
+    return response;
+}
+
+//=============================================================================
+void CImageEditorFrameControl::SizeChanged()
+{
+
+}
+
+//=============================================================================
+TDesC & CImageEditorFrameControl::GetParam ()
+{
+	return iParameter;
+}
+
+//=============================================================================
+void CImageEditorFrameControl::HandlePluginCommandL (const TInt aCommand)
+{
+    switch (aCommand) 
+    {
+        case EPgnSoftkeyIdCancel:
+        {
+            iEditorView->HandleCommandL (EImageEditorCancelPlugin);
+            break;
+        }
+        case EPgnSoftkeyIdOk:
+        {
+            iEditorView->HandleCommandL (EImageEditorApplyPlugin);
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+}
+
+//=============================================================================
+TInt CImageEditorFrameControl::GetSoftkeyIndexL()
+{
+    return 0;
+}
+
+//=============================================================================
+TPtrC CImageEditorFrameControl::GetNaviPaneTextL (
+    TBool& aLeftNaviPaneScrollButtonVisibile, 
+    TBool& aRightNaviPaneScrollButtonVisible )
+{
+    if ( iFrameCount > 1)
+    {
+        aLeftNaviPaneScrollButtonVisibile = ETrue;
+        aRightNaviPaneScrollButtonVisible = ETrue;
+    }
+    else
+    {
+        aLeftNaviPaneScrollButtonVisibile = EFalse;
+        aRightNaviPaneScrollButtonVisible = EFalse;
+    }
+    return iNaviPaneText;
+}
+
+//=============================================================================
+void CImageEditorFrameControl::Draw (const TRect & aRect) const
+{
+    CPreviewControlBase::DrawPreviewImage (aRect);
+}
+
+//=============================================================================
+void CImageEditorFrameControl::NaviRightL()
+{
+    LOG(KFramePluginLogFile, "CImageEditorFrameControl::NaviRightL()");
+
+	// Switch to the next frame bitmap
+    iCurrentFrameIndex++;  
+    if (iCurrentFrameIndex > iFrameCount - 1 )
+    {
+        // loop back to first
+        iCurrentFrameIndex = 0;
+    }
+    SetNaviPaneTextL();
+    SelectFrameL();
+}
+
+//=============================================================================
+void CImageEditorFrameControl::NaviLeftL()
+{
+    LOG(KFramePluginLogFile, "CImageEditorFrameControl::NaviLeftL()");
+
+	// Switch to the previous frame bitmap
+    iCurrentFrameIndex--;
+    if ( iCurrentFrameIndex < 0 )
+    {
+        // loop to last
+        iCurrentFrameIndex = iFrameCount - 1;
+    }
+    SetNaviPaneTextL();
+    SelectFrameL();
+}
+
+//=============================================================================
+void CImageEditorFrameControl::FindFramesL()
+{
+    LOG(KFramePluginLogFile, "CImageEditorFrameControl::FindFrames()");
+
+    //	Read resource
+	TFileName resourcefile;
+	resourcefile.Append(KPgnResourcePath);
+	resourcefile.Append(KPgnResourceFile);
+
+    User::LeaveIfError( CompleteWithAppPath( resourcefile ) );
+
+    RConeResourceLoader resLoader( *ControlEnv() );
+    resLoader.OpenL ( resourcefile );
+    CleanupClosePushL(resLoader);
+
+    CDesCArrayFlat* array = ControlEnv()->ReadDesCArrayResourceL(R_FRAME_DIRS);
+    CleanupStack::PushL(array);
+
+    TFileName pathList;
+    _LIT(KPathSeparator, ";");
+
+    for (TInt k = 0; k < array->Count(); ++k)
+        {
+        TPtrC path = (*array)[k];
+        LOGFMT(KFramePluginLogFile, "\tSearch path: %S", &path);
+        pathList.Append(path);
+        pathList.Append(KPathSeparator);
+        }
+
+	//  Create a file finder
+    TFindFile fileFinder (ControlEnv()->FsSession()); 
+    CDir * fileList = 0; 
+
+    //  Find files by wild card and directory
+    TInt err = fileFinder.FindWildByPath (
+		KFrameWild, 
+		&pathList, 
+		fileList
+		);
+
+    User::LeaveIfError(err);
+
+    CleanupStack::PopAndDestroy(2); // resLoader, array
+
+	//	Go through all drives
+    while (err == KErrNone)
+    {
+        CleanupStack::PushL (fileList);
+
+		//	Check all plug-in candidates
+        for (TInt i = 0; i < fileList->Count(); ++i) 
+        {
+
+            //	Create a full file name for a frame file
+            TParse fullentry;
+            TPtrC name = (*fileList)[i].iName;
+            const TDesC* related = &(fileFinder.File());
+            fullentry.Set ( name, related, 0 );
+            TPtrC fullname (fullentry.FullName());
+
+            //  Store frame file names
+            iFrameFileArray->AppendL (fullname);
+
+            //  Check the amount of frames 
+            TInt err_bmp = KErrNone;
+            TInt err_bmp_mask = KErrNone;
+            TInt j = 0;
+            while (KErrNone == err_bmp && KErrNone == err_bmp_mask)
+            {
+                CFbsBitmap * tmp = new (ELeave) CFbsBitmap;
+                CleanupStack::PushL (tmp);
+                err_bmp = tmp->Load (fullname, j);
+                CleanupStack::PopAndDestroy(); // tmp
+
+                tmp = new (ELeave) CFbsBitmap;
+                CleanupStack::PushL (tmp);
+                err_bmp_mask = tmp->Load (fullname, j + 1);
+                CleanupStack::PopAndDestroy(); // tmp
+
+                if (KErrNone == err_bmp && KErrNone == err_bmp_mask)
+                {
+                    ++iFrameCount;
+                }
+                j += 2;
+            }
+            User::LeaveIfError( iMultiplicities.Append (j - 1) );
+        }
+    
+		CleanupStack::PopAndDestroy(); /// fileList
+
+		//	Try once again
+        err = fileFinder.FindWild (fileList);
+
+    }
+
+}
+
+//=============================================================================
+void CImageEditorFrameControl::SelectFrameL ()
+{
+    LOG(KFramePluginLogFile, "CImageEditorFrameControl::SelectFrameL ()");
+
+    //  Select frame
+    TInt    file = 0;
+    TInt    frame = 0;
+    TInt    index = 0;
+    TBool   bContinue = ETrue;
+    for (TInt i = 0 ; (i < iFrameFileArray->Count()) && bContinue; ++i)
+    {
+        for (TInt j = 0 ; j < iMultiplicities[i]; j += 2)
+        {
+            if (index == iCurrentFrameIndex)
+            {
+                file = i;
+                frame = j;
+                bContinue = EFalse;
+                break;
+            }
+            ++index;
+        }
+    }
+
+	iParameter.Copy ( _L("file \""));
+	iParameter.Append ( (*iFrameFileArray)[file] );
+	iParameter.Append ( _L("\" frame ") );
+	iParameter.AppendNum ( frame );
+	iParameter.Append ( _L(" mask ") );
+	iParameter.AppendNum ( frame + 1 );
+	iParameter.Append ( _L(" load"));
+
+	iEditorView->HandleCommandL (EImageEditorCmdRender);
+   
+}
+
+//=============================================================================
+void CImageEditorFrameControl::SetNaviPaneTextL()
+{
+    // Update the navi pane text with the frame index and count
+    // (make sure this is not called before the view exists)
+    if ( iEditorView && iItem )
+    {
+        // .loc file parameter format strings
+        _LIT(KParameter1, "%0N");
+        _LIT(KParameter2, "%1N");
+
+        // Getting string from resources
+        TPtrC ptr = iItem->Parameters()[KCurrentFrameIndex]; 
+
+        // 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 current frame
+        // index and frame count
+	    iNaviPaneText.Append(ptr.Left(pos1));
+        iNaviPaneText.AppendNum (  iCurrentFrameIndex + 1 );
+        iNaviPaneText.Append (ptr.Mid(pos1 + 3, pos2 - (pos1 + 3)));
+        iNaviPaneText.AppendNum ( iFrameCount );
+	    iNaviPaneText.Append (ptr.Mid(pos2 + 3));
+        
+        AknTextUtils::LanguageSpecificNumberConversion  (  iNaviPaneText );
+        
+        iEditorView->HandleCommandL (EImageEditorUpdateNavipane);
+    }
+}
+
+//=============================================================================
+void CImageEditorFrameControl::HandlePointerEventL(
+                                        const TPointerEvent &aPointerEvent )
+    {        
+    if( AknLayoutUtils::PenEnabled() )
+		{	
+			
+		switch( aPointerEvent.iType )
+			{
+			case TPointerEvent::EButton1Down:
+				{
+                // Initialize change values
+                iPreviousChange = ENoDirection;
+			    iOneDirectionalChange = ETrue;
+		        // Store positions
+		        iPointerPosition = aPointerEvent.iPosition;
+                iInitialPointerPosition = iPointerPosition;
+                
+#ifdef RD_TACTILE_FEEDBACK
+				if ( iTouchFeedBack )
+					{
+					iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic );
+					RDebug::Printf( "ImageEditor::ImageEditorFrameControl: ETouchFeedback" );
+					}
+#endif /* RD_TACTILE_FEEDBACK  */
+                
+				break;
+				}
+			case TPointerEvent::EDrag:
+				{
+				// Moving direction is from right to left
+				// KDirectionChangeThreshold is here instead of 0, because 
+				// touch screen tends to give drag events though finger is
+				// kept still on the screen.
+				if( ( iPointerPosition.iX - aPointerEvent.iPosition.iX ) > 
+				                                KDirectionChangeThreshold )
+				    {
+				    if( iPreviousChange == ENextFrame )
+				        {
+				        iOneDirectionalChange = EFalse;
+				        }
+				    iPreviousChange = EPreviousFrame;
+				    }				   
+				// Moving direction is from left to right    
+				else if(( aPointerEvent.iPosition.iX - iPointerPosition.iX ) > 
+				                                KDirectionChangeThreshold )
+				    {
+				    if (iPreviousChange == EPreviousFrame)
+				        {
+				        iOneDirectionalChange = EFalse;
+				        }
+				    iPreviousChange = ENextFrame;
+				    }
+				
+				// store current pen position    
+			    iPointerPosition = aPointerEvent.iPosition;
+				break;		
+				}
+			case TPointerEvent::EButton1Up:
+			    {			    
+			    iFinalPointerPosition = aPointerEvent.iPosition;			    
+			    // pen has been moved only one direction (x-wise) 
+			    // after button down event
+			    if( iOneDirectionalChange )
+			        {
+			        TInt xChange = iFinalPointerPosition.iX - 
+			                       iInitialPointerPosition.iX;
+                    TInt yChange = iFinalPointerPosition.iY - 
+			                       iInitialPointerPosition.iY;
+			                       
+			        // check if threshold value has been exceeded and that
+			        // x directional change is bigger than y directional
+			        if (  xChange > KFrameChangeThreshold  &&
+			              Abs( xChange ) > Abs ( yChange  ) )
+    			        {
+    			        NaviLeftL();
+    			        }
+			        else if( xChange < ( -KFrameChangeThreshold ) &&
+			                 Abs( xChange ) > Abs( yChange ) )
+    			        {
+    			        NaviRightL();
+    			        }
+			        }
+			        			    			        
+			    break;
+			    }
+			}
+		}
+    }
+// End of File