javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmultipagedialog.cpp
branchRCL_3
changeset 14 04becd199f91
child 24 6c158198356e
equal deleted inserted replaced
13:f5050f1da672 14:04becd199f91
       
     1 /*******************************************************************************
       
     2  * Copyright (c) 2007, 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3  * All rights reserved. This program and the accompanying materials
       
     4  * are made available under the terms of the Eclipse Public License v1.0
       
     5  * which accompanies this distribution, and is available at
       
     6  * http://www.eclipse.org/legal/epl-v10.html
       
     7  *
       
     8  * Contributors:
       
     9  *     Nokia Corporation - S60 implementation
       
    10  *******************************************************************************/
       
    11 
       
    12 
       
    13 #include <akntabgrp.h>
       
    14 #include <aknnavi.h>
       
    15 #include <aknnavide.h>
       
    16 #include <eikappui.h>
       
    17 #include <aknappui.h>
       
    18 #include <AknsControlContext.h>
       
    19 #include <swtlaffacade.h>
       
    20 #include "swtcontrolhelper.h"
       
    21 #include "swtmultipagedialog.h"
       
    22 
       
    23 
       
    24 // ======== MEMBER FUNCTIONS ========
       
    25 
       
    26 
       
    27 /**
       
    28  * Destructor
       
    29  */
       
    30 CSwtMultiPageDialog::~CSwtMultiPageDialog()
       
    31 {
       
    32     Close();
       
    33     iTabItems.Reset();
       
    34     iTabItems.Close();
       
    35     delete iNaviDecorator;
       
    36     delete iRedirector;
       
    37 }
       
    38 
       
    39 /**
       
    40  * 1st and 2nd phase constructor wrapper.
       
    41  */
       
    42 CSwtMultiPageDialog* CSwtMultiPageDialog::NewL(MSwtDisplay& aDisplay,
       
    43         TSwtPeer aPeer, MSwtShell& aParent)
       
    44 {
       
    45     CSwtMultiPageDialog * self = new(ELeave) CSwtMultiPageDialog(
       
    46         aDisplay, aPeer, aParent);
       
    47     CleanupStack::PushL(self);
       
    48 
       
    49     self->ConstructL();
       
    50     self->InitControlBaseL();
       
    51 
       
    52     CleanupStack::Pop(self);
       
    53     return self;
       
    54 }
       
    55 
       
    56 /**
       
    57  * 1st phase constructor.
       
    58  */
       
    59 CSwtMultiPageDialog::CSwtMultiPageDialog(MSwtDisplay& aDisplay,
       
    60         TSwtPeer aPeer, MSwtShell& aParent)
       
    61         : ASwtControlBase(aDisplay, aPeer, aParent.Composite(), KSwtNone)
       
    62         , iVisibleTab(-1)
       
    63         , iTitleCount(0)
       
    64 {}
       
    65 
       
    66 /**
       
    67  * 2nd phase constructor.
       
    68  */
       
    69 void CSwtMultiPageDialog::ConstructL()
       
    70 {
       
    71     // We create the TabGroup here
       
    72     CEikStatusPane * sp = ((CAknAppUi*) iEikonEnv->EikAppUi()) ->StatusPane();
       
    73     ASSERT(sp);
       
    74     iNaviCtrlCtnr = static_cast<CAknNavigationControlContainer *>(
       
    75                         sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
       
    76     ASSERT(iNaviCtrlCtnr);
       
    77     iNaviDecorator = iNaviCtrlCtnr->CreateTabGroupL();
       
    78     ASSERT(iNaviDecorator);
       
    79     iTabGroup = static_cast<CAknTabGroup*>(iNaviDecorator->DecoratedControl());
       
    80     ASSERT(iTabGroup);
       
    81     iTabGroup->SetObserver(this);
       
    82 
       
    83     // create edit redirection flag
       
    84     iRedirector = new(ELeave) CSwtEditIndicatorRedictor();
       
    85     // We initialize the control that will receive the events
       
    86     CCoeControl& coeParent = GetParent() ->Control() ->CoeControl();
       
    87     SetContainerWindowL(coeParent);
       
    88 
       
    89     CCoeControl::MakeVisible(coeParent.IsVisible());
       
    90     CCoeControl::SetDimmed(coeParent.IsDimmed());
       
    91     CCoeControl::SetFocusing(EFalse);
       
    92     SetComponentsToInheritVisibility(ETrue);
       
    93     ActivateL();
       
    94 }
       
    95 
       
    96 /**
       
    97  * Calcuates the size of the tabs
       
    98  */
       
    99 void CSwtMultiPageDialog::SizeChanged()
       
   100 {
       
   101     HandleSizeChanged();
       
   102 }
       
   103 
       
   104 
       
   105 //
       
   106 // Virtual methods from MSwtControl
       
   107 //
       
   108 TRect CSwtMultiPageDialog::ClientRect() const
       
   109 {
       
   110     return Rect();
       
   111 }
       
   112 
       
   113 CCoeControl& CSwtMultiPageDialog::CoeControl()
       
   114 {
       
   115     return *this;
       
   116 }
       
   117 
       
   118 const CCoeControl& CSwtMultiPageDialog::CoeControl() const
       
   119 {
       
   120     return *this;
       
   121 }
       
   122 
       
   123 TSize CSwtMultiPageDialog::ComputeSizeL(TInt /*aWHint*/, TInt /*aHHint*/)
       
   124 {
       
   125     return MinimumSize();
       
   126 }
       
   127 
       
   128 TInt CSwtMultiPageDialog::GetBorderWidth() const
       
   129 {
       
   130     return 0;
       
   131 }
       
   132 
       
   133 
       
   134 void CSwtMultiPageDialog::ProcessKeyEventL(const TKeyEvent& /*aKeyEvent*/,
       
   135         TEventCode /*aType*/)
       
   136 {}
       
   137 
       
   138 TTypeUid::Ptr CSwtMultiPageDialog::MopSupplyObject(TTypeUid aId)
       
   139 {
       
   140     if (iRedirector && aId.iUid == CSwtEditIndicatorRedictor::ETypeId)
       
   141     {
       
   142         return aId.MakePtr(iRedirector);
       
   143     }
       
   144 
       
   145     if (aId.iUid == MAknsControlContext::ETypeId)
       
   146     {
       
   147         return MAknsControlContext::SupplyMopObject(aId,
       
   148                 GetParent()->Control()->GetControlContext());
       
   149     }
       
   150 
       
   151     return CCoeControl::MopSupplyObject(aId);
       
   152 }
       
   153 
       
   154 //
       
   155 // Virtual methods from MSwtMultiPageDialog
       
   156 //
       
   157 
       
   158 MSwtControl* CSwtMultiPageDialog::Control()
       
   159 {
       
   160     return this;
       
   161 }
       
   162 
       
   163 void CSwtMultiPageDialog::Close()
       
   164 {
       
   165     ASSERT(iNaviCtrlCtnr);
       
   166     if (iIsOpen)
       
   167     {
       
   168         iIsOpen = EFalse;
       
   169         iNaviCtrlCtnr->Pop();
       
   170         ((CAknAppUi*) iEikonEnv->EikAppUi()) ->StatusPane() ->DrawNow();
       
   171     }
       
   172 }
       
   173 
       
   174 void CSwtMultiPageDialog::CreatePageL(MSwtComposite* aComposite,
       
   175                                       const TDesC& aTitle, MSwtImage* aImage)
       
   176 {
       
   177     ASSERT(aComposite);
       
   178 
       
   179     //Lets change the MOP Parent so that we can serve children with objects
       
   180     aComposite->Control()->CoeControl().SetMopParent(this);
       
   181     aComposite->Control()->CoeControl().MakeVisible(EFalse);
       
   182 
       
   183     TInt newId = 0;
       
   184     if (iTabItems.Count() > 0)
       
   185     {
       
   186         newId = iTabItems[ iTabItems.Count() - 1 ].iTabId + 1;
       
   187     }
       
   188 
       
   189     if (aImage)
       
   190     {
       
   191         TAknLayoutText lrect = CSwtLafFacade::GetLayoutText(CSwtLafFacade::ETabs4ActivePaneT1, iTabGroup->Rect());
       
   192         TSize size = SwtControlHelper::GetAspectRatioScaledBitmapSize(aImage->GetBounds().Size(), lrect.TextRect().Size());
       
   193         CFbsBitmap* bmp =  SwtControlHelper::GetCopyOfBitmapLC(&aImage->Bitmap(), size);
       
   194         CFbsBitmap* mask = NULL;
       
   195         iTabGroup->AddTabL(newId, bmp , mask);// Bitmap ownership transfered
       
   196         iTabGroup->SetTabMultiColorMode(newId, ETrue);
       
   197         CleanupStack::Pop(bmp);
       
   198     }
       
   199     else
       
   200     {
       
   201         iTabGroup->AddTabL(newId, aTitle);
       
   202     }
       
   203 
       
   204     iTitleCount++;
       
   205 
       
   206     TTabItem tabItem;
       
   207     tabItem.iComposite = aComposite;
       
   208     tabItem.iTabId = newId;
       
   209     tabItem.iHasTitle = aTitle.Length() > 0 ? ETrue : EFalse;
       
   210     iTabItems.Append(tabItem);
       
   211 
       
   212     iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
       
   213     RefreshStatusPane();
       
   214 }
       
   215 
       
   216 void CSwtMultiPageDialog::DeletePageL(TInt aIndex)
       
   217 {
       
   218     ASSERT(aIndex > -1);
       
   219     ASSERT(aIndex < iTabItems.Count());
       
   220     iTabGroup->DeleteTabL(iTabItems[aIndex].iTabId);
       
   221     if (iTabItems[aIndex].iHasTitle)
       
   222     {
       
   223         iTitleCount--;
       
   224     }
       
   225     iTabItems.Remove(aIndex);
       
   226     iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
       
   227     RefreshStatusPane();
       
   228     // in case the ActivePage has changed
       
   229     if (aIndex == iVisibleTab)
       
   230     {
       
   231         iVisibleTab = -1;
       
   232         if (iTabItems.Count() > 0)
       
   233         {
       
   234             ShowTab(iTabGroup->ActiveTabIndex());
       
   235         }
       
   236     }
       
   237 }
       
   238 
       
   239 TInt CSwtMultiPageDialog::GetSelectedIndex()
       
   240 {
       
   241     return iTabGroup->ActiveTabIndex();
       
   242 }
       
   243 
       
   244 void CSwtMultiPageDialog::OpenL()
       
   245 {
       
   246     ASSERT(iNaviCtrlCtnr);
       
   247     if (!iIsOpen)
       
   248     {
       
   249         iNaviCtrlCtnr->PushL(*iNaviDecorator);
       
   250         iIsOpen = ETrue;
       
   251         if (iVisibleTab == -1 && iTabItems.Count() > 0)
       
   252         {
       
   253             SetSelection(0);
       
   254         }
       
   255         RefreshStatusPane();
       
   256     }
       
   257 }
       
   258 
       
   259 void CSwtMultiPageDialog::SetSelection(TInt aIndex)
       
   260 {
       
   261     ShowTab(aIndex);
       
   262     iTabGroup->SetActiveTabByIndex(aIndex);
       
   263 }
       
   264 
       
   265 void CSwtMultiPageDialog::SetTitleAndImageL(TInt aIndex, const TDesC& aText, MSwtImage* aImage)
       
   266 {
       
   267     ASSERT(aIndex > -1);
       
   268     ASSERT(aIndex < iTabItems.Count());
       
   269 
       
   270     CFbsBitmap* bmp = NULL;
       
   271     CFbsBitmap* mask = NULL;
       
   272     if (aImage)
       
   273     {
       
   274         TAknLayoutText lrect = CSwtLafFacade::GetLayoutText(CSwtLafFacade::ETabs4ActivePaneT1, iTabGroup->Rect());
       
   275         TSize size = SwtControlHelper::GetAspectRatioScaledBitmapSize(aImage->GetBounds().Size(), lrect.TextRect().Size());
       
   276         bmp = SwtControlHelper::GetCopyOfBitmapLC(&aImage->Bitmap(), size);
       
   277     }
       
   278     iTabGroup->ReplaceTabL(iTabGroup->TabIdFromIndex(aIndex), aText, bmp, mask);       // Bitmap ownership transfered
       
   279     if (bmp)
       
   280     {
       
   281         CleanupStack::Pop(bmp);
       
   282     }
       
   283 
       
   284     if (aText.Length() > 0 && !iTabItems[ aIndex ].iHasTitle)
       
   285     {
       
   286         iTabItems[ aIndex ].iHasTitle = ETrue;
       
   287         iTitleCount++;
       
   288         iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
       
   289     }
       
   290     else if (aText.Length() < 0 && iTabItems[ aIndex ].iHasTitle)
       
   291     {
       
   292         iTabItems[ aIndex ].iHasTitle = EFalse;
       
   293         iTitleCount--;
       
   294         iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
       
   295     }
       
   296 
       
   297     RefreshStatusPane();
       
   298 }
       
   299 
       
   300 void CSwtMultiPageDialog::SetTitleL(TInt aIndex, const TDesC& aText)
       
   301 {
       
   302     ASSERT(aIndex > -1);
       
   303     ASSERT(aIndex < iTabItems.Count());
       
   304 
       
   305     iTabGroup->ReplaceTabTextL(aIndex, aText);
       
   306     if (!iTabItems[ aIndex ].iHasTitle)
       
   307     {
       
   308         iTabItems[ aIndex ].iHasTitle = ETrue;
       
   309         iTitleCount++;
       
   310         iTabGroup->SetTabFixedWidthL(ComputeTabStyle());
       
   311         RefreshStatusPane();
       
   312     }
       
   313 }
       
   314 
       
   315 
       
   316 //
       
   317 // From MAknTabObserver
       
   318 //
       
   319 void CSwtMultiPageDialog::TabChangedL(TInt aIndex)
       
   320 {
       
   321     ShowTab(aIndex);
       
   322     iDisplay.PostSelectionEventL(iPeer);
       
   323 }
       
   324 
       
   325 
       
   326 //
       
   327 // New methods
       
   328 //
       
   329 void CSwtMultiPageDialog::ShowTab(TInt aIndex)
       
   330 {
       
   331     ASSERT(aIndex > -1);
       
   332     ASSERT(aIndex < iTabItems.Count());
       
   333 
       
   334     if (aIndex == iVisibleTab) return;
       
   335     if (iVisibleTab >= 0 && iTabItems[ iVisibleTab ].iComposite)
       
   336     {
       
   337         iTabItems [iVisibleTab ].iComposite->Control() ->SetVisible(EFalse);
       
   338     }
       
   339 
       
   340     if (iTabItems[ aIndex ].iComposite)
       
   341     {
       
   342         iTabItems[ aIndex ].iComposite->Control() ->SetVisible(ETrue);
       
   343     }
       
   344     iVisibleTab = aIndex;
       
   345 }
       
   346 
       
   347 void CSwtMultiPageDialog::RefreshStatusPane() const
       
   348 {
       
   349     if (iIsOpen)
       
   350     {
       
   351         ((CAknAppUi*) iEikonEnv->EikAppUi())->StatusPane()->DrawNow();
       
   352     }
       
   353 }
       
   354 
       
   355 TInt CSwtMultiPageDialog::ComputeTabStyle() const
       
   356 {
       
   357     switch (iTabItems.Count())
       
   358     {
       
   359     case 1:
       
   360         return KTabWidthWithOneTab;
       
   361     case 2:
       
   362         return KTabWidthWithTwoTabs;
       
   363     case 3:
       
   364         return KTabWidthWithThreeTabs;
       
   365     default:
       
   366         return KTabWidthWithFourTabs;
       
   367     }
       
   368 }
       
   369