2007-11-14 22:18:48 -05:00
/****************************************************************
* RetroShare is distributed under the following license :
*
* Copyright ( C ) 2006 , crypton
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
2010-05-23 13:21:30 -04:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
2007-11-14 22:18:48 -05:00
* Boston , MA 02110 - 1301 , USA .
2008-09-04 15:28:35 -04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-23 14:52:58 -04:00
# include <QStandardItemModel>
# include <QShortcut>
# include <QTimer>
# include <QDateTime>
2013-05-04 18:03:48 -04:00
# include <QMessageBox>
2011-05-21 12:26:00 -04:00
# include <QKeyEvent>
2009-11-28 09:34:15 -05:00
2008-09-04 15:28:35 -04:00
# include "MessagesDialog.h"
2010-05-23 15:13:41 -04:00
# include "msgs/MessageComposer.h"
2011-06-03 20:46:02 -04:00
# include "msgs/MessageWidget.h"
2011-05-21 12:26:00 -04:00
# include "msgs/TagsMenu.h"
2012-08-05 16:12:55 -04:00
# include "msgs/MessageUserNotify.h"
2010-07-23 14:52:58 -04:00
# include "settings/rsharesettings.h"
2010-09-12 18:17:17 -04:00
# include "common/TagDefs.h"
2010-09-28 16:33:34 -04:00
# include "common/PeerDefs.h"
2010-11-09 18:56:02 -05:00
# include "common/RSItemDelegate.h"
2014-10-09 18:04:12 -04:00
# include "gui/gxs/GxsIdTreeWidgetItem.h"
2012-11-15 16:35:37 -05:00
# include "util/DateTime.h"
2013-08-02 19:00:36 -04:00
# include "util/RsProtectedTimer.h"
2013-10-19 09:25:06 -04:00
# include "util/QtVersion.h"
2007-11-14 22:18:48 -05:00
2010-08-06 05:40:23 -04:00
# include <retroshare/rspeers.h>
2011-05-21 12:26:00 -04:00
# include <retroshare/rsmsgs.h>
2009-02-11 13:43:37 -05:00
2010-08-22 18:12:26 -04:00
# include <algorithm>
2007-11-14 22:18:48 -05:00
2008-09-04 15:28:35 -04:00
/* Images for context menu icons */
2014-10-09 18:04:12 -04:00
# define IMAGE_MESSAGE ": / images / folder-draft.png"
2011-05-23 19:45:31 -04:00
# define IMAGE_MESSAGEREMOVE ": / images / message-mail-imapdelete.png"
# define IMAGE_STAR_ON ": / images / star-on-16.png"
# define IMAGE_STAR_OFF ": / images / star-off-16.png"
2012-05-05 18:20:05 -04:00
# define IMAGE_SYSTEM ": / images / user / user_request16.png"
2013-09-25 11:58:01 -04:00
# define IMAGE_DECRYPTMESSAGE ": / images / decrypt-mail.png"
2011-05-23 19:45:31 -04:00
2011-05-24 19:35:11 -04:00
# define COLUMN_STAR 0
# define COLUMN_ATTACHEMENTS 1
# define COLUMN_SUBJECT 2
# define COLUMN_UNREAD 3
# define COLUMN_FROM 4
2013-08-02 19:00:36 -04:00
# define COLUMN_SIGNATURE 5
# define COLUMN_DATE 6
# define COLUMN_CONTENT 7
# define COLUMN_TAGS 8
# define COLUMN_COUNT 9
2010-06-25 08:17:46 -04:00
# define COLUMN_DATA 0 // column for storing the userdata like msgid and srcid
2010-11-02 17:11:11 -04:00
# define ROLE_SORT Qt::UserRole
# define ROLE_MSGID Qt::UserRole + 1
# define ROLE_SRCID Qt::UserRole + 2
# define ROLE_UNREAD Qt::UserRole + 3
# define ROLE_MSGFLAGS Qt::UserRole + 4
2010-05-27 15:48:52 -04:00
2011-06-04 18:54:03 -04:00
# define ROLE_QUICKVIEW_TYPE Qt::UserRole
# define ROLE_QUICKVIEW_ID Qt::UserRole + 1
# define ROLE_QUICKVIEW_TEXT Qt::UserRole + 2
# define QUICKVIEW_TYPE_NOTHING 0
# define QUICKVIEW_TYPE_STATIC 1
# define QUICKVIEW_TYPE_TAG 2
# define QUICKVIEW_STATIC_ID_STARRED 1
2012-05-01 05:18:55 -04:00
# define QUICKVIEW_STATIC_ID_SYSTEM 2
2011-06-04 18:54:03 -04:00
2010-05-28 10:42:54 -04:00
# define ROW_INBOX 0
# define ROW_OUTBOX 1
# define ROW_DRAFTBOX 2
# define ROW_SENTBOX 3
# define ROW_TRASHBOX 4
2010-05-27 15:48:52 -04:00
2010-06-03 18:12:07 -04:00
MessagesDialog : : LockUpdate : : LockUpdate ( MessagesDialog * pDialog , bool bUpdate )
{
m_pDialog = pDialog ;
m_bUpdate = bUpdate ;
2012-05-01 05:18:55 -04:00
m_pDialog - > lockUpdate + + ;
2010-06-03 18:12:07 -04:00
}
MessagesDialog : : LockUpdate : : ~ LockUpdate ( )
{
2012-05-01 05:18:55 -04:00
if ( - - m_pDialog - > lockUpdate < 0 )
m_pDialog - > lockUpdate = 0 ;
2010-06-03 18:12:07 -04:00
2012-05-01 05:18:55 -04:00
if ( m_bUpdate & & m_pDialog - > lockUpdate = = 0 ) {
2010-06-03 18:12:07 -04:00
m_pDialog - > insertMessages ( ) ;
}
}
2010-08-22 18:12:26 -04:00
void MessagesDialog : : LockUpdate : : setUpdate ( bool bUpdate )
{
m_bUpdate = bUpdate ;
}
2008-09-04 15:28:35 -04:00
/** Constructor */
MessagesDialog : : MessagesDialog ( QWidget * parent )
: MainPage ( parent )
{
2010-05-23 13:21:30 -04:00
/* Invoke the Qt Designer generated object setup routine */
ui . setupUi ( this ) ;
2012-05-01 05:18:55 -04:00
inProcessSettings = false ;
2011-06-04 18:54:03 -04:00
inChange = false ;
2012-05-01 05:18:55 -04:00
lockUpdate = 0 ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
connect ( ui . messageTreeWidget , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( messageTreeWidgetCustomPopupMenu ( QPoint ) ) ) ;
2013-05-04 18:03:48 -04:00
connect ( ui . listWidget , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( folderlistWidgetCustomPopupMenu ( QPoint ) ) ) ;
2014-10-09 18:04:12 -04:00
connect ( ui . messageTreeWidget , SIGNAL ( itemClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( clicked ( QTreeWidgetItem * , int ) ) ) ;
connect ( ui . messageTreeWidget , SIGNAL ( itemDoubleClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( doubleClicked ( QTreeWidgetItem * , int ) ) ) ;
connect ( ui . messageTreeWidget , SIGNAL ( currentItemChanged ( QTreeWidgetItem * , QTreeWidgetItem * ) ) , this , SLOT ( currentItemChanged ( QTreeWidgetItem * ) ) ) ;
connect ( ui . messageTreeWidget - > selectionModel ( ) , SIGNAL ( currentChanged ( QModelIndex , QModelIndex ) ) , this , SLOT ( currentChanged ( const QModelIndex & ) ) ) ;
2011-06-03 20:46:02 -04:00
connect ( ui . listWidget , SIGNAL ( currentRowChanged ( int ) ) , this , SLOT ( changeBox ( int ) ) ) ;
2011-06-04 18:54:03 -04:00
connect ( ui . quickViewWidget , SIGNAL ( currentRowChanged ( int ) ) , this , SLOT ( changeQuickView ( int ) ) ) ;
2011-06-03 20:46:02 -04:00
connect ( ui . tabWidget , SIGNAL ( currentChanged ( int ) ) , this , SLOT ( tabChanged ( int ) ) ) ;
connect ( ui . tabWidget , SIGNAL ( tabCloseRequested ( int ) ) , this , SLOT ( tabCloseRequested ( int ) ) ) ;
2010-05-23 13:21:30 -04:00
connect ( ui . newmessageButton , SIGNAL ( clicked ( ) ) , this , SLOT ( newmessage ( ) ) ) ;
2011-06-03 20:46:02 -04:00
connect ( ui . actionTextBesideIcon , SIGNAL ( triggered ( ) ) , this , SLOT ( buttonStyle ( ) ) ) ;
connect ( ui . actionIconOnly , SIGNAL ( triggered ( ) ) , this , SLOT ( buttonStyle ( ) ) ) ;
connect ( ui . actionTextUnderIcon , SIGNAL ( triggered ( ) ) , this , SLOT ( buttonStyle ( ) ) ) ;
2010-05-23 13:21:30 -04:00
2011-06-03 20:46:02 -04:00
ui . actionTextBesideIcon - > setData ( Qt : : ToolButtonTextBesideIcon ) ;
ui . actionIconOnly - > setData ( Qt : : ToolButtonIconOnly ) ;
ui . actionTextUnderIcon - > setData ( Qt : : ToolButtonTextUnderIcon ) ;
2010-05-23 13:21:30 -04:00
2012-04-05 17:03:03 -04:00
connect ( ui . filterLineEdit , SIGNAL ( textChanged ( QString ) ) , this , SLOT ( filterChanged ( QString ) ) ) ;
2012-10-29 06:59:26 -04:00
connect ( ui . filterLineEdit , SIGNAL ( filterChanged ( int ) ) , this , SLOT ( filterColumnChanged ( int ) ) ) ;
2010-05-23 13:21:30 -04:00
2011-06-03 20:46:02 -04:00
msgWidget = new MessageWidget ( true , this ) ;
ui . msgLayout - > addWidget ( msgWidget ) ;
2010-05-23 13:21:30 -04:00
2011-06-03 20:46:02 -04:00
connectActions ( ) ;
2010-05-23 13:21:30 -04:00
2012-05-01 05:18:55 -04:00
listMode = LIST_NOTHING ;
2010-06-01 18:14:52 -04:00
2010-05-23 13:21:30 -04:00
mCurrMsgId = " " ;
// Set the QStandardItemModel
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > setColumnCount ( COLUMN_COUNT ) ;
QTreeWidgetItem * headerItem = ui . messageTreeWidget - > headerItem ( ) ;
headerItem - > setText ( COLUMN_ATTACHEMENTS , " " ) ;
headerItem - > setIcon ( COLUMN_ATTACHEMENTS , QIcon ( " :/images/attachment.png " ) ) ;
headerItem - > setText ( COLUMN_SUBJECT , tr ( " Subject " ) ) ;
headerItem - > setText ( COLUMN_UNREAD , " " ) ;
headerItem - > setIcon ( COLUMN_UNREAD , QIcon ( " :/images/message-state-header.png " ) ) ;
headerItem - > setText ( COLUMN_FROM , tr ( " From " ) ) ;
headerItem - > setText ( COLUMN_SIGNATURE , " " ) ;
headerItem - > setIcon ( COLUMN_SIGNATURE , QIcon ( " :/images/signature.png " ) ) ;
headerItem - > setText ( COLUMN_DATE , tr ( " Date " ) ) ;
headerItem - > setText ( COLUMN_TAGS , tr ( " Tags " ) ) ;
headerItem - > setText ( COLUMN_CONTENT , tr ( " Content " ) ) ;
headerItem - > setText ( COLUMN_STAR , " " ) ;
headerItem - > setIcon ( COLUMN_STAR , QIcon ( IMAGE_STAR_ON ) ) ;
headerItem - > setToolTip ( COLUMN_ATTACHEMENTS , tr ( " Click to sort by attachments " ) ) ;
headerItem - > setToolTip ( COLUMN_SUBJECT , tr ( " Click to sort by subject " ) ) ;
headerItem - > setToolTip ( COLUMN_UNREAD , tr ( " Click to sort by read " ) ) ;
headerItem - > setToolTip ( COLUMN_FROM , tr ( " Click to sort by from " ) ) ;
headerItem - > setToolTip ( COLUMN_SIGNATURE , tr ( " Click to sort by signature " ) ) ;
headerItem - > setToolTip ( COLUMN_DATE , tr ( " Click to sort by date " ) ) ;
headerItem - > setToolTip ( COLUMN_TAGS , tr ( " Click to sort by tags " ) ) ;
headerItem - > setToolTip ( COLUMN_STAR , tr ( " Click to sort by star " ) ) ;
mMessageCompareRole = new RSTreeWidgetItemCompareRole ;
mMessageCompareRole - > setRole ( COLUMN_SUBJECT , ROLE_SORT ) ;
mMessageCompareRole - > setRole ( COLUMN_UNREAD , ROLE_SORT ) ;
mMessageCompareRole - > setRole ( COLUMN_FROM , ROLE_SORT ) ;
mMessageCompareRole - > setRole ( COLUMN_DATE , ROLE_SORT ) ;
mMessageCompareRole - > setRole ( COLUMN_TAGS , ROLE_SORT ) ;
mMessageCompareRole - > setRole ( COLUMN_ATTACHEMENTS , ROLE_SORT ) ;
mMessageCompareRole - > setRole ( COLUMN_STAR , ROLE_SORT ) ;
2010-05-23 13:21:30 -04:00
2010-11-09 18:56:02 -05:00
RSItemDelegate * itemDelegate = new RSItemDelegate ( this ) ;
itemDelegate - > setSpacing ( QSize ( 0 , 2 ) ) ;
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > setItemDelegate ( itemDelegate ) ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > sortByColumn ( COLUMN_DATA , Qt : : DescendingOrder ) ;
2010-04-27 17:46:28 -04:00
2010-05-06 10:39:50 -04:00
// workaround for Qt bug, should be solved in next Qt release 4.7.0
// http://bugreports.qt.nokia.com/browse/QTBUG-8270
2014-10-09 18:04:12 -04:00
QShortcut * Shortcut = new QShortcut ( QKeySequence ( Qt : : Key_Delete ) , ui . messageTreeWidget , 0 , 0 , Qt : : WidgetShortcut ) ;
2010-05-06 10:39:50 -04:00
connect ( Shortcut , SIGNAL ( activated ( ) ) , this , SLOT ( removemessage ( ) ) ) ;
2014-10-09 18:04:12 -04:00
Shortcut = new QShortcut ( QKeySequence ( Qt : : SHIFT | Qt : : Key_Delete ) , ui . messageTreeWidget , 0 , 0 , Qt : : WidgetShortcut ) ;
2010-05-28 10:42:54 -04:00
connect ( Shortcut , SIGNAL ( activated ( ) ) , this , SLOT ( removemessage ( ) ) ) ;
2010-05-06 10:39:50 -04:00
2014-10-09 18:04:12 -04:00
/* Set initial section sizes */
QHeaderView * msgwheader = ui . messageTreeWidget - > header ( ) ;
2010-05-23 13:21:30 -04:00
msgwheader - > resizeSection ( COLUMN_ATTACHEMENTS , 24 ) ;
msgwheader - > resizeSection ( COLUMN_SUBJECT , 250 ) ;
msgwheader - > resizeSection ( COLUMN_FROM , 140 ) ;
2013-08-04 09:19:27 -04:00
msgwheader - > resizeSection ( COLUMN_SIGNATURE , 24 ) ;
2010-05-23 13:21:30 -04:00
msgwheader - > resizeSection ( COLUMN_DATE , 140 ) ;
2011-05-23 19:45:31 -04:00
2013-10-19 09:25:06 -04:00
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_STAR , QHeaderView : : Fixed ) ;
2011-05-23 19:45:31 -04:00
msgwheader - > resizeSection ( COLUMN_STAR , 24 ) ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_UNREAD , QHeaderView : : Fixed ) ;
msgwheader - > resizeSection ( COLUMN_UNREAD , 24 ) ;
2010-05-23 13:21:30 -04:00
ui . forwardmessageButton - > setToolTip ( tr ( " Forward selected Message " ) ) ;
ui . replyallmessageButton - > setToolTip ( tr ( " Reply to All " ) ) ;
2008-11-25 20:19:09 -05:00
2011-06-05 09:37:49 -04:00
QMenu * printmenu = new QMenu ( ) ;
2008-09-04 15:28:35 -04:00
printmenu - > addAction ( ui . actionPrint ) ;
printmenu - > addAction ( ui . actionPrintPreview ) ;
2008-03-26 10:22:51 -04:00
ui . printbutton - > setMenu ( printmenu ) ;
2010-05-23 13:21:30 -04:00
2011-06-05 09:37:49 -04:00
QMenu * viewmenu = new QMenu ( ) ;
2010-01-21 20:05:45 -05:00
viewmenu - > addAction ( ui . actionTextBesideIcon ) ;
viewmenu - > addAction ( ui . actionIconOnly ) ;
2010-03-24 06:52:52 -04:00
//viewmenu->addAction(ui.actionTextUnderIcon);
2010-01-21 20:05:45 -05:00
ui . viewtoolButton - > setMenu ( viewmenu ) ;
2007-11-14 22:18:48 -05:00
2012-10-29 06:59:26 -04:00
/* add filter actions */
2012-10-29 22:44:14 -04:00
ui . filterLineEdit - > addFilter ( QIcon ( ) , tr ( " Subject " ) , COLUMN_SUBJECT , tr ( " Search Subject " ) ) ;
ui . filterLineEdit - > addFilter ( QIcon ( ) , tr ( " From " ) , COLUMN_FROM , tr ( " Search From " ) ) ;
ui . filterLineEdit - > addFilter ( QIcon ( ) , tr ( " Date " ) , COLUMN_DATE , tr ( " Search Date " ) ) ;
ui . filterLineEdit - > addFilter ( QIcon ( ) , tr ( " Content " ) , COLUMN_CONTENT , tr ( " Search Content " ) ) ;
ui . filterLineEdit - > addFilter ( QIcon ( ) , tr ( " Tags " ) , COLUMN_TAGS , tr ( " Search Tags " ) ) ;
ui . filterLineEdit - > addFilter ( QIcon ( ) , tr ( " Attachments " ) , COLUMN_ATTACHEMENTS , tr ( " Search Attachments " ) ) ;
2012-10-29 06:59:26 -04:00
2010-05-23 13:21:30 -04:00
//setting default filter by column as subject
2012-10-29 06:59:26 -04:00
ui . filterLineEdit - > setCurrentFilter ( COLUMN_SUBJECT ) ;
2010-05-23 13:21:30 -04:00
2010-05-18 18:37:18 -04:00
// load settings
processSettings ( true ) ;
2010-05-23 13:21:30 -04:00
/* Set header sizes for the fixed columns and resize modes, must be set after processSettings */
2013-10-19 09:25:06 -04:00
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_ATTACHEMENTS , QHeaderView : : Fixed ) ;
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_DATE , QHeaderView : : Interactive ) ;
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_UNREAD , QHeaderView : : Fixed ) ;
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_SIGNATURE , QHeaderView : : Fixed ) ;
2010-08-08 18:58:10 -04:00
msgwheader - > resizeSection ( COLUMN_UNREAD , 24 ) ;
2013-08-04 09:19:27 -04:00
msgwheader - > resizeSection ( COLUMN_SIGNATURE , 24 ) ;
2011-05-23 19:45:31 -04:00
msgwheader - > resizeSection ( COLUMN_STAR , 24 ) ;
2013-10-19 09:25:06 -04:00
QHeaderView_setSectionResizeMode ( msgwheader , COLUMN_STAR , QHeaderView : : Fixed ) ;
2012-05-03 11:42:43 -04:00
msgwheader - > setStretchLastSection ( false ) ;
2010-05-23 13:21:30 -04:00
2010-05-18 18:37:18 -04:00
// fill folder list
updateMessageSummaryList ( ) ;
2010-05-28 10:42:54 -04:00
ui . listWidget - > setCurrentRow ( ROW_INBOX ) ;
2010-05-18 18:37:18 -04:00
2010-05-27 15:48:52 -04:00
// create tag menu
2011-05-21 12:26:00 -04:00
TagsMenu * menu = new TagsMenu ( tr ( " Tags " ) , this ) ;
connect ( menu , SIGNAL ( aboutToShow ( ) ) , this , SLOT ( tagAboutToShow ( ) ) ) ;
connect ( menu , SIGNAL ( tagSet ( int , bool ) ) , this , SLOT ( tagSet ( int , bool ) ) ) ;
connect ( menu , SIGNAL ( tagRemoveAll ( ) ) , this , SLOT ( tagRemoveAll ( ) ) ) ;
ui . tagButton - > setMenu ( menu ) ;
2011-06-04 18:54:03 -04:00
// fill quick view
fillQuickView ( ) ;
2010-05-27 15:48:52 -04:00
2010-04-27 17:46:28 -04:00
// create timer for navigation
2013-08-02 19:00:36 -04:00
timer = new RsProtectedTimer ( this ) ;
2010-04-27 17:46:28 -04:00
timer - > setInterval ( 300 ) ;
timer - > setSingleShot ( true ) ;
connect ( timer , SIGNAL ( timeout ( ) ) , this , SLOT ( updateCurrentMessage ( ) ) ) ;
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > installEventFilter ( this ) ;
2011-05-02 17:50:20 -04:00
2011-06-03 20:46:02 -04:00
// remove close button of the the first tab
2012-01-18 15:02:19 -05:00
ui . tabWidget - > hideCloseButton ( 0 ) ;
2011-06-03 20:46:02 -04:00
2008-09-04 15:28:35 -04:00
/* Hide platform specific features */
# ifdef Q_WS_WIN
# endif
2013-07-19 14:36:09 -04:00
2013-09-08 11:08:36 -04:00
QString help_str = tr (
" <h1><img width= \" 32 \" src= \" :/images/64px_help.png \" > Messages</h1> \
2014-09-09 16:04:58 -04:00
< p > Retroshare has its own internal email system . You can send / receive emails to / from connected friend nodes . < / p > \
< p > It is also possible to send messages to other people ' s Identities using the global routing system . These messages \
are always encrypted and are relayed by intermediate nodes until they reach their final destination . < / p > \
< p > It is recommended to cryptographically sign distant messages , as a proof of your identity , using \
the < img width = \ " 16 \" src= \" :/images/stock_signature_ok.png \" /> button \
in the message composer window . Distant messages stay into your Outbox until an acknowledgement of receipt has been received . < / p > \
< p > Generally , you may use messages to recommend files to your friends by pasting file links , \
or recommend friend nodes to other friends nodes , in order to strenghten your network , or send feedback \
to a channel ' s owner . < / p > \
2013-09-08 11:08:36 -04:00
" ) ;
2013-07-19 14:36:09 -04:00
registerHelpButton ( ui . helpButton , help_str ) ;
2008-09-04 15:28:35 -04:00
}
2010-04-27 17:46:28 -04:00
MessagesDialog : : ~ MessagesDialog ( )
{
// stop and delete timer
timer - > stop ( ) ;
delete ( timer ) ;
2010-05-18 18:37:18 -04:00
// save settings
processSettings ( false ) ;
}
2012-08-05 16:12:55 -04:00
UserNotify * MessagesDialog : : getUserNotify ( QObject * parent )
{
return new MessageUserNotify ( parent ) ;
}
2011-06-03 20:46:02 -04:00
void MessagesDialog : : processSettings ( bool load )
2010-05-18 18:37:18 -04:00
{
2011-05-24 19:35:11 -04:00
int messageTreeVersion = 2 ; // version number for the settings to solve problems when modifying the column count
2011-05-23 19:45:31 -04:00
2012-05-01 05:18:55 -04:00
inProcessSettings = true ;
2010-05-20 17:53:27 -04:00
2014-10-09 18:04:12 -04:00
QHeaderView * msgwheader = ui . messageTreeWidget - > header ( ) ;
2010-05-18 18:37:18 -04:00
2011-06-03 20:46:02 -04:00
Settings - > beginGroup ( " MessageDialog " ) ;
2010-05-18 18:37:18 -04:00
2011-06-03 20:46:02 -04:00
if ( load ) {
2010-05-18 18:37:18 -04:00
// load settings
// filterColumn
2012-10-29 06:59:26 -04:00
ui . filterLineEdit - > setCurrentFilter ( Settings - > value ( " filterColumn " , COLUMN_SUBJECT ) . toInt ( ) ) ;
2010-05-18 18:37:18 -04:00
// state of message tree
2011-05-23 19:45:31 -04:00
if ( Settings - > value ( " MessageTreeVersion " ) . toInt ( ) = = messageTreeVersion ) {
msgwheader - > restoreState ( Settings - > value ( " MessageTree " ) . toByteArray ( ) ) ;
}
2010-05-18 18:37:18 -04:00
// state of splitter
2010-05-20 17:53:27 -04:00
ui . msgSplitter - > restoreState ( Settings - > value ( " Splitter " ) . toByteArray ( ) ) ;
ui . msgSplitter_2 - > restoreState ( Settings - > value ( " Splitter2 " ) . toByteArray ( ) ) ;
2010-06-19 13:46:19 -04:00
ui . listSplitter - > restoreState ( Settings - > value ( " Splitter3 " ) . toByteArray ( ) ) ;
2011-06-03 20:46:02 -04:00
/* toolbar button style */
2014-10-09 18:04:12 -04:00
Qt : : ToolButtonStyle style = ( Qt : : ToolButtonStyle ) Settings - > value ( " ToolButon_Style " , Qt : : ToolButtonIconOnly ) . toInt ( ) ;
2011-06-03 20:46:02 -04:00
setToolbarButtonStyle ( style ) ;
2010-05-18 18:37:18 -04:00
} else {
// save settings
// state of message tree
2010-05-20 17:53:27 -04:00
Settings - > setValue ( " MessageTree " , msgwheader - > saveState ( ) ) ;
2011-05-23 19:45:31 -04:00
Settings - > setValue ( " MessageTreeVersion " , messageTreeVersion ) ;
2010-05-18 18:37:18 -04:00
// state of splitter
2010-05-20 17:53:27 -04:00
Settings - > setValue ( " Splitter " , ui . msgSplitter - > saveState ( ) ) ;
Settings - > setValue ( " Splitter2 " , ui . msgSplitter_2 - > saveState ( ) ) ;
2010-06-19 13:46:19 -04:00
Settings - > setValue ( " Splitter3 " , ui . listSplitter - > saveState ( ) ) ;
2011-06-03 20:46:02 -04:00
/* toolbar button style */
2014-10-09 18:04:12 -04:00
Settings - > setValue ( " ToolButon_Style " , ui . newmessageButton - > toolButtonStyle ( ) ) ;
2010-05-18 18:37:18 -04:00
}
2010-05-20 17:53:27 -04:00
Settings - > endGroup ( ) ;
2011-06-03 20:46:02 -04:00
if ( msgWidget ) {
msgWidget - > processSettings ( " MessageDialog " , load ) ;
}
2012-05-01 05:18:55 -04:00
inProcessSettings = false ;
2010-04-27 17:46:28 -04:00
}
2011-05-02 17:50:20 -04:00
bool MessagesDialog : : eventFilter ( QObject * obj , QEvent * event )
{
2014-10-09 18:04:12 -04:00
if ( obj = = ui . messageTreeWidget ) {
2011-05-02 17:50:20 -04:00
if ( event - > type ( ) = = QEvent : : KeyPress ) {
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( event ) ;
if ( keyEvent & & keyEvent - > key ( ) = = Qt : : Key_Space ) {
// Space pressed
2014-10-09 18:04:12 -04:00
clicked ( ui . messageTreeWidget - > currentItem ( ) , COLUMN_UNREAD ) ;
2011-05-02 17:50:20 -04:00
return true ; // eat event
}
}
}
// pass the event on to the parent class
return MainPage : : eventFilter ( obj , event ) ;
}
2012-11-19 11:01:21 -05:00
void MessagesDialog : : changeEvent ( QEvent * e )
{
QWidget : : changeEvent ( e ) ;
switch ( e - > type ( ) ) {
case QEvent : : StyleChange :
insertMessages ( ) ;
break ;
default :
// remove compiler warnings
break ;
}
}
2011-06-04 18:54:03 -04:00
void MessagesDialog : : fillQuickView ( )
2010-05-27 15:48:52 -04:00
{
2011-05-21 12:26:00 -04:00
MsgTagType tags ;
rsMsgs - > getMessageTagTypes ( tags ) ;
std : : map < uint32_t , std : : pair < std : : string , uint32_t > > : : iterator tag ;
2010-06-01 18:14:52 -04:00
2011-05-21 12:26:00 -04:00
// fill tags
2011-06-04 18:54:03 -04:00
inChange = true ;
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
// save current selection
2011-06-04 18:54:03 -04:00
QListWidgetItem * item = ui . quickViewWidget - > currentItem ( ) ;
2012-05-01 05:18:55 -04:00
int selectedType = 0 ;
uint32_t selectedId = 0 ;
2011-05-21 12:26:00 -04:00
if ( item ) {
2012-05-01 05:18:55 -04:00
selectedType = item - > data ( ROLE_QUICKVIEW_TYPE ) . toInt ( ) ;
selectedId = item - > data ( ROLE_QUICKVIEW_ID ) . toInt ( ) ;
2011-05-21 12:26:00 -04:00
}
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
QListWidgetItem * itemToSelect = NULL ;
QString text ;
2010-05-27 15:48:52 -04:00
2011-06-04 18:54:03 -04:00
ui . quickViewWidget - > clear ( ) ;
// add static items
item = new QListWidgetItem ( tr ( " Starred " ) , ui . quickViewWidget ) ;
item - > setIcon ( QIcon ( IMAGE_STAR_ON ) ) ;
item - > setData ( ROLE_QUICKVIEW_TYPE , QUICKVIEW_TYPE_STATIC ) ;
item - > setData ( ROLE_QUICKVIEW_ID , QUICKVIEW_STATIC_ID_STARRED ) ;
item - > setData ( ROLE_QUICKVIEW_TEXT , item - > text ( ) ) ; // for updateMessageSummaryList
2012-05-01 05:18:55 -04:00
if ( selectedType = = QUICKVIEW_TYPE_STATIC & & selectedId = = QUICKVIEW_STATIC_ID_STARRED ) {
itemToSelect = item ;
}
item = new QListWidgetItem ( tr ( " System " ) , ui . quickViewWidget ) ;
item - > setIcon ( QIcon ( IMAGE_SYSTEM ) ) ;
item - > setData ( ROLE_QUICKVIEW_TYPE , QUICKVIEW_TYPE_STATIC ) ;
item - > setData ( ROLE_QUICKVIEW_ID , QUICKVIEW_STATIC_ID_SYSTEM ) ;
item - > setData ( ROLE_QUICKVIEW_TEXT , item - > text ( ) ) ; // for updateMessageSummaryList
if ( selectedType = = QUICKVIEW_TYPE_STATIC & & selectedId = = QUICKVIEW_STATIC_ID_SYSTEM ) {
2011-06-04 18:54:03 -04:00
itemToSelect = item ;
}
2011-05-21 12:26:00 -04:00
for ( tag = tags . types . begin ( ) ; tag ! = tags . types . end ( ) ; tag + + ) {
text = TagDefs : : name ( tag - > first , tag - > second . first ) ;
2010-05-27 15:48:52 -04:00
2011-06-04 18:54:03 -04:00
item = new QListWidgetItem ( text , ui . quickViewWidget ) ;
2011-05-21 12:26:00 -04:00
item - > setForeground ( QBrush ( QColor ( tag - > second . second ) ) ) ;
item - > setIcon ( QIcon ( " :/images/foldermail.png " ) ) ;
2011-06-04 18:54:03 -04:00
item - > setData ( ROLE_QUICKVIEW_TYPE , QUICKVIEW_TYPE_TAG ) ;
item - > setData ( ROLE_QUICKVIEW_ID , tag - > first ) ;
item - > setData ( ROLE_QUICKVIEW_TEXT , text ) ; // for updateMessageSummaryList
2010-05-27 15:48:52 -04:00
2012-05-01 05:18:55 -04:00
if ( selectedType = = QUICKVIEW_TYPE_TAG & & tag - > first = = selectedId ) {
2011-05-21 12:26:00 -04:00
itemToSelect = item ;
}
}
2010-06-01 18:14:52 -04:00
2011-05-21 12:26:00 -04:00
if ( itemToSelect ) {
2011-06-04 18:54:03 -04:00
ui . quickViewWidget - > setCurrentItem ( itemToSelect ) ;
2011-05-21 12:26:00 -04:00
}
2010-06-01 18:14:52 -04:00
2011-06-04 18:54:03 -04:00
inChange = false ;
2010-09-12 18:17:17 -04:00
2011-05-21 12:26:00 -04:00
updateMessageSummaryList ( ) ;
2010-05-27 15:48:52 -04:00
}
2010-05-06 10:39:50 -04:00
// replaced by shortcut
//void MessagesDialog::keyPressEvent(QKeyEvent *e)
//{
// if(e->key() == Qt::Key_Delete)
// {
// removemessage() ;
// e->accept() ;
// }
// else
// MainPage::keyPressEvent(e) ;
//}
2008-09-04 15:28:35 -04:00
2014-10-09 18:04:12 -04:00
int MessagesDialog : : getSelectedMsgCount ( QList < QTreeWidgetItem * > * items , QList < QTreeWidgetItem * > * itemsRead , QList < QTreeWidgetItem * > * itemsUnread , QList < QTreeWidgetItem * > * itemsStar )
2010-05-07 18:23:38 -04:00
{
2014-10-09 18:04:12 -04:00
if ( items ) items - > clear ( ) ;
if ( itemsRead ) itemsRead - > clear ( ) ;
if ( itemsUnread ) itemsUnread - > clear ( ) ;
if ( itemsStar ) itemsStar - > clear ( ) ;
2010-05-23 13:21:30 -04:00
2010-05-07 18:23:38 -04:00
//To check if the selection has more than one row.
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > selectedItems = ui . messageTreeWidget - > selectedItems ( ) ;
foreach ( QTreeWidgetItem * item , selectedItems )
2010-05-07 18:23:38 -04:00
{
2014-10-09 18:04:12 -04:00
if ( items | | itemsRead | | itemsUnread | | itemsStar ) {
if ( items ) items - > append ( item ) ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
if ( item - > data ( COLUMN_DATA , ROLE_UNREAD ) . toBool ( ) ) {
if ( itemsUnread ) itemsUnread - > append ( item ) ;
} else {
if ( itemsRead ) itemsRead - > append ( item ) ;
}
2011-05-23 19:45:31 -04:00
2014-10-09 18:04:12 -04:00
if ( itemsStar ) {
if ( item - > data ( COLUMN_DATA , ROLE_MSGFLAGS ) . toInt ( ) & RS_MSG_STAR ) {
itemsStar - > append ( item ) ;
2011-05-23 19:45:31 -04:00
}
2010-05-23 13:21:30 -04:00
}
2010-05-07 18:23:38 -04:00
}
}
2014-10-09 18:04:12 -04:00
return selectedItems . size ( ) ;
2010-05-07 18:23:38 -04:00
}
2014-10-09 18:04:12 -04:00
bool MessagesDialog : : isMessageRead ( QTreeWidgetItem * item )
2010-05-23 13:21:30 -04:00
{
2014-10-09 18:04:12 -04:00
if ( ! item ) {
return true ;
}
return ! item - > data ( COLUMN_DATA , ROLE_UNREAD ) . toBool ( ) ;
2010-05-23 13:21:30 -04:00
}
2014-10-09 18:04:12 -04:00
bool MessagesDialog : : hasMessageStar ( QTreeWidgetItem * item )
2011-05-23 19:45:31 -04:00
{
2014-10-09 18:04:12 -04:00
if ( ! item ) {
return false ;
}
return item - > data ( COLUMN_DATA , ROLE_MSGFLAGS ) . toInt ( ) & RS_MSG_STAR ;
2011-05-23 19:45:31 -04:00
}
2014-10-09 18:04:12 -04:00
void MessagesDialog : : messageTreeWidgetCustomPopupMenu ( QPoint /*point*/ )
2008-09-04 15:28:35 -04:00
{
2011-06-03 20:46:02 -04:00
std : : string cid ;
std : : string mid ;
MessageInfo msgInfo ;
if ( getCurrentMsg ( cid , mid ) ) {
rsMsgs - > getMessage ( mid , msgInfo ) ;
}
2008-09-04 15:28:35 -04:00
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > itemsRead ;
QList < QTreeWidgetItem * > itemsUnread ;
QList < QTreeWidgetItem * > itemsStar ;
int nCount = getSelectedMsgCount ( NULL , & itemsRead , & itemsUnread , & itemsStar ) ;
2010-05-27 15:48:52 -04:00
2011-05-23 19:45:31 -04:00
/** Defines the actions for the context menu */
2010-06-14 14:16:32 -04:00
2011-06-03 20:46:02 -04:00
QMenu contextMnu ( this ) ;
2013-09-02 19:01:24 -04:00
QAction * action = contextMnu . addAction ( QIcon ( " :/images/view_split_top_bottom.png " ) , tr ( " Open in a new window " ) , this , SLOT ( openAsWindow ( ) ) ) ;
2011-05-23 19:45:31 -04:00
if ( nCount ! = 1 ) {
action - > setDisabled ( true ) ;
}
2011-06-03 20:46:02 -04:00
2013-09-02 19:01:24 -04:00
action = contextMnu . addAction ( QIcon ( " :/images/tab-dock.png " ) , tr ( " Open in a new tab " ) , this , SLOT ( openAsTab ( ) ) ) ;
2011-05-23 19:45:31 -04:00
if ( nCount ! = 1 ) {
action - > setDisabled ( true ) ;
}
2011-06-03 20:46:02 -04:00
contextMnu . addSeparator ( ) ;
2011-06-05 09:37:49 -04:00
contextMnu . addAction ( ui . actionReply ) ;
ui . actionReply - > setEnabled ( nCount = = 1 ) ;
contextMnu . addAction ( ui . actionReplyAll ) ;
ui . actionReplyAll - > setEnabled ( nCount = = 1 ) ;
contextMnu . addAction ( ui . actionForward ) ;
ui . actionForward - > setEnabled ( nCount = = 1 ) ;
2010-06-14 14:16:32 -04:00
contextMnu . addSeparator ( ) ;
2011-05-23 19:45:31 -04:00
action = contextMnu . addAction ( QIcon ( " :/images/message-mail-read.png " ) , tr ( " Mark as read " ) , this , SLOT ( markAsRead ( ) ) ) ;
2014-10-09 18:04:12 -04:00
if ( itemsUnread . size ( ) = = 0 ) {
2011-05-23 19:45:31 -04:00
action - > setDisabled ( true ) ;
2010-05-23 13:21:30 -04:00
}
2011-05-23 19:45:31 -04:00
action = contextMnu . addAction ( QIcon ( " :/images/message-mail.png " ) , tr ( " Mark as unread " ) , this , SLOT ( markAsUnread ( ) ) ) ;
2014-10-09 18:04:12 -04:00
if ( itemsRead . size ( ) = = 0 ) {
2011-05-23 19:45:31 -04:00
action - > setDisabled ( true ) ;
2010-05-23 13:21:30 -04:00
}
2011-05-23 19:45:31 -04:00
action = contextMnu . addAction ( tr ( " Add Star " ) ) ;
action - > setCheckable ( true ) ;
2014-10-09 18:04:12 -04:00
action - > setChecked ( itemsStar . size ( ) ) ;
2011-05-23 19:45:31 -04:00
connect ( action , SIGNAL ( triggered ( bool ) ) , this , SLOT ( markWithStar ( bool ) ) ) ;
2010-05-23 13:21:30 -04:00
contextMnu . addSeparator ( ) ;
2010-05-27 15:48:52 -04:00
// add tags
contextMnu . addMenu ( ui . tagButton - > menu ( ) ) ;
2011-06-03 20:46:02 -04:00
2010-05-27 15:48:52 -04:00
contextMnu . addSeparator ( ) ;
2010-05-23 13:21:30 -04:00
2011-06-03 20:46:02 -04:00
QString text ;
if ( ( msgInfo . msgflags & RS_MSG_BOXMASK ) = = RS_MSG_DRAFTBOX ) {
text = tr ( " Edit " ) ;
} else {
text = tr ( " Edit as new " ) ;
}
action = contextMnu . addAction ( text , this , SLOT ( editmessage ( ) ) ) ;
if ( nCount ! = 1 ) {
action - > setDisabled ( true ) ;
}
2011-05-23 19:45:31 -04:00
action = contextMnu . addAction ( QIcon ( IMAGE_MESSAGEREMOVE ) , ( nCount > 1 ) ? tr ( " Remove Messages " ) : tr ( " Remove Message " ) , this , SLOT ( removemessage ( ) ) ) ;
if ( nCount = = 0 ) {
action - > setDisabled ( true ) ;
2010-05-26 11:20:31 -04:00
}
2013-05-04 18:03:48 -04:00
if ( nCount = = 1 & & ( msgInfo . msgflags & RS_MSG_ENCRYPTED ) )
2013-09-25 11:58:01 -04:00
action = contextMnu . addAction ( QIcon ( IMAGE_DECRYPTMESSAGE ) , tr ( " Decrypt Message " ) , this , SLOT ( decryptSelectedMsg ( ) ) ) ;
2013-05-04 18:03:48 -04:00
2011-05-23 19:45:31 -04:00
int listrow = ui . listWidget - > currentRow ( ) ;
2010-05-28 10:42:54 -04:00
if ( listrow = = ROW_TRASHBOX ) {
2011-05-23 19:45:31 -04:00
action = contextMnu . addAction ( tr ( " Undelete " ) , this , SLOT ( undeletemessage ( ) ) ) ;
if ( nCount = = 0 ) {
action - > setDisabled ( true ) ;
2010-05-28 10:42:54 -04:00
}
}
2011-06-03 20:46:02 -04:00
contextMnu . addAction ( ui . actionSaveAs ) ;
2011-05-23 19:45:31 -04:00
contextMnu . addAction ( ui . actionPrintPreview ) ;
contextMnu . addAction ( ui . actionPrint ) ;
2010-05-26 11:20:31 -04:00
contextMnu . addSeparator ( ) ;
2011-05-23 19:45:31 -04:00
contextMnu . addAction ( QIcon ( IMAGE_MESSAGE ) , tr ( " New Message " ) , this , SLOT ( newmessage ( ) ) ) ;
2010-05-07 18:23:38 -04:00
2010-05-14 16:55:44 -04:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2008-09-04 15:28:35 -04:00
}
2013-05-04 18:03:48 -04:00
void MessagesDialog : : folderlistWidgetCustomPopupMenu ( QPoint /*point*/ )
2010-10-29 16:57:23 -04:00
{
if ( ui . listWidget - > currentRow ( ) ! = ROW_TRASHBOX ) {
/* Context menu only neede for trash box */
return ;
}
QMenu contextMnu ( this ) ;
contextMnu . addAction ( tr ( " Empty trash " ) , this , SLOT ( emptyTrash ( ) ) ) ;
contextMnu . exec ( QCursor : : pos ( ) ) ;
}
2007-11-14 22:18:48 -05:00
void MessagesDialog : : newmessage ( )
{
2010-11-02 17:11:11 -04:00
MessageComposer * nMsgDialog = MessageComposer : : newMsg ( ) ;
if ( nMsgDialog = = NULL ) {
return ;
}
2007-11-14 22:18:48 -05:00
nMsgDialog - > show ( ) ;
2007-11-18 18:35:53 -05:00
nMsgDialog - > activateWindow ( ) ;
2007-11-14 22:18:48 -05:00
/* window will destroy itself! */
}
2011-06-03 20:46:02 -04:00
void MessagesDialog : : openAsWindow ( )
2010-06-14 14:16:32 -04:00
{
std : : string cid ;
std : : string mid ;
if ( ! getCurrentMsg ( cid , mid ) )
return ;
2011-06-03 20:46:02 -04:00
MessageWidget * msgWidget = MessageWidget : : openMsg ( mid , true ) ;
if ( msgWidget = = NULL ) {
2010-06-14 14:16:32 -04:00
return ;
}
2011-06-03 20:46:02 -04:00
msgWidget - > activateWindow ( ) ;
2010-05-23 13:21:30 -04:00
/* window will destroy itself! */
2007-11-14 22:18:48 -05:00
}
2011-06-03 20:46:02 -04:00
void MessagesDialog : : openAsTab ( )
2009-02-09 08:24:05 -05:00
{
2010-05-23 13:21:30 -04:00
std : : string cid ;
std : : string mid ;
if ( ! getCurrentMsg ( cid , mid ) )
return ;
2011-06-03 20:46:02 -04:00
MessageWidget * msgWidget = MessageWidget : : openMsg ( mid , false ) ;
if ( msgWidget = = NULL ) {
2010-11-02 17:11:11 -04:00
return ;
2010-05-23 13:21:30 -04:00
}
2010-05-02 20:09:55 -04:00
2011-06-03 20:46:02 -04:00
ui . tabWidget - > addTab ( msgWidget , msgWidget - > subject ( true ) ) ;
ui . tabWidget - > setCurrentWidget ( msgWidget ) ;
2010-05-23 13:21:30 -04:00
/* window will destroy itself! */
2009-02-09 08:24:05 -05:00
}
2011-06-03 20:46:02 -04:00
void MessagesDialog : : editmessage ( )
2008-11-25 20:19:09 -05:00
{
2010-05-23 13:21:30 -04:00
std : : string cid ;
std : : string mid ;
if ( ! getCurrentMsg ( cid , mid ) )
return ;
2011-06-03 20:46:02 -04:00
MessageComposer * msgComposer = MessageComposer : : newMsg ( mid ) ;
if ( msgComposer = = NULL ) {
2010-11-02 17:11:11 -04:00
return ;
2010-05-23 13:21:30 -04:00
}
2010-05-02 20:09:55 -04:00
2011-06-03 20:46:02 -04:00
msgComposer - > show ( ) ;
msgComposer - > activateWindow ( ) ;
2010-05-23 13:21:30 -04:00
/* window will destroy itself! */
2008-11-25 20:19:09 -05:00
}
2009-02-22 12:36:39 -05:00
void MessagesDialog : : changeBox ( int )
2007-11-14 22:18:48 -05:00
{
2011-06-04 18:54:03 -04:00
if ( inChange ) {
2010-06-01 18:14:52 -04:00
// already in change method
return ;
}
2011-06-04 18:54:03 -04:00
inChange = true ;
2010-06-01 18:14:52 -04:00
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > clear ( ) ;
2010-05-07 18:23:38 -04:00
2011-06-04 18:54:03 -04:00
ui . quickViewWidget - > setCurrentItem ( NULL ) ;
2012-05-01 05:18:55 -04:00
listMode = LIST_BOX ;
2010-06-01 18:14:52 -04:00
2010-05-23 13:21:30 -04:00
insertMessages ( ) ;
2014-10-09 18:04:12 -04:00
insertMsgTxtAndFiles ( ui . messageTreeWidget - > currentItem ( ) ) ;
2010-06-01 18:14:52 -04:00
2011-06-04 18:54:03 -04:00
inChange = false ;
2010-05-23 13:21:30 -04:00
}
2011-06-04 18:54:03 -04:00
void MessagesDialog : : changeQuickView ( int newrow )
2010-06-01 18:14:52 -04:00
{
2011-06-04 18:54:03 -04:00
Q_UNUSED ( newrow ) ;
if ( inChange ) {
2010-06-01 18:14:52 -04:00
// already in change method
return ;
}
2011-06-04 18:54:03 -04:00
inChange = true ;
2010-06-01 18:14:52 -04:00
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > clear ( ) ;
2010-06-01 18:14:52 -04:00
ui . listWidget - > setCurrentItem ( NULL ) ;
2012-05-01 05:18:55 -04:00
listMode = LIST_QUICKVIEW ;
2010-06-01 18:14:52 -04:00
insertMessages ( ) ;
2014-10-09 18:04:12 -04:00
insertMsgTxtAndFiles ( ui . messageTreeWidget - > currentItem ( ) ) ;
2010-06-01 18:14:52 -04:00
2011-06-04 18:54:03 -04:00
inChange = false ;
2010-06-01 18:14:52 -04:00
}
2010-08-22 18:12:26 -04:00
void MessagesDialog : : messagesTagsChanged ( )
{
2012-05-01 05:18:55 -04:00
if ( lockUpdate ) {
2010-08-22 18:12:26 -04:00
return ;
}
2011-06-04 18:54:03 -04:00
fillQuickView ( ) ;
2010-08-22 18:12:26 -04:00
insertMessages ( ) ;
}
2014-10-09 18:04:12 -04:00
static void InitIconAndFont ( QTreeWidgetItem * item )
2010-05-23 13:21:30 -04:00
{
2014-10-09 18:04:12 -04:00
int msgFlags = item - > data ( COLUMN_DATA , ROLE_MSGFLAGS ) . toInt ( ) ;
2010-05-23 13:21:30 -04:00
// show the real "New" state
2011-05-23 19:45:31 -04:00
if ( msgFlags & RS_MSG_NEW ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-state-new.png " ) ) ;
2010-05-23 13:21:30 -04:00
} else {
2012-05-01 05:18:55 -04:00
if ( msgFlags & RS_MSG_USER_REQUEST ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/user/user_request16.png " ) ) ;
2012-05-05 18:20:05 -04:00
} else if ( msgFlags & RS_MSG_FRIEND_RECOMMENDATION ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/user/friend_suggestion16.png " ) ) ;
2012-05-01 05:18:55 -04:00
} else if ( msgFlags & RS_MSG_UNREAD_BY_USER ) {
2011-05-23 19:45:31 -04:00
if ( ( msgFlags & ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) = = RS_MSG_REPLIED ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-replied.png " ) ) ;
2011-05-23 19:45:31 -04:00
} else if ( ( msgFlags & ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) = = RS_MSG_FORWARDED ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-forwarded.png " ) ) ;
2011-05-23 19:45:31 -04:00
} else if ( ( msgFlags & ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) = = ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-replied-forw.png " ) ) ;
2010-11-02 17:11:11 -04:00
} else {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail.png " ) ) ;
2010-11-02 17:11:11 -04:00
}
2010-05-23 13:21:30 -04:00
} else {
2011-05-23 19:45:31 -04:00
if ( ( msgFlags & ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) = = RS_MSG_REPLIED ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-replied-read.png " ) ) ;
2011-05-23 19:45:31 -04:00
} else if ( ( msgFlags & ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) = = RS_MSG_FORWARDED ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-forwarded-read.png " ) ) ;
2011-05-23 19:45:31 -04:00
} else if ( ( msgFlags & ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) = = ( RS_MSG_REPLIED | RS_MSG_FORWARDED ) ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-replied-forw-read.png " ) ) ;
2010-11-02 17:11:11 -04:00
} else {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/message-mail-read.png " ) ) ;
2010-11-02 17:11:11 -04:00
}
2010-05-23 13:21:30 -04:00
}
}
2011-05-23 19:45:31 -04:00
if ( msgFlags & RS_MSG_STAR ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_STAR , QIcon ( IMAGE_STAR_ON ) ) ;
item - > setData ( COLUMN_STAR , ROLE_SORT , 1 ) ;
2011-05-23 19:45:31 -04:00
} else {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_STAR , QIcon ( IMAGE_STAR_OFF ) ) ;
item - > setData ( COLUMN_STAR , ROLE_SORT , 0 ) ;
2011-05-23 19:45:31 -04:00
}
bool isNew = msgFlags & ( RS_MSG_NEW | RS_MSG_UNREAD_BY_USER ) ;
2010-05-23 13:21:30 -04:00
2010-08-08 18:58:10 -04:00
// set icon
2011-05-23 19:45:31 -04:00
if ( isNew ) {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_UNREAD , QIcon ( " :/images/message-state-unread.png " ) ) ;
item - > setData ( COLUMN_UNREAD , ROLE_SORT , 1 ) ;
2010-05-23 13:21:30 -04:00
} else {
2014-10-09 18:04:12 -04:00
item - > setIcon ( COLUMN_UNREAD , QIcon ( " :/images/message-state-read.png " ) ) ;
item - > setData ( COLUMN_UNREAD , ROLE_SORT , 0 ) ;
2010-05-23 13:21:30 -04:00
}
// set font
for ( int i = 0 ; i < COLUMN_COUNT ; i + + ) {
2014-10-09 18:04:12 -04:00
QFont qf = item - > font ( i ) ;
2011-05-23 19:45:31 -04:00
qf . setBold ( isNew ) ;
2014-10-09 18:04:12 -04:00
item - > setFont ( i , qf ) ;
2010-05-23 13:21:30 -04:00
}
2010-08-08 18:58:10 -04:00
2014-10-09 18:04:12 -04:00
item - > setData ( COLUMN_DATA , ROLE_UNREAD , isNew ) ;
2007-11-14 22:18:48 -05:00
}
void MessagesDialog : : insertMessages ( )
{
2012-05-01 05:18:55 -04:00
if ( lockUpdate ) {
2010-06-03 18:12:07 -04:00
return ;
}
2010-05-23 13:21:30 -04:00
std : : cerr < < " MessagesDialog::insertMessages called " ;
std : : list < MsgInfoSummary > msgList ;
std : : list < MsgInfoSummary > : : const_iterator it ;
MessageInfo msgInfo ;
2012-05-01 05:18:55 -04:00
bool gotInfo ;
2010-05-23 13:21:30 -04:00
QString text ;
2014-03-17 16:56:06 -04:00
RsPeerId ownId = rsPeers - > getOwnId ( ) ;
2012-05-01 05:18:55 -04:00
2010-05-23 13:21:30 -04:00
rsMsgs - > getMessageSummaries ( msgList ) ;
std : : cerr < < " MessagesDialog::insertMessages() " < < std : : endl ;
2012-10-29 06:59:26 -04:00
int filterColumn = ui . filterLineEdit - > currentFilter ( ) ;
2010-05-23 13:21:30 -04:00
/* check the mode we are in */
unsigned int msgbox = 0 ;
2011-05-24 09:15:43 -04:00
bool isTrash = false ;
bool doFill = true ;
2011-06-04 18:54:03 -04:00
int quickViewType = 0 ;
uint32_t quickViewId = 0 ;
2011-05-24 09:15:43 -04:00
QString boxText ;
QIcon boxIcon ;
2011-06-05 16:19:10 -04:00
QString placeholderText ;
2010-06-01 18:14:52 -04:00
2012-05-01 05:18:55 -04:00
switch ( listMode ) {
2010-06-01 18:14:52 -04:00
case LIST_NOTHING :
2011-05-24 09:15:43 -04:00
doFill = false ;
2010-05-23 13:21:30 -04:00
break ;
2010-06-01 18:14:52 -04:00
case LIST_BOX :
{
2014-10-09 18:04:12 -04:00
QListWidgetItem * listItem = ui . listWidget - > currentItem ( ) ;
if ( listItem ) {
boxIcon = listItem - > icon ( ) ;
2011-05-24 09:15:43 -04:00
}
2010-06-01 18:14:52 -04:00
int listrow = ui . listWidget - > currentRow ( ) ;
switch ( listrow ) {
case ROW_INBOX :
msgbox = RS_MSG_INBOX ;
2011-05-24 09:15:43 -04:00
boxText = tr ( " Inbox " ) ;
2010-06-01 18:14:52 -04:00
break ;
case ROW_OUTBOX :
msgbox = RS_MSG_OUTBOX ;
2011-05-24 09:15:43 -04:00
boxText = tr ( " Outbox " ) ;
2010-06-01 18:14:52 -04:00
break ;
case ROW_DRAFTBOX :
msgbox = RS_MSG_DRAFTBOX ;
2011-05-24 09:15:43 -04:00
boxText = tr ( " Drafts " ) ;
2010-06-01 18:14:52 -04:00
break ;
case ROW_SENTBOX :
msgbox = RS_MSG_SENTBOX ;
2011-05-24 09:15:43 -04:00
boxText = tr ( " Sent " ) ;
2010-06-01 18:14:52 -04:00
break ;
case ROW_TRASHBOX :
2011-05-24 09:15:43 -04:00
isTrash = true ;
boxText = tr ( " Trash " ) ;
2010-06-01 18:14:52 -04:00
break ;
default :
2011-05-24 09:15:43 -04:00
doFill = false ;
2010-06-01 18:14:52 -04:00
}
}
2010-05-23 13:21:30 -04:00
break ;
2010-06-01 18:14:52 -04:00
2011-06-04 18:54:03 -04:00
case LIST_QUICKVIEW :
2010-06-01 18:14:52 -04:00
{
2014-10-09 18:04:12 -04:00
QListWidgetItem * listItem = ui . quickViewWidget - > currentItem ( ) ;
if ( listItem ) {
quickViewType = listItem - > data ( ROLE_QUICKVIEW_TYPE ) . toInt ( ) ;
quickViewId = listItem - > data ( ROLE_QUICKVIEW_ID ) . toInt ( ) ;
2011-05-24 09:15:43 -04:00
2014-10-09 18:04:12 -04:00
boxText = listItem - > text ( ) ;
boxIcon = listItem - > icon ( ) ;
2011-06-04 18:54:03 -04:00
2011-06-05 16:19:10 -04:00
switch ( quickViewType ) {
case QUICKVIEW_TYPE_NOTHING :
2011-06-04 18:54:03 -04:00
doFill = false ;
2011-06-05 16:19:10 -04:00
break ;
case QUICKVIEW_TYPE_STATIC :
switch ( quickViewId ) {
case QUICKVIEW_STATIC_ID_STARRED :
2012-10-11 06:28:24 -04:00
placeholderText = tr ( " No starred messages available. Stars let you give messages a special status to make them easier to find. To star a message, click on the light gray star beside any message. " ) ;
2011-06-05 16:19:10 -04:00
break ;
2012-05-01 05:18:55 -04:00
case QUICKVIEW_STATIC_ID_SYSTEM :
placeholderText = tr ( " No system messages available. " ) ;
break ;
2011-06-05 16:19:10 -04:00
}
break ;
case QUICKVIEW_TYPE_TAG :
break ;
2011-06-04 18:54:03 -04:00
}
2010-06-01 18:14:52 -04:00
} else {
2011-05-24 09:15:43 -04:00
doFill = false ;
2010-06-01 18:14:52 -04:00
}
}
2010-05-23 13:21:30 -04:00
break ;
2010-06-01 18:14:52 -04:00
2010-05-23 13:21:30 -04:00
default :
2011-05-24 09:15:43 -04:00
doFill = false ;
2010-05-23 13:21:30 -04:00
}
2011-05-24 09:15:43 -04:00
ui . tabWidget - > setTabText ( 0 , boxText ) ;
ui . tabWidget - > setTabIcon ( 0 , boxIcon ) ;
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > setPlaceholderText ( placeholderText ) ;
2011-05-24 09:15:43 -04:00
2014-10-09 18:04:12 -04:00
QTreeWidgetItem * headerItem = ui . messageTreeWidget - > headerItem ( ) ;
2010-05-23 13:21:30 -04:00
if ( msgbox = = RS_MSG_INBOX ) {
2014-10-09 18:04:12 -04:00
headerItem - > setText ( COLUMN_FROM , tr ( " From " ) ) ;
headerItem - > setToolTip ( COLUMN_FROM , tr ( " Click to sort by from " ) ) ;
2010-05-23 13:21:30 -04:00
} else {
2014-10-09 18:04:12 -04:00
headerItem - > setText ( COLUMN_FROM , tr ( " To " ) ) ;
headerItem - > setToolTip ( COLUMN_FROM , tr ( " Click to sort by to " ) ) ;
2010-05-23 13:21:30 -04:00
}
2011-05-24 09:15:43 -04:00
if ( doFill ) {
2010-08-22 18:12:26 -04:00
MsgTagType Tags ;
rsMsgs - > getMessageTagTypes ( Tags ) ;
2010-05-27 15:48:52 -04:00
2010-06-01 18:14:52 -04:00
/* search messages */
std : : list < MsgInfoSummary > msgToShow ;
for ( it = msgList . begin ( ) ; it ! = msgList . end ( ) ; it + + ) {
2012-05-01 05:18:55 -04:00
if ( listMode = = LIST_BOX ) {
2011-05-24 09:15:43 -04:00
if ( isTrash ) {
2010-05-28 10:42:54 -04:00
if ( ( it - > msgflags & RS_MSG_TRASH ) = = 0 ) {
continue ;
}
} else {
if ( it - > msgflags & RS_MSG_TRASH ) {
continue ;
}
if ( ( it - > msgflags & RS_MSG_BOXMASK ) ! = msgbox ) {
continue ;
}
2010-05-23 13:21:30 -04:00
}
2012-05-01 05:18:55 -04:00
} else if ( listMode = = LIST_QUICKVIEW & & quickViewType = = QUICKVIEW_TYPE_TAG ) {
2010-08-22 18:12:26 -04:00
MsgTagInfo tagInfo ;
rsMsgs - > getMessageTag ( it - > msgId , tagInfo ) ;
2011-06-04 18:54:03 -04:00
if ( std : : find ( tagInfo . tagIds . begin ( ) , tagInfo . tagIds . end ( ) , quickViewId ) = = tagInfo . tagIds . end ( ) ) {
continue ;
}
2012-05-01 05:18:55 -04:00
} else if ( listMode = = LIST_QUICKVIEW & & quickViewType = = QUICKVIEW_TYPE_STATIC ) {
if ( quickViewId = = QUICKVIEW_STATIC_ID_STARRED & & ( it - > msgflags & RS_MSG_STAR ) = = 0 ) {
continue ;
}
if ( quickViewId = = QUICKVIEW_STATIC_ID_SYSTEM & & ( it - > msgflags & RS_MSG_SYSTEM ) = = 0 ) {
2010-06-01 18:14:52 -04:00
continue ;
}
} else {
continue ;
}
2010-05-23 13:21:30 -04:00
2010-06-01 18:14:52 -04:00
msgToShow . push_back ( * it ) ;
}
/* remove old items */
2014-10-09 18:04:12 -04:00
QTreeWidgetItemIterator itemIterator ( ui . messageTreeWidget ) ;
QTreeWidgetItem * treeItem ;
while ( ( treeItem = * itemIterator ) ! = NULL ) {
+ + itemIterator ;
std : : string msgIdFromRow = treeItem - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-06-01 18:14:52 -04:00
for ( it = msgToShow . begin ( ) ; it ! = msgToShow . end ( ) ; it + + ) {
if ( it - > msgId = = msgIdFromRow ) {
2010-05-23 13:21:30 -04:00
break ;
}
}
2010-06-01 18:14:52 -04:00
if ( it = = msgToShow . end ( ) ) {
2014-10-09 18:04:12 -04:00
delete ( treeItem ) ;
2010-05-23 13:21:30 -04:00
}
}
2010-06-01 18:14:52 -04:00
for ( it = msgToShow . begin ( ) ; it ! = msgToShow . end ( ) ; it + + )
2010-05-23 13:21:30 -04:00
{
/* check the message flags, to decide which
* group it should go in . . .
*
* InBox
* OutBox
* Drafts
* Sent
*
* FLAGS = OUTGOING .
* - > Outbox / Drafts / Sent
* + SENT - > Sent
* + IN_PROGRESS - > Draft .
* + nuffing - > Outbox .
* FLAGS = INCOMING = ( ! OUTGOING )
* - > + NEW - > Bold .
*
*/
2012-05-01 05:18:55 -04:00
gotInfo = false ;
2010-05-23 13:21:30 -04:00
msgInfo = MessageInfo ( ) ; // clear
// search exisisting items
2014-10-09 18:04:12 -04:00
QTreeWidgetItemIterator existingItemIterator ( ui . messageTreeWidget ) ;
while ( ( treeItem = * existingItemIterator ) ! = NULL ) {
+ + existingItemIterator ;
if ( it - > msgId = = treeItem - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ) {
2010-05-23 13:21:30 -04:00
break ;
}
}
/* make a widget per friend */
2014-10-09 18:04:12 -04:00
bool insertItem = false ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
GxsIdRSTreeWidgetItem * item ;
if ( treeItem ) {
item = dynamic_cast < GxsIdRSTreeWidgetItem * > ( treeItem ) ;
if ( ! item ) {
std : : cerr < < " MessagesDialog::insertMessages() Item is no GxsIdRSTreeWidgetItem " < < std : : endl ;
continue ;
2010-05-23 13:21:30 -04:00
}
} else {
2014-10-09 18:04:12 -04:00
item = new GxsIdRSTreeWidgetItem ( mMessageCompareRole ) ;
insertItem = true ;
2010-05-23 13:21:30 -04:00
}
/* So Text should be:
* ( 1 ) Msg / Broadcast
* ( 1 b ) Person / Channel Name
* ( 2 ) Rank
* ( 3 ) Date
* ( 4 ) Title
* ( 5 ) Msg
* ( 6 ) File Count
* ( 7 ) File Total
*/
QString dateString ;
// Date First.... (for sorting)
{
QDateTime qdatetime ;
qdatetime . setTime_t ( it - > ts ) ;
// add string to all data
dateString = qdatetime . toString ( " _yyyyMMdd_hhmmss " ) ;
//if the mail is on same date show only time.
if ( qdatetime . daysTo ( QDateTime : : currentDateTime ( ) ) = = 0 )
{
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_DATE , DateTime : : formatTime ( qdatetime . time ( ) ) ) ;
2010-05-23 13:21:30 -04:00
}
else
{
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_DATE , DateTime : : formatDateTime ( qdatetime ) ) ;
2010-05-23 13:21:30 -04:00
}
// for sorting
2014-10-09 18:04:12 -04:00
item - > setData ( COLUMN_DATE , ROLE_SORT , qdatetime ) ;
2010-05-23 13:21:30 -04:00
}
// From ....
{
2010-05-25 05:32:14 -04:00
if ( msgbox = = RS_MSG_INBOX | | msgbox = = RS_MSG_OUTBOX ) {
2012-05-01 05:18:55 -04:00
if ( ( it - > msgflags & RS_MSG_SYSTEM ) & & it - > srcId = = ownId ) {
text = " RetroShare " ;
} else {
2014-10-09 18:04:12 -04:00
if ( it - > msgflags & ( RS_MSG_DECRYPTED | RS_MSG_ENCRYPTED ) ) {
// distant message
if ( gotInfo | | rsMsgs - > getMessage ( it - > msgId , msgInfo ) ) {
gotInfo = true ;
item - > setId ( RsGxsId ( msgInfo . rsgxsid_srcId ) , COLUMN_FROM ) ;
} else {
std : : cerr < < " MessagesDialog::insertMsgTxtAndFiles() Couldn't find Msg " < < std : : endl ;
}
} else {
text = QString : : fromUtf8 ( rsPeers - > getPeerName ( it - > srcId ) . c_str ( ) ) ;
}
2012-05-01 05:18:55 -04:00
}
2010-05-23 13:21:30 -04:00
} else {
2012-05-01 05:18:55 -04:00
if ( gotInfo | | rsMsgs - > getMessage ( it - > msgId , msgInfo ) ) {
gotInfo = true ;
2010-05-23 13:21:30 -04:00
text . clear ( ) ;
2014-03-29 10:18:05 -04:00
for ( std : : list < RsPeerId > : : const_iterator pit = msgInfo . rspeerid_msgto . begin ( ) ; pit ! = msgInfo . rspeerid_msgto . end ( ) ; pit + + )
2010-05-23 13:21:30 -04:00
{
2014-03-29 10:18:05 -04:00
if ( ! text . isEmpty ( ) )
2010-05-23 14:31:40 -04:00
text + = " , " ;
2010-05-23 13:21:30 -04:00
2010-09-28 16:33:34 -04:00
std : : string peerName = rsPeers - > getPeerName ( * pit ) ;
2014-03-29 10:18:05 -04:00
if ( peerName . empty ( ) )
2010-09-28 16:33:34 -04:00
text + = PeerDefs : : rsid ( " " , * pit ) ;
2014-03-29 10:18:05 -04:00
else
text + = QString : : fromUtf8 ( peerName . c_str ( ) ) ;
}
2014-10-09 18:04:12 -04:00
for ( std : : list < RsGxsId > : : const_iterator pit = msgInfo . rsgxsid_msgto . begin ( ) ; pit ! = msgInfo . rsgxsid_msgto . end ( ) ; pit + + )
2014-03-29 10:18:05 -04:00
{
if ( ! text . isEmpty ( ) )
text + = " , " ;
2014-10-09 18:04:12 -04:00
RsIdentityDetails details ;
if ( rsIdentity - > getIdDetails ( * pit , details ) & & ! details . mNickname . empty ( ) )
text + = QString : : fromUtf8 ( details . mNickname . c_str ( ) ) ;
else
2014-03-29 10:18:05 -04:00
text + = PeerDefs : : rsid ( " " , * pit ) ;
2010-05-07 18:23:38 -04:00
}
2010-05-23 13:21:30 -04:00
} else {
std : : cerr < < " MessagesDialog::insertMsgTxtAndFiles() Couldn't find Msg " < < std : : endl ;
}
}
2014-10-09 18:04:12 -04:00
if ( ( it - > msgflags & ( RS_MSG_DECRYPTED | RS_MSG_ENCRYPTED ) ) = = 0 ) {
item - > setText ( COLUMN_FROM , text ) ;
item - > setData ( COLUMN_FROM , ROLE_SORT , text + dateString ) ;
}
2010-05-23 13:21:30 -04:00
}
// Subject
2014-10-09 18:04:12 -04:00
if ( it - > msgflags & RS_MSG_ENCRYPTED )
text = tr ( " Encrypted message. Right-click to decrypt it. " ) ;
else
text = QString : : fromUtf8 ( it - > title . c_str ( ) ) ;
2013-09-25 11:58:01 -04:00
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_SUBJECT , text ) ;
item - > setData ( COLUMN_SUBJECT , ROLE_SORT , text + dateString ) ;
2010-05-23 13:21:30 -04:00
// internal data
2010-05-27 15:48:52 -04:00
QString msgId = QString : : fromStdString ( it - > msgId ) ;
2014-10-09 18:04:12 -04:00
item - > setData ( COLUMN_DATA , ROLE_SRCID , QString : : fromStdString ( it - > srcId . toStdString ( ) ) ) ;
item - > setData ( COLUMN_DATA , ROLE_MSGID , msgId ) ;
item - > setData ( COLUMN_DATA , ROLE_MSGFLAGS , it - > msgflags ) ;
2010-05-23 13:21:30 -04:00
// Init icon and font
2010-11-02 17:11:11 -04:00
InitIconAndFont ( item ) ;
2010-05-23 13:21:30 -04:00
2010-05-27 15:48:52 -04:00
// Tags
2010-08-22 18:12:26 -04:00
MsgTagInfo tagInfo ;
rsMsgs - > getMessageTag ( it - > msgId , tagInfo ) ;
2010-05-27 15:48:52 -04:00
text . clear ( ) ;
2010-08-22 18:12:26 -04:00
// build tag names
std : : map < uint32_t , std : : pair < std : : string , uint32_t > > : : iterator Tag ;
for ( std : : list < uint32_t > : : iterator tagId = tagInfo . tagIds . begin ( ) ; tagId ! = tagInfo . tagIds . end ( ) ; tagId + + ) {
2010-05-27 15:48:52 -04:00
if ( text . isEmpty ( ) = = false ) {
text + = " , " ;
}
2010-08-22 18:12:26 -04:00
Tag = Tags . types . find ( * tagId ) ;
if ( Tag ! = Tags . types . end ( ) ) {
2010-09-12 18:17:17 -04:00
text + = TagDefs : : name ( Tag - > first , Tag - > second . first ) ;
2010-08-22 18:12:26 -04:00
} else {
// clean tagId
rsMsgs - > setMessageTag ( it - > msgId , * tagId , false ) ;
}
2010-05-27 15:48:52 -04:00
}
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_TAGS , text ) ;
item - > setData ( COLUMN_TAGS , ROLE_SORT , text ) ;
2010-05-27 15:48:52 -04:00
// set color
2012-11-19 11:01:21 -05:00
QColor color ;
2010-08-22 18:12:26 -04:00
if ( tagInfo . tagIds . size ( ) ) {
Tag = Tags . types . find ( tagInfo . tagIds . front ( ) ) ;
if ( Tag ! = Tags . types . end ( ) ) {
2012-11-19 11:01:21 -05:00
color = Tag - > second . second ;
2010-08-22 18:12:26 -04:00
} else {
// clean tagId
rsMsgs - > setMessageTag ( it - > msgId , tagInfo . tagIds . front ( ) , false ) ;
}
2010-05-27 15:48:52 -04:00
}
2012-11-19 11:01:21 -05:00
if ( ! color . isValid ( ) ) {
2014-10-09 18:04:12 -04:00
color = ui . messageTreeWidget - > palette ( ) . color ( QPalette : : Text ) ;
2012-11-19 11:01:21 -05:00
}
QBrush brush = QBrush ( color ) ;
2010-05-27 15:48:52 -04:00
for ( int i = 0 ; i < COLUMN_COUNT ; i + + ) {
2014-10-09 18:04:12 -04:00
item - > setForeground ( i , brush ) ;
2010-05-27 15:48:52 -04:00
}
2010-05-23 13:21:30 -04:00
// No of Files.
{
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_ATTACHEMENTS , QString : : number ( it - > count ) ) ;
item - > setData ( COLUMN_ATTACHEMENTS , ROLE_SORT , item - > text ( COLUMN_ATTACHEMENTS ) + dateString ) ;
item - > setTextAlignment ( COLUMN_ATTACHEMENTS , Qt : : AlignHCenter ) ;
2010-05-23 13:21:30 -04:00
}
2012-05-01 05:18:55 -04:00
if ( filterColumn = = COLUMN_CONTENT ) {
2010-05-23 13:21:30 -04:00
// need content for filter
2012-05-01 05:18:55 -04:00
if ( gotInfo | | rsMsgs - > getMessage ( it - > msgId , msgInfo ) ) {
gotInfo = true ;
2010-05-23 13:21:30 -04:00
QTextDocument doc ;
2013-10-06 16:12:34 -04:00
doc . setHtml ( QString : : fromUtf8 ( msgInfo . msg . c_str ( ) ) ) ;
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_CONTENT , doc . toPlainText ( ) . replace ( QString ( " \n " ) , QString ( " " ) ) ) ;
2010-05-23 13:21:30 -04:00
} else {
std : : cerr < < " MessagesDialog::insertMsgTxtAndFiles() Couldn't find Msg " < < std : : endl ;
2014-10-09 18:04:12 -04:00
item - > setText ( COLUMN_CONTENT , " " ) ;
2010-05-23 13:21:30 -04:00
}
}
2014-10-09 18:04:12 -04:00
if ( it - > msgflags & RS_MSG_ENCRYPTED )
{
item - > setIcon ( COLUMN_SIGNATURE , QIcon ( " :/images/blue_lock.png " ) ) ;
item - > setToolTip ( COLUMN_SIGNATURE , tr ( " This message is encrypted. Right click to decrypt it. " ) ) ;
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/mail-encrypted-full.png " ) ) ;
}
else if ( it - > msgflags & RS_MSG_DECRYPTED )
{
item - > setIcon ( COLUMN_SIGNATURE , QIcon ( " :/images/blue_lock_open.png " ) ) ;
item - > setToolTip ( COLUMN_SIGNATURE , tr ( " This message has been successfully decrypted, and is unsigned. " ) ) ;
item - > setIcon ( COLUMN_SUBJECT , QIcon ( " :/images/mail-decrypted-full.png " ) ) ;
if ( it - > msgflags & RS_MSG_SIGNED )
{
if ( it - > msgflags & RS_MSG_SIGNATURE_CHECKS )
{
item - > setIcon ( COLUMN_SIGNATURE , QIcon ( " :/images/stock_signature_ok.png " ) ) ;
item - > setToolTip ( COLUMN_SIGNATURE , tr ( " This message was signed and the signature checks " ) ) ;
}
else
{
item - > setIcon ( COLUMN_SIGNATURE , QIcon ( " :/images/stock_signature_bad.png " ) ) ;
item - > setToolTip ( COLUMN_SIGNATURE , tr ( " This message was signed but the signature doesn't check " ) ) ;
}
2010-05-23 13:21:30 -04:00
}
2014-10-09 18:04:12 -04:00
}
else
item - > setIcon ( COLUMN_SIGNATURE , QIcon ( ) ) ;
if ( insertItem ) {
/* add to the list */
ui . messageTreeWidget - > addTopLevelItem ( item ) ;
2010-05-23 13:21:30 -04:00
}
}
} else {
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > clear ( ) ;
2010-05-23 13:21:30 -04:00
}
2007-11-14 22:18:48 -05:00
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > showColumn ( COLUMN_ATTACHEMENTS ) ;
ui . messageTreeWidget - > showColumn ( COLUMN_SUBJECT ) ;
ui . messageTreeWidget - > showColumn ( COLUMN_UNREAD ) ;
ui . messageTreeWidget - > showColumn ( COLUMN_FROM ) ;
ui . messageTreeWidget - > showColumn ( COLUMN_DATE ) ;
ui . messageTreeWidget - > showColumn ( COLUMN_TAGS ) ;
ui . messageTreeWidget - > hideColumn ( COLUMN_CONTENT ) ;
if ( ! ui . filterLineEdit - > text ( ) . isEmpty ( ) ) {
ui . messageTreeWidget - > filterItems ( ui . filterLineEdit - > currentFilter ( ) , ui . filterLineEdit - > text ( ) ) ;
}
2010-06-01 18:14:52 -04:00
2010-05-23 13:21:30 -04:00
updateMessageSummaryList ( ) ;
2007-11-14 22:18:48 -05:00
}
2014-10-09 18:04:12 -04:00
// current row in messageTreeWidget has changed
void MessagesDialog : : currentItemChanged ( QTreeWidgetItem * item )
2007-11-14 22:18:48 -05:00
{
2010-04-27 17:46:28 -04:00
timer - > stop ( ) ;
2014-10-09 18:04:12 -04:00
if ( item ) {
timerIndex = ui . messageTreeWidget - > indexOfTopLevelItem ( item ) ;
timer - > start ( ) ;
} else {
timerIndex = - 1 ;
}
updateInterface ( ) ;
2010-04-27 17:46:28 -04:00
}
2014-10-09 18:04:12 -04:00
// click in messageTreeWidget
void MessagesDialog : : clicked ( QTreeWidgetItem * item , int column )
2010-04-27 17:46:28 -04:00
{
2014-10-09 18:04:12 -04:00
if ( ! item ) {
2010-05-23 13:21:30 -04:00
return ;
}
2014-10-09 18:04:12 -04:00
switch ( column ) {
2011-05-23 19:45:31 -04:00
case COLUMN_UNREAD :
{
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
items . append ( item ) ;
setMsgAsReadUnread ( items , ! isMessageRead ( item ) ) ;
insertMsgTxtAndFiles ( item , false ) ;
2011-05-23 19:45:31 -04:00
updateMessageSummaryList ( ) ;
return ;
}
case COLUMN_STAR :
{
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
items . append ( item ) ;
setMsgStar ( items , ! hasMessageStar ( item ) ) ;
2011-05-23 19:45:31 -04:00
return ;
}
2010-05-23 13:21:30 -04:00
}
2010-04-27 17:46:28 -04:00
timer - > stop ( ) ;
2014-10-09 18:04:12 -04:00
timerIndex = ui . messageTreeWidget - > indexOfTopLevelItem ( item ) ;
2010-04-27 17:46:28 -04:00
// show current message directly
updateCurrentMessage ( ) ;
}
2014-10-09 18:04:12 -04:00
// double click in messageTreeWidget
void MessagesDialog : : doubleClicked ( QTreeWidgetItem * item , int column )
2010-05-25 05:32:14 -04:00
{
2010-06-14 14:16:32 -04:00
/* activate row */
2014-10-09 18:04:12 -04:00
clicked ( item , column ) ;
2010-05-25 05:32:14 -04:00
2011-06-03 20:46:02 -04:00
std : : string cid ;
std : : string mid ;
if ( ! getCurrentMsg ( cid , mid ) )
return ;
MessageInfo msgInfo ;
if ( ! rsMsgs - > getMessage ( mid , msgInfo ) ) {
return ;
}
if ( ( msgInfo . msgflags & RS_MSG_BOXMASK ) = = RS_MSG_DRAFTBOX ) {
editmessage ( ) ;
return ;
}
2010-06-14 14:16:32 -04:00
/* edit message */
2011-06-03 20:46:02 -04:00
switch ( Settings - > getMsgOpen ( ) ) {
case RshareSettings : : MSG_OPEN_TAB :
openAsTab ( ) ;
break ;
case RshareSettings : : MSG_OPEN_WINDOW :
openAsWindow ( ) ;
break ;
}
2010-05-25 05:32:14 -04:00
}
2010-04-27 17:46:28 -04:00
// show current message directly
void MessagesDialog : : updateCurrentMessage ( )
{
2010-05-23 13:21:30 -04:00
timer - > stop ( ) ;
2014-10-09 18:04:12 -04:00
insertMsgTxtAndFiles ( ui . messageTreeWidget - > topLevelItem ( timerIndex ) ) ;
2007-11-14 22:18:48 -05:00
}
2014-10-09 18:04:12 -04:00
void MessagesDialog : : setMsgAsReadUnread ( const QList < QTreeWidgetItem * > & items , bool read )
2009-02-22 12:36:39 -05:00
{
2010-08-09 08:16:21 -04:00
LockUpdate Lock ( this , false ) ;
2014-10-09 18:04:12 -04:00
foreach ( QTreeWidgetItem * item , items ) {
std : : string mid = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-23 13:21:30 -04:00
2011-05-23 19:45:31 -04:00
if ( rsMsgs - > MessageRead ( mid , ! read ) ) {
2014-10-09 18:04:12 -04:00
int msgFlag = item - > data ( COLUMN_DATA , ROLE_MSGFLAGS ) . toInt ( ) ;
2011-05-23 19:45:31 -04:00
msgFlag & = ~ RS_MSG_NEW ;
2010-11-02 17:11:11 -04:00
2011-05-23 19:45:31 -04:00
if ( read ) {
msgFlag & = ~ RS_MSG_UNREAD_BY_USER ;
2010-11-02 17:11:11 -04:00
} else {
2011-05-23 19:45:31 -04:00
msgFlag | = RS_MSG_UNREAD_BY_USER ;
2010-11-02 17:11:11 -04:00
}
2014-10-09 18:04:12 -04:00
item - > setData ( COLUMN_DATA , ROLE_MSGFLAGS , msgFlag ) ;
2010-11-02 17:11:11 -04:00
InitIconAndFont ( item ) ;
2010-05-23 13:21:30 -04:00
}
}
2010-08-09 08:16:21 -04:00
// LockUpdate
2009-02-22 12:36:39 -05:00
}
2007-11-14 22:18:48 -05:00
2010-05-23 13:21:30 -04:00
void MessagesDialog : : markAsRead ( )
2007-11-14 22:18:48 -05:00
{
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > itemsUnread ;
getSelectedMsgCount ( NULL , NULL , & itemsUnread , NULL ) ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
setMsgAsReadUnread ( itemsUnread , true ) ;
2010-05-23 13:21:30 -04:00
updateMessageSummaryList ( ) ;
}
void MessagesDialog : : markAsUnread ( )
{
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > itemsRead ;
getSelectedMsgCount ( NULL , & itemsRead , NULL , NULL ) ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
setMsgAsReadUnread ( itemsRead , false ) ;
2010-05-23 13:21:30 -04:00
updateMessageSummaryList ( ) ;
}
2011-05-23 19:45:31 -04:00
void MessagesDialog : : markWithStar ( bool checked )
{
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
getSelectedMsgCount ( & items , NULL , NULL , NULL ) ;
2011-05-23 19:45:31 -04:00
2014-10-09 18:04:12 -04:00
setMsgStar ( items , checked ) ;
2011-06-04 18:54:03 -04:00
}
2011-05-23 19:45:31 -04:00
2014-10-09 18:04:12 -04:00
void MessagesDialog : : setMsgStar ( const QList < QTreeWidgetItem * > & items , bool star )
2011-05-23 19:45:31 -04:00
{
LockUpdate Lock ( this , false ) ;
2014-10-09 18:04:12 -04:00
foreach ( QTreeWidgetItem * item , items ) {
std : : string mid = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2011-05-23 19:45:31 -04:00
if ( rsMsgs - > MessageStar ( mid , star ) ) {
2014-10-09 18:04:12 -04:00
int msgFlag = item - > data ( COLUMN_DATA , ROLE_MSGFLAGS ) . toInt ( ) ;
2011-05-23 19:45:31 -04:00
msgFlag & = ~ RS_MSG_STAR ;
if ( star ) {
msgFlag | = RS_MSG_STAR ;
} else {
msgFlag & = ~ RS_MSG_STAR ;
}
2014-10-09 18:04:12 -04:00
item - > setData ( ROLE_MSGFLAGS , COLUMN_DATA , msgFlag ) ;
2011-05-23 19:45:31 -04:00
InitIconAndFont ( item ) ;
2011-06-04 18:54:03 -04:00
Lock . setUpdate ( true ) ;
2011-05-23 19:45:31 -04:00
}
}
// LockUpdate
}
2014-10-09 18:04:12 -04:00
void MessagesDialog : : insertMsgTxtAndFiles ( QTreeWidgetItem * item , bool bSetToRead )
2010-05-23 13:21:30 -04:00
{
std : : cerr < < " MessagesDialog::insertMsgTxtAndFiles() " < < std : : endl ;
/* get its Ids */
std : : string cid ;
std : : string mid ;
2010-10-31 15:37:05 -04:00
if ( item = = NULL ) {
2011-06-03 20:46:02 -04:00
mCurrMsgId . clear ( ) ;
msgWidget - > fill ( mCurrMsgId ) ;
updateInterface ( ) ;
2010-10-31 15:37:05 -04:00
return ;
2010-05-23 13:21:30 -04:00
}
2014-10-09 18:04:12 -04:00
mid = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-23 13:21:30 -04:00
2011-05-23 19:45:31 -04:00
int nCount = getSelectedMsgCount ( NULL , NULL , NULL , NULL ) ;
2010-05-23 13:21:30 -04:00
if ( nCount = = 1 ) {
2011-06-03 20:46:02 -04:00
ui . actionSaveAs - > setEnabled ( true ) ;
2010-05-23 13:21:30 -04:00
ui . actionPrintPreview - > setEnabled ( true ) ;
ui . actionPrint - > setEnabled ( true ) ;
} else {
2011-06-03 20:46:02 -04:00
ui . actionSaveAs - > setDisabled ( true ) ;
2010-05-23 13:21:30 -04:00
ui . actionPrintPreview - > setDisabled ( true ) ;
ui . actionPrint - > setDisabled ( true ) ;
}
if ( mCurrMsgId = = mid ) {
// message doesn't changed
return ;
}
/* Save the Data.... for later */
2011-06-03 20:46:02 -04:00
mCurrMsgId = mid ;
2010-05-23 13:21:30 -04:00
MessageInfo msgInfo ;
2011-06-03 20:46:02 -04:00
if ( ! rsMsgs - > getMessage ( mid , msgInfo ) ) {
2010-05-23 13:21:30 -04:00
std : : cerr < < " MessagesDialog::insertMsgTxtAndFiles() Couldn't find Msg " < < std : : endl ;
return ;
}
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
items . append ( item ) ;
2010-05-23 13:21:30 -04:00
bool bSetToReadOnActive = Settings - > getMsgSetToReadOnActivate ( ) ;
if ( msgInfo . msgflags & RS_MSG_NEW ) {
2010-08-22 18:12:26 -04:00
// set always to read or unread
2010-05-23 13:21:30 -04:00
if ( bSetToReadOnActive = = false | | bSetToRead = = false ) {
// set locally to unread
2014-10-09 18:04:12 -04:00
setMsgAsReadUnread ( items , false ) ;
2010-08-22 18:12:26 -04:00
} else {
2014-10-09 18:04:12 -04:00
setMsgAsReadUnread ( items , true ) ;
2010-05-23 13:21:30 -04:00
}
updateMessageSummaryList ( ) ;
} else {
2010-08-22 18:12:26 -04:00
if ( ( msgInfo . msgflags & RS_MSG_UNREAD_BY_USER ) & & bSetToRead & & bSetToReadOnActive ) {
2010-05-23 13:21:30 -04:00
// set to read
2014-10-09 18:04:12 -04:00
setMsgAsReadUnread ( items , true ) ;
2010-05-23 13:21:30 -04:00
updateMessageSummaryList ( ) ;
}
}
2011-06-03 20:46:02 -04:00
msgWidget - > fill ( mCurrMsgId ) ;
updateInterface ( ) ;
2007-11-14 22:18:48 -05:00
}
2013-05-04 18:03:48 -04:00
void MessagesDialog : : decryptSelectedMsg ( )
{
2013-09-28 18:05:38 -04:00
if ( ! MessageWidget : : decryptMsg ( mCurrMsgId ) ) {
return ;
}
2013-07-31 12:34:34 -04:00
2013-09-28 18:05:38 -04:00
// Force refill
mCurrMsgId . clear ( ) ;
msgWidget - > fill ( " " ) ;
2013-07-31 12:34:34 -04:00
2014-10-09 18:04:12 -04:00
insertMsgTxtAndFiles ( ui . messageTreeWidget - > currentItem ( ) ) ;
2013-05-04 18:03:48 -04:00
}
2007-11-14 22:18:48 -05:00
bool MessagesDialog : : getCurrentMsg ( std : : string & cid , std : : string & mid )
{
2014-10-09 18:04:12 -04:00
QTreeWidgetItem * item = ui . messageTreeWidget - > currentItem ( ) ;
2010-05-23 13:21:30 -04:00
/* get its Ids */
2014-10-09 18:04:12 -04:00
if ( ! item )
2010-05-23 13:21:30 -04:00
{
//If no message is selected. assume first message is selected.
2014-10-09 18:04:12 -04:00
if ( ui . messageTreeWidget - > topLevelItemCount ( ) = = 0 )
2010-05-23 13:21:30 -04:00
{
2014-10-09 18:04:12 -04:00
item = ui . messageTreeWidget - > topLevelItem ( 0 ) ;
2010-05-23 13:21:30 -04:00
}
}
2014-10-09 18:04:12 -04:00
if ( ! item ) {
2010-06-25 08:17:46 -04:00
return false ;
}
2014-10-09 18:04:12 -04:00
cid = item - > data ( COLUMN_DATA , ROLE_SRCID ) . toString ( ) . toStdString ( ) ;
mid = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-23 13:21:30 -04:00
return true ;
2010-02-13 13:49:56 -05:00
}
2007-11-14 22:18:48 -05:00
void MessagesDialog : : removemessage ( )
{
2010-06-03 18:12:07 -04:00
LockUpdate Lock ( this , true ) ;
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > selectedItems = ui . messageTreeWidget - > selectedItems ( ) ;
2010-05-23 13:21:30 -04:00
2014-10-09 18:04:12 -04:00
bool doDelete = false ;
2010-06-03 18:12:07 -04:00
int listrow = ui . listWidget - > currentRow ( ) ;
2010-05-28 10:42:54 -04:00
if ( listrow = = ROW_TRASHBOX ) {
2014-10-09 18:04:12 -04:00
doDelete = true ;
2010-05-28 10:42:54 -04:00
} else {
if ( QApplication : : keyboardModifiers ( ) & Qt : : ShiftModifier ) {
2014-10-09 18:04:12 -04:00
doDelete = true ;
2010-05-28 10:42:54 -04:00
}
}
2014-10-09 18:04:12 -04:00
foreach ( QTreeWidgetItem * item , selectedItems ) {
QString mid = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) ;
2011-06-03 20:46:02 -04:00
2014-10-09 18:04:12 -04:00
// close tab showing this message
// closeTab(mid.toStdString());
2011-06-03 20:46:02 -04:00
2014-10-09 18:04:12 -04:00
if ( doDelete ) {
rsMsgs - > MessageDelete ( mid . toStdString ( ) ) ;
} else {
rsMsgs - > MessageToTrash ( mid . toStdString ( ) , true ) ;
2010-05-28 10:42:54 -04:00
}
}
2010-05-23 13:21:30 -04:00
2010-06-03 18:12:07 -04:00
// LockUpdate -> insertMessages();
2010-05-28 10:42:54 -04:00
}
2010-05-27 15:48:52 -04:00
2010-05-28 10:42:54 -04:00
void MessagesDialog : : undeletemessage ( )
{
2010-08-22 18:12:26 -04:00
LockUpdate Lock ( this , true ) ;
2010-06-03 18:12:07 -04:00
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
getSelectedMsgCount ( & items , NULL , NULL , NULL ) ;
foreach ( QTreeWidgetItem * item , items ) {
QString mid = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) ;
2010-05-28 10:42:54 -04:00
rsMsgs - > MessageToTrash ( mid . toStdString ( ) , false ) ;
2010-05-23 13:21:30 -04:00
}
2010-06-03 18:12:07 -04:00
// LockUpdate -> insertMessages();
2007-11-14 22:18:48 -05:00
}
2010-05-27 15:48:52 -04:00
void MessagesDialog : : setToolbarButtonStyle ( Qt : : ToolButtonStyle style )
2010-01-21 20:05:45 -05:00
{
2010-05-27 15:48:52 -04:00
ui . newmessageButton - > setToolButtonStyle ( style ) ;
ui . removemessageButton - > setToolButtonStyle ( style ) ;
ui . replymessageButton - > setToolButtonStyle ( style ) ;
ui . replyallmessageButton - > setToolButtonStyle ( style ) ;
ui . forwardmessageButton - > setToolButtonStyle ( style ) ;
ui . tagButton - > setToolButtonStyle ( style ) ;
ui . printbutton - > setToolButtonStyle ( style ) ;
ui . viewtoolButton - > setToolButtonStyle ( style ) ;
}
2010-05-20 17:53:27 -04:00
2011-06-03 20:46:02 -04:00
void MessagesDialog : : buttonStyle ( )
2010-01-25 07:44:12 -05:00
{
2011-06-03 20:46:02 -04:00
setToolbarButtonStyle ( ( Qt : : ToolButtonStyle ) dynamic_cast < QAction * > ( sender ( ) ) - > data ( ) . toInt ( ) ) ;
2010-01-25 07:44:12 -05:00
}
2010-02-13 13:49:56 -05:00
2012-04-05 17:03:03 -04:00
void MessagesDialog : : filterChanged ( const QString & text )
2010-02-13 13:49:56 -05:00
{
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > filterItems ( ui . filterLineEdit - > currentFilter ( ) , text ) ;
2010-02-13 13:49:56 -05:00
}
2012-10-29 06:59:26 -04:00
void MessagesDialog : : filterColumnChanged ( int column )
2010-02-13 13:49:56 -05:00
{
2012-05-01 05:18:55 -04:00
if ( inProcessSettings ) {
2010-05-20 17:53:27 -04:00
return ;
}
2012-10-29 06:59:26 -04:00
if ( column = = COLUMN_CONTENT ) {
2010-05-18 18:37:18 -04:00
// need content ... refill
insertMessages ( ) ;
}
2014-10-09 18:04:12 -04:00
ui . messageTreeWidget - > filterItems ( column , ui . filterLineEdit - > text ( ) ) ;
2010-05-18 18:37:18 -04:00
// save index
2012-10-29 06:59:26 -04:00
Settings - > setValueToGroup ( " MessageDialog " , " filterColumn " , column ) ;
2010-02-13 13:49:56 -05:00
}
void MessagesDialog : : updateMessageSummaryList ( )
{
2010-05-23 13:21:30 -04:00
unsigned int newInboxCount = 0 ;
unsigned int newOutboxCount = 0 ;
unsigned int newDraftCount = 0 ;
unsigned int newSentboxCount = 0 ;
unsigned int inboxCount = 0 ;
2010-05-28 10:42:54 -04:00
unsigned int trashboxCount = 0 ;
2011-06-04 18:54:03 -04:00
unsigned int starredCount = 0 ;
2012-05-01 05:18:55 -04:00
unsigned int systemCount = 0 ;
2010-05-23 13:21:30 -04:00
/* calculating the new messages */
// rsMsgs->getMessageCount (&inboxCount, &newInboxCount, &newOutboxCount, &newDraftCount, &newSentboxCount);
std : : list < MsgInfoSummary > msgList ;
std : : list < MsgInfoSummary > : : const_iterator it ;
rsMsgs - > getMessageSummaries ( msgList ) ;
2010-06-01 18:14:52 -04:00
QMap < int , int > tagCount ;
2010-08-22 18:12:26 -04:00
/* calculating the new messages */
2010-05-23 13:21:30 -04:00
for ( it = msgList . begin ( ) ; it ! = msgList . end ( ) ; it + + ) {
2010-06-01 18:14:52 -04:00
/* calcluate tag count */
2010-08-22 18:12:26 -04:00
MsgTagInfo tagInfo ;
rsMsgs - > getMessageTag ( it - > msgId , tagInfo ) ;
for ( std : : list < uint32_t > : : iterator tagId = tagInfo . tagIds . begin ( ) ; tagId ! = tagInfo . tagIds . end ( ) ; tagId + + ) {
2010-06-01 18:14:52 -04:00
int nCount = tagCount [ * tagId ] ;
nCount + + ;
tagCount [ * tagId ] = nCount ;
}
2011-06-04 18:54:03 -04:00
if ( it - > msgflags & RS_MSG_STAR ) {
starredCount + + ;
}
2012-05-01 05:18:55 -04:00
if ( it - > msgflags & RS_MSG_SYSTEM ) {
systemCount + + ;
}
2010-06-01 18:14:52 -04:00
/* calculate box */
2010-05-28 10:42:54 -04:00
if ( it - > msgflags & RS_MSG_TRASH ) {
trashboxCount + + ;
continue ;
}
2010-05-23 13:21:30 -04:00
switch ( it - > msgflags & RS_MSG_BOXMASK ) {
case RS_MSG_INBOX :
inboxCount + + ;
2010-08-22 18:12:26 -04:00
if ( it - > msgflags & ( RS_MSG_NEW | RS_MSG_UNREAD_BY_USER ) ) {
2010-05-23 13:21:30 -04:00
newInboxCount + + ;
}
break ;
case RS_MSG_OUTBOX :
newOutboxCount + + ;
break ;
case RS_MSG_DRAFTBOX :
newDraftCount + + ;
break ;
case RS_MSG_SENTBOX :
newSentboxCount + + ;
break ;
}
}
2010-06-12 11:11:42 -04:00
int listrow = ui . listWidget - > currentRow ( ) ;
QString textTotal ;
switch ( listrow )
{
case ROW_INBOX :
textTotal = tr ( " Total: " ) + " " + QString : : number ( inboxCount ) ;
ui . total_label - > setText ( textTotal ) ;
break ;
case ROW_OUTBOX :
textTotal = tr ( " Total: " ) + " " + QString : : number ( newOutboxCount ) ;
ui . total_label - > setText ( textTotal ) ;
break ;
case ROW_DRAFTBOX :
textTotal = tr ( " Total: " ) + " " + QString : : number ( newDraftCount ) ;
ui . total_label - > setText ( textTotal ) ;
break ;
case ROW_SENTBOX :
textTotal = tr ( " Total: " ) + " " + QString : : number ( newSentboxCount ) ;
ui . total_label - > setText ( textTotal ) ;
break ;
case ROW_TRASHBOX :
textTotal = tr ( " Total: " ) + " " + QString : : number ( trashboxCount ) ;
ui . total_label - > setText ( textTotal ) ;
break ;
}
2010-05-23 13:21:30 -04:00
QString textItem ;
/*updating the labels in leftcolumn*/
//QList<QListWidgetItem *> QListWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const
2010-05-28 10:42:54 -04:00
QListWidgetItem * item = ui . listWidget - > item ( ROW_INBOX ) ;
2010-05-23 13:21:30 -04:00
if ( newInboxCount ! = 0 )
{
2010-06-01 18:14:52 -04:00
textItem = tr ( " Inbox " ) + " ( " + QString : : number ( newInboxCount ) + " ) " ;
2010-05-23 13:21:30 -04:00
item - > setText ( textItem ) ;
QFont qf = item - > font ( ) ;
qf . setBold ( true ) ;
item - > setFont ( qf ) ;
item - > setIcon ( QIcon ( " :/images/folder-inbox-new.png " ) ) ;
2012-11-19 11:01:21 -05:00
item - > setForeground ( QBrush ( mTextColorInbox ) ) ;
2010-05-23 13:21:30 -04:00
}
else
{
textItem = tr ( " Inbox " ) ;
item - > setText ( textItem ) ;
QFont qf = item - > font ( ) ;
qf . setBold ( false ) ;
item - > setFont ( qf ) ;
item - > setIcon ( QIcon ( " :/images/folder-inbox.png " ) ) ;
2014-10-09 18:04:12 -04:00
item - > setForeground ( QBrush ( ui . messageTreeWidget - > palette ( ) . color ( QPalette : : Text ) ) ) ;
2010-05-23 13:21:30 -04:00
}
//QList<QListWidgetItem *> QListWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const
2010-05-28 10:42:54 -04:00
item = ui . listWidget - > item ( ROW_OUTBOX ) ;
2010-05-23 13:21:30 -04:00
if ( newOutboxCount ! = 0 )
{
2010-06-01 18:14:52 -04:00
textItem = tr ( " Outbox " ) + " ( " + QString : : number ( newOutboxCount ) + " ) " ;
2010-05-23 13:21:30 -04:00
item - > setText ( textItem ) ;
QFont qf = item - > font ( ) ;
qf . setBold ( true ) ;
item - > setFont ( qf ) ;
}
else
{
textItem = tr ( " Outbox " ) ;
item - > setText ( textItem ) ;
QFont qf = item - > font ( ) ;
qf . setBold ( false ) ;
item - > setFont ( qf ) ;
}
//QList<QListWidgetItem *> QListWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const
2010-05-28 10:42:54 -04:00
item = ui . listWidget - > item ( ROW_DRAFTBOX ) ;
2010-05-23 13:21:30 -04:00
if ( newDraftCount ! = 0 )
{
2010-06-01 18:14:52 -04:00
textItem = tr ( " Drafts " ) + " ( " + QString : : number ( newDraftCount ) + " ) " ;
2010-05-23 13:21:30 -04:00
item - > setText ( textItem ) ;
QFont qf = item - > font ( ) ;
qf . setBold ( true ) ;
item - > setFont ( qf ) ;
}
else
{
2010-05-28 13:29:21 -04:00
textItem = tr ( " Drafts " ) ;
2010-05-23 13:21:30 -04:00
item - > setText ( textItem ) ;
QFont qf = item - > font ( ) ;
qf . setBold ( false ) ;
item - > setFont ( qf ) ;
}
2010-05-28 10:42:54 -04:00
item = ui . listWidget - > item ( ROW_TRASHBOX ) ;
if ( trashboxCount ! = 0 )
{
2010-06-01 18:14:52 -04:00
textItem = tr ( " Trash " ) + " ( " + QString : : number ( trashboxCount ) + " ) " ;
2010-05-28 10:42:54 -04:00
item - > setText ( textItem ) ;
}
else
{
textItem = tr ( " Trash " ) ;
item - > setText ( textItem ) ;
}
2010-06-01 18:14:52 -04:00
/* set tag counts */
2011-06-04 18:54:03 -04:00
int rowCount = ui . quickViewWidget - > count ( ) ;
for ( int row = 0 ; row < rowCount ; row + + ) {
QListWidgetItem * item = ui . quickViewWidget - > item ( row ) ;
switch ( item - > data ( ROLE_QUICKVIEW_TYPE ) . toInt ( ) ) {
case QUICKVIEW_TYPE_TAG :
{
int count = tagCount [ item - > data ( ROLE_QUICKVIEW_ID ) . toInt ( ) ] ;
QString text = item - > data ( ROLE_QUICKVIEW_TEXT ) . toString ( ) ;
if ( count ) {
text + = " ( " + QString : : number ( count ) + " ) " ;
}
item - > setText ( text ) ;
}
break ;
case QUICKVIEW_TYPE_STATIC :
{
QString text = item - > data ( ROLE_QUICKVIEW_TEXT ) . toString ( ) ;
switch ( item - > data ( ROLE_QUICKVIEW_ID ) . toInt ( ) ) {
case QUICKVIEW_STATIC_ID_STARRED :
text + = " ( " + QString : : number ( starredCount ) + " ) " ;
break ;
2012-05-01 05:18:55 -04:00
case QUICKVIEW_STATIC_ID_SYSTEM :
text + = " ( " + QString : : number ( systemCount ) + " ) " ;
break ;
2011-06-04 18:54:03 -04:00
}
2010-06-01 18:14:52 -04:00
2011-06-04 18:54:03 -04:00
item - > setText ( text ) ;
}
break ;
}
2010-06-01 18:14:52 -04:00
}
2010-02-13 13:49:56 -05:00
}
2010-02-14 07:29:50 -05:00
2010-05-27 15:48:52 -04:00
void MessagesDialog : : tagAboutToShow ( )
{
2011-05-21 12:26:00 -04:00
TagsMenu * menu = dynamic_cast < TagsMenu * > ( ui . tagButton - > menu ( ) ) ;
if ( menu = = NULL ) {
return ;
}
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
// activate actions from the first selected row
MsgTagInfo tagInfo ;
2010-05-27 15:48:52 -04:00
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
getSelectedMsgCount ( & items , NULL , NULL , NULL ) ;
2010-05-27 15:48:52 -04:00
2014-10-09 18:04:12 -04:00
if ( items . size ( ) ) {
std : : string msgId = items . front ( ) - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
rsMsgs - > getMessageTag ( msgId , tagInfo ) ;
}
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
menu - > activateActions ( tagInfo . tagIds ) ;
2010-05-27 15:48:52 -04:00
}
2011-05-21 12:26:00 -04:00
void MessagesDialog : : tagRemoveAll ( )
2010-05-27 15:48:52 -04:00
{
2011-05-21 12:26:00 -04:00
LockUpdate Lock ( this , false ) ;
2010-05-27 15:48:52 -04:00
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
getSelectedMsgCount ( & items , NULL , NULL , NULL ) ;
foreach ( QTreeWidgetItem * item , items ) {
std : : string msgId = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
rsMsgs - > setMessageTag ( msgId , 0 , false ) ;
Lock . setUpdate ( true ) ;
}
2010-08-22 18:12:26 -04:00
2011-05-21 12:26:00 -04:00
// LockUpdate -> insertMessages();
}
2010-08-22 18:12:26 -04:00
2011-05-21 12:26:00 -04:00
void MessagesDialog : : tagSet ( int tagId , bool set )
{
if ( tagId = = 0 ) {
return ;
}
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
LockUpdate Lock ( this , false ) ;
2010-05-27 15:48:52 -04:00
2014-10-09 18:04:12 -04:00
QList < QTreeWidgetItem * > items ;
getSelectedMsgCount ( & items , NULL , NULL , NULL ) ;
foreach ( QTreeWidgetItem * item , items ) {
std : : string msgId = item - > data ( COLUMN_DATA , ROLE_MSGID ) . toString ( ) . toStdString ( ) ;
2010-05-27 15:48:52 -04:00
2011-05-21 12:26:00 -04:00
if ( rsMsgs - > setMessageTag ( msgId , tagId , set ) ) {
Lock . setUpdate ( true ) ;
}
}
2010-08-22 18:12:26 -04:00
2011-05-21 12:26:00 -04:00
// LockUpdate -> insertMessages();
2010-05-27 15:48:52 -04:00
}
2010-09-27 20:03:12 -04:00
2010-10-29 16:57:23 -04:00
void MessagesDialog : : emptyTrash ( )
{
LockUpdate Lock ( this , true ) ;
std : : list < MsgInfoSummary > msgList ;
rsMsgs - > getMessageSummaries ( msgList ) ;
std : : list < MsgInfoSummary > : : const_iterator it ;
for ( it = msgList . begin ( ) ; it ! = msgList . end ( ) ; it + + ) {
if ( it - > msgflags & RS_MSG_TRASH ) {
rsMsgs - > MessageDelete ( it - > msgId ) ;
}
}
// LockUpdate -> insertMessages();
}
2011-06-03 20:46:02 -04:00
2011-08-12 10:06:29 -04:00
void MessagesDialog : : tabChanged ( int /*tab*/ )
2011-06-03 20:46:02 -04:00
{
connectActions ( ) ;
updateInterface ( ) ;
}
void MessagesDialog : : tabCloseRequested ( int tab )
{
if ( tab = = 0 ) {
return ;
}
QWidget * widget = ui . tabWidget - > widget ( tab ) ;
if ( widget ) {
widget - > deleteLater ( ) ;
}
}
void MessagesDialog : : closeTab ( const std : : string & msgId )
{
QList < MessageWidget * > msgWidgets ;
for ( int tab = 1 ; tab < ui . tabWidget - > count ( ) ; tab + + ) {
MessageWidget * msgWidget = dynamic_cast < MessageWidget * > ( ui . tabWidget - > widget ( tab ) ) ;
if ( msgWidget & & msgWidget - > msgId ( ) = = msgId ) {
msgWidgets . append ( msgWidget ) ;
}
}
qDeleteAll ( msgWidgets ) ;
}
void MessagesDialog : : connectActions ( )
{
int tab = ui . tabWidget - > currentIndex ( ) ;
MessageWidget * msg ;
if ( tab = = 0 ) {
msg = msgWidget ;
} else {
msg = dynamic_cast < MessageWidget * > ( ui . tabWidget - > widget ( tab ) ) ;
}
ui . replymessageButton - > disconnect ( ) ;
ui . replyallmessageButton - > disconnect ( ) ;
ui . forwardmessageButton - > disconnect ( ) ;
ui . printbutton - > disconnect ( ) ;
ui . actionPrint - > disconnect ( ) ;
ui . actionPrintPreview - > disconnect ( ) ;
ui . actionSaveAs - > disconnect ( ) ;
ui . removemessageButton - > disconnect ( ) ;
2011-06-05 09:37:49 -04:00
ui . actionReply - > disconnect ( ) ;
ui . actionReplyAll - > disconnect ( ) ;
ui . actionForward - > disconnect ( ) ;
if ( msgWidget ) {
// connect actions
msg - > connectAction ( MessageWidget : : ACTION_REPLY , ui . actionReply ) ;
msg - > connectAction ( MessageWidget : : ACTION_REPLY_ALL , ui . actionReplyAll ) ;
msg - > connectAction ( MessageWidget : : ACTION_FORWARD , ui . actionForward ) ;
}
2011-06-03 20:46:02 -04:00
if ( msg ) {
if ( tab = = 0 ) {
// connect with own slot to remove multiple messages
connect ( ui . removemessageButton , SIGNAL ( clicked ( ) ) , this , SLOT ( removemessage ( ) ) ) ;
} else {
msg - > connectAction ( MessageWidget : : ACTION_REMOVE , ui . removemessageButton ) ;
}
msg - > connectAction ( MessageWidget : : ACTION_REPLY , ui . replymessageButton ) ;
msg - > connectAction ( MessageWidget : : ACTION_REPLY_ALL , ui . replyallmessageButton ) ;
msg - > connectAction ( MessageWidget : : ACTION_FORWARD , ui . forwardmessageButton ) ;
msg - > connectAction ( MessageWidget : : ACTION_PRINT , ui . printbutton ) ;
msg - > connectAction ( MessageWidget : : ACTION_PRINT , ui . actionPrint ) ;
msg - > connectAction ( MessageWidget : : ACTION_PRINT_PREVIEW , ui . actionPrintPreview ) ;
msg - > connectAction ( MessageWidget : : ACTION_SAVE_AS , ui . actionSaveAs ) ;
}
}
void MessagesDialog : : updateInterface ( )
{
int count = 0 ;
int tab = ui . tabWidget - > currentIndex ( ) ;
if ( tab = = 0 ) {
count = getSelectedMsgCount ( NULL , NULL , NULL , NULL ) ;
} else {
MessageWidget * msg = dynamic_cast < MessageWidget * > ( ui . tabWidget - > widget ( tab ) ) ;
if ( msg & & msg - > msgId ( ) . empty ( ) = = false ) {
count = 1 ;
}
}
ui . replymessageButton - > setEnabled ( count = = 1 ) ;
ui . replyallmessageButton - > setEnabled ( count = = 1 ) ;
ui . forwardmessageButton - > setEnabled ( count = = 1 ) ;
ui . printbutton - > setEnabled ( count = = 1 ) ;
ui . actionPrint - > setEnabled ( count = = 1 ) ;
ui . actionPrintPreview - > setEnabled ( count = = 1 ) ;
ui . actionSaveAs - > setEnabled ( count = = 1 ) ;
ui . removemessageButton - > setEnabled ( count > = 1 ) ;
ui . tagButton - > setEnabled ( count > = 1 ) ;
}