phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp
changeset 46 efe85016a067
parent 40 b46a585f6909
child 47 7cbcb2896f0e
--- a/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp	Fri Jun 11 13:29:23 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp	Wed Jun 23 18:02:44 2010 +0300
@@ -24,6 +24,8 @@
 #include <qtcontacts.h>
 #include "cntviewnavigator.h"
 #include "cntsimutility.h"
+#include "cntdebug.h"
+#include <QApplication>
 
 CntDefaultViewManager::CntDefaultViewManager( HbMainWindow* aWindow ) : QObject(),
     mFactory(NULL),
@@ -32,8 +34,9 @@
     mNavigator(NULL),
     mMainWindow( aWindow ),
     mSimUtility(NULL)
-
-{    
+{
+    CNT_ENTRY
+    
     setViewFactory(new CntDefaultViewFactory());
     setViewNavigator(new CntViewNavigator(this));
 
@@ -44,33 +47,76 @@
         delete mSimUtility; 
         mSimUtility = 0;
     }
+    
+    CNT_EXIT
 }
 
 CntDefaultViewManager::~CntDefaultViewManager()
 {
+    CNT_ENTRY
+    
+    cleanup();
+
+    CNT_EXIT
+}
+
+void CntDefaultViewManager::cleanup()
+{
+    CNT_ENTRY
+
+    mOldView = mCurrent;
+    mCurrent = NULL;
+    deleteOldView();
+    
+    qDeleteAll(mBackends);
+    mBackends.clear();
+
     qDeleteAll(mDefaults.values());
+    mDefaults.clear();
+
     delete mFactory;
+    mFactory = NULL;
+
     delete mSimUtility;
+    mSimUtility = NULL;
+    
+    CNT_EXIT
 }
 
 void CntDefaultViewManager::setViewFactory( CntAbstractViewFactory* aFactory ) 
 {
+    CNT_ENTRY
+    
     if ( aFactory )
     {
+        if (mFactory) {
+            delete mFactory;
+        }
         mFactory = aFactory;
     }
+    
+    CNT_EXIT
 }
 
 void CntDefaultViewManager::setViewNavigator( CntViewNavigator* aNavigator )
 {
+    CNT_ENTRY
+    
     if ( aNavigator )
     {
+        if (mNavigator) {
+            delete mNavigator;
+        }
         mNavigator = aNavigator;
     }
+    
+    CNT_EXIT
 }
 
 void CntDefaultViewManager::back(const CntViewParameters aArgs)
 {
+    CNT_ENTRY
+    
     mArgs.clear();
     
     QFlags<Hb::ViewSwitchFlag> flags;
@@ -90,17 +136,39 @@
     {
         switchView( mArgs, flags );
     }
+    else {
+        // exiting application
+        cleanup();
+        closeApp();
+    }
+    
+    CNT_EXIT
+}
+
+void CntDefaultViewManager::closeApp()
+{
+    CNT_ENTRY
+    
+    qApp->quit();
+    
+    CNT_EXIT
 }
 
 void CntDefaultViewManager::changeView(const CntViewParameters aArgs)
 {
+    CNT_ENTRY
+    
     QFlags<Hb::ViewSwitchFlag> flags;
     mNavigator->next(aArgs.value(EViewId).toInt(), flags);
     switchView(aArgs, flags);
+    
+    CNT_EXIT
 }
 
 QContactManager* CntDefaultViewManager::contactManager( const QString& aType )
 {
+    CNT_ENTRY
+    
     foreach ( QContactManager* mgr, mBackends ) 
     {
         QString uri = mgr->managerUri();
@@ -116,11 +184,14 @@
         mBackends.append( manager );
     }
     
+    CNT_EXIT
     return manager;
 }
 
 void CntDefaultViewManager::removeCurrentView()
 {
+    CNT_ENTRY
+    
     if (mOldView) 
     {
         connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(deleteOldView()));
@@ -129,10 +200,14 @@
     {
         mMainWindow->setInteractive( true );
     }
+    
+    CNT_EXIT
 }
 
 void CntDefaultViewManager::deleteOldView()
 {
+    CNT_ENTRY
+    
     disconnect(mMainWindow, SIGNAL(viewReady()), this, SLOT(deleteOldView()));
     
     if (mOldView)
@@ -141,7 +216,7 @@
         
         // Due to something strange in wk16, this check will fail occationally and cause
         // a memory leak... most likely when opening edit view for the first time
-        if (!mOldView->view()->isVisible())
+        if (mCurrent == NULL || !mOldView->view()->isVisible())
         {
             mMainWindow->removeView(mOldView->view());
             
@@ -160,10 +235,14 @@
     }
 
     mMainWindow->setInteractive(true);
+    
+    CNT_EXIT
 }
 
 void CntDefaultViewManager::switchView(const CntViewParameters aArgs, QFlags<Hb::ViewSwitchFlag> flags)
 {
+    CNT_ENTRY
+    
     mMainWindow->setInteractive(false);
     int id = aArgs.value(EViewId).toInt();
     if ( id != noView )
@@ -184,12 +263,13 @@
         
         mOldView = mCurrent;
         mCurrent = nextView;
-            
         mMainWindow->addView(mCurrent->view());
         mMainWindow->setCurrentView(mCurrent->view(), true, flags);
         mCurrent->activate(this, aArgs);
         
         removeCurrentView();
     }
+    
+    CNT_EXIT
 }
 // End of File