aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/channelsjoin/ChannelsJoinDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/channelsjoin/ChannelsJoinDialog.cpp')
-rw-r--r--src/modules/channelsjoin/ChannelsJoinDialog.cpp413
1 files changed, 413 insertions, 0 deletions
diff --git a/src/modules/channelsjoin/ChannelsJoinDialog.cpp b/src/modules/channelsjoin/ChannelsJoinDialog.cpp
new file mode 100644
index 000000000..65e307028
--- /dev/null
+++ b/src/modules/channelsjoin/ChannelsJoinDialog.cpp
@@ -0,0 +1,413 @@
+//=============================================================================
+//
+// File : ChannelsJoinDialog.cpp
+// Creation date : Thu Nov 6 2001 12:41:18 by Juanjo �varez
+//
+// This file is part of the KVIrc irc client distribution
+// Copyright (C) 2001-2010 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the linkss of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//=============================================================================
+
+#include "ChannelsJoinDialog.h"
+
+#include "KviLocale.h"
+#include "KviOptions.h"
+#include "KviSelectors.h"
+#include "KviApplication.h"
+#include "KviCString.h"
+#include "KviQString.h"
+#include "KviIconManager.h"
+#include "KviConsoleWindow.h"
+#include "KviRegisteredChannel.h"
+#include "KviRegisteredChannelDataBase.h"
+#include "KviKvsScript.h"
+#include "KviTalGroupBox.h"
+
+#include <QTreeWidget>
+#include <QLabel>
+#include <QLineEdit>
+#include <QLayout>
+#include <QPushButton>
+#include <QEvent>
+#include <QCloseEvent>
+#include <QHeaderView>
+#include <QCheckBox>
+
+
+extern ChannelsJoinDialog * g_pChannelsWindow;
+extern QRect g_rectChannelsJoinGeometry;
+// KviApplication.cpp
+extern KVIRC_API KviRegisteredChannelDataBase * g_pRegisteredChannelDataBase;
+
+
+ChannelsJoinDialog::ChannelsJoinDialog(QWidget * par, const char * name)
+: QDialog(par)
+{
+ setObjectName(name);
+ setWindowTitle(__tr2qs("Join Channels"));
+ setWindowIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)));
+
+ m_pConsole = 0;
+
+ QGridLayout * g = new QGridLayout(this);
+
+ m_pTreeWidget = new QTreeWidget(this);
+ m_pTreeWidget->setHeaderLabel(__tr2qs("Channel"));
+ m_pTreeWidget->setRootIsDecorated(true);
+ m_pTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+ g->addWidget(m_pTreeWidget,0,0,1,2);
+ connect(m_pTreeWidget,SIGNAL(itemClicked(QTreeWidgetItem *,int)),this,SLOT(itemClicked(QTreeWidgetItem *,int)));
+ connect(m_pTreeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem *,int)),this,SLOT(itemDoubleClicked(QTreeWidgetItem *,int)));
+
+
+ m_pGroupBox = new KviTalGroupBox(Qt::Horizontal,__tr2qs("Channel" ),this);
+ QString szMsg = __tr2qs("Name");
+ szMsg.append(":");
+
+ new QLabel(szMsg,m_pGroupBox);
+
+ m_pChannelEdit = new QLineEdit(m_pGroupBox);
+ connect(m_pChannelEdit,SIGNAL(returnPressed()), this, SLOT(editReturnPressed()));
+ connect(m_pChannelEdit,SIGNAL(textChanged(const QString &)),this,SLOT(editTextChanged(const QString &)));
+
+ szMsg = __tr2qs("Password");
+ szMsg.append(":");
+ QLabel(szMsg,m_pGroupBox);
+
+ m_pPass = new QLineEdit(m_pGroupBox);
+ m_pPass->setEchoMode(QLineEdit::Password);
+
+ g->addWidget(m_pGroupBox,1,0,1,2);
+
+ KviTalHBox * hb = new KviTalHBox(this);
+ hb->setSpacing(4);
+
+ g->addWidget(hb,2,0,1,2,Qt::AlignHCenter);
+
+ m_pJoinButton = new QPushButton(__tr2qs("&Join"),hb);
+ // Join on return pressed
+ m_pJoinButton->setDefault(true);
+ connect(m_pJoinButton,SIGNAL(clicked()),this,SLOT(joinClicked()));
+
+ m_pRegButton = new QPushButton(__tr2qs("&Register"),hb);
+ // Join on return pressed
+ connect(m_pRegButton,SIGNAL(clicked()),this,SLOT(regClicked()));
+
+ m_pClearButton = new QPushButton(__tr2qs("Clear Recent"),hb);
+ connect(m_pClearButton,SIGNAL(clicked()),this,SLOT(clearClicked()));
+
+ m_pShowAtStartupCheck = new QCheckBox(__tr2qs("Show this window after connecting"),this);
+ m_pShowAtStartupCheck->setChecked(KVI_OPTION_BOOL(KviOption_boolShowChannelsJoinOnIrc));
+ g->addWidget(m_pShowAtStartupCheck,3,0);
+
+
+ QPushButton * cancelButton = new QPushButton(__tr2qs("Close"),this);
+ connect(cancelButton,SIGNAL(clicked()),this,SLOT(cancelClicked()));
+
+ g->addWidget(cancelButton,3,1);
+
+/*
+ KviTalHBox * hb = new KviTalHBox(this);
+ hb->setSpacing(4);
+
+ QPushButton * namesButton = new QPushButton("/names", hb);
+ connect(namesButton,SIGNAL(clicked()),this,SLOT(namesClicked()));
+ QPushButton * whoButton = new QPushButton("/who", hb);
+ connect(whoButton,SIGNAL(clicked()),this,SLOT(whoClicked()));
+
+ g->addWidget(hb,2,0);
+*/
+
+ g->setRowStretch(0,1);
+ g->setColumnStretch(0,1);
+
+ fillListView();
+
+ if(g_rectChannelsJoinGeometry.y() < 5)g_rectChannelsJoinGeometry.setY(5);
+
+ resize(g_rectChannelsJoinGeometry.width(),g_rectChannelsJoinGeometry.height());
+ move(g_rectChannelsJoinGeometry.x(),g_rectChannelsJoinGeometry.y());
+
+ enableJoin();
+}
+
+ChannelsJoinDialog::~ChannelsJoinDialog()
+{
+ KVI_OPTION_BOOL(KviOption_boolShowChannelsJoinOnIrc) = m_pShowAtStartupCheck->isChecked();
+
+ g_rectChannelsJoinGeometry = QRect(pos().x(),pos().y(),size().width(),size().height());
+ g_pChannelsWindow = 0;
+}
+
+void ChannelsJoinDialog::setConsole(KviConsoleWindow * pConsole)
+{
+ m_pConsole = pConsole;
+ fillListView();
+}
+
+void ChannelsJoinDialog::fillListView()
+{
+ m_pTreeWidget->clear();
+
+ m_pTreeWidget->header()->hide();
+
+ // Registered channels go first
+
+ QTreeWidgetItem * par = new QTreeWidgetItem(m_pTreeWidget);
+ par->setText(0,__tr2qs("Registered Channels"));
+ par->setExpanded(true);
+
+ QHash<QString,KviRegisteredChannelList *> * d = g_pRegisteredChannelDataBase->channelDict();
+ if(d)
+ {
+ for(QHash<QString,KviRegisteredChannelList *>::Iterator it = d->begin();it != d->end();++it)
+ {
+ QTreeWidgetItem * chld = new QTreeWidgetItem(par);
+ chld->setText(0,it.key());
+ chld->setIcon(0,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)));
+ }
+ }
+
+ par = new QTreeWidgetItem(m_pTreeWidget);
+ par->setText(0,__tr2qs("Recent Channels"));
+ par->setExpanded(true);
+
+ QTreeWidgetItem * chld;
+
+ bool bGotChanOnCurrentNetwork = false;
+
+ if(m_pConsole)
+ {
+ QStringList * pList = g_pApp->recentChannelsForNetwork(m_pConsole->currentNetworkName());
+ if(pList)
+ {
+ if(pList->count() > 0)
+ {
+ bGotChanOnCurrentNetwork = true;
+
+ par = new QTreeWidgetItem(par);
+ par->setText(0,__tr2qs("Current Network"));
+ par->setExpanded(true);
+
+ for(QStringList::Iterator it = pList->begin(); it != pList->end(); ++it)
+ {
+ chld = new QTreeWidgetItem(par);
+ chld->setText(0,*it);
+ chld->setIcon(0,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)));
+ }
+ }
+ }
+ }
+
+ KviPointerHashTable<QString,QStringList> * pDict = g_pApp->recentChannels();
+ if(!pDict)
+ return;
+
+ par = new QTreeWidgetItem(par);
+ par->setText(0,__tr2qs("All Networks"));
+
+ if(!bGotChanOnCurrentNetwork)
+ par->setExpanded(true); // expand this one instead
+
+ QHash<QString,int> hNoDuplicates;
+
+ for(QStringList * pChans = pDict->first();pChans;pChans = pDict->next())
+ {
+ for(QStringList::Iterator it = pChans->begin(); it != pChans->end(); ++it)
+ {
+ QString chan = *it;
+ if(hNoDuplicates.contains(chan.toLower()))
+ continue;
+ hNoDuplicates.insert(chan.toLower(),1);
+ chld = new QTreeWidgetItem(par);
+ chld->setText(0,chan);
+ chld->setIcon(0,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)));
+ }
+ }
+}
+
+void ChannelsJoinDialog::itemClicked(QTreeWidgetItem * it, int)
+{
+ if(!it)
+ return;
+ if(it->childCount())
+ return;
+
+ QString szTmp = it->text(0);
+ m_pChannelEdit->setText(szTmp);
+ enableJoin();
+}
+
+void ChannelsJoinDialog::itemDoubleClicked(QTreeWidgetItem * it, int)
+{
+ if(!it)
+ return;
+ if(it->childCount())
+ return;
+
+ QString szTmp = it->text(0);
+ m_pChannelEdit->setText(szTmp);
+ enableJoin();
+ joinClicked();
+}
+
+void ChannelsJoinDialog::editTextChanged(const QString &)
+{
+ enableJoin();
+}
+
+void ChannelsJoinDialog::enableJoin()
+{
+ QString szTmp = m_pChannelEdit->text();
+ KviConsoleWindow * c = g_pApp->topmostConnectedConsole();
+ if(c)
+ {
+ if(szTmp.isEmpty())
+ {
+ m_pJoinButton->setEnabled(false);
+ m_pRegButton->setEnabled(false);
+ } else {
+ m_pJoinButton->setEnabled(true);
+ m_pRegButton->setEnabled(true);
+ }
+ } else {
+ m_pTreeWidget->setEnabled(false);
+ m_pGroupBox->setEnabled(false);
+ m_pJoinButton->setEnabled(false);
+ }
+}
+
+void ChannelsJoinDialog::cancelClicked()
+{
+ delete this;
+}
+
+void ChannelsJoinDialog::joinClicked()
+{
+ QString szPass = m_pPass->text();
+ QString szTmp = m_pChannelEdit->text();
+
+ if(szTmp.isEmpty())
+ return;
+
+ KviQString::escapeKvs(&szTmp);
+ KviQString::escapeKvs(&szPass);
+
+ QString szCmd = "join ";
+ szCmd += szTmp;
+ szCmd += " ";
+ szCmd += szPass;
+
+ KviConsoleWindow * c = g_pApp->topmostConnectedConsole();
+ if(!c)
+ return; // no connection
+
+ KviWindow * w = g_pActiveWindow;
+ if(w->console() != c)
+ w = c;
+
+ KviKvsScript::run(szCmd,w);
+
+ m_pChannelEdit->setText("");
+ m_pPass->setText("");
+}
+
+void ChannelsJoinDialog::regClicked()
+{
+ QString szTmp = m_pChannelEdit->text();
+
+ if(szTmp.isEmpty())
+ return;
+
+ KviQString::escapeKvs(&szTmp);
+ QString szCmd = "regchan.add ";
+ szCmd += szTmp;
+
+ KviConsoleWindow * c = g_pApp->topmostConnectedConsole();
+ if(!c)
+ return; // no connection
+
+ KviWindow * w = g_pActiveWindow;
+ if(w->console() != c)
+ w = c;
+
+ KviKvsScript::run(szCmd,w);
+ fillListView();
+
+ //focus the new item (in reality, the first matching one)
+ QList<QTreeWidgetItem*> items = m_pTreeWidget->findItems(szTmp, Qt::MatchRecursive | Qt::MatchExactly);
+ if(!items.empty())
+ {
+ m_pTreeWidget->setCurrentItem(items.first());
+ m_pTreeWidget->scrollToItem(items.first());
+ }
+}
+
+void ChannelsJoinDialog::clearClicked()
+{
+ QString szCmd = "option stringlistRecentChannels";
+
+ KviConsoleWindow * c = g_pApp->topmostConnectedConsole();
+ if(!c)
+ return; // no connection
+
+ KviWindow * w = g_pActiveWindow;
+ if(w->console() != c)
+ w = c;
+
+ KviKvsScript::run(szCmd,w);
+ fillListView();
+}
+
+/*
+void ChannelsJoinDialog::whoClicked()
+{
+ KviCString tmp = m_pChannelEdit->text();
+ if(!tmp.isEmpty())doCmd("who", tmp.ptr());
+}
+
+void ChannelsJoinDialog::namesClicked()
+{
+ KviCString tmp = m_pChannelEdit->text();
+ //FIXME: I must be a nice guy and implement /names in the core...
+ if(!tmp.isEmpty())doCmd("raw names", tmp.ptr());
+}
+
+void ChannelsJoinDialog::itemDoubleClicked(KviTalListBoxItem * it)
+{
+ if (it == 0)return;
+ KviCString tmp = it->text();
+ doCmd("join", tmp.ptr());
+// if(KVI_OPTION_BOOL(KviOption_boolCloseChannelsJoinAfterJoin))
+// g_pApp->collectGarbage(this);
+}
+*/
+
+void ChannelsJoinDialog::editReturnPressed()
+{
+ joinClicked();
+}
+
+void ChannelsJoinDialog::closeEvent(QCloseEvent * e)
+{
+ e->ignore();
+ delete this;
+}
+
+#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES
+#include "m_ChannelsJoinDialog.moc"
+#endif //COMPILE_USE_STANDALONE_MOC_SOURCES