// Copyright (c) 2000-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:
// Screen mode changing tests
//
//
#include <e32std.h>
#include <e32def_private.h>
#include "W32STD.H"
#include "../tlib/testbase.h"
#include "TMAN.H"
class CTimeWindow;
class CQBlankWindow : public CBlankWindow
{
public:
static TInt iInitialColor;
public:
//Virtual function from CTBaseWin
void InitWin();
public:
static TSize iSize;
TSglQueLink iLink;
};
class CFixScreenModeGroup : public CTWindowGroup
{
public:
static TInt iNoClientWins;
public:
~CFixScreenModeGroup();
CFixScreenModeGroup(CTClient *aClient);
void ConstructL();
public:
TSglQueLink iLink;
private:
TSglQue<CQBlankWindow> iWindows;
};
class CFlipClient : public CTClient
{
public:
void ConstructL();
private:
};
class CScreenModeTimes : public CTestBase
{
public:
CScreenModeTimes();
~CScreenModeTimes();
TestState DoTestL();
void ConstructL();
void DoTimings();
private:
void CreateGroupL(CTClient* aClient,TSglQue<CFixScreenModeGroup>& aQue);
void DeleteGroups(TSglQue<CFixScreenModeGroup>& aQue);
void BringToFront(TSglQue<CFixScreenModeGroup>& aQue);
private:
TScreenModeEnforcement iEnforcementMode;
CInfoDialog* iDialogue;
CTimeWindow* iInfoWindow;
CFlipClient* iFlipClient;
TSglQue<CFixScreenModeGroup> iNormalGroupQue;
TSglQue<CFixScreenModeGroup> iFlipGroupQue;
TInt iNoGroupWins;
TInt iState;
};
class CTimeWindow : public CTTitledWindow
{
public:
void Construct(CTestBase* aTest);
void SetNumWindows(TInt aGroup,TInt aWin);
void SetTime1(TTimeIntervalMicroSeconds& aTime);
void SetTime2(TTimeIntervalMicroSeconds& aTime);
void DoDraw();
//virtual function from CTWinBase overridden by CTBaseWin
void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
//virtual functions from CTBaseWin
void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
void PointerL(const TPointerEvent &aPointer,const TTime &aTime);
//virtual function from CTBaseWin overridden by CTTitledWindow
void Draw();
private:
inline CScreenModeTimes* Test() {return STATIC_CAST(CScreenModeTimes*,iTest);}
void UpdateString1();
void UpdateString2();
void UpdateString3();
private:
CTestBase* iTest;
TInt iNumGroups;
TInt iNumWins;
TTimeIntervalMicroSeconds iTime1;
TTimeIntervalMicroSeconds iTime2;
TBuf<32> iString1;
TBuf<32> iString2;
TBuf<32> iString3;
TBuf<32> iString4;
TRect iRect1;
TRect iRect2;
TRect iRect3;
TRect iRect4;
TBool iPressed;
TBool iExit;
};
TSize CQBlankWindow::iSize;
TInt CQBlankWindow::iInitialColor;
TInt CFixScreenModeGroup::iNoClientWins=0;
GLDEF_C CTestBase *CreateScreenModeTimes()
{
return(new(ELeave) CScreenModeTimes());
}
//
// CFlipClient
//
void CFlipClient::ConstructL()
{
CTClient::ConstructL();
TPixelsAndRotation sizeAndRotation;
iScreen->GetScreenModeSizeAndRotation(1,sizeAndRotation);
iScreen->SetScreenSizeAndRotation(sizeAndRotation);
}
//
// CTimeWindow
//
void CTimeWindow::Construct(CTestBase* aTest)
{
_LIT(Title,"StatusWindow");
_LIT(String4,"Click here to finish");
const TInt fontHeight=iFont->HeightInPixels();
iTest=aTest;
TWindowTitle title(Title);
SetTitle(title);
TInt yy=iTitleHeight+fontHeight+7;
iRect1.SetRect(3,iTitleHeight+5,iSize.iWidth-1,yy);
yy+=fontHeight/2;
TInt yy1=yy+fontHeight+2;
iRect2.SetRect(3,yy+3,iSize.iWidth-1,yy1);
TInt yy2=yy1+iFont->HeightInPixels()+2;
iRect3.SetRect(3,yy1+3,iSize.iWidth-1,yy2);
yy2+=fontHeight/2;
iRect4.SetRect(3,yy2+3,iSize.iWidth-1,yy2+iFont->HeightInPixels()+2);
//
iString4.Copy(String4);
iExit=EFalse;
}
void CTimeWindow::SetUpL(TPoint aPos,TSize aSize,CTWinBase *aParent,CWindowGc &aGc)
{
CTTitledWindow::SetUpL(aPos,aSize,aParent,aGc);
}
void CTimeWindow::WinKeyL(const TKeyEvent &aKey,const TTime&)
{
switch(aKey.iCode)
{
case EKeyEscape:
iTest->Request();
break;
default:;
}
}
void CTimeWindow::PointerL(const TPointerEvent &aPointer,const TTime &aTime)
{
if (iRect2.Contains(aPointer.iPosition) || iRect3.Contains(aPointer.iPosition))
{
if (aPointer.iType==TPointerEvent::EButton1Down)
iPressed=ETrue;
}
else if (iRect4.Contains(aPointer.iPosition))
iExit=ETrue;
else
CTTitledWindow::PointerL(aPointer,aTime);
if ((iExit||iPressed) && aPointer.iType==TPointerEvent::EButton1Up)
{
if (iExit)
iTest->Request();
else
{
Test()->DoTimings();
DoDraw();
}
}
}
void CTimeWindow::Draw()
{
CTTitledWindow::Draw();
TInt ascent=iFont->AscentInPixels()+1;
iGc->DrawText(iString1,iRect1,ascent,CGraphicsContext::ELeft);
iGc->DrawText(iString2,iRect2,ascent,CGraphicsContext::ELeft);
iGc->DrawText(iString3,iRect3,ascent,CGraphicsContext::ELeft);
iGc->DrawText(iString4,iRect4,ascent,CGraphicsContext::ELeft);
}
void CTimeWindow::DoDraw()
{
iGc->Activate(iWin);
iGc->UseFont((CFont *)iFont);
Draw();
iGc->Deactivate();
}
void CTimeWindow::SetNumWindows(TInt aGroups,TInt aWins)
{
iNumGroups=aGroups;
iNumWins=aWins;
UpdateString1();
}
void CTimeWindow::UpdateString1()
{
_LIT(NumberWin,"Groups (2x)%d, Windows %d");
iString1.Format(NumberWin,iNumGroups,iNumWins);
}
void CTimeWindow::SetTime1(TTimeIntervalMicroSeconds& aTime)
{
iTime1=aTime;
UpdateString2();
}
void CTimeWindow::SetTime2(TTimeIntervalMicroSeconds& aTime)
{
iTime2=aTime;
UpdateString3();
}
_LIT(TimeFormat,"Time%d = %d.%04dsecs");
void CTimeWindow::UpdateString2()
{
TInt time = I64LOW(iTime1.Int64());
iString2.Format(TimeFormat,1,time/1000000,(time%1000000)/100);
}
void CTimeWindow::UpdateString3()
{
TInt time = I64LOW(iTime2.Int64());
iString3.Format(TimeFormat,2,time/1000000,(time%1000000)/100);
}
//
// CQBlankWindow
//
void CQBlankWindow::InitWin()
{
SetColor(TRgb::Gray4(iInitialColor));
iWin.SetSize(iSize);
}
//
// CFixScreenModeGroup
//
CFixScreenModeGroup::~CFixScreenModeGroup()
{
GroupWin()->EnableReceiptOfFocus(EFalse);
ClearCurrentWindow();
CQBlankWindow* win;
while (!iWindows.IsEmpty())
{
win=iWindows.First();
iWindows.Remove(*win);
delete win;
}
}
CFixScreenModeGroup::CFixScreenModeGroup(CTClient *aClient) : CTWindowGroup(aClient), iWindows(_FOFF(CQBlankWindow,iLink))
{}
void CFixScreenModeGroup::ConstructL()
{
CTWindowGroup::ConstructL();
CQBlankWindow* win;
TInt ii;
for(ii=0;ii<iNoClientWins;++ii)
{
win=new(ELeave) CQBlankWindow();
CleanupStack::PushL(win);
win->ConstructL(*this);
win->Activate();
win->AssignGC(*iClient->iGc);
iWindows.AddLast(*win);
CleanupStack::Pop(win);
Client()->Flush();
}
SetCurrentWindow(iWindows.First());
}
/*void CFixScreenModeGroup::ScreenDeviceChanged()
{
iWindow->ScreenDeviceChanged();
}*/
//
// CScreenModeTimes
//
_LIT(TestName,"Screen Mode Times");
CScreenModeTimes::CScreenModeTimes() : CTestBase(TestName)
,iNormalGroupQue(_FOFF(CFixScreenModeGroup,iLink)),iFlipGroupQue(_FOFF(CFixScreenModeGroup,iLink))
{}
CScreenModeTimes::~CScreenModeTimes()
{
Client()->iGroup->GroupWin()->EnableScreenChangeEvents();
Client()->iScreen->SetScreenMode(0);
DeleteGroups(iNormalGroupQue);
DeleteGroups(iFlipGroupQue);
Client()->iGroup->SetCurrentWindow(NULL);
delete iFlipClient;
delete iInfoWindow;
if (iEnforcementMode==ESizeEnforcementNone)
Client()->iScreen->SetScreenModeEnforcement(ESizeEnforcementNone);
}
void CScreenModeTimes::ConstructL()
{
iEnforcementMode=Client()->iScreen->ScreenModeEnforcement();
if (iEnforcementMode==ESizeEnforcementNone)
Client()->iScreen->SetScreenModeEnforcement(ESizeEnforcementPixelsAndRotation);
iDialogue=new(ELeave) CInfoDialog(Client()->iGroup,Client()->iGc);
iDialogue->ConstructLD();
iFlipClient=new(ELeave) CFlipClient();
iFlipClient->ConstructL();
Client()->iGroup->GroupWin()->DisableScreenChangeEvents();
iNoGroupWins=12; //20;
CFixScreenModeGroup::iNoClientWins=20; //30;
TSize screenSize=Client()->iScreen->SizeInPixels();
CQBlankWindow::iSize.iWidth=Max(screenSize.iHeight,screenSize.iWidth);
CQBlankWindow::iSize.iHeight=CQBlankWindow::iSize.iWidth;
TInt ii;
for(ii=0;ii<iNoGroupWins;++ii)
{
CQBlankWindow::iInitialColor=1;
CreateGroupL(Client(),iNormalGroupQue);
CQBlankWindow::iInitialColor=2;
CreateGroupL(iFlipClient,iFlipGroupQue);
}
Client()->iGroup->GroupWin()->SetOrdinalPosition(0);
iInfoWindow=new(ELeave) CTimeWindow();
iInfoWindow->SetUpL(TPoint(Max(Min(415,screenSize.iWidth-210),0),Min(50,screenSize.iHeight-180)),TSize(210,180),Client()->iGroup,*Client()->iGc);
Client()->iGroup->SetCurrentWindow(iInfoWindow);
iInfoWindow->Construct(this);
iInfoWindow->WinTreeNode()->SetOrdinalPosition(1);
iInfoWindow->SetNumWindows(iNoGroupWins,CFixScreenModeGroup::iNoClientWins);
Client()->iGroup->GroupWin()->DisableScreenChangeEvents();
Client()->iWs.SetAutoFlush(ETrue);
iFlipClient->iWs.SetAutoFlush(ETrue);
Client()->iWs.SetPointerCursorMode(EPointerCursorNone);
}
void CScreenModeTimes::CreateGroupL(CTClient *aClient,TSglQue<CFixScreenModeGroup>& aQue)
{
CFixScreenModeGroup* group;
group=new(ELeave) CFixScreenModeGroup(aClient);
CleanupStack::PushL(group);
group->ConstructL();
aQue.AddLast(*group);
CleanupStack::Pop(group);
}
void CScreenModeTimes::DeleteGroups(TSglQue<CFixScreenModeGroup>& aQue)
{
CFixScreenModeGroup* group;
while (!aQue.IsEmpty())
{
group=aQue.First();
aQue.Remove(*group);
delete group;
}
}
void CScreenModeTimes::BringToFront(TSglQue<CFixScreenModeGroup>& aQue)
{
TSglQueIter<CFixScreenModeGroup> iter(aQue);
CFixScreenModeGroup* group=iter++;
group->GroupWin()->SetOrdinalPosition(0);
while ((group=iter++)!=NULL)
group->GroupWin()->SetOrdinalPosition(1);
}
void CScreenModeTimes::DoTimings()
{
//Timings 1 SCRDEV, DWsScreenDevice::CommandL, around call to SetScreenMode
//Timings 2 GROUPWIN, CWsWindowGroup::SetScreenDeviceValidStates, around main body of function including calls to old way
//Timings 3 CLIWIN, CWsTopClientWindow::SetScreenDeviceValidState, around call to ResetHiddenFlagAndAdjustRegions
//Timings 3 GROUPWIN, CWsWindowGroup::SetScreenDeviceValidStates, around main body of function excluding calls to old way
//Timings 4&5 CLIWIN, CWsClientWindow::ResetHiddenFlagAndAdjustRegions, going invisible and becomming visible sections
Client()->iGroup->GroupWin()->SetOrdinalPosition(-2);
Client()->Flush();
TTime startTime;
TTime middleTime;
TTime endTime;
__PROFILE_START(0);
startTime.HomeTime();
BringToFront(iNormalGroupQue);
Client()->iScreen->SetScreenMode(1);
middleTime.HomeTime();
BringToFront(iFlipGroupQue);
Client()->iScreen->SetScreenMode(0);
endTime.HomeTime();
__PROFILE_END(0);
#if defined(__PROFILING__)
TProfile profile;
RDebug::ProfileResult(&profile,3,1);
if (profile.iCount>0)
iDialogue->TimerResults(0);
#endif
TTimeIntervalMicroSeconds time=middleTime.MicroSecondsFrom(startTime);
iInfoWindow->SetTime1(time);
time=endTime.MicroSecondsFrom(middleTime);
iInfoWindow->SetTime2(time);
Client()->iGroup->GroupWin()->SetOrdinalPosition(0);
#if defined(__PROFILING__)
if (profile.iCount>0)
iDialogue->Display();
#endif
}
TestState CScreenModeTimes::DoTestL()
{
switch(iState)
{
case 0:
LogSubTest(_L("Time ScreenMode Changes"),1);
DoTimings();
iState++;
return EContinue;
default:
return EFinished;
}
}