2007-11-14 22:18:48 -05:00
/****************************************************************
* RetroShare is distributed under the following license :
*
2007-11-18 18:35:53 -05:00
* Copyright ( C ) 2006 , 2007 RetroShare Team
2007-11-14 22:18:48 -05:00
*
* 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-09-27 17:05:52 -04:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
2007-11-14 22:18:48 -05:00
* Boston , MA 02110 - 1301 , USA .
2008-11-25 20:19:09 -05:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-07-23 14:52:58 -04:00
# include <QMessageBox>
# include <QCloseEvent>
# include <QClipboard>
# include <QTextCodec>
# include <QPrintDialog>
# include <QPrinter>
# include <QTextList>
# include <QColorDialog>
# include <QTextDocumentFragment>
# include <QTimer>
2010-09-27 17:05:52 -04:00
# include <QCompleter>
2010-12-02 19:54:40 -05:00
# include <QItemDelegate>
2012-05-11 20:40:53 -04:00
# include <QDateTime>
# include <QFileInfo>
2012-11-15 16:35:37 -05:00
# include <QTextStream>
2010-07-23 14:52:58 -04:00
2010-09-24 07:38:46 -04:00
# include <algorithm>
2010-05-23 15:13:41 -04:00
# include "MessageComposer.h"
2008-11-25 20:19:09 -05:00
2010-08-06 05:40:23 -04:00
# include <retroshare/rsiface.h>
# include <retroshare/rspeers.h>
# include <retroshare/rsmsgs.h>
2010-09-27 17:05:52 -04:00
# include <retroshare/rsstatus.h>
2012-11-11 16:17:00 -05:00
# include <retroshare/rsfiles.h>
2008-01-25 03:49:40 -05:00
2010-09-27 17:05:52 -04:00
# include "gui/notifyqt.h"
# include "gui/common/RSTreeWidgetItem.h"
# include "gui/common/GroupDefs.h"
# include "gui/common/StatusDefs.h"
2010-09-28 16:33:34 -04:00
# include "gui/common/PeerDefs.h"
2010-06-07 20:42:15 -04:00
# include "gui/RetroShareLink.h"
2010-09-27 17:05:52 -04:00
# include "gui/settings/rsharesettings.h"
2010-11-10 08:35:38 -05:00
# include "gui/common/Emoticons.h"
2010-01-25 09:03:38 -05:00
# include "textformat.h"
2009-07-10 19:48:20 -04:00
# include "util/misc.h"
2012-11-15 16:35:37 -05:00
# include "util/DateTime.h"
2011-05-21 12:26:00 -04:00
# include "TagsMenu.h"
# include "gui/common/TagDefs.h"
# include "gui/connect/ConfCertDialog.h"
2012-05-11 20:40:53 -04:00
# include "util/HandleRichText.h"
2008-03-24 21:41:01 -04:00
2011-05-21 12:26:00 -04:00
# define IMAGE_GROUP16 ": / images / user / group16.png"
# define IMAGE_FRIENDINFO ": / images / peerdetails_16x16.png"
2010-09-27 17:05:52 -04:00
# define COLUMN_CONTACT_NAME 0
# define COLUMN_CONTACT_DATA 0
# define ROLE_CONTACT_ID Qt::UserRole
# define ROLE_CONTACT_SORT Qt::UserRole + 1
# define COLOR_CONNECT Qt::blue
# define TYPE_GROUP 0
# define TYPE_SSL 1
# define COLUMN_RECIPIENT_TYPE 0
# define COLUMN_RECIPIENT_ICON 1
# define COLUMN_RECIPIENT_NAME 2
# define COLUMN_RECIPIENT_COUNT 3
# define COLUMN_RECIPIENT_DATA COLUMN_RECIPIENT_ICON // the column with a QTableWidgetItem
# define ROLE_RECIPIENT_ID Qt::UserRole
# define ROLE_RECIPIENT_GROUP Qt::UserRole + 1
2010-11-12 18:48:12 -05:00
# define COLUMN_FILE_CHECKED 0
# define COLUMN_FILE_NAME 0
# define COLUMN_FILE_SIZE 1
# define COLUMN_FILE_HASH 2
# define COLUMN_FILE_COUNT 3
2010-11-07 16:33:48 -05:00
2010-09-27 17:05:52 -04:00
# define STYLE_NORMAL "QLineEdit#%1 { border : none; }"
# define STYLE_FAIL "QLineEdit#%1 { border : none; color : red; }"
class MessageItemDelegate : public QItemDelegate
{
public :
MessageItemDelegate ( QObject * parent = 0 ) : QItemDelegate ( parent )
{
}
void paint ( QPainter * painter , const QStyleOptionViewItem & option , const QModelIndex & index ) const
{
QStyleOptionViewItem ownOption ( option ) ;
ownOption . state | = QStyle : : State_Enabled ; // the item is disabled to get no focus, but draw the icon as enabled (no grayscale)
QItemDelegate : : paint ( painter , ownOption , index ) ;
}
} ;
2008-11-25 20:19:09 -05:00
/** Constructor */
2013-10-18 17:10:33 -04:00
MessageComposer : : MessageComposer ( QWidget * parent , Qt : : WindowFlags flags )
2011-12-07 08:08:12 -05:00
: QMainWindow ( parent , flags )
2008-11-25 20:19:09 -05:00
{
2010-01-25 09:03:38 -05:00
/* Invoke the Qt Designer generated object setup routine */
ui . setupUi ( this ) ;
2010-06-14 14:16:32 -04:00
2010-11-02 17:11:11 -04:00
m_msgType = NORMAL ;
2012-05-01 05:18:55 -04:00
// needed to send system flags with reply
2012-05-05 18:20:05 -04:00
msgFlags = 0 ;
2010-11-02 17:11:11 -04:00
2010-01-25 09:03:38 -05:00
setupFileActions ( ) ;
setupEditActions ( ) ;
setupViewActions ( ) ;
setupInsertActions ( ) ;
2010-09-24 07:38:46 -04:00
2010-09-27 17:05:52 -04:00
m_compareRole = new RSTreeWidgetItemCompareRole ;
2010-12-15 16:32:44 -05:00
m_compareRole - > setRole ( COLUMN_CONTACT_NAME , ROLE_CONTACT_SORT ) ;
2010-09-27 17:05:52 -04:00
m_completer = NULL ;
2010-05-20 17:53:27 -04:00
Settings - > loadWidgetInformation ( this ) ;
2010-01-25 09:03:38 -05:00
setAttribute ( Qt : : WA_DeleteOnClose , true ) ;
2010-09-24 07:38:46 -04:00
2010-11-26 10:32:46 -05:00
ui . hashBox - > hide ( ) ;
2010-09-27 17:05:52 -04:00
// connect up the buttons.
2010-01-25 09:03:38 -05:00
connect ( ui . actionSend , SIGNAL ( triggered ( bool ) ) , this , SLOT ( sendMessage ( ) ) ) ;
//connect( ui.actionReply, SIGNAL( triggered (bool)), this, SLOT( replyMessage( ) ) );
connect ( ui . boldbtn , SIGNAL ( clicked ( ) ) , this , SLOT ( textBold ( ) ) ) ;
connect ( ui . underlinebtn , SIGNAL ( clicked ( ) ) , this , SLOT ( textUnderline ( ) ) ) ;
connect ( ui . italicbtn , SIGNAL ( clicked ( ) ) , this , SLOT ( textItalic ( ) ) ) ;
connect ( ui . colorbtn , SIGNAL ( clicked ( ) ) , this , SLOT ( textColor ( ) ) ) ;
connect ( ui . imagebtn , SIGNAL ( clicked ( ) ) , this , SLOT ( addImage ( ) ) ) ;
2010-11-10 08:35:38 -05:00
connect ( ui . emoticonButton , SIGNAL ( clicked ( ) ) , this , SLOT ( smileyWidget ( ) ) ) ;
2010-01-25 09:03:38 -05:00
//connect(ui.linkbtn, SIGNAL(clicked()), this, SLOT(insertLink()));
connect ( ui . actionContactsView , SIGNAL ( triggered ( ) ) , this , SLOT ( toggleContacts ( ) ) ) ;
2010-05-25 09:22:42 -04:00
connect ( ui . actionSaveas , SIGNAL ( triggered ( ) ) , this , SLOT ( saveasDraft ( ) ) ) ;
2010-01-25 09:03:38 -05:00
connect ( ui . actionAttach , SIGNAL ( triggered ( ) ) , this , SLOT ( attachFile ( ) ) ) ;
2010-07-07 19:03:34 -04:00
connect ( ui . titleEdit , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( titleChanged ( ) ) ) ;
2010-01-25 09:03:38 -05:00
connect ( ui . sizeincreaseButton , SIGNAL ( clicked ( ) ) , this , SLOT ( fontSizeIncrease ( ) ) ) ;
connect ( ui . sizedecreaseButton , SIGNAL ( clicked ( ) ) , this , SLOT ( fontSizeDecrease ( ) ) ) ;
2010-01-25 15:16:54 -05:00
connect ( ui . actionQuote , SIGNAL ( triggered ( ) ) , this , SLOT ( blockQuote ( ) ) ) ;
2010-01-25 09:03:38 -05:00
connect ( ui . codeButton , SIGNAL ( clicked ( ) ) , this , SLOT ( toggleCode ( ) ) ) ;
2010-01-25 10:36:24 -05:00
2010-01-25 15:16:54 -05:00
connect ( ui . msgText , SIGNAL ( checkSpellingChanged ( bool ) ) , this , SLOT ( spellChecking ( bool ) ) ) ;
2010-09-24 07:38:46 -04:00
connect ( ui . msgText , SIGNAL ( currentCharFormatChanged ( const QTextCharFormat & ) ) , this , SLOT ( currentCharFormatChanged ( const QTextCharFormat & ) ) ) ;
connect ( ui . msgText , SIGNAL ( cursorPositionChanged ( ) ) , this , SLOT ( cursorPositionChanged ( ) ) ) ;
2010-11-21 16:12:35 -05:00
connect ( ui . msgText , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( contextMenu ( QPoint ) ) ) ;
2010-09-24 07:38:46 -04:00
connect ( ui . msgText - > document ( ) , SIGNAL ( modificationChanged ( bool ) ) , actionSave , SLOT ( setEnabled ( bool ) ) ) ;
connect ( ui . msgText - > document ( ) , SIGNAL ( modificationChanged ( bool ) ) , this , SLOT ( setWindowModified ( bool ) ) ) ;
connect ( ui . msgText - > document ( ) , SIGNAL ( undoAvailable ( bool ) ) , actionUndo , SLOT ( setEnabled ( bool ) ) ) ;
connect ( ui . msgText - > document ( ) , SIGNAL ( redoAvailable ( bool ) ) , actionRedo , SLOT ( setEnabled ( bool ) ) ) ;
2008-11-25 20:19:09 -05:00
2010-11-21 16:12:35 -05:00
connect ( ui . msgFileList , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( contextMenuFileList ( QPoint ) ) ) ;
2011-12-07 08:08:12 -05:00
connect ( ui . hashBox , SIGNAL ( fileHashingStarted ( ) ) , this , SLOT ( fileHashingStarted ( ) ) ) ;
connect ( ui . hashBox , SIGNAL ( fileHashingFinished ( QList < HashedFile > ) ) , this , SLOT ( fileHashingFinished ( QList < HashedFile > ) ) ) ;
2008-11-25 20:19:09 -05:00
setWindowModified ( ui . msgText - > document ( ) - > isModified ( ) ) ;
actionSave - > setEnabled ( ui . msgText - > document ( ) - > isModified ( ) ) ;
actionUndo - > setEnabled ( ui . msgText - > document ( ) - > isUndoAvailable ( ) ) ;
actionRedo - > setEnabled ( ui . msgText - > document ( ) - > isRedoAvailable ( ) ) ;
connect ( actionUndo , SIGNAL ( triggered ( ) ) , ui . msgText , SLOT ( undo ( ) ) ) ;
connect ( actionRedo , SIGNAL ( triggered ( ) ) , ui . msgText , SLOT ( redo ( ) ) ) ;
actionCut - > setEnabled ( false ) ;
actionCopy - > setEnabled ( false ) ;
connect ( actionCut , SIGNAL ( triggered ( ) ) , ui . msgText , SLOT ( cut ( ) ) ) ;
connect ( actionCopy , SIGNAL ( triggered ( ) ) , ui . msgText , SLOT ( copy ( ) ) ) ;
connect ( actionPaste , SIGNAL ( triggered ( ) ) , ui . msgText , SLOT ( paste ( ) ) ) ;
connect ( ui . msgText , SIGNAL ( copyAvailable ( bool ) ) , actionCut , SLOT ( setEnabled ( bool ) ) ) ;
connect ( ui . msgText , SIGNAL ( copyAvailable ( bool ) ) , actionCopy , SLOT ( setEnabled ( bool ) ) ) ;
2008-03-24 21:41:01 -04:00
connect ( QApplication : : clipboard ( ) , SIGNAL ( dataChanged ( ) ) , this , SLOT ( clipboardDataChanged ( ) ) ) ;
2007-11-14 22:18:48 -05:00
2013-09-07 10:02:24 -04:00
connect ( ui . onlyTrustedKeys , SIGNAL ( clicked ( bool ) ) , this , SLOT ( toggleShowNonFriend ( bool ) ) ) ;
ui . onlyTrustedKeys - > setMinimumWidth ( 20 ) ;
ui . onlyTrustedKeys - > setChecked ( Settings - > valueFromGroup ( " MessageComposer " , " ShowOnlyTrustedKeys " , false ) . toBool ( ) ) ;
2011-05-21 12:26:00 -04:00
connect ( ui . addToButton , SIGNAL ( clicked ( void ) ) , this , SLOT ( addTo ( ) ) ) ;
connect ( ui . addCcButton , SIGNAL ( clicked ( void ) ) , this , SLOT ( addCc ( ) ) ) ;
connect ( ui . addBccButton , SIGNAL ( clicked ( void ) ) , this , SLOT ( addBcc ( ) ) ) ;
connect ( ui . addRecommendButton , SIGNAL ( clicked ( void ) ) , this , SLOT ( addRecommend ( ) ) ) ;
2010-09-27 17:05:52 -04:00
connect ( NotifyQt : : getInstance ( ) , SIGNAL ( peerStatusChanged ( const QString & , int ) ) , this , SLOT ( peerStatusChanged ( const QString & , int ) ) ) ;
2012-01-26 19:32:17 -05:00
connect ( ui . friendSelectionWidget , SIGNAL ( contentChanged ( ) ) , this , SLOT ( buildCompleter ( ) ) ) ;
connect ( ui . friendSelectionWidget , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( contextMenuMsgSendList ( QPoint ) ) ) ;
2013-01-22 19:22:17 -05:00
connect ( ui . friendSelectionWidget , SIGNAL ( doubleClicked ( int , QString ) ) , this , SLOT ( addTo ( ) ) ) ;
2010-09-27 17:05:52 -04:00
2010-01-25 09:03:38 -05:00
/* hide the Tree +/- */
ui . msgFileList - > setRootIsDecorated ( false ) ;
2010-09-24 07:38:46 -04:00
2012-01-26 19:32:17 -05:00
/* initialize friends list */
ui . friendSelectionWidget - > setHeaderText ( tr ( " Send To: " ) ) ;
ui . friendSelectionWidget - > setModus ( FriendSelectionWidget : : MODUS_MULTI ) ;
2013-09-07 10:02:24 -04:00
ui . friendSelectionWidget - > setShowType ( FriendSelectionWidget : : SHOW_GROUP
| FriendSelectionWidget : : SHOW_SSL
| ( ui . onlyTrustedKeys - > isChecked ( ) ? FriendSelectionWidget : : SHOW_NONE : FriendSelectionWidget : : SHOW_NON_FRIEND_GPG ) ) ;
2013-08-04 10:11:59 -04:00
//ui.friendSelectionWidget->setShowType(FriendSelectionWidget::SHOW_GROUP | FriendSelectionWidget::SHOW_SSL );
2012-01-26 19:32:17 -05:00
ui . friendSelectionWidget - > start ( ) ;
2010-07-12 10:01:29 -04:00
2008-11-25 20:19:09 -05:00
QActionGroup * grp = new QActionGroup ( this ) ;
connect ( grp , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( textAlign ( QAction * ) ) ) ;
actionAlignLeft = new QAction ( QIcon ( " :/images/textedit/textleft.png " ) , tr ( " &Left " ) , grp ) ;
actionAlignLeft - > setShortcut ( Qt : : CTRL + Qt : : Key_L ) ;
actionAlignLeft - > setCheckable ( true ) ;
actionAlignCenter = new QAction ( QIcon ( " :/images/textedit/textcenter.png " ) , tr ( " C&enter " ) , grp ) ;
actionAlignCenter - > setShortcut ( Qt : : CTRL + Qt : : Key_E ) ;
actionAlignCenter - > setCheckable ( true ) ;
actionAlignRight = new QAction ( QIcon ( " :/images/textedit/textright.png " ) , tr ( " &Right " ) , grp ) ;
actionAlignRight - > setShortcut ( Qt : : CTRL + Qt : : Key_R ) ;
actionAlignRight - > setCheckable ( true ) ;
actionAlignJustify = new QAction ( QIcon ( " :/images/textedit/textjustify.png " ) , tr ( " &Justify " ) , grp ) ;
actionAlignJustify - > setShortcut ( Qt : : CTRL + Qt : : Key_J ) ;
2008-03-24 13:36:17 -04:00
actionAlignJustify - > setCheckable ( true ) ;
2010-09-27 17:05:52 -04:00
2010-05-25 18:30:25 -04:00
setupFormatActions ( ) ;
2010-09-27 17:05:52 -04:00
2010-05-25 13:18:12 -04:00
/*ui.comboStyle->addItem("Standard");
2008-11-25 20:19:09 -05:00
ui . comboStyle - > addItem ( " Bullet List (Disc) " ) ;
ui . comboStyle - > addItem ( " Bullet List (Circle) " ) ;
ui . comboStyle - > addItem ( " Bullet List (Square) " ) ;
ui . comboStyle - > addItem ( " Ordered List (Decimal) " ) ;
ui . comboStyle - > addItem ( " Ordered List (Alpha lower) " ) ;
2010-05-25 13:18:12 -04:00
ui . comboStyle - > addItem ( " Ordered List (Alpha upper) " ) ; */
//connect(ui.comboStyle, SIGNAL(activated(int)),this, SLOT(textStyle(int)));
connect ( ui . comboStyle , SIGNAL ( activated ( int ) ) , this , SLOT ( changeFormatType ( int ) ) ) ;
2010-09-27 17:05:52 -04:00
2008-03-24 13:36:17 -04:00
connect ( ui . comboFont , SIGNAL ( activated ( const QString & ) ) , this , SLOT ( textFamily ( const QString & ) ) ) ;
2010-09-27 17:05:52 -04:00
2008-11-25 20:19:09 -05:00
ui . comboSize - > setEditable ( true ) ;
QFontDatabase db ;
foreach ( int size , db . standardSizes ( ) )
ui . comboSize - > addItem ( QString : : number ( size ) ) ;
connect ( ui . comboSize , SIGNAL ( activated ( const QString & ) ) , this , SLOT ( textSize ( const QString & ) ) ) ;
2008-03-24 13:36:17 -04:00
ui . comboSize - > setCurrentIndex ( ui . comboSize - > findText ( QString : : number ( QApplication : : font ( ) . pointSize ( ) ) ) ) ;
2010-09-27 17:05:52 -04:00
ui . textalignmentbtn - > setIcon ( QIcon ( QString ( " :/images/textedit/textcenter.png " ) ) ) ;
2010-09-24 07:38:46 -04:00
2008-11-25 20:19:09 -05:00
QMenu * alignmentmenu = new QMenu ( ) ;
alignmentmenu - > addAction ( actionAlignLeft ) ;
alignmentmenu - > addAction ( actionAlignCenter ) ;
alignmentmenu - > addAction ( actionAlignRight ) ;
alignmentmenu - > addAction ( actionAlignJustify ) ;
2008-03-24 13:36:17 -04:00
ui . textalignmentbtn - > setMenu ( alignmentmenu ) ;
2010-09-27 17:05:52 -04:00
2009-07-10 19:48:20 -04:00
QPixmap pxm ( 24 , 24 ) ;
pxm . fill ( Qt : : black ) ;
ui . colorbtn - > setIcon ( pxm ) ;
2010-09-24 07:38:46 -04:00
/* Set header resize modes and initial section sizes */
2010-09-27 17:05:52 -04:00
QHeaderView * _smheader = ui . msgFileList - > header ( ) ;
2010-09-24 07:38:46 -04:00
2010-11-07 16:33:48 -05:00
_smheader - > resizeSection ( COLUMN_FILE_NAME , 200 ) ;
_smheader - > resizeSection ( COLUMN_FILE_SIZE , 60 ) ;
_smheader - > resizeSection ( COLUMN_FILE_HASH , 220 ) ;
2010-09-27 17:05:52 -04:00
2010-01-25 09:03:38 -05:00
QPalette palette = QApplication : : palette ( ) ;
codeBackground = palette . color ( QPalette : : Active , QPalette : : Midlight ) ;
2010-09-27 17:05:52 -04:00
ui . recipientWidget - > setColumnCount ( COLUMN_RECIPIENT_COUNT ) ;
QHeaderView * header = ui . recipientWidget - > horizontalHeader ( ) ;
header - > resizeSection ( COLUMN_RECIPIENT_TYPE , 50 ) ;
header - > resizeSection ( COLUMN_RECIPIENT_ICON , 22 ) ;
header - > setResizeMode ( COLUMN_RECIPIENT_TYPE , QHeaderView : : Fixed ) ;
header - > setResizeMode ( COLUMN_RECIPIENT_ICON , QHeaderView : : Fixed ) ;
header - > setResizeMode ( COLUMN_RECIPIENT_NAME , QHeaderView : : Interactive ) ;
header - > setStretchLastSection ( true ) ;
/* Set own item delegate */
QItemDelegate * delegate = new MessageItemDelegate ( this ) ;
ui . recipientWidget - > setItemDelegateForColumn ( COLUMN_RECIPIENT_ICON , delegate ) ;
addEmptyRecipient ( ) ;
// load settings
processSettings ( true ) ;
2012-01-26 19:32:17 -05:00
buildCompleter ( ) ;
2010-11-02 17:11:11 -04:00
2010-07-12 10:01:29 -04:00
/* set focus to subject */
ui . titleEdit - > setFocus ( ) ;
2011-05-21 12:26:00 -04:00
// create tag menu
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 ) ;
2010-11-16 04:31:30 -05:00
setAcceptDrops ( true ) ;
2011-12-07 08:08:12 -05:00
ui . hashBox - > setDropWidget ( this ) ;
ui . hashBox - > setAutoHide ( true ) ;
2010-11-16 04:31:30 -05:00
2013-01-21 19:14:10 -05:00
# if QT_VERSION < 0x040700
// embedded images are not supported before QT 4.7.0
2010-11-17 07:45:46 -05:00
ui . imagebtn - > setVisible ( false ) ;
2013-01-21 19:14:10 -05:00
# endif
2010-11-17 07:45:46 -05:00
2010-09-24 07:38:46 -04:00
/* Hide platform specific features */
2008-11-25 20:19:09 -05:00
# ifdef Q_WS_WIN
# endif
}
2010-09-27 17:05:52 -04:00
MessageComposer : : ~ MessageComposer ( )
2010-06-17 13:39:32 -04:00
{
2010-09-27 17:05:52 -04:00
delete ( m_compareRole ) ;
}
2010-06-17 13:39:32 -04:00
2010-09-27 17:05:52 -04:00
void MessageComposer : : processSettings ( bool bLoad )
{
Settings - > beginGroup ( QString ( " MessageComposer " ) ) ;
2010-09-24 07:38:46 -04:00
2010-09-27 17:05:52 -04:00
if ( bLoad ) {
// load settings
2010-06-17 13:39:32 -04:00
2010-09-27 17:05:52 -04:00
// state of contact sidebar
ui . contactsdockWidget - > setVisible ( Settings - > value ( " ContactSidebar " , true ) . toBool ( ) ) ;
2010-09-24 07:38:46 -04:00
2010-09-27 17:05:52 -04:00
// state of splitter
ui . splitter - > restoreState ( Settings - > value ( " Splitter " ) . toByteArray ( ) ) ;
ui . splitter_2 - > restoreState ( Settings - > value ( " Splitter2 " ) . toByteArray ( ) ) ;
} else {
// save settings
2010-06-17 13:39:32 -04:00
2010-09-27 17:05:52 -04:00
// state of contact sidebar
Settings - > setValue ( " ContactSidebar " , ui . contactsdockWidget - > isVisible ( ) ) ;
// state of splitter
Settings - > setValue ( " Splitter " , ui . splitter - > saveState ( ) ) ;
Settings - > setValue ( " Splitter2 " , ui . splitter_2 - > saveState ( ) ) ;
}
Settings - > endGroup ( ) ;
2010-06-17 13:39:32 -04:00
}
2013-04-29 18:32:58 -04:00
/*static*/ void MessageComposer : : msgDistantPeer ( const std : : string & hash , const std : : string & pgp_id )
{
// std::cerr << "MessageComposer::msgfriend()" << std::endl;
/* create a message */
MessageComposer * pMsgDialog = MessageComposer : : newMsg ( ) ;
if ( pMsgDialog = = NULL )
return ;
pMsgDialog - > addRecipient ( TO , hash , pgp_id ) ;
pMsgDialog - > show ( ) ;
/* window will destroy itself! */
}
2010-06-17 13:39:32 -04:00
2012-02-09 14:18:15 -05:00
/*static*/ void MessageComposer : : msgFriend ( const std : : string & id , bool group )
2010-07-15 07:25:34 -04:00
{
2010-09-27 17:05:52 -04:00
// std::cerr << "MessageComposer::msgfriend()" << std::endl;
2010-07-15 07:25:34 -04:00
/* create a message */
2010-09-27 17:05:52 -04:00
2010-11-02 17:11:11 -04:00
MessageComposer * pMsgDialog = MessageComposer : : newMsg ( ) ;
if ( pMsgDialog = = NULL ) {
return ;
}
2010-07-15 07:25:34 -04:00
2010-09-27 17:05:52 -04:00
if ( group ) {
pMsgDialog - > addRecipient ( TO , id , true ) ;
} else {
2010-09-27 20:03:12 -04:00
RsPeerDetails detail ;
if ( rsPeers - > getPeerDetails ( id , detail ) & & detail . accept_connection ) {
if ( detail . isOnlyGPGdetail ) {
//put all sslChilds in message list
std : : list < std : : string > sslIds ;
2011-08-07 17:14:09 -04:00
rsPeers - > getAssociatedSSLIds ( id , sslIds ) ;
2010-09-27 20:03:12 -04:00
std : : list < std : : string > : : const_iterator it ;
for ( it = sslIds . begin ( ) ; it ! = sslIds . end ( ) ; it + + ) {
pMsgDialog - > addRecipient ( TO , * it , false ) ;
}
} else {
pMsgDialog - > addRecipient ( TO , detail . id , false ) ;
}
2010-09-27 17:05:52 -04:00
}
}
pMsgDialog - > show ( ) ;
/* window will destroy itself! */
}
2012-02-09 14:18:15 -05:00
static QString buildRecommendHtml ( const std : : list < std : : string > & sslIds , const std : : string & excludeId = " " )
2010-09-27 17:05:52 -04:00
{
QString text ;
2010-07-15 07:25:34 -04:00
2012-01-23 17:38:50 -05:00
/* process ssl ids */
2012-02-09 14:18:15 -05:00
std : : list < std : : string > : : const_iterator sslIt ;
2012-01-23 17:38:50 -05:00
for ( sslIt = sslIds . begin ( ) ; sslIt ! = sslIds . end ( ) ; sslIt + + ) {
2012-02-09 14:18:15 -05:00
if ( * sslIt = = excludeId ) {
continue ;
}
2011-05-04 06:22:49 -04:00
RetroShareLink link ;
2012-01-23 17:38:50 -05:00
if ( link . createCertificate ( * sslIt ) ) {
2011-05-12 15:37:13 -04:00
text + = link . toHtml ( ) + " <br> " ;
2010-07-15 07:25:34 -04:00
}
2010-09-27 17:05:52 -04:00
}
return text ;
}
2010-07-15 07:25:34 -04:00
2012-02-09 14:18:15 -05:00
QString MessageComposer : : recommendMessage ( )
{
2012-10-04 17:19:49 -04:00
return tr ( " Hello,<br>I recommend a good friend of mine; you can trust them too when you trust me. <br> " ) ;
2012-02-09 14:18:15 -05:00
}
void MessageComposer : : recommendFriend ( const std : : list < std : : string > & sslIds , const std : : string & to , const QString & msg , bool autoSend )
2010-09-27 17:05:52 -04:00
{
// std::cerr << "MessageComposer::recommendFriend()" << std::endl;
2012-01-23 17:38:50 -05:00
if ( sslIds . size ( ) = = 0 ) {
2010-09-27 17:05:52 -04:00
return ;
2010-07-15 07:25:34 -04:00
}
2010-09-27 17:05:52 -04:00
2012-02-09 14:18:15 -05:00
QString recommendHtml = buildRecommendHtml ( sslIds , to ) ;
if ( recommendHtml . isEmpty ( ) ) {
return ;
}
2010-09-27 17:05:52 -04:00
/* create a message */
2012-05-05 18:20:05 -04:00
MessageComposer * composer = MessageComposer : : newMsg ( ) ;
2010-09-27 17:05:52 -04:00
2012-05-05 18:20:05 -04:00
composer - > setTitleText ( tr ( " You have a friend recommendation " ) ) ;
composer - > msgFlags | = RS_MSG_FRIEND_RECOMMENDATION ;
2010-09-27 17:05:52 -04:00
2012-02-09 14:18:15 -05:00
if ( ! to . empty ( ) ) {
2012-05-05 18:20:05 -04:00
composer - > addRecipient ( TO , to , false ) ;
2012-02-09 14:18:15 -05:00
}
2012-05-14 10:14:38 -04:00
std : : string ownId = rsPeers - > getOwnId ( ) ;
RetroShareLink link ;
link . createPerson ( ownId ) ;
2012-02-09 14:18:15 -05:00
QString sMsgText = msg . isEmpty ( ) ? recommendMessage ( ) : msg ;
2010-09-27 17:05:52 -04:00
sMsgText + = " <br><br> " ;
2012-02-09 14:18:15 -05:00
sMsgText + = recommendHtml ;
2012-05-14 10:14:38 -04:00
sMsgText + = " <br> " ;
sMsgText + = tr ( " This friend is suggested by " ) + " " + link . toHtml ( ) + " <br><br> " ;
sMsgText + = tr ( " Thanks, <br>The RetroShare Team " ) ;
2012-05-05 18:20:05 -04:00
composer - > setMsgText ( sMsgText ) ;
2010-07-15 07:25:34 -04:00
2012-02-09 14:18:15 -05:00
std : : list < std : : string > : : const_iterator peerIt ;
2012-01-23 17:38:50 -05:00
for ( peerIt = sslIds . begin ( ) ; peerIt ! = sslIds . end ( ) ; peerIt + + ) {
2012-02-09 14:18:15 -05:00
if ( * peerIt = = to ) {
continue ;
}
2012-05-05 18:20:05 -04:00
composer - > addRecipient ( CC , * peerIt , false ) ;
2011-06-14 16:42:32 -04:00
}
2012-02-09 14:18:15 -05:00
if ( autoSend ) {
2012-05-05 18:20:05 -04:00
if ( composer - > sendMessage_internal ( false ) ) {
composer - > close ( ) ;
2012-02-09 14:18:15 -05:00
return ;
}
}
2012-05-05 18:20:05 -04:00
composer - > show ( ) ;
2010-07-15 07:25:34 -04:00
/* window will destroy itself! */
}
2012-05-01 05:18:55 -04:00
void MessageComposer : : sendConnectAttemptMsg ( const std : : string & gpgId , const std : : string & sslId , const QString & sslName )
2012-04-26 19:41:14 -04:00
{
if ( gpgId . empty ( ) ) {
return ;
}
2012-05-01 05:18:55 -04:00
RetroShareLink link ;
if ( link . createUnknwonSslCertificate ( sslId , gpgId ) = = false ) {
return ;
}
2012-05-09 09:49:23 -04:00
QString title = QString ( " %1 %2 " ) . arg ( sslName , tr ( " wants to be friends with you on RetroShare " ) ) ;
2012-04-26 19:41:14 -04:00
/* search for an exisiting message in the inbox */
std : : list < MsgInfoSummary > msgList ;
std : : list < MsgInfoSummary > : : const_iterator it ;
rsMsgs - > getMessageSummaries ( msgList ) ;
for ( it = msgList . begin ( ) ; it ! = msgList . end ( ) ; it + + ) {
if ( it - > msgflags & RS_MSG_TRASH ) {
continue ;
}
if ( ( it - > msgflags & RS_MSG_BOXMASK ) ! = RS_MSG_INBOX ) {
continue ;
}
2012-05-01 05:18:55 -04:00
if ( ( it - > msgflags & RS_MSG_USER_REQUEST ) = = 0 ) {
continue ;
}
2012-04-26 19:41:14 -04:00
if ( it - > title = = title . toStdWString ( ) ) {
return ;
}
}
/* create a message */
2012-05-09 09:49:23 -04:00
QString msgText = tr ( " Hi %1,<br><br>%2 wants to be friends with you on RetroShare.<br><br>Respond now:<br>%3<br><br>Thanks,<br>The RetroShare Team " ) . arg ( QString : : fromUtf8 ( rsPeers - > getGPGName ( rsPeers - > getGPGOwnId ( ) ) . c_str ( ) ) , sslName , link . toHtml ( ) ) ;
2012-05-01 05:18:55 -04:00
rsMsgs - > SystemMessage ( title . toStdWString ( ) , msgText . toStdWString ( ) , RS_MSG_USER_REQUEST ) ;
2012-04-26 19:41:14 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : closeEvent ( QCloseEvent * event )
2007-11-18 18:35:53 -05:00
{
2010-05-25 05:32:14 -04:00
bool bClose = true ;
/* Save to Drafts? */
if ( ui . msgText - > document ( ) - > isModified ( ) ) {
QMessageBox : : StandardButton ret ;
ret = QMessageBox : : warning ( this , tr ( " Save Message " ) ,
tr ( " Message has not been Sent. \n "
" Do you want to save message to draft box? " ) ,
QMessageBox : : Yes | QMessageBox : : No | QMessageBox : : Cancel ) ;
switch ( ret ) {
case QMessageBox : : Yes :
sendMessage_internal ( true ) ;
break ;
case QMessageBox : : Cancel :
bClose = false ;
break ;
default :
break ;
}
}
2009-02-11 13:43:37 -05:00
2010-05-25 05:32:14 -04:00
if ( bClose ) {
Settings - > saveWidgetInformation ( this ) ;
2009-02-11 13:43:37 -05:00
2010-09-27 17:05:52 -04:00
// save settings
processSettings ( false ) ;
2010-05-25 05:32:14 -04:00
QMainWindow : : closeEvent ( event ) ;
} else {
event - > ignore ( ) ;
2008-03-31 17:02:12 -04:00
}
2007-11-18 18:35:53 -05:00
}
2007-11-14 22:18:48 -05:00
2012-09-07 17:28:25 -04:00
void MessageComposer : : contextMenu ( QPoint point )
2010-11-21 16:12:35 -05:00
{
2012-09-07 17:28:25 -04:00
QMenu * contextMnu = ui . msgText - > createStandardContextMenu ( point ) ;
2010-11-21 16:12:35 -05:00
contextMnu - > addSeparator ( ) ;
QAction * action = contextMnu - > addAction ( QIcon ( " :/images/pasterslink.png " ) , tr ( " Paste RetroShare Link " ) , this , SLOT ( pasteLink ( ) ) ) ;
action - > setDisabled ( RSLinkClipboard : : empty ( ) ) ;
contextMnu - > exec ( QCursor : : pos ( ) ) ;
delete ( contextMnu ) ;
}
void MessageComposer : : pasteLink ( )
{
ui . msgText - > insertHtml ( RSLinkClipboard : : toHtml ( ) ) ;
}
void MessageComposer : : contextMenuFileList ( QPoint )
{
QMenu contextMnu ( this ) ;
QAction * action = contextMnu . addAction ( QIcon ( " :/images/pasterslink.png " ) , tr ( " Paste RetroShare Link " ) , this , SLOT ( pasteRecommended ( ) ) ) ;
action - > setDisabled ( RSLinkClipboard : : empty ( RetroShareLink : : TYPE_FILE ) ) ;
contextMnu . exec ( QCursor : : pos ( ) ) ;
}
2011-05-21 12:26:00 -04:00
void MessageComposer : : contextMenuMsgSendList ( QPoint )
{
2012-01-26 19:32:17 -05:00
QMenu contextMnu ( this ) ;
int selectedCount = ui . friendSelectionWidget - > selectedItemCount ( ) ;
2011-05-21 12:26:00 -04:00
2012-01-26 19:32:17 -05:00
FriendSelectionWidget : : IdType idType ;
ui . friendSelectionWidget - > selectedId ( idType ) ;
2011-05-21 12:26:00 -04:00
QAction * action = contextMnu . addAction ( QIcon ( ) , tr ( " Add to \" To \" " ) , this , SLOT ( addTo ( ) ) ) ;
action - > setEnabled ( selectedCount ) ;
action = contextMnu . addAction ( QIcon ( ) , tr ( " Add to \" CC \" " ) , this , SLOT ( addCc ( ) ) ) ;
action - > setEnabled ( selectedCount ) ;
action = contextMnu . addAction ( QIcon ( ) , tr ( " Add to \" BCC \" " ) , this , SLOT ( addBcc ( ) ) ) ;
action - > setEnabled ( selectedCount ) ;
action = contextMnu . addAction ( QIcon ( ) , tr ( " Add as Recommend " ) , this , SLOT ( addRecommend ( ) ) ) ;
action - > setEnabled ( selectedCount ) ;
contextMnu . addSeparator ( ) ;
action = contextMnu . addAction ( QIcon ( IMAGE_FRIENDINFO ) , tr ( " Friend Details " ) , this , SLOT ( friendDetails ( ) ) ) ;
2012-01-26 19:32:17 -05:00
action - > setEnabled ( selectedCount = = 1 & & idType = = FriendSelectionWidget : : IDTYPE_SSL ) ;
2011-05-21 12:26:00 -04:00
2012-01-26 19:32:17 -05:00
contextMnu . exec ( QCursor : : pos ( ) ) ;
2011-05-21 12:26:00 -04:00
}
2010-11-21 16:12:35 -05:00
void MessageComposer : : pasteRecommended ( )
{
2011-09-11 18:07:24 -04:00
QList < RetroShareLink > links ;
2010-11-21 16:12:35 -05:00
RSLinkClipboard : : pasteLinks ( links ) ;
2011-09-11 18:07:24 -04:00
for ( int i = 0 ; i < links . size ( ) ; i + + ) {
2010-11-21 16:12:35 -05:00
if ( links [ i ] . valid ( ) & & links [ i ] . type ( ) = = RetroShareLink : : TYPE_FILE ) {
FileInfo fileInfo ;
fileInfo . fname = links [ i ] . name ( ) . toStdString ( ) ;
fileInfo . hash = links [ i ] . hash ( ) . toStdString ( ) ;
fileInfo . size = links [ i ] . size ( ) ;
addFile ( fileInfo ) ;
}
}
}
2010-09-27 17:05:52 -04:00
static void setNewCompleter ( QTableWidget * tableWidget , QCompleter * completer )
2007-11-14 22:18:48 -05:00
{
2010-09-27 17:05:52 -04:00
int rowCount = tableWidget - > rowCount ( ) ;
int row ;
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
for ( row = 0 ; row < rowCount ; row + + ) {
QLineEdit * lineEdit = dynamic_cast < QLineEdit * > ( tableWidget - > cellWidget ( row , COLUMN_RECIPIENT_NAME ) ) ;
if ( lineEdit ) {
lineEdit - > setCompleter ( completer ) ;
}
}
}
2012-01-26 19:32:17 -05:00
void MessageComposer : : buildCompleter ( )
2010-09-27 17:05:52 -04:00
{
// get existing groups
std : : list < RsGroupInfo > groupInfoList ;
std : : list < RsGroupInfo > : : iterator groupIt ;
rsPeers - > getGroupInfoList ( groupInfoList ) ;
std : : list < std : : string > peers ;
std : : list < std : : string > : : iterator peerIt ;
rsPeers - > getFriendList ( peers ) ;
// create completer list for friends
QStringList completerList ;
QStringList completerGroupList ;
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
for ( peerIt = peers . begin ( ) ; peerIt ! = peers . end ( ) ; peerIt + + ) {
RsPeerDetails detail ;
if ( ! rsPeers - > getPeerDetails ( * peerIt , detail ) ) {
continue ; /* BAD */
}
2007-11-14 22:18:48 -05:00
2010-09-28 16:33:34 -04:00
QString name = PeerDefs : : nameWithLocation ( detail ) ;
2010-09-27 17:05:52 -04:00
if ( completerList . indexOf ( name ) = = - 1 ) {
completerList . append ( name ) ;
}
}
completerList . sort ( ) ;
// create completer list for groups
for ( groupIt = groupInfoList . begin ( ) ; groupIt ! = groupInfoList . end ( ) ; groupIt + + ) {
completerGroupList . append ( GroupDefs : : name ( * groupIt ) ) ;
}
completerGroupList . sort ( ) ;
completerList . append ( completerGroupList ) ;
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
m_completer = new QCompleter ( completerList , this ) ;
m_completer - > setCaseSensitivity ( Qt : : CaseInsensitive ) ;
setNewCompleter ( ui . recipientWidget , m_completer ) ;
}
void MessageComposer : : peerStatusChanged ( const QString & peer_id , int status )
{
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + ) {
enumType type ;
std : : string id ;
bool group ;
if ( getRecipientFromRow ( row , type , id , group ) & & id . empty ( ) = = false ) {
if ( group = = false & & QString : : fromStdString ( id ) = = peer_id ) {
QTableWidgetItem * item = ui . recipientWidget - > item ( row , COLUMN_RECIPIENT_ICON ) ;
if ( item ) {
item - > setIcon ( QIcon ( StatusDefs : : imageUser ( status ) ) ) ;
}
}
}
}
}
2007-11-14 22:18:48 -05:00
2012-05-04 19:39:36 -04:00
void MessageComposer : : setFileList ( const std : : list < DirDetails > & dir_info )
2010-04-26 17:11:19 -04:00
{
2010-09-27 17:05:52 -04:00
std : : list < FileInfo > files_info ;
std : : list < DirDetails > : : const_iterator it ;
/* convert dir_info to files_info */
for ( it = dir_info . begin ( ) ; it ! = dir_info . end ( ) ; it + + )
{
FileInfo info ;
info . fname = it - > name ;
info . hash = it - > hash ;
info . size = it - > count ;
files_info . push_back ( info ) ;
}
2010-04-26 17:11:19 -04:00
2012-05-04 19:39:36 -04:00
setFileList ( files_info ) ;
2010-04-26 17:11:19 -04:00
}
2012-05-04 19:39:36 -04:00
void MessageComposer : : setFileList ( const std : : list < FileInfo > & files_info )
2007-11-14 22:18:48 -05:00
{
2010-09-27 17:05:52 -04:00
_recList . clear ( ) ;
2007-11-14 22:18:48 -05:00
2010-11-07 16:33:48 -05:00
ui . msgFileList - > clear ( ) ;
2007-11-14 22:18:48 -05:00
2010-11-07 16:33:48 -05:00
std : : list < FileInfo > : : const_iterator it ;
for ( it = files_info . begin ( ) ; it ! = files_info . end ( ) ; it + + ) {
addFile ( * it ) ;
}
2009-05-17 15:38:42 -04:00
2010-11-07 16:33:48 -05:00
ui . msgFileList - > update ( ) ; /* update display */
}
2007-11-14 22:18:48 -05:00
2010-11-07 16:33:48 -05:00
void MessageComposer : : addFile ( const FileInfo & fileInfo )
{
2010-11-26 10:32:46 -05:00
for ( std : : list < FileInfo > : : iterator it = _recList . begin ( ) ; it ! = _recList . end ( ) ; it + + ) {
if ( it - > hash = = fileInfo . hash ) {
/* File already added */
return ;
}
}
2010-11-07 16:33:48 -05:00
_recList . push_back ( fileInfo ) ;
2007-11-14 22:18:48 -05:00
2010-11-07 16:33:48 -05:00
/* make a widget per person */
QTreeWidgetItem * item = new QTreeWidgetItem ;
2007-11-14 22:18:48 -05:00
2010-11-07 16:33:48 -05:00
item - > setText ( COLUMN_FILE_NAME , QString : : fromUtf8 ( fileInfo . fname . c_str ( ) ) ) ;
item - > setText ( COLUMN_FILE_SIZE , misc : : friendlyUnit ( fileInfo . size ) ) ;
item - > setText ( COLUMN_FILE_HASH , QString : : fromStdString ( fileInfo . hash ) ) ;
item - > setFlags ( Qt : : ItemIsUserCheckable | Qt : : ItemIsEnabled ) ;
2010-11-12 18:48:12 -05:00
item - > setCheckState ( COLUMN_FILE_CHECKED , Qt : : Checked ) ;
2007-11-14 22:18:48 -05:00
2010-11-07 16:33:48 -05:00
/* add to the list */
ui . msgFileList - > addTopLevelItem ( item ) ;
2007-11-14 22:18:48 -05:00
}
2010-07-07 19:03:34 -04:00
/* title changed */
void MessageComposer : : titleChanged ( )
2007-11-14 22:18:48 -05:00
{
2010-07-07 19:03:34 -04:00
calculateTitle ( ) ;
ui . msgText - > document ( ) - > setModified ( true ) ;
}
2010-01-21 11:35:00 -05:00
2010-07-07 19:03:34 -04:00
void MessageComposer : : calculateTitle ( )
{
2010-11-09 14:57:05 -05:00
setWindowTitle ( tr ( " Compose " ) + " : " + misc : : removeNewLine ( ui . titleEdit - > text ( ) ) ) ;
2010-09-27 17:05:52 -04:00
}
static void calculateGroupsOfSslIds ( std : : list < RsGroupInfo > & existingGroupInfos , std : : list < std : : string > & checkSslIds , std : : list < std : : string > & checkGroupIds )
{
checkGroupIds . clear ( ) ;
if ( checkSslIds . empty ( ) ) {
// nothing to do
return ;
}
std : : map < std : : string , std : : string > sslToGpg ;
std : : map < std : : string , std : : list < std : : string > > gpgToSslIds ;
std : : list < RsGroupInfo > groupInfos ;
// iterate all groups
std : : list < RsGroupInfo > : : iterator groupInfoIt ;
for ( groupInfoIt = existingGroupInfos . begin ( ) ; groupInfoIt ! = existingGroupInfos . end ( ) ; groupInfoIt + + ) {
if ( groupInfoIt - > peerIds . empty ( ) ) {
continue ;
}
// iterate all assigned peers (gpg id's)
std : : list < std : : string > : : iterator peerIt ;
for ( peerIt = groupInfoIt - > peerIds . begin ( ) ; peerIt ! = groupInfoIt - > peerIds . end ( ) ; peerIt + + ) {
std : : list < std : : string > sslIds ;
std : : map < std : : string , std : : list < std : : string > > : : iterator it = gpgToSslIds . find ( * peerIt ) ;
if ( it = = gpgToSslIds . end ( ) ) {
2011-08-07 17:14:09 -04:00
rsPeers - > getAssociatedSSLIds ( * peerIt , sslIds ) ;
2010-09-27 17:05:52 -04:00
gpgToSslIds [ * peerIt ] = sslIds ;
} else {
sslIds = it - > second ;
}
// iterate all ssl id's
std : : list < std : : string > : : const_iterator sslIt ;
for ( sslIt = sslIds . begin ( ) ; sslIt ! = sslIds . end ( ) ; sslIt + + ) {
// search in ssl list
if ( std : : find ( checkSslIds . begin ( ) , checkSslIds . end ( ) , * sslIt ) = = checkSslIds . end ( ) ) {
// not found
break ;
}
}
if ( sslIt ! = sslIds . end ( ) ) {
// one or more ssl id's not found
break ;
}
}
if ( peerIt = = groupInfoIt - > peerIds . end ( ) ) {
// all ssl id's of all assigned gpg id's found
groupInfos . push_back ( * groupInfoIt ) ;
}
}
// remove all ssl id's of all found groups from the list
for ( groupInfoIt = groupInfos . begin ( ) ; groupInfoIt ! = groupInfos . end ( ) ; groupInfoIt + + ) {
// iterate all assigned peers (gpg id's)
std : : list < std : : string > : : iterator peerIt ;
for ( peerIt = groupInfoIt - > peerIds . begin ( ) ; peerIt ! = groupInfoIt - > peerIds . end ( ) ; peerIt + + ) {
std : : list < std : : string > sslIds ;
std : : map < std : : string , std : : list < std : : string > > : : iterator it = gpgToSslIds . find ( * peerIt ) ;
if ( it = = gpgToSslIds . end ( ) ) {
2011-08-07 17:14:09 -04:00
rsPeers - > getAssociatedSSLIds ( * peerIt , sslIds ) ;
2010-09-27 17:05:52 -04:00
gpgToSslIds [ * peerIt ] = sslIds ;
} else {
sslIds = it - > second ;
}
// iterate all ssl id's
std : : list < std : : string > : : const_iterator sslIt ;
for ( sslIt = sslIds . begin ( ) ; sslIt ! = sslIds . end ( ) ; sslIt + + ) {
// search in ssl list
std : : list < std : : string > : : iterator it = std : : find ( checkSslIds . begin ( ) , checkSslIds . end ( ) , * sslIt ) ;
if ( it ! = checkSslIds . end ( ) ) {
checkSslIds . erase ( it ) ;
}
}
}
checkGroupIds . push_back ( groupInfoIt - > id ) ;
}
2010-07-07 19:03:34 -04:00
}
2010-01-21 11:35:00 -05:00
2012-02-08 07:11:15 -05:00
MessageComposer * MessageComposer : : newMsg ( const std : : string & msgId /* = ""*/ )
2010-07-07 19:03:34 -04:00
{
2010-11-02 17:11:11 -04:00
MessageComposer * msgComposer = new MessageComposer ( ) ;
2010-05-25 05:32:14 -04:00
2010-11-02 17:11:11 -04:00
msgComposer - > addEmptyRecipient ( ) ;
2010-05-25 05:32:14 -04:00
2010-11-02 17:11:11 -04:00
if ( msgId . empty ( ) = = false ) {
2010-05-25 05:32:14 -04:00
// fill existing message
MessageInfo msgInfo ;
2010-11-02 17:11:11 -04:00
if ( ! rsMsgs - > getMessage ( msgId , msgInfo ) ) {
2010-05-25 05:32:14 -04:00
std : : cerr < < " MessageComposer::newMsg() Couldn't find Msg " < < std : : endl ;
2010-11-02 17:11:11 -04:00
delete msgComposer ;
return NULL ;
2010-05-25 05:32:14 -04:00
}
2010-09-11 06:39:40 -04:00
if ( msgInfo . msgflags & RS_MSG_DRAFT ) {
2010-11-02 17:11:11 -04:00
msgComposer - > m_sDraftMsgId = msgId ;
rsMsgs - > getMsgParentId ( msgId , msgComposer - > m_msgParentId ) ;
if ( msgInfo . msgflags & RS_MSG_REPLIED ) {
msgComposer - > m_msgType = REPLY ;
} else if ( msgInfo . msgflags & RS_MSG_FORWARDED ) {
msgComposer - > m_msgType = FORWARD ;
}
2010-09-11 06:39:40 -04:00
}
2010-06-14 14:16:32 -04:00
2012-05-01 05:18:55 -04:00
// needed to send system flags with reply
2012-05-05 18:20:05 -04:00
msgComposer - > msgFlags = ( msgInfo . msgflags & RS_MSG_SYSTEM ) ;
2012-05-01 05:18:55 -04:00
2012-05-04 19:39:36 -04:00
msgComposer - > setTitleText ( QString : : fromStdWString ( msgInfo . title ) ) ;
2012-09-30 12:20:38 -04:00
msgComposer - > setMsgText ( QString : : fromStdWString ( msgInfo . msg ) ) ;
2012-05-04 19:39:36 -04:00
msgComposer - > setFileList ( msgInfo . files ) ;
2010-05-25 05:32:14 -04:00
2010-09-27 17:05:52 -04:00
// get existing groups
std : : list < RsGroupInfo > groupInfoList ;
rsPeers - > getGroupInfoList ( groupInfoList ) ;
std : : list < std : : string > groupIds ;
std : : list < std : : string > : : iterator groupIt ;
std : : list < std : : string > : : iterator it ;
calculateGroupsOfSslIds ( groupInfoList , msgInfo . msgto , groupIds ) ;
for ( groupIt = groupIds . begin ( ) ; groupIt ! = groupIds . end ( ) ; groupIt + + ) {
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : TO , * groupIt , true ) ;
2010-09-27 17:05:52 -04:00
}
for ( it = msgInfo . msgto . begin ( ) ; it ! = msgInfo . msgto . end ( ) ; it + + ) {
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : TO , * it , false ) ;
2010-09-27 17:05:52 -04:00
}
calculateGroupsOfSslIds ( groupInfoList , msgInfo . msgcc , groupIds ) ;
for ( groupIt = groupIds . begin ( ) ; groupIt ! = groupIds . end ( ) ; groupIt + + ) {
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : CC , * groupIt , true ) ;
2010-09-27 17:05:52 -04:00
}
for ( it = msgInfo . msgcc . begin ( ) ; it ! = msgInfo . msgcc . end ( ) ; it + + ) {
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : CC , * it , false ) ;
2010-09-27 17:05:52 -04:00
}
calculateGroupsOfSslIds ( groupInfoList , msgInfo . msgbcc , groupIds ) ;
for ( groupIt = groupIds . begin ( ) ; groupIt ! = groupIds . end ( ) ; groupIt + + ) {
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : BCC , * groupIt , true ) ;
2010-09-27 17:05:52 -04:00
}
for ( it = msgInfo . msgbcc . begin ( ) ; it ! = msgInfo . msgbcc . end ( ) ; it + + ) {
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : BCC , * it , false ) ;
2010-05-25 05:32:14 -04:00
}
2011-05-21 12:26:00 -04:00
MsgTagInfo tagInfo ;
rsMsgs - > getMessageTag ( msgId , tagInfo ) ;
msgComposer - > m_tagIds = tagInfo . tagIds ;
msgComposer - > showTagLabels ( ) ;
2010-11-02 17:11:11 -04:00
msgComposer - > ui . msgText - > document ( ) - > setModified ( false ) ;
2010-05-25 05:32:14 -04:00
}
2010-07-07 19:03:34 -04:00
2010-11-02 17:11:11 -04:00
msgComposer - > calculateTitle ( ) ;
return msgComposer ;
2007-11-14 22:18:48 -05:00
}
2012-05-04 19:39:36 -04:00
QString MessageComposer : : buildReplyHeader ( const MessageInfo & msgInfo )
{
RetroShareLink link ;
link . createMessage ( msgInfo . srcId , " " ) ;
QString from = link . toHtml ( ) ;
QString to ;
std : : list < std : : string > : : const_iterator it ;
for ( it = msgInfo . msgto . begin ( ) ; it ! = msgInfo . msgto . end ( ) ; it + + ) {
if ( link . createMessage ( * it , " " ) ) {
if ( ! to . isEmpty ( ) ) {
to + = " , " ;
}
to + = link . toHtml ( ) ;
}
}
QString cc ;
for ( it = msgInfo . msgcc . begin ( ) ; it ! = msgInfo . msgcc . end ( ) ; it + + ) {
if ( link . createMessage ( * it , " " ) ) {
if ( ! cc . isEmpty ( ) ) {
cc + = " , " ;
}
cc + = link . toHtml ( ) ;
}
}
QString header = QString ( " <span>-----%1----- " ) . arg ( tr ( " Original Message " ) ) ;
header + = QString ( " <br><font size='3'><strong>%1: </strong>%2</font><br> " ) . arg ( tr ( " From " ) , from ) ;
header + = QString ( " <font size='3'><strong>%1: </strong>%2</font><br> " ) . arg ( tr ( " To " ) , to ) ;
if ( ! cc . isEmpty ( ) ) {
header + = QString ( " <font size='3'><strong>%1: </strong>%2</font><br> " ) . arg ( tr ( " Cc " ) , cc ) ;
}
2012-11-15 16:35:37 -05:00
header + = QString ( " <br><font size='3'><strong>%1: </strong>%2</font><br> " ) . arg ( tr ( " Sent " ) , DateTime : : formatLongDateTime ( msgInfo . ts ) ) ;
2012-05-04 19:39:36 -04:00
header + = QString ( " <font size='3'><strong>%1: </strong>%2</font></span><br> " ) . arg ( tr ( " Subject " ) , QString : : fromStdWString ( msgInfo . title ) ) ;
header + = " <br> " ;
2012-11-15 16:35:37 -05:00
header + = tr ( " On %1, %2 wrote: " ) . arg ( DateTime : : formatDateTime ( msgInfo . ts ) , from ) ;
2012-05-04 19:39:36 -04:00
return header ;
}
void MessageComposer : : setQuotedMsg ( const QString & msg , const QString & header )
{
ui . msgText - > setUndoRedoEnabled ( false ) ;
2012-09-27 16:32:28 -04:00
ui . msgText - > setText ( msg ) ;
2012-05-04 19:39:36 -04:00
QTextBlock block = ui . msgText - > document ( ) - > firstBlock ( ) ;
while ( block . isValid ( ) ) {
QTextCursor cursor = ui . msgText - > textCursor ( ) ;
cursor . setPosition ( block . position ( ) ) ;
QTextBlockFormat format ;
format . setProperty ( TextFormat : : IsBlockQuote , true ) ;
format . setLeftMargin ( block . blockFormat ( ) . leftMargin ( ) + 20 ) ;
format . setRightMargin ( block . blockFormat ( ) . rightMargin ( ) + 20 ) ;
cursor . mergeBlockFormat ( format ) ;
block = block . next ( ) ;
}
ui . msgText - > moveCursor ( QTextCursor : : Start ) ;
ui . msgText - > textCursor ( ) . insertBlock ( ) ;
ui . msgText - > moveCursor ( QTextCursor : : Start ) ;
if ( header . isEmpty ( ) ) {
ui . msgText - > insertHtml ( " <br><br> " ) ;
} else {
ui . msgText - > insertHtml ( " <br><br> " + header + " <br> " ) ;
}
ui . msgText - > moveCursor ( QTextCursor : : Start ) ;
ui . msgText - > setUndoRedoEnabled ( true ) ;
ui . msgText - > document ( ) - > setModified ( true ) ;
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
}
2010-11-02 17:11:11 -04:00
MessageComposer * MessageComposer : : replyMsg ( const std : : string & msgId , bool all )
2007-11-14 22:18:48 -05:00
{
2010-11-02 17:11:11 -04:00
MessageInfo msgInfo ;
if ( ! rsMsgs - > getMessage ( msgId , msgInfo ) ) {
return NULL ;
}
MessageComposer * msgComposer = MessageComposer : : newMsg ( ) ;
msgComposer - > m_msgParentId = msgId ;
msgComposer - > m_msgType = REPLY ;
/* fill it in */
2012-05-04 19:39:36 -04:00
msgComposer - > setTitleText ( QString : : fromStdWString ( msgInfo . title ) , REPLY ) ;
msgComposer - > setQuotedMsg ( QString : : fromStdWString ( msgInfo . msg ) , buildReplyHeader ( msgInfo ) ) ;
2010-11-02 17:11:11 -04:00
msgComposer - > addRecipient ( MessageComposer : : TO , msgInfo . srcId , false ) ;
if ( all ) {
std : : string ownId = rsPeers - > getOwnId ( ) ;
for ( std : : list < std : : string > : : iterator tli = msgInfo . msgto . begin ( ) ; tli ! = msgInfo . msgto . end ( ) ; tli + + ) {
if ( ownId ! = * tli ) {
msgComposer - > addRecipient ( MessageComposer : : TO , * tli , false ) ;
}
}
for ( std : : list < std : : string > : : iterator tli = msgInfo . msgcc . begin ( ) ; tli ! = msgInfo . msgcc . end ( ) ; tli + + ) {
if ( ownId ! = * tli ) {
msgComposer - > addRecipient ( MessageComposer : : TO , * tli , false ) ;
}
}
}
2012-05-01 05:18:55 -04:00
// needed to send system flags with reply
2012-05-05 18:20:05 -04:00
msgComposer - > msgFlags = ( msgInfo . msgflags & RS_MSG_SYSTEM ) ;
2012-05-01 05:18:55 -04:00
2010-11-02 17:11:11 -04:00
msgComposer - > calculateTitle ( ) ;
/* window will destroy itself! */
return msgComposer ;
2007-11-14 22:18:48 -05:00
}
2010-11-02 17:11:11 -04:00
MessageComposer * MessageComposer : : forwardMsg ( const std : : string & msgId )
2008-09-08 08:41:46 -04:00
{
2010-11-02 17:11:11 -04:00
MessageInfo msgInfo ;
if ( ! rsMsgs - > getMessage ( msgId , msgInfo ) ) {
return NULL ;
}
MessageComposer * msgComposer = MessageComposer : : newMsg ( ) ;
msgComposer - > m_msgParentId = msgId ;
msgComposer - > m_msgType = FORWARD ;
/* fill it in */
2012-05-04 19:39:36 -04:00
msgComposer - > setTitleText ( QString : : fromStdWString ( msgInfo . title ) , FORWARD ) ;
msgComposer - > setQuotedMsg ( QString : : fromStdWString ( msgInfo . msg ) , buildReplyHeader ( msgInfo ) ) ;
2010-11-02 17:11:11 -04:00
std : : list < FileInfo > & files_info = msgInfo . files ;
2012-05-04 19:39:36 -04:00
msgComposer - > setFileList ( files_info ) ;
2010-11-02 17:11:11 -04:00
2012-05-01 05:18:55 -04:00
// needed to send system flags with reply
2012-05-05 18:20:05 -04:00
msgComposer - > msgFlags = ( msgInfo . msgflags & RS_MSG_SYSTEM ) ;
2012-05-01 05:18:55 -04:00
2010-11-02 17:11:11 -04:00
msgComposer - > calculateTitle ( ) ;
/* window will destroy itself! */
return msgComposer ;
}
2012-05-04 19:39:36 -04:00
void MessageComposer : : setTitleText ( const QString & title , enumMessageType type )
2010-11-02 17:11:11 -04:00
{
QString titleText ;
switch ( type ) {
case NORMAL :
titleText = title ;
break ;
case REPLY :
if ( title . startsWith ( " Re: " , Qt : : CaseInsensitive ) ) {
titleText = title ;
} else {
titleText = tr ( " Re: " ) + " " + title ;
}
break ;
case FORWARD :
if ( title . startsWith ( " Fwd: " , Qt : : CaseInsensitive ) ) {
titleText = title ;
} else {
titleText = tr ( " Fwd: " ) + " " + title ;
}
break ;
}
2010-11-09 14:57:05 -05:00
ui . titleEdit - > setText ( misc : : removeNewLine ( titleText ) ) ;
2010-11-02 17:11:11 -04:00
}
2012-05-04 19:39:36 -04:00
void MessageComposer : : setMsgText ( const QString & msg , bool asHtml )
2007-11-14 22:18:48 -05:00
{
2012-04-26 19:41:14 -04:00
if ( asHtml ) {
ui . msgText - > setHtml ( msg ) ;
} else {
ui . msgText - > setText ( msg ) ;
}
2010-05-25 05:32:14 -04:00
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
QTextCursor c = ui . msgText - > textCursor ( ) ;
c . movePosition ( QTextCursor : : End ) ;
ui . msgText - > setTextCursor ( c ) ;
ui . msgText - > document ( ) - > setModified ( true ) ;
2007-11-14 22:18:48 -05:00
}
2012-02-09 14:18:15 -05:00
void MessageComposer : : sendMessage ( )
2007-11-14 22:18:48 -05:00
{
2010-10-29 16:57:23 -04:00
if ( sendMessage_internal ( false ) ) {
close ( ) ;
}
2010-05-25 05:32:14 -04:00
}
2007-11-14 22:18:48 -05:00
2010-10-29 16:57:23 -04:00
bool MessageComposer : : sendMessage_internal ( bool bDraftbox )
2010-05-25 05:32:14 -04:00
{
/* construct a message */
MessageInfo mi ;
2008-02-04 12:55:59 -05:00
2010-11-09 14:57:05 -05:00
mi . title = misc : : removeNewLine ( ui . titleEdit - > text ( ) ) . toStdWString ( ) ;
2012-05-01 05:18:55 -04:00
// needed to send system flags with reply
2012-05-05 18:20:05 -04:00
mi . msgflags = msgFlags ;
2010-05-25 05:32:14 -04:00
2011-09-29 05:20:09 -04:00
QString text ;
RsHtml : : optimizeHtml ( ui . msgText , text ) ;
2012-05-04 19:39:36 -04:00
mi . msg = text . toStdWString ( ) ;
2011-09-09 15:54:17 -04:00
2010-10-29 16:57:23 -04:00
/* check for existing title */
if ( bDraftbox = = false & & mi . title . empty ( ) ) {
if ( QMessageBox : : warning ( this , tr ( " RetroShare " ) , tr ( " Do you want to send the message without a subject ? " ) , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No ) = = QMessageBox : : No ) {
2011-01-31 15:35:09 -05:00
ui . titleEdit - > setFocus ( ) ;
2010-10-29 16:57:23 -04:00
return false ; // Don't send with an empty subject
}
}
2010-11-12 18:48:12 -05:00
int filesCount = ui . msgFileList - > topLevelItemCount ( ) ;
for ( int i = 0 ; i < filesCount ; i + + ) {
QTreeWidgetItem * item = ui . msgFileList - > topLevelItem ( i ) ;
if ( item - > checkState ( COLUMN_FILE_CHECKED ) ) {
std : : string hash = item - > text ( COLUMN_FILE_HASH ) . toStdString ( ) ;
for ( std : : list < FileInfo > : : iterator it = _recList . begin ( ) ; it ! = _recList . end ( ) ; it + + ) {
if ( it - > hash = = hash ) {
mi . files . push_back ( * it ) ;
break ;
}
}
}
}
2007-11-14 22:18:48 -05:00
2010-05-25 05:32:14 -04:00
/* get the ids from the send list */
std : : list < std : : string > peers ;
rsPeers - > getFriendList ( peers ) ;
2007-11-14 22:18:48 -05:00
2012-04-26 19:41:14 -04:00
/* add own id */
peers . push_back ( rsPeers - > getOwnId ( ) ) ;
2010-09-27 17:05:52 -04:00
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + ) {
enumType type ;
std : : string id ;
bool group ;
if ( getRecipientFromRow ( row , type , id , group ) & & id . empty ( ) = = false ) {
if ( group ) {
RsGroupInfo groupInfo ;
if ( rsPeers - > getGroupInfo ( id , groupInfo ) = = false ) {
// group not found
continue ;
}
std : : list < std : : string > : : const_iterator groupIt ;
for ( groupIt = groupInfo . peerIds . begin ( ) ; groupIt ! = groupInfo . peerIds . end ( ) ; groupIt + + ) {
std : : list < std : : string > sslIds ;
2011-08-07 17:14:09 -04:00
rsPeers - > getAssociatedSSLIds ( * groupIt , sslIds ) ;
2010-09-27 17:05:52 -04:00
std : : list < std : : string > : : const_iterator sslIt ;
for ( sslIt = sslIds . begin ( ) ; sslIt ! = sslIds . end ( ) ; sslIt + + ) {
if ( std : : find ( peers . begin ( ) , peers . end ( ) , * sslIt ) = = peers . end ( ) ) {
// no friend
continue ;
}
switch ( type ) {
case TO :
if ( std : : find ( mi . msgto . begin ( ) , mi . msgto . end ( ) , * sslIt ) = = mi . msgto . end ( ) ) {
mi . msgto . push_back ( * sslIt ) ;
}
break ;
case CC :
if ( std : : find ( mi . msgcc . begin ( ) , mi . msgcc . end ( ) , * sslIt ) = = mi . msgcc . end ( ) ) {
mi . msgcc . push_back ( * sslIt ) ;
}
break ;
case BCC :
if ( std : : find ( mi . msgbcc . begin ( ) , mi . msgbcc . end ( ) , * sslIt ) = = mi . msgbcc . end ( ) ) {
mi . msgbcc . push_back ( * sslIt ) ;
}
break ;
}
}
}
} else {
2013-05-01 17:13:40 -04:00
if ( _distant_peers . find ( id ) = = _distant_peers . end ( ) & & std : : find ( peers . begin ( ) , peers . end ( ) , id ) = = peers . end ( ) ) {
2010-09-27 17:05:52 -04:00
// no friend
continue ;
}
switch ( type ) {
case TO :
if ( std : : find ( mi . msgto . begin ( ) , mi . msgto . end ( ) , id ) = = mi . msgto . end ( ) ) {
mi . msgto . push_back ( id ) ;
}
break ;
case CC :
if ( std : : find ( mi . msgcc . begin ( ) , mi . msgcc . end ( ) , id ) = = mi . msgcc . end ( ) ) {
mi . msgcc . push_back ( id ) ;
}
break ;
case BCC :
if ( std : : find ( mi . msgbcc . begin ( ) , mi . msgbcc . end ( ) , id ) = = mi . msgbcc . end ( ) ) {
mi . msgbcc . push_back ( id ) ;
}
break ;
}
}
2010-05-25 05:32:14 -04:00
}
}
2007-11-14 22:18:48 -05:00
2010-05-25 05:32:14 -04:00
if ( bDraftbox ) {
2010-09-11 06:39:40 -04:00
mi . msgId = m_sDraftMsgId ;
2010-11-02 17:11:11 -04:00
rsMsgs - > MessageToDraft ( mi , m_msgParentId ) ;
2010-09-11 06:39:40 -04:00
// use new message id
m_sDraftMsgId = mi . msgId ;
2010-11-02 17:11:11 -04:00
switch ( m_msgType ) {
case NORMAL :
break ;
case REPLY :
rsMsgs - > MessageReplied ( m_sDraftMsgId , true ) ;
break ;
case FORWARD :
rsMsgs - > MessageForwarded ( m_sDraftMsgId , true ) ;
break ;
}
2010-05-25 05:32:14 -04:00
} else {
2010-10-29 16:57:23 -04:00
/* check for the recipient */
if ( mi . msgto . empty ( ) ) {
QMessageBox : : warning ( this , tr ( " RetroShare " ) , tr ( " Please insert at least one recipient. " ) , QMessageBox : : Ok ) ;
return false ; // Don't send with no recipient
}
2013-05-03 17:02:44 -04:00
mi . encryption_keys = _distant_peers ;
2013-08-04 10:11:59 -04:00
if ( ui . signMessage_CB - > isChecked ( ) )
mi . msgflags | = RS_MSG_SIGNED ;
2010-11-02 17:11:11 -04:00
if ( rsMsgs - > MessageSend ( mi ) = = false ) {
return false ;
}
if ( m_msgParentId . empty ( ) = = false ) {
switch ( m_msgType ) {
case NORMAL :
break ;
case REPLY :
rsMsgs - > MessageReplied ( m_msgParentId , true ) ;
break ;
case FORWARD :
rsMsgs - > MessageForwarded ( m_msgParentId , true ) ;
break ;
}
}
2010-05-25 05:32:14 -04:00
}
2007-11-14 22:18:48 -05:00
2011-05-21 12:26:00 -04:00
if ( mi . msgId . empty ( ) = = false ) {
MsgTagInfo tagInfo ;
rsMsgs - > getMessageTag ( mi . msgId , tagInfo ) ;
/* insert new tags */
std : : list < uint32_t > : : iterator tag ;
for ( tag = m_tagIds . begin ( ) ; tag ! = m_tagIds . end ( ) ; tag + + ) {
if ( std : : find ( tagInfo . tagIds . begin ( ) , tagInfo . tagIds . end ( ) , * tag ) = = tagInfo . tagIds . end ( ) ) {
rsMsgs - > setMessageTag ( mi . msgId , * tag , true ) ;
} else {
tagInfo . tagIds . remove ( * tag ) ;
}
}
/* remove deleted tags */
for ( tag = tagInfo . tagIds . begin ( ) ; tag ! = tagInfo . tagIds . end ( ) ; tag + + ) {
rsMsgs - > setMessageTag ( mi . msgId , * tag , false ) ;
}
}
2010-05-25 05:32:14 -04:00
ui . msgText - > document ( ) - > setModified ( false ) ;
2010-10-29 16:57:23 -04:00
return true ;
2010-05-25 05:32:14 -04:00
}
2007-11-14 22:18:48 -05:00
2010-05-23 15:13:41 -04:00
void MessageComposer : : cancelMessage ( )
2007-11-14 22:18:48 -05:00
{
2010-09-27 17:05:52 -04:00
close ( ) ;
return ;
2007-11-14 22:18:48 -05:00
}
/* Toggling .... Check Boxes.....
2010-09-27 17:05:52 -04:00
* This is dependent on whether we are a
2007-11-14 22:18:48 -05:00
*
* Chan or Msg Dialog .
*/
2010-09-27 17:05:52 -04:00
void MessageComposer : : addEmptyRecipient ( )
2008-09-03 08:56:37 -04:00
{
2010-09-27 17:05:52 -04:00
int lastRow = ui . recipientWidget - > rowCount ( ) ;
if ( lastRow > 0 ) {
QTableWidgetItem * item = ui . recipientWidget - > item ( lastRow - 1 , COLUMN_RECIPIENT_DATA ) ;
if ( item & & item - > data ( ROLE_RECIPIENT_ID ) . toString ( ) . isEmpty ( ) ) {
return ;
}
}
2008-09-03 08:56:37 -04:00
2010-09-27 17:05:52 -04:00
setRecipientToRow ( lastRow , TO , " " , false ) ;
2008-09-03 08:56:37 -04:00
}
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
bool MessageComposer : : getRecipientFromRow ( int row , enumType & type , std : : string & id , bool & group )
2007-11-14 22:18:48 -05:00
{
2010-09-27 17:05:52 -04:00
if ( row > = ui . recipientWidget - > rowCount ( ) ) {
return false ;
}
QComboBox * cb = dynamic_cast < QComboBox * > ( ui . recipientWidget - > cellWidget ( row , COLUMN_RECIPIENT_TYPE ) ) ;
if ( cb = = NULL ) {
return false ;
}
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
type = ( enumType ) cb - > itemData ( cb - > currentIndex ( ) , Qt : : UserRole ) . toInt ( ) ;
id = ui . recipientWidget - > item ( row , COLUMN_RECIPIENT_DATA ) - > data ( ROLE_RECIPIENT_ID ) . toString ( ) . toStdString ( ) ;
group = ui . recipientWidget - > item ( row , COLUMN_RECIPIENT_DATA ) - > data ( ROLE_RECIPIENT_GROUP ) . toBool ( ) ;
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
return true ;
}
void MessageComposer : : setRecipientToRow ( int row , enumType type , std : : string id , bool group )
{
if ( row + 1 > ui . recipientWidget - > rowCount ( ) ) {
ui . recipientWidget - > setRowCount ( row + 1 ) ;
}
QComboBox * comboBox = dynamic_cast < QComboBox * > ( ui . recipientWidget - > cellWidget ( row , COLUMN_RECIPIENT_TYPE ) ) ;
if ( comboBox = = NULL ) {
comboBox = new QComboBox ;
comboBox - > addItem ( tr ( " To " ) , TO ) ;
comboBox - > addItem ( tr ( " Cc " ) , CC ) ;
comboBox - > addItem ( tr ( " Bcc " ) , BCC ) ;
ui . recipientWidget - > setCellWidget ( row , COLUMN_RECIPIENT_TYPE , comboBox ) ;
comboBox - > installEventFilter ( this ) ;
}
QLineEdit * lineEdit = dynamic_cast < QLineEdit * > ( ui . recipientWidget - > cellWidget ( row , COLUMN_RECIPIENT_NAME ) ) ;
if ( lineEdit = = NULL ) {
lineEdit = new QLineEdit ;
QString objectName = " lineEdit " + QString : : number ( row ) ;
lineEdit - > setObjectName ( objectName ) ;
lineEdit - > setCompleter ( m_completer ) ;
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
ui . recipientWidget - > setCellWidget ( row , COLUMN_RECIPIENT_NAME , lineEdit ) ;
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
connect ( lineEdit , SIGNAL ( editingFinished ( ) ) , this , SLOT ( editingRecipientFinished ( ) ) ) ;
lineEdit - > installEventFilter ( this ) ;
}
QIcon icon ;
QString name ;
2013-07-31 12:34:34 -04:00
if ( ! id . empty ( ) )
{
if ( group )
{
2010-09-27 17:05:52 -04:00
icon = QIcon ( IMAGE_GROUP16 ) ;
RsGroupInfo groupInfo ;
if ( rsPeers - > getGroupInfo ( id , groupInfo ) ) {
name = GroupDefs : : name ( groupInfo ) ;
} else {
name = tr ( " Unknown " ) ;
2010-09-28 19:16:50 -04:00
id . clear ( ) ;
2010-09-27 17:05:52 -04:00
}
2013-07-31 12:34:34 -04:00
}
else
{
RsPeerDetails details ;
if ( _distant_peers . find ( id ) ! = _distant_peers . end ( ) )
{
if ( ! rsPeers - > getPeerDetails ( _distant_peers [ id ] , details ) )
{
std : : cerr < < " Can't get peer details from " < < _distant_peers [ id ] < < std : : endl ;
return ;
}
name = tr ( " Distant peer (name: %2, PGP key: %1) " ) . arg ( QString : : fromStdString ( _distant_peers [ id ] ) ) . arg ( QString : : fromStdString ( details . name ) ) ;
icon = QIcon ( StatusDefs : : imageUser ( RS_STATUS_ONLINE ) ) ;
}
else if ( rsPeers - > getPeerDetails ( id , details ) & & ( ! details . isOnlyGPGdetail ) )
{
name = PeerDefs : : nameWithLocation ( details ) ;
StatusInfo peerStatusInfo ;
// No check of return value. Non existing status info is handled as offline.
rsStatus - > getStatus ( id , peerStatusInfo ) ;
icon = QIcon ( StatusDefs : : imageUser ( peerStatusInfo . status ) ) ;
}
else
{
icon = QIcon ( StatusDefs : : imageUser ( RS_STATUS_OFFLINE ) ) ;
name = tr ( " Unknown friend " ) ;
id . clear ( ) ;
}
}
2010-09-27 17:05:52 -04:00
}
comboBox - > setCurrentIndex ( comboBox - > findData ( type , Qt : : UserRole ) ) ;
lineEdit - > setText ( name ) ;
2010-09-28 19:16:50 -04:00
if ( id . empty ( ) ) {
lineEdit - > setStyleSheet ( QString ( STYLE_FAIL ) . arg ( lineEdit - > objectName ( ) ) ) ;
} else {
lineEdit - > setStyleSheet ( QString ( STYLE_NORMAL ) . arg ( lineEdit - > objectName ( ) ) ) ;
}
2010-09-27 17:05:52 -04:00
QTableWidgetItem * item = new QTableWidgetItem ( icon , " " , 0 ) ;
item - > setFlags ( Qt : : NoItemFlags ) ;
ui . recipientWidget - > setItem ( row , COLUMN_RECIPIENT_ICON , item ) ;
ui . recipientWidget - > item ( row , COLUMN_RECIPIENT_DATA ) - > setData ( ROLE_RECIPIENT_ID , QString : : fromStdString ( id ) ) ;
ui . recipientWidget - > item ( row , COLUMN_RECIPIENT_DATA ) - > setData ( ROLE_RECIPIENT_GROUP , group ) ;
addEmptyRecipient ( ) ;
}
bool MessageComposer : : eventFilter ( QObject * obj , QEvent * event )
{
if ( event - > type ( ) = = QEvent : : FocusIn ) {
QLineEdit * lineEdit = dynamic_cast < QLineEdit * > ( obj ) ;
if ( lineEdit ) {
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + ) {
if ( ui . recipientWidget - > cellWidget ( row , COLUMN_RECIPIENT_NAME ) = = lineEdit ) {
break ;
}
}
if ( row < rowCount ) {
ui . recipientWidget - > setCurrentCell ( row , COLUMN_RECIPIENT_NAME ) ;
// lineEdit->setFocus();
}
} else {
QComboBox * comboBox = dynamic_cast < QComboBox * > ( obj ) ;
if ( comboBox ) {
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + ) {
if ( ui . recipientWidget - > cellWidget ( row , COLUMN_RECIPIENT_TYPE ) = = comboBox ) {
break ;
}
}
if ( row < rowCount ) {
ui . recipientWidget - > setCurrentCell ( row , COLUMN_RECIPIENT_TYPE ) ;
// comboBox->setFocus();
}
}
2010-09-24 07:38:46 -04:00
}
}
2010-09-27 17:05:52 -04:00
// pass the event on to the parent class
return QMainWindow : : eventFilter ( obj , event ) ;
}
void MessageComposer : : editingRecipientFinished ( )
{
QLineEdit * lineEdit = dynamic_cast < QLineEdit * > ( QObject : : sender ( ) ) ;
if ( lineEdit = = NULL ) {
return ;
}
lineEdit - > setStyleSheet ( QString ( STYLE_NORMAL ) . arg ( lineEdit - > objectName ( ) ) ) ;
// find row of the widget
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + ) {
if ( ui . recipientWidget - > cellWidget ( row , COLUMN_RECIPIENT_NAME ) = = lineEdit ) {
break ;
}
}
if ( row > = rowCount ) {
// not found
return ;
}
enumType type ;
std : : string id ; // dummy
bool group ; // dummy
getRecipientFromRow ( row , type , id , group ) ;
QString text = lineEdit - > text ( ) ;
if ( text . isEmpty ( ) ) {
setRecipientToRow ( row , type , " " , false ) ;
return ;
}
// start with peers
std : : list < std : : string > peers ;
rsPeers - > getFriendList ( peers ) ;
std : : list < std : : string > : : iterator peerIt ;
for ( peerIt = peers . begin ( ) ; peerIt ! = peers . end ( ) ; peerIt + + ) {
2010-09-28 16:33:34 -04:00
RsPeerDetails details ;
if ( ! rsPeers - > getPeerDetails ( * peerIt , details ) ) {
2010-09-27 17:05:52 -04:00
continue ; /* BAD */
}
2010-09-28 16:33:34 -04:00
QString name = PeerDefs : : nameWithLocation ( details ) ;
2010-09-27 17:05:52 -04:00
if ( text . compare ( name , Qt : : CaseSensitive ) = = 0 ) {
// found it
2010-09-28 16:33:34 -04:00
setRecipientToRow ( row , type , details . id , false ) ;
2010-09-27 17:05:52 -04:00
return ;
}
}
// then groups
std : : list < RsGroupInfo > groupInfoList ;
rsPeers - > getGroupInfoList ( groupInfoList ) ;
std : : list < RsGroupInfo > : : iterator groupIt ;
for ( groupIt = groupInfoList . begin ( ) ; groupIt ! = groupInfoList . end ( ) ; groupIt + + ) {
QString groupName = GroupDefs : : name ( * groupIt ) ;
if ( text . compare ( groupName , Qt : : CaseSensitive ) = = 0 ) {
// found it
setRecipientToRow ( row , type , groupIt - > id , true ) ;
return ;
}
}
setRecipientToRow ( row , type , " " , false ) ;
lineEdit - > setStyleSheet ( QString ( STYLE_FAIL ) . arg ( lineEdit - > objectName ( ) ) ) ;
lineEdit - > setText ( text ) ;
}
2013-04-29 18:32:58 -04:00
void MessageComposer : : addRecipient ( enumType type , const std : : string & hash , const std : : string & pgp_id )
{
_distant_peers [ hash ] = pgp_id ;
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + )
{
enumType rowType ;
std : : string rowId ;
bool rowGroup ;
if ( getRecipientFromRow ( row , rowType , rowId , rowGroup ) = = true )
{
if ( rowId . empty ( ) ) // use row
break ;
if ( rowId = = hash & & rowType = = type ) // existing row
break ;
}
else // use row
break ;
}
setRecipientToRow ( row , type , hash , false ) ;
}
2010-09-27 17:05:52 -04:00
void MessageComposer : : addRecipient ( enumType type , const std : : string & id , bool group )
{
2011-05-07 19:14:09 -04:00
std : : list < std : : string > sslIds ;
if ( group ) {
sslIds . push_back ( id ) ;
} else {
// check for gpg id or ssl id
RsPeerDetails detail ;
if ( ! rsPeers - > getPeerDetails ( id , detail ) ) {
return ;
}
2010-09-27 17:05:52 -04:00
2013-10-16 16:20:41 -04:00
if ( detail . isOnlyGPGdetail )
{
2013-10-16 16:53:38 -04:00
if ( ( ! rsPeers - > getAssociatedSSLIds ( id , sslIds ) ) | | sslIds . empty ( ) )
2013-10-16 16:20:41 -04:00
{
std : : string hash ;
if ( rsMsgs - > getDistantMessageHash ( id , hash ) )
addRecipient ( type , hash , id ) ;
else
{
QMessageBox : : warning ( this , tr ( " PGP key unknown " ) , tr ( " You dont have the PGP key of the message sender. So you cannot respond! " ) , QMessageBox : : Ok ) ;
return ;
}
}
}
else {
2011-05-07 19:14:09 -04:00
sslIds . push_back ( id ) ;
}
}
std : : list < std : : string > : : const_iterator sslIt ;
for ( sslIt = sslIds . begin ( ) ; sslIt ! = sslIds . end ( ) ; sslIt + + ) {
// search existing or empty row
int rowCount = ui . recipientWidget - > rowCount ( ) ;
int row ;
for ( row = 0 ; row < rowCount ; row + + ) {
enumType rowType ;
std : : string rowId ;
bool rowGroup ;
if ( getRecipientFromRow ( row , rowType , rowId , rowGroup ) = = true ) {
if ( rowId . empty ( ) ) {
// use row
break ;
}
2010-09-27 17:05:52 -04:00
2011-05-07 19:14:09 -04:00
if ( rowId = = * sslIt & & rowType = = type & & group = = rowGroup ) {
// existing row
break ;
}
} else {
// use row
2010-09-27 17:05:52 -04:00
break ;
}
}
2011-05-07 19:14:09 -04:00
setRecipientToRow ( row , type , * sslIt , group ) ;
}
2007-11-14 22:18:48 -05:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : setupFileActions ( )
2008-11-25 20:19:09 -05:00
{
QMenu * menu = new QMenu ( tr ( " &File " ) , this ) ;
menuBar ( ) - > addMenu ( menu ) ;
QAction * a ;
a = new QAction ( QIcon ( " :/images/textedit/filenew.png " ) , tr ( " &New " ) , this ) ;
a - > setShortcut ( QKeySequence : : New ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( fileNew ( ) ) ) ;
menu - > addAction ( a ) ;
a = new QAction ( QIcon ( " :/images/textedit/fileopen.png " ) , tr ( " &Open... " ) , this ) ;
a - > setShortcut ( QKeySequence : : Open ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( fileOpen ( ) ) ) ;
menu - > addAction ( a ) ;
menu - > addSeparator ( ) ;
actionSave = a = new QAction ( QIcon ( " :/images/textedit/filesave.png " ) , tr ( " &Save " ) , this ) ;
a - > setShortcut ( QKeySequence : : Save ) ;
2010-05-25 09:22:42 -04:00
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( saveasDraft ( ) ) ) ;
2008-11-25 20:19:09 -05:00
a - > setEnabled ( false ) ;
menu - > addAction ( a ) ;
2010-05-25 09:22:42 -04:00
a = new QAction ( tr ( " Save &As File " ) , this ) ;
2008-11-25 20:19:09 -05:00
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( fileSaveAs ( ) ) ) ;
menu - > addAction ( a ) ;
2010-09-27 17:05:52 -04:00
2010-05-25 06:41:26 -04:00
a = new QAction ( tr ( " Save &As Draft " ) , this ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( saveasDraft ( ) ) ) ;
menu - > addAction ( a ) ;
2008-11-25 20:19:09 -05:00
menu - > addSeparator ( ) ;
a = new QAction ( QIcon ( " :/images/textedit/fileprint.png " ) , tr ( " &Print... " ) , this ) ;
a - > setShortcut ( QKeySequence : : Print ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( filePrint ( ) ) ) ;
menu - > addAction ( a ) ;
/*a = new QAction(QIcon(":/images/textedit/fileprint.png"), tr("Print Preview..."), this);
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( filePrintPreview ( ) ) ) ;
menu - > addAction ( a ) ; */
a = new QAction ( QIcon ( " :/images/textedit/exportpdf.png " ) , tr ( " &Export PDF... " ) , this ) ;
a - > setShortcut ( Qt : : CTRL + Qt : : Key_D ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( filePrintPdf ( ) ) ) ;
menu - > addAction ( a ) ;
menu - > addSeparator ( ) ;
a = new QAction ( tr ( " &Quit " ) , this ) ;
a - > setShortcut ( Qt : : CTRL + Qt : : Key_Q ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( close ( ) ) ) ;
menu - > addAction ( a ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : setupEditActions ( )
2008-11-25 20:19:09 -05:00
{
QMenu * menu = new QMenu ( tr ( " &Edit " ) , this ) ;
menuBar ( ) - > addMenu ( menu ) ;
QAction * a ;
a = actionUndo = new QAction ( QIcon ( " :/images/textedit/editundo.png " ) , tr ( " &Undo " ) , this ) ;
a - > setShortcut ( QKeySequence : : Undo ) ;
menu - > addAction ( a ) ;
a = actionRedo = new QAction ( QIcon ( " :/images/textedit/editredo.png " ) , tr ( " &Redo " ) , this ) ;
a - > setShortcut ( QKeySequence : : Redo ) ;
menu - > addAction ( a ) ;
menu - > addSeparator ( ) ;
a = actionCut = new QAction ( QIcon ( " :/images/textedit/editcut.png " ) , tr ( " Cu&t " ) , this ) ;
a - > setShortcut ( QKeySequence : : Cut ) ;
menu - > addAction ( a ) ;
a = actionCopy = new QAction ( QIcon ( " :/images/textedit/editcopy.png " ) , tr ( " &Copy " ) , this ) ;
a - > setShortcut ( QKeySequence : : Copy ) ;
menu - > addAction ( a ) ;
a = actionPaste = new QAction ( QIcon ( " :/images/textedit/editpaste.png " ) , tr ( " &Paste " ) , this ) ;
a - > setShortcut ( QKeySequence : : Paste ) ;
menu - > addAction ( a ) ;
actionPaste - > setEnabled ( ! QApplication : : clipboard ( ) - > text ( ) . isEmpty ( ) ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : setupViewActions ( )
2008-11-25 20:19:09 -05:00
{
QMenu * menu = new QMenu ( tr ( " &View " ) , this ) ;
menuBar ( ) - > addMenu ( menu ) ;
2010-09-27 17:05:52 -04:00
contactSidebarAction = menu - > addAction ( QIcon ( ) , tr ( " &Contacts Sidebar " ) , this , SLOT ( toggleContacts ( ) ) ) ;
contactSidebarAction - > setCheckable ( true ) ;
2008-11-25 20:19:09 -05:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : setupInsertActions ( )
2008-11-25 20:19:09 -05:00
{
QMenu * menu = new QMenu ( tr ( " &Insert " ) , this ) ;
menuBar ( ) - > addMenu ( menu ) ;
QAction * a ;
2012-09-18 18:59:23 -04:00
# if QT_VERSION >= 0x040700
// embedded images are not supported before QT 4.7.0
2008-11-25 20:19:09 -05:00
a = new QAction ( QIcon ( " " ) , tr ( " &Image " ) , this ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( addImage ( ) ) ) ;
menu - > addAction ( a ) ;
2010-11-17 07:45:46 -05:00
# endif
2010-09-27 17:05:52 -04:00
2010-05-25 13:18:12 -04:00
a = new QAction ( QIcon ( " " ) , tr ( " &Horizontal Line " ) , this ) ;
connect ( a , SIGNAL ( triggered ( ) ) , this , SLOT ( addPostSplitter ( ) ) ) ;
menu - > addAction ( a ) ;
2008-11-25 20:19:09 -05:00
}
2010-05-25 18:30:25 -04:00
void MessageComposer : : setupFormatActions ( )
{
QMenu * menu = new QMenu ( tr ( " &Format " ) , this ) ;
menuBar ( ) - > addMenu ( menu ) ;
menu - > addAction ( actionAlignLeft ) ;
menu - > addAction ( actionAlignCenter ) ;
menu - > addAction ( actionAlignRight ) ;
menu - > addAction ( actionAlignJustify ) ;
2010-09-27 17:05:52 -04:00
2010-05-25 18:30:25 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textBold ( )
2008-11-25 20:19:09 -05:00
{
QTextCharFormat fmt ;
fmt . setFontWeight ( ui . boldbtn - > isChecked ( ) ? QFont : : Bold : QFont : : Normal ) ;
mergeFormatOnWordOrSelection ( fmt ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textUnderline ( )
2008-11-25 20:19:09 -05:00
{
QTextCharFormat fmt ;
fmt . setFontUnderline ( ui . underlinebtn - > isChecked ( ) ) ;
mergeFormatOnWordOrSelection ( fmt ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textItalic ( )
2008-11-25 20:19:09 -05:00
{
QTextCharFormat fmt ;
fmt . setFontItalic ( ui . italicbtn - > isChecked ( ) ) ;
mergeFormatOnWordOrSelection ( fmt ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textFamily ( const QString & f )
2008-11-25 20:19:09 -05:00
{
QTextCharFormat fmt ;
fmt . setFontFamily ( f ) ;
mergeFormatOnWordOrSelection ( fmt ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textSize ( const QString & p )
2008-11-25 20:19:09 -05:00
{
2010-02-22 09:20:40 -05:00
qreal pointSize = p . toFloat ( ) ;
if ( p . toFloat ( ) > 0 ) {
QTextCharFormat fmt ;
fmt . setFontPointSize ( pointSize ) ;
mergeFormatOnWordOrSelection ( fmt ) ;
}
2008-11-25 20:19:09 -05:00
}
2010-05-25 13:18:12 -04:00
void MessageComposer : : changeFormatType ( int styleIndex )
{
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
QTextCursor cursor = ui . msgText - > textCursor ( ) ;
//QTextBlockFormat bformat = cursor.blockFormat();
QTextBlockFormat bformat ;
QTextCharFormat cformat ;
switch ( styleIndex ) {
default :
case 0 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 0 ) ) ;
cformat . setFontWeight ( QFont : : Normal ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( 0 ) ) ;
break ;
case 1 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 1 ) ) ;
cformat . setFontWeight ( QFont : : Bold ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( 3 ) ) ;
break ;
case 2 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 2 ) ) ;
cformat . setFontWeight ( QFont : : Bold ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( 2 ) ) ;
break ;
case 3 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 3 ) ) ;
cformat . setFontWeight ( QFont : : Bold ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( 1 ) ) ;
break ;
case 4 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 4 ) ) ;
cformat . setFontWeight ( QFont : : Bold ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( 0 ) ) ;
break ;
case 5 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 5 ) ) ;
cformat . setFontWeight ( QFont : : Bold ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( - 1 ) ) ;
break ;
case 6 :
bformat . setProperty ( TextFormat : : HtmlHeading , QVariant ( 6 ) ) ;
cformat . setFontWeight ( QFont : : Bold ) ;
cformat . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( - 2 ) ) ;
break ;
}
//cformat.clearProperty( TextFormat::HasCodeStyle );
cursor . beginEditBlock ( ) ;
cursor . mergeBlockFormat ( bformat ) ;
cursor . select ( QTextCursor : : BlockUnderCursor ) ;
cursor . mergeCharFormat ( cformat ) ;
cursor . endEditBlock ( ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textStyle ( int styleIndex )
2008-11-25 20:19:09 -05:00
{
QTextCursor cursor = ui . msgText - > textCursor ( ) ;
if ( styleIndex ! = 0 ) {
QTextListFormat : : Style style = QTextListFormat : : ListDisc ;
switch ( styleIndex ) {
default :
case 1 :
style = QTextListFormat : : ListDisc ;
break ;
case 2 :
style = QTextListFormat : : ListCircle ;
break ;
case 3 :
style = QTextListFormat : : ListSquare ;
break ;
case 4 :
style = QTextListFormat : : ListDecimal ;
break ;
case 5 :
style = QTextListFormat : : ListLowerAlpha ;
break ;
case 6 :
style = QTextListFormat : : ListUpperAlpha ;
break ;
}
cursor . beginEditBlock ( ) ;
QTextBlockFormat blockFmt = cursor . blockFormat ( ) ;
QTextListFormat listFmt ;
if ( cursor . currentList ( ) ) {
listFmt = cursor . currentList ( ) - > format ( ) ;
} else {
listFmt . setIndent ( blockFmt . indent ( ) + 1 ) ;
blockFmt . setIndent ( 0 ) ;
cursor . setBlockFormat ( blockFmt ) ;
}
listFmt . setStyle ( style ) ;
cursor . createList ( listFmt ) ;
cursor . endEditBlock ( ) ;
} else {
// ####
QTextBlockFormat bfmt ;
bfmt . setObjectIndex ( - 1 ) ;
cursor . mergeBlockFormat ( bfmt ) ;
}
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textColor ( )
2008-11-25 20:19:09 -05:00
{
QColor col = QColorDialog : : getColor ( ui . msgText - > textColor ( ) , this ) ;
if ( ! col . isValid ( ) )
return ;
QTextCharFormat fmt ;
fmt . setForeground ( col ) ;
mergeFormatOnWordOrSelection ( fmt ) ;
colorChanged ( col ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : textAlign ( QAction * a )
2008-11-25 20:19:09 -05:00
{
if ( a = = actionAlignLeft )
ui . msgText - > setAlignment ( Qt : : AlignLeft ) ;
else if ( a = = actionAlignCenter )
ui . msgText - > setAlignment ( Qt : : AlignHCenter ) ;
else if ( a = = actionAlignRight )
ui . msgText - > setAlignment ( Qt : : AlignRight ) ;
else if ( a = = actionAlignJustify )
ui . msgText - > setAlignment ( Qt : : AlignJustify ) ;
}
2010-11-10 08:35:38 -05:00
void MessageComposer : : smileyWidget ( )
{
Emoticons : : showSmileyWidget ( this , ui . emoticonButton , SLOT ( addSmileys ( ) ) , false ) ;
}
void MessageComposer : : addSmileys ( )
{
ui . msgText - > textCursor ( ) . insertText ( qobject_cast < QPushButton * > ( sender ( ) ) - > toolTip ( ) . split ( " | " ) . first ( ) ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : currentCharFormatChanged ( const QTextCharFormat & format )
2008-11-25 20:19:09 -05:00
{
fontChanged ( format . font ( ) ) ;
colorChanged ( format . foreground ( ) . color ( ) ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : cursorPositionChanged ( )
2008-11-25 20:19:09 -05:00
{
alignmentChanged ( ui . msgText - > alignment ( ) ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : mergeFormatOnWordOrSelection ( const QTextCharFormat & format )
2008-11-25 20:19:09 -05:00
{
QTextCursor cursor = ui . msgText - > textCursor ( ) ;
if ( ! cursor . hasSelection ( ) )
cursor . select ( QTextCursor : : WordUnderCursor ) ;
cursor . mergeCharFormat ( format ) ;
ui . msgText - > mergeCurrentCharFormat ( format ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : fontChanged ( const QFont & f )
2008-11-25 20:19:09 -05:00
{
ui . comboFont - > setCurrentIndex ( ui . comboFont - > findText ( QFontInfo ( f ) . family ( ) ) ) ;
ui . comboSize - > setCurrentIndex ( ui . comboSize - > findText ( QString : : number ( f . pointSize ( ) ) ) ) ;
ui . boldbtn - > setChecked ( f . bold ( ) ) ;
ui . italicbtn - > setChecked ( f . italic ( ) ) ;
ui . underlinebtn - > setChecked ( f . underline ( ) ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : colorChanged ( const QColor & c )
2008-11-25 20:19:09 -05:00
{
QPixmap pix ( 16 , 16 ) ;
pix . fill ( c ) ;
ui . colorbtn - > setIcon ( pix ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : alignmentChanged ( Qt : : Alignment a )
2008-11-25 20:19:09 -05:00
{
if ( a & Qt : : AlignLeft ) {
actionAlignLeft - > setChecked ( true ) ;
} else if ( a & Qt : : AlignHCenter ) {
actionAlignCenter - > setChecked ( true ) ;
} else if ( a & Qt : : AlignRight ) {
actionAlignRight - > setChecked ( true ) ;
} else if ( a & Qt : : AlignJustify ) {
actionAlignJustify - > setChecked ( true ) ;
}
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : clipboardDataChanged ( )
2008-11-25 20:19:09 -05:00
{
actionPaste - > setEnabled ( ! QApplication : : clipboard ( ) - > text ( ) . isEmpty ( ) ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : fileNew ( )
2008-11-25 20:19:09 -05:00
{
if ( maybeSave ( ) ) {
ui . msgText - > clear ( ) ;
//setCurrentFileName(QString());
}
2008-03-24 21:41:01 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : fileOpen ( )
2008-11-25 20:19:09 -05:00
{
2010-12-02 19:54:40 -05:00
QString fn ;
if ( misc : : getOpenFileName ( this , RshareSettings : : LASTDIR_MESSAGES , tr ( " Open File... " ) , tr ( " HTML-Files (*.htm *.html);;All Files (*) " ) , fn ) ) {
2008-11-25 20:19:09 -05:00
load ( fn ) ;
2010-12-02 19:54:40 -05:00
}
2008-03-24 21:41:01 -04:00
}
2007-11-14 22:18:48 -05:00
2010-05-23 15:13:41 -04:00
bool MessageComposer : : fileSave ( )
2008-11-25 20:19:09 -05:00
{
if ( fileName . isEmpty ( ) )
return fileSaveAs ( ) ;
QFile file ( fileName ) ;
if ( ! file . open ( QFile : : WriteOnly ) )
return false ;
QTextStream ts ( & file ) ;
ts . setCodec ( QTextCodec : : codecForName ( " UTF-8 " ) ) ;
ts < < ui . msgText - > document ( ) - > toHtml ( " UTF-8 " ) ;
ui . msgText - > document ( ) - > setModified ( false ) ;
return true ;
2008-03-26 15:30:34 -04:00
}
2010-05-23 15:13:41 -04:00
bool MessageComposer : : fileSaveAs ( )
2008-11-25 20:19:09 -05:00
{
2010-12-02 19:54:40 -05:00
QString fn ;
if ( misc : : getSaveFileName ( this , RshareSettings : : LASTDIR_MESSAGES , tr ( " Save as... " ) , tr ( " HTML-Files (*.htm *.html);;All Files (*) " ) , fn ) ) {
setCurrentFileName ( fn ) ;
return fileSave ( ) ;
}
return false ;
2008-03-26 15:30:34 -04:00
}
2010-05-25 06:41:26 -04:00
void MessageComposer : : saveasDraft ( )
{
sendMessage_internal ( true ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : filePrint ( )
2008-11-25 20:19:09 -05:00
{
# ifndef QT_NO_PRINTER
QPrinter printer ( QPrinter : : HighResolution ) ;
printer . setFullPage ( true ) ;
QPrintDialog * dlg = new QPrintDialog ( & printer , this ) ;
if ( ui . msgText - > textCursor ( ) . hasSelection ( ) )
dlg - > addEnabledOption ( QAbstractPrintDialog : : PrintSelection ) ;
dlg - > setWindowTitle ( tr ( " Print Document " ) ) ;
if ( dlg - > exec ( ) = = QDialog : : Accepted ) {
ui . msgText - > print ( & printer ) ;
}
delete dlg ;
# endif
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : filePrintPdf ( )
2008-11-25 20:19:09 -05:00
{
# ifndef QT_NO_PRINTER
2010-12-02 19:54:40 -05:00
QString fileName ;
if ( misc : : getSaveFileName ( this , RshareSettings : : LASTDIR_MESSAGES , tr ( " Export PDF " ) , " *.pdf " , fileName ) ) {
2008-11-25 20:19:09 -05:00
if ( QFileInfo ( fileName ) . suffix ( ) . isEmpty ( ) )
fileName . append ( " .pdf " ) ;
QPrinter printer ( QPrinter : : HighResolution ) ;
printer . setOutputFormat ( QPrinter : : PdfFormat ) ;
printer . setOutputFileName ( fileName ) ;
ui . msgText - > document ( ) - > print ( & printer ) ;
}
# endif
2008-03-24 21:41:01 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : setCurrentFileName ( const QString & fileName )
2008-11-25 20:19:09 -05:00
{
this - > fileName = fileName ;
ui . msgText - > document ( ) - > setModified ( false ) ;
setWindowModified ( false ) ;
2008-03-24 21:41:01 -04:00
}
2010-05-23 15:13:41 -04:00
bool MessageComposer : : load ( const QString & f )
2008-11-25 20:19:09 -05:00
{
if ( ! QFile : : exists ( f ) )
return false ;
QFile file ( f ) ;
if ( ! file . open ( QFile : : ReadOnly ) )
return false ;
QByteArray data = file . readAll ( ) ;
QTextCodec * codec = Qt : : codecForHtml ( data ) ;
QString str = codec - > toUnicode ( data ) ;
if ( Qt : : mightBeRichText ( str ) ) {
ui . msgText - > setHtml ( str ) ;
} else {
str = QString : : fromLocal8Bit ( data ) ;
ui . msgText - > setPlainText ( str ) ;
}
setCurrentFileName ( f ) ;
return true ;
2008-03-24 21:41:01 -04:00
}
2010-05-23 15:13:41 -04:00
bool MessageComposer : : maybeSave ( )
2008-11-25 20:19:09 -05:00
{
if ( ! ui . msgText - > document ( ) - > isModified ( ) )
return true ;
if ( fileName . startsWith ( QLatin1String ( " :/ " ) ) )
return true ;
QMessageBox : : StandardButton ret ;
ret = QMessageBox : : warning ( this , tr ( " Save Message " ) ,
tr ( " Message has not been Sent. \n "
" Do you want to save message ? " ) ,
QMessageBox : : Save | QMessageBox : : Discard
| QMessageBox : : Cancel ) ;
if ( ret = = QMessageBox : : Save )
return fileSave ( ) ;
else if ( ret = = QMessageBox : : Cancel )
return false ;
return true ;
2008-03-24 21:41:01 -04:00
}
2008-11-25 20:19:09 -05:00
2010-05-23 15:13:41 -04:00
void MessageComposer : : toggleContacts ( )
2008-11-25 20:19:09 -05:00
{
2010-09-27 17:05:52 -04:00
ui . contactsdockWidget - > setVisible ( ! ui . contactsdockWidget - > isVisible ( ) ) ;
}
void MessageComposer : : on_contactsdockWidget_visibilityChanged ( bool visible )
{
contactSidebarAction - > setChecked ( visible ) ;
2008-03-24 13:36:17 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : addImage ( )
2008-11-25 20:19:09 -05:00
{
2012-09-18 18:59:23 -04:00
QString file ;
if ( misc : : getOpenFileName ( this , RshareSettings : : LASTDIR_IMAGES , tr ( " Choose Image " ) , tr ( " Image Files supported (*.png *.jpeg *.jpg *.gif) " ) , file ) ) {
QString encodedImage ;
if ( RsHtml : : makeEmbeddedImage ( file , encodedImage , 640 * 480 ) ) {
QTextDocumentFragment fragment = QTextDocumentFragment : : fromHtml ( encodedImage ) ;
ui . msgText - > textCursor ( ) . insertFragment ( fragment ) ;
}
2010-12-02 19:54:40 -05:00
}
2008-03-25 08:28:13 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : fontSizeIncrease ( )
2010-01-25 09:03:38 -05:00
{
if ( ! ( ui . msgText - > textCursor ( ) . blockFormat ( ) . hasProperty ( TextFormat : : HtmlHeading ) & &
ui . msgText - > textCursor ( ) . blockFormat ( ) . intProperty ( TextFormat : : HtmlHeading ) ) ) {
QTextCharFormat format ;
int idx = ui . msgText - > currentCharFormat ( ) . intProperty ( QTextFormat : : FontSizeAdjustment ) ;
if ( idx < 3 ) {
format . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( + + idx ) ) ;
ui . msgText - > textCursor ( ) . mergeCharFormat ( format ) ;
}
}
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : fontSizeDecrease ( )
2010-01-25 09:03:38 -05:00
{
if ( ! ( ui . msgText - > textCursor ( ) . blockFormat ( ) . hasProperty ( TextFormat : : HtmlHeading ) & &
ui . msgText - > textCursor ( ) . blockFormat ( ) . intProperty ( TextFormat : : HtmlHeading ) ) ) {
QTextCharFormat format ;
int idx = ui . msgText - > currentCharFormat ( ) . intProperty ( QTextFormat : : FontSizeAdjustment ) ;
if ( idx > - 1 ) {
format . setProperty ( QTextFormat : : FontSizeAdjustment , QVariant ( - - idx ) ) ;
ui . msgText - > textCursor ( ) . mergeCharFormat ( format ) ;
}
}
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : blockQuote ( )
2010-01-25 09:03:38 -05:00
{
QTextBlockFormat blockFormat = ui . msgText - > textCursor ( ) . blockFormat ( ) ;
QTextBlockFormat f ;
2010-09-27 17:05:52 -04:00
if ( blockFormat . hasProperty ( TextFormat : : IsBlockQuote ) & &
2010-01-25 09:03:38 -05:00
blockFormat . boolProperty ( TextFormat : : IsBlockQuote ) ) {
f . setProperty ( TextFormat : : IsBlockQuote , QVariant ( false ) ) ;
f . setLeftMargin ( 0 ) ;
f . setRightMargin ( 0 ) ;
} else {
f . setProperty ( TextFormat : : IsBlockQuote , QVariant ( true ) ) ;
f . setLeftMargin ( 40 ) ;
f . setRightMargin ( 40 ) ;
}
ui . msgText - > textCursor ( ) . mergeBlockFormat ( f ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : toggleCode ( )
2010-01-25 09:03:38 -05:00
{
static QString preFontFamily ;
QTextCharFormat charFormat = ui . msgText - > currentCharFormat ( ) ;
QTextCharFormat f ;
2010-09-27 17:05:52 -04:00
2010-01-25 09:03:38 -05:00
if ( charFormat . hasProperty ( TextFormat : : HasCodeStyle ) & &
charFormat . boolProperty ( TextFormat : : HasCodeStyle ) ) {
f . setProperty ( TextFormat : : HasCodeStyle , QVariant ( false ) ) ;
f . setBackground ( defaultCharFormat . background ( ) ) ;
f . setFontFamily ( preFontFamily ) ;
ui . msgText - > textCursor ( ) . mergeCharFormat ( f ) ;
} else {
preFontFamily = ui . msgText - > fontFamily ( ) ;
f . setProperty ( TextFormat : : HasCodeStyle , QVariant ( true ) ) ;
f . setBackground ( codeBackground ) ;
f . setFontFamily ( " Dejavu Sans Mono " ) ;
ui . msgText - > textCursor ( ) . mergeCharFormat ( f ) ;
}
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : addPostSplitter ( )
2010-01-25 10:36:24 -05:00
{
QTextBlockFormat f = ui . msgText - > textCursor ( ) . blockFormat ( ) ;
QTextBlockFormat f1 = f ;
f . setProperty ( TextFormat : : IsHtmlTagSign , true ) ;
2010-09-27 17:05:52 -04:00
f . setProperty ( QTextFormat : : BlockTrailingHorizontalRulerWidth ,
2010-01-25 10:36:24 -05:00
QTextLength ( QTextLength : : PercentageLength , 80 ) ) ;
if ( ui . msgText - > textCursor ( ) . block ( ) . text ( ) . isEmpty ( ) ) {
ui . msgText - > textCursor ( ) . mergeBlockFormat ( f ) ;
} else {
ui . msgText - > textCursor ( ) . insertBlock ( f ) ;
}
ui . msgText - > textCursor ( ) . insertBlock ( f1 ) ;
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : attachFile ( )
2010-01-20 16:39:27 -05:00
{
2010-09-27 17:05:52 -04:00
// select a file
2010-12-02 19:54:40 -05:00
QStringList files ;
if ( misc : : getOpenFileNames ( this , RshareSettings : : LASTDIR_EXTRAFILE , tr ( " Add Extra File " ) , " " , files ) ) {
2012-11-11 16:17:00 -05:00
ui . hashBox - > addAttachments ( files , TransferRequestFlags ( 0u ) ) ;
2010-09-27 17:05:52 -04:00
}
}
2011-12-07 08:08:12 -05:00
void MessageComposer : : fileHashingStarted ( )
2010-09-27 17:05:52 -04:00
{
2011-12-07 08:08:12 -05:00
std : : cerr < < " MessageComposer::fileHashingStarted() started. " < < std : : endl ;
2010-09-27 17:05:52 -04:00
/* add widget in for new destination */
2010-11-26 10:32:46 -05:00
ui . msgFileList - > hide ( ) ;
2011-12-07 08:08:12 -05:00
ui . hashBox - > show ( ) ;
2010-01-20 16:39:27 -05:00
}
2008-03-26 15:30:34 -04:00
2011-12-07 08:08:12 -05:00
void MessageComposer : : fileHashingFinished ( QList < HashedFile > hashedFiles )
2010-01-21 11:35:00 -05:00
{
2011-12-07 08:08:12 -05:00
std : : cerr < < " MessageComposer::fileHashingFinished() started. " < < std : : endl ;
2010-01-21 11:35:00 -05:00
2011-12-07 08:08:12 -05:00
QList < HashedFile > : : iterator it ;
for ( it = hashedFiles . begin ( ) ; it ! = hashedFiles . end ( ) ; + + it ) {
FileInfo info ;
info . fname = it - > filename . toUtf8 ( ) . constData ( ) ;
info . hash = it - > hash ;
info . size = it - > size ;
addFile ( info ) ;
2010-09-27 17:05:52 -04:00
}
2010-01-21 11:35:00 -05:00
2011-12-07 08:08:12 -05:00
ui . actionSend - > setEnabled ( true ) ;
ui . hashBox - > hide ( ) ;
ui . msgFileList - > show ( ) ;
2010-01-21 11:35:00 -05:00
}
2010-05-29 15:05:10 -04:00
2012-01-26 19:32:17 -05:00
void MessageComposer : : addContact ( enumType type )
2010-05-29 15:05:10 -04:00
{
2012-01-26 19:32:17 -05:00
std : : list < std : : string > ids ;
ui . friendSelectionWidget - > selectedGroupIds ( ids ) ;
2010-05-29 15:05:10 -04:00
2012-01-26 19:32:17 -05:00
std : : list < std : : string > : : iterator idIt ;
for ( idIt = ids . begin ( ) ; idIt ! = ids . end ( ) ; idIt + + ) {
addRecipient ( type , * idIt , true ) ;
2010-05-29 15:05:10 -04:00
}
2012-01-26 19:32:17 -05:00
ids . empty ( ) ;
ui . friendSelectionWidget - > selectedSslIds ( ids , true ) ;
for ( idIt = ids . begin ( ) ; idIt ! = ids . end ( ) ; idIt + + ) {
addRecipient ( type , * idIt , false ) ;
2010-09-27 17:05:52 -04:00
}
2013-07-31 12:34:34 -04:00
ids . empty ( ) ;
ui . friendSelectionWidget - > selectedGpgIds ( ids , true ) ;
for ( idIt = ids . begin ( ) ; idIt ! = ids . end ( ) ; idIt + + )
{
std : : string hash ;
if ( rsMsgs - > getDistantMessageHash ( * idIt , hash ) )
addRecipient ( type , hash , * idIt ) ;
}
2010-09-27 17:05:52 -04:00
}
2013-09-07 10:02:24 -04:00
void MessageComposer : : toggleShowNonFriend ( bool bValue )
{
ui . friendSelectionWidget - > setShowType ( FriendSelectionWidget : : SHOW_GROUP
| FriendSelectionWidget : : SHOW_SSL
| ( bValue ? FriendSelectionWidget : : SHOW_NONE : FriendSelectionWidget : : SHOW_NON_FRIEND_GPG ) ) ;
Settings - > setValueToGroup ( " MessageComposer " , " ShowOnlyTrustedKeys " , bValue ) ;
}
2011-05-21 12:26:00 -04:00
void MessageComposer : : addTo ( )
{
addContact ( TO ) ;
}
void MessageComposer : : addCc ( )
{
addContact ( CC ) ;
}
void MessageComposer : : addBcc ( )
{
addContact ( BCC ) ;
}
void MessageComposer : : addRecommend ( )
2010-09-27 17:05:52 -04:00
{
2012-01-23 17:38:50 -05:00
std : : list < std : : string > sslIds ;
2012-01-26 19:32:17 -05:00
ui . friendSelectionWidget - > selectedSslIds ( sslIds , false ) ;
2010-09-27 17:05:52 -04:00
2012-01-23 17:38:50 -05:00
if ( sslIds . empty ( ) ) {
2010-09-27 17:05:52 -04:00
return ;
}
2011-06-14 16:42:32 -04:00
std : : list < std : : string > : : iterator it ;
2012-01-23 17:38:50 -05:00
for ( it = sslIds . begin ( ) ; it ! = sslIds . end ( ) ; it + + ) {
2011-06-14 16:42:32 -04:00
addRecipient ( CC , * it , false ) ;
}
2012-01-23 17:38:50 -05:00
QString text = buildRecommendHtml ( sslIds ) ;
2010-09-27 17:05:52 -04:00
ui . msgText - > textCursor ( ) . insertHtml ( text ) ;
ui . msgText - > setFocus ( Qt : : OtherFocusReason ) ;
}
2010-11-16 04:31:30 -05:00
2011-05-21 12:26:00 -04:00
void MessageComposer : : friendDetails ( )
{
2012-01-26 19:32:17 -05:00
FriendSelectionWidget : : IdType idType ;
2013-01-22 19:22:17 -05:00
std : : string id = ui . friendSelectionWidget - > selectedId ( idType ) ;
2011-05-21 12:26:00 -04:00
2013-01-22 19:22:17 -05:00
if ( id . empty ( ) | | idType ! = FriendSelectionWidget : : IDTYPE_SSL ) {
2011-05-21 12:26:00 -04:00
return ;
}
2013-01-22 19:22:17 -05:00
ConfCertDialog : : showIt ( id , ConfCertDialog : : PageDetails ) ;
2011-05-21 12:26:00 -04:00
}
void MessageComposer : : tagAboutToShow ( )
{
TagsMenu * menu = dynamic_cast < TagsMenu * > ( ui . tagButton - > menu ( ) ) ;
if ( menu = = NULL ) {
return ;
}
menu - > activateActions ( m_tagIds ) ;
}
void MessageComposer : : tagRemoveAll ( )
{
m_tagIds . clear ( ) ;
showTagLabels ( ) ;
}
void MessageComposer : : tagSet ( int tagId , bool set )
{
if ( tagId = = 0 ) {
return ;
}
std : : list < uint32_t > : : iterator tag = std : : find ( m_tagIds . begin ( ) , m_tagIds . end ( ) , tagId ) ;
if ( tag = = m_tagIds . end ( ) ) {
if ( set ) {
m_tagIds . push_back ( tagId ) ;
/* Keep the list sorted */
m_tagIds . sort ( ) ;
2011-12-07 08:08:12 -05:00
}
2011-05-21 12:26:00 -04:00
} else {
if ( set = = false ) {
m_tagIds . remove ( tagId ) ;
}
}
showTagLabels ( ) ;
}
void MessageComposer : : clearTagLabels ( )
{
/* clear all tags */
while ( tagLabels . size ( ) ) {
delete tagLabels . front ( ) ;
tagLabels . pop_front ( ) ;
}
while ( ui . tagLayout - > count ( ) ) {
delete ui . tagLayout - > takeAt ( 0 ) ;
}
}
void MessageComposer : : showTagLabels ( )
{
clearTagLabels ( ) ;
if ( m_tagIds . empty ( ) = = false ) {
MsgTagType tags ;
rsMsgs - > getMessageTagTypes ( tags ) ;
std : : map < uint32_t , std : : pair < std : : string , uint32_t > > : : iterator tag ;
for ( std : : list < uint32_t > : : iterator tagId = m_tagIds . begin ( ) ; tagId ! = m_tagIds . end ( ) ; tagId + + ) {
tag = tags . types . find ( * tagId ) ;
if ( tag ! = tags . types . end ( ) ) {
QLabel * tagLabel = new QLabel ( TagDefs : : name ( tag - > first , tag - > second . first ) , this ) ;
tagLabel - > setMaximumHeight ( 16 ) ;
tagLabel - > setStyleSheet ( TagDefs : : labelStyleSheet ( tag - > second . second ) ) ;
tagLabels . push_back ( tagLabel ) ;
ui . tagLayout - > addWidget ( tagLabel ) ;
ui . tagLayout - > addSpacing ( 3 ) ;
}
}
ui . tagLayout - > addStretch ( ) ;
}
}