~ubuntu-branches/ubuntu/utopic/psi/utopic

« back to all changes in this revision

Viewing changes to src/psichatdlg.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jan Niehusmann
  • Date: 2009-09-25 17:49:51 UTC
  • mfrom: (6.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20090925174951-lvm7kdap82o8xhn3
Tags: 0.13-1
* Updated to upstream version 0.13
* Set Standards-Version to 3.8.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
#include <QMenu>
18
18
#include <QDragEnterEvent>
19
19
#include <QMessageBox>
 
20
#include <QDebug>
20
21
 
21
22
#include "psicon.h"
22
23
#include "psiaccount.h"
38
39
#include "userlist.h"
39
40
#include "jidutil.h"
40
41
#include "textutil.h"
 
42
#include "xmpp_tasks.h"
 
43
 
 
44
 
 
45
#define MCMDCHAT                "http://psi-im.org/ids/mcmd#chatmain"
 
46
 
 
47
 
 
48
 
 
49
class PsiChatDlg::ChatDlgMCmdProvider : public QObject, public MCmdProviderIface {
 
50
        Q_OBJECT
 
51
public:
 
52
        ChatDlgMCmdProvider(PsiChatDlg *dlg) : dlg_(dlg) {};
 
53
 
 
54
        virtual bool mCmdTryStateTransit(MCmdStateIface *oldstate, QStringList command, MCmdStateIface *&newstate, QStringList &preset) {
 
55
                Q_UNUSED(preset);
 
56
                if (oldstate->getName() == MCMDCHAT) {
 
57
                        QString cmd;
 
58
                        if (command.count() > 0) cmd = command[0].lower();
 
59
                        if (cmd == "version") {
 
60
                                JT_ClientVersion *version = new JT_ClientVersion(dlg_->account()->client()->rootTask());
 
61
                                connect(version, SIGNAL(finished()), SLOT(version_finished()));
 
62
 
 
63
                                //qDebug() << "querying: " << dlg_->jid().full();
 
64
                                version->get(dlg_->jid());
 
65
                                version->go();
 
66
                                newstate = 0;
 
67
                        } else if (cmd == "clear") {
 
68
                                dlg_->doClear();
 
69
                                newstate = 0;
 
70
                        } else if (cmd == "vcard") {
 
71
                                dlg_->doInfo();
 
72
                                newstate = 0;
 
73
                        } else if (cmd == "auth") {
 
74
                                if (command.count() == 2) {
 
75
                                        if (command[1].lower() == "request") {
 
76
                                                // FIXME
 
77
                                        }
 
78
                                }
 
79
                                newstate = 0;
 
80
                        } else if (cmd == "compact") {
 
81
                                if (command.count() == 2) {
 
82
                                        QString sub = command[1].lower();
 
83
                                        if ("on" == sub) {
 
84
                                                dlg_->smallChat_ = true;
 
85
                                        } else if ("off" == sub) {
 
86
                                                dlg_->smallChat_ = false;
 
87
                                        } else {
 
88
                                                dlg_->appendSysMsg("usage: compact {on,off}");
 
89
                                        }
 
90
                                } else {
 
91
                                        dlg_->smallChat_ = !dlg_->smallChat_;
 
92
                                }
 
93
                                dlg_->setLooks();
 
94
                                newstate = 0;
 
95
                        } else if (!cmd.isEmpty()) {
 
96
                                return false;
 
97
                        }
 
98
                        return true;
 
99
                } else {
 
100
                        return false;
 
101
                }
 
102
        };
 
103
 
 
104
        virtual QStringList mCmdTryCompleteCommand(MCmdStateIface *state, QString query, QStringList partcommand, int item) {
 
105
                Q_UNUSED(partcommand);
 
106
                QStringList all;
 
107
                if (state->getName() == MCMDCHAT) {
 
108
                        if (item == 0) {
 
109
                                all << "version" << "clear" << "vcard" << "auth" << "compact";
 
110
                        }
 
111
                }
 
112
                QStringList res;
 
113
                foreach(QString cmd, all) {
 
114
                        if (cmd.startsWith(query)) {
 
115
                                res << cmd;
 
116
                        }
 
117
                }
 
118
                return res;
 
119
        };
 
120
 
 
121
        virtual void mCmdSiteDestroyed() {};
 
122
        virtual ~ChatDlgMCmdProvider() {};
 
123
 
 
124
 
 
125
public slots:
 
126
        void version_finished() {
 
127
                JT_ClientVersion *version = qobject_cast<JT_ClientVersion*>(sender());
 
128
                if (!version) {
 
129
                        dlg_->appendSysMsg("Error in version getter!");
 
130
                        return;
 
131
                }
 
132
                dlg_->appendSysMsg(QString("Version response: N: %2 V: %3 OS: %4")
 
133
                        .arg(version->name(), version->version(), version->os()));
 
134
        };
 
135
 
 
136
private:
 
137
        PsiChatDlg *dlg_;
 
138
};
 
139
 
 
140
 
41
141
 
42
142
PsiChatDlg::PsiChatDlg(const Jid& jid, PsiAccount* pa, TabManager* tabManager)
43
 
                : ChatDlg(jid, pa, tabManager)
 
143
                : ChatDlg(jid, pa, tabManager), mCmdManager_(&mCmdSite_), tabCompletion(&mCmdManager_)
44
144
{
45
145
        connect(account()->psi(), SIGNAL(accountCountChanged()), this, SLOT(updateIdentityVisibility()));
 
146
        mCmdManager_.registerProvider(new ChatDlgMCmdProvider(this));
46
147
}
47
148
 
48
149
void PsiChatDlg::initUi()
66
167
        initToolButtons();
67
168
        initToolBar();
68
169
        updateAvatar();
69
 
        
 
170
 
70
171
        PsiToolTip::install(ui_.avatar);
71
172
 
72
173
        UserListItem* u = account()->findFirstRelevant(jid());
88
189
        ui_.splitter->setSizes(list);
89
190
 
90
191
        smallChat_ = PsiOptions::instance()->getOption("options.ui.chat.use-small-chats").toBool();
 
192
 
 
193
        act_mini_cmd_ = new QAction(this);
 
194
        act_mini_cmd_->setText(tr("Input command..."));
 
195
        connect(act_mini_cmd_, SIGNAL(activated()), SLOT(doMiniCmd()));
 
196
        addAction(act_mini_cmd_);
 
197
 
 
198
        ui_.mini_prompt->hide();
 
199
 
91
200
}
92
201
 
93
202
void PsiChatDlg::updateCountVisibility()
148
257
        act_clear_->setShortcuts(ShortcutManager::instance()->shortcuts("chat.clear"));
149
258
        act_info_->setShortcuts(ShortcutManager::instance()->shortcuts("common.user-info"));
150
259
        act_history_->setShortcuts(ShortcutManager::instance()->shortcuts("common.history"));
 
260
 
 
261
        act_mini_cmd_->setShortcuts(ShortcutManager::instance()->shortcuts("chat.quick-command"));
 
262
 
151
263
}
152
264
 
153
265
void PsiChatDlg::updateIdentityVisibility()
163
275
 
164
276
void PsiChatDlg::initToolButtons()
165
277
{
166
 
        act_clear_ = new IconAction(tr("Clear chat window"), "psi/clearChat", tr("Clear chat window"), 0, this);
 
278
        act_clear_ = new IconAction(tr("Clear Chat Window"), "psi/clearChat", tr("Clear Chat Window"), 0, this);
167
279
        connect(act_clear_, SIGNAL(activated()), SLOT(doClearButton()));
168
280
 
169
281
        connect(account()->psi()->iconSelectPopup(), SIGNAL(textSelected(QString)), this, SLOT(addEmoticon(QString)));
170
 
        act_icon_ = new IconAction(tr("Select icon"), "psi/smile", tr("Select icon"), 0, this);
 
282
        act_icon_ = new IconAction(tr("Select Icon"), "psi/smile", tr("Select Icon"), 0, this);
171
283
        act_icon_->setMenu(account()->psi()->iconSelectPopup());
172
284
        ui_.tb_emoticons->setMenu(account()->psi()->iconSelectPopup());
173
285
 
175
287
        connect(act_voice_, SIGNAL(activated()), SLOT(doVoice()));
176
288
        act_voice_->setEnabled(false);
177
289
 
178
 
        act_file_ = new IconAction(tr("Send file"), "psi/upload", tr("Send file"), 0, this);
 
290
        act_file_ = new IconAction(tr("Send File"), "psi/upload", tr("Send File"), 0, this);
179
291
        connect(act_file_, SIGNAL(activated()), SLOT(doFile()));
180
292
 
181
 
        act_pgp_ = new IconAction(tr("Toggle encryption"), "psi/cryptoNo", tr("Toggle encryption"), 0, this, 0, true);
 
293
        act_pgp_ = new IconAction(tr("Toggle Encryption"), "psi/cryptoNo", tr("Toggle Encryption"), 0, this, 0, true);
182
294
        ui_.tb_pgp->setDefaultAction(act_pgp_);
183
295
 
184
 
        act_info_ = new IconAction(tr("User info"), "psi/vCard", tr("User info"), 0, this);
 
296
        act_info_ = new IconAction(tr("User Info"), "psi/vCard", tr("User Info"), 0, this);
185
297
        connect(act_info_, SIGNAL(activated()), SLOT(doInfo()));
186
298
 
187
 
        act_history_ = new IconAction(tr("Message history"), "psi/history", tr("Message history"), 0, this);
 
299
        act_history_ = new IconAction(tr("Message History"), "psi/history", tr("Message History"), 0, this);
188
300
        connect(act_history_, SIGNAL(activated()), SLOT(doHistory()));
189
301
 
190
 
        act_compact_ = new IconAction(tr("Toggle Compact/Full size"), "psi/compact", tr("Toggle Compact/Full size"), 0, this);
 
302
        act_compact_ = new IconAction(tr("Toggle Compact/Full Size"), "psi/compact", tr("Toggle Compact/Full Size"), 0, this);
191
303
        connect(act_compact_, SIGNAL(activated()), SLOT(toggleSmallChat()));
192
304
}
193
305
 
194
306
void PsiChatDlg::initToolBar()
195
307
{
196
 
        ui_.toolbar->setWindowTitle(tr("Chat toolbar"));
 
308
        ui_.toolbar->setWindowTitle(tr("Chat Toolbar"));
197
309
        ui_.toolbar->setIconSize(QSize(16, 16));
198
310
        ui_.toolbar->addAction(act_clear_);
199
311
        ui_.toolbar->addWidget(new StretchWidget(ui_.toolbar));
263
375
                if (jid().resource().isEmpty())
264
376
                        j = JIDUtil::toString(u->jid(), true);
265
377
                else
266
 
                        j = JIDUtil::toString(u->jid().userHost(), false) + '/' + jid().resource();
 
378
                        j = JIDUtil::toString(u->jid().bare(), false) + '/' + jid().resource();
267
379
 
268
380
                if (!u->name().isEmpty())
269
381
                        name = u->name() + QString(" <%1>").arg(j);
452
564
 
453
565
        connect(chatEdit(), SIGNAL(textChanged()), this, SLOT(updateCounter()));
454
566
        chatEdit()->installEventFilter(this);
 
567
 
 
568
        mCmdSite_.setInput(chatEdit());
 
569
        mCmdSite_.setPrompt(ui_.mini_prompt);
 
570
        tabCompletion.setTextEdit(chatEdit());
 
571
}
 
572
 
 
573
 
 
574
void PsiChatDlg::doSend() {
 
575
        tabCompletion.reset();
 
576
        if (mCmdSite_.isActive()) {
 
577
                QString str = chatEdit()->text();
 
578
                if (!mCmdManager_.processCommand(str)) {
 
579
                        appendSysMsg(tr("Error: Can not parse command: ") + str);
 
580
                }
 
581
        } else {
 
582
                ChatDlg::doSend();
 
583
        }
455
584
}
456
585
 
457
586
void PsiChatDlg::updateLastMsgTime(QDateTime t)
463
592
                chatView()->appendText(QString("<font color=\"%1\">*** %2</font>").arg(color).arg(t.date().toString(Qt::ISODate)));
464
593
        }
465
594
}
 
595
 
 
596
void PsiChatDlg::doMiniCmd()
 
597
{
 
598
        mCmdManager_.open(new MCmdSimpleState(MCMDCHAT, tr("Command>")), QStringList() );
 
599
}
 
600
 
 
601
 
 
602
bool PsiChatDlg::eventFilter( QObject *obj, QEvent *ev ) {
 
603
        if ( obj == chatEdit() && ev->type() == QEvent::KeyPress ) {
 
604
                QKeyEvent *e = (QKeyEvent *)ev;
 
605
 
 
606
                if ( e->key() == Qt::Key_Tab ) {
 
607
                        tabCompletion.tryComplete();
 
608
                        return true;
 
609
                }
 
610
 
 
611
                tabCompletion.reset();
 
612
                return false;
 
613
        }
 
614
 
 
615
        return ChatDlg::eventFilter( obj, ev );
 
616
}
 
617
 
 
618
 
 
619
#include "psichatdlg.moc"