diff -r 10eaf342f539 -r 00c7ae862740 emailuis/nmailui/src/nmapplication.cpp --- a/emailuis/nmailui/src/nmapplication.cpp Tue Jun 29 17:12:28 2010 +0300 +++ b/emailuis/nmailui/src/nmapplication.cpp Fri Jul 02 15:55:16 2010 +0300 @@ -1,19 +1,19 @@ /* -* Copyright (c) 2009 - 2010 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: -* -*/ + * Copyright (c) 2009-2010 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: + * + */ #include "nmuiheaders.h" #include @@ -22,91 +22,102 @@ static const QString NmSendServiceName = "nmail.com.nokia.symbian.IFileShare"; /*! - \class NmApplication - \brief Application class, creates main window and handles view switching + \class NmApplication + \brief Application class, creates main window and handles view switching. */ /*! - Constructor + Constructor. */ NmApplication::NmApplication(QObject *parent, quint32 accountId) -:QObject(parent), -mMainWindow(NULL), -mViewStack(NULL), -mActiveViewId(NmUiViewNone), -mUiEngine(NULL), -mBackAction(NULL), -mExtensionManager(NULL), -mMbListModel(NULL), -mServiceViewId(NmUiViewNone), -mForegroundService(false), -mEffects(NULL), -mAttaManager(NULL), -mSettingsViewLauncher(NULL), -mViewReady(false), -mQueryDialog(NULL), -mBackButtonPressed(false) +: QObject(parent), + mMainWindow(NULL), + mViewStack(NULL), + mActiveViewId(NmUiViewNone), + mUiEngine(NULL), + mBackAction(NULL), + mExtensionManager(NULL), + mMbListModel(NULL), + mServiceViewId(NmUiViewNone), + mForegroundService(false), + mEffects(NULL), + mAttaManager(NULL), + mSettingsViewLauncher(NULL), + mViewReady(false), + mQueryDialog(NULL), + mBackButtonPressed(false) { - NM_FUNCTION; - TRAP_IGNORE(mUiEngine = NmUiEngine::instance()); - + // Create network access manager and cache for application use. mNetManager = new NmViewerViewNetManager(*mUiEngine); QNetworkDiskCache *cache = new QNetworkDiskCache(); - cache->setCacheDirectory(QDesktopServices::storageLocation(QDesktopServices::CacheLocation)); + cache->setCacheDirectory( + QDesktopServices::storageLocation(QDesktopServices::CacheLocation)); mNetManager->setCache(cache); - + createMainWindow(); - - // attachment manager can be shared between viewer and editor, ownership in application class + + // Attachment manager can be shared between viewer and editor. + // The application class has the ownership. mAttaManager = new NmAttachmentManager(*mUiEngine); - + mSendServiceInterface = - new NmSendServiceInterface(NmSendServiceName, NULL, *mUiEngine, this); + new NmSendServiceInterface(NmSendServiceName, NULL, *mUiEngine, this); mSendServiceInterface2 = - new NmSendServiceInterface(emailFullServiceNameSend, NULL, *mUiEngine, this); + new NmSendServiceInterface(emailFullServiceNameSend, NULL, *mUiEngine, this); mUriServiceInterface = new NmUriServiceInterface(NULL, *mUiEngine, this); mMailboxServiceInterface = - new NmMailboxServiceInterface(NULL, *mUiEngine, this); + new NmMailboxServiceInterface(NULL, *mUiEngine, this); mViewerServiceInterface = - new NmViewerServiceInterface(NULL, this, *mUiEngine); - + new NmViewerServiceInterface(NULL, this, *mUiEngine); + if(accountId != 0) { QVariant mailbox; mailbox.setValue(mUiEngine->getPluginIdByMailboxId(accountId).id()); mMailboxServiceInterface->displayInboxByMailboxId(mailbox); } - + mEffects = new NmUiEffects(*mMainWindow); } /*! - Destructor + Destructor. */ NmApplication::~NmApplication() { - NM_FUNCTION; - if (mQueryDialog) { delete mQueryDialog; - mQueryDialog=NULL; + mQueryDialog = NULL; } - - delete mSendServiceInterface; - delete mSendServiceInterface2; - delete mUriServiceInterface; - delete mMailboxServiceInterface; - delete mViewerServiceInterface; - - resetViewStack(); + + delete mSendServiceInterface; + delete mSendServiceInterface2; + delete mUriServiceInterface; + delete mMailboxServiceInterface; + delete mViewerServiceInterface; + + resetViewStack(); delete mViewStack; + NmIcons::freeIcons(); NmUiEngine::releaseInstance(mUiEngine); mUiEngine = NULL; + delete mBackAction; + + // Workaround: the main window has to be closed (hidden) before deleting + // the extension manager in order to prevent the main window's title bar + // from showing when the application is closed. + if (mMainWindow) { + // Workaround: assert failure may happen if an open main window is + // deleted. + mMainWindow->close(); + } + delete mExtensionManager; + if (mNetManager) { if (mNetManager->cache()) { mNetManager->cache()->clear(); @@ -114,92 +125,97 @@ delete mNetManager; mNetManager = NULL; } - // Effects needs to be deleted before MainWindow. + + // Effects need to be deleted before MainWindow. delete mEffects; - if (mMainWindow) { - // workaround: assert failure may happen otherwise - mMainWindow->close(); - } delete mMainWindow; delete mAttaManager; delete mSettingsViewLauncher; } /*! - Main application window creation + Main application window creation. */ void NmApplication::createMainWindow() { NM_FUNCTION; - + bool service = XQServiceUtil::isService(); - - // Register custom widget files + + // Register custom widget files. HbStyleLoader::registerFilePath(":nmmessagelistviewitem.widgetml"); HbStyleLoader::registerFilePath(":nmmessagelistviewitem.css"); HbStyleLoader::registerFilePath(":nmviewerheader.widgetml"); HbStyleLoader::registerFilePath(":nmviewerheader.css"); - - // Create main window + + // Create main window. mMainWindow = new HbMainWindow(); - - // Connect to lazy loading signal + + // Connect to lazy loading signal. QObject::connect(mMainWindow, SIGNAL(viewReady ()), this, SLOT(viewReady())); - - // Create extension manager + + // Create extension manager. mExtensionManager = new NmUiExtensionManager(); - - // Create view stack + + // Create view stack. mViewStack = new QStack; - - // Create back action and connect it to prepareForPopView() + + // Create back action and connect it to prepareForPopView(). if (mMainWindow) { mBackAction = new HbAction(Hb::BackNaviAction,this); - connect(mBackAction, SIGNAL(triggered()), this, SLOT(prepareForPopView())); - - // Show mainwindow - // Services will active it when the view is ready + connect(mBackAction, + SIGNAL(triggered()), + this, + SLOT(prepareForPopView())); + + // Show mainwindow. + // Services will active it when the view is ready. if (!service) { mMainWindow->show(); } } - - // async operation completion related notifications - connect( - mUiEngine, SIGNAL(operationCompleted(const NmOperationCompletionEvent &)), - this, SLOT(handleOperationCompleted(const NmOperationCompletionEvent &))); - + + // Asynchronous operation completion related notifications. + connect(mUiEngine, + SIGNAL(operationCompleted(const NmOperationCompletionEvent &)), + this, + SLOT(handleOperationCompleted(const NmOperationCompletionEvent &))); + mMbListModel = &mUiEngine->mailboxListModel(); - - // Start application to mailbox view - // If started as service, there is no need to create views + + // ---------------------------------------------------------------------- + // TODO: Remove or comment out the following code block when the mail + // wizard starts to work with Mfe. + // ---------------------------------------------------------------------- + // Start application to mailbox view. If started as service, there is no + // need to create views. if (!service) { NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMailboxList); enterNmUiView(startParam); } - + // ---------------------------------------------------------------------- + if (mMainWindow) { - // Start to filter main window events to get "end key" event in all possible situations. Using - // event() is not enough to catch the event as it is only called if the view widget has the - // focus. Note: if key capturing (xqkeycapture.h) is required it is probably best to implement - // an own QMainWindow class and do the capturing there, not in the views. + // Start to filter main window events to get "end key" event in all + // possible situations. Using event()is not enough to catch the event + // as it is only called if the view widget has the focus. Note: if + // key capturing (xqkeycapture.h) is required it is probably best to + // implement an own QMainWindow class and do the capturing there, not + // in the views. mMainWindow->installEventFilter(this); - - // Optimize the custom paint functions. - // Currently effects to NmViewerHeader::paint & NmAttachmentListWidget::paint + // Optimize the custom paint functions. + // Currently effects to NmViewerHeader::paint() and + // NmAttachmentListWidget::paint(). mMainWindow->setOptimizationFlag(QGraphicsView::DontSavePainterState); } } /*! - Slot. React to view ready signal and call - current view method. + Slot. React to view ready signal and call current view method. */ void NmApplication::viewReady() { - NM_FUNCTION; - mViewReady = true; if (mViewStack && !mViewStack->isEmpty()) { NmBaseView *currentView = mViewStack->top(); @@ -210,91 +226,84 @@ } /*! - Event filter. End key is filtered from the main window and either the view takes case of the - or the app is exited by default. + Event filter. End key is filtered from the main window and either the + view takes case of the or the app is exited by default. */ bool NmApplication::eventFilter(QObject *obj, QEvent *event) { - NM_FUNCTION; - bool consumed(false); - + if (obj && obj == mMainWindow && event && event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); - - if (keyEvent->key() == Qt::Key_No) { // end key, the "red" key - - // exit application if no pending operations are on-going + if (keyEvent->key() == Qt::Key_No) { + // End key, the "red" key. + // Exit application if no pending operations are on-going. } } - + if (!consumed) { consumed = QObject::eventFilter(obj, event); } - + return consumed; } /*! - Push view to view stack + Push view to view stack. */ void NmApplication::pushView(NmBaseView *newView) { - NM_FUNCTION; - if (newView && mViewStack) { - NM_COMMENT("nmailui: view exists"); + NM_COMMENT("NmApplication::pushView() : view exists."); newView->setNavigationAction(mBackAction); - - // Store view to be hidden + + // Store view to be hidden. NmBaseView *hideView(NULL); if (!mViewStack->isEmpty()) { hideView = mViewStack->top(); } else { - // viewReady should be informed immediatelly + // viewReady should be informed immediately. if (mViewReady) { newView->viewReady(); } } - - // activate new view - NM_COMMENT("nmailui: addView"); + + // Activate new view. + NM_COMMENT("NmApplication::pushView() : add view."); mMainWindow->addView(newView); mViewStack->push(newView); mMainWindow->setCurrentView(newView); mActiveViewId=newView->nmailViewId(); - - // Set toolbars orientation + + // Set toolbars orientation. HbToolBar *tb = newView->toolBar(); if (tb) { tb->setOrientation(Qt::Horizontal); } - - // hide old view - NM_COMMENT("nmailui: removeView"); + + // Hide old view. + NM_COMMENT("NmApplication::pushView() : remove view."); if (hideView) { mMainWindow->removeView(hideView); } - - NM_COMMENT("nmailui: pushView done"); } } /*! - Ask from view that is it ok to pop view. This kind of 2-phase popView is needed - because view may show query dialog for user response. + Ask from view that is it ok to pop view. This kind of 2-phase popView is + needed because view may show query dialog for user response. */ void NmApplication::prepareForPopView() { if (mViewStack && mViewStack->size() > 0) { - // Get view pointer + // Get view pointer. NmBaseView *view = mViewStack->top(); if (view){ NmUiViewId topViewId = view->nmailViewId(); - // We must know in popView, are we coming with back button from message view - // to prevent the send animation. + // We must know in popView, are we coming with back button from + // message view to prevent the send animation. if (topViewId == NmUiViewMessageEditor) { mBackButtonPressed = true; } @@ -303,8 +312,8 @@ view->okToExitView(); } } - // If the view stack is now empty quit the app - // This happens also when the app has been started as a service + // If the view stack is now empty quit the app. This happens also when + // the app has been started as a service else if (mViewStack && mViewStack->size() == 0) { exitApplication(); } @@ -315,16 +324,16 @@ */ void NmApplication::popView() { - NM_FUNCTION; if (mViewStack && mViewStack->size() > 0) { NmBaseView *view = mViewStack->top(); if (view) { - // Get top view id + // Get top view id. NmUiViewId topViewId = view->nmailViewId(); - - // Prepare for send animation if returing from editor and message has been sent. + + // Prepare for send animation if returing from editor and message + // has been sent. if (topViewId == NmUiViewMessageEditor && mUiEngine->isSendingMessage()) { - // If we are coming from message editor with back button + // If we are coming from message editor with back button. // do not prepare the send animation. if (!mBackButtonPressed) { mEffects->prepareEffect(NmUiEffects::NmEditorSendMessageAnimation); @@ -332,13 +341,13 @@ } mBackButtonPressed = false; mViewStack->pop(); - // Call custom exit function + // Call custom exit function. view->aboutToExitView(); // Remove view from stack. mMainWindow->removeView(view); - - // if we were in editor and sent a message, pop viewer from stack first - // so we can go straight to mail list + + // If we were in editor and sent a message, pop viewer from stack + // first so we can go straight to mail list. if (!mViewStack->isEmpty() && topViewId == NmUiViewMessageEditor && mUiEngine->isSendingMessage() && mViewStack->top()->nmailViewId() == NmUiViewMessageViewer) { @@ -347,30 +356,29 @@ delete tmpView; tmpView = NULL; } - + if (!mViewStack->isEmpty()) { - // Activate next view in stack + // Activate next view in stack. NmBaseView *showView = mViewStack->top(); mMainWindow->addView(showView); mMainWindow->setCurrentView(showView); - // Store activated view id + // Store activated view id. mActiveViewId=showView->nmailViewId(); // Perform send animation if requested. mEffects->startEffect(NmUiEffects::NmEditorSendMessageAnimation); } - + delete view; view = NULL; - - // If view was started as service, move the app now - // to the background, unless it was started when the app - // was already in foreground.. + + // If view was started as service, move the app now to the + // background, unless it was started when the app was already in + // foreground. if (mServiceViewId == topViewId) { mServiceViewId = NmUiViewNone; - NM_COMMENT("Returned from service view"); - - // if started as embedded or while the app was in foreground, - // do not hide the app + NM_COMMENT("NmApplication::popView() : returned from service view."); + // If started as embedded or while the app was in foreground, + // do not hide the app. if (!XQServiceUtil::isEmbedded() && !mForegroundService) { XQServiceUtil::toBackground(true); @@ -378,9 +386,9 @@ } } } - - // If the view stack is now empty quit the app - // This happens also when the app has been started as a service + + // If the view stack is now empty quit the app. This happens also when + // the app has been started as a service. if (mViewStack && mViewStack->size() == 0) { exitApplication(); } @@ -391,8 +399,6 @@ */ void NmApplication::resetViewStack() { - NM_FUNCTION; - if (mViewStack && !mViewStack->isEmpty()) { int viewCount = mViewStack->count(); // Pop and destroy all views @@ -406,28 +412,28 @@ } /*! - Function activates view based on viewId parameter. - If requested view is already open, it is requested to reload. - Otherwise view object is created and pushed to view stack + Function activates view based on viewId parameter. If requested view is + already open, it is requested to reload. Otherwise view object is created + and pushed to view stack. */ void NmApplication::enterNmUiView(NmUiStartParam *startParam) { NM_FUNCTION; - - // Check the validity of start parameter object + + // Check the validity of start parameter object. if (startParam) { - + if (startParam->service() && mMainWindow) { - // When the message list is started as a service previous views are removed - // from the stack. Open editors are not closed. - // Also if the view is same than the new one, keep it open (reload the content). - - - // reset the foreground service flag while popping the views + // When the message list is started as a service previous views + // are removed from the stack. Open editors are not closed. Also + // if the view is same than the new one, keep it open (reload the + // content). + + // Reset the foreground service flag while popping the views. bool previousForegroundService = mForegroundService; mForegroundService = true; - - // at least one view must remain in the stack + + // At least one view must remain in the stack. while (mViewStack->count( )> 1) { NmUiViewId topId = mViewStack->top()->nmailViewId(); if (topId != NmUiViewMessageEditor && @@ -442,10 +448,10 @@ } mForegroundService = previousForegroundService; } - - // Check whether requested view is already active - // and if so, ask it to reload contents with new start parameter data - // Do not reuse the view if started as service to editor view (ShareUI) + + // Check whether requested view is already active and if so, ask it + // to reload contents with new start parameter data. Do not reuse the + // view if started as service to editor view (ShareUI). if (mActiveViewId == startParam->viewId() && (!startParam->service() || mActiveViewId!=NmUiViewMessageEditor)) { mViewStack->top()->reloadViewContents(startParam); @@ -463,7 +469,7 @@ case NmUiViewMessageList: { // Check the topmost view. If it is an editor, do not open - // a new mail list view + // a new mail list view. if (startParam->service() && !mViewStack->isEmpty() && mViewStack->top()->nmailViewId()==NmUiViewMessageEditor) { break; @@ -484,14 +490,14 @@ mViewStack->top()->nmailViewId() == NmUiViewMessageEditor) { break; } - + NmMessageListModel &model = mUiEngine->messageListModelForSearch(startParam->mailboxId()); - + NmMessageSearchListView *searchListView = new NmMessageSearchListView( *this, startParam, *mUiEngine, model, new HbDocumentLoader(mMainWindow)); - + pushView(searchListView); } break; @@ -503,30 +509,29 @@ pushView(new NmEditorView(*this, startParam, *mUiEngine, *mAttaManager)); break; default: - // Reset view stack and exit application + // Reset view stack and exit application. delete startParam; startParam = NULL; resetViewStack(); break; } } - + if (startParam && startParam->service()) { - // Store the view id that was launched as service + // Store the view id that was launched as service. mServiceViewId = mActiveViewId; } } } /*! - Function can be used from views to exit the application - View stack is cleared. Views can connect exit menu - selection to this slot. + Function can be used from views to exit the application. View stack is + cleared. Views can connect exit menu selection to this slot. */ void NmApplication::exitApplication() { NM_FUNCTION; - + delete mSendServiceInterface; mSendServiceInterface = NULL; delete mSendServiceInterface2; @@ -542,13 +547,11 @@ } /*! - Exit the application in the next event loop + Exit the application in the next event loop. */ void NmApplication::delayedExitApplication() { - NM_FUNCTION; - - // Exit the application in the next event loop + // Exit the application in the next event loop. QMetaObject::invokeMethod(this, "exitApplication", Qt::QueuedConnection); } @@ -557,38 +560,30 @@ */ HbMainWindow *NmApplication::mainWindow() { - NM_FUNCTION; - return mMainWindow; } /*! - Getter for main UI extension manager + Getter for main UI extension manager. */ NmUiExtensionManager &NmApplication::extManager() { - NM_FUNCTION; - return *mExtensionManager; } /*! - Getter for network access manager + Getter for network access manager. */ NmViewerViewNetManager &NmApplication::networkAccessManager() { - NM_FUNCTION; - return *mNetManager; } /*! - screen size. Function returns curtent screen size + Get the screen size. Function returns curtent screen size. */ QSize NmApplication::screenSize() { - NM_FUNCTION; - QSize ret(0,0); if (mMainWindow){ HbDeviceProfile currentP = HbDeviceProfile::current(); @@ -596,7 +591,7 @@ QSize curPSize = currentP.logicalSize(); QSize altPSize = altP.logicalSize(); if (mMainWindow->orientation() == Qt::Horizontal) { - // Get wide profile size in landscape + // Get wide profile size in landscape. if (curPSize.width() > altPSize.width()) { ret = curPSize; } @@ -605,7 +600,7 @@ } } else { - // Get narrow profile size in portrait + // Get narrow profile size in portrait. if (curPSize.width() < altPSize.width()) { ret = curPSize; } @@ -618,12 +613,10 @@ } /*! - handles all asynchronous operation's completions at UI level + Handles all asynchronous operation's completions at UI level. */ void NmApplication::handleOperationCompleted(const NmOperationCompletionEvent &event) { - NM_FUNCTION; - if (event.mCompletionCode != NmNoError && event.mCompletionCode != NmCancelError) { if (event.mOperationType == Synch && event.mCompletionCode == NmAuthenticationError) { mLastOperationMailbox = event.mMailboxId; @@ -643,7 +636,7 @@ mQueryDialog = NmUtilities::displayQuestionNote(hbTrId("txt_mail_dialog_server_settings_incorrect"), this, SLOT(launchSettings(HbAction*))); } - // following applies to all operation/event types + // Following applies to all operation/event types. if (event.mCompletionCode == NmConnectionError) { NmUtilities::displayWarningNote(hbTrId("txt_mail_dialog_mail_connection_error")); } @@ -651,22 +644,20 @@ } /*! - launches settings view of the specified mailbox + Launches settings view of the specified mailbox. */ void NmApplication::launchSettings(HbAction* action) { - NM_FUNCTION; - - // Check whether yes button was pressed + // Check whether yes button was pressed. if (mQueryDialog&& action == mQueryDialog->actions().at(0)) { - // create settingslauncher if doesn't exist + // Create settingslauncher if doesn't exist. if(!mSettingsViewLauncher) { mSettingsViewLauncher = new NmSettingsViewLauncher(); } - // mailboxname required - NmMailboxMetaData *mailboxMetaData = mUiEngine->mailboxById(mLastOperationMailbox); // no ownership + // Mailboxname required. + NmMailboxMetaData *mailboxMetaData = mUiEngine->mailboxById(mLastOperationMailbox); // No ownership. if( mailboxMetaData ) { - // launch + // Launch. mSettingsViewLauncher->launchSettingsView(mLastOperationMailbox, mailboxMetaData->name()); } } @@ -674,13 +665,13 @@ /*! Stores the visibility state, e.g. when the service was launched. - \return true if the app was visible + \return true if the app was visible. */ bool NmApplication::updateVisibilityState() { - // At the moment there is no good way to check the foreground state + // At the moment there is no good way to check the foreground state. QWindowSurface *surface = mMainWindow->windowSurface(); mForegroundService = (surface != 0); - NM_COMMENT(QString("NmApplication::updateVisibilityState fg=%1").arg(mForegroundService)); + NM_COMMENT(QString("NmApplication::updateVisibilityState() : mForegroundService == %1").arg(mForegroundService)); return mForegroundService; }