// Copyright (c) 1995-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:
// Test Animated DLL
//
//
#include <e32std.h>
#include <w32std.h>
#include <w32adll.h>
#include <bitstd.h>
#include "ANIMDLL.H"
#define ANIM_TEST_TEXT _L("Testing 123")
class CTestAnim : public CWindowAnim
{
enum {ENumPolyPoints=9};
public:
~CTestAnim();
virtual void ConstructL(TAny *aArgs, TBool aHasFocus);
virtual void Animate(TDateTime *aDateTime);
virtual void Redraw();
virtual void Command(TInt aOpcode, TAny *aArgs);
virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs);
void SetPolyList(const TRect &aRect);
void DrawPolyLine();
void DrawBitmap();
void DrawText();
void TweakPolyList(TInt aState);
void FocusChanged(TBool aState);
void InvalidateText();
void InvalidateBitmap();
//Pure virtual function from MEventHandler
virtual TBool OfferRawEvent(const TRawEvent &aRawEvent);
private:
void AppendTime(TDes& aTimeText,const TTime& aTime) const;
private:
TPoint iPos;
TSize iSize;
TInt iColor;
TBool iMasked;
TRect iPolyRect;
TInt iPolyState;
TInt iWiggleSize;
TPoint iTextPos;
TBool iHasFocus;
CArrayFixFlat<TPoint> *iPolyList;
CFbsBitmap iBitmap1;
CFbsBitmap iBitmap2;
CFbsBitmap iMask;
CFbsFont *iFont;
};
class CTestAnimDll : public CAnimDll
{
public:
CAnim *CreateInstanceL(TInt aType);
private:
};
/*#if defined(__WINS__)
#pragma data_seg(".E32_UID")
__WINS_UID(0, KWservAnimDllUidValue, 0)
#pragma data_seg()
#endif*/
EXPORT_C CAnimDll *CreateCAnimDllL()
{
return(new(ELeave) CTestAnimDll());
}
// Instance code //
void CTestAnim::Animate(TDateTime *)
{
if (!iWindowFunctions->IsHidden())
{
iWindowFunctions->ActivateGc();
if (iPolyList)
DrawPolyLine();
}
if (iPolyList)
{
iPolyState=(iPolyState+1)%4;
TweakPolyList(iPolyState);
}
if (!iWindowFunctions->IsHidden())
{
if (iPolyList)
DrawPolyLine();
DrawText();
DrawBitmap();
}
iColor=(iColor+16)&0xFF;
}
void CTestAnim::DrawPolyLine()
{
iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
iGc->SetPenColor(TRgb(255,255,255));
iGc->DrawPolyLine(iPolyList);
iGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
iGc->SetPenColor(TRgb(0,0,0));
}
void CTestAnim::DrawBitmap()
{
iGc->SetClippingRegion(TRegionFix<1>(TRect(iPos,iSize)));
CFbsBitmap *bitmap=iFunctions->FlashStateOn() ? &iBitmap1 : &iBitmap2;
if (iMasked)
iGc->BitBltMasked(iPos,bitmap, TRect(iSize), &iMask,EFalse);
else
iGc->BitBlt(iPos,bitmap);
iGc->CancelClippingRegion();
}
void CTestAnim::AppendTime(TDes& aTimeText,const TTime& aTime) const
{
_LIT(TimeFormat,"%:0%H%:1%T%:2%S");
TRAPD(err,aTime.FormatL(aTimeText,TimeFormat));
if (err!=KErrNone)
{
_LIT(DummyTime,"######");
aTimeText.Append(DummyTime);
}
}
void CTestAnim::DrawText()
{
if (iHasFocus)
{
iGc->UseFont(iFont);
TBuf<0x20> timebuf;
TTime time(iFunctions->SystemTime());
AppendTime(timebuf,time);
TRect rect(iTextPos.iX,iTextPos.iY-iFont->AscentInPixels(),iTextPos.iX+iFont->TextWidthInPixels(timebuf),iTextPos.iY-iFont->AscentInPixels()+iFont->HeightInPixels());
iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
iGc->DrawText(timebuf,rect,iFont->AscentInPixels());
time.UniversalTime();
AppendTime(timebuf,time);
rect.Move(0,iFont->HeightInPixels());
iGc->DrawText(timebuf,rect,iFont->AscentInPixels());
}
}
void CTestAnim::Redraw()
{
DrawText();
DrawBitmap();
if (iPolyList)
DrawPolyLine();
}
void CTestAnim::ConstructL(TAny *aArgs, TBool aHasFocus)
{
iHasFocus=aHasFocus;
iPos=((CTAParams *)aArgs)->pos;
iFunctions->SetInterval(((CTAParams *)aArgs)->interval);
if (iBitmap1.Duplicate(((CTAParams *)aArgs)->bit1)!=KErrNone ||
iBitmap2.Duplicate(((CTAParams *)aArgs)->bit2)!=KErrNone ||
iMask.Duplicate(((CTAParams *)aArgs)->mask)!=KErrNone)
iFunctions->Panic();
iSize.iWidth=Min(iBitmap1.SizeInPixels().iWidth,iBitmap2.SizeInPixels().iWidth);
iSize.iHeight=Min(iBitmap1.SizeInPixels().iHeight,iBitmap2.SizeInPixels().iHeight);
iWiggleSize=10;
iFont=iFunctions->DuplicateFontL(((CTAParams *)aArgs)->font);
}
void CTestAnim::SetPolyList(const TRect &aRect)
{
iPolyRect=aRect;
TSize halfsize=aRect.Size();
halfsize.iWidth>>=1;
halfsize.iHeight>>=1;
(*iPolyList)[0]=aRect.iTl;
(*iPolyList)[1]=TPoint(aRect.iTl.iX+iWiggleSize,aRect.iTl.iY+halfsize.iHeight);
(*iPolyList)[2]=TPoint(aRect.iTl.iX,aRect.iBr.iY);
(*iPolyList)[3]=TPoint(aRect.iTl.iX+halfsize.iWidth,aRect.iBr.iY-iWiggleSize);
(*iPolyList)[4]=aRect.iBr;
(*iPolyList)[5]=TPoint(aRect.iBr.iX-iWiggleSize,aRect.iTl.iY+halfsize.iHeight);
(*iPolyList)[6]=TPoint(aRect.iBr.iX,aRect.iTl.iY);
(*iPolyList)[7]=TPoint(aRect.iTl.iX+halfsize.iWidth,aRect.iTl.iY+iWiggleSize);
(*iPolyList)[8]=aRect.iTl;
TweakPolyList(iPolyState);
}
void CTestAnim::TweakPolyList(TInt aState)
{
TSize halfsize=iPolyRect.Size();
halfsize.iWidth>>=1;
halfsize.iHeight>>=1;
switch(aState)
{
case 0:
(*iPolyList)[7]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iTl.iY+iWiggleSize);
(*iPolyList)[1]=TPoint(iPolyRect.iTl.iX,iPolyRect.iTl.iY+halfsize.iHeight);
break;
case 1:
(*iPolyList)[1]=TPoint(iPolyRect.iTl.iX+iWiggleSize,iPolyRect.iTl.iY+halfsize.iHeight);
(*iPolyList)[3]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iBr.iY);
break;
case 2:
(*iPolyList)[3]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iBr.iY-iWiggleSize);
(*iPolyList)[5]=TPoint(iPolyRect.iBr.iX,iPolyRect.iTl.iY+halfsize.iHeight);
break;
case 3:
(*iPolyList)[5]=TPoint(iPolyRect.iBr.iX-iWiggleSize,iPolyRect.iTl.iY+halfsize.iHeight);
(*iPolyList)[7]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iTl.iY);
break;
}
}
void CTestAnim::InvalidateText()
{
TRect invalidate;
invalidate.iTl.iX=iTextPos.iX;
invalidate.iTl.iY=iTextPos.iY-iFont->AscentInPixels();
invalidate.iBr.iX=iTextPos.iX+iFont->TextWidthInPixels(ANIM_TEST_TEXT);
invalidate.iBr.iY=iTextPos.iY+iFont->DescentInPixels();
iWindowFunctions->Invalidate(invalidate);
}
void CTestAnim::InvalidateBitmap()
{
iWindowFunctions->Invalidate(TRect(iPos,iSize));
}
void CTestAnim::Command(TInt aOpcode, TAny *aArgs)
{
switch(aOpcode)
{
case EADllOpcodeMove:
{
InvalidateBitmap();
iPos=((CTAParams *)aArgs)->pos;
iWindowFunctions->ActivateGc();
DrawBitmap();
iFunctions->SetInterval(((CTAParams *)aArgs)->interval);
}
break;
case EADllTextPos:
{
InvalidateText();
iTextPos=((CTAParams *)aArgs)->pos;
iWindowFunctions->ActivateGc();
DrawText();
}
break;
case EADllToggleBitmapMask:
iMasked=!iMasked;
InvalidateBitmap();
break;
}
}
TInt CTestAnim::CommandReplyL(TInt aOpcode, TAny *aArgs)
{
switch(aOpcode)
{
case EADllOpcodePolyLineRect:
iWindowFunctions->ActivateGc();
if (!iPolyList)
{
iPolyList=new(ELeave) CArrayFixFlat<TPoint>(ENumPolyPoints);
TPoint zeropoint;
for(TInt i=0;i<ENumPolyPoints;i++)
iPolyList->AppendL(zeropoint);
}
else
DrawPolyLine();
SetPolyList(*((TRect *)aArgs));
DrawPolyLine();
break;
default:
iFunctions->Panic();
}
return(KErrNone);
}
CTestAnim::~CTestAnim()
{
delete iPolyList;
iFunctions->CloseFont(iFont);
}
void CTestAnim::FocusChanged(TBool aNewState)
{
iHasFocus=aNewState;
InvalidateText();
InvalidateBitmap();
}
TBool CTestAnim::OfferRawEvent(const TRawEvent &/*aRawEvent*/)
{
return EFalse;
}
// DLL code //
CAnim *CTestAnimDll::CreateInstanceL(TInt )
{
return(new(ELeave) CTestAnim());
}
// Dummy E32Dll needed by E32 to build //