1 /***************************************************************************
2 * Copyright (C) 2005/06 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include "tabcompleter.h"
23 #include "inputline.h"
25 #include "buffermodel.h"
26 #include "networkmodel.h"
28 #include "ircchannel.h"
31 TabCompleter::TabCompleter(InputLine *inputLine_)
32 : QObject(inputLine_),
33 inputLine(inputLine_),
39 void TabCompleter::buildCompletionList() {
40 completionList.clear();
41 nextCompletion = completionList.begin();
42 // this is the first time tab is pressed -> build up the completion list and it's iterator
43 QModelIndex currentIndex = Client::bufferModel()->currentIndex();
44 if(!currentIndex.data(NetworkModel::BufferIdRole).isValid())
47 NetworkId networkId = currentIndex.data(NetworkModel::NetworkIdRole).value<NetworkId>();
48 QString channelName = currentIndex.sibling(currentIndex.row(), 0).data().toString();
50 const Network *network = Client::network(networkId);
54 IrcChannel *channel = network->ircChannel(channelName);
58 // FIXME commented for debugging
60 disconnect(this, SLOT(ircUserJoinedOrParted(IrcUser *)));
61 connect(channel, SIGNAL(ircUserJoined(IrcUser *)),
62 this, SLOT(ircUserJoinedOrParted(IrcUser *)));
63 connect(channel, SIGNAL(ircUserParted(IrcUser *)),
64 this, SLOT(ircUserJoinedOrParted(IrcUser *)));
67 completionList.clear();
68 QString tabAbbrev = inputLine->text().left(inputLine->cursorPosition()).section(' ',-1,-1);
69 completionList.clear();
70 foreach(IrcUser *ircUser, channel->ircUsers()) {
71 if(ircUser->nick().toLower().startsWith(tabAbbrev.toLower())) {
72 completionList << ircUser->nick();
75 completionList.sort();
76 nextCompletion = completionList.begin();
77 lastCompletionLength = tabAbbrev.length();
80 void TabCompleter::ircUserJoinedOrParted(IrcUser *ircUser) {
82 buildCompletionList();
85 void TabCompleter::complete() {
87 buildCompletionList();
91 if (nextCompletion != completionList.end()) {
92 // clear previous completion
93 for (int i = 0; i < lastCompletionLength; i++) {
94 inputLine->backspace();
98 inputLine->insert(*nextCompletion);
100 // remember charcount to delete next time and advance to next completion
101 lastCompletionLength = nextCompletion->length();
104 // we're completing the first word of the line
105 if(inputLine->text().length() == lastCompletionLength) {
106 inputLine->insert(nickSuffix);
107 lastCompletionLength += nickSuffix.length();
110 // we're at the end of the list -> start over again
112 nextCompletion = completionList.begin();
117 void TabCompleter::reset() {