cbs/cbsui/src/cbsuitopiclistview.cpp
branchRCL_3
changeset 19 7d48bed6ce0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/cbsui/src/cbsuitopiclistview.cpp	Tue Aug 31 15:45:17 2010 +0300
@@ -0,0 +1,896 @@
+/*
+* Copyright (c) 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 <hbaction.h>
+#include <hbtoolbar.h>
+#include <hbicon.h>
+#include <hblabel.h>
+#include <hblistwidgetitem.h>
+#include <hbabstractviewitem.h>
+#include <hbinputdialog.h>
+#include <hbmessagebox.h>
+#include <hblistwidget.h>
+#include <hbvalidator.h>
+#include <hbmenu.h>
+#include <hbmessagebox.h>
+
+#include "cbsuitopiclistview.h"
+#include "cbsuiviewmanager.h"
+#include "rcbsui.h"
+#include "cbslog.h"
+#include "cbsuiconstants.h"
+#include "ccbsuitopiclistmonitor.h"
+
+// DocML usage
+const char *T_TOPIC_LIST = "t:ListWidget";
+const char *T_TOPICINDEX = "t:topicIndex"; 
+// other items (for decoration)
+const char *T_LABEL = "t:label";
+
+const char *T_TOGGLE_RECEPTION = "t:toggle_reception";
+const char *T_ADD_TOPIC = "t:add_topic";
+
+// Options menu
+const char *T_EXIT = "t:exit";
+
+const char *T_OPEN = "t:open";
+const char *T_SUBSCRIBE = "t:subscribe";
+const char *T_UNSUBSCRIBE = "t:unsubscribe";
+const char *T_HOTMARK = "t:hotmark";
+const char *T_UNHOTMARK = "t:unhotmark";
+const char *T_DELETE = "t:delete";
+const char *T_EDIT = "t:edit";
+
+// ======== MEMBER FUNCTIONS ==================================================
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::CbsUiTopicListView
+// ----------------------------------------------------------------------------
+CbsUiTopicListView::CbsUiTopicListView()
+    : HbView(),
+      mServer(NULL),
+      mViewManager(NULL),
+      mTopicRow(-1),
+      mTopicIndexWidget(NULL),
+      mTopicsWidget(NULL),
+      mReceptionButton(NULL), 
+      mOpenAction(NULL),
+      mSubscibeAction(NULL), 
+      mUnSubscibeAction(NULL), 
+      mHotmarkAction(NULL), 
+      mUnHotmarkAction(NULL), 
+      mEditAction(NULL), 
+      mDeleteAction(NULL),
+      mMonitor(NULL),
+      mTopicQuery(NULL),
+      mTopicNumberList(NULL)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::CbsUiTopicListView IN");
+    mTopicNumberList = new TCbsUiTopicNumberList(KNumberOfStandardTopics);
+    QT_TRAP_THROWING(mTopicNumberList->AppendL(0));
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::CbsUiTopicListView OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::~CbsUiTopicListView
+// ----------------------------------------------------------------------------
+CbsUiTopicListView::~CbsUiTopicListView()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::~CbsUiTopicListView IN");
+    delete mTopicNumberList;
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::~CbsUiTopicListView OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::init
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::init(MCbs &server, 
+               CbsUiViewManager &viewManager)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::init IN");
+    mViewManager = &viewManager;
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::init 1");
+    mServer = &server;
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::init 2");
+    // First get pointers to UI components
+    createComponents();
+
+    // Update reception status to UI
+    TBool status; //Symbian variable..
+    mServer->GetReceptionStatus(status);
+    if (status) {
+       LOG(NORMAL,"CBSUI: CbsUiTopicListView::init reception ON");
+       mReceptionButton->setText(hbTrId("txt_cbs_deactivate"));
+    } else {
+       LOG(NORMAL,"CBSUI: CbsUiTopicListView::init reception OFF");
+       mReceptionButton->setText(hbTrId("txt_cbs_activate"));
+    }
+
+    // Update Topic index and Topics   
+    reloadTopicIndex();
+    reloadTopics();
+
+    // Symbian code, leave etc to be handled.
+    // QT_TRAP_THROWING( mMonitor = CCbsUiTopicListMonitor::NewL( *mServer ) );
+    // mMonitor->AddObserverL( this );
+    // Longpress in topic list, this is needed always
+    bool ret(false);
+
+    // conntect topic index list widget operation
+    ret = connect(mTopicIndexWidget, 
+                SIGNAL(longPressed(HbListWidgetItem *, QPointF)),
+            this, SLOT(showTopicIndexMenu(HbListWidgetItem *, QPointF)));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init connect \
+            TopicIndex long press %d", ret); 
+
+    ret = connect(mTopicIndexWidget, SIGNAL(activated(HbListWidgetItem *)), 
+            this, SLOT(showTopicSelectionView(HbListWidgetItem *)));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init connect \
+            TopicIndex short press %d", ret);
+
+    // conntect topics list widget operation
+    ret = connect(mTopicsWidget,
+            SIGNAL(longPressed(HbListWidgetItem*, QPointF)), 
+            this, SLOT(showTopicsMenu(HbListWidgetItem *, QPointF)));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init connect\
+             Topics long press %d", ret); 
+
+    ret = connect(mTopicsWidget, SIGNAL(activated(HbListWidgetItem *)), 
+            this, SLOT(showTopicView(HbListWidgetItem *)));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init connect \
+            topics short press %d", ret);
+
+    // connect reception action
+    ret = connect(mReceptionButton, SIGNAL(triggered(bool)), 
+            this, SLOT(toggleReception()));  
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init connect reception %d", ret);
+
+    // Open
+    mOpenAction = qobject_cast<HbAction *>(
+    mViewManager->xmlLoader()->findObject(T_OPEN));
+    ret = connect(mOpenAction, SIGNAL(triggered()),
+            this, SLOT(showTopicView()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init open %d", ret)
+
+    // Subscribe
+    mSubscibeAction = qobject_cast<HbAction *>(
+    mViewManager->xmlLoader()->findObject(T_SUBSCRIBE));
+    ret = connect(mSubscibeAction, SIGNAL(triggered()),
+            this, SLOT(toggleSubscription()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init subscribe %d", ret)
+
+    // UnSubscribe
+    mUnSubscibeAction = qobject_cast<HbAction *>(
+    mViewManager->xmlLoader()->findObject(T_UNSUBSCRIBE));
+    ret = connect(mUnSubscibeAction, SIGNAL(triggered()),
+            this, SLOT(toggleSubscription()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init subscribe %d", ret)    
+
+    // Hotmark
+    mHotmarkAction = qobject_cast<HbAction *>(
+    mViewManager->xmlLoader()->findObject(T_HOTMARK));
+    ret = connect(mHotmarkAction, SIGNAL(triggered()),
+                 this, SLOT(toggleHotmark()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init hotmark %d", ret)
+
+    // UnHotmark
+    mUnHotmarkAction = qobject_cast<HbAction *>(
+    mViewManager->xmlLoader()->findObject(T_UNHOTMARK));
+    ret = connect(mUnHotmarkAction, SIGNAL(triggered()),
+              this, SLOT(toggleHotmark()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init hotmark %d", ret)
+
+    // Edit
+    mEditAction = qobject_cast<HbAction *>(
+            mViewManager->xmlLoader()->findObject(T_EDIT));
+    ret = connect(mEditAction, SIGNAL(triggered()) , 
+            this, SLOT(editTopic()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init edit %d", ret)
+
+    // Delete
+    mDeleteAction =  qobject_cast<HbAction *>(
+            mViewManager->xmlLoader()->findObject(T_DELETE));
+    ret = connect(mDeleteAction, SIGNAL(triggered()),
+                  this, SLOT(deleteTopic()));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::init delete %d", ret)
+
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::init OUT");   
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::TopicListChangedL
+// ---------------------------------------------------------------------------- 
+void CbsUiTopicListView::TopicListChangedL(TCbsTopicListEvent /*aEvent*/, 
+                                           TCbsTopicNumber /*aTopicNumber*/ )
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::TopicListChangedL IN");
+    reloadTopicIndex();
+    reloadTopics();
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::TopicListChangedL OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::createComponents
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::createComponents()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::createComponents IN");
+    // The topic index widget
+    mTopicIndexWidget = qobject_cast<HbListWidget *>( 
+        mViewManager->xmlLoader()->findWidget(T_TOPICINDEX));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::createComponents\
+         mTopicIndexWidget=%d", mTopicIndexWidget)
+
+    // The topic list widget
+    mTopicsWidget = qobject_cast<HbListWidget *>( 
+        mViewManager->xmlLoader()->findWidget(T_TOPIC_LIST));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::createComponents\
+         mTopicsWidget=%d", mTopicsWidget)
+
+    // Button for changing reception status
+    mReceptionButton = qobject_cast<HbAction *>( 
+        mViewManager->xmlLoader()->findObject(T_TOGGLE_RECEPTION));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::createComponents\
+        mReceptionButton=%d", mReceptionButton)
+
+    // Connect signals of DocML objects
+    HbAction *addTopic = qobject_cast<HbAction *>( 
+        mViewManager->xmlLoader()->findObject(T_ADD_TOPIC));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::createComponents\
+         addTopic=%d", addTopic)
+    connect(addTopic, SIGNAL(triggered(bool)), this, SLOT(addTopic()));
+
+    HbAction *exit =  qobject_cast<HbAction *>( 
+        mViewManager->xmlLoader()->findObject(T_EXIT));
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::createComponents\
+         exit=%d", exit)
+    connect(exit, SIGNAL(triggered(bool)), mViewManager, SLOT(close()));
+
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::createComponents OUT")  
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::reloadTopicIndex
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::reloadTopicIndex()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::reloadTopicIndex IN")
+    if (mTopicIndexWidget && mTopicNumberList) {
+        LOG(NORMAL,"CBSUI: CbsUiTopicListView::reloadTopicIndex reload")
+        HbListWidgetItem *item = new HbListWidgetItem();
+
+        TCbsTopic topic;
+        mServer->GetTopic(0, topic);
+        mTopicNumberList->At(0) = 0;
+
+        updateItem(*item, topic);
+        mTopicIndexWidget->clear();
+        mTopicIndexWidget->addItem(item);  
+
+        // Connect signal to indicate topic selection
+        connect(mTopicIndexWidget, SIGNAL(activated(HbListWidgetItem *)),
+                this, SLOT(showTopicSelectionView(HbListWidgetItem *)));     
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::reloadTopicIndex OUT")
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::reloadTopics
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::reloadTopics()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::reloadTopics IN");
+    if (mTopicNumberList && mTopicsWidget) {
+        int count(0);
+        mServer->GetTopicCount(count);   
+        LOG2(NORMAL,"CBSUI: CbsUiTopicListView::reloadTopics total count %d",
+                count);
+        // Reset first
+        mTopicNumberList->Reset();
+        QT_TRAP_THROWING(mTopicNumberList->AppendL(0));
+        mTopicsWidget->clear();
+
+        // Add updated topics one by one
+        for (int i = 1; i < count; i++) {
+            TCbsTopic topic;
+            mServer->GetTopic(i, topic);
+            QT_TRAP_THROWING(mTopicNumberList->AppendL(topic.iNumber));
+            HbListWidgetItem *item = new HbListWidgetItem();
+            updateItem(*item, topic);
+            mTopicsWidget->addItem(item);    
+
+            // Connect signal to indicate topic selection
+            connect(mTopicsWidget, SIGNAL(activated(HbListWidgetItem *)), 
+                    this, SLOT(showTopicView(HbListWidgetItem *)));
+        }
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::reloadTopics OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showTopicSelectionView
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::showTopicSelectionView(HbListWidgetItem */*item*/)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicSelectionView IN"); 
+    mTopicRow = 0;
+    if (mTopicNumberList) {
+        TInt messages(0);
+        mServer->GetMessageCount(0, messages);
+        if (messages) {
+            // TODO: show topic selection view
+        }
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicSelectionView OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showTopicView
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::showTopicView(HbListWidgetItem *item)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::topicSelection IN");
+    mTopicRow = mTopicsWidget->row(item)+1;
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::topicSelection index=%d", 
+            mTopicRow);
+    if (mTopicNumberList) {
+        TCbsTopicNumber selectTopic(mTopicNumberList->At(mTopicRow));
+        TInt messages(0);
+        mServer->GetMessageCount(selectTopic, messages);
+        if (messages) {
+           // it will be reopened
+           // mViewManager->activateTopicView(selectTopic);
+        }
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::topicSelection OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::addTopic
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::addTopic()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::addTopic IN");
+    // Handle not OK cases, KErrAlreadyExists, KErrArgument, KErrDiskFull
+    // Todo: Add from index if it is available
+    TCbsTopic topic;
+    if (showTopicQuery(topic, true) &&
+        KErrNone == mServer->AddTopic(topic)) {
+        reloadTopics(); 
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::addTopic OUT");
+}
+
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::editTopic
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::editTopic()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::editTopic IN");
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::editTopic mTopicRow=%d", mTopicRow)
+    TInt count(0);
+    mServer->GetTopicCount(count);
+    if (mTopicRow > 0 && mTopicRow < count) {
+        // Get topic we need to edit
+        TCbsTopic topic;
+        mServer->GetTopic(mTopicRow, topic);
+        TCbsTopicNumber oldTopicNumber = topic.iNumber;
+        TCbsTopicNumber newTopicNumber(EMaxTopicNumber);
+        TCbsTopicName newTopicName;
+        if (showTopicQuery(topic, false)) {
+            newTopicNumber = topic.iNumber;
+            newTopicName = topic.iName;
+        }
+        TInt err = mServer->ChangeTopicNameAndNumber(oldTopicNumber, 
+                newTopicNumber, newTopicName);
+        if (KErrNone == err) {
+            reloadTopics();
+        }
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::editTopic OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::deleteTopic
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::deleteTopic()
+    {
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::deleteTopic IN row %d", mTopicRow);
+    TInt count(0);
+    mServer->GetTopicCount(count);
+    if (mTopicRow > 0 && mTopicRow < count) {
+        // user confirmation 
+        HbMessageBox *box = new HbMessageBox(hbTrId("txt_cbs_delete_topic"),
+                HbMessageBox::MessageTypeQuestion);
+        HbAction *action = box->exec();
+        if (action == box->primaryAction()) {
+            TCbsTopicNumber selectTopic(mTopicNumberList->At(mTopicRow));
+            LOG2(NORMAL,"CBSUI: CbsUiTopicListView::deleteTopic topic number %d",
+                    selectTopic);
+            if (KErrNone == mServer->DeleteTopic(selectTopic)) {
+                reloadTopics();
+            }
+        }
+        delete box;
+        box = NULL;
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::deleteTopic OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::toggleReception
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::toggleReception()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::ToggleReception IN");
+    TBool status; //Symbian variable..
+    mServer->GetReceptionStatus(status);
+
+    if (status) {
+        // Deactivate reception and switch the text on UI
+        LOG(NORMAL,"CBSUI: CbsUiTopicListView::ToggleReception 1->0");
+        mServer->SetReceptionStatus(EFalse);
+       
+        mReceptionButton->setText( hbTrId("txt_cbs_activate") );
+    } else {
+        LOG(NORMAL,"CBSUI: CbsUiTopicListView::ToggleReception 0->1");
+        // Activate reception and switch the text on UI
+        mServer->SetReceptionStatus(ETrue);
+        mReceptionButton->setText(hbTrId("txt_cbs_deactivate"));
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::ToggleReception OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::toggleHotmark
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::toggleHotmark()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::toggleHotmark IN")
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::toggleHotmark\
+         mTopicRow %d", mTopicRow);
+    TInt count(0);
+    mServer->GetTopicCount(count);
+    if (mTopicRow >= 0 && mTopicRow < count) {
+        // Update data
+        TCbsTopic topic;
+        mServer->GetTopic(mTopicRow, topic);
+        LOG3(NORMAL,"CBSUI: CbsUiTopicListView::toggleHotmark\
+             before toggle hormark (S,H)=(%d,%d)", 
+             topic.iSubscribed, topic.iHotmarked);
+
+        if (topic.iHotmarked) {
+            mServer->ChangeTopicHotmarkStatus(topic.iNumber, EFalse);
+            mServer->ChangeTopicSubscriptionStatus(topic.iNumber, ETrue);
+            topic.iHotmarked = EFalse;
+            topic.iSubscribed = ETrue;        
+        } else {
+            if (topic.iSubscribed){
+                mServer->ChangeTopicHotmarkStatus(topic.iNumber, ETrue);
+                topic.iHotmarked = ETrue;
+            } else {
+                mServer->ChangeTopicHotmarkStatus(topic.iNumber, ETrue);
+                mServer->ChangeTopicSubscriptionStatus(topic.iNumber, ETrue);
+                topic.iHotmarked = ETrue;
+                topic.iSubscribed = ETrue;
+            }
+        }
+        LOG3(NORMAL,"CBSUI: CbsUiTopicListView::toggleHotmark\
+             after toggle hotmark (S,H)=(%d,%d)", 
+             topic.iSubscribed, topic.iHotmarked);  
+        // Update icon
+        updateCurrentItemIcon(topic);
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::toggleHotmark OUT")
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::toggleSubscription
+// ----------------------------------------------------------------------------    
+void CbsUiTopicListView::toggleSubscription()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::toggleSubsciption IN")
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::toggleSubsciption mTopicRow=%d", 
+            mTopicRow)
+    TInt count(0);
+    mServer->GetTopicCount(count);
+    if (mTopicRow >= 0 && mTopicRow < count) {
+        TCbsTopic topic;
+        mServer->GetTopic(mTopicRow, topic);
+        LOG2(NORMAL,"CBSUI: CbsUiTopicListView::toggleSubsciption\
+             topic number %d", topic.iNumber);
+        LOG3(NORMAL,"CBSUI: CbsUiTopicListView::toggleSubscription\
+             before toggle subscibe (S,H)=(%d,%d)", 
+             topic.iSubscribed, topic.iHotmarked);
+
+        if (topic.iSubscribed) {
+            if (topic.iHotmarked) {
+                mServer->ChangeTopicHotmarkStatus(topic.iNumber, EFalse);
+                topic.iHotmarked = EFalse;
+            }
+            mServer->ChangeTopicSubscriptionStatus(topic.iNumber, EFalse);
+            topic.iSubscribed = EFalse;
+        } else {
+            mServer->ChangeTopicSubscriptionStatus(topic.iNumber, ETrue);
+            topic.iSubscribed = ETrue;
+        }
+        LOG3(NORMAL,"CBSUI: CbsUiTopicListView::toggleSubscription\
+             after toggle subscibe (S,H)=(%d,%d)", 
+             topic.iSubscribed, topic.iHotmarked);
+        // Update icon
+        updateCurrentItemIcon(topic);
+    }
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::toggleSubsciption OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showTopicIndexMenu
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::showTopicIndexMenu(HbListWidgetItem *item, QPointF coords)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicIndexMenu IN");
+    Q_UNUSED(item);
+    mTopicRow = 0;
+    TCbsTopic topic;
+    mServer->GetTopic(0, topic);
+    LOG3(NORMAL,"CBSUI: CbsUiTopicListView::showTopicIndexMenu (row %d: %d)",
+            mTopicRow, topic.iNumber);    
+    showPopupMenu(topic, coords);
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicIndexMenu OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showTopicsMenu
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::showTopicsMenu(HbListWidgetItem *item, QPointF coords)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicsMenu IN");
+    mTopicRow = mTopicsWidget->row(item)+1;
+    TCbsTopic topic;
+    mServer->GetTopic(mTopicRow, topic);
+    LOG3(NORMAL,"CBSUI: CbsUiTopicListView::showTopicsMenu (row %d: %d)",
+            mTopicRow, topic.iNumber);
+    showPopupMenu(topic, coords);
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicsMenu OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showPopupMenu
+// ----------------------------------------------------------------------------
+void CbsUiTopicListView::showPopupMenu(const TCbsTopic &topic, QPointF coords)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showPopupMenu IN");
+    HbMenu *contextMenu = new HbMenu();
+    contextMenu->setTimeout(HbPopup::NoTimeout);
+    contextMenu->setDismissPolicy(HbPopup::TapOutside);
+
+    TInt messageCount(0);
+    mServer->GetMessageCount(topic.iNumber, messageCount);
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::showPopupMenu\
+         messageCount=%d", messageCount)
+
+    // Open
+    if (topic.iNumber && messageCount) {
+        contextMenu->addAction(mOpenAction);
+    }
+    // Subscribe / UnSubscribe
+    if (topic.iSubscribed) {
+        contextMenu->addAction(mUnSubscibeAction);
+    } else {
+        contextMenu->addAction(mSubscibeAction);
+    }
+    // Hotmark / UnHotmark
+    if (topic.iHotmarked) {
+        contextMenu->addAction(mUnHotmarkAction);
+    } else {
+        contextMenu->addAction(mHotmarkAction);
+    }
+    // Edit & Delete
+    if (topic.iNumber) {
+        contextMenu->addAction(mEditAction);
+        contextMenu->addAction(mDeleteAction);
+    }
+
+    // Show context sensitive menu. 
+    contextMenu->exec(coords);
+    contextMenu->clearActions();
+    delete contextMenu;
+    contextMenu = NULL;
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showPopupMenu OUT")
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateQueryAction
+// ----------------------------------------------------------------------------
+//
+void CbsUiTopicListView::updateQueryAction( QString text )
+{
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateQueryAction IN" )
+    LOG2(NORMAL, "SATAPP: CbsUiTopicListView::updateQueryAction text=%s", 
+        text.utf16())
+    if (mTopicQuery && text.length() > 0) {
+        mTopicQuery->primaryAction()->setEnabled(true);
+        LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateQueryAction enable OK")
+    }
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateQueryAction OUT" )
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateItem
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::updateItem(HbListWidgetItem &item, 
+        const TCbsTopic &topic)
+{
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateItem IN" )
+    updateItemText(item, topic);
+    updateItemIcon(item, topic);
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateItem OUT" )
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateItemIcon
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::updateItemIcon(HbListWidgetItem &item, 
+        const TCbsTopic &topic)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemIcon IN");
+    // TODO: what is the correct way to handle graphics (SVG?)
+
+    if (topic.iSubscribed) {
+        if (topic.iHotmarked) {
+            item.setDecorationIcon(HbIcon(":/icons/icons/hotmark2.png"));
+            LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemIcon Hotmarked");
+        } else {
+            item.setDecorationIcon(HbIcon(":/icons/icons/sub2.png"));
+            LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemIcon Subscribed");
+        }
+    } else {
+          // No icon if not subscribted:
+          // List item without an icon is alligned on left (looks bad)
+          // temporary solution is to use empty icon
+          item.setDecorationIcon(HbIcon(":/icons/icons/empty.png"));
+          LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemIcon Empty");
+    } 
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemIcon OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateItemText
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::updateItemText(HbListWidgetItem &item, 
+        const TCbsTopic &topic)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemText IN");
+    QString txtL1;
+    QString txtL2;
+    if (0 == topic.iNumber) {
+        LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemText topic index");
+        txtL1 = hbTrId("txt_cbs_000_topic_index");
+        txtL2 = hbTrId("txt_cbs_not_available");
+    } else {
+        LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemText topics");
+        txtL1 = QVariant(topic.iNumber).toString();
+        txtL2 = hbTrId("txt_cbs_no_messages");
+        // instert zeros to topic number in case 2 or 1 digit topic number.
+        switch (txtL1.length()) {
+            case 1:
+                {
+                txtL1.insert(0, "0");
+                txtL1.insert(0, "0");
+                break;
+                }
+            case 2:
+                {
+                txtL1.insert(0, "0");
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            // do nothing
+            }
+
+        txtL1.append(' '); // a space
+        QString name = QString::fromUtf16(topic.iName.Ptr(), topic.iName.Length());
+        txtL1.append(name);
+        if (topic.iUnreadMessages) {
+            txtL1.append(" ("); // space + (
+            txtL1.append(QVariant(topic.iUnreadMessages).toString());
+            txtL1.append(')');  // closing )
+        } 
+        // Update the status of topic
+        TInt numberOfMessages(0);
+        mServer->GetMessageCount(topic.iNumber, numberOfMessages);
+        if (numberOfMessages) {
+            TCbsMessage message;
+            TBuf<KMaxMessageTitleLength> buffer;  // symbian code
+            // take the last message, not sure is this correct
+            TInt err = mServer->GetMessage(topic.iNumber,
+                    numberOfMessages - 1, message);
+            if (KErrNone == err) {
+                err = mServer->GetMessageContents(message.iHandle, buffer);
+                txtL2 = QString::fromUtf16(buffer.Ptr(), buffer.Length()); 
+                // TODO: timestamp and second text line   
+            }
+        }
+    }
+    item.setText(txtL1);
+    item.setSecondaryText(txtL2);
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::updateItemText OUT");
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateCurrentItem
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::updateCurrentItem(const TCbsTopic &topic)
+{
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItem IN" )
+    LOG2(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItem row=%d",
+        mTopicRow)
+    updateCurrentItemIcon(topic);
+    updateCurrentItemText(topic);
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItem OUT" )
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateCurrentItemIcon
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::updateCurrentItemIcon(const TCbsTopic &topic)
+{
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItemIcon IN" )
+    LOG2(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItemIcon row=%d",
+        mTopicRow)    
+    HbListWidgetItem *list = NULL;
+    if (0 == mTopicRow) {
+        list = mTopicIndexWidget->item(0); 
+    } else {
+        list = mTopicsWidget->item(mTopicRow - 1);
+    }
+    updateItemIcon(*list, topic);
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItemIcon OUT" )
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::updateCurrentItemText
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::updateCurrentItemText(const TCbsTopic &topic)
+{
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItemText IN" )
+    LOG2(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItemText row=%d",
+        mTopicRow)
+    HbListWidgetItem *list = NULL;
+    if (0 == mTopicRow) {
+        list = mTopicIndexWidget->item(0); 
+    } else {
+        list = mTopicsWidget->item(mTopicRow - 1);
+    }
+    updateItemText(*list, topic);
+    LOG(NORMAL, "SATAPP: CbsUiTopicListView::updateCurrentItemText OUT" )
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showTopicQuery
+// ----------------------------------------------------------------------------  
+bool CbsUiTopicListView::showTopicQuery(TCbsTopic &topic, const bool isAddTopic)
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery IN");
+    bool ret = false; // user didn't click OK
+    // Compose dialog
+    mTopicQuery = new HbInputDialog();
+    mTopicQuery->setSecondRowVisible(true);
+    // Name
+    mTopicQuery->setInputMode(HbInputDialog::TextInput, 0);
+    mTopicQuery->lineEdit(0)->setMaxLength(KMaxTopicNameLength);
+    QString name = QString::fromUtf16(topic.iName.Ptr(), topic.iName.Length()); 
+    if (name.length()) {
+        mTopicQuery->setTextValue(QVariant(name), 0);
+        LOG2(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery old name %s",
+                name.utf16());
+    }
+
+    // Number
+    mTopicQuery->setInputMode(HbInputDialog::IntInput, 1);
+    mTopicQuery->lineEdit(1)->setMaxLength(3);
+    int number = topic.iNumber;
+    if (number){
+        mTopicQuery->setTextValue(QVariant(number), 1);
+        LOG2(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery old number%d", number);
+    }
+
+    mTopicQuery->setPromptText(hbTrId("txt_cbs_topic_name"), 0);
+    mTopicQuery->setPromptText(hbTrId("txt_cbs_topic_number"), 1);
+
+    // Disable OK button if invalid topic number input
+    HbAction *perimaryAction = mTopicQuery->primaryAction();
+    perimaryAction->setEnabled(false);
+    connect(mTopicQuery->lineEdit(1), SIGNAL(textChanged(QString)), 
+        this, SLOT( updateQueryAction(QString)));
+
+    // Add validation for topic number (1-999)
+    HbValidator *val =new HbValidator;
+    QRegExp r("\\d{1,3}"); // from 1 to 3 digits
+    val->setMasterValidator(new QRegExpValidator(r,0));
+    val->addField(new QIntValidator(1,999,0),"");
+    mTopicQuery->setValidator(val, 1);
+
+    // Show the dialog
+    HbAction *action = mTopicQuery->exec();
+
+    // Fatch name and number from dialog
+    name = mTopicQuery->value(0).toString();
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery name=%s ", name.utf16());
+    number = mTopicQuery->value(1).toString().toInt();
+    LOG2(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery number=%d ", number);
+    bool isNumberExist(false);
+    if (isAddTopic) {
+        int count(0);
+        mServer->GetTopicCount(count);   
+        LOG2(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery topic total count %d", 
+                count);     
+        // Check if there is a toipc number same as number which user add
+        for (int i = 1; i < count; i++) {
+            TCbsTopic currentTopic;
+            mServer->GetTopic(i, currentTopic);
+            if (currentTopic.iNumber == number) {
+            isNumberExist = true;
+            break;
+            }     
+        }      
+    }
+
+    // check that a topic number was entered and ok pressed
+    // name is optional
+    if (action == mTopicQuery->primaryAction()) {
+        if ( isNumberExist || !number){
+            // 000 topic and exist number topic can't be edited
+            showNumberInUsePopup();
+            showTopicQuery( topic, isAddTopic);
+        } else {
+            ret = true;
+            LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery OK")
+            topic.iNumber = number;
+            topic.iSubscribed = ETrue;
+            topic.iHotmarked = EFalse;
+            if (name.length()) {
+                topic.iName = name.utf16();
+            }       
+        }
+    }
+    delete mTopicQuery;
+    mTopicQuery = NULL;
+
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showTopicQuery OUT");
+    return ret;
+}
+
+// ----------------------------------------------------------------------------
+// CbsUiTopicListView::showNumberInUsePopup
+// ----------------------------------------------------------------------------  
+void CbsUiTopicListView::showNumberInUsePopup()
+{
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showNumberInUsePopup IN");
+    HbMessageBox *inUsedPopup = new HbMessageBox(HbMessageBox::MessageTypeWarning);
+    inUsedPopup->setText(tr("topic number already in use "));
+    inUsedPopup->exec();
+    delete inUsedPopup;
+    inUsedPopup = NULL;
+    LOG(NORMAL,"CBSUI: CbsUiTopicListView::showNumberInUsePopup OUT");
+}
+
+// End of file