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>
2010-07-23 14:52:58 -04:00
2010-09-24 07:38:46 -04:00
# include <algorithm>
2008-11-25 20:19:09 -05:00
# include "rshare.h"
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>
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-01-20 16:39:27 -05:00
# include "gui/feeds/AttachFileItem.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"
2011-05-21 12:26:00 -04:00
# include "TagsMenu.h"
# include "gui/common/TagDefs.h"
# include "gui/connect/ConfCertDialog.h"
2011-09-29 05:20:09 -04:00
# include "gui/chat/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 */
2010-05-25 05:32:14 -04:00
MessageComposer : : MessageComposer ( QWidget * parent , Qt : : WFlags flags )
: QMainWindow ( parent , flags ) , mCheckAttachment ( true )
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 ;
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-05-29 15:05:10 -04:00
connect ( ui . filterPatternLineEdit , SIGNAL ( textChanged ( const QString & ) ) , this , SLOT ( filterRegExpChanged ( ) ) ) ;
connect ( ui . clearButton , SIGNAL ( clicked ( ) ) , this , SLOT ( clearFilter ( ) ) ) ;
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-05-21 12:26:00 -04:00
connect ( ui . msgSendList , SIGNAL ( customContextMenuRequested ( QPoint ) ) , this , SLOT ( contextMenuMsgSendList ( QPoint ) ) ) ;
2010-11-21 16:12:35 -05:00
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
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 ( ) ) ) ;
connect ( ui . msgSendList , SIGNAL ( doubleClicked ( QModelIndex ) ) , this , SLOT ( addTo ( ) ) ) ;
2010-09-27 17:05:52 -04:00
connect ( NotifyQt : : getInstance ( ) , SIGNAL ( groupsChanged ( int ) ) , this , SLOT ( groupsChanged ( int ) ) ) ;
connect ( NotifyQt : : getInstance ( ) , SIGNAL ( peerStatusChanged ( const QString & , int ) ) , this , SLOT ( peerStatusChanged ( const QString & , int ) ) ) ;
2010-01-25 09:03:38 -05:00
/* hide the Tree +/- */
ui . msgFileList - > setRootIsDecorated ( false ) ;
2010-09-24 07:38:46 -04:00
2010-01-25 09:03:38 -05:00
/* to hide the header */
2010-09-27 17:05:52 -04:00
//ui.msgSendList->header()->hide();
2010-07-12 10:01:29 -04:00
/* sort send list by name ascending */
ui . msgSendList - > sortItems ( 0 , Qt : : AscendingOrder ) ;
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
2010-05-29 15:05:10 -04:00
ui . clearButton - > hide ( ) ;
2010-01-16 13:03:35 -05:00
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 ) ;
2010-11-02 17:11:11 -04:00
/* worker fns */
insertSendList ( ) ;
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 ) ;
2010-11-17 07:45:46 -05:00
# ifdef RS_RELEASE_VERSION
ui . imagebtn - > setVisible ( false ) ;
ui . imagebtn - > setVisible ( false ) ;
# endif
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
}
2010-09-27 17:05:52 -04:00
/*static*/ void MessageComposer : : msgFriend ( 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! */
}
static QString BuildRecommendHtml ( std : : list < std : : string > & peerids )
{
QString text ;
2010-07-15 07:25:34 -04:00
/* process peer ids */
std : : list < std : : string > : : iterator peerid ;
for ( peerid = peerids . begin ( ) ; peerid ! = peerids . end ( ) ; peerid + + ) {
2011-05-04 06:22:49 -04:00
RetroShareLink link ;
2011-05-12 15:37:13 -04:00
if ( link . createPerson ( * peerid ) ) {
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
2010-09-27 17:05:52 -04:00
void MessageComposer : : recommendFriend ( std : : list < std : : string > & peerids )
{
// std::cerr << "MessageComposer::recommendFriend()" << std::endl;
if ( peerids . size ( ) = = 0 ) {
return ;
2010-07-15 07:25:34 -04:00
}
2010-09-27 17:05:52 -04:00
/* create a message */
2010-11-02 17:11:11 -04:00
MessageComposer * pMsgDialog = MessageComposer : : newMsg ( ) ;
2010-09-27 17:05:52 -04:00
2010-11-02 17:11:11 -04:00
pMsgDialog - > insertTitleText ( tr ( " Friend Recommendation(s) " ) ) ;
2010-09-27 17:05:52 -04:00
2010-11-02 17:11:11 -04:00
QString sMsgText = tr ( " I recommend a good friend of me, you can trust him too when you trust me. <br> Copy friend link and paste to Friends list " ) ;
2010-09-27 17:05:52 -04:00
sMsgText + = " <br><br> " ;
2010-11-02 17:11:11 -04:00
sMsgText + = BuildRecommendHtml ( peerids ) ;
2010-07-15 07:25:34 -04:00
pMsgDialog - > insertMsgText ( sMsgText ) ;
2011-06-14 16:42:32 -04:00
std : : list < std : : string > : : iterator peerIt ;
for ( peerIt = peerids . begin ( ) ; peerIt ! = peerids . end ( ) ; peerIt + + ) {
pMsgDialog - > addRecipient ( CC , * peerIt , false ) ;
}
2010-07-15 07:25:34 -04:00
pMsgDialog - > show ( ) ;
/* window will destroy itself! */
}
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
2010-11-21 16:12:35 -05:00
void MessageComposer : : contextMenu ( QPoint )
{
QMenu * contextMnu = ui . msgText - > createStandardContextMenu ( ) ;
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 )
{
QMenu contextMnu ( this ) ;
int selectedCount = ui . msgSendList - > selectedItems ( ) . count ( ) ;
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 ( ) ) ) ;
action - > setEnabled ( selectedCount = = 1 ) ;
contextMnu . exec ( QCursor : : pos ( ) ) ;
}
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 ) ;
}
}
}
void MessageComposer : : insertSendList ( )
{
/* get a link to the table */
QTreeWidget * sendWidget = ui . msgSendList ;
/* remove old items */
sendWidget - > clear ( ) ;
sendWidget - > setColumnCount ( 1 ) ;
setNewCompleter ( ui . recipientWidget , NULL ) ;
if ( m_completer ) {
delete ( m_completer ) ;
m_completer = NULL ;
}
if ( ! rsPeers )
{
/* not ready yet! */
return ;
}
// 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 ) ;
2010-12-21 20:11:19 -05:00
std : : list < StatusInfo > statusInfo ;
rsStatus - > getStatusList ( statusInfo ) ;
2010-09-27 17:05:52 -04:00
std : : list < std : : string > fillPeerIds ;
// start with groups
groupIt = groupInfoList . begin ( ) ;
while ( true ) {
QTreeWidgetItem * groupItem = NULL ;
RsGroupInfo * groupInfo = NULL ;
if ( groupIt ! = groupInfoList . end ( ) ) {
groupInfo = & ( * groupIt ) ;
if ( groupInfo - > peerIds . size ( ) = = 0 ) {
// don't show empty groups
groupIt + + ;
continue ;
}
// add group item
groupItem = new RSTreeWidgetItem ( m_compareRole , TYPE_GROUP ) ;
// Add item to the list
sendWidget - > addTopLevelItem ( groupItem ) ;
groupItem - > setChildIndicatorPolicy ( QTreeWidgetItem : : DontShowIndicatorWhenChildless ) ;
// groupItem->setSizeHint(COLUMN_NAME, QSize(26, 26));
groupItem - > setTextAlignment ( COLUMN_CONTACT_NAME , Qt : : AlignLeft | Qt : : AlignVCenter ) ;
groupItem - > setIcon ( COLUMN_CONTACT_NAME , QIcon ( IMAGE_GROUP16 ) ) ;
/* used to find back the item */
groupItem - > setData ( COLUMN_CONTACT_DATA , ROLE_CONTACT_ID , QString : : fromStdString ( groupInfo - > id ) ) ;
groupItem - > setExpanded ( true ) ;
QString groupName = GroupDefs : : name ( * groupInfo ) ;
groupItem - > setText ( COLUMN_CONTACT_NAME , groupName ) ;
groupItem - > setData ( COLUMN_CONTACT_DATA , ROLE_CONTACT_SORT , ( ( groupInfo - > flag & RS_GROUP_FLAG_STANDARD ) ? " 0 " : " 1 " ) + groupName ) ;
}
// iterate through peers
for ( peerIt = peers . begin ( ) ; peerIt ! = peers . end ( ) ; peerIt + + ) {
RsPeerDetails detail ;
if ( ! rsPeers - > getPeerDetails ( * peerIt , detail ) ) {
continue ; /* BAD */
}
if ( groupInfo ) {
// we fill a group, check if gpg id is assigned
if ( std : : find ( groupInfo - > peerIds . begin ( ) , groupInfo - > peerIds . end ( ) , detail . gpg_id ) = = groupInfo - > peerIds . end ( ) ) {
continue ;
}
} else {
// we fill the not assigned gpg ids
if ( std : : find ( fillPeerIds . begin ( ) , fillPeerIds . end ( ) , * peerIt ) ! = fillPeerIds . end ( ) ) {
continue ;
2010-01-30 17:00:50 -05:00
}
2010-09-27 17:05:52 -04:00
}
// add equal too, its no problem
fillPeerIds . push_back ( detail . id ) ;
/* make a widget per friend */
QTreeWidgetItem * item = new RSTreeWidgetItem ( m_compareRole , TYPE_SSL ) ;
/* add all the labels */
/* (0) Person */
2010-09-28 16:33:34 -04:00
QString name = PeerDefs : : nameWithLocation ( detail ) ;
2010-09-27 17:05:52 -04:00
item - > setText ( COLUMN_CONTACT_NAME , name ) ;
int state = RS_STATUS_OFFLINE ;
if ( detail . state & RS_PEER_STATE_CONNECTED ) {
2010-12-21 20:11:19 -05:00
std : : list < StatusInfo > : : iterator it ;
for ( it = statusInfo . begin ( ) ; it ! = statusInfo . end ( ) ; it + + ) {
if ( it - > id = = detail . id ) {
state = it - > status ;
break ;
}
}
}
2011-06-14 16:42:32 -04:00
if ( state ! = ( int ) RS_STATUS_OFFLINE ) {
2010-09-27 17:05:52 -04:00
item - > setTextColor ( COLUMN_CONTACT_NAME , COLOR_CONNECT ) ;
}
item - > setIcon ( COLUMN_CONTACT_NAME , QIcon ( StatusDefs : : imageUser ( state ) ) ) ;
item - > setData ( COLUMN_CONTACT_DATA , ROLE_CONTACT_ID , QString : : fromStdString ( detail . id ) ) ;
item - > setData ( COLUMN_CONTACT_DATA , ROLE_CONTACT_SORT , " 2 " + name ) ;
// add to the list
if ( groupItem ) {
groupItem - > addChild ( item ) ;
} else {
sendWidget - > addTopLevelItem ( item ) ;
}
}
if ( groupIt ! = groupInfoList . end ( ) ) {
groupIt + + ;
} else {
// all done
break ;
}
}
if ( ui . filterPatternLineEdit - > text ( ) . isEmpty ( ) = = false ) {
2010-05-29 15:05:10 -04:00
FilterItems ( ) ;
2010-09-27 17:05:52 -04:00
}
2007-11-14 22:18:48 -05:00
2010-09-27 17:05:52 -04:00
sendWidget - > update ( ) ; /* update display */
2008-01-25 03:49:40 -05:00
2010-09-27 17:05:52 -04:00
// 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 : : groupsChanged ( int type )
2007-11-14 22:18:48 -05:00
{
2010-09-27 17:05:52 -04:00
Q_UNUSED ( type ) ;
insertSendList ( ) ;
2007-11-14 22:18:48 -05:00
}
2010-09-27 17:05:52 -04:00
void MessageComposer : : peerStatusChanged ( const QString & peer_id , int status )
{
QTreeWidgetItemIterator itemIterator ( ui . msgSendList ) ;
QTreeWidgetItem * item ;
while ( ( item = * itemIterator ) ! = NULL ) {
itemIterator + + ;
if ( item - > data ( COLUMN_CONTACT_DATA , ROLE_CONTACT_ID ) . toString ( ) = = peer_id ) {
QColor color ;
if ( status ! = ( int ) RS_STATUS_OFFLINE ) {
color = COLOR_CONNECT ;
} else {
color = Qt : : black ;
}
item - > setTextColor ( COLUMN_CONTACT_NAME , color ) ;
item - > setIcon ( COLUMN_CONTACT_NAME , QIcon ( StatusDefs : : imageUser ( status ) ) ) ;
//break; no break, peers can assigned to groups more than one
}
}
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
2010-05-23 15:13:41 -04:00
void MessageComposer : : insertFileList ( 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
2010-09-27 17:05:52 -04:00
insertFileList ( files_info ) ;
2010-04-26 17:11:19 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : insertFileList ( 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
2010-11-02 17:11:11 -04: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
2010-11-02 17:11:11 -04:00
msgComposer - > insertTitleText ( QString : : fromStdWString ( msgInfo . title ) ) ;
2007-11-14 22:18:48 -05:00
2010-11-02 17:11:11 -04:00
msgComposer - > insertMsgText ( QString : : fromStdWString ( msgInfo . msg ) ) ;
2010-05-25 05:32:14 -04:00
2010-11-02 17:11:11 -04:00
msgComposer - > insertFileList ( 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
}
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 */
msgComposer - > insertTitleText ( QString : : fromStdWString ( msgInfo . title ) , REPLY ) ;
QTextDocument doc ;
doc . setHtml ( QString : : fromStdWString ( msgInfo . msg ) ) ;
msgComposer - > insertPastedText ( doc . toPlainText ( ) ) ;
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 ) ;
}
}
}
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 */
msgComposer - > insertTitleText ( QString : : fromStdWString ( msgInfo . title ) , FORWARD ) ;
2008-09-08 08:41:46 -04:00
2010-11-02 17:11:11 -04:00
QTextDocument doc ;
doc . setHtml ( QString : : fromStdWString ( msgInfo . msg ) ) ;
msgComposer - > insertForwardPastedText ( doc . toPlainText ( ) ) ;
std : : list < FileInfo > & files_info = msgInfo . files ;
msgComposer - > insertFileList ( files_info ) ;
msgComposer - > calculateTitle ( ) ;
/* window will destroy itself! */
return msgComposer ;
}
void MessageComposer : : insertTitleText ( const QString & title , enumMessageType type )
{
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
}
void MessageComposer : : insertPastedText ( QString msg )
{
msg . replace ( " \n " , " \n <BR/>> " ) ;
ui . msgText - > setHtml ( " <HTML><font color= \" blue \" > > " + msg + " </font><br/><br/></HTML> " ) ;
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 ) ;
2008-09-08 08:41:46 -04:00
}
2007-11-14 22:18:48 -05:00
2010-11-02 17:11:11 -04:00
void MessageComposer : : insertForwardPastedText ( QString msg )
2008-11-25 20:19:09 -05:00
{
2010-11-02 17:11:11 -04:00
msg . replace ( " \n " , " \n <BR/>> " ) ;
2008-11-25 20:19:09 -05:00
2010-11-02 17:11:11 -04:00
ui . msgText - > setHtml ( " <HTML><blockquote [type=cite]><font color= \" blue \" >> " + msg + " </font><br/><br/></blockquote></HTML> " ) ;
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 ) ;
2008-11-25 20:19:09 -05:00
}
2010-11-02 17:11:11 -04:00
void MessageComposer : : insertMsgText ( const QString & msg )
2007-11-14 22:18:48 -05:00
{
2010-11-02 17:11:11 -04:00
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
}
2010-11-02 17:11:11 -04:00
void MessageComposer : : insertHtmlText ( const QString & msg )
2010-01-16 13:03:35 -05:00
{
2010-11-02 17:11:11 -04:00
ui . msgText - > setHtml ( " <a href=' " + msg + " '> " + msg + " </a> " ) ;
2010-01-16 13:03:35 -05:00
2010-05-25 05:32:14 -04:00
ui . msgText - > document ( ) - > setModified ( true ) ;
}
2007-11-14 22:18:48 -05:00
2010-05-23 15:13:41 -04: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 ( ) ;
2010-05-25 05:32:14 -04:00
mi . msg = ui . msgText - > toHtml ( ) . toStdWString ( ) ;
2011-09-29 05:20:09 -04:00
QString text ;
RsHtml : : optimizeHtml ( ui . msgText , text ) ;
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
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 {
if ( std : : find ( peers . begin ( ) , peers . end ( ) , id ) = = peers . end ( ) ) {
// 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
}
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 ;
if ( id . empty ( ) = = FALSE ) {
if ( group ) {
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
}
} else {
2010-09-28 16:33:34 -04:00
RsPeerDetails details ;
if ( rsPeers - > getPeerDetails ( id , details ) ) {
name = PeerDefs : : nameWithLocation ( details ) ;
2010-09-27 17:05:52 -04:00
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 " ) ;
2010-09-28 19:16:50 -04:00
id . clear ( ) ;
2010-09-27 17:05:52 -04:00
}
2010-09-24 07:38:46 -04:00
}
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 ) ;
}
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
2011-05-07 19:14:09 -04:00
if ( detail . isOnlyGPGdetail ) {
2011-08-07 17:14:09 -04:00
if ( ! rsPeers - > getAssociatedSSLIds ( id , sslIds ) ) {
2011-05-07 19:14:09 -04:00
return ;
2010-09-27 17:05:52 -04:00
}
2011-05-07 19:14:09 -04:00
} else {
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 ;
2010-11-17 07:45:46 -05:00
# ifndef RS_RELEASE_VERSION
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
{
2010-12-02 19:54:40 -05:00
QString fileimg ;
if ( misc : : getOpenFileName ( this , RshareSettings : : LASTDIR_IMAGES , tr ( " Choose Image " ) , tr ( " Image Files supported (*.png *.jpeg *.jpg *.gif) " ) , fileimg ) ) {
QImage base ( fileimg ) ;
2010-09-27 17:05:52 -04:00
2010-12-02 19:54:40 -05:00
QString pathimage = fileimg . left ( fileimg . lastIndexOf ( " / " ) ) + " / " ;
Settings - > setValueToGroup ( " MessageComposer " , " LastDir " , pathimage ) ;
2010-09-27 17:05:52 -04:00
2010-12-02 19:54:40 -05:00
Create_New_Image_Tag ( fileimg ) ;
}
2008-03-25 08:28:13 -04:00
}
2010-05-23 15:13:41 -04:00
void MessageComposer : : Create_New_Image_Tag ( const QString urlremoteorlocal )
2008-11-25 20:19:09 -05:00
{
/*if (image_extension(urlremoteorlocal)) {*/
QString subtext = QString ( " <p><img src= \" %1 \" /> " ) . arg ( urlremoteorlocal ) ;
///////////subtext.append("<br/><br/>Description on image.</p>");
QTextDocumentFragment fragment = QTextDocumentFragment : : fromHtml ( subtext ) ;
ui . msgText - > textCursor ( ) . insertFragment ( fragment ) ;
//emit statusMessage(QString("Image new :").arg(urlremoteorlocal));
//}
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 ) ) {
for ( QStringList : : iterator fileIt = files . begin ( ) ; fileIt ! = files . end ( ) ; fileIt + + ) {
addAttachment ( ( * fileIt ) . toUtf8 ( ) . constData ( ) ) ;
}
2010-09-27 17:05:52 -04:00
}
}
void MessageComposer : : addAttachment ( std : : string filePath )
{
/* add a AttachFileItem to the attachment section */
std : : cerr < < " MessageComposer::addFile() hashing file. " ;
std : : cerr < < std : : endl ;
/* add widget in for new destination */
AttachFileItem * file = new AttachFileItem ( filePath ) ;
2010-11-26 10:32:46 -05:00
ui . hashBox - > show ( ) ;
ui . msgFileList - > hide ( ) ;
2010-09-27 17:05:52 -04:00
ui . verticalLayout - > addWidget ( file , 1 , 0 ) ;
//when the file is local or is finished hashing, call the fileHashingFinished method to send a chat message
if ( file - > getState ( ) = = AFI_STATE_LOCAL ) {
fileHashingFinished ( file ) ;
} else {
QObject : : connect ( file , SIGNAL ( fileFinished ( AttachFileItem * ) ) , this , SLOT ( fileHashingFinished ( AttachFileItem * ) ) ) ;
}
mAttachments . push_back ( file ) ;
if ( mCheckAttachment )
{
checkAttachmentReady ( ) ;
}
}
void MessageComposer : : fileHashingFinished ( AttachFileItem * file )
{
std : : cerr < < " MessageComposer::fileHashingFinished() started. " ;
std : : cerr < < std : : endl ;
//check that the file is ok tos end
if ( file - > getState ( ) = = AFI_STATE_ERROR ) {
# ifdef CHAT_DEBUG
std : : cerr < < " MessageComposer::fileHashingFinished error file is not hashed. " ;
# endif
return ;
}
2010-11-07 16:33:48 -05:00
FileInfo fileInfo ;
fileInfo . fname = file - > FileName ( ) ;
fileInfo . hash = file - > FileHash ( ) ;
fileInfo . size = file - > FileSize ( ) ;
2010-01-20 16:39:27 -05:00
2010-11-07 16:33:48 -05:00
addFile ( fileInfo ) ;
2010-01-20 16:39:27 -05:00
}
2008-03-26 15:30:34 -04:00
2010-05-23 15:13:41 -04:00
void MessageComposer : : checkAttachmentReady ( )
2010-01-21 11:35:00 -05:00
{
2010-09-27 17:05:52 -04:00
std : : list < AttachFileItem * > : : iterator fit ;
2010-01-21 11:35:00 -05:00
2010-09-27 17:05:52 -04:00
mCheckAttachment = false ;
2010-01-21 11:35:00 -05:00
2010-09-27 17:05:52 -04:00
for ( fit = mAttachments . begin ( ) ; fit ! = mAttachments . end ( ) ; fit + + )
{
if ( ! ( * fit ) - > isHidden ( ) )
{
if ( ! ( * fit ) - > ready ( ) )
{
ui . actionSend - > setEnabled ( false ) ;
break ;
}
}
}
2010-01-21 11:35:00 -05:00
2010-09-27 17:05:52 -04:00
if ( fit = = mAttachments . end ( ) )
{
ui . actionSend - > setEnabled ( true ) ;
2010-11-26 10:32:46 -05:00
ui . hashBox - > hide ( ) ;
ui . msgFileList - > show ( ) ;
2010-09-27 17:05:52 -04:00
}
2010-01-21 11:35:00 -05:00
2010-09-27 17:05:52 -04:00
/* repeat... */
int msec_rate = 1000 ;
QTimer : : singleShot ( msec_rate , this , SLOT ( checkAttachmentReady ( void ) ) ) ;
2010-01-21 11:35:00 -05:00
}
2010-05-29 15:05:10 -04:00
/* clear Filter */
void MessageComposer : : clearFilter ( )
{
ui . filterPatternLineEdit - > clear ( ) ;
ui . filterPatternLineEdit - > setFocus ( ) ;
}
void MessageComposer : : filterRegExpChanged ( )
{
QString text = ui . filterPatternLineEdit - > text ( ) ;
if ( text . isEmpty ( ) ) {
ui . clearButton - > hide ( ) ;
} else {
ui . clearButton - > show ( ) ;
}
FilterItems ( ) ;
}
void MessageComposer : : FilterItems ( )
{
QString sPattern = ui . filterPatternLineEdit - > text ( ) ;
int nCount = ui . msgSendList - > topLevelItemCount ( ) ;
for ( int nIndex = 0 ; nIndex < nCount ; nIndex + + ) {
FilterItem ( ui . msgSendList - > topLevelItem ( nIndex ) , sPattern ) ;
}
}
bool MessageComposer : : FilterItem ( QTreeWidgetItem * pItem , QString & sPattern )
{
bool bVisible = true ;
if ( sPattern . isEmpty ( ) = = false ) {
if ( pItem - > text ( 0 ) . contains ( sPattern , Qt : : CaseInsensitive ) = = false ) {
bVisible = false ;
}
}
int nVisibleChildCount = 0 ;
int nCount = pItem - > childCount ( ) ;
for ( int nIndex = 0 ; nIndex < nCount ; nIndex + + ) {
if ( FilterItem ( pItem - > child ( nIndex ) , sPattern ) ) {
nVisibleChildCount + + ;
}
}
if ( bVisible | | nVisibleChildCount ) {
pItem - > setHidden ( false ) ;
} else {
pItem - > setHidden ( true ) ;
}
return ( bVisible | | nVisibleChildCount ) ;
2010-09-11 06:39:40 -04:00
}
2010-09-27 17:05:52 -04:00
2011-05-21 12:26:00 -04:00
void MessageComposer : : addContact ( enumType type )
2010-09-27 17:05:52 -04:00
{
QTreeWidgetItemIterator itemIterator ( ui . msgSendList ) ;
QTreeWidgetItem * item ;
while ( ( item = * itemIterator ) ! = NULL ) {
itemIterator + + ;
if ( item - > isSelected ( ) ) {
std : : string id = item - > data ( COLUMN_CONTACT_DATA , ROLE_CONTACT_ID ) . toString ( ) . toStdString ( ) ;
bool group = ( item - > type ( ) = = TYPE_GROUP ) ;
addRecipient ( type , id , group ) ;
}
}
}
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
{
std : : list < std : : string > gpgIds ;
QTreeWidgetItemIterator itemIterator ( ui . msgSendList ) ;
QTreeWidgetItem * item ;
while ( ( item = * itemIterator ) ! = NULL ) {
itemIterator + + ;
if ( item - > isSelected ( ) ) {
std : : string id = item - > data ( COLUMN_CONTACT_DATA , ROLE_CONTACT_ID ) . toString ( ) . toStdString ( ) ;
bool group = ( item - > type ( ) = = TYPE_GROUP ) ;
if ( group ) {
RsGroupInfo groupInfo ;
if ( rsPeers - > getGroupInfo ( id , groupInfo ) = = false ) {
continue ;
}
std : : list < std : : string > : : iterator it ;
for ( it = groupInfo . peerIds . begin ( ) ; it ! = groupInfo . peerIds . end ( ) ; it + + ) {
if ( std : : find ( gpgIds . begin ( ) , gpgIds . end ( ) , * it ) = = gpgIds . end ( ) ) {
gpgIds . push_back ( * it ) ;
}
}
} else {
RsPeerDetails detail ;
if ( rsPeers - > getPeerDetails ( id , detail ) = = false ) {
continue ;
}
if ( std : : find ( gpgIds . begin ( ) , gpgIds . end ( ) , detail . gpg_id ) = = gpgIds . end ( ) ) {
gpgIds . push_back ( detail . gpg_id ) ;
}
}
}
}
if ( gpgIds . empty ( ) ) {
return ;
}
2011-06-14 16:42:32 -04:00
std : : list < std : : string > : : iterator it ;
for ( it = gpgIds . begin ( ) ; it ! = gpgIds . end ( ) ; it + + ) {
addRecipient ( CC , * it , false ) ;
}
2010-09-27 17:05:52 -04:00
QString text = BuildRecommendHtml ( gpgIds ) ;
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 ( )
{
QList < QTreeWidgetItem * > selectedItems = ui . msgSendList - > selectedItems ( ) ;
if ( selectedItems . count ( ) ! = 1 ) {
return ;
}
QTreeWidgetItem * item = selectedItems [ 0 ] ;
if ( item - > type ( ) = = TYPE_GROUP ) {
return ;
}
std : : string id = item - > data ( COLUMN_CONTACT_DATA , ROLE_CONTACT_ID ) . toString ( ) . toStdString ( ) ;
ConfCertDialog : : showIt ( id , ConfCertDialog : : PageDetails ) ;
}
2010-11-16 04:31:30 -05:00
void MessageComposer : : dragEnterEvent ( QDragEnterEvent * event )
{
/* print out mimeType */
std : : cerr < < " PopupChatDialog::dragEnterEvent() Formats " ;
std : : cerr < < std : : endl ;
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
QStringList : : iterator it ;
for ( it = formats . begin ( ) ; it ! = formats . end ( ) ; it + + ) {
std : : cerr < < " Format: " < < ( * it ) . toStdString ( ) ;
std : : cerr < < std : : endl ;
}
if ( event - > mimeData ( ) - > hasUrls ( ) ) {
std : : cerr < < " PopupChatDialog::dragEnterEvent() Accepting Urls " ;
std : : cerr < < std : : endl ;
event - > acceptProposedAction ( ) ;
} else {
std : : cerr < < " PopupChatDialog::dragEnterEvent() No Urls " ;
std : : cerr < < std : : endl ;
}
}
void MessageComposer : : dropEvent ( QDropEvent * event )
{
if ( ! ( Qt : : CopyAction & event - > possibleActions ( ) ) ) {
std : : cerr < < " PopupChatDialog::dropEvent() Rejecting uncopyable DropAction " ;
std : : cerr < < std : : endl ;
/* can't do it */
return ;
}
std : : cerr < < " PopupChatDialog::dropEvent() Formats " ;
std : : cerr < < std : : endl ;
QStringList formats = event - > mimeData ( ) - > formats ( ) ;
QStringList : : iterator it ;
for ( it = formats . begin ( ) ; it ! = formats . end ( ) ; it + + ) {
std : : cerr < < " Format: " < < ( * it ) . toStdString ( ) ;
std : : cerr < < std : : endl ;
}
if ( event - > mimeData ( ) - > hasUrls ( ) ) {
std : : cerr < < " PopupChatDialog::dropEvent() Urls: " ;
std : : cerr < < std : : endl ;
QList < QUrl > urls = event - > mimeData ( ) - > urls ( ) ;
QList < QUrl > : : iterator uit ;
for ( uit = urls . begin ( ) ; uit ! = urls . end ( ) ; uit + + ) {
QString localpath = uit - > toLocalFile ( ) ;
std : : cerr < < " Whole URL: " < < uit - > toString ( ) . toStdString ( ) < < std : : endl ;
std : : cerr < < " or As Local File: " < < localpath . toStdString ( ) < < std : : endl ;
if ( localpath . isEmpty ( ) = = false ) {
//Check that the file does exist and is not a directory
QDir dir ( localpath ) ;
if ( dir . exists ( ) ) {
std : : cerr < < " PopupChatDialog::dropEvent() directory not accepted. " < < std : : endl ;
QMessageBox mb ( tr ( " Drop file error. " ) , tr ( " Directory can't be dropped, only files are accepted. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 , this ) ;
mb . exec ( ) ;
} else if ( QFile : : exists ( localpath ) ) {
addAttachment ( localpath . toUtf8 ( ) . constData ( ) ) ;
} else {
std : : cerr < < " PopupChatDialog::dropEvent() file does not exists. " < < std : : endl ;
QMessageBox mb ( tr ( " Drop file error. " ) , tr ( " File not found or file name not accepted. " ) , QMessageBox : : Information , QMessageBox : : Ok , 0 , 0 , this ) ;
mb . exec ( ) ;
}
}
}
}
event - > setDropAction ( Qt : : CopyAction ) ;
event - > accept ( ) ;
}
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 ( ) ;
}
} 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 ( ) ;
}
}