/********************************************************************** $$Id$$ Dock Server Controller. Displays server connection window, and makes new server connection on demand. *********************************************************************/ #include "dockservercontroller.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 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(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(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 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( objFinder::find(txt, "KSircTopLevel")); if(obj == 0x0){ txt = server.utf8() + "_!" + name.utf8() + "_toplevel"; obj = dynamic_cast( 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"