uifw/EikStd/coctlsrc/EIKCOLIB.CPP
changeset 0 2f259fa3e83a
child 10 9f56a4e1b8ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/EIKCOLIB.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,994 @@
+/*
+* Copyright (c) 1997-1999 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:
+*
+*/
+
+
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon/eikctrlstatus.h>
+#include <uikon/eikenvinterface.h>
+#endif
+#include <eikcolib.h>
+#include <eikappui.h>
+#include <eiktbar.h>
+#include <eikcoctl.rsg>
+#include <eikenv.h>
+#include <eikdoc.h>
+#include <eiklabel.h>
+#include <uikon.hrh>
+#include <eikapp.h>
+#include <eikmenub.h>
+#include <eikhkeyt.h>
+#include <eikhkeyc.h>
+#include <eikpanic.h>
+#include <eikcmbut.h>
+#include <eiksfont.h>
+#include <eikedwin.h>
+#include <eikmnbut.h>
+#include <eikimage.h>
+#include <eiklbbut.h>
+#include <eiktxlbx.h>
+#include <eikfnlab.h>
+#include <eikbtgpc.h>
+#include <eikscrlb.h>
+#include <uiklaf/private/lafappui.h>
+#include "LAFMENUB.H"
+#include <eikbtpan.h>
+#include <barsread.h>
+#include <barsc.h>
+#include <eikcba.h>
+#include "eikmop.h"
+#include <AknSgcc.h>
+#include <AknLayout.lag>
+#include <eikcoctlpanic.h>
+#include <akntoolbar.h>
+#include <akntoolbarextension.h>
+#include <aknappui.h>
+
+#ifdef RD_SCALABLE_UI_V2
+#include <featmgr.h>
+#include <bldvariant.hrh>
+#include <akntouchpane.h>
+#include <AknStatuspaneUtils.h>
+#include <aknpriv.rsg>
+#endif // RD_SCALABLE_UI_V2
+
+#include <layoutmetadata.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknPriv.hrh>
+#include <aknlayout.cdl.h>
+
+// Static DLL functions
+GLDEF_C void Panic(TEikPanic aPanic)
+    {
+    _LIT(KPanicCat,"EIKCOCTL");
+    User::Panic(KPanicCat,aPanic);
+    }
+
+GLDEF_C void Panic(TEikCoCtlPanic aPanic)
+    {
+    _LIT(KPanicCat,"AVKON-EIKCOCTL");
+    User::Panic(KPanicCat,aPanic);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// CEikAppUiFactoryExtension
+//
+///////////////////////////////////////////////////////////////////////////////////////
+    
+class CEikAppUiFactoryExtension : public CBase
+    {
+    public:
+        static CEikAppUiFactoryExtension* NewL();
+        void ReadAppInfoResourceExtensionL( TInt aResourceId );
+        ~CEikAppUiFactoryExtension();
+        void CreateDefaultToolbarL();
+    private:
+        CEikAppUiFactoryExtension();
+        void ConstructL();
+    public:
+        CEikButtonGroupContainer* iCba;
+        CAknTouchPane* iTouchPane;
+        CAknToolbar* iPopupToolbar;
+        CAknToolbar* iViewPopupToolbar; // not owned
+        CAknToolbar* iFixedToolbar; 
+        CAknToolbar* iViewFixedToolbar; // not owned
+        TBool iSplitInput;
+    };
+    
+CEikAppUiFactoryExtension* CEikAppUiFactoryExtension::NewL()
+    {
+    CEikAppUiFactoryExtension* self = new(ELeave) CEikAppUiFactoryExtension;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+CEikAppUiFactoryExtension::~CEikAppUiFactoryExtension()
+    {
+    delete iCba;
+#ifdef RD_SCALABLE_UI_V2 
+    delete iTouchPane;
+    delete iFixedToolbar; 
+#endif // RD_SCALABLE_UI_V2
+    delete iPopupToolbar;
+
+    }
+    
+CEikAppUiFactoryExtension::CEikAppUiFactoryExtension()
+    {
+    iSplitInput = EFalse;
+    }
+    
+void CEikAppUiFactoryExtension::ConstructL()
+    {
+    }
+    
+void CEikAppUiFactoryExtension::ReadAppInfoResourceExtensionL( TInt aExtResourceId )
+    {    
+    struct SEikAppInfoExtension
+        {
+        TInt iTouchPaneId;
+        TInt iPopupToolbarId;
+        TInt iSpare1Id;
+        TInt iSpare2Id;
+        } appInfoExt;
+       
+        TPtr8 ptr( ( TText8* )&appInfoExt, sizeof( appInfoExt ) );
+        // set all members of appInfo to zero, in case of ignored 
+        // leave during resource reading
+        ptr.FillZ(ptr.MaxLength());     
+
+    // if application resource structure has extension    
+    if ( aExtResourceId )
+        {
+        CCoeEnv::Static()->ReadResourceAsDes8L( ptr, aExtResourceId );
+        }
+        
+#ifdef RD_SCALABLE_UI_V2
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdPenSupport ) )
+        {
+        delete iTouchPane; iTouchPane = NULL;
+
+        if ( appInfoExt.iTouchPaneId )
+            {
+            iTouchPane = CAknTouchPane::NewL( appInfoExt.iTouchPaneId );
+            }
+        else
+            {
+            iTouchPane = CAknTouchPane::NewL();
+            }
+        }
+    FeatureManager::UnInitializeLib();
+#endif // RD_SCALABLE_UI_V2
+        
+    if ( appInfoExt.iPopupToolbarId )
+        {
+        if ( iPopupToolbar )
+            {
+            delete iPopupToolbar;
+            iPopupToolbar = NULL;
+            }
+        iPopupToolbar = CAknToolbar::NewL( appInfoExt.iPopupToolbarId );
+        CEikonEnv* eikEnv = CEikonEnv::Static();
+        CAknAppUi* base = (CAknAppUi*)eikEnv->EikAppUi();
+        if (base)
+            {
+            iPopupToolbar->SetMopParent(base);
+            }
+#ifdef RD_SCALABLE_UI_V2 
+        if ( iPopupToolbar->ToolbarFlags() & KAknToolbarFixed )
+            {
+            iFixedToolbar = iPopupToolbar; 
+            iPopupToolbar = NULL; 
+            }
+        if ( iTouchPane )
+            {
+            iPopupToolbar->SetObserver( iTouchPane );
+            }
+#endif // RD_SCALABLE_UI_V2
+        }
+    if ( !iFixedToolbar ) 
+        {
+        CreateDefaultToolbarL();
+        }
+    }
+    
+void CEikAppUiFactoryExtension::CreateDefaultToolbarL()
+    {
+    if ( !iFixedToolbar ) 
+        {
+        iFixedToolbar = CAknToolbar::NewL( R_AKNPRIV_TOOLBAR );
+        CEikonEnv* eikEnv = CEikonEnv::Static();
+        CAknAppUi* base = (CAknAppUi*)eikEnv->EikAppUi();
+        if (base)
+            {
+            iFixedToolbar->SetMopParent(base);
+            }
+        }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// CEikCoCtlLibrary
+//
+///////////////////////////////////////////////////////////////////////////////////////
+CEikCoCtlLibrary::CEikCoCtlLibrary()
+    {
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// ResourceFile
+//
+///////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C TFileName CEikCoCtlLibrary::ResourceFile()
+    {
+    _LIT(KResFileName,"z:\\resource\\eikcoctl.rsc");
+    return KResFileName();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// ControlFactory
+//
+///////////////////////////////////////////////////////////////////////////////////////
+EXPORT_C TCreateByTypeFunction  CEikCoCtlLibrary::ControlFactory()
+    {
+    return CreateByTypeL;
+    }
+
+/**
+ * @internal
+ * Internal to Symbian
+ * @since App-Framework_6.1
+ */
+EXPORT_C TCreateButtonGroupByTypeFunction CEikCoCtlLibrary::ButtonGroupFactory()
+    {//static
+    return CreateButtonGroupByTypeL;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// CreateByTypeL
+//
+///////////////////////////////////////////////////////////////////////////////////////
+SEikControlInfo CEikCoCtlLibrary::CreateByTypeL(TInt aControlType)
+    {
+    SEikControlInfo controlInfo;
+    controlInfo.iControl = NULL;
+    controlInfo.iTrailerTextId = 0;
+    controlInfo.iFlags = 0;
+
+    switch (aControlType)
+        {
+    case EEikCtEdwin:
+        controlInfo.iControl = new(ELeave) CEikEdwin;
+        break;
+    case EEikCtListBox:
+        controlInfo.iControl = new(ELeave) CEikTextListBox;
+        break;
+    case EEikCtLabel:
+        controlInfo.iControl = new(ELeave) CEikLabel;
+        controlInfo.iFlags = EEikControlIsNonFocusing|EEikControlHasExtraAscent;
+        break;
+    case EEikCtImage:
+        controlInfo.iControl = new(ELeave) CEikImage;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtCommandButton:
+        controlInfo.iControl= new(ELeave) CEikCommandButton;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtFileNameLabel:
+        controlInfo.iControl = new(ELeave) CEikFileNameLabel;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtMenuButton:
+        controlInfo.iControl= new(ELeave) CEikMenuButton;
+        break;
+    case EEikCtTextButton:
+        controlInfo.iControl= new(ELeave) CEikTextButton;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtBitmapButton:
+        controlInfo.iControl= new(ELeave) CEikBitmapButton;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtLabeledButton:
+        controlInfo.iControl = new(ELeave) CEikLabeledButton;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtTwoPictureCommandButton:
+        controlInfo.iControl= new(ELeave) CEikTwoPictureCommandButton;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtInverterCommandButton:
+        controlInfo.iControl= new(ELeave) CEikInverterCommandButton;
+        controlInfo.iFlags = EEikControlIsNonFocusing;
+        break;
+    case EEikCtScrollBar:
+        controlInfo.iControl    = new(ELeave) CEikScrollBar;
+        controlInfo.iFlags  = EEikControlIsNonFocusing;
+        break;
+    case EAknCtToolbarExtension:
+        controlInfo.iControl = CAknToolbarExtension::NewL();
+        break;
+    default:
+        break;
+        }
+    return controlInfo;
+    }
+
+/**
+ * Creates the button group identified by aButtonGroupType, if it exists in this button
+ * group factory.  Extra required information is supplied in aCreationData.  If the button group
+ * is to be added to the button group stack then this can be set in aAddToButtonGroupStack.
+ * If the aButtonGroupType value does not exist, then it returns NULL.
+ *
+ * @internal
+ * Internal to Symbian
+ * @since App-Framework_6.1
+ */
+MEikButtonGroup* CEikCoCtlLibrary::CreateButtonGroupByTypeL(TInt aButtonGroupType,EikButtonGroupFactory::TCreationData& aCreationData,TBool& aAddToButtonGroupStack)
+    {//static
+    MEikButtonGroup* buttonGroup = NULL;
+
+    switch (aButtonGroupType)
+        {
+    case EEikBgToolBar:
+        {
+        CEikToolBar* toolBar=new(ELeave) CEikToolBar;
+        CleanupStack::PushL(toolBar);
+        TRect rect(CCoeEnv::Static()->ScreenDevice()->SizeInPixels());
+        toolBar->ConstructL(aCreationData.iCommandObserver,aCreationData.iResourceId,rect);
+        CleanupStack::Pop(); // toolBar
+        buttonGroup = toolBar;
+        }
+        break;
+    case EEikBgButtonPanel:
+        {
+        CEikButtonPanel* buttonPanel=new(ELeave) CEikButtonPanel;
+        CleanupStack::PushL(buttonPanel);
+        CEikButtonGroupContainer* container = static_cast<CEikButtonGroupContainer*>(aCreationData.iCommandObserver);
+        buttonPanel->SetContainerWindowL(*container);
+        buttonPanel->SetCommandObserver(aCreationData.iCommandObserver);
+        if (aCreationData.iResourceId==0)
+            buttonPanel->ConstructL();
+        else
+            {
+            TResourceReader reader;
+            CCoeEnv::Static()->CreateResourceReaderLC(reader,aCreationData.iResourceId);
+            buttonPanel->ConstructFromResourceL(reader);
+            CleanupStack::PopAndDestroy(); // reader
+            }
+        if (aCreationData.iOrientation==CEikButtonGroupContainer::EHorizontal)
+            buttonPanel->SetHorizontal();
+        CleanupStack::Pop(); // buttonPanel
+        buttonGroup = buttonPanel;
+        }
+        break;
+    case EEikBgCba:
+        {
+        buttonGroup = CEikCba::NewLC(aCreationData.iResourceId, NULL,
+            aCreationData.iCommandObserver, aCreationData.iParentWg,
+            aCreationData.iFlags);
+        CleanupStack::Pop(); // cba
+        aAddToButtonGroupStack=ETrue;
+        }
+        break;
+    default:
+        break;
+        }
+    return buttonGroup;
+    }
+
+
+/**
+ * @internal
+ */
+EXPORT_C CEikAppUiFactory::CEikAppUiFactory()
+    : iSidebarPopupId(-1)
+    {
+    }
+
+/**
+ * @internal
+ */
+CEikAppUiFactory::~CEikAppUiFactory()
+    {
+    CCoeAppUi* appUi = CEikonEnv::Static()->EikAppUi();
+    if ( appUi )
+        appUi->RemoveFromStack(iMenuBar);
+    delete(iMenuBar);
+    delete(iToolBar);
+    delete(iToolBand);
+    delete(iTitleBand);
+    delete(iStatusPane);
+    delete(iExtension);
+    }
+
+CEikCommandButton* CEikAppUiFactory::CreateStandardTabButtonL() const
+    {
+    CEikCommandButton *tabButton= new(ELeave) CEikCommandButton;
+    CleanupStack::PushL(tabButton);
+    TBuf<1> buf;
+    buf.Append(TChar(ESymFontTabout));
+    tabButton->SetTextL(buf);
+    tabButton->Label()->SetFont(CEikonEnv::Static()->SymbolFont());
+    const TInt height = CEikonEnv::Static()->EditableControlStandardHeight();
+    tabButton->SetSize(TSize(height+3,height));
+    CleanupStack::Pop();
+    return(tabButton);
+    }
+
+void CEikAppUiFactory::CreateEmbeddedL(CEikonEnv& aEikonEnv)
+    {
+    CEikAppUiFactory* embeddedAppUiFactory = new(ELeave) CEikAppUiFactory();
+    CleanupStack::PushL(embeddedAppUiFactory);
+    aEikonEnv.AddAppUiFactoryL(embeddedAppUiFactory);
+    CleanupStack::Pop();
+    }
+
+void CEikAppUiFactory::DestroyEmbedded(CEikonEnv& aEikonEnv)
+    {
+    aEikonEnv.RemoveAppUiFactory();
+    delete this;
+    }
+
+void CEikAppUiFactory::CreateResourceIndependentFurnitureL(CEikAppUi* aAppUi)
+    {
+#ifdef RD_SCALABLE_UI_V2
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdPenSupport ) )
+        {
+        if ( !iExtension )
+            {
+            iExtension = CEikAppUiFactoryExtension::NewL();
+            }
+
+        if ( iExtension && !( iExtension->iTouchPane ) )
+            {
+            iExtension->iTouchPane = CAknTouchPane::NewL();
+            }
+            
+        if ( iExtension )
+            {
+            iExtension->CreateDefaultToolbarL();
+            }
+        }
+    FeatureManager::UnInitializeLib();
+#endif // RD_SCALABLE_UI_V2
+
+    if(aAppUi->ContainerAppUi())
+        {
+        AddTitleBandL(aAppUi);
+        }
+    CEikonEnv* eikEnv = CEikonEnv::Static();
+    if (eikEnv->StatusPaneCoreResId() != 0)
+        {
+        iStatusPane = CEikStatusPane::NewL(*eikEnv, &eikEnv->RootWin(), eikEnv->StatusPaneCoreResId(), EEikStatusPaneUseDefaults);
+        CAknSgcClient::HandleChangeL(); // has to be called after iStatusPane is assigned
+        }
+    }
+
+void CEikAppUiFactory::AddTitleBandL(CEikAppUi* /*aAppUi*/)
+    {
+/* AKNLAF - Series 60 does not require a title band for embedded apps
+    iTitleBand=new(ELeave) CEikToolBar;
+    iTitleBand->StaticConstructL(aAppUi,R_EIK_TBAR_TITLE);
+    TBuf<64> tmp;
+    const TApaAppCaption& object=aAppUi->Document()->AppCaption();
+    const TApaAppCaption& container=aAppUi->ContainerAppUi()->Document()->AppCaption();
+    CCoeEnv::Static()->Format128(tmp,R_EIK_TBUF_TITLE_BAR_LABEL,&object,&container);
+    STATIC_CAST(CEikLabel*,iTitleBand->ControlById(EEikCidTitleBarLabel))->SetTextL(tmp);
+    CCoeControl* ctrl=iTitleBand->ControlById(EEikCidTitleBatFileNameLabel);
+    if (ctrl)
+        {
+        const TInt index=iTitleBand->IndexById(EEikCidTitleBatFileNameLabel);
+        CArrayFix<TEikGroupControl>* ctrlArray=iTitleBand->ControlArray();
+        if (index==ctrlArray->Count()-1)
+            {
+            const TInt width=(iToolBar ? iToolBar->Size().iWidth : KEikStdFileNameLabelWidth);
+            (*ctrlArray)[index].SetLength(width);
+            STATIC_CAST(CEikFileNameLabel*,iTitleBand->ControlById(EEikCidTitleBatFileNameLabel))->UpdateL();
+            }
+        }
+    const TRect rect(aAppUi->ApplicationRect());
+    iTitleBand->SetBoundingRect(rect);
+    if (!(iTitleBand->DelayActivation()))
+        iTitleBand->ActivateL();
+*/
+    }
+
+
+TRect CEikAppUiFactory::ClientRect()
+    {
+    CCoeEnv* env = CCoeEnv::Static();
+    TRect rect = LafAppUi::ClientRect( *env, *this );
+
+#ifdef RD_SCALABLE_UI_V2
+    if ( TouchPane() )
+        {
+        TouchPane()->ReduceRect( rect );
+        }
+
+    CAknToolbar* toolbar = CurrentFixedToolbar();
+
+    // reduce fixed toolbar's area
+    if ( toolbar )
+        {
+        TInt flags = toolbar->ToolbarFlags();
+
+        if ( flags & KAknToolbarFixed && !( flags & KAknToolbarDefault ) )
+            {
+            toolbar->ReduceRect( rect );
+            }
+        }
+
+	  // recaculate the client rect is splitinput is enabled.
+    if ( iExtension && iExtension->iSplitInput )
+        {
+        TInt inputTop = rect.iBr.iY;
+        TAknLayoutRect splitwnd;
+		TRect screenRect ;
+		AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+
+        if ( Layout_Meta_Data::IsLandscapeOrientation() )
+            {
+            splitwnd.LayoutRect( screenRect, AknLayoutScalable_Avkon::popup_fep_vkbss_window (0).LayoutLine() );
+            TRect wndRc = splitwnd.Rect();
+            inputTop = wndRc.iTl.iY;
+            }
+        else
+            {
+            splitwnd.LayoutRect( screenRect, AknLayoutScalable_Avkon::popup_fep_ituss_window(0).LayoutLine() );
+            TRect wndRc = splitwnd.Rect();
+            inputTop = wndRc.iTl.iY;
+            }
+        rect.iBr.iY = rect.iBr.iY > inputTop ? inputTop : rect.iBr.iY;
+        rect.iTl.iY = 0;
+        }
+
+#endif // RD_SCALABLE_UI_V2	
+
+    return rect;
+    }
+
+void CEikAppUiFactory::ReadAppInfoResourceL(TInt aResourceFileOffset, CEikAppUi* aAppUi)
+    {
+    const TInt resourceFileOffset=(aResourceFileOffset)? aResourceFileOffset : aAppUi->Application()->ResourceFileOffset();
+    SEikAppInfo appInfo;
+    TPtr8 ptr((TText8*)&appInfo,sizeof(appInfo));
+    ptr.FillZ(ptr.MaxLength());     // set all members of appInfo to zero, in case of ignored leave during resource reading
+    CCoeEnv::Static()->ReadResourceAsDes8L(ptr,EAppInfoResourceOffset+resourceFileOffset);
+    
+    if (!iExtension)
+        {
+        iExtension = CEikAppUiFactoryExtension::NewL();
+        }
+
+    iExtension->ReadAppInfoResourceExtensionL(appInfo.iExtensionId);
+
+    if (appInfo.iMenuBarId)
+        {
+        iMenuBar=new(ELeave) CEikMenuBar;
+        iMenuBar->ConstructL(aAppUi,appInfo.iHotKeysId,appInfo.iMenuBarId);
+        aAppUi->AddToStackL(iMenuBar,ECoeStackPriorityMenu,ECoeStackFlagRefusesFocus);
+        if (LafMenuBar::IsAlwaysVisible())
+            {
+            iMenuBar->TryDisplayMenuBarL();
+            }
+        }
+    TRect boundingRect=ClientRect(); // make toolband stretch to the screen width by default
+    // !!! Toolbar / CBA decision should be made in the LAF.
+    CEikonEnv* eikEnv = CEikonEnv::Static();
+    if (eikEnv->StatusPaneCoreResId() != 0)
+        {
+        iStatusPane = CEikStatusPane::NewL(*eikEnv, &eikEnv->RootWin(), eikEnv->StatusPaneCoreResId(), appInfo.iStatusPaneId);
+        CAknSgcClient::HandleChangeL(); // has to be called after iStatusPane is assigned
+        iStatusPane->ReduceRect(boundingRect);
+
+#ifdef RD_SCALABLE_UI_V2
+        // Hide touch pane when compatible statuspane is no active
+        if ( TouchPane() && !AknStatuspaneUtils::TouchPaneCompatibleLayoutActive() )
+            {
+            TouchPane()->MakeVisible( EFalse );
+            }
+#endif // RD_SCALABLE_UI_V2
+
+#ifdef RD_SCALABLE_UI_V2
+        // Hide toolbar when compatible statuspane is not active
+        if ( iExtension->iFixedToolbar && ( !AknStatuspaneUtils::TouchPaneCompatibleLayoutActive() ||
+            appInfo.iStatusPaneId == R_AVKON_STATUS_PANE_LAYOUT_EMPTY ) )
+            {
+            iExtension->iFixedToolbar->SetToolbarVisibility( EFalse );
+            }
+#endif // RD_SCALABLE_UI_V2
+
+
+        }
+
+    if (appInfo.iCbaId)
+        {
+        iExtension->iCba = CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba,
+            CEikButtonGroupContainer::EHorizontal/*LafCba::Orientation()*/, aAppUi,appInfo.iCbaId);
+        iExtension->iCba->SetBoundingRect(boundingRect);
+        iExtension->iCba->ReduceRect(boundingRect);
+//      iToolBar=CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::ECba,
+//                                              CEikButtonGroupContainer::EVertical,
+//                                              aAppUi,appInfo.iCbaId);
+//      iToolBar->SetBoundingRect(boundingRect);
+        }
+    if (appInfo.iToolBarId)
+        {
+        iToolBar=CEikButtonGroupContainer::NewL(CEikButtonGroupContainer::EToolbar,CEikButtonGroupContainer::EVertical,
+                                                aAppUi,appInfo.iToolBarId);
+        iToolBar->SetBoundingRect(boundingRect);
+        }
+    if (aAppUi->ContainerAppUi())
+        AddTitleBandL(aAppUi);
+    if (appInfo.iToolBandId)
+        {
+        boundingRect.iTl.iY=ClientRect().iTl.iY;
+        iToolBand=new(ELeave) CEikToolBar;
+        iToolBand->StaticConstructL(aAppUi,appInfo.iToolBandId);
+        if (iTitleBand)
+            iToolBand->SetAdjacent(EGulAdjTop);
+        iToolBand->SetBoundingRect(boundingRect);
+        if (!iToolBand->DelayActivation())
+            iToolBand->ActivateL();
+        if (iToolBar) // in case toolbar/band overlap, put bar in front
+            iToolBar->DrawableWindow()->SetOrdinalPosition(0);
+        }
+    if (iTitleBand) // put title band in front
+        iTitleBand->DrawableWindow()->SetOrdinalPosition(0);
+    
+    }
+
+void CEikAppUiFactory::LaunchPopupMenuL(
+                            TInt aResourceId,
+                            const TPoint& aTargetPos,
+                            TPopupTargetPosType aTargetType,
+                            const CEikHotKeyTable* aHotKeyTable,
+                            CEikAppUi* aAppUi)
+    {
+    ClosePopup(aAppUi);
+    iPopup=new(ELeave) CEikMenuPane(aAppUi);
+    TRAPD(err,DoLaunchPopupL(aResourceId,aTargetPos,aHotKeyTable,aTargetType, aAppUi));
+    if (err)
+        {
+        ClosePopup(aAppUi);
+        User::Leave(err);
+        }
+    }
+
+void CEikAppUiFactory::DoLaunchPopupL(TInt aResourceId,
+                                      const TPoint& aTargetPos,
+                                      const CEikHotKeyTable* aHotKeyTable,
+                                      TPopupTargetPosType aTargetType,
+                                      CEikAppUi* aAppUi)
+    {
+    iPopup->ConstructL(NULL);
+    aAppUi->RestoreMenuL(iPopup,aResourceId,MEikMenuObserver::EMenuPane);
+    iPopup->SetPointerCapture(ETrue);
+    aAppUi->AddToStackL(iPopup,ECoeStackPriorityDialog);
+    iPopup->StartDisplayingMenuPane(aHotKeyTable,aTargetPos,NULL,0,aTargetType);
+    }
+
+void CEikAppUiFactory::ClosePopup(CEikAppUi* aAppUi)
+    {
+    if (iPopup)
+        {
+        aAppUi->RemoveFromStack(iPopup);
+        delete(iPopup);
+        iPopup=NULL;
+        }
+    iSidebarPopupId=-1;
+    }
+
+void CEikAppUiFactory::StopDisplayingMenuBar()
+    {
+    if (iMenuBar)
+            iMenuBar->StopDisplayingMenuBar();
+    }
+
+void CEikAppUiFactory::HandleSideBarMenuL(
+                            TInt aResourceId,
+                            const TPoint& aPos,
+                            const CEikHotKeyTable* aHotKeyTable,
+                            CEikAppUi* aAppUi)
+    {
+    TBool launchSidebarPopup(iSidebarPopupId!=aResourceId && (aResourceId==R_EIK_SIDEBAR_EDIT_MENU || aResourceId==R_EIK_SIDEBAR_IRDA_MENU));
+    if (iPopup)
+        ClosePopup(aAppUi);// sets iSidebarPopupId to -1
+    if (aResourceId==0) // 0 indicates menu bar
+        {
+        iMenuBar->TryDisplayMenuBarL();
+        const TInt title=iMenuBar->SelectedTitle();
+        const TInt item=iMenuBar->SelectedItem();
+        iMenuBar->MoveHighlightToL(title, (item>=0?item:0));
+        return;
+        }
+    // otherwise a popup menu
+    if (iMenuBar)
+        iMenuBar->StopDisplayingMenuBar();
+    if (launchSidebarPopup)
+        {
+        LaunchPopupMenuL(aResourceId,aPos,EPopupTargetTopLeft,aHotKeyTable, aAppUi);
+        iSidebarPopupId=aResourceId;
+        }
+    }
+
+
+void CEikAppUiFactory::CreateHotKeyControlL(TInt aResourceId, CEikAppUi* aAppUi)
+    {
+    CEikHotKeyTable* table=new(ELeave) CEikHotKeyTable;
+    CleanupStack::PushL(table);
+    table->ConstructFromResourceL(aResourceId);
+    CEikHotKeyControl* control=new(ELeave) CEikHotKeyControl(table,aAppUi);
+    CleanupStack::Pop(); // table now owned by control
+    CleanupStack::PushL(control);
+    aAppUi->AddToStackL(control,ECoeStackPriorityMenu,ECoeStackFlagRefusesFocus|ECoeStackFlagOwnershipTransfered);
+    CleanupStack::Pop();
+    }
+
+CEikMenuBar* CEikAppUiFactory::MenuBar() const
+    {
+    return iMenuBar;
+    }
+
+CEikMenuBar* CEikAppUiFactory::SwapMenuBar(CEikMenuBar* aMenu)
+    {
+    CEikMenuBar* oldMenu=iMenuBar;
+    iMenuBar=aMenu;
+    return oldMenu;
+    }
+
+CEikMenuPane* CEikAppUiFactory::Popup() const
+    {
+    return iPopup;
+    }
+
+CEikButtonGroupContainer* CEikAppUiFactory::ToolBar() const
+    {
+   // return iToolBar;
+    return (iExtension ? iExtension->iCba : NULL);
+    }
+
+CEikButtonGroupContainer* CEikAppUiFactory::SwapButtonGroup(CEikButtonGroupContainer* aNewGroup)
+    {
+    CEikButtonGroupContainer* old=iToolBar;
+    iToolBar=aNewGroup;
+    return old;
+    }
+
+CEikToolBar* CEikAppUiFactory::ToolBand() const
+    {
+    return iToolBand;
+    }
+
+CEikToolBar* CEikAppUiFactory::TitleBand() const
+    {
+    return iTitleBand;
+    }
+
+CEikStatusPane* CEikAppUiFactory::StatusPane() const
+    {
+    return iStatusPane;
+    }
+
+CEikButtonGroupContainer* CEikAppUiFactory::Cba() const
+    {
+    return (iExtension ? iExtension->iCba : NULL);
+    }
+
+CEikToolBar* CEikAppUiFactory::SwapToolBar(CEikToolBar* aToolBar,TToolBarType aType)
+    {
+    CEikToolBar* old=NULL;
+    if (aType==EBand)
+        {
+        old=iToolBand;
+        iToolBand=aToolBar;
+        }
+    else // aType==ETitle
+        {
+        old=iTitleBand;
+        iTitleBand=aToolBar;
+        }
+    return old;
+    }
+
+void CEikAppUiFactory::HandleResourceChangeL(TInt aType)
+    {
+	
+    if ( iExtension )
+        {
+        if ( aType == KAknSplitInputEnabled )
+            {
+            iExtension->iSplitInput = ETrue;
+            }
+        else if ( aType == KAknSplitInputDisabled )
+            {
+            iExtension->iSplitInput = EFalse;
+            }
+        }
+    
+    if(iStatusPane)
+        iStatusPane->HandleResourceChange(aType);
+    if(iExtension && iExtension->iCba)
+        iExtension->iCba->HandleResourceChange(aType);
+    if(iMenuBar)
+        iMenuBar->HandleResourceChange(aType);
+    if(iToolBar)
+        iToolBar->HandleResourceChange(aType);
+    if(iToolBand)
+        iToolBand->HandleResourceChange(aType);
+    if(iTitleBand)
+        iTitleBand->HandleResourceChange(aType);
+    if(iPopup)
+        iPopup->HandleResourceChange(aType);
+#ifdef RD_SCALABLE_UI_V2
+    if (TouchPane())
+        TouchPane()->HandleResourceChange(aType);
+#endif // RD_SCALABLE_UI_V2
+    }
+
+EXPORT_C CAknTouchPane* CEikAppUiFactory::TouchPane() const
+    {
+    return (iExtension ? iExtension->iTouchPane : NULL);
+    }
+
+// -----------------------------------------------------------------------------
+// CEikAppUiFactory::PopupToolbar
+// Returns the toolbar for the application or NULL.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknToolbar* CEikAppUiFactory::PopupToolbar() const
+    {
+    // if there is specific floating toolbar for appui then that will be 
+    // returned, otherwise fixed toolbar or NULL
+    if ( iExtension )
+        {
+        if ( iExtension->iPopupToolbar ) 
+            {
+            return iExtension->iPopupToolbar; 
+            }
+        else 
+            {
+#ifdef RD_SCALABLE_UI_V2
+            return iExtension->iFixedToolbar; 
+#else 
+            return NULL; 
+#endif
+
+            }
+        }
+    return NULL; 
+    }
+    
+// -----------------------------------------------------------------------------
+// CEikAppUiFactory::CurrentPopupToolbar
+// If current view has toolbar it will return that one, otherwise it will return 
+// application toolbar or NULL.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknToolbar* CEikAppUiFactory::CurrentPopupToolbar() const
+    {
+    // if there is specific toolbar for the view then this one will be returned, otherwise
+    // application toolbar will be returned.
+    if (!iExtension)
+        return NULL;
+
+    return iExtension->iViewPopupToolbar ?  iExtension->iViewPopupToolbar:  
+                                            iExtension->iPopupToolbar;    
+    }
+
+
+    
+// -----------------------------------------------------------------------------
+// CEikAppUiFactory::CurrentFixedToolbar
+// If current view has fixed toolbar it will return that one, otherwise it will 
+// return application fixed toolbar or NULL.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknToolbar* CEikAppUiFactory::CurrentFixedToolbar() const
+    {
+    // if there is specific toolbar for the view then this one will be returned, otherwise
+    // application toolbar will be returned.
+    if (!iExtension)
+        return NULL;
+
+    return iExtension->iViewFixedToolbar ? iExtension->iViewFixedToolbar :
+                                           iExtension->iFixedToolbar;                                       
+    }
+
+
+// -----------------------------------------------------------------------------
+// CEikAppUiFactory::SetViewPopupToolbar
+// Sets view specific toolbar when view is activated. Called by CAknView
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CEikAppUiFactory::SetViewPopupToolbar(CAknToolbar* aViewPopupToolbar)
+    {
+    // not sure if we should try to create extension here	
+    if (iExtension)
+        iExtension->iViewPopupToolbar = aViewPopupToolbar;
+    }
+
+// -----------------------------------------------------------------------------
+// CEikAppUiFactory::SetViewPopupToolbar
+// Sets view specific toolbar when view is activated. Called by CAknView
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CEikAppUiFactory::SetViewFixedToolbar(CAknToolbar* aViewFixedToolbar)
+    {
+    // not sure if we should try to create extension here	
+    if (iExtension)
+        iExtension->iViewFixedToolbar = aViewFixedToolbar;
+    }
+
+
+
+void CEikAppUiFactory::ReduceRect(TScreenFurniture aScreenFurniture,TRect& aRect) const
+    {
+    switch (aScreenFurniture)
+        {
+    case EMenuBar:
+        if (iMenuBar)
+            iMenuBar->ReduceRect(aRect);
+        break;
+    case EButtonGroup:
+        if (iToolBar)
+            iToolBar->ReduceRect(aRect);
+        break;
+    case EToolBand:
+        if (iToolBand)
+            iToolBand->ReduceRect(aRect);
+        break;
+    case ETitleBand:
+        if (iTitleBand)
+            iTitleBand->ReduceRect(aRect);
+        break;
+    case EStatusPane:
+        {
+        CEikStatusPaneBase* statusPane=CEikStatusPaneBase::Current();
+        if (statusPane)
+            statusPane->ReduceRect(aRect);
+        break;
+        }
+    case ECba:
+        if (iExtension && iExtension->iCba)
+            iExtension->iCba->ReduceRect(aRect);
+        break;
+    default:
+        break;
+        }
+    }
+
+TTypeUid::Ptr CEikAppUiFactory::MopSupplyObject(TTypeUid aId)
+    {
+    return SupplyMopObject(aId, (iExtension ? iExtension->iCba : NULL), iMenuBar);
+    }
+
+//////////////////////////////////////////////////////////////////////////////////////
+//
+// END OF FILE
+//
+//////////////////////////////////////////////////////////////////////////////////////