javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtscreen.cpp
branchRCL_3
changeset 19 04becd199f91
child 23 98ccebc37403
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtscreen.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,396 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - S60 implementation
+ *******************************************************************************/
+
+
+#include <w32std.h>
+#include <hal.h>
+#include <aknappui.h>
+#include <eikenv.h>
+#include <swtlaffacade.h>
+#include "swtscreen.h"
+#include "swtmobiledevice.h"
+
+
+// Id of the primary hardware screen
+const TInt KDefaultHwScreenId = 0;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::NewL
+// ---------------------------------------------------------------------------
+//
+CSwtScreen* CSwtScreen::NewL(MSwtDisplay& aDisplay, TSwtPeer aPeer, TInt aId)
+{
+    CSwtScreen* self = new(ELeave) CSwtScreen(aDisplay, aPeer, aId);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::CSwtScreen
+// ---------------------------------------------------------------------------
+//
+CSwtScreen::CSwtScreen(MSwtDisplay& aDisplay, TSwtPeer aPeer, TInt aId)
+        : iDisplay(aDisplay), iPeer(aPeer), iId(aId)
+{
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::~CSwtScreen
+// ---------------------------------------------------------------------------
+//
+CSwtScreen::~CSwtScreen()
+{
+    iDisplay.MobileDevice()->RemoveObserver(this);
+    iDisplay.RemoveResourceChangeObserver(this);
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::ConstructL()
+{
+    iDisplay.AddResourceChangeObserverL(this);
+    iDisplay.MobileDevice()->AddObserverL(this);
+    iScreenDevice = iDisplay.CoeEnv()->ScreenDevice();
+    if (!iScreenDevice)
+    {
+        User::Leave(ESwtErrorCannotGetSelection);
+    }
+    iIsTheOnlyScreen = (iDisplay.MobileDevice()->GetScreenNumber() == 1);
+    iOrientationState = EOrientationNotSet;
+    if (IsScreenOn())
+    {
+        iOrientation = CurrentOrientation();
+    }
+    else
+    {
+        iOrientation = KErrNotFound;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::IsScreenOn
+// ---------------------------------------------------------------------------
+//
+TBool CSwtScreen::IsScreenOn() const
+{
+    if (!iIsTheOnlyScreen)
+    {
+        if (iScreenDevice->GetScreenNumber() == iId)
+        {
+            return iActivationState;
+        }
+        else
+        {
+            return EFalse;
+        }
+    }
+    else
+    {
+        return ETrue;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::DoSetOrientationL
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::DoSetOrientationL()
+{
+    if (iOrientation == MSwtScreen::ELandscape)
+    {
+        iAvkonAppUi->SetOrientationL(CAknAppUiBase::EAppUiOrientationLandscape);
+    }
+    else
+    {
+        iAvkonAppUi->SetOrientationL(CAknAppUiBase::EAppUiOrientationPortrait);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::DoRefreshOrientationL
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::DoRefreshOrientationL()
+{
+    // Just to be safe clear and restore.
+    if (iOrientation == MSwtScreen::ELandscape)
+    {
+        iAvkonAppUi->SetOrientationL(
+            CAknAppUiBase::EAppUiOrientationPortrait);
+        iAvkonAppUi->SetOrientationL(
+            CAknAppUiBase::EAppUiOrientationLandscape);
+    }
+    else
+    {
+        iAvkonAppUi->SetOrientationL(
+            CAknAppUiBase::EAppUiOrientationLandscape);
+        iAvkonAppUi->SetOrientationL(
+            CAknAppUiBase::EAppUiOrientationPortrait);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::CurrentOrientation
+// ---------------------------------------------------------------------------
+//
+TInt CSwtScreen::CurrentOrientation()
+{
+    if (CSwtLafFacade::IsLandscapeOrientation())
+    {
+        return MSwtScreen::ELandscape;
+    }
+    else
+    {
+        return MSwtScreen::EPortrait;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::OfferResourceChangeL
+// From MSwtResourceChangeObserver
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::OfferResourceChangeL(TInt aType)
+{
+    // During a fast repetitive swap of the flip no screen will be active. This
+    // is ensured by the MobileDevice implementation. Therefore only when the
+    // fast repetitive swap ends a this layout change will be handled once.
+    if (aType == KEikDynamicLayoutVariantSwitch && IsScreenOn())
+    {
+        TInt currOrientation = CurrentOrientation();
+        switch (iOrientationState)
+        {
+        case EOrientationSet:
+            if (iOrientation == currOrientation)
+            {
+                iOrientationState = EOrientationAccepted;
+            }
+            else
+            {
+                iOrientationState = EOrientationRejected;
+            }
+            break;
+
+        case EOrientationNotSet:
+        case EOrientationRejected:
+            if (iOrientation != currOrientation
+                    && iOrientation != KErrNotFound)
+            {
+                iDisplay.PostScreenEventL(iPeer,
+                                          KEventScreenOrientationChanged);
+            }
+            iOrientation = currOrientation;
+            break;
+
+        default:
+            // Do nothing.
+            break;
+        }
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::ScreenDeactivatedL
+// From MSwtMobileDeviceObserver
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::ScreenDeactivatedL(TInt aScreenId)
+{
+    if (iId == aScreenId)
+    {
+        iActivationState = EFalse;
+        iDisplay.PostScreenEventL(iPeer, KEventScreenDeactivated);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::ScreenActivatedL
+// From MSwtMobileDeviceObserver
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::ScreenActivatedL(TInt aScreenId)
+{
+    if (iId == aScreenId)
+    {
+        iActivationState = ETrue;
+        iDisplay.PostScreenEventL(iPeer, KEventScreenActivated);
+
+        switch (iOrientationState)
+        {
+        case EOrientationPending:
+            // Do not change instruction order!
+            iOrientationState = EOrientationSet;
+            DoSetOrientationL();
+            break;
+
+        case EOrientationAccepted:
+            DoRefreshOrientationL();
+            break;
+
+        default:
+            // Do nothing.
+            break;
+        }
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::Dispose
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TSwtPeer CSwtScreen::Dispose()
+{
+    TSwtPeer peer(iPeer);
+    delete this;
+    return peer;
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::GetBounds
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TRect CSwtScreen::GetBounds()
+{
+    if (IsScreenOn())
+    {
+        return TRect(iScreenDevice->SizeInPixels());
+    }
+    else
+    {
+        return TRect();
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::GetColorDepth
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TInt CSwtScreen::GetColorDepth()
+{
+    if (IsScreenOn())
+    {
+        return TDisplayModeUtils::NumDisplayModeBitsPerPixel(
+                   iScreenDevice->DisplayMode());
+    }
+    else
+    {
+        return KErrNotFound;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::GetLocation
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TInt CSwtScreen::GetLocation()
+{
+    if (iDisplay.MobileDevice()->GetScreenNumber() > 1)
+    {
+        if (iId == KDefaultHwScreenId)
+        {
+            return MSwtMobileDevice::EInternal;
+        }
+        else
+        {
+            return MSwtMobileDevice::EExternal;
+        }
+    }
+    else
+    {
+        return MSwtMobileDevice::ELocal;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::GetOrientation
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TInt CSwtScreen::GetOrientation()
+{
+    if (IsScreenOn())
+    {
+        return CurrentOrientation();
+    }
+    else
+    {
+        return KErrNotFound;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::GetUsage
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TInt CSwtScreen::GetUsage()
+{
+    return MSwtScreen::EPrimary;
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::IsActive
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TBool CSwtScreen::IsActive()
+{
+    return IsScreenOn();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::IsTouchScreen
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+TBool CSwtScreen::IsTouchScreen()
+{
+    if (IsScreenOn())
+    {
+        return AknLayoutUtils::PenEnabled();
+    }
+    else
+    {
+        return EFalse;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CSwtScreen::SetOrientationL
+// From MSwtScreen
+// ---------------------------------------------------------------------------
+//
+void CSwtScreen::SetOrientationL(TInt aOrientation)
+{
+    iOrientation = aOrientation;
+    if (IsScreenOn())
+    {
+        // Do not change instruction order!
+        iOrientationState = EOrientationSet;
+        DoSetOrientationL();
+    }
+    else
+    {
+        iOrientationState = EOrientationPending;
+    }
+}