--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknSyncDraw.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,157 @@
+/*
+* Copyright (c) 2002 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 "AknSyncDraw.h"
+
+
+class CCoeControlAccess : public CCoeControl
+ {
+public:
+ using CCoeControl::ActivateGc;
+ using CCoeControl::DeactivateGc;
+ using CCoeControl::Window;
+ using CCoeControl::HandleRedrawEvent;
+ };
+
+
+enum TSyncDrawFlags
+ {
+ EInDrawLoop
+ };
+
+
+const TInt KSyncDrawArrayGranularity = 4;
+
+
+EXPORT_C void MAknSyncDrawer::MAknSyncDrawer_Reserved_1() {}
+EXPORT_C void MAknSyncDrawer::MAknSyncDrawer_Reserved_2() {}
+
+
+EXPORT_C TAknSyncControlDrawer::TAknSyncControlDrawer()
+ {
+ }
+
+EXPORT_C void TAknSyncControlDrawer::SetControl(CCoeControl* aControl)
+ {
+ iControl = static_cast<CCoeControlAccess*>(aControl);
+ }
+
+EXPORT_C void TAknSyncControlDrawer::MasrPrepareForDraw()
+ {
+ iDrawRect = TRect();
+ RWindow& window = iControl->Window();
+ RRegion region;
+ window.GetInvalidRegion(region);
+ if (!region.CheckError())
+ {
+ iDrawRect = region.BoundingRect();
+ }
+ region.Close();
+ }
+
+EXPORT_C void TAknSyncControlDrawer::MasrDraw()
+ {
+ if (!iDrawRect.IsEmpty())
+ iControl->HandleRedrawEvent(iDrawRect);
+ }
+
+EXPORT_C void TAknSyncControlDrawer::MasrDeactivateGc() const
+ {
+ iControl->DeactivateGc();
+ }
+
+EXPORT_C void TAknSyncControlDrawer::MasrActivateGc() const
+ {
+ iControl->ActivateGc();
+ }
+
+
+EXPORT_C CAknDrawSynchronizer* CAknDrawSynchronizer::NewL()
+ {
+ CAknDrawSynchronizer* self = new(ELeave) CAknDrawSynchronizer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+EXPORT_C CAknDrawSynchronizer::~CAknDrawSynchronizer()
+ {
+ delete iSyncDrawers;
+ }
+
+CAknDrawSynchronizer::CAknDrawSynchronizer()
+ {
+ }
+
+void CAknDrawSynchronizer::ConstructL()
+ {
+ iSyncDrawers = new(ELeave) CSyncDrawers(KSyncDrawArrayGranularity);
+ }
+
+EXPORT_C void CAknDrawSynchronizer::AddL(MAknSyncDrawer* aDrawer)
+ {
+ Remove(aDrawer);
+ iSyncDrawers->AppendL(aDrawer);
+ }
+
+EXPORT_C void CAknDrawSynchronizer::Remove(MAknSyncDrawer* aDrawer)
+ {
+ TInt count = iSyncDrawers->Count();
+ for (TInt ii = count-1; ii >= 0; ii--)
+ {
+ if (iSyncDrawers->At(ii) == aDrawer)
+ iSyncDrawers->Delete(ii);
+ }
+ }
+
+EXPORT_C void CAknDrawSynchronizer::Signal(const MAknSyncDrawer* aDrawer)
+ {
+ if (iFlags[EInDrawLoop])
+ return;
+ iFlags.Set(EInDrawLoop);
+
+ if (aDrawer)
+ aDrawer->MasrDeactivateGc();
+
+ const TInt count = iSyncDrawers->Count();
+ TInt ii;
+
+ // prepare to draw
+ for (ii = 0; ii<count; ++ii)
+ {
+ MAknSyncDrawer* redrawer = iSyncDrawers->At(ii);
+ if (redrawer != aDrawer)
+ redrawer->MasrPrepareForDraw();
+ }
+
+ // draw
+ for (ii = 0; ii<count; ++ii)
+ {
+ MAknSyncDrawer* redrawer = iSyncDrawers->At(ii);
+ if (redrawer != aDrawer)
+ redrawer->MasrDraw();
+ }
+
+ if (aDrawer)
+ aDrawer->MasrActivateGc();
+
+ iFlags.Clear(EInDrawLoop);
+ }
+
+
+// End of File