lafagnosticuifoundation/clockanim/src/MSGWIN.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lafagnosticuifoundation/clockanim/src/MSGWIN.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,259 @@
+// 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:
+// source code for the message-window class
+// $Workfile:   MSGWIN.CPP  $
+// $Revision:   1.7  $
+// $Author:   DougF  $
+// $Date:   07 Jul 1999 16:16:18  $
+// 
+//
+
+#include "CL_STD.H"
+
+// DMessageWindow
+
+DMessageWindow::DMessageWindow()
+	{
+	__DECLARE_NAME(_S("DMessageWindow"));
+	iPlinthTlColor=KRgbWhite;
+	iPlinthBrColor=KRgbGray;
+	}
+
+DMessageWindow::~DMessageWindow()
+	{
+	CancelDisplay(); // copes with NULL pointers
+	iFunctions->CloseFont(iFont);
+	delete iTimer;
+	}
+
+void DMessageWindow::StartDisplay()
+	{
+	__ASSERT_DEBUG(~iFlags&EFlagVisible, Panic(EClockServerPanicAlreadyVisible));
+	__ASSERT_DEBUG(!iTimer->IsActive(), Panic(EClockServerPanicTimerIsActive));
+	if (~iFlags&EFlagFlash)
+		iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone);
+	else
+		{
+		iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash);
+		iFlags|=EFlagFlashStateOn;
+		}
+	iWindowFunctions->SetVisible(ETrue);
+	iFlags|=EFlagVisible;
+	if (iDuration.Int()!=SMessageWindowCommandStartDisplayArgs::EIndefiniteDuration)
+		{
+		iTimer->SetAction(DMessageWindowTimer::EActionCancelDisplay);
+		iTimer->After(iDuration);
+		}
+	}
+
+void DMessageWindow::CancelDisplay()
+	{
+	if (iTimer!=NULL)
+		iTimer->Cancel();
+	if (iFunctions!=NULL)
+		{
+		iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone);
+		iWindowFunctions->SetVisible(EFalse);
+		iFlags&=~EFlagVisible;
+		}
+	}
+
+void DMessageWindow::ConstructLP(const TUint8* aBytePtr, TBool)
+	{
+	SMessageWindowConstructorArgs* messageWindowArgs=(SMessageWindowConstructorArgs*)aBytePtr;
+	aBytePtr+=sizeof(SMessageWindowConstructorArgs);
+	iBaselineOffset=messageWindowArgs->iBaselineOffset;
+	iFont=iFunctions->DuplicateFontL(messageWindowArgs->iFontHandle);
+	iBackgroundColor=messageWindowArgs->iBackgroundColor;
+	iTextColor=messageWindowArgs->iTextColor;
+	iBorderColor=messageWindowArgs->iBorderColor;
+	iTimer=DMessageWindowTimer::NewL(*this);
+	CancelDisplay();
+	}
+
+TInt DMessageWindow::CommandReplyLP(TInt aOpcode, TAny* aArgs)
+	{
+	switch (aOpcode)
+		{
+	case EMessageWindowCommandStartDisplay:
+		{
+		SMessageWindowCommandStartDisplayArgs* messageWindowArgs=(SMessageWindowCommandStartDisplayArgs*)aArgs;
+		TInt initialDelay=messageWindowArgs->iInitialDelay.Int();
+		TInt duration=messageWindowArgs->iDuration.Int();
+		__ASSERT_ALWAYS((initialDelay>=0) && ((duration==SMessageWindowCommandStartDisplayArgs::EIndefiniteDuration) || (duration>=0)),PanicClientFromServer());
+		if (messageWindowArgs->iFlash)
+			iFlags|=EFlagFlash;
+		else
+			iFlags&=~EFlagFlash;
+		iDuration=messageWindowArgs->iDuration;
+		iText=messageWindowArgs->iText;
+		if ((iFlags&EFlagVisible) || (initialDelay==0))
+			{
+			CancelDisplay();
+			StartDisplay();
+			}
+		else if (!iTimer->IsActive())
+			{
+			iTimer->SetAction(DMessageWindowTimer::EActionStartDisplay);
+			iTimer->After(messageWindowArgs->iInitialDelay);
+			}
+		}
+		return KErrNone;
+	case EMessageWindowCommandCancelDisplay:
+		CancelDisplay();
+		return KErrNone;
+	case EMessageWindowCommandGetBorders:
+		{
+		TMargins borders;
+		borders.iLeft=EBorderWidthLeft;
+		borders.iRight=EBorderWidthRight;
+		borders.iTop=EBorderWidthTop;
+		borders.iBottom=EBorderWidthBottom;
+		const TInt error=iFunctions->Message()->Write(KIpcSlot, TPckgC<TMargins>(borders));
+		__ASSERT_ALWAYS(error==KErrNone, PanicClientFromServer());
+		}
+		return KErrNone;
+	case EMessageWindowCommandSetBackgroundColor:
+		{
+		SMessageWindowBackgroundColorArgs* messageWindowArgs=(SMessageWindowBackgroundColorArgs*)aArgs;
+		iBackgroundColor = messageWindowArgs->iBackgroundColor;
+		}
+		return KErrNone;
+	case EMessageWindowCommandSetTextColor:
+		{
+		SMessageWindowTextColorArgs* messageWindowArgs=(SMessageWindowTextColorArgs*)aArgs;
+		iTextColor=messageWindowArgs->iTextColor;
+		}
+		return KErrNone;
+	case EMessageWindowCommandSetBorderColor:
+		{
+		SMessageWindowBorderColorArgs* messageWindowArgs=(SMessageWindowBorderColorArgs*)aArgs;
+		iBorderColor=messageWindowArgs->iBorderColor;
+		}
+		return KErrNone;
+	case EMessageWindowCommandSetPlinthColor:
+		{
+		SMessageWindowPlinthColorArgs* messageWindowArgs=(SMessageWindowPlinthColorArgs*)aArgs;
+		iPlinthTlColor=messageWindowArgs->iTlColor;
+		iPlinthBrColor=messageWindowArgs->iBrColor;
+		}
+		return KErrNone;
+	default:
+		return DAnimWithUtils::CommandReplyLP(aOpcode, aArgs);
+		}
+	}
+
+void DMessageWindow::AnimateP(TDateTime*)
+	{
+	__ASSERT_DEBUG(iFlags&EFlagFlash,Panic(EClockServerPanicAnimatingNonFlashingMessageWindow));
+	if (iFunctions->FlashStateOn())
+		iFlags|=EFlagFlashStateOn;
+	else
+		iFlags&=~EFlagFlashStateOn;
+	iWindowFunctions->ActivateGc();
+	TRect rect=Rect();
+	rect.iTl+=TPoint(EBorderWidthLeft, EBorderWidthTop);
+	rect.iBr-=TPoint(EBorderWidthRight, EBorderWidthBottom);
+	DrawTextPortionOfDisplay(rect);
+	}
+
+void DMessageWindow::RedrawP()
+	{
+	TRect rect=Rect();
+	iGc->SetBrushStyle(CGraphicsContext::ENullBrush);
+	iGc->SetPenStyle(CGraphicsContext::ESolidPen);
+//	iGc->SetPenColor(KRgbBlack);
+	iGc->SetPenColor(iBorderColor);
+	iGc->SetPenSize(TSize(1, 1));
+	iGc->DrawRect(rect);
+	rect.Shrink(1, 1);
+	iGc->DrawRect(rect);
+	rect.Shrink(1, 1);
+	iGc->SetPenColor(iPlinthTlColor);
+	iGc->DrawLine(rect.iTl, TPoint(rect.iTl.iX, rect.iBr.iY-1));
+	iGc->DrawLine(rect.iTl, TPoint(rect.iBr.iX-1, rect.iTl.iY));
+	iGc->SetPenColor(iPlinthBrColor);
+	iGc->DrawLine(TPoint(rect.iBr.iX-1, rect.iTl.iY), TPoint(rect.iBr.iX-1, rect.iBr.iY));
+	iGc->DrawLine(TPoint(rect.iTl.iX, rect.iBr.iY-1), TPoint(rect.iBr.iX, rect.iBr.iY-1));
+	rect.Shrink(1, 1);
+	iGc->DrawLine(TPoint(rect.iBr.iX-1, rect.iTl.iY), TPoint(rect.iBr.iX-1, rect.iBr.iY));
+	iGc->DrawLine(TPoint(rect.iTl.iX, rect.iBr.iY-1), TPoint(rect.iBr.iX, rect.iBr.iY-1));
+	rect.iBr-=TPoint(1, 1);
+	DrawTextPortionOfDisplay(rect);
+	}
+
+TRect DMessageWindow::Rect() const
+	{
+	return TRect(TPoint(0, 0), iWindowFunctions->WindowSize());
+	}
+
+void DMessageWindow::DrawTextPortionOfDisplay(const TRect& aRect) const
+	{
+	__ASSERT_DEBUG(TRect(aRect.iTl-TPoint(EBorderWidthLeft, EBorderWidthTop),
+						aRect.iBr+TPoint(EBorderWidthRight, EBorderWidthBottom))==Rect(),Panic(EClockServerPanicBadRect));
+	iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	iGc->SetBrushColor(iBackgroundColor);
+	if ((iFlags&EFlagFlash) && (~iFlags&EFlagFlashStateOn))
+		iGc->Clear(aRect);
+	else
+		{
+		iGc->SetPenStyle(CGraphicsContext::ESolidPen);
+		iGc->SetPenColor(iTextColor);
+		iGc->UseFont(iFont);
+		iGc->DrawText(iText, aRect, iBaselineOffset, CGraphicsContext::ECenter);
+		}
+	}
+
+// DMessageWindow::DMessageWindowTimer
+
+DMessageWindow::DMessageWindowTimer::DMessageWindowTimer(DMessageWindow& aOwner)
+	:CTimer(EPriorityStandard),
+	 iOwner(aOwner)
+	{
+	__DECLARE_NAME(_S("DMessageWindowTimer"));
+	CActiveScheduler::Add(this);
+	}
+
+DMessageWindow::DMessageWindowTimer* DMessageWindow::DMessageWindowTimer::NewL(DMessageWindow& aOwner)
+	{
+	DMessageWindowTimer* timer=new(ELeave) DMessageWindowTimer(aOwner);
+	CleanupStack::PushL(timer);
+	timer->ConstructL();
+	CleanupStack::Pop();
+	return timer;
+	}
+
+void DMessageWindow::DMessageWindowTimer::SetAction(TAction aAction)
+	{
+	iAction=aAction;
+	}
+
+void DMessageWindow::DMessageWindowTimer::RunL()
+	{
+	switch (iAction)
+		{
+	case EActionStartDisplay:
+		iOwner.StartDisplay();
+		break;
+	case EActionCancelDisplay:
+		iOwner.CancelDisplay();
+		break;
+#if defined(_DEBUG)
+	default:
+		Panic(EClockServerPanicBadMessageWindowTimerAction);
+		break;
+#endif
+		}
+	}
+