--- /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