imstutils/imconversationview/imcvuiapp/src/cimcvappui.cpp
branchRCL_3
changeset 29 9a48e301e94b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappui.cpp	Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,569 @@
+/*
+* Copyright (c) 2007-2008 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:  application ui
+*
+*/
+
+
+#include 	"cimcvappui.h"
+#include 	<avkon.hrh>
+#include 	<aknnotewrappers.h> 
+#include 	"cimcvappview.h"
+#include 	"imcvuiapp.hrh"
+#include 	<imcvuiapp.rsg>
+#include 	<aknview.h>
+#include 	"cimcvapplayoutinfo.h"
+#include 	"cimcvappmessageextensionshandler.h"
+#include 	"cimcvengine.h"
+#include 	"imcvuiliterals.h"
+#include 	"cimcvappstatuspanehandler.h"
+#include 	"mimcvenginemessagehandler.h"
+// logs
+#include 	"imcvlogger.h"
+#include 	"mimcvapplayoutchangeobserver.h"
+#include 	<aknapp.h>
+#include  	<AknDef.h>
+#include 	<layoutmetadata.cdl.h>
+#include 	<aknlayoutscalable_avkon.cdl.h>
+#include 	<AknStatuspaneUtils.h>
+#include 	<aknlayoutscalable_avkon.cdl.common.h>
+#include 	"imcvuicommonuids.h"
+#include    "cimcvuiappskinvariant.h"
+#include 	"imcvuiparams.h"
+#include 	<e32property.h>
+#include    <apgtask.h>
+#include    <eikenv.h>
+#include   <StringLoader.h>
+#include   <e32property.h>
+
+#include    "imcvuiliterals.h"
+#include    "conversations.h"
+#include    "imcvuiapp.h"
+#include "cimcvenginefactory.h"
+#include "mimcvenginefactory.h"
+// imconnectionprovider
+#include "cimcvappinputabsorber.h"
+#include "cimcvengine.h"
+
+// ConstructL is called by the application framework
+void CIMCVAppUi::ConstructL()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::ConstructL() start") );
+    iDestructingFlag = EFalse;
+    
+    BaseConstructL( EAknEnableSkin | ENoAppResourceFile |
+                    EAppOrientationAutomatic | EAknEnableMSK | EAknSingleClickCompatible );
+    //Message extension handler. This must be created before views.
+    
+    iChatMbmFullPath = Application()->BitmapStoreName();
+    
+    // Input absorber
+    iInputAbsorber = CIMCVAppInputAbsorber::NewL();    
+    
+    ///////////////////////////////
+    
+    TDriveName drive( TParsePtrC( iChatMbmFullPath ).Drive( ) ); // solve drive
+
+    // leave to stack, LC method
+    HBufC* resourceFilePath = HBufC::NewLC( KAMaxResourcePathLength );
+    TPtr ptr( resourceFilePath->Des() );
+    ptr.Append( KADefaultIconFile() ); // without drive
+    ptr.Insert( 0, drive ); // insert drive
+
+    // NearestLanguageFile takes only TFileName
+    iChatMbmFullPath.Zero();
+    iChatMbmFullPath.Append( *resourceFilePath );
+    /////////////////////////////////
+    CleanupStack::PopAndDestroy();
+    
+    iSkinVariant = CIMCVUiAppSkinVariant::NewL();   
+    
+    iEngineFactory = CIMCVEngineFactory::InstanceL();
+       
+    iMessageHandler = CIMCVAppMessageExtensionsHandler::NewL(*iSkinVariant, *this, *iEngineFactory );
+    
+    
+    
+    iLayoutInfo = CIMCVAppLayoutInfo::NewL( TChatListBoxLayout::EWithoutEditor );
+    iLayoutInfo->LayoutChangedL();
+    CalculatePreviewPaneWidth();
+    
+	// connected create view and activate it
+	iCIMCVAppView = new (ELeave) CIMCVAppView();
+	iCIMCVAppView->ConstructL( R_CONVERSATIONVIEW_VIEW, KUidConversationView ,*iMessageHandler);
+	AddViewL( iCIMCVAppView );      // transfer ownership to CAknViewAppUi
+
+    IM_CV_LOGS(TXT("CIMCVAppUi::ConstructL() end ") );
+    }
+// ---------------------------------------------------------
+// CIMCVAppUi::CIMCVAppUi()
+// ---------------------------------------------------------
+//
+CIMCVAppUi::CIMCVAppUi() :
+iIsAppForeground(ETrue)                             
+    {
+	// no implementation required
+    }
+// ---------------------------------------------------------
+// CIMCVAppUi::CIMCVAppUi()
+// ---------------------------------------------------------
+//
+CIMCVAppUi::~CIMCVAppUi()
+    {
+    iLayoutObservers.Close();
+    
+    iResourceObservers.Close();
+    
+    delete iLayoutInfo;
+     
+    delete iInputAbsorber;
+    
+    iDestructingFlag = ETrue;
+    
+    if( iSkinVariant )
+	    {
+	    delete iSkinVariant;
+	    }
+    
+   
+    delete iMessageHandler;
+    
+    CIMCVEngineFactory::Release();
+   
+    }
+// -----------------------------------------------------------------------------
+// CIMCVAppUi::IsAppInForeground
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CIMCVAppUi::IsAppInForeground()
+	{
+	return iIsAppForeground;	
+	}
+   
+  // -----------------------------------------------------------------------------
+// CIMCVAppUi::IsUnderDestruction
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CIMCVAppUi::IsUnderDestruction()
+    {
+    return iDestructingFlag;
+    }
+// ---------------------------------------------------------
+// CIMCVAppUi::CIMCVAppUi()
+// ---------------------------------------------------------
+// handle any menu commands
+void CIMCVAppUi::HandleCommandL(TInt aCommand)
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleCommandL() start") );
+    switch(aCommand)
+        {
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+        case EIMCVCmdExit:
+        case EAknSoftkeyBack:
+            {
+            //Deactivate conversation is done in HandleForegroundEventL so that 
+            //notification can be received in UI in case of new messages
+            if( iPbkApplicationUid != 0 )
+                {				
+                // activate previous application
+                BringToForeground( TUid::Uid(iPbkApplicationUid ) );							  
+                }            
+            TApaTask task(iEikonEnv->WsSession());
+            task.SetWgId( CEikonEnv::Static()->RootWin().Identifier());
+            task.SendToBackground();
+            break;  
+            }
+      
+	   default:
+            break;
+        }
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleCommandL() end") );
+    }
+// -----------------------------------------------------------------------------
+// CIMCVAPPAppUi::HandleWsEventL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppUi::HandleWsEventL( const TWsEvent& aEvent,CCoeControl* aDestination )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleWsEventL() start") );
+    switch( aEvent.Type() )
+        {
+        case  KAknUidValueEndKeyCloseEvent:
+            {
+            
+            break;
+            }
+        default:
+            {
+            CAknViewAppUi::HandleWsEventL( aEvent, aDestination );
+            break;
+            }
+        }
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleWsEventL() end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppUi::LayoutInfo
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MIMCVAppLayoutInfo* CIMCVAppUi::LayoutInfo()
+    {
+    return iLayoutInfo;
+    }
+// -----------------------------------------------------------------------------
+// CIMCVAppUi::LayoutInfo
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CIMCVEngine& CIMCVAppUi::ActiveEngine() const
+    {
+    return iCIMCVAppView->ActiveEngine();
+    }
+    
+// ---------------------------------------------------------
+// CIMCVAPPAppUi::AddLayoutChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::AddLayoutChangeObserver( MIMCVAppLayoutChangeObserver* aObserver )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::AddLayoutChangeObserver() start") );
+    TInt err( iLayoutObservers.Append( aObserver ) );
+    if ( err )
+        {
+        CActiveScheduler::Current()->Error( err );
+        }
+    IM_CV_LOGS(TXT("CIMCVAppUi::AddLayoutChangeObserver() End") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAPPAppUi::RemoveLayoutChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::RemoveLayoutChangeObserver( MIMCVAppLayoutChangeObserver* aObserver )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::RemoveLayoutChangeObserver() start") );
+    // remove from end first (LIFO) to avoid
+    // tweaking the index while removing
+    TInt count( iLayoutObservers.Count() );
+    for( TInt i( count - 1 ); i >= 0; i-- )
+        {
+        if( iLayoutObservers[i] == aObserver )
+            {
+            iLayoutObservers.Remove( i );
+            }
+        }
+    iLayoutObservers.Compress();
+    IM_CV_LOGS(TXT("CIMCVAppUi::RemoveLayoutChangeObserver() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAPPAppUi::AddResourceChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::AddResourceChangeObserver( MIMCVAppResourceChangeObserver* aObserver )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::AddResourceChangeObserver() start") );
+    TInt err( iResourceObservers.Append( aObserver ) );
+    if ( err )
+        {
+        CActiveScheduler::Current()->Error( err );
+        }
+    IM_CV_LOGS(TXT("CIMCVAppUi::AddResourceChangeObserver() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAPPAppUi::RemoveResourceChangeObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::RemoveResourceChangeObserver( MIMCVAppResourceChangeObserver* aObserver )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::RemoveResourceChangeObserver() start") );
+    // remove from end first (LIFO) to avoid
+    // tweaking the index while removing
+    TInt count( iResourceObservers.Count() );
+    for( TInt i( count - 1 ); i >= 0; i-- )
+        {
+        if( iResourceObservers[i] == aObserver )
+            {
+            iResourceObservers.Remove( i );
+            }
+        }
+    iResourceObservers.Compress();
+    IM_CV_LOGS(TXT("CIMCVAppUi::RemoveResourceChangeObserver() start") );
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAPPAppUi::MbmFullPath
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TDes& CIMCVAppUi::MbmFullPath()
+    {
+    return iChatMbmFullPath;
+    }
+// ---------------------------------------------------------
+// CIMCVAPPAppUi::StorePreviousViewDetails
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::StorePreviousViewDetails(TInt aPreviousApplicationUid,TInt aPreviousViewUid )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::StorePreviousViewDetails() start") );
+    iPbkApplicationUid = aPreviousApplicationUid;
+    iPbkActiveViewUid = aPreviousViewUid;
+    IM_CV_LOGS(TXT("CIMCVAppUi::StorePreviousViewDetails() end") );
+    }
+
+// ---------------------------------------------------------------------------
+//// CIMCVAPPAppUi::SendMeToBackground
+// Send this application to background
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppUi::SendMeToBackground()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::SendMeToBackground() start") );
+    TApaTaskList taskList( iEikonEnv->WsSession() );
+    TApaTask xmppImApp = taskList.FindApp( TUid::Uid(KIMCVUIAPPEXEUID3 ) );
+    xmppImApp.SendToBackground();
+    IM_CV_LOGS(TXT("CIMCVAppUi::SendMeToBackground() end") );
+    }
+ 
+ // ---------------------------------------------------------------------------
+//// CIMCVAppUi::ShutDownAndCloseApplicationL
+// Send this application to background
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppUi::ShutDownAndCloseApplicationL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppUi::ShutDownAndCloseApplicationL() start") );
+	TApaTaskList taskList( iEikonEnv->WsSession() );
+	TApaTask xmppImApp = taskList.FindApp( TUid::Uid(KIMCVUIAPPEXEUID3 ) );
+	xmppImApp.KillTask();
+    IM_CV_LOGS(TXT("CIMCVAppUi::ShutDownAndCloseApplicationL() end") );
+	}
+// ---------------------------------------------------------
+// CIMCVAppUi::HandleResourceChangeL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::HandleResourceChangeL( TInt aType )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleResourceChangeL() Start") );
+    CAknViewAppUi::HandleResourceChangeL( aType );
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        // skin change for this app ui class
+        iLayoutInfo->LayoutChangedL( aType );
+        
+        CalculatePreviewPaneWidth();
+        
+        iSkinVariant->UpdateLayout();
+	   }
+        
+        
+    if ( aType == KEikDynamicLayoutVariantSwitch ||
+        aType == KAknsMessageSkinChange )
+        {
+        TInt count( iLayoutObservers.Count() );
+        for( TInt i( 0 ); i < count; ++i )
+            {
+            iLayoutObservers[i]->LayoutChangedL( aType );
+            }
+        }
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleResourceChangeL() end") );
+    }
+// ---------------------------------------------------------
+// CIMCVAppUi::CalculatePreviewPaneWidth()
+// ---------------------------------------------------------
+//   
+void CIMCVAppUi::CalculatePreviewPaneWidth()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppUi::CalculatePreviewPaneWidth() Start") );
+	// Get parameter and table limits for popup preview text window
+    TAknLayoutScalableParameterLimits limits = 
+        AknLayoutScalable_Avkon::popup_preview_text_window_ParamLimits();
+
+    TAknLayoutScalableTableLimits tableLimits =
+        AknLayoutScalable_Avkon::popup_preview_text_window_t_Limits();
+
+    // Get layout rects
+    TRect rectScreen = iAvkonAppUi->ApplicationRect();
+    TRect rectMainPane = rectScreen;
+
+    // Use first variety to be able to get the font for text parsing
+    TInt firstVariety = SelectWindowVariety( 1, limits );
+
+    TRect rectPopupWindow = RectFromLayout( rectMainPane,
+        AknLayoutScalable_Avkon::popup_preview_text_window( firstVariety ) );
+
+    TInt firstIndex = tableLimits.FirstIndex();
+    TInt firstLineVariety = AknLayoutScalable_Avkon::
+        popup_preview_text_window_t_ParamLimits( firstIndex ).FirstVariety();
+        
+    TAknTextLineLayout popupTextLayout =
+        AknLayoutScalable_Avkon::popup_preview_text_window_t(
+            firstIndex, firstLineVariety );
+
+    TAknLayoutText layoutText;
+    layoutText.LayoutText( rectPopupWindow, popupTextLayout );
+    
+    IM_CV_LOGS(TXT("CIMCVAppUi::CalculatePreviewPaneWidth() End") );   
+	}
+// ---------------------------------------------------------
+// CIMCVAppUi::SelectWindowVariety()
+// ---------------------------------------------------------
+//   
+TInt CIMCVAppUi::SelectWindowVariety( const TInt aNumberOfLines,
+        const TAknLayoutScalableParameterLimits& aLimits ) const
+    {
+    TInt index = aNumberOfLines - 1;
+    if ( Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        index += 5;
+        }
+
+    return Min( Max( index, aLimits.FirstVariety() ),
+                aLimits.LastVariety() );
+    }
+    
+// ---------------------------------------------------------
+// CIMCVAppUi::RectFromLayout()
+// ---------------------------------------------------------
+//   
+TRect CIMCVAppUi::RectFromLayout( const TRect& aParent,
+        const TAknWindowComponentLayout& aComponentLayout ) const
+    {
+    TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine();
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect(aParent, lineLayout);
+    return layoutRect.Rect();
+    }    
+
+// -----------------------------------------------------------------------------
+// CIMCVAppUi::SkinVariantL
+// -----------------------------------------------------------------------------
+//
+MIMCVUiAppSkinVariant*	CIMCVAppUi::SkinVariantL()
+	{
+	return iSkinVariant;
+	} 
+
+// ---------------------------------------------------------------------------
+// Proceses message from external application
+// Used from Phonebooks external tab (Buddylist) to start instant messaging
+// or from xmpp server to show new messages
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppUi::ProcessMessageL( TUid /*aUid*/, const TDesC8& aParamData )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::ProcessMessageL() Start") );
+    
+    iCIMCVAppView->ShowMeL(aParamData);    
+    
+    IM_CV_LOGS(TXT("CIMCVAppUi::ProcessMessageL() End ") );
+    }
+
+/// -----------------------------------------------------------------------------
+// CIMCVAppUi::HandleServiceCloseExitL
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppUi::HandleServiceCloseExitL(TInt /*aEventValue*/ )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleServiceCloseExitL() Start") );
+    
+    IM_CV_LOGS(TXT("CIMCVAppUi::HandleServiceCloseExitL() Start") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppUi::CaptureEventsL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::CaptureEventsL()
+    {
+    if ( !AreEventsCaptured() )
+        {
+        iInputAbsorber->CaptureEventsL();
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppUi::ReleaseCapturingL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::ReleaseCapturingL()
+    {
+    if ( AreEventsCaptured() )
+        {
+        iInputAbsorber->Release();
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppUi::AreEventsCaptured
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CIMCVAppUi::AreEventsCaptured() const
+    {
+    return iInputAbsorber->IsCaptured();
+    }  
+    
+// ---------------------------------------------------------
+// CIMCVAppUi::BringToForeground
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppUi::BringToForeground( TUid aAppUid )
+	{
+	
+	IM_CV_LOGS(TXT("CIMCVAppUi::BringToForeground() start") );
+    TApaTaskList taskList( iEikonEnv->WsSession() );
+    TApaTask task = taskList.FindApp( aAppUid );
+    if ( task.Exists() )
+        {        
+        task.BringToForeground();
+        }    
+    IM_CV_LOGS(TXT("CIMCVAppUi::BringToForeground() end") );
+			    	
+	}
+
+	
+// --------------------------------------------------------------------------
+// CIMCVAppUi::HandleForegroundEventL
+// --------------------------------------------------------------------------
+//
+void CIMCVAppUi::HandleForegroundEventL( TBool aForeground )
+    {
+    iIsAppForeground = aForeground;
+
+    if( !aForeground )
+	    {
+	    ActiveEngine().MessageHandler().DeactivateConversationL();	
+	    }
+
+    CAknViewAppUi::HandleForegroundEventL( aForeground );
+    }		       
+// end of file