summaryrefslogtreecommitdiffstats
path: root/ksirc/dockservercontroller.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitbcb704366cb5e333a626c18c308c7e0448a8e69f (patch)
treef0d6ab7d78ecdd9207cf46536376b44b91a1ca71 /ksirc/dockservercontroller.cpp
downloadtdenetwork-bcb704366cb5e333a626c18c308c7e0448a8e69f.tar.gz
tdenetwork-bcb704366cb5e333a626c18c308c7e0448a8e69f.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdenetwork@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'ksirc/dockservercontroller.cpp')
-rw-r--r--ksirc/dockservercontroller.cpp451
1 files changed, 451 insertions, 0 deletions
diff --git a/ksirc/dockservercontroller.cpp b/ksirc/dockservercontroller.cpp
new file mode 100644
index 00000000..f83f5ada
--- /dev/null
+++ b/ksirc/dockservercontroller.cpp
@@ -0,0 +1,451 @@
+/**********************************************************************
+
+ $$Id$$
+
+ Dock Server Controller. Displays server connection window, and makes
+ new server connection on demand.
+
+ *********************************************************************/
+
+#include "dockservercontroller.h"
+
+#include <qpopupmenu.h>
+#include <qwidget.h>
+#include <qapplication.h>
+#include <qregexp.h>
+#include <qtimer.h>
+#include <qcursor.h>
+#include <kpassivepopup.h>
+#include <kpopupmenu.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <kwin.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kpassivepopup.h>
+#include <kmessagebox.h>
+#include <kglobalaccel.h>
+#include <kkeydialog.h>
+#include <kdeversion.h>
+
+#include "KSPrefs/ksprefs.h"
+
+#include "servercontroller.h"
+#include "toplevel.h"
+#include "ksopts.h"
+
+#include "objFinder.h"
+#include "displayMgr.h"
+#include "objFinder.h"
+
+#include "dccNew.h"
+
+extern DisplayMgr *displayMgr;
+
+dscNickInfo::dscNickInfo(QString nick, QString server) :
+ m_nick(nick),
+ m_server(server)
+{
+}
+
+dscNickInfo::~dscNickInfo()
+{
+}
+
+
+dockServerController::dockServerController(servercontroller *sc, QWidget *parent, const char *_name)
+: KSystemTray(parent, _name),
+ m_sc(sc)
+{
+
+ m_nicks.setAutoDelete(true);
+ KPopupMenu *pop = contextMenu();
+ pop->setName("dockServerController_menu_pop");
+
+#ifndef NDEBUG
+ pop->insertItem(i18n("Dump Object Tree"), sc, SLOT(dump_obj()));
+ pop->insertItem(i18n("Server Debug Window"), sc, SLOT(server_debug()));
+ pop->insertSeparator();
+#endif
+
+
+ pop->insertItem(SmallIcon( "filter" ), i18n("&Filter Rule Editor..."),
+ m_sc, SLOT(filter_rule_editor()));
+
+ KStdAction::preferences(m_sc, SLOT(general_prefs()),
+ m_sc->actionCollection())->plug(pop);
+ KStdAction::configureNotifications(m_sc, SLOT(notification_prefs()), actionCollection())->plug(pop);
+
+ pop->insertSeparator();
+ pop->insertItem(i18n("New &Server..."),
+ m_sc, SLOT(new_connection()));
+ pop->insertItem(i18n("&Do Autoconnect..."), m_sc, SLOT(start_autoconnect_check()));
+ connect(this, SIGNAL(quitSelected()), m_sc, SLOT(endksirc()));
+
+#if KDE_IS_VERSION(3,1,92)
+ m_pic_dock = KSystemTray::loadIcon( "ksirc" );
+#else
+ m_pic_dock = UserIcon("ksirc_dock");
+#endif
+ m_pic_info = UserIcon("info");
+
+ if ( !m_pic_dock.isNull() )
+ setPixmap( m_pic_dock );
+
+ mainPop = 0x0;
+ m_mainPopVisible = false;
+ createMainPopup();
+
+ m_blinkTimer = new QTimer( this );
+ connect( m_blinkTimer, SIGNAL(timeout()), this, SLOT( blinkDockedIcon() ) );
+ m_blinkStatus = false;
+ m_blinkActive = false;
+
+ servercontroller::self()
+ ->getGlobalAccel()
+ ->insert("Raise Last Window", i18n("Raise Last Window"),
+ i18n("If someone said your nick in a window, this action "
+ "will make that window active for you."),
+ ALT+CTRL+Key_A, KKey::QtWIN+CTRL+Key_A, this,
+ SLOT(raiseLastActiveWindow()));
+ servercontroller::self()
+ ->getGlobalAccel()
+ ->insert("Clear Blink", i18n("Clear Blinking Dock Icon"),
+ i18n("If the dock icon is blinking, but you don't want "
+ "to go to the window this will clear the blinking."),
+ ALT+CTRL+Key_Down, KKey::QtWIN+CTRL+Key_Down, this,
+ SLOT(blinkClear()));
+
+// mainPop = new KPopupMenu(this, "dockServerController_main_pop");
+// mainPop->setTitle(i18n("KSirc Dock Menu"));
+
+}
+
+
+
+dockServerController::~dockServerController()
+{
+kdDebug(5008) << "~dockServerController in" << endl;
+ m_sc = 0x0;
+kdDebug(5008) << "~dockServerController out" << endl;
+}
+
+int dockServerController::intoPopupSorted(QString str, QPopupMenu *what)
+{
+ uint i = 0;
+
+ for(i = 0; i < mainPop->count(); i++){
+ if(mainPop->text(mainPop->idAt(i)) > str){
+ break;
+ }
+ }
+ return mainPop->insertItem(str, what, -1, i);
+
+}
+
+void dockServerController::mainPopShow()
+{
+ m_mainPopVisible = true;
+}
+
+void dockServerController::mainPopHide()
+{
+ m_mainPopVisible = false;
+}
+
+void dockServerController::createMainPopup()
+{
+ if(m_mainPopVisible == true)
+ return;
+
+ if(mainPop)
+ delete mainPop;
+ mainPop = new KPopupMenu(this, "dockservercontrller_main_pop");
+ connect(mainPop, SIGNAL(activated(int)),
+ this, SLOT(mainActivated(int)));
+ connect(mainPop, SIGNAL(aboutToShow()),
+ this, SLOT(mainPopShow()));
+ connect(mainPop, SIGNAL(aboutToHide()),
+ this, SLOT(mainPopHide()));
+
+
+ QDictIterator<dscNickInfo> it( m_nicks );
+ for( ; it.current(); ++it){
+ KPopupMenu *sub = new KPopupMenu(mainPop);
+ if(it.current()->status() == dscNickInfo::isOnline){
+ sub->insertItem(i18n("Came Online: ") + it.current()->online().toString("hh:mm"));
+ if( ! it.current()->offline().isNull() ){
+ sub->insertItem(i18n("Last Offline: ") + it.current()->offline().toString("hh:mm"));
+ }
+ int pid = sub->insertItem(i18n("Ping"));
+ int wid = sub->insertItem(i18n("Whois"));
+ int cid = sub->insertItem(i18n("Chat"));
+ int dcid = sub->insertItem(i18n("DCC Chat"));
+
+ int id = intoPopupSorted(it.current()->server() +" -> " + it.current()->nick() + " " + i18n("online"), sub);
+ sub->setItemParameter(pid, id);
+ sub->setItemParameter(cid, id);
+ sub->setItemParameter(wid, id);
+ sub->setItemParameter(dcid, id);
+ connect(sub, SIGNAL(activated(int)),
+ this, SLOT(subItemActivated(int)));
+ }
+ else {
+ sub->insertItem(i18n("Went Offline: ") + it.current()->offline().toString("hh:mm"));
+ if( ! it.current()->online().isNull() ){
+ sub->insertItem(i18n("Last Online: ") + it.current()->online().toString("hh:mm"));
+ }
+
+ intoPopupSorted(it.current()->server() +" -> " + it.current()->nick() + i18n(" offline"), sub);
+ }
+ }
+ if(m_blink_reason.count() > 0){
+ mainPop->insertSeparator();
+ for ( QStringList::Iterator it = m_blink_reason.begin(); it != m_blink_reason.end(); ++it ) {
+ mainPop->insertItem(*it);
+ }
+ }
+ if(mainPop->count() == 0){
+ mainPop->insertItem(i18n("Help on Notify Popup..."), this, SLOT(helpNotice()));
+ mainPop->insertItem(i18n("Configure Notify..."), this, SLOT(configNotify()));
+ }
+}
+
+void dockServerController::subItemActivated(int sub_id)
+{
+ const QPopupMenu *sub = dynamic_cast<const QPopupMenu *>(sender());
+ if(!sub){
+ kdDebug(5008) << "subItemActivated by non QPopupMenu" << endl;
+ return;
+ }
+ int main_id = sub->itemParameter(sub_id);
+ QString mainText = mainPop->text(main_id);
+ if(mainText.isNull()){
+ kdDebug(5008) << "failed to get mainPop text" << endl;
+ }
+ QRegExp rx("(\\S+) -> (\\S+) ");
+ if(rx.search(mainText) >= 0){
+ QString mserver = rx.cap(1);
+ QString mnick = rx.cap(2);
+
+ QString ns = mserver + "/" + mnick;
+
+ if(m_nicks[ns]){
+ kdDebug(5008) << "Got " << sub->text(sub_id) << " request for " << ns << endl;
+ QString cmd = sub->text(sub_id);
+ QString server = m_nicks[ns]->server();
+ QString nick = m_nicks[ns]->nick();
+
+ if(cmd == i18n("Chat")){
+ servercontroller::self()->new_toplevel(KSircChannel(server, nick));
+ }
+ else {
+ KSircProcess *kp = servercontroller::self()->processes().find(server);
+ if(kp){
+ KSircTopLevel *wm = dynamic_cast<KSircTopLevel *>(kp->getWindowList().find("!default"));
+ if(wm){
+ if(cmd == i18n("Ping")){
+ wm->sirc_line_return("/ping " + nick + "\n");
+ } else if(cmd == i18n("Whois")){
+ wm->sirc_line_return("/whois " + nick + "\n");
+ } else if(cmd == i18n("DCC Chat")){
+ wm->sirc_line_return("/dcc chat " + nick + "\n");
+ }
+ }
+ }
+ }
+ }
+ }
+
+}
+
+void dockServerController::mousePressEvent( QMouseEvent *e )
+{
+ if(e->button() == LeftButton){
+ showPopupMenu(mainPop);
+ }
+ else {
+ KSystemTray::mousePressEvent(e);
+ }
+}
+
+void dockServerController::showPopupMenu( QPopupMenu *menu )
+{
+ Q_ASSERT( menu != 0L );
+
+ menu->popup(QCursor::pos());
+
+}
+
+void dockServerController::nickOnline(QString server, QString nick)
+{
+ QString sn = server + "/" + nick;
+ if(!m_nicks[sn])
+ m_nicks.insert(sn, new dscNickInfo(nick, server));
+ m_nicks[sn]->setOnline();
+ createMainPopup();
+}
+
+void dockServerController::nickOffline(QString server, QString nick)
+{
+ QString sn = server + "/" + nick;
+ if(!m_nicks[sn])
+ m_nicks.insert(sn, new dscNickInfo(nick, server));
+ m_nicks[sn]->setOffline();
+ createMainPopup();
+}
+
+void dockServerController::serverOpen(QString)
+{
+}
+
+void dockServerController::serverClose(QString server)
+{
+ QDictIterator<dscNickInfo> it( m_nicks );
+ while(it.current()){
+ if(it.current()->server() == server)
+ m_nicks.remove(it.currentKey());
+ else
+ ++it;
+ }
+ createMainPopup();
+}
+
+void dockServerController::startBlink(const QString& reason, const QString& text)
+{
+ if(m_blinkActive == false){
+ // change icon (to "someone's talking to you" icon)
+ setPixmap( m_pic_info );
+ m_blinkStatus = true;
+ m_blinkActive = true;
+ m_blinkTimer->start( 500 ); // half a second
+ }
+ if(!reason.isNull()){
+ QString br(reason);
+ if(text.isNull() && ksopts->runDocked && ksopts->dockPopups)
+ KPassivePopup::message(QString("Notify: %1").arg(reason), this);
+ else {
+ QStringList sl;
+ QString cutup = text;
+ int i = 0;
+ br = reason + " " + text.left(50);
+ if(text.length() > 50)
+ br.append("...");
+ while(!cutup.isEmpty() && i++ < 3){
+ sl.append(cutup.left(50));
+ cutup.remove(0, 50);
+ }
+ cutup = sl.join("\n");
+ cutup.truncate(cutup.length()-1);
+ if(ksopts->runDocked && ksopts->dockPopups)
+ KPassivePopup::message(QString("%1").arg(reason), cutup, this);
+ }
+ m_blink_reason.append(br);
+ createMainPopup();
+ kdDebug(5008) << "Blink reason: " << br << endl;
+
+ QRegExp rx("(\\S+) -> (\\S+)");
+ if(rx.search(reason) >= 0){
+ QString server = rx.cap(1);
+ QString nick = rx.cap(2);
+
+ m_last_server = server;
+ m_last_nick = nick;
+ }
+ }
+}
+
+void dockServerController::stopBlink(const QString& reason, bool clear)
+{
+ if(clear == true){
+ m_blinkActive = false;
+ m_blinkTimer->stop();
+ setPixmap( m_pic_dock );
+ m_blink_reason.clear();
+ }
+ else {
+ if(!reason.isNull())
+ m_blink_reason.remove(reason);
+ }
+ createMainPopup();
+}
+
+void dockServerController::blinkClear()
+{
+ m_sc->resetNotification();
+}
+
+void dockServerController::mainActivated(int id)
+{
+ QRegExp rx("(\\S+) -> (\\S+) ");
+ if(rx.search(mainPop->text(id)) >= 0){
+ QString server = rx.cap(1);
+ QString nick = rx.cap(2);
+
+ raiseWindow(server, nick);
+
+ }
+}
+
+void dockServerController::raiseLastActiveWindow()
+{
+ if((!m_last_server.isNull()) && (!m_last_nick.isNull()))
+ raiseWindow(m_last_server, m_last_nick);
+}
+
+void dockServerController::blinkDockedIcon()
+{
+ m_blinkStatus = !m_blinkStatus;
+ setPixmap( m_blinkStatus ? m_pic_info : m_pic_dock );
+}
+
+void dockServerController::helpNotice()
+{
+ KMessageBox::information(0x0,
+ i18n("This popup menu can show a list of "
+ "people you have in your notify "
+ "list, and their status. You can configure "
+ "this list by going to Configure KSirc->"
+ "Startup->Notify and adding people to the "
+ "list. This will take effect the next "
+ "time you connect to a server. "
+ "This message appears when "
+ "there is nothing in your notify "
+ "list or when no one in your "
+ "list is online."
+ ),
+ i18n("Help for Notification Popup"));
+
+}
+
+void dockServerController::configNotify()
+{
+ KSPrefs *kp = new KSPrefs();
+ connect(kp, SIGNAL(update(int)),
+ m_sc, SLOT(configChange()));
+ kp->resize(550, 450);
+ kp->showPage(2); /* Show auto connect page */
+ kp->show();
+
+}
+
+
+void dockServerController::raiseWindow(QString server, QString name)
+{
+ QCString txt = server.utf8() + "_" + name.utf8() + "_toplevel";
+ QWidget *obj = dynamic_cast<QWidget *>( objFinder::find(txt, "KSircTopLevel"));
+ if(obj == 0x0){
+ txt = server.utf8() + "_!" + name.utf8() + "_toplevel";
+ obj = dynamic_cast<QWidget *>( objFinder::find(txt, "KSircTopLevel"));
+ }
+
+ if(obj != 0x0){
+ displayMgr->raise(obj, true);
+ }
+ else {
+ kdWarning() << "Did not find widget ptr to raise it" << endl;
+ }
+}
+
+#include "dockservercontroller.moc"
+