From 8f18e8b46dfaaa7e03b9ed1f3faed12da5b30cd5 Mon Sep 17 00:00:00 2001
From: zecke <zecke>
Date: Mon, 06 Sep 2004 22:47:48 +0000
Subject: -Some keyboard handling

-ping notification

merge of zautrixs work
---
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
@@ -23,6 +23,11 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW
     m_list->update();
     m_list->setMaximumWidth(LISTWIDTH);
     m_field = new IRCHistoryLineEdit(this);
+    connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
+    connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
+    connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab()));
+    connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
+
     QWhatsThis::add(m_field, tr("Type your message here to participate in the channel discussion"));
     m_popup = new QPopupMenu(m_list);
     m_lines = 0;
@@ -41,6 +46,8 @@ IRCChannelTab::IRCChannelTab(IRCChannel *channel, IRCServerTab *parentTab, MainW
     hbox->show();
     m_layout->add(m_field);
     m_field->setFocus();
+    m_field->setActiveWindow();
+
     connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
     settingsChanged();
 }
@@ -63,6 +70,15 @@ void IRCChannelTab::appendText(QString text) {
     m_textview->ensureVisible(0, m_textview->contentsHeight());
     m_textview->setText(txt);
     m_textview->ensureVisible(0, m_textview->contentsHeight());
+
+    int p1, p2;
+    if ( (p1 = text.find("ping", 0, false) )!= -1 && (p2 = text.find( m_parentTab->server()->nick(), 0,false )) != -1  ) {
+        int col = text.findRev("color", -1, false);
+        if ( col < p2 )
+            emit ping( title() );
+
+    }
+
     emit changed(this);
 }
 
@@ -122,7 +138,7 @@ void IRCChannelTab::popupQuery() {
         if (person) {
             IRCQueryTab *tab = m_parentTab->getTabForQuery(person);
             if (!tab) {
-                tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent()); 
+                tab = new IRCQueryTab(person, m_parentTab, m_mainWindow, (QWidget *)parent());
                 m_parentTab->addQueryTab(tab);
                 m_mainWindow->addTab(tab);
             }
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
@@ -3,7 +3,7 @@
 #include "ircversion.h"
 
 /* Lookup table for literal commands */
-IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = { 
+IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = {
     { "PING",    FUNC(parseLiteralPing) },
     { "NOTICE",  FUNC(parseLiteralNotice) },
     { "JOIN",    FUNC(parseLiteralJoin) },
@@ -20,7 +20,7 @@ IRCLiteralMessageParserStruct IRCMessageParser::literalParserProcTable[] = {
 };
 
 /* Lookup table for literal commands */
-IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = { 
+IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = {
     { "PING",    FUNC(parseCTCPPing) },
     { "VERSION", FUNC(parseCTCPVersion) },
     { "ACTION",  FUNC(parseCTCPAction) },
@@ -28,7 +28,7 @@ IRCCTCPMessageParserStruct IRCMessageParser::ctcpParserProcTable[] = {
 };
 
 /* Lookup table for numerical commands */
-IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = { 
+IRCNumericalMessageParserStruct IRCMessageParser::numericalParserProcTable[] = {
     { 1,   FUNC(parseNumerical001) },           // RPL_WELCOME
     { 2,   FUNC(parseNumerical002) },           // RPL_YOURHOST
     { 3,   FUNC(parseNumerical003) },           // RPL_CREATED
@@ -171,7 +171,7 @@ void IRCMessageParser::parseLiteralPart(IRCMessage *message) {
 }
 
 void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) {
-    if (m_session->m_server->nick() == message->param(0)) {
+    if (m_session->m_server->nick().lower() == message->param(0).lower() ) {
         /* IRC Query message detected, verify sender and display it */
         IRCPerson mask(message->prefix());
         IRCPerson *person = m_session->getPerson(mask.nick());
@@ -206,7 +206,7 @@ void IRCMessageParser::parseLiteralPrivMsg(IRCMessage *message) {
 }
 
 void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
-  
+
     IRCPerson mask(message->prefix());
     /* this way of handling nick changes really sucks */
     if (mask.nick() == m_session->m_server->nick()) {
@@ -220,7 +220,7 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
         IRCPerson *person = m_session->getPerson(mask.nick());
         if (person) {
             //IRCOutput output(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg( mask.nick() ).arg( message->param(0)));
-            
+
             /* new code starts here -- this removes the person from all channels */
             QList<IRCChannel> channels;
             m_session->getChannelsByPerson(person, channels);
@@ -234,7 +234,7 @@ void IRCMessageParser::parseLiteralNick(IRCMessage *message) {
               output.addParam(person);
               emit outputReady(output);
             }
-            /* new code ends here */  
+            /* new code ends here */
         } else {
             emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person")));
         }
@@ -248,7 +248,7 @@ void IRCMessageParser::parseLiteralQuit(IRCMessage *message) {
         QList<IRCChannel> channels;
         m_session->getChannelsByPerson(person, channels);
         QListIterator<IRCChannel> it(channels);
-        for (;it.current(); ++it) { 
+        for (;it.current(); ++it) {
             IRCChannelPerson *chanperson = it.current()->getPerson(mask.nick());
             it.current()->removePerson(chanperson);
             delete chanperson;
@@ -325,7 +325,7 @@ void IRCMessageParser::parseCTCPAction(IRCMessage *message) {
         }
     }
 }
-    
+
 void IRCMessageParser::parseLiteralMode(IRCMessage *message) {
     IRCPerson mask(message->prefix());
 
@@ -461,13 +461,13 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
 
         while (!stream.atEnd()) {
             stream >> temp;
-            
+
             char flagch = temp.at(0).latin1();
             int flag = 0;
             QString nick;
             /* Parse person flags */
             if (flagch == '@' || flagch == '+' || flagch=='%' || flagch == '*') {
-                
+
                 nick = temp.right(temp.length()-1);
                 switch (flagch) {
                     case '@': flag = PERSON_FLAG_OP;     break;
@@ -478,7 +478,7 @@ void IRCMessageParser::parseNumericalNames(IRCMessage *message) {
             } else {
                 nick = temp;
             }
-            
+
             IRCChannelPerson *chan_person = new IRCChannelPerson();
             IRCPerson *person = m_session->getPerson(nick);
             if (person == 0) {
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
@@ -66,10 +66,17 @@ void IRCHistoryLineEdit::keyPressEvent(QKeyEvent *event) {
     } else if (key == Key_Return) {
         m_history.prepend(text());
         m_index = -1;
-    } else if (key == Key_Tab) {
-        odebug << "got tab" << oendl;
+    } else if (key == Key_N && event->state() == Qt::ControlButton) {
+        emit nextTab();
+        return;
+    } else if ( ( key == Key_Y || key == Key_Z ) && event->state() == Qt::ControlButton) {
+        emit closeTab();
+        return;
+    } else if (key == Key_P && event->state() == Qt::ControlButton) {
+        emit prevTab();
         return;
     }
+
     QLineEdit::keyPressEvent(event);
 }
 
@@ -78,9 +85,15 @@ bool IRCHistoryLineEdit::eventFilter(QObject *object, QEvent *event) {
         QKeyEvent *k = (QKeyEvent *) event;
         /* Catch tab characters */
         if (k->key() == Key_Tab) {
-            odebug << "tab!" << oendl; 
+            emit nextTab();
             return TRUE;
         }
     }
     return QLineEdit::eventFilter(object, event);
 }
+
+
+void IRCHistoryLineEdit::setEditFocus() {
+    setActiveWindow();
+    setFocus();
+}
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
@@ -61,6 +61,14 @@ class IRCHistoryLineEdit : public QLineEdit {
 public:
     IRCHistoryLineEdit(QWidget *parent = 0, const char *name = 0);
     virtual bool eventFilter(QObject *object, QEvent *event);
+public slots:
+    void setEditFocus();
+signals:
+    void nextTab();
+    void prevTab();
+    void closeTab();
+
+
 protected:
     void keyPressEvent(QKeyEvent *);
 protected:
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
@@ -16,6 +16,11 @@ IRCQueryTab::IRCQueryTab(IRCPerson *person, IRCServerTab *parentTab, MainWindow
     m_textview->setTextFormat(RichText);
     QWhatsThis::add(m_textview, tr("Private discussion"));
     m_field = new IRCHistoryLineEdit(this);
+    connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
+    connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
+    connect(m_field, SIGNAL(closeTab()),this, SIGNAL(closeTab()));
+
+
     QWhatsThis::add(m_field, tr("Type your text here in order to send a message to the other person"));
     m_layout->add(hbox);
     hbox->show();
@@ -44,6 +49,10 @@ void IRCQueryTab::appendText(QString text) {
     }
     m_textview->setText(txt);
     m_textview->ensureVisible(0, m_textview->contentsHeight());
+
+    if ( IRCServerTab::containsPing( text, m_parentTab ) )
+        emit ping( title() );
+
     emit changed(this);
 }
 
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
@@ -2,6 +2,12 @@
 #include <qwhatsthis.h>
 #include "ircservertab.h"
 
+
+bool IRCServerTab::containsPing( const QString& text, IRCServerTab* tab ) {
+    return (text.find("ping") != -1 && text.find( tab->server()->nick() != -1));
+}
+
+
 IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent, const char *name, WFlags f) : IRCTab(parent, name, f) {
     m_server = server;
     m_session = new IRCSession(&m_server);
@@ -16,6 +22,11 @@ IRCServerTab::IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *pa
     QWhatsThis::add(m_textview, tr("Server messages"));
     m_layout->add(m_textview);
     m_field = new IRCHistoryLineEdit(this);
+    connect(m_field, SIGNAL(nextTab()), this, SIGNAL(nextTab()));
+    connect(m_field, SIGNAL(prevTab()), this, SIGNAL(prevTab()));
+    connect(m_field, SIGNAL(closeTab()), this, SIGNAL(closeTab()));
+    connect(this, SIGNAL(editFocus()), m_field, SLOT(setEditFocus()));
+
     QWhatsThis::add(m_field, tr("Type commands here. A list of available commands can be found inside the OpieIRC help"));
     m_layout->add(m_field);
     connect(m_field, SIGNAL(returnPressed()), this, SLOT(processCommand()));
@@ -121,14 +132,14 @@ void IRCServerTab::executeCommand(IRCTab *tab, QString line) {
  else if (command == "OP"){
 		QString nickname;
         stream >> nickname;
-        if (nickname.length() > 0) { 
+        if (nickname.length() > 0) {
                 QString text = line.right(line.length()-nickname.length()-5);
                 IRCPerson person;
                 person.setNick(nickname);
                 m_session->op(((IRCChannelTab *)tab)->channel(), &person);
             }
         }
-  
+
   //SEND MODES
   else if (command == "MODE"){
      QString text = line.right(line.length()-6);
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
@@ -33,6 +33,8 @@
 class IRCServerTab : public IRCTab {
     Q_OBJECT
 public:
+    static bool containsPing(const QString& text, IRCServerTab *tab);
+
     /* IRCTab implementation */
     IRCServerTab(IRCServer server, MainWindow *mainWindow, QWidget *parent = 0, const char *name = 0, WFlags f = 0);
     ~IRCServerTab();
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
@@ -2,6 +2,7 @@
 #include <qpushbutton.h>
 #include <qwhatsthis.h>
 #include "irctab.h"
+#include "mainwindow.h"
 
 QString IRCTab::m_errorColor;
 QString IRCTab::m_serverColor;
@@ -36,3 +37,9 @@ void IRCTab::setID(int id) {
 int IRCTab::id() {
     return m_id;
 }
+
+void IRCTab::showEvent( QShowEvent *ev ) {
+    topLevelWidget()->setCaption( MainWindow::appCaption() + " " + title() );
+    QWidget::showEvent( ev );
+    emit editFocus();
+}
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
@@ -43,9 +43,19 @@ public:
     virtual void appendText(QString text) = 0;
 signals:
     void changed(IRCTab *);
+    void ping(const QString& );
+    void nextTab();
+    void prevTab();
+    void closeTab();
+    void editFocus();
+
 public slots:
     virtual void remove() = 0;
     virtual void settingsChanged() = 0;
+
+protected:
+    void showEvent( QShowEvent* );
+
 protected:
     QLabel      *m_description;
     QVBoxLayout *m_layout;
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
@@ -7,6 +7,11 @@
 #include "ircserverlist.h"
 #include "ircsettings.h"
 
+QString MainWindow::appCaption() {
+    return QObject::tr("Opie IRC");
+}
+
+
 MainWindow::MainWindow(QWidget *parent, const char *name, WFlags) : QMainWindow(parent, name, WStyle_ContextHelp) {
     setCaption(tr("IRC Client"));
     m_tabWidget = new IRCTabWidget(this);
@@ -52,6 +57,11 @@ void MainWindow::selected(QWidget *) {
 
 void MainWindow::addTab(IRCTab *tab) {
     connect(tab, SIGNAL(changed(IRCTab*)), this, SLOT(changeEvent(IRCTab*)));
+    connect(tab, SIGNAL(ping (const QString&)), this, SLOT(slotPing(const QString&)));
+    connect(tab, SIGNAL(nextTab()), this, SLOT(slotNextTab()));
+    connect(tab, SIGNAL(prevTab()), this, SLOT(slotPrevTab()));
+    connect(tab, SIGNAL(closeTab()), this, SLOT(slotCloseTab()));
+
     m_tabWidget->addTab(tab, tab->title());
     m_tabWidget->showPage(tab);
     tab->setID(m_tabWidget->currentPageIndex());
@@ -89,3 +99,30 @@ void MainWindow::settings() {
         }
     }
 }
+
+
+void MainWindow::slotNextTab() {
+    int i = m_tabWidget->currentPageIndex ();
+    m_tabWidget->setCurrentPage ( i+1 );
+
+    int j = m_tabWidget->currentPageIndex ();
+    if ( i == j )
+        m_tabWidget->setCurrentPage ( 1 );
+}
+
+void MainWindow::slotPrevTab() {
+    int i = m_tabWidget->currentPageIndex ();
+    if ( i > 1 )
+        m_tabWidget->setCurrentPage ( i-1 );
+}
+
+void MainWindow::slotCloseTab() {
+    IRCTab *tab = (IRCTab *) m_tabWidget->currentPage ();
+    if ( tab )
+        killTab ( tab );
+}
+
+void MainWindow::slotPing( const QString& channel ) {
+    raise();
+}
+
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
@@ -36,6 +36,7 @@ public:
     void addTab(IRCTab *tab);
     void killTab(IRCTab *tab);
     static QString appName() { return QString::fromLatin1("opieirc"); }
+    static QString appCaption();
 signals:
     void updateScroll();
 protected slots:
@@ -43,6 +44,12 @@ protected slots:
     void settings();
     void selected(QWidget *);
     void changeEvent(IRCTab *);
+
+    void slotNextTab();
+    void slotPrevTab();
+    void slotCloseTab();
+    void slotPing(const QString&);    
+
 protected:
     void loadSettings();
 protected:
--
cgit v0.9.0.2