summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2010-06-05 12:30:16 (GMT)
committerKevin Smith <git@kismith.co.uk>2010-06-05 12:30:16 (GMT)
commit087267cdfedeab2ae55776f7b7246c47f1d39d6d (patch)
tree47c5a3bedd1fa7eb61587a7bd17934f0927dbb9f /Swift/Controllers
parent7bca08eb2829982865f1649483f9aa01b3413b1c (diff)
downloadswift-087267cdfedeab2ae55776f7b7246c47f1d39d6d.zip
swift-087267cdfedeab2ae55776f7b7246c47f1d39d6d.tar.bz2
Tab completion in MUCs.
Resolves: #440
Diffstat (limited to 'Swift/Controllers')
-rw-r--r--Swift/Controllers/Chat/MUCController.cpp16
-rw-r--r--Swift/Controllers/Chat/MUCController.h2
-rw-r--r--Swift/Controllers/UIInterfaces/ChatWindow.h2
-rw-r--r--Swift/Controllers/UnitTest/MockChatWindow.h1
4 files changed, 20 insertions, 1 deletions
diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp
index 14fe180..65603d7 100644
--- a/Swift/Controllers/Chat/MUCController.cpp
+++ b/Swift/Controllers/Chat/MUCController.cpp
@@ -10,6 +10,7 @@
#include "Swiften/Network/Timer.h"
#include "Swiften/Network/TimerFactory.h"
+#include "SwifTools/TabComplete.h"
#include "Swiften/Base/foreach.h"
#include "Swift/Controllers/UIInterfaces/ChatWindow.h"
#include "Swift/Controllers/UIInterfaces/ChatWindowFactory.h"
@@ -49,7 +50,9 @@ MUCController::MUCController (
events_ = uiEventStream;
roster_ = new Roster(true);
+ completer_ = new TabComplete();
chatWindow_->setRosterModel(roster_);
+ chatWindow_->setTabComplete(completer_);
chatWindow_->onClosed.connect(boost::bind(&MUCController::handleWindowClosed, this));
muc_->onJoinComplete.connect(boost::bind(&MUCController::handleJoinComplete, this, _1));
muc_->onJoinFailed.connect(boost::bind(&MUCController::handleJoinFailed, this, _1));
@@ -79,6 +82,8 @@ MUCController::~MUCController() {
if (loginCheckTimer_) {
loginCheckTimer_->stop();
}
+ chatWindow_->setTabComplete(NULL);
+ delete completer_;
}
void MUCController::handleJoinTimeoutTick() {
@@ -139,6 +144,9 @@ void MUCController::handleWindowClosed() {
}
void MUCController::handleOccupantJoined(const MUCOccupant& occupant) {
+ if (nick_ != occupant.getNick()) {
+ completer_->addWord(occupant.getNick());
+ }
receivedActivity();
JID jid(nickToJID(occupant.getNick()));
JID realJID;
@@ -175,7 +183,12 @@ JID MUCController::nickToJID(const String& nick) {
return JID(toJID_.getNode(), toJID_.getDomain(), nick);
}
-void MUCController::preHandleIncomingMessage(boost::shared_ptr<Message>) {
+void MUCController::preHandleIncomingMessage(boost::shared_ptr<Message> message) {
+ String nick = message->getFrom().getResource();
+ if (nick != nick_) {
+ completer_->removeWord(nick);
+ completer_->addWord(nick);
+ }
/*Buggy implementations never send the status code, so use an incoming message as a hint that joining's done (e.g. the old ejabberd on psi-im.org).*/
receivedActivity();
joined_ = true;
@@ -206,6 +219,7 @@ String MUCController::roleToGroupName(MUCOccupant::Role role) {
}
void MUCController::handleOccupantLeft(const MUCOccupant& occupant, MUC::LeavingType, const String& reason) {
+ completer_->removeWord(occupant.getNick());
String partMessage = occupant.getNick() + " has left the room";
if (!reason.isEmpty()) {
partMessage += " (" + reason + ")";
diff --git a/Swift/Controllers/Chat/MUCController.h b/Swift/Controllers/Chat/MUCController.h
index f409309..a3c72e7 100644
--- a/Swift/Controllers/Chat/MUCController.h
+++ b/Swift/Controllers/Chat/MUCController.h
@@ -28,6 +28,7 @@ namespace Swift {
class AvatarManager;
class UIEventStream;
class TimerFactory;
+ class TabComplete;
class MUCController : public ChatControllerBase {
public:
@@ -60,6 +61,7 @@ namespace Swift {
UIEventStream* events_;
String nick_;
Roster* roster_;
+ TabComplete* completer_;
bool parting_;
bool joined_;
boost::bsignals::scoped_connection avatarChangedConnection_;
diff --git a/Swift/Controllers/UIInterfaces/ChatWindow.h b/Swift/Controllers/UIInterfaces/ChatWindow.h
index 7beb074..7e97f0c 100644
--- a/Swift/Controllers/UIInterfaces/ChatWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatWindow.h
@@ -20,6 +20,7 @@ namespace Swift {
class AvatarManager;
class TreeWidget;
class Roster;
+ class TabComplete;
class ChatWindow {
public:
@@ -44,6 +45,7 @@ namespace Swift {
virtual SecurityLabel getSelectedSecurityLabel() = 0;
virtual void setInputEnabled(bool enabled) = 0;
virtual void setRosterModel(Roster* model) = 0;
+ virtual void setTabComplete(TabComplete* completer) = 0;
boost::signal<void ()> onClosed;
boost::signal<void ()> onAllMessagesRead;
diff --git a/Swift/Controllers/UnitTest/MockChatWindow.h b/Swift/Controllers/UnitTest/MockChatWindow.h
index 1ce87ff..78705ce 100644
--- a/Swift/Controllers/UnitTest/MockChatWindow.h
+++ b/Swift/Controllers/UnitTest/MockChatWindow.h
@@ -31,6 +31,7 @@ namespace Swift {
virtual SecurityLabel getSelectedSecurityLabel() {return SecurityLabel();};
virtual void setInputEnabled(bool /*enabled*/) {};
virtual void setRosterModel(Roster* /*roster*/) {};
+ virtual void setTabComplete(TabComplete* complete) {};
boost::signal<void ()> onClosed;
boost::signal<void ()> onAllMessagesRead;