javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtmultipagedialog.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:48:13 +0300
branchRCL_3
changeset 60 6c158198356e
parent 19 04becd199f91
permissions -rw-r--r--
Revision: v2.2.9 Kit: 201033

/*******************************************************************************
 * 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;
    }
}