author | zecke <zecke> | 2004-09-06 22:47:48 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-09-06 22:47:48 (UTC) |
commit | 8f18e8b46dfaaa7e03b9ed1f3faed12da5b30cd5 (patch) (unidiff) | |
tree | 39158cd8abe423cf2df95b5038cdc7848de2e3dc | |
parent | 8bf99aaa1b31e770b21b7bf50407a650a8f5d646 (diff) | |
download | opie-8f18e8b46dfaaa7e03b9ed1f3faed12da5b30cd5.zip opie-8f18e8b46dfaaa7e03b9ed1f3faed12da5b30cd5.tar.gz opie-8f18e8b46dfaaa7e03b9ed1f3faed12da5b30cd5.tar.bz2 |
-Some keyboard handling
-ping notification
merge of zautrixs work
-rw-r--r-- | noncore/net/opieirc/ircchanneltab.cpp | 18 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmessageparser.cpp | 24 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmisc.cpp | 19 | ||||
-rw-r--r-- | noncore/net/opieirc/ircmisc.h | 8 | ||||
-rw-r--r-- | noncore/net/opieirc/ircquerytab.cpp | 9 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.cpp | 15 | ||||
-rw-r--r-- | noncore/net/opieirc/ircservertab.h | 2 | ||||
-rw-r--r-- | noncore/net/opieirc/irctab.cpp | 7 | ||||
-rw-r--r-- | noncore/net/opieirc/irctab.h | 10 | ||||
-rw-r--r-- | noncore/net/opieirc/mainwindow.cpp | 37 | ||||
-rw-r--r-- | noncore/net/opieirc/mainwindow.h | 7 |
11 files changed, 138 insertions, 18 deletions
diff --git a/noncore/net/opieirc/ircchanneltab.cpp b/noncore/net/opieirc/ircchanneltab.cpp index 667e977..b6e3954 100644 --- a/noncore/net/opieirc/ircchanneltab.cpp +++ b/noncore/net/opieirc/ircchanneltab.cpp | |||
@@ -14,64 +14,80 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW | |||
14 | m_textview->setHScrollBarMode(QScrollView::AlwaysOff); | 14 | m_textview->setHScrollBarMode(QScrollView::AlwaysOff); |
15 | m_textview->setVScrollBarMode(QScrollView::AlwaysOn); | 15 | m_textview->setVScrollBarMode(QScrollView::AlwaysOn); |
16 | m_listVisible = TRUE; | 16 | m_listVisible = TRUE; |
17 | m_listButton = new QPushButton(">", m_textview); | 17 | m_listButton = new QPushButton(">", m_textview); |
18 | m_textview->setCornerWidget(m_listButton); | 18 | m_textview->setCornerWidget(m_listButton); |
19 | m_textview->setTextFormat(RichText); | 19 | m_textview->setTextFormat(RichText); |
20 | QWhatsThis::add(m_textview, tr("Channel discussion")); | 20 | QWhatsThis::add(m_textview, tr("Channel discussion")); |
21 | connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList())); | 21 | connect(m_listButton, SIGNAL(clicked()), this, SLOT(toggleList())); |
22 | m_list = new IRCChannelList(m_channel, hbox); | 22 | m_list = new IRCChannelList(m_channel, hbox); |
23 | m_list->update(); | 23 | m_list->update(); |
24 | m_list->setMaximumWidth(LISTWIDTH); | 24 | m_list->setMaximumWidth(LISTWIDTH); |
25 | m_field = new IRCHistoryLineEdit(this); | 25 | m_field = new IRCHistoryLineEdit(this); |
26 | connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab())); | ||
27 | connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab())); | ||
28 | connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab())); | ||
29 | connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus())); | ||
30 | |||
26 | QWhatsThis::add(m_field, tr("Type your message here to participate in the channel discussion")); | 31 | QWhatsThis::add(m_field, tr("Type your message here to participate in the channel discussion")); |
27 | m_popup = new QPopupMenu(m_list); | 32 | m_popup = new QPopupMenu(m_list); |
28 | m_lines = 0; | 33 | m_lines = 0; |
29 | /* Required so that embedded-style "right" clicks work */ | 34 | /* Required so that embedded-style "right" clicks work */ |
30 | QPEApplication::setStylusOperation(m_list->viewport(), QPEApplication::RightOnHold); | 35 | QPEApplication::setStylusOperation(m_list->viewport(), QPEApplication::RightOnHold); |
31 | connect(m_list, SIGNAL(mouseButtonPressed(int,QListBoxItem*,const QPoint&)), this, SLOT(mouseButtonPressed(int,QListBoxItem*,const QPoint&))); | 36 | connect(m_list, SIGNAL(mouseButtonPressed(int,QListBoxItem*,const QPoint&)), this, SLOT(mouseButtonPressed(int,QListBoxItem*,const QPoint&))); |
32 | /* Construct the popup menu */ | 37 | /* Construct the popup menu */ |
33 | QPopupMenu *ctcpMenu = new QPopupMenu(m_list); | 38 | QPopupMenu *ctcpMenu = new QPopupMenu(m_list); |
34 | m_popup->insertItem(Resource::loadPixmap("opieirc/ctcp"), tr("CTCP"), ctcpMenu); | 39 | m_popup->insertItem(Resource::loadPixmap("opieirc/ctcp"), tr("CTCP"), ctcpMenu); |
35 | m_popup->insertItem(Resource::loadPixmap("opieirc/query"), tr("Query"), this, SLOT(popupQuery())); | 40 | m_popup->insertItem(Resource::loadPixmap("opieirc/query"), tr("Query"), this, SLOT(popupQuery())); |
36 | ctcpMenu->insertItem(Resource::loadPixmap("opieirc/ping"), tr("Ping"), this, SLOT(popupPing())); | 41 | ctcpMenu->insertItem(Resource::loadPixmap("opieirc/ping"), tr("Ping"), this, SLOT(popupPing())); |
37 | ctcpMenu->insertItem(Resource::loadPixmap("opieirc/version"), tr("Version"), this, SLOT(popupVersion())); | 42 | ctcpMenu->insertItem(Resource::loadPixmap("opieirc/version"), tr("Version"), this, SLOT(popupVersion())); |
38 | ctcpMenu->insertItem(Resource::loadPixmap("opieirc/whois"), tr("Whois"), this, SLOT(popupWhois())); | 43 | ctcpMenu->insertItem(Resource::loadPixmap("opieirc/whois"), tr("Whois"), this, SLOT(popupWhois())); |
39 | connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); | 44 | connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); |
40 | m_layout->add(hbox); | 45 | m_layout->add(hbox); |
41 | hbox->show(); | 46 | hbox->show(); |
42 | m_layout->add(m_field); | 47 | m_layout->add(m_field); |
43 | m_field->setFocus(); | 48 | m_field->setFocus(); |
49 | m_field->setActiveWindow(); | ||
50 | |||
44 | connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); | 51 | connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); |
45 | settingsChanged(); | 52 | settingsChanged(); |
46 | } | 53 | } |
47 | 54 | ||
48 | void IRCChannelTab::scrolling(){ | 55 | void IRCChannelTab::scrolling(){ |
49 | m_textview->ensureVisible(0, m_textview->contentsHeight()); | 56 | m_textview->ensureVisible(0, m_textview->contentsHeight()); |
50 | } | 57 | } |
51 | 58 | ||
52 | void IRCChannelTab::appendText(QString text) { | 59 | void IRCChannelTab::appendText(QString text) { |
53 | /* not using append because it creates layout problems */ | 60 | /* not using append because it creates layout problems */ |
54 | QString txt = m_textview->text() + text + "\n"; | 61 | QString txt = m_textview->text() + text + "\n"; |
55 | if (m_maxLines > 0 && m_lines >= m_maxLines) { | 62 | if (m_maxLines > 0 && m_lines >= m_maxLines) { |
56 | int firstBreak = txt.find('\n'); | 63 | int firstBreak = txt.find('\n'); |
57 | if (firstBreak != -1) { | 64 | if (firstBreak != -1) { |
58 | txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1)); | 65 | txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1)); |
59 | } | 66 | } |
60 | } else { | 67 | } else { |
61 | m_lines++; | 68 | m_lines++; |
62 | } | 69 | } |
63 | m_textview->ensureVisible(0, m_textview->contentsHeight()); | 70 | m_textview->ensureVisible(0, m_textview->contentsHeight()); |
64 | m_textview->setText(txt); | 71 | m_textview->setText(txt); |
65 | m_textview->ensureVisible(0, m_textview->contentsHeight()); | 72 | m_textview->ensureVisible(0, m_textview->contentsHeight()); |
73 | |||
74 | int p1, p2; | ||
75 | if ( (p1 = text.find("ping", 0, false) )!= -1 && (p2 = text.find( m_parentTab->server()->nick(), 0,false )) != -1 ) { | ||
76 | int col = text.findRev("color", -1, false); | ||
77 | if ( col < p2 ) | ||
78 | emit ping( title() ); | ||
79 | |||
80 | } | ||
81 | |||
66 | emit changed(this); | 82 | emit changed(this); |
67 | } | 83 | } |
68 | 84 | ||
69 | IRCChannelTab::~IRCChannelTab() { | 85 | IRCChannelTab::~IRCChannelTab() { |
70 | m_parentTab->removeChannelTab(this); | 86 | m_parentTab->removeChannelTab(this); |
71 | } | 87 | } |
72 | 88 | ||
73 | void IRCChannelTab::processCommand() { | 89 | void IRCChannelTab::processCommand() { |
74 | QString text = m_field->text(); | 90 | QString text = m_field->text(); |
75 | if (text.length()>0) { | 91 | if (text.length()>0) { |
76 | if (session()->isSessionActive()) { | 92 | if (session()->isSessionActive()) { |
77 | if (text.startsWith("/") && !text.startsWith("//")) { | 93 | if (text.startsWith("/") && !text.startsWith("//")) { |
@@ -113,25 +129,25 @@ void IRCChannelTab::mouseButtonPressed(int mouse, QListBoxItem *, const QPoint & | |||
113 | case 2: | 129 | case 2: |
114 | m_popup->popup(point); | 130 | m_popup->popup(point); |
115 | break; | 131 | break; |
116 | }; | 132 | }; |
117 | } | 133 | } |
118 | 134 | ||
119 | void IRCChannelTab::popupQuery() { | 135 | void IRCChannelTab::popupQuery() { |
120 | if (m_list->currentItem() != -1) { | 136 | if (m_list->currentItem() != -1) { |
121 | IRCPerson *person = session()->getPerson(m_list->item(m_list->currentItem())->text()); | 137 | IRCPerson *person = session()->getPerson(m_list->item(m_list->currentItem())->text()); |
122 | if (person) { | 138 | if (person) { |
123 | IRCQueryTab *tab = m_parentTab->getTabForQuery(person); | 139 | IRCQueryTab *tab = m_parentTab->getTabForQuery(person); |
124 | if (!tab) { | 140 | if (!tab) { |
125 | tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent()); | 141 | tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent()); |
126 | m_parentTab->addQueryTab(tab); | 142 | m_parentTab->addQueryTab(tab); |
127 | m_mainWindow->addTab(tab); | 143 | m_mainWindow->addTab(tab); |
128 | } | 144 | } |
129 | } | 145 | } |
130 | } | 146 | } |
131 | } | 147 | } |
132 | 148 | ||
133 | void IRCChannelTab::popupPing() { | 149 | void IRCChannelTab::popupPing() { |
134 | //HAHA, no wonder these don't work | 150 | //HAHA, no wonder these don't work |
135 | } | 151 | } |
136 | 152 | ||
137 | void IRCChannelTab::popupVersion() { | 153 | void IRCChannelTab::popupVersion() { |
diff --git a/noncore/net/opieirc/ircmessageparser.cpp b/noncore/net/opieirc/ircmessageparser.cpp index 400ff41..90280d7 100644 --- a/noncore/net/opieirc/ircmessageparser.cpp +++ b/noncore/net/opieirc/ircmessageparser.cpp | |||
@@ -1,43 +1,43 @@ | |||
1 | #include <qtextstream.h> | 1 | #include <qtextstream.h> |
2 | #include "ircmessageparser.h" | 2 | #include "ircmessageparser.h" |
3 | #include "ircversion.h" | 3 | #include "ircversion.h" |
4 | 4 | ||
5 | /* Lookup table for literal commands */ | 5 | /* Lookup table for literal commands */ |
6 | IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = { | 6 | IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = { |
7 | { "PING", FUNC(parseLiteralPing) }, | 7 | { "PING", FUNC(parseLiteralPing) }, |
8 | { "NOTICE", FUNC(parseLiteralNotice) }, | 8 | { "NOTICE", FUNC(parseLiteralNotice) }, |
9 | { "JOIN", FUNC(parseLiteralJoin) }, | 9 | { "JOIN", FUNC(parseLiteralJoin) }, |
10 | { "PRIVMSG", FUNC(parseLiteralPrivMsg) }, | 10 | { "PRIVMSG", FUNC(parseLiteralPrivMsg) }, |
11 | { "NICK", FUNC(parseLiteralNick) }, | 11 | { "NICK", FUNC(parseLiteralNick) }, |
12 | { "PART", FUNC(parseLiteralPart) }, | 12 | { "PART", FUNC(parseLiteralPart) }, |
13 | { "QUIT", FUNC(parseLiteralQuit) }, | 13 | { "QUIT", FUNC(parseLiteralQuit) }, |
14 | { "ERROR", FUNC(parseLiteralError) }, | 14 | { "ERROR", FUNC(parseLiteralError) }, |
15 | { "ERROR:", FUNC(parseLiteralError) }, | 15 | { "ERROR:", FUNC(parseLiteralError) }, |
16 | { "MODE", FUNC(parseLiteralMode) }, | 16 | { "MODE", FUNC(parseLiteralMode) }, |
17 | { "KICK", FUNC(parseLiteralKick) }, | 17 | { "KICK", FUNC(parseLiteralKick) }, |
18 | { "TOPIC", FUNC(parseLiteralTopic) }, | 18 | { "TOPIC", FUNC(parseLiteralTopic) }, |
19 | { 0 , 0 } | 19 | { 0 , 0 } |
20 | }; | 20 | }; |
21 | 21 | ||
22 | /* Lookup table for literal commands */ | 22 | /* Lookup table for literal commands */ |
23 | IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = { | 23 | IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = { |
24 | { "PING", FUNC(parseCTCPPing) }, | 24 | { "PING", FUNC(parseCTCPPing) }, |
25 | { "VERSION", FUNC(parseCTCPVersion) }, | 25 | { "VERSION", FUNC(parseCTCPVersion) }, |
26 | { "ACTION", FUNC(parseCTCPAction) }, | 26 | { "ACTION", FUNC(parseCTCPAction) }, |
27 | { 0 , 0 } | 27 | { 0 , 0 } |
28 | }; | 28 | }; |
29 | 29 | ||
30 | /* Lookup table for numerical commands */ | 30 | /* Lookup table for numerical commands */ |
31 | IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { | 31 | IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { |
32 | { 1, FUNC(parseNumerical001) }, // RPL_WELCOME | 32 | { 1, FUNC(parseNumerical001) }, // RPL_WELCOME |
33 | { 2, FUNC(parseNumerical002) }, // RPL_YOURHOST | 33 | { 2, FUNC(parseNumerical002) }, // RPL_YOURHOST |
34 | { 3, FUNC(parseNumerical003) }, // RPL_CREATED | 34 | { 3, FUNC(parseNumerical003) }, // RPL_CREATED |
35 | { 4, FUNC(parseNumerical004) }, // RPL_MYINFO | 35 | { 4, FUNC(parseNumerical004) }, // RPL_MYINFO |
36 | { 5, FUNC(parseNumerical005) }, // RPL_BOUNCE, RPL_PROTOCTL | 36 | { 5, FUNC(parseNumerical005) }, // RPL_BOUNCE, RPL_PROTOCTL |
37 | { 251, FUNC(parseNumericalStats) }, // RPL_LUSERCLIENT | 37 | { 251, FUNC(parseNumericalStats) }, // RPL_LUSERCLIENT |
38 | { 252, FUNC(parseNumericalStats) }, // RPL_LUSEROP | 38 | { 252, FUNC(parseNumericalStats) }, // RPL_LUSEROP |
39 | { 265, FUNC(parseNumericalStats) }, // RPL_LOCALUSERS | 39 | { 265, FUNC(parseNumericalStats) }, // RPL_LOCALUSERS |
40 | { 266, FUNC(parseNumericalStats) }, // RPL_GLOBALUSERS | 40 | { 266, FUNC(parseNumericalStats) }, // RPL_GLOBALUSERS |
41 | { 250, FUNC(parseNumericalStats) }, // RPL_STATSCONN | 41 | { 250, FUNC(parseNumericalStats) }, // RPL_STATSCONN |
42 | { 254, FUNC(nullFunc)}, // RPL_LUSERCHANNELS | 42 | { 254, FUNC(nullFunc)}, // RPL_LUSERCHANNELS |
43 | { 255, FUNC(parseNumericalStats) }, // RPL_LUSERNAME | 43 | { 255, FUNC(parseNumericalStats) }, // RPL_LUSERNAME |
@@ -162,25 +162,25 @@ void IRCMessageParser::parseLiteralPart(IRCMessage *message) { | |||
162 | emit outputReady(output); | 162 | emit outputReady(output); |
163 | delete person; | 163 | delete person; |
164 | } else { | 164 | } else { |
165 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Parting person not found - desynchronized?"))); | 165 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Parting person not found - desynchronized?"))); |
166 | } | 166 | } |
167 | } | 167 | } |
168 | } else { | 168 | } else { |
169 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel for part not found - desynchronized?"))); | 169 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel for part not found - desynchronized?"))); |
170 | } | 170 | } |
171 | } | 171 | } |
172 | 172 | ||
173 | void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { | 173 | void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { |
174 | if (m_session->m_server->nick() == message->param(0)) { | 174 | if (m_session->m_server->nick().lower() == message->param(0).lower() ) { |
175 | /* IRC Query message detected, verify sender and display it */ | 175 | /* IRC Query message detected, verify sender and display it */ |
176 | IRCPerson mask(message->prefix()); | 176 | IRCPerson mask(message->prefix()); |
177 | IRCPerson *person = m_session->getPerson(mask.nick()); | 177 | IRCPerson *person = m_session->getPerson(mask.nick()); |
178 | if (!person) { | 178 | if (!person) { |
179 | /* Person not yet known, create and add to the current session */ | 179 | /* Person not yet known, create and add to the current session */ |
180 | person = new IRCPerson(message->prefix()); | 180 | person = new IRCPerson(message->prefix()); |
181 | m_session->addPerson(person); | 181 | m_session->addPerson(person); |
182 | } | 182 | } |
183 | IRCOutput output(OUTPUT_QUERYPRIVMSG, message->param(1)); | 183 | IRCOutput output(OUTPUT_QUERYPRIVMSG, message->param(1)); |
184 | output.addParam(person); | 184 | output.addParam(person); |
185 | emit outputReady(output); | 185 | emit outputReady(output); |
186 | } else if (message->param(0).at(0) == '#' || message->param(0).at(0) == '+') { | 186 | } else if (message->param(0).at(0) == '#' || message->param(0).at(0) == '+') { |
@@ -197,67 +197,67 @@ void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) { | |||
197 | } else { | 197 | } else { |
198 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown sender"))); | 198 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown sender"))); |
199 | } | 199 | } |
200 | } else { | 200 | } else { |
201 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown channel %1").arg(message->param(0).lower()) )); | 201 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Channel message with unknown channel %1").arg(message->param(0).lower()) )); |
202 | } | 202 | } |
203 | } else { | 203 | } else { |
204 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received PRIVMSG of unknown type"))); | 204 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Received PRIVMSG of unknown type"))); |
205 | } | 205 | } |
206 | } | 206 | } |
207 | 207 | ||
208 | void IRCMessageParser::parseLiteralNick(IRCMessage *message) { | 208 | void IRCMessageParser::parseLiteralNick(IRCMessage *message) { |
209 | 209 | ||
210 | IRCPerson mask(message->prefix()); | 210 | IRCPerson mask(message->prefix()); |
211 | /* this way of handling nick changes really sucks */ | 211 | /* this way of handling nick changes really sucks */ |
212 | if (mask.nick() == m_session->m_server->nick()) { | 212 | if (mask.nick() == m_session->m_server->nick()) { |
213 | /* We are changing our nickname */ | 213 | /* We are changing our nickname */ |
214 | m_session->m_server->setNick(message->param(0)); | 214 | m_session->m_server->setNick(message->param(0)); |
215 | IRCOutput output(OUTPUT_NICKCHANGE, tr("You are now known as %1").arg( message->param(0))); | 215 | IRCOutput output(OUTPUT_NICKCHANGE, tr("You are now known as %1").arg( message->param(0))); |
216 | output.addParam(0); | 216 | output.addParam(0); |
217 | emit outputReady(output); | 217 | emit outputReady(output); |
218 | } else { | 218 | } else { |
219 | /* Someone else is */ | 219 | /* Someone else is */ |
220 | IRCPerson *person = m_session->getPerson(mask.nick()); | 220 | IRCPerson *person = m_session->getPerson(mask.nick()); |
221 | if (person) { | 221 | if (person) { |
222 | //IRCOutput output(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg( mask.nick() ).arg( message->param(0))); | 222 | //IRCOutput output(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg( mask.nick() ).arg( message->param(0))); |
223 | 223 | ||
224 | /* new code starts here -- this removes the person from all channels */ | 224 | /* new code starts here -- this removes the person from all channels */ |
225 | QList<IRCChannel> channels; | 225 | QList<IRCChannel> channels; |
226 | m_session->getChannelsByPerson(person, channels); | 226 | m_session->getChannelsByPerson(person, channels); |
227 | QListIterator<IRCChannel> it(channels); | 227 | QListIterator<IRCChannel> it(channels); |
228 | for (;it.current(); ++it) { | 228 | for (;it.current(); ++it) { |
229 | IRCChannelPerson *chanperson = it.current()->getPerson(mask.nick()); | 229 | IRCChannelPerson *chanperson = it.current()->getPerson(mask.nick()); |
230 | it.current()->removePerson(chanperson); | 230 | it.current()->removePerson(chanperson); |
231 | chanperson->person->setNick(message->param(0)); | 231 | chanperson->person->setNick(message->param(0)); |
232 | it.current()->addPerson(chanperson); | 232 | it.current()->addPerson(chanperson); |
233 | IRCOutput output(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg( mask.nick() ).arg( message->param(0))); | 233 | IRCOutput output(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg( mask.nick() ).arg( message->param(0))); |
234 | output.addParam(person); | 234 | output.addParam(person); |
235 | emit outputReady(output); | 235 | emit outputReady(output); |
236 | } | 236 | } |
237 | /* new code ends here */ | 237 | /* new code ends here */ |
238 | } else { | 238 | } else { |
239 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person"))); | 239 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person"))); |
240 | } | 240 | } |
241 | } | 241 | } |
242 | } | 242 | } |
243 | 243 | ||
244 | void IRCMessageParser::parseLiteralQuit(IRCMessage *message) { | 244 | void IRCMessageParser::parseLiteralQuit(IRCMessage *message) { |
245 | IRCPerson mask(message->prefix()); | 245 | IRCPerson mask(message->prefix()); |
246 | IRCPerson *person = m_session->getPerson(mask.nick()); | 246 | IRCPerson *person = m_session->getPerson(mask.nick()); |
247 | if (person) { | 247 | if (person) { |
248 | QList<IRCChannel> channels; | 248 | QList<IRCChannel> channels; |
249 | m_session->getChannelsByPerson(person, channels); | 249 | m_session->getChannelsByPerson(person, channels); |
250 | QListIterator<IRCChannel> it(channels); | 250 | QListIterator<IRCChannel> it(channels); |
251 | for (;it.current(); ++it) { | 251 | for (;it.current(); ++it) { |
252 | IRCChannelPerson *chanperson = it.current()->getPerson(mask.nick()); | 252 | IRCChannelPerson *chanperson = it.current()->getPerson(mask.nick()); |
253 | it.current()->removePerson(chanperson); | 253 | it.current()->removePerson(chanperson); |
254 | delete chanperson; | 254 | delete chanperson; |
255 | } | 255 | } |
256 | m_session->removePerson(person); | 256 | m_session->removePerson(person); |
257 | IRCOutput output(OUTPUT_QUIT, tr("%1 has quit (%2)" ).arg( mask.nick() ).arg( message->param(0) )); | 257 | IRCOutput output(OUTPUT_QUIT, tr("%1 has quit (%2)" ).arg( mask.nick() ).arg( message->param(0) )); |
258 | output.addParam(person); | 258 | output.addParam(person); |
259 | emit outputReady(output); | 259 | emit outputReady(output); |
260 | delete person; | 260 | delete person; |
261 | } else { | 261 | } else { |
262 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Unknown person quit - desynchronized?"))); | 262 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Unknown person quit - desynchronized?"))); |
263 | } | 263 | } |
@@ -316,25 +316,25 @@ void IRCMessageParser::parseCTCPAction(IRCMessage *message) { | |||
316 | /* Person not yet known, create and add to the current session */ | 316 | /* Person not yet known, create and add to the current session */ |
317 | person = new IRCPerson(message->prefix()); | 317 | person = new IRCPerson(message->prefix()); |
318 | m_session->addPerson(person); | 318 | m_session->addPerson(person); |
319 | } | 319 | } |
320 | IRCOutput output(OUTPUT_QUERYACTION, "*" + mask.nick() + message->param(0)); | 320 | IRCOutput output(OUTPUT_QUERYACTION, "*" + mask.nick() + message->param(0)); |
321 | output.addParam(person); | 321 | output.addParam(person); |
322 | emit outputReady(output); | 322 | emit outputReady(output); |
323 | } else { | 323 | } else { |
324 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP ACTION with bad recipient"))); | 324 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("CTCP ACTION with bad recipient"))); |
325 | } | 325 | } |
326 | } | 326 | } |
327 | } | 327 | } |
328 | 328 | ||
329 | void IRCMessageParser::parseLiteralMode(IRCMessage *message) { | 329 | void IRCMessageParser::parseLiteralMode(IRCMessage *message) { |
330 | IRCPerson mask(message->prefix()); | 330 | IRCPerson mask(message->prefix()); |
331 | 331 | ||
332 | if (message->param(0).startsWith("#")) { | 332 | if (message->param(0).startsWith("#")) { |
333 | IRCChannel *channel = m_session->getChannel(message->param(0).lower()); | 333 | IRCChannel *channel = m_session->getChannel(message->param(0).lower()); |
334 | if (channel) { | 334 | if (channel) { |
335 | QString temp, parameters = message->allParameters().right(message->allParameters().length() - channel->channelname().length() - 1); | 335 | QString temp, parameters = message->allParameters().right(message->allParameters().length() - channel->channelname().length() - 1); |
336 | QTextIStream stream(¶meters); | 336 | QTextIStream stream(¶meters); |
337 | bool set = FALSE; | 337 | bool set = FALSE; |
338 | while (!stream.atEnd()) { | 338 | while (!stream.atEnd()) { |
339 | stream >> temp; | 339 | stream >> temp; |
340 | if (temp.startsWith("+")) { | 340 | if (temp.startsWith("+")) { |
@@ -452,42 +452,42 @@ void IRCMessageParser::parseNumericalStats(IRCMessage *message) { | |||
452 | } | 452 | } |
453 | 453 | ||
454 | void IRCMessageParser::parseNumericalNames(IRCMessage *message) { | 454 | void IRCMessageParser::parseNumericalNames(IRCMessage *message) { |
455 | /* Name list sent when joining a channel */ | 455 | /* Name list sent when joining a channel */ |
456 | IRCChannel *channel = m_session->getChannel(message->param(2).lower()); | 456 | IRCChannel *channel = m_session->getChannel(message->param(2).lower()); |
457 | if (channel != 0) { | 457 | if (channel != 0) { |
458 | QString people = message->param(3); | 458 | QString people = message->param(3); |
459 | QTextIStream stream(&people); | 459 | QTextIStream stream(&people); |
460 | QString temp; | 460 | QString temp; |
461 | 461 | ||
462 | while (!stream.atEnd()) { | 462 | while (!stream.atEnd()) { |
463 | stream >> temp; | 463 | stream >> temp; |
464 | 464 | ||
465 | char flagch = temp.at(0).latin1(); | 465 | char flagch = temp.at(0).latin1(); |
466 | int flag = 0; | 466 | int flag = 0; |
467 | QString nick; | 467 | QString nick; |
468 | /* Parse person flags */ | 468 | /* Parse person flags */ |
469 | if (flagch == '@' || flagch == '+' || flagch=='%' || flagch == '*') { | 469 | if (flagch == '@' || flagch == '+' || flagch=='%' || flagch == '*') { |
470 | 470 | ||
471 | nick = temp.right(temp.length()-1); | 471 | nick = temp.right(temp.length()-1); |
472 | switch (flagch) { | 472 | switch (flagch) { |
473 | case '@': flag = PERSON_FLAG_OP; break; | 473 | case '@': flag = PERSON_FLAG_OP; break; |
474 | case '+': flag = PERSON_FLAG_VOICE; break; | 474 | case '+': flag = PERSON_FLAG_VOICE; break; |
475 | case '%': flag = PERSON_FLAG_HALFOP; break; | 475 | case '%': flag = PERSON_FLAG_HALFOP; break; |
476 | default : flag = 0; break; | 476 | default : flag = 0; break; |
477 | } | 477 | } |
478 | } else { | 478 | } else { |
479 | nick = temp; | 479 | nick = temp; |
480 | } | 480 | } |
481 | 481 | ||
482 | IRCChannelPerson *chan_person = new IRCChannelPerson(); | 482 | IRCChannelPerson *chan_person = new IRCChannelPerson(); |
483 | IRCPerson *person = m_session->getPerson(nick); | 483 | IRCPerson *person = m_session->getPerson(nick); |
484 | if (person == 0) { | 484 | if (person == 0) { |
485 | person = new IRCPerson(); | 485 | person = new IRCPerson(); |
486 | person->setNick(nick); | 486 | person->setNick(nick); |
487 | m_session->addPerson(person); | 487 | m_session->addPerson(person); |
488 | } | 488 | } |
489 | chan_person->person = person; | 489 | chan_person->person = person; |
490 | chan_person->flags = flag; | 490 | chan_person->flags = flag; |
491 | channel->addPerson(chan_person); | 491 | channel->addPerson(chan_person); |
492 | } | 492 | } |
493 | } else { | 493 | } else { |
diff --git a/noncore/net/opieirc/ircmisc.cpp b/noncore/net/opieirc/ircmisc.cpp index 6d93a34..df6f874 100644 --- a/noncore/net/opieirc/ircmisc.cpp +++ b/noncore/net/opieirc/ircmisc.cpp | |||
@@ -57,30 +57,43 @@ void IRCHistoryLineEdit::keyPressEvent(QKeyEvent *event) { | |||
57 | } else if (key == Key_Down) { | 57 | } else if (key == Key_Down) { |
58 | if (m_history.count() > 0 && m_index > 0) { | 58 | if (m_history.count() > 0 && m_index > 0) { |
59 | m_index--; | 59 | m_index--; |
60 | setText(m_history[m_index]); | 60 | setText(m_history[m_index]); |
61 | } | 61 | } |
62 | if (m_index == 0) { | 62 | if (m_index == 0) { |
63 | m_index = -1; | 63 | m_index = -1; |
64 | setText(""); | 64 | setText(""); |
65 | } | 65 | } |
66 | } else if (key == Key_Return) { | 66 | } else if (key == Key_Return) { |
67 | m_history.prepend(text()); | 67 | m_history.prepend(text()); |
68 | m_index = -1; | 68 | m_index = -1; |
69 | } else if (key == Key_Tab) { | 69 | } else if (key == Key_N && event->state() == Qt::ControlButton) { |
70 | odebug << "got tab" << oendl; | 70 | emit nextTab(); |
71 | return; | ||
72 | } else if ( ( key == Key_Y || key == Key_Z ) && event->state() == Qt::ControlButton) { | ||
73 | emit closeTab(); | ||
74 | return; | ||
75 | } else if (key == Key_P && event->state() == Qt::ControlButton) { | ||
76 | emit prevTab(); | ||
71 | return; | 77 | return; |
72 | } | 78 | } |
79 | |||
73 | QLineEdit::keyPressEvent(event); | 80 | QLineEdit::keyPressEvent(event); |
74 | } | 81 | } |
75 | 82 | ||
76 | bool IRCHistoryLineEdit::eventFilter(QObject *object, QEvent *event) { | 83 | bool IRCHistoryLineEdit::eventFilter(QObject *object, QEvent *event) { |
77 | if (event->type() == QEvent::KeyPress) { | 84 | if (event->type() == QEvent::KeyPress) { |
78 | QKeyEvent *k = (QKeyEvent *) event; | 85 | QKeyEvent *k = (QKeyEvent *) event; |
79 | /* Catch tab characters */ | 86 | /* Catch tab characters */ |
80 | if (k->key() == Key_Tab) { | 87 | if (k->key() == Key_Tab) { |
81 | odebug << "tab!" << oendl; | 88 | emit nextTab(); |
82 | return TRUE; | 89 | return TRUE; |
83 | } | 90 | } |
84 | } | 91 | } |
85 | return QLineEdit::eventFilter(object, event); | 92 | return QLineEdit::eventFilter(object, event); |
86 | } | 93 | } |
94 | |||
95 | |||
96 | void IRCHistoryLineEdit::setEditFocus() { | ||
97 | setActiveWindow(); | ||
98 | setFocus(); | ||
99 | } | ||
diff --git a/noncore/net/opieirc/ircmisc.h b/noncore/net/opieirc/ircmisc.h index b4a5b06..c42dcbd 100644 --- a/noncore/net/opieirc/ircmisc.h +++ b/noncore/net/opieirc/ircmisc.h | |||
@@ -52,20 +52,28 @@ protected: | |||
52 | int insertTab(QTab *, int index = -1); | 52 | int insertTab(QTab *, int index = -1); |
53 | protected: | 53 | protected: |
54 | QArray<QColor> m_colors; | 54 | QArray<QColor> m_colors; |
55 | }; | 55 | }; |
56 | 56 | ||
57 | /* A QLineEdit with history functionality and tab completion */ | 57 | /* A QLineEdit with history functionality and tab completion */ |
58 | 58 | ||
59 | class IRCHistoryLineEdit : public QLineEdit { | 59 | class IRCHistoryLineEdit : public QLineEdit { |
60 | Q_OBJECT | 60 | Q_OBJECT |
61 | public: | 61 | public: |
62 | IRCHistoryLineEdit(QWidget *parent = 0, const char *name = 0); | 62 | IRCHistoryLineEdit(QWidget *parent = 0, const char *name = 0); |
63 | virtual bool eventFilter(QObject *object, QEvent *event); | 63 | virtual bool eventFilter(QObject *object, QEvent *event); |
64 | public slots: | ||
65 | void setEditFocus(); | ||
66 | signals: | ||
67 | void nextTab(); | ||
68 | void prevTab(); | ||
69 | void closeTab(); | ||
70 | |||
71 | |||
64 | protected: | 72 | protected: |
65 | void keyPressEvent(QKeyEvent *); | 73 | void keyPressEvent(QKeyEvent *); |
66 | protected: | 74 | protected: |
67 | QStringList m_history; | 75 | QStringList m_history; |
68 | int m_index; | 76 | int m_index; |
69 | }; | 77 | }; |
70 | 78 | ||
71 | #endif /* __IRCMISC_H */ | 79 | #endif /* __IRCMISC_H */ |
diff --git a/noncore/net/opieirc/ircquerytab.cpp b/noncore/net/opieirc/ircquerytab.cpp index a113b04..1fddc6d 100644 --- a/noncore/net/opieirc/ircquerytab.cpp +++ b/noncore/net/opieirc/ircquerytab.cpp | |||
@@ -7,24 +7,29 @@ IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow | |||
7 | m_mainWindow = mainWindow; | 7 | m_mainWindow = mainWindow; |
8 | m_parentTab = parentTab; | 8 | m_parentTab = parentTab; |
9 | m_lines = 0; | 9 | m_lines = 0; |
10 | m_person = new IRCPerson(*person); /* We need this (the person might sign off and the original IRCPerson gets deleted) */ | 10 | m_person = new IRCPerson(*person); /* We need this (the person might sign off and the original IRCPerson gets deleted) */ |
11 | m_description->setText(tr("Talking to ") + " <b>" + person->nick() + "</b>"); | 11 | m_description->setText(tr("Talking to ") + " <b>" + person->nick() + "</b>"); |
12 | QHBox *hbox = new QHBox(this); | 12 | QHBox *hbox = new QHBox(this); |
13 | m_textview = new QTextView(hbox); | 13 | m_textview = new QTextView(hbox); |
14 | m_textview->setHScrollBarMode(QScrollView::AlwaysOff); | 14 | m_textview->setHScrollBarMode(QScrollView::AlwaysOff); |
15 | m_textview->setVScrollBarMode(QScrollView::AlwaysOn); | 15 | m_textview->setVScrollBarMode(QScrollView::AlwaysOn); |
16 | m_textview->setTextFormat(RichText); | 16 | m_textview->setTextFormat(RichText); |
17 | QWhatsThis::add(m_textview, tr("Private discussion")); | 17 | QWhatsThis::add(m_textview, tr("Private discussion")); |
18 | m_field = new IRCHistoryLineEdit(this); | 18 | m_field = new IRCHistoryLineEdit(this); |
19 | connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab())); | ||
20 | connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab())); | ||
21 | connect(m_field, SIGNAL(closeTab()),this, SIGNAL(closeTab())); | ||
22 | |||
23 | |||
19 | QWhatsThis::add(m_field, tr("Type your text here in order to send a message to the other person")); | 24 | QWhatsThis::add(m_field, tr("Type your text here in order to send a message to the other person")); |
20 | m_layout->add(hbox); | 25 | m_layout->add(hbox); |
21 | hbox->show(); | 26 | hbox->show(); |
22 | m_layout->add(m_field); | 27 | m_layout->add(m_field); |
23 | m_field->setFocus(); | 28 | m_field->setFocus(); |
24 | connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); | 29 | connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); |
25 | connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); | 30 | connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); |
26 | settingsChanged(); | 31 | settingsChanged(); |
27 | } | 32 | } |
28 | 33 | ||
29 | void IRCQueryTab::scrolling(){ | 34 | void IRCQueryTab::scrolling(){ |
30 | m_textview->ensureVisible(0, m_textview->contentsHeight()); | 35 | m_textview->ensureVisible(0, m_textview->contentsHeight()); |
@@ -35,24 +40,28 @@ void IRCQueryTab::appendText(QString text) { | |||
35 | /* not using append because it creates layout problems */ | 40 | /* not using append because it creates layout problems */ |
36 | QString txt = m_textview->text() + text + "\n"; | 41 | QString txt = m_textview->text() + text + "\n"; |
37 | if (m_maxLines > 0 && m_lines >= m_maxLines) { | 42 | if (m_maxLines > 0 && m_lines >= m_maxLines) { |
38 | int firstBreak = txt.find('\n'); | 43 | int firstBreak = txt.find('\n'); |
39 | if (firstBreak != -1) { | 44 | if (firstBreak != -1) { |
40 | txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1)); | 45 | txt = "<qt bgcolor=\"" + m_backgroundColor + "\"/>" + txt.right(txt.length() - (firstBreak + 1)); |
41 | } | 46 | } |
42 | } else { | 47 | } else { |
43 | m_lines++; | 48 | m_lines++; |
44 | } | 49 | } |
45 | m_textview->setText(txt); | 50 | m_textview->setText(txt); |
46 | m_textview->ensureVisible(0, m_textview->contentsHeight()); | 51 | m_textview->ensureVisible(0, m_textview->contentsHeight()); |
52 | |||
53 | if ( IRCServerTab::containsPing( text, m_parentTab ) ) | ||
54 | emit ping( title() ); | ||
55 | |||
47 | emit changed(this); | 56 | emit changed(this); |
48 | } | 57 | } |
49 | 58 | ||
50 | IRCQueryTab::~IRCQueryTab() { | 59 | IRCQueryTab::~IRCQueryTab() { |
51 | m_parentTab->removeQueryTab(this); | 60 | m_parentTab->removeQueryTab(this); |
52 | delete m_person; | 61 | delete m_person; |
53 | } | 62 | } |
54 | 63 | ||
55 | void IRCQueryTab::processCommand() { | 64 | void IRCQueryTab::processCommand() { |
56 | QString text = m_field->text(); | 65 | QString text = m_field->text(); |
57 | if (text.length()>0) { | 66 | if (text.length()>0) { |
58 | if (session()->isSessionActive()) { | 67 | if (session()->isSessionActive()) { |
diff --git a/noncore/net/opieirc/ircservertab.cpp b/noncore/net/opieirc/ircservertab.cpp index d1aab40..2a34c0b 100644 --- a/noncore/net/opieirc/ircservertab.cpp +++ b/noncore/net/opieirc/ircservertab.cpp | |||
@@ -1,30 +1,41 @@ | |||
1 | #include <qtextstream.h> | 1 | #include <qtextstream.h> |
2 | #include <qwhatsthis.h> | 2 | #include <qwhatsthis.h> |
3 | #include "ircservertab.h" | 3 | #include "ircservertab.h" |
4 | 4 | ||
5 | |||
6 | bool IRCServerTab::containsPing( const QString& text, IRCServerTab* tab ) { | ||
7 | return (text.find("ping") != -1 && text.find( tab->server()->nick() != -1)); | ||
8 | } | ||
9 | |||
10 | |||
5 | IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { | 11 | IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) { |
6 | m_server = server; | 12 | m_server = server; |
7 | m_session = new IRCSession(&m_server); | 13 | m_session = new IRCSession(&m_server); |
8 | m_mainWindow = mainWindow; | 14 | m_mainWindow = mainWindow; |
9 | m_close = FALSE; | 15 | m_close = FALSE; |
10 | m_lines = 0; | 16 | m_lines = 0; |
11 | m_description->setText(tr("Connection to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>"); | 17 | m_description->setText(tr("Connection to")+" <b>" + server.hostname() + ":" + QString::number(server.port()) + "</b>"); |
12 | m_textview = new QTextView(this); | 18 | m_textview = new QTextView(this); |
13 | m_textview->setHScrollBarMode(QScrollView::AlwaysOff); | 19 | m_textview->setHScrollBarMode(QScrollView::AlwaysOff); |
14 | m_textview->setVScrollBarMode(QScrollView::AlwaysOn); | 20 | m_textview->setVScrollBarMode(QScrollView::AlwaysOn); |
15 | m_textview->setTextFormat(RichText); | 21 | m_textview->setTextFormat(RichText); |
16 | QWhatsThis::add(m_textview, tr("Server messages")); | 22 | QWhatsThis::add(m_textview, tr("Server messages")); |
17 | m_layout->add(m_textview); | 23 | m_layout->add(m_textview); |
18 | m_field = new IRCHistoryLineEdit(this); | 24 | m_field = new IRCHistoryLineEdit(this); |
25 | connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab())); | ||
26 | connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab())); | ||
27 | connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab())); | ||
28 | connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus())); | ||
29 | |||
19 | QWhatsThis::add(m_field, tr("Type commands here. A list of available commands can be found inside the OpieIRC help")); | 30 | QWhatsThis::add(m_field, tr("Type commands here. A list of available commands can be found inside the OpieIRC help")); |
20 | m_layout->add(m_field); | 31 | m_layout->add(m_field); |
21 | connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); | 32 | connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand())); |
22 | m_field->setFocus(); | 33 | m_field->setFocus(); |
23 | connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput))); | 34 | connect(m_session, SIGNAL(outputReady(IRCOutput)), this, SLOT(display(IRCOutput))); |
24 | connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); | 35 | connect(m_mainWindow, SIGNAL(updateScroll()), this, SLOT(scrolling())); |
25 | settingsChanged(); | 36 | settingsChanged(); |
26 | } | 37 | } |
27 | 38 | ||
28 | void IRCServerTab::scrolling(){ | 39 | void IRCServerTab::scrolling(){ |
29 | m_textview->ensureVisible(0, m_textview->contentsHeight()); | 40 | m_textview->ensureVisible(0, m_textview->contentsHeight()); |
30 | } | 41 | } |
@@ -112,32 +123,32 @@ void IRCServerTab::executeCommand(IRCTab *tab, QString line) { | |||
112 | m_session->kick(((IRCChannelTab *)tab)->channel(), &person, text); | 123 | m_session->kick(((IRCChannelTab *)tab)->channel(), &person, text); |
113 | } else { | 124 | } else { |
114 | IRCPerson person; | 125 | IRCPerson person; |
115 | person.setNick(nickname); | 126 | person.setNick(nickname); |
116 | m_session->kick(((IRCChannelTab *)tab)->channel(), &person); | 127 | m_session->kick(((IRCChannelTab *)tab)->channel(), &person); |
117 | } | 128 | } |
118 | } | 129 | } |
119 | } | 130 | } |
120 | 131 | ||
121 | else if (command == "OP"){ | 132 | else if (command == "OP"){ |
122 | QString nickname; | 133 | QString nickname; |
123 | stream >> nickname; | 134 | stream >> nickname; |
124 | if (nickname.length() > 0) { | 135 | if (nickname.length() > 0) { |
125 | QString text = line.right(line.length()-nickname.length()-5); | 136 | QString text = line.right(line.length()-nickname.length()-5); |
126 | IRCPerson person; | 137 | IRCPerson person; |
127 | person.setNick(nickname); | 138 | person.setNick(nickname); |
128 | m_session->op(((IRCChannelTab *)tab)->channel(), &person); | 139 | m_session->op(((IRCChannelTab *)tab)->channel(), &person); |
129 | } | 140 | } |
130 | } | 141 | } |
131 | 142 | ||
132 | //SEND MODES | 143 | //SEND MODES |
133 | else if (command == "MODE"){ | 144 | else if (command == "MODE"){ |
134 | QString text = line.right(line.length()-6); | 145 | QString text = line.right(line.length()-6); |
135 | if (text.length() > 0) { | 146 | if (text.length() > 0) { |
136 | m_session->mode(text); | 147 | m_session->mode(text); |
137 | } else { | 148 | } else { |
138 | tab->appendText("<font color=\"" + m_errorColor + "\">/mode channel {[+|-]|o|p|s|i|t|n|b|v} [limit] [user] [ban mask]<br>/mode nickname {[+|-]|i|w|s|o}</font><br>"); | 149 | tab->appendText("<font color=\"" + m_errorColor + "\">/mode channel {[+|-]|o|p|s|i|t|n|b|v} [limit] [user] [ban mask]<br>/mode nickname {[+|-]|i|w|s|o}</font><br>"); |
139 | } | 150 | } |
140 | } | 151 | } |
141 | //SEND RAW MESSAGE TO SERVER, COMPLETELY UNCHECKED - anything in the RFC...or really anything you want | 152 | //SEND RAW MESSAGE TO SERVER, COMPLETELY UNCHECKED - anything in the RFC...or really anything you want |
142 | else if (command == "RAW"){ | 153 | else if (command == "RAW"){ |
143 | QString text = line.right(line.length()-5); | 154 | QString text = line.right(line.length()-5); |
diff --git a/noncore/net/opieirc/ircservertab.h b/noncore/net/opieirc/ircservertab.h index 48200d7..69543fc 100644 --- a/noncore/net/opieirc/ircservertab.h +++ b/noncore/net/opieirc/ircservertab.h | |||
@@ -24,24 +24,26 @@ | |||
24 | #include <qpe/qcopenvelope_qws.h> | 24 | #include <qpe/qcopenvelope_qws.h> |
25 | #include "irctab.h" | 25 | #include "irctab.h" |
26 | #include "ircsession.h" | 26 | #include "ircsession.h" |
27 | #include "mainwindow.h" | 27 | #include "mainwindow.h" |
28 | #include "ircchanneltab.h" | 28 | #include "ircchanneltab.h" |
29 | #include "ircquerytab.h" | 29 | #include "ircquerytab.h" |
30 | #include "ircmisc.h" | 30 | #include "ircmisc.h" |
31 | 31 | ||
32 | 32 | ||
33 | class IRCServerTab : public IRCTab { | 33 | class IRCServerTab : public IRCTab { |
34 | Q_OBJECT | 34 | Q_OBJECT |
35 | public: | 35 | public: |
36 | static bool containsPing(const QString& text, IRCServerTab *tab); | ||
37 | |||
36 | /* IRCTab implementation */ | 38 | /* IRCTab implementation */ |
37 | IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent = 0, const char *name = 0, WFlags f = 0); | 39 | IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent = 0, const char *name = 0, WFlags f = 0); |
38 | ~IRCServerTab(); | 40 | ~IRCServerTab(); |
39 | QString title(); | 41 | QString title(); |
40 | IRCSession *session(); | 42 | IRCSession *session(); |
41 | IRCServer *server(); | 43 | IRCServer *server(); |
42 | 44 | ||
43 | /* Start the server session */ | 45 | /* Start the server session */ |
44 | void doConnect(); | 46 | void doConnect(); |
45 | // QString *mynick(); | 47 | // QString *mynick(); |
46 | /* Remove tabs from the internal tab lists */ | 48 | /* Remove tabs from the internal tab lists */ |
47 | void removeChannelTab(IRCChannelTab *tab); | 49 | void removeChannelTab(IRCChannelTab *tab); |
diff --git a/noncore/net/opieirc/irctab.cpp b/noncore/net/opieirc/irctab.cpp index 3351c3b..8e1dc16 100644 --- a/noncore/net/opieirc/irctab.cpp +++ b/noncore/net/opieirc/irctab.cpp | |||
@@ -1,16 +1,17 @@ | |||
1 | #include <qpe/resource.h> | 1 | #include <qpe/resource.h> |
2 | #include <qpushbutton.h> | 2 | #include <qpushbutton.h> |
3 | #include <qwhatsthis.h> | 3 | #include <qwhatsthis.h> |
4 | #include "irctab.h" | 4 | #include "irctab.h" |
5 | #include "mainwindow.h" | ||
5 | 6 | ||
6 | QString IRCTab::m_errorColor; | 7 | QString IRCTab::m_errorColor; |
7 | QString IRCTab::m_serverColor; | 8 | QString IRCTab::m_serverColor; |
8 | QString IRCTab::m_textColor; | 9 | QString IRCTab::m_textColor; |
9 | QString IRCTab::m_backgroundColor; | 10 | QString IRCTab::m_backgroundColor; |
10 | QString IRCTab::m_selfColor; | 11 | QString IRCTab::m_selfColor; |
11 | QString IRCTab::m_otherColor; | 12 | QString IRCTab::m_otherColor; |
12 | QString IRCTab::m_notificationColor; | 13 | QString IRCTab::m_notificationColor; |
13 | int IRCTab::m_maxLines; | 14 | int IRCTab::m_maxLines; |
14 | 15 | ||
15 | IRCTab::IRCTab(QWidget *parent, const char *name, WFlags f) : QWidget(parent, name, f) { | 16 | IRCTab::IRCTab(QWidget *parent, const char *name, WFlags f) : QWidget(parent, name, f) { |
16 | m_layout = new QVBoxLayout(this); | 17 | m_layout = new QVBoxLayout(this); |
@@ -27,12 +28,18 @@ IRCTab::IRCTab(QWidget *parent, const char *name, WFlags f) : QWidget(parent, na | |||
27 | descLayout->addWidget(close); | 28 | descLayout->addWidget(close); |
28 | descLayout->setStretchFactor(m_description, 1); | 29 | descLayout->setStretchFactor(m_description, 1); |
29 | } | 30 | } |
30 | 31 | ||
31 | 32 | ||
32 | void IRCTab::setID(int id) { | 33 | void IRCTab::setID(int id) { |
33 | m_id = id; | 34 | m_id = id; |
34 | } | 35 | } |
35 | 36 | ||
36 | int IRCTab::id() { | 37 | int IRCTab::id() { |
37 | return m_id; | 38 | return m_id; |
38 | } | 39 | } |
40 | |||
41 | void IRCTab::showEvent( QShowEvent *ev ) { | ||
42 | topLevelWidget()->setCaption( MainWindow::appCaption() + " " + title() ); | ||
43 | QWidget::showEvent( ev ); | ||
44 | emit editFocus(); | ||
45 | } | ||
diff --git a/noncore/net/opieirc/irctab.h b/noncore/net/opieirc/irctab.h index 7a2d0a2..6c29ea5 100644 --- a/noncore/net/opieirc/irctab.h +++ b/noncore/net/opieirc/irctab.h | |||
@@ -34,27 +34,37 @@ | |||
34 | class IRCTab : public QWidget { | 34 | class IRCTab : public QWidget { |
35 | Q_OBJECT | 35 | Q_OBJECT |
36 | public: | 36 | public: |
37 | IRCTab(QWidget *parent = 0, const char *name = 0, WFlags f = 0); | 37 | IRCTab(QWidget *parent = 0, const char *name = 0, WFlags f = 0); |
38 | /* The ID is required to store the position of this IRCTab inside the IRCTabWidget */ | 38 | /* The ID is required to store the position of this IRCTab inside the IRCTabWidget */ |
39 | void setID(int id); | 39 | void setID(int id); |
40 | int id(); | 40 | int id(); |
41 | virtual QString title() = 0; | 41 | virtual QString title() = 0; |
42 | virtual IRCSession *session() = 0; | 42 | virtual IRCSession *session() = 0; |
43 | virtual void appendText(QString text) = 0; | 43 | virtual void appendText(QString text) = 0; |
44 | signals: | 44 | signals: |
45 | void changed(IRCTab *); | 45 | void changed(IRCTab *); |
46 | void ping(const QString& ); | ||
47 | void nextTab(); | ||
48 | void prevTab(); | ||
49 | void closeTab(); | ||
50 | void editFocus(); | ||
51 | |||
46 | public slots: | 52 | public slots: |
47 | virtual void remove() = 0; | 53 | virtual void remove() = 0; |
48 | virtual void settingsChanged() = 0; | 54 | virtual void settingsChanged() = 0; |
55 | |||
56 | protected: | ||
57 | void showEvent( QShowEvent* ); | ||
58 | |||
49 | protected: | 59 | protected: |
50 | QLabel *m_description; | 60 | QLabel *m_description; |
51 | QVBoxLayout *m_layout; | 61 | QVBoxLayout *m_layout; |
52 | int m_id; | 62 | int m_id; |
53 | public: | 63 | public: |
54 | /* Configuration shared accross all instances - contains HTML style colors (#rrggbb) */ | 64 | /* Configuration shared accross all instances - contains HTML style colors (#rrggbb) */ |
55 | static QString m_errorColor; | 65 | static QString m_errorColor; |
56 | static QString m_serverColor; | 66 | static QString m_serverColor; |
57 | static QString m_textColor; | 67 | static QString m_textColor; |
58 | static QString m_backgroundColor; | 68 | static QString m_backgroundColor; |
59 | static QString m_selfColor; | 69 | static QString m_selfColor; |
60 | static QString m_otherColor; | 70 | static QString m_otherColor; |
diff --git a/noncore/net/opieirc/mainwindow.cpp b/noncore/net/opieirc/mainwindow.cpp index 0923a11..1143213 100644 --- a/noncore/net/opieirc/mainwindow.cpp +++ b/noncore/net/opieirc/mainwindow.cpp | |||
@@ -1,21 +1,26 @@ | |||
1 | #include <qmenubar.h> | 1 | #include <qmenubar.h> |
2 | #include <qpe/resource.h> | 2 | #include <qpe/resource.h> |
3 | #include <qwhatsthis.h> | 3 | #include <qwhatsthis.h> |
4 | 4 | ||
5 | #include "mainwindow.h" | 5 | #include "mainwindow.h" |
6 | #include "ircservertab.h" | 6 | #include "ircservertab.h" |
7 | #include "ircserverlist.h" | 7 | #include "ircserverlist.h" |
8 | #include "ircsettings.h" | 8 | #include "ircsettings.h" |
9 | 9 | ||
10 | QString MainWindow::appCaption() { | ||
11 | return QObject::tr("Opie IRC"); | ||
12 | } | ||
13 | |||
14 | |||
10 | MainWindow::MainWindow(QWidget *parent, const char *name, WFlags) : QMainWindow(parent, name, WStyle_ContextHelp) { | 15 | MainWindow::MainWindow(QWidget *parent, const char *name, WFlags) : QMainWindow(parent, name, WStyle_ContextHelp) { |
11 | setCaption(tr("IRC Client")); | 16 | setCaption(tr("IRC Client")); |
12 | m_tabWidget = new IRCTabWidget(this); | 17 | m_tabWidget = new IRCTabWidget(this); |
13 | QWhatsThis::add(m_tabWidget, tr("Server connections, channels, queries and other things will be placed here")); | 18 | QWhatsThis::add(m_tabWidget, tr("Server connections, channels, queries and other things will be placed here")); |
14 | connect(m_tabWidget, SIGNAL(currentChanged(QWidget*)), this, SLOT(selected(QWidget*))); | 19 | connect(m_tabWidget, SIGNAL(currentChanged(QWidget*)), this, SLOT(selected(QWidget*))); |
15 | setCentralWidget(m_tabWidget); | 20 | setCentralWidget(m_tabWidget); |
16 | setToolBarsMovable(FALSE); | 21 | setToolBarsMovable(FALSE); |
17 | QMenuBar *menuBar = new QMenuBar(this); | 22 | QMenuBar *menuBar = new QMenuBar(this); |
18 | QPopupMenu *irc = new QPopupMenu(this); | 23 | QPopupMenu *irc = new QPopupMenu(this); |
19 | menuBar->insertItem(tr("IRC"), irc); | 24 | menuBar->insertItem(tr("IRC"), irc); |
20 | QAction *a = new QAction(tr("New connection"), Resource::loadPixmap("pass"), QString::null, 0, this, 0); | 25 | QAction *a = new QAction(tr("New connection"), Resource::loadPixmap("pass"), QString::null, 0, this, 0); |
21 | connect(a, SIGNAL(activated()), this, SLOT(newConnection())); | 26 | connect(a, SIGNAL(activated()), this, SLOT(newConnection())); |
@@ -43,24 +48,29 @@ void MainWindow::loadSettings() { | |||
43 | IRCTab::m_serverColor = config.readEntry("ServerColor", "#0000FF"); | 48 | IRCTab::m_serverColor = config.readEntry("ServerColor", "#0000FF"); |
44 | IRCTab::m_notificationColor = config.readEntry("NotificationColor", "#AA3300"); | 49 | IRCTab::m_notificationColor = config.readEntry("NotificationColor", "#AA3300"); |
45 | IRCTab::m_maxLines = config.readNumEntry("Lines", 100); | 50 | IRCTab::m_maxLines = config.readNumEntry("Lines", 100); |
46 | } | 51 | } |
47 | 52 | ||
48 | void MainWindow::selected(QWidget *) { | 53 | void MainWindow::selected(QWidget *) { |
49 | m_tabWidget->setTabColor(m_tabWidget->currentPageIndex(), black); | 54 | m_tabWidget->setTabColor(m_tabWidget->currentPageIndex(), black); |
50 | emit updateScroll(); | 55 | emit updateScroll(); |
51 | } | 56 | } |
52 | 57 | ||
53 | void MainWindow::addTab(IRCTab *tab) { | 58 | void MainWindow::addTab(IRCTab *tab) { |
54 | connect(tab, SIGNAL(changed(IRCTab*)), this, SLOT(changeEvent(IRCTab*))); | 59 | connect(tab, SIGNAL(changed(IRCTab*)), this, SLOT(changeEvent(IRCTab*))); |
60 | connect(tab, SIGNAL(ping (const QString&)), this, SLOT(slotPing(const QString&))); | ||
61 | connect(tab, SIGNAL(nextTab()), this, SLOT(slotNextTab())); | ||
62 | connect(tab, SIGNAL(prevTab()), this, SLOT(slotPrevTab())); | ||
63 | connect(tab, SIGNAL(closeTab()), this, SLOT(slotCloseTab())); | ||
64 | |||
55 | m_tabWidget->addTab(tab, tab->title()); | 65 | m_tabWidget->addTab(tab, tab->title()); |
56 | m_tabWidget->showPage(tab); | 66 | m_tabWidget->showPage(tab); |
57 | tab->setID(m_tabWidget->currentPageIndex()); | 67 | tab->setID(m_tabWidget->currentPageIndex()); |
58 | m_tabs.append(tab); | 68 | m_tabs.append(tab); |
59 | } | 69 | } |
60 | 70 | ||
61 | void MainWindow::changeEvent(IRCTab *tab) { | 71 | void MainWindow::changeEvent(IRCTab *tab) { |
62 | if (tab->id() != m_tabWidget->currentPageIndex()) | 72 | if (tab->id() != m_tabWidget->currentPageIndex()) |
63 | m_tabWidget->setTabColor(tab->id(), blue); | 73 | m_tabWidget->setTabColor(tab->id(), blue); |
64 | } | 74 | } |
65 | 75 | ||
66 | void MainWindow::killTab(IRCTab *tab) { | 76 | void MainWindow::killTab(IRCTab *tab) { |
@@ -80,12 +90,39 @@ void MainWindow::newConnection() { | |||
80 | } | 90 | } |
81 | 91 | ||
82 | void MainWindow::settings() { | 92 | void MainWindow::settings() { |
83 | IRCSettings settings(this, "Settings", TRUE); | 93 | IRCSettings settings(this, "Settings", TRUE); |
84 | if (settings.exec() == QDialog::Accepted) { | 94 | if (settings.exec() == QDialog::Accepted) { |
85 | QListIterator<IRCTab> it(m_tabs); | 95 | QListIterator<IRCTab> it(m_tabs); |
86 | for (; it.current(); ++it) { | 96 | for (; it.current(); ++it) { |
87 | /* Inform all tabs about the new settings */ | 97 | /* Inform all tabs about the new settings */ |
88 | it.current()->settingsChanged(); | 98 | it.current()->settingsChanged(); |
89 | } | 99 | } |
90 | } | 100 | } |
91 | } | 101 | } |
102 | |||
103 | |||
104 | void MainWindow::slotNextTab() { | ||
105 | int i = m_tabWidget->currentPageIndex (); | ||
106 | m_tabWidget->setCurrentPage ( i+1 ); | ||
107 | |||
108 | int j = m_tabWidget->currentPageIndex (); | ||
109 | if ( i == j ) | ||
110 | m_tabWidget->setCurrentPage ( 1 ); | ||
111 | } | ||
112 | |||
113 | void MainWindow::slotPrevTab() { | ||
114 | int i = m_tabWidget->currentPageIndex (); | ||
115 | if ( i > 1 ) | ||
116 | m_tabWidget->setCurrentPage ( i-1 ); | ||
117 | } | ||
118 | |||
119 | void MainWindow::slotCloseTab() { | ||
120 | IRCTab *tab = (IRCTab *) m_tabWidget->currentPage (); | ||
121 | if ( tab ) | ||
122 | killTab ( tab ); | ||
123 | } | ||
124 | |||
125 | void MainWindow::slotPing( const QString& channel ) { | ||
126 | raise(); | ||
127 | } | ||
128 | |||
diff --git a/noncore/net/opieirc/mainwindow.h b/noncore/net/opieirc/mainwindow.h index 0f60855..945fc71 100644 --- a/noncore/net/opieirc/mainwindow.h +++ b/noncore/net/opieirc/mainwindow.h | |||
@@ -27,27 +27,34 @@ | |||
27 | #include "mainwindow.h" | 27 | #include "mainwindow.h" |
28 | #include "ircmisc.h" | 28 | #include "ircmisc.h" |
29 | #include "irctab.h" | 29 | #include "irctab.h" |
30 | 30 | ||
31 | class MainWindow : public QMainWindow { | 31 | class MainWindow : public QMainWindow { |
32 | Q_OBJECT | 32 | Q_OBJECT |
33 | public: | 33 | public: |
34 | MainWindow(QWidget *parent = 0, const char *name = 0, WFlags f = 0); | 34 | MainWindow(QWidget *parent = 0, const char *name = 0, WFlags f = 0); |
35 | // IRCTabWidget getTabWidget(); | 35 | // IRCTabWidget getTabWidget(); |
36 | void addTab(IRCTab *tab); | 36 | void addTab(IRCTab *tab); |
37 | void killTab(IRCTab *tab); | 37 | void killTab(IRCTab *tab); |
38 | static QString appName() { return QString::fromLatin1("opieirc"); } | 38 | static QString appName() { return QString::fromLatin1("opieirc"); } |
39 | static QString appCaption(); | ||
39 | signals: | 40 | signals: |
40 | void updateScroll(); | 41 | void updateScroll(); |
41 | protected slots: | 42 | protected slots: |
42 | void newConnection(); | 43 | void newConnection(); |
43 | void settings(); | 44 | void settings(); |
44 | void selected(QWidget *); | 45 | void selected(QWidget *); |
45 | void changeEvent(IRCTab *); | 46 | void changeEvent(IRCTab *); |
47 | |||
48 | void slotNextTab(); | ||
49 | void slotPrevTab(); | ||
50 | void slotCloseTab(); | ||
51 | void slotPing(const QString&); | ||
52 | |||
46 | protected: | 53 | protected: |
47 | void loadSettings(); | 54 | void loadSettings(); |
48 | protected: | 55 | protected: |
49 | IRCTabWidget *m_tabWidget; | 56 | IRCTabWidget *m_tabWidget; |
50 | QList<IRCTab> m_tabs; | 57 | QList<IRCTab> m_tabs; |
51 | }; | 58 | }; |
52 | 59 | ||
53 | #endif /* __MAINWINDOW_H */ | 60 | #endif /* __MAINWINDOW_H */ |