DirectPrint/DirectPrintApp/ui/src/directprintpreviewcontrol.cpp
changeset 19 2275db202402
parent 11 613a5ff70823
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DirectPrint/DirectPrintApp/ui/src/directprintpreviewcontrol.cpp	Tue May 11 14:10:02 2010 +0800
@@ -0,0 +1,500 @@
+/*
+* Copyright (c) 2010 Kanrikogaku Kenkyusho, Ltd.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Kanrikogaku Kenkyusho, Ltd. - Initial contribution
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+// INCLUDE FILES
+#include <coemain.h>
+#include <barsread.h>
+#include <DirectPrintApp.rsg>
+#include <prninf.h>
+#include <prnsetup.h>
+#include <gdi.h>
+#include <prnprev.h>
+#include <eikenv.h>
+#include <gulbordr.h>					// TGulBorder
+#include <e32cmn.h>
+
+#include "directprintapp.pan"
+#include "directprintapp.hrh"
+#include "directprintpreviewcontrol.h"
+
+const TInt KFirstPage=0;
+
+const TInt KDraggingAccepted = 10;
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDirectPrintPreviewControl* CDirectPrintPreviewControl::NewL(const CCoeControl* aParent)
+	{
+	CDirectPrintPreviewControl* self = CDirectPrintPreviewControl::NewLC(aParent);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDirectPrintPreviewControl* CDirectPrintPreviewControl::NewLC(const CCoeControl* aParent)
+	{
+	CDirectPrintPreviewControl* self = new(ELeave) CDirectPrintPreviewControl();
+	CleanupStack::PushL(self);
+	self->ConstructL(aParent);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::CDirectPrintPreviewControl()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CDirectPrintPreviewControl::CDirectPrintPreviewControl()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::~CDirectPrintPreviewControl()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CDirectPrintPreviewControl::~CDirectPrintPreviewControl()
+	{
+	Window().SetPointerGrab(EFalse);
+	delete iPreview;
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDirectPrintPreviewControl::ConstructL(const CCoeControl* aParent)
+	{
+	// Create a window for this application view
+	if (aParent)
+		{
+		CreateBackedUpWindowL(*aParent->DrawableWindow(), EGray4);
+		}
+	else
+		{
+		CreateBackedUpWindowL((RWindowTreeNode&)iCoeEnv->RootWin(), EGray4);
+		}
+
+	EnableDragEvents();
+	Window().SetPointerGrab(ETrue);
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::SetPreviewImageObserver()
+//
+// -----------------------------------------------------------------------------
+//
+void CDirectPrintPreviewControl::SetPreviewImageObserver(MPrintProcessObserver* aObserver)
+	{
+	__ASSERT_DEBUG(iPreview,Panic(EDirectPrintNullPointer));
+	iPreview->SetObserver(*aObserver);
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::CountComponentControls()
+// Called by framework
+// -----------------------------------------------------------------------------
+//
+TInt CDirectPrintPreviewControl::CountComponentControls() const
+	{
+//	return(2);
+	return(0);
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::ComponentControl()
+// Called by framework
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CDirectPrintPreviewControl::ComponentControl( TInt aIndex ) const
+	{
+	CCoeControl* control=NULL;
+	switch (aIndex)
+		{
+	case 0:
+//		control=iButton[0];
+		break;
+	case 1:
+//		control=iButton[1];
+		break;
+		}
+	return(control);
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::WriteInternalStateL()
+//
+// -----------------------------------------------------------------------------
+//
+#ifndef _DEBUG
+void CDirectPrintPreviewControl::WriteInternalStateL(RWriteStream& /*aWriteStream*/) const
+	{
+	}
+#else
+void CDirectPrintPreviewControl::WriteInternalStateL(RWriteStream& aWriteStream) const
+	{
+	CEikBorderedControl::WriteInternalStateL(aWriteStream);
+	}
+#endif
+
+// -----------------------------------------------------------------------------
+// CDirectPrintAppAppView::HandlePointerEventL()
+// Called by framework to handle pointer touch events.
+// Note: although this method is compatible with earlier SDKs,
+// it will not be called in SDKs without Touch support.
+// -----------------------------------------------------------------------------
+//
+void CDirectPrintPreviewControl::HandlePointerEventL(
+		const TPointerEvent& aPointerEvent)
+	{
+	const TRect rect=Rect();
+	if( !rect.Contains(aPointerEvent.iPosition) )
+		{
+		return;
+		}
+
+	switch ( aPointerEvent.iType )
+		{
+		case TPointerEvent::EButton1Down:
+			{
+			iPointerDownPos = aPointerEvent.iPosition;
+			}
+			break;
+		case TPointerEvent::EButton1Up:
+		case TPointerEvent::EDrag:
+			{
+			TInt x =  aPointerEvent.iPosition.iX - iPointerDownPos.iX;
+			TInt y = aPointerEvent.iPosition.iY - iPointerDownPos.iY;
+			if (Abs(x) > KDraggingAccepted || Abs(y) > KDraggingAccepted)
+				{
+				TPoint newPos;
+				TInt maxWidth = iDisplayRect.Width() - rect.Width();
+				TInt maxHeight = iDisplayRect.Height() - rect.Height();
+				newPos.iX = Min(iDisplayPoint.iX + x, maxWidth);
+				if (newPos.iX <= (maxWidth*-1))
+					newPos.iX = (maxWidth*-1);
+				newPos.iY = Min(iDisplayPoint.iY + y, maxHeight);
+				if (newPos.iY <= (maxHeight*-1))
+					newPos.iY = (maxHeight*-1);
+				iDisplayPoint = newPos;
+				iPointerDownPos = aPointerEvent.iPosition;
+				DrawNow();
+				}
+			}
+			break;
+		default:
+			break;
+		}
+	}
+
+void CDirectPrintPreviewControl::ActivateL()
+	{
+	DrawButtons();
+	CCoeControl::ActivateL();
+	}
+
+TCoeInputCapabilities CDirectPrintPreviewControl::InputCapabilities() const
+	{
+	return TCoeInputCapabilities(TCoeInputCapabilities::ENavigation);
+	}
+
+void CDirectPrintPreviewControl::InitializeFormat(
+										CPrintSetup& aPrintSetup,
+										MPageRegionPrinter& aBodyPrinter,
+										TPrintPreviewFormat& aFormat,
+										TInt& aNumPagesInDoc,
+										TInt& aFirstPageToDisplay,
+										TInt aNumPagesToView,
+										CPrintPreviewImage::TMarginState& aMarginState)
+	{
+	iPrintSetup=&aPrintSetup;
+	iBodyPrinter=&aBodyPrinter;
+	iPrintPreviewFormat=&aFormat;
+	iFirstPageToDisplay=&aFirstPageToDisplay;
+	iNumPagesInDoc=aNumPagesInDoc;
+	iNumPagesToView=aNumPagesToView;
+	iMarginState=aMarginState;
+	}
+
+void CDirectPrintPreviewControl::SetNumBands(TInt aNumBands)
+	{
+	iNumBands=aNumBands;
+	if (iPreview)
+		{
+		iPreview->SetNumBands(aNumBands);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::SizeChanged()
+// Called by framework when the view size is changed.
+// -----------------------------------------------------------------------------
+//
+void CDirectPrintPreviewControl::SizeChanged()
+	// can't recover if CPrintPreviewImage::NewL() fails !!
+	{
+	iPreviewDraw=ETrue;
+
+	// set zoom level 
+	SetZoomLevelAndDispalyRect(EPreviewZoomLevel1);
+
+	// create CPrintPreviewImage object
+	TRAP_IGNORE(CreatePreviewImageL());
+	}
+
+// -----------------------------------------------------------------------------
+// CDirectPrintPreviewControl::Draw()
+// Draws the display.
+// -----------------------------------------------------------------------------
+//
+void CDirectPrintPreviewControl::Draw(const TRect& aRect) const
+	{
+	if (!iPreviewDraw)
+		return;
+//	DrawButtons();
+	CWindowGc& gc=SystemGc();
+	iBorder.Draw(gc,Rect());
+	gc.Clear();
+	gc.SetPenStyle(CGraphicsContext::ENullPen);
+	gc.SetBrushColor(KRgbWhite);
+	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+//	TRect rectAboveButton(TPoint(iDisplayRect.iTl.iX-KScrollButtonWidth,iDisplayRect.iTl.iY),TSize(KScrollButtonWidth,iDisplayRect.Height()-(iButton[0]->IsVisible()? KScrollButtonWidth : 0)));
+//	gc.DrawRect(rectAboveButton);
+//	rectAboveButton=(TPoint(iDisplayRect.iTl.iX-KScrollButtonWidth,iDisplayRect.iTl.iY),TSize(KScrollButtonWidth,iDisplayRect.Height()-(iButton[1]->IsVisible()? KScrollButtonWidth : 0)));
+//	rectAboveButton.Move(iDisplayRect.Width()+KScrollButtonWidth+1,1); // why are the 1s needed???
+//	gc.DrawRect(rectAboveButton);
+	gc.SetPenStyle(CGraphicsContext::ESolidPen);
+	CONST_CAST(CDirectPrintPreviewControl*,this)->DrawPreview(aRect);  // cast away constness
+	}
+
+void CDirectPrintPreviewControl::SetDrawFlag(TBool aDraw)
+	{
+	iPreviewDraw=aDraw;
+	}
+
+TBool CDirectPrintPreviewControl::DrawFlag()
+	{
+	return iPreviewDraw;
+	}
+
+void CDirectPrintPreviewControl::SetFormatAndDrawL(TInt& aFirstPageToDisplay,TInt& aNumPagesToView)
+	{
+	iPreview->FormatL(iNumPagesInDoc,aFirstPageToDisplay,aNumPagesToView);
+	*iFirstPageToDisplay=aFirstPageToDisplay;
+	iNumPagesToView=aNumPagesToView;
+	DrawButtons();
+	DrawNow();
+	}
+
+void CDirectPrintPreviewControl::SetMarginAndDrawL(CPrintPreviewImage::TMarginState aMarginState)
+	{
+	iPreview->SetMargins(aMarginState);
+	iMarginState=aMarginState;
+	DrawNow();
+	}
+
+void CDirectPrintPreviewControl::SetNumPagesInDoc(TInt aNumPagesInDoc,TInt aFirstPageToDisplay,TInt aNumPagesToView)
+	{
+	iNumPagesInDoc=aNumPagesInDoc;
+	*iFirstPageToDisplay=aFirstPageToDisplay;
+	iNumPagesToView=aNumPagesToView;
+	}
+
+void CDirectPrintPreviewControl::DrawPreview(const TRect& aRect)
+	{
+	TRAPD(err,iPreview->DrawL(iDisplayPoint,aRect));
+	if (err)
+		{
+		SystemGc().Clear(iDisplayRect);
+		CEikonEnv::Static()->NotifyIdleErrorWhileRedrawing(err);
+		}
+	}
+
+TKeyResponse CDirectPrintPreviewControl::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
+	{
+	TInt newFirstPageToDisplay=*iFirstPageToDisplay;
+	switch (aKeyEvent.iCode)
+		{
+	case EKeyLeftArrow:
+	case EKeyPageUp:
+		newFirstPageToDisplay--;
+		break;
+	case EKeyRightArrow:
+	case EKeyPageDown:
+		newFirstPageToDisplay++;
+		break;
+	case EKeyHome:
+		newFirstPageToDisplay=KFirstPage;
+		break;
+	case EKeyEnd:
+		newFirstPageToDisplay=iNumPagesInDoc-iNumPagesToView;
+		break;
+	default:
+		return(EKeyWasNotConsumed);
+
+		}
+	SwitchFirstPageToDisplayL(newFirstPageToDisplay);
+	return(EKeyWasConsumed);
+	}
+
+void CDirectPrintPreviewControl::SwitchFirstPageToDisplayL(TInt& aNewFirstPageToDisplay)
+	{
+	if (aNewFirstPageToDisplay<KFirstPage)
+		aNewFirstPageToDisplay=KFirstPage;
+	if (aNewFirstPageToDisplay>iNumPagesInDoc-iNumPagesToView)
+		aNewFirstPageToDisplay=iNumPagesInDoc-iNumPagesToView;
+	if (aNewFirstPageToDisplay!=*iFirstPageToDisplay)
+		SetFormatAndDrawL(aNewFirstPageToDisplay,iNumPagesToView);
+	}
+
+void CDirectPrintPreviewControl::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
+	{
+	if (aEventType!=EEventStateChanged)
+		return;
+	TInt newFirstPageToDisplay=*iFirstPageToDisplay;
+//	if (aControl==iButton[0])
+//		newFirstPageToDisplay--;
+//	else if (aControl==iButton[1])
+//		newFirstPageToDisplay++;
+	SwitchFirstPageToDisplayL(newFirstPageToDisplay);
+	}
+
+void CDirectPrintPreviewControl::DrawButtons() const
+	{
+	if (iNumPagesToView==iNumPagesInDoc)
+		{
+//		iButton[1]->MakeVisible(EFalse);
+//		iButton[0]->MakeVisible(EFalse);
+		return;
+		}
+//	TBool leftvisible=ETrue;
+//	TBool rightvisible=ETrue;
+//	if (*iFirstPageToDisplay==KFirstPage)
+//		leftvisible=EFalse;
+//	else
+//		{
+//		if (*iFirstPageToDisplay>=iNumPagesInDoc-iNumPagesToView)
+//			rightvisible=EFalse;
+//		}
+//	iButton[0]->MakeVisible(leftvisible);
+//	iButton[1]->MakeVisible(rightvisible);
+////	iButton[0]->DrawNow();
+////	iButton[1]->DrawNow();
+	}
+
+
+// for zoom
+void CDirectPrintPreviewControl::SetZoomLevel(TInt /*aZoomLevel*/)
+	{
+	SetZoomLevelAndDispalyRect(iZoomLevel);
+	}
+
+TInt CDirectPrintPreviewControl::GetZoomLebel()
+	{
+	return (TInt)iZoomLevel;
+	}
+
+void CDirectPrintPreviewControl::IncrementZoomLevel()
+	{
+	TInt zoom = iZoomLevel + 1;
+	if (zoom >= EPreviewZoomLevel1
+	 && zoom < EPreviewZoomLevelMax)
+		{
+		SetZoomLevelAndDispalyRect(zoom);
+		TRAPD(err, CreatePreviewImageL());
+		if (err == KErrNone)
+			{
+			DrawNow();
+			}
+		}
+	}
+
+void CDirectPrintPreviewControl::DecrementZoomLevel()
+	{
+	TInt zoom = iZoomLevel - 1;
+	if (zoom >= EPreviewZoomLevel1)
+		{
+		SetZoomLevelAndDispalyRect(zoom);
+		TRAPD(err, CreatePreviewImageL());
+		if (err == KErrNone)
+			{
+			DrawNow();
+			}
+		}
+	}
+
+	// set zoom level 
+void CDirectPrintPreviewControl::SetZoomLevelAndDispalyRect(TInt aZoomLevel)
+	{
+	static const TInt KZoomPercent[EPreviewZoomLevelMax] = {100, 120, 140, 160, 180};
+	TInt oldZoomLevel = iZoomLevel;
+	if (aZoomLevel == EPreviewZoomLevel1)
+		{
+		iDisplayRect = iBorder.InnerRect(Rect());
+		iDisplayPoint = iDisplayRect.iTl;
+		}
+	else
+		{
+		TRect rect(iBorder.InnerRect(Rect()));
+		TSize newSize;
+		newSize.iWidth = (rect.Size().iWidth * KZoomPercent[aZoomLevel] + 5) / KZoomPercent[EPreviewZoomLevel1];
+		newSize.iHeight = (rect.Size().iHeight * KZoomPercent[aZoomLevel] + 5) / KZoomPercent[EPreviewZoomLevel1];
+		iDisplayRect.SetSize(newSize);
+		if (oldZoomLevel != EPreviewZoomLevel1)
+			{
+			TPoint newPos;
+			newPos.iX = Max(0, ((iDisplayPoint.iX  * KZoomPercent[aZoomLevel] + 5) / KZoomPercent[EPreviewZoomLevel1]));
+			newPos.iY = Max(0, ((iDisplayPoint.iY  * KZoomPercent[aZoomLevel] + 5) / KZoomPercent[EPreviewZoomLevel1]));
+			iDisplayPoint = newPos;
+			}
+		}
+	iZoomLevel = aZoomLevel;
+	}
+
+void CDirectPrintPreviewControl::CreatePreviewImageL()
+	{
+	if (iPreview)
+		{
+		delete iPreview;
+		iPreview=NULL;
+		}
+
+	iPreview = CPrintPreviewImage::NewL(*iPrintSetup,
+										*iBodyPrinter,
+										CEikonEnv::Static()->WsSession(),
+										Window(),
+										iDisplayRect.Size(),
+										*iPrintPreviewFormat);
+	iPreview->SetNumBands(iNumBands);
+	iPreview->FormatL(iNumPagesInDoc,*iFirstPageToDisplay,iNumPagesToView);
+	iPreview->SetMargins(iMarginState);
+//	TRect buttonRect(TPoint(iDisplayRect.iTl.iX-KScrollButtonWidth,iDisplayRect.iBr.iY-KScrollButtonWidth),
+//					TSize(KScrollButtonWidth,KScrollButtonWidth));
+//	iButton[0]->SetRect(buttonRect);
+//	buttonRect.Move(iDisplayRect.Width()+KScrollButtonWidth,0);
+//	iButton[1]->SetRect(buttonRect);
+	}
+
+// End of file