--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmultipagedialog.cpp Wed Sep 01 12:33:18 2010 +0100
@@ -0,0 +1,369 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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 <akntabgrp.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <eikappui.h>
+#include <aknappui.h>
+#include <AknsControlContext.h>
+#include <swtlaffacade.h>
+#include "swtcontrolhelper.h"
+#include "swtmultipagedialog.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+/**
+ * Destructor
+ */
+CSwtMultiPageDialog::~CSwtMultiPageDialog()
+{
+ Close();
+ iTabItems.Reset();
+ iTabItems.Close();
+ delete iNaviDecorator;
+ delete iRedirector;
+}
+
+/**
+ * 1st and 2nd phase constructor wrapper.
+ */
+CSwtMultiPageDialog* CSwtMultiPageDialog::NewL(MSwtDisplay& aDisplay,
+ TSwtPeer aPeer, MSwtShell& aParent)
+{
+ CSwtMultiPageDialog * self = new(ELeave) CSwtMultiPageDialog(
+ aDisplay, aPeer, aParent);
+ CleanupStack::PushL(self);
+
+ self->ConstructL();
+ self->InitControlBaseL();
+
+ CleanupStack::Pop(self);
+ return self;
+}
+
+/**
+ * 1st phase constructor.
+ */
+CSwtMultiPageDialog::CSwtMultiPageDialog(MSwtDisplay& aDisplay,
+ TSwtPeer aPeer, MSwtShell& aParent)
+ : ASwtControlBase(aDisplay, aPeer, aParent.Composite(), KSwtNone)
+ , iVisibleTab(-1)
+ , iTitleCount(0)
+{}
+
+/**
+ * 2nd phase constructor.
+ */
+void CSwtMultiPageDialog::ConstructL()
+{
+ // We create the TabGroup here
+ CEikStatusPane * sp = ((CAknAppUi*) iEikonEnv->EikAppUi()) ->StatusPane();
+ ASSERT(sp);
+ iNaviCtrlCtnr = static_cast<CAknNavigationControlContainer *>(
+ sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+ ASSERT(iNaviCtrlCtnr);
+ iNaviDecorator = iNaviCtrlCtnr->CreateTabGroupL();
+ ASSERT(iNaviDecorator);
+ iTabGroup = static_cast<CAknTabGroup*>(iNaviDecorator->DecoratedControl());
+ ASSERT(iTabGroup);
+ iTabGroup->SetObserver(this);
+
+ // create edit redirection flag
+ iRedirector = new(ELeave) CSwtEditIndicatorRedictor();
+ // We initialize the control that will receive the events
+ CCoeControl& coeParent = GetParent() ->Control() ->CoeControl();
+ SetContainerWindowL(coeParent);
+
+ CCoeControl::MakeVisible(coeParent.IsVisible());
+ CCoeControl::SetDimmed(coeParent.IsDimmed());
+ CCoeControl::SetFocusing(EFalse);
+ SetComponentsToInheritVisibility(ETrue);
+ ActivateL();
+}
+
+/**
+ * Calcuates the size of the tabs
+ */
+void CSwtMultiPageDialog::SizeChanged()
+{
+ HandleSizeChanged();
+}
+
+
+//
+// Virtual methods from MSwtControl
+//
+TRect CSwtMultiPageDialog::ClientRect() const
+{
+ return Rect();
+}
+
+CCoeControl& CSwtMultiPageDialog::CoeControl()
+{
+ return *this;
+}
+
+const CCoeControl& CSwtMultiPageDialog::CoeControl() const
+{
+ return *this;
+}
+
+TSize CSwtMultiPageDialog::ComputeSizeL(TInt /*aWHint*/, TInt /*aHHint*/)
+{
+ return MinimumSize();
+}
+
+TInt CSwtMultiPageDialog::GetBorderWidth() const
+{
+ return 0;
+}
+
+
+void CSwtMultiPageDialog::ProcessKeyEventL(const TKeyEvent& /*aKeyEvent*/,
+ TEventCode /*aType*/)
+{}
+
+TTypeUid::Ptr CSwtMultiPageDialog::MopSupplyObject(TTypeUid aId)
+{
+ if (iRedirector && aId.iUid == CSwtEditIndicatorRedictor::ETypeId)
+ {
+ return aId.MakePtr(iRedirector);
+ }
+
+ if (aId.iUid == MAknsControlContext::ETypeId)
+ {
+ return MAknsControlContext::SupplyMopObject(aId,
+ GetParent()->Control()->GetControlContext());
+ }
+
+ return CCoeControl::MopSupplyObject(aId);
+}
+
+//
+// Virtual methods from MSwtMultiPageDialog
+//
+
+MSwtControl* CSwtMultiPageDialog::Control()
+{
+ return this;
+}
+
+void CSwtMultiPageDialog::Close()
+{
+ ASSERT(iNaviCtrlCtnr);
+ if (iIsOpen)
+ {
+ iIsOpen = EFalse;
+ iNaviCtrlCtnr->Pop();
+ ((CAknAppUi*) iEikonEnv->EikAppUi()) ->StatusPane() ->DrawNow();
+ }
+}
+
+void CSwtMultiPageDialog::CreatePageL(MSwtComposite* aComposite,
+ const TDesC& aTitle, MSwtImage* aImage)
+{
+ ASSERT(aComposite);
+
+ //Lets change the MOP Parent so that we can serve children with objects
+ aComposite->Control()->CoeControl().SetMopParent(this);
+ aComposite->Control()->CoeControl().MakeVisible(EFalse);
+
+ TInt newId = 0;
+ if (iTabItems.Count() > 0)
+ {
+ newId = iTabItems[ iTabItems.Count() - 1 ].iTabId + 1;
+ }
+
+ if (aImage)
+ {
+ TAknLayoutText lrect = CSwtLafFacade::GetLayoutText(CSwtLafFacade::ETabs4ActivePaneT1, iTabGroup->Rect());
+ TSize size = SwtControlHelper::GetAspectRatioScaledBitmapSize(aImage->GetBounds().Size(), lrect.TextRect().Size());
+ CFbsBitmap* bmp = SwtControlHelper::GetCopyOfBitmapLC(&aImage->Bitmap(), size);
+ CFbsBitmap* mask = NULL;
+ iTabGroup->AddTabL(newId, bmp , mask);// Bitmap ownership transfered
+ iTabGroup->SetTabMultiColorMode(newId, ETrue);
+ CleanupStack::Pop(bmp);
+ }
+ else
+ {
+ iTabGroup->AddTabL(newId, aTitle);
+ }
+
+ iTitleCount++;
+
+ TTabItem tabItem;
+ tabItem.iComposite = aComposite;
+ tabItem.iTabId = newId;
+ tabItem.iHasTitle = aTitle.Length() > 0 ? ETrue : EFalse;
+ iTabItems.AppendL(tabItem);
+
+ iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
+ RefreshStatusPane();
+}
+
+void CSwtMultiPageDialog::DeletePageL(TInt aIndex)
+{
+ ASSERT(aIndex > -1);
+ ASSERT(aIndex < iTabItems.Count());
+ iTabGroup->DeleteTabL(iTabItems[aIndex].iTabId);
+ if (iTabItems[aIndex].iHasTitle)
+ {
+ iTitleCount--;
+ }
+ iTabItems.Remove(aIndex);
+ iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
+ RefreshStatusPane();
+ // in case the ActivePage has changed
+ if (aIndex == iVisibleTab)
+ {
+ iVisibleTab = -1;
+ if (iTabItems.Count() > 0)
+ {
+ ShowTab(iTabGroup->ActiveTabIndex());
+ }
+ }
+}
+
+TInt CSwtMultiPageDialog::GetSelectedIndex()
+{
+ return iTabGroup->ActiveTabIndex();
+}
+
+void CSwtMultiPageDialog::OpenL()
+{
+ ASSERT(iNaviCtrlCtnr);
+ if (!iIsOpen)
+ {
+ iNaviCtrlCtnr->PushL(*iNaviDecorator);
+ iIsOpen = ETrue;
+ if (iVisibleTab == -1 && iTabItems.Count() > 0)
+ {
+ SetSelection(0);
+ }
+ RefreshStatusPane();
+ }
+}
+
+void CSwtMultiPageDialog::SetSelection(TInt aIndex)
+{
+ ShowTab(aIndex);
+ iTabGroup->SetActiveTabByIndex(aIndex);
+}
+
+void CSwtMultiPageDialog::SetTitleAndImageL(TInt aIndex, const TDesC& aText, MSwtImage* aImage)
+{
+ ASSERT(aIndex > -1);
+ ASSERT(aIndex < iTabItems.Count());
+
+ CFbsBitmap* bmp = NULL;
+ CFbsBitmap* mask = NULL;
+ if (aImage)
+ {
+ TAknLayoutText lrect = CSwtLafFacade::GetLayoutText(CSwtLafFacade::ETabs4ActivePaneT1, iTabGroup->Rect());
+ TSize size = SwtControlHelper::GetAspectRatioScaledBitmapSize(aImage->GetBounds().Size(), lrect.TextRect().Size());
+ bmp = SwtControlHelper::GetCopyOfBitmapLC(&aImage->Bitmap(), size);
+ }
+ iTabGroup->ReplaceTabL(iTabGroup->TabIdFromIndex(aIndex), aText, bmp, mask); // Bitmap ownership transfered
+ if (bmp)
+ {
+ CleanupStack::Pop(bmp);
+ }
+
+ if (aText.Length() > 0 && !iTabItems[ aIndex ].iHasTitle)
+ {
+ iTabItems[ aIndex ].iHasTitle = ETrue;
+ iTitleCount++;
+ iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
+ }
+ else if (aText.Length() < 0 && iTabItems[ aIndex ].iHasTitle)
+ {
+ iTabItems[ aIndex ].iHasTitle = EFalse;
+ iTitleCount--;
+ iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
+ }
+
+ RefreshStatusPane();
+}
+
+void CSwtMultiPageDialog::SetTitleL(TInt aIndex, const TDesC& aText)
+{
+ ASSERT(aIndex > -1);
+ ASSERT(aIndex < iTabItems.Count());
+
+ iTabGroup->ReplaceTabTextL(aIndex, aText);
+ if (!iTabItems[ aIndex ].iHasTitle)
+ {
+ iTabItems[ aIndex ].iHasTitle = ETrue;
+ iTitleCount++;
+ iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
+ RefreshStatusPane();
+ }
+}
+
+
+//
+// From MAknTabObserver
+//
+void CSwtMultiPageDialog::TabChangedL(TInt aIndex)
+{
+ ShowTab(aIndex);
+ iDisplay.PostSelectionEventL(iPeer);
+}
+
+
+//
+// New methods
+//
+void CSwtMultiPageDialog::ShowTab(TInt aIndex)
+{
+ ASSERT(aIndex > -1);
+ ASSERT(aIndex < iTabItems.Count());
+
+ if (aIndex == iVisibleTab) return;
+ if (iVisibleTab >= 0 && iTabItems[ iVisibleTab ].iComposite)
+ {
+ iTabItems [iVisibleTab ].iComposite->Control() ->SetVisible(EFalse);
+ }
+
+ if (iTabItems[ aIndex ].iComposite)
+ {
+ iTabItems[ aIndex ].iComposite->Control() ->SetVisible(ETrue);
+ }
+ iVisibleTab = aIndex;
+}
+
+void CSwtMultiPageDialog::RefreshStatusPane() const
+{
+ if (iIsOpen)
+ {
+ ((CAknAppUi*) iEikonEnv->EikAppUi())->StatusPane()->DrawNow();
+ }
+}
+
+TInt CSwtMultiPageDialog::ComputeTabStyle() const
+{
+ switch (iTabItems.Count())
+ {
+ case 1:
+ return KTabWidthWithOneTab;
+ case 2:
+ return KTabWidthWithTwoTabs;
+ case 3:
+ return KTabWidthWithThreeTabs;
+ default:
+ return KTabWidthWithFourTabs;
+ }
+}
+