textrendering/textformatting/tbox/FRMSCRND.CPP
changeset 32 8b9155204a54
parent 0 1fb32624e06b
child 40 91ef7621b7fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/textformatting/tbox/FRMSCRND.CPP	Fri Jun 04 10:37:54 2010 +0100
@@ -0,0 +1,373 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*
+* Description: 
+*
+*/
+
+
+#include "FRMTVIEW.H"
+#include "FRMCONST.H"
+#include "FORMUTIL.H"
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include "FRMCONST_INTERNAL.H"
+#include "FRMCONST_PARTNER.H"
+#include "TAGMA_INTERNAL.H"
+#endif
+
+RScreenDisplay::RScreenDisplay(TDrawTextLayoutContext* const aDrawTextLayoutContext):
+	iSession(NULL),
+	iGroupWin(NULL),
+	iWin(NULL),
+	iGc(NULL),
+	iDrawTextLayoutContext(aDrawTextLayoutContext),
+	iBackground(KRgbWhite)
+	{
+	}
+
+void RScreenDisplay::Close()
+	//
+	{
+
+	DestroyContexts();
+	}
+
+void RScreenDisplay::Destroy()
+	//
+	{
+
+	Close();
+	delete this;
+	}
+
+void RScreenDisplay::DestroyContexts()
+	//
+	//Destroy the graphics contexts
+	//
+	{
+
+	if (iGc)
+		delete iGc;
+	iGc=NULL;
+	}
+
+void RScreenDisplay::ActivateContext()
+	//
+	{
+	ActivateContext(iGc);
+	iBackground = iDrawTextLayoutContext->iBackgroundColor;
+	const MFormParam* p = MFormParam::Get();
+	FormUtil::LogicalToActualColor(p,iBackground);
+	}
+
+void RScreenDisplay::ActivateContext(CGraphicsContext *aGc)
+	//
+	//Activate a gc on the current window
+	//
+	{
+	
+	//__ASSERT_DEBUG(aGc!=NULL,FormPanic());
+	if (iWin)
+		((CWindowGc *) aGc)->Activate(*iWin);
+	}
+
+void RScreenDisplay::DeactivateContext()
+	//
+	{
+	DeactivateContext(iGc);
+	}
+
+void RScreenDisplay::DeactivateContext(CGraphicsContext *aGc)
+	//
+	//Deactivate a gc on the current window
+	//
+	{
+	
+	//__ASSERT_DEBUG(aGc!=NULL,FormPanic());
+	if (iWin)
+		((CWindowGc *) aGc)->Deactivate();
+	}
+
+void RScreenDisplay::CreateContextL()
+	//
+	//Create and activate the main Graphics Context
+	//
+	{
+	__ASSERT_DEBUG(iGc==NULL,FormPanic(EFGcNotSet));
+	User::LeaveIfError(iGd->CreateBitmapContext(iGc));
+	if (iWin)
+		iDrawTextLayoutContext->SetWindowGc((CWindowGc *)iGc);
+	else
+		iDrawTextLayoutContext->SetBitmapGc(iGc);
+	}
+
+void RScreenDisplay::CreateContextL(CBitmapDevice *aGd)
+	//
+	//Create and activate the main Graphics Context
+	//
+	{
+	CBitmapContext* localGc;
+	localGc=NULL;
+	//__ASSERT_DEBUG(iGc==NULL,FormPanic(EFGcNotSet));
+	User::LeaveIfError(aGd->CreateBitmapContext(localGc));
+	delete iGc;
+	iGc=NULL;
+	iGc=localGc;
+	iGd=aGd;
+	if (iWin)
+		iDrawTextLayoutContext->SetWindowGc((CWindowGc *)iGc);
+	else
+		iDrawTextLayoutContext->SetBitmapGc(iGc);
+	}
+
+void RScreenDisplay::SetWindow(RWindow *aWin)
+	//
+	{
+
+	iWin=aWin;
+	}
+
+void RScreenDisplay::SetGraphicsDeviceL(CBitmapDevice *aGd)
+	//
+	{
+
+	//DestroyContexts();
+	//iGd=aGd;
+	CreateContextL(aGd);
+	}
+
+void RScreenDisplay::SetInvalidRect(const TRect& aRect)
+	//
+	{
+
+	iInvalidRect=aRect;
+	}
+
+void RScreenDisplay::SetInvalidRect(TInt aHeight)
+	//
+	//Set the clipping region to the top or bottom abs(aHeight) pixels of the screen
+	//aHeight<0 ==> bottom of the screen
+	//
+	{
+
+	iInvalidRect=iDrawTextLayoutContext->iViewRect;
+	if (aHeight<0)
+		iInvalidRect.iTl.iY=iInvalidRect.iBr.iY+aHeight;
+	else
+		iInvalidRect.iBr.iY=iInvalidRect.iTl.iY+aHeight;
+	}
+
+void RScreenDisplay::SetInvalidRectHorizontal(TInt aWidth)
+	//
+	//Set the clipping region to the left or right abs(aHeight) pixels of the screen
+	//aWidth<0 ==> right of the screen
+	//
+	{
+
+	iInvalidRect=iDrawTextLayoutContext->TextArea(); 
+	if (aWidth<0)
+		iInvalidRect.iTl.iX=iInvalidRect.iBr.iX+aWidth;
+	else
+		iInvalidRect.iBr.iX=iInvalidRect.iTl.iX+aWidth;
+	}
+
+void RScreenDisplay::SetRects(TUint aRects)
+	//
+	//Set the clipping region to the union of rectangles specified in the enum
+	//
+	{
+
+	iRects=aRects;
+	}
+
+void RScreenDisplay::AddRects(TUint aRects)
+	//
+	{
+
+	iRects|=aRects;
+	}
+
+void RScreenDisplay::SubRects(TUint aRects)
+	//
+	{
+	
+	iRects&=EFClipAllFlags-aRects;
+	}
+
+
+TRect RScreenDisplay::ClippingRect()
+	//
+	{
+
+	TRect clipRect(iDrawTextLayoutContext->iViewRect);
+
+	if (!(iRects&EFClipViewRect))
+		{
+		if (iRects&EFClipTextArea)
+			clipRect=iDrawTextLayoutContext->TextArea();
+		else if (iRects&EFClipLineCursor)
+			clipRect=LineCursorMargin();
+		if (iRects&EFClipExtendedViewRect && iTextLayout)
+			iTextLayout->HighlightExtensions().ExtendRect(clipRect);
+		if (iRects&EFClipExtendedTextArea)
+			{
+			clipRect=iDrawTextLayoutContext->TextArea();
+			if (iTextLayout)
+				iTextLayout->HighlightExtensions().ExtendRect(clipRect);
+			}
+		}
+	if (iRects&EFClipInvalid)
+		clipRect.Intersection(iInvalidRect);
+	return clipRect;
+	}
+
+
+void RScreenDisplay::ResetClippingRect()
+	{
+	TRect clipRect=ClippingRect();
+	iGc->SetClippingRect(clipRect);
+	}
+
+void RScreenDisplay::BlastBitmap(const TPoint& aPoint,const CFbsBitmap* aBitmap,const TRect& aRect)
+	//
+	// Blast bitmap to screen
+	//
+	{
+	iGc->BitBlt(aPoint,aBitmap,aRect);
+	}
+
+void RScreenDisplay::DrawPictureFrame(TFrameOverlay* aPictureFrame,const TRect& aLineRect)
+	//
+	// Draw a frame overlay, using XOR brush. Therefore if frame visible, the frame will disappear,
+	// and vice versa.
+	//
+	{
+	TRect clipRect=ClippingRect();
+	clipRect.Intersection(aLineRect);
+	iGc->SetClippingRect(clipRect);
+	iGc->SetPenSize(TSize(1,1));
+	aPictureFrame->XorDraw(*iGc);
+	ResetClippingRect();
+    }
+
+void RScreenDisplay::Invalidate(TRect aRect)
+	//
+    //Invalidate the view rect
+    //
+    {
+	if (iWin)
+		iWin->Invalidate(aRect);
+    }
+
+void RScreenDisplay::SetTextCursor(TPoint aPos, const TTextCursor &aCursor)
+	//
+	//Display a cursor at position aPos
+	//
+	{
+	if (iWin && iGroupWin)
+		{
+		aPos.iX+=iDrawTextLayoutContext->iTextStartX;
+		iGroupWin->SetTextCursor(*iWin,aPos,aCursor,iDrawTextLayoutContext->TextArea());
+		}
+	}
+
+void RScreenDisplay::RemoveTextCursor()
+	//
+	//Remove cursor from window
+	//
+	{
+
+	if (iGroupWin)
+		iGroupWin->CancelTextCursor();
+	}
+
+void RScreenDisplay::ClearRect(const TRect& aRect)
+	//
+	//Clear a rectangle on the screen
+	//
+	{
+	if (iTextLayout)
+		{
+		TPoint top_left = iDrawTextLayoutContext->TopLeftText();
+		iTextLayout->DrawBackground(*iGc,top_left,aRect,iBackground);
+		ResetClippingRect();
+		}
+	else
+		{
+		iGc->SetBrushColor(iBackground);
+		iGc->Clear(aRect);
+		}
+	}
+
+void RScreenDisplay::InvertRect(TRect aRect,const TRgb aInvertColor)
+	{
+	aRect.Move(iDrawTextLayoutContext->iTextStartX,0);
+	iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
+	iGc->SetBrushColor(aInvertColor);
+	iGc->Clear(aRect);
+	iGc->SetBrushColor(iBackground);
+	iGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	}
+
+void RScreenDisplay::Scroll(TRect aRect,const TPoint& aBy,TBool aScrollBackground)
+	{
+	if (iWin)
+		{
+		if (!aScrollBackground || (iTextLayout && iTextLayout->CustomDraw()))
+			{
+			aRect.Move(aBy);
+			iWin->Invalidate(aRect);
+			}
+		else
+   			iWin->Scroll(aBy,aRect);
+		}
+	return;
+	}
+
+void RScreenDisplay::Flush()
+	{
+	if (iSession)
+		iSession->Flush();
+	}
+
+TBool RScreenDisplay::IsLineCursor() const
+	{
+	return iDrawTextLayoutContext->IsGutterMargin();
+	}
+
+TRect RScreenDisplay::LineCursorMargin() const
+	{
+	return iDrawTextLayoutContext->GutterMargin();
+	}
+
+TPoint RScreenDisplay::TopLeftTextArea() const
+	{
+	return iDrawTextLayoutContext->TopLeftTextArea();
+	}
+
+void RScreenDisplay::SetLayout(CTextLayout* aLayout)
+	{
+	iTextLayout = aLayout;
+	iTextLayout->SetWindow(iWin);
+	}
+
+CTextLayout* RScreenDisplay::Layout()
+	{
+	return iTextLayout;
+	}
+
+TBool RScreenDisplay::UseWindowGc() const
+	{
+	return iDrawTextLayoutContext->UseWindowGc();
+	}