--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DirectPrint/DirectPrintApp/ui/src/directprintpreviewcontrol.cpp Wed Mar 31 00:04:55 2010 +0900
@@ -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