diff -r 000000000000 -r 5d03bc08d59c graphicstest/uibench/s60/src/windows/tflowwindowscontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicstest/uibench/s60/src/windows/tflowwindowscontroller.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,181 @@ +// Copyright (c) 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: +// + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include "tflowwindowscontroller.h" +#include "surfaceutility.h" + + +const TInt KDefaultFlowRate = -1; // by default window is moved by one pixel to the left +//const TInt KScreenMode = 1; // Default Screen Mode (used by rotate screen) + + +CTFlowWindowsController* CTFlowWindowsController::NewL (TBool aPreload, RArray& aFileNames, + TSize& aWindowSize, RArray& aNewLs, + RArray& aInitialPositions, TBool aBouncing, TBool aMoveHorizontal /*= ETrue*/) + { + CTFlowWindowsController* self = new (ELeave) CTFlowWindowsController(aFileNames.Count(), + aPreload, aWindowSize, aBouncing, aMoveHorizontal); + CleanupStack::PushL(self); + self->ConstructL(aFileNames, aNewLs, aInitialPositions); + CleanupStack::Pop(self); + return self; + } + +CTFlowWindowsController::CTFlowWindowsController(TInt aNumWindows, TBool aPreload, TSize& aWindowSize, + TBool aBouncing, TBool aMoveHorizontal) : + iWindowSize (aWindowSize), iPreload (aPreload), iNumWindows (aNumWindows), iBouncing(aBouncing) + { + iScreenRect = TRect(CTWindow::GetDisplaySizeInPixels()); + // if screen is heigher than wide movement is vertical otherwise horizontal + if (aMoveHorizontal) + { + iDeltaX = KDefaultFlowRate; + iDeltaY = 0; + } + else + { + iDeltaX = 0; + iDeltaY = KDefaultFlowRate; + } + } + +void CTFlowWindowsController::ConstructL(RArray& aFileNames, + RArray& aNewLs, RArray& aInitialPositions) + { + iFileNames = aFileNames; + // Connect to windows server session + User::LeaveIfError(iWs.Connect()); + iScreenDev = new (ELeave) CWsScreenDevice(iWs); + User::LeaveIfError(iScreenDev->Construct()); + iUtility = CSurfaceUtility::NewL(); + + iWinGroup = RWindowGroup(iWs); + // it's common to use the address of the owning object as an unique window group handle + User::LeaveIfError(iWinGroup.Construct(reinterpret_cast(this))); + + CTWindow* flowWindow; + for (TInt w = 0; w < iNumWindows; w++) + { + flowWindow = aNewLs[w](iWs, iWinGroup, aInitialPositions[w], iWindowSize); + iWindowsRegion.AddRect(TRect(aInitialPositions[w], iWindowSize)); + CleanupStack::PushL(flowWindow); + // always preload the first window regardless of iPreload value + if (w == 0 || iPreload) + { + flowWindow->LoadL(iUtility, iFileNames[w]); + } + iFlowWindows.AppendL(flowWindow); + CleanupStack::Pop(flowWindow); + } + } + +CTFlowWindowsController::~CTFlowWindowsController() + { + // windows needs to be deleted seperately + for (TInt i = 0; i < iNumWindows; i++) + { + delete iFlowWindows[i]; + } + iFlowWindows.Close(); + iWindowsRegion.Close(); + iWinGroup.Close(); + delete iUtility; + delete iScreenDev; + iWs.Close(); + } + +/** +Move all Windows and draw them to the screen with the window server. + +*/ +void CTFlowWindowsController::MoveL() + { + // Prepare to move block of small windows one step in the right direction. + // First check to see if moving them in the current direction would put them off + // the screen. If so, change the sign of the offset to make the block move in + // the other direction. + if (iBouncing) + { + iWindowsRegion.Offset(iDeltaX, iDeltaY); + if (!iWindowsRegion.IsContainedBy(iScreenRect)) + { + iDeltaX = -iDeltaX; + iDeltaY = -iDeltaY; + iWindowsRegion.Offset(2*iDeltaX, 2*iDeltaY); + } + } + + for (TInt w = iNumWindows - 1; w >= 0; --w) + { + // make sure that a window has loaded it's content before it moves into the screen rectangle + if (!iPreload) + { + if ((iFlowWindows[w]->CurrentPosition().iX == iWindowSize.iWidth - 1) + || (iFlowWindows[w]->CurrentPosition().iY == iWindowSize.iHeight - 1)) + { + iFlowWindows[w]->LoadL(iUtility, iFileNames[w]); + } + } + iFlowWindows[w]->Move(iDeltaX, iDeltaY); + iFlowWindows[w]->RenderL(); + if (!iBouncing) + { + if (iFlowWindows[w]->CurrentPosition().iX < -iWindowSize.iWidth * (iNumWindows - 1)) + { + iFlowWindows[w]->SetPosition(iScreenRect.Width() - 1, 0); + } + if (iFlowWindows[w]->CurrentPosition().iY < -iWindowSize.iHeight * (iNumWindows - 1)) + { + iFlowWindows[w]->SetPosition(0, iScreenRect.Height() - 1); + } + } + } + iWs.Flush(); + iWs.Finish(); + } + +void CTFlowWindowsController::SetWindowsVisibility(TBool aVisible) + { + for (TInt w = iNumWindows -1; w >= 0; --w) + { + iFlowWindows[w]->SetVisible(aVisible); + } + iWs.Flush(); + iWs.Finish(); + } + +/** +Rotate the screen to a given orientation. Note that if the screen device +and window server session used to display the image aren't used for the +rotation then the image will disappear. +*/ +void CTFlowWindowsController::Rotate(CFbsBitGc::TGraphicsOrientation aOrientation) + { + // Set new screen mode. The mode is defined in wsini_rotate_test.ini. + //iScreenDev->SetAppScreenMode(KScreenMode); + //iScreenDev->SetScreenMode(KScreenMode); + + // Set the screen orientation. + // todo: check which mode to use + iScreenDev->SetCurrentRotations(iScreenDev->CurrentScreenMode(), aOrientation); + iWs.Flush(); + iWs.Finish(); + }