summaryrefslogtreecommitdiffstats
path: root/src/kvirc/ui/kvi_menubar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kvirc/ui/kvi_menubar.cpp')
-rw-r--r--src/kvirc/ui/kvi_menubar.cpp415
1 files changed, 415 insertions, 0 deletions
diff --git a/src/kvirc/ui/kvi_menubar.cpp b/src/kvirc/ui/kvi_menubar.cpp
new file mode 100644
index 0000000..a382f73
--- /dev/null
+++ b/src/kvirc/ui/kvi_menubar.cpp
@@ -0,0 +1,415 @@
+//=============================================================================
+//
+// File : kvi_menubar.cpp
+// Creation date : Wen Jun 21 2000 13:12:11 by Szymon Stefanek
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 2000-2005 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms 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.
+//
+//=============================================================================
+
+#define __KVIRC__
+#include "kvi_menubar.h"
+#include "kvi_app.h"
+#include "kvi_locale.h"
+#include "kvi_frame.h"
+#include "kvi_mdimanager.h"
+#include "kvi_iconmanager.h"
+#include "kvi_internalcmd.h"
+#include "kvi_settings.h"
+#include "kvi_ircurl.h"
+#include "kvi_console.h"
+#include "kvi_kvs_popupmenu.h"
+#include "kvi_malloc.h"
+#include "kvi_moduleextension.h"
+#include "kvi_actionmanager.h"
+#include "kvi_coreactionnames.h"
+#include "kvi_kvs_script.h"
+
+#include "kvi_tal_popupmenu.h"
+
+KviMenuBar::KviMenuBar(KviFrame * par,const char * name)
+ : KviTalMenuBar(par,name)
+{
+ m_pFrm = par;
+
+ m_iNumDefaultItems = 0;
+ m_pDefaultItemId = 0;
+
+ KviTalPopupMenu * pop = new KviTalPopupMenu(this,"KVIrc");
+ connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupMainPopup()));
+#ifndef Q_OS_MACX
+ addDefaultItem("&KVIrc",pop);
+#else
+ // Qt/Mac creates already a "KVirc" menu item on its own, and we don't like double entries ;-)
+ addDefaultItem("&IRC",pop);
+#endif //Q_OS_MACX
+ m_pRecentServersPopup = new KviTalPopupMenu(this,"recentservers");
+ connect(m_pRecentServersPopup,SIGNAL(aboutToShow()),this,SLOT(setupRecentServersPopup()));
+ connect(m_pRecentServersPopup,SIGNAL(activated(int)),this,SLOT(newConnectionToServer(int)));
+
+ m_pScriptItemList = 0;
+
+ pop = new KviTalPopupMenu(this,"scripting");
+ connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupScriptingPopup()));
+ addDefaultItem(__tr2qs("Scri&pting"),pop);
+
+ pop = new KviTalPopupMenu(this,"tools");
+ connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupToolsPopup()));
+ connect(pop,SIGNAL(activated(int)),this,SLOT(toolsPopupSelected(int)));
+ addDefaultItem(__tr2qs("&Tools"),pop);
+
+ m_pToolbarsPopup = new KviTalPopupMenu(this,"toolbars");
+ connect(m_pToolbarsPopup,SIGNAL(aboutToShow()),this,SLOT(setupToolbarsPopup()));
+
+ pop = new KviTalPopupMenu(this,"settings");
+ connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupSettingsPopup()));
+ addDefaultItem(__tr2qs("&Settings"),pop);
+
+ addDefaultItem(__tr2qs("&Window"),par->mdiManager()->windowPopup());
+
+ pop = new KviTalPopupMenu(this,"help");
+ connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupHelpPopup()));
+ addDefaultItem(__tr2qs("&Help"),pop);
+}
+
+KviMenuBar::~KviMenuBar()
+{
+ if(m_pScriptItemList)delete m_pScriptItemList;
+ if(m_pDefaultItemId)kvi_free(m_pDefaultItemId);
+}
+
+void KviMenuBar::showEvent(QShowEvent *e)
+{
+#ifdef COMPILE_USE_QT4
+ debug("menubar show");
+ // force a re-layout of the menubar in Qt4 (see the note in enterSDIMode())
+ // by resetting the corner widget
+ m_pFrm->mdiManager()->relayoutMenuButtons();
+#endif
+}
+
+void KviMenuBar::addDefaultItem(const QString &text,KviTalPopupMenu * pop)
+{
+ m_iNumDefaultItems++;
+ m_pDefaultItemId = (int *)kvi_realloc((void *)m_pDefaultItemId,sizeof(int) * m_iNumDefaultItems);
+ m_pDefaultItemId[m_iNumDefaultItems - 1] = insertItem(text,pop);
+}
+
+void KviMenuBar::setupHelpPopup()
+{
+ KviTalPopupMenu * help = (KviTalPopupMenu *)sender();
+ help->clear();
+
+ // FIXME: Convert these to actions!
+ int id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HELP)),__tr2qs("&Help Browser (Panel)"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_HELP_NEWSTATICWINDOW);
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MDIHELP)),__tr2qs("Help Browser (&Window)"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_HELP_NEWMDIWINDOW);
+ help->insertSeparator();
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_IDEA)),__tr2qs("&Tip of the Day"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_TIP_OPEN);
+ help->insertSeparator();
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_KVIRC)),__tr2qs("About &KVIrc"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_ABOUT_ABOUTKVIRC);
+ help->insertSeparator();
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HOMEPAGE)),__tr2qs("KVIrc Home&page"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_KVIRC_HOMEPAGE);
+ if(kvi_strEqualCIN(KviLocale::localeName(),"ru",2))
+ {
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HOMEPAGE)),__tr2qs("KVIrc Russian Home&page"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_KVIRC_HOMEPAGE_RU);
+ }
+ if(kvi_strEqualCIN(KviLocale::localeName(),"fr",2))
+ {
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HOMEPAGE)),__tr2qs("KVIrc French Home&page"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_KVIRC_HOMEPAGE_FR);
+ }
+ help->insertSeparator();
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MESSAGE)),__tr2qs("Subscribe to the Mailing List"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_MAILINGLIST);
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_BOMB)),__tr2qs("Report a Bug / Propose Improvements"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_BUGTRACK);
+ help->insertSeparator();
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc International Channel on Freenode"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_ON_FREENODE);
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc International Channel on IRCNet"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_ON_IRCNET);
+ if(kvi_strEqualCIN(KviLocale::localeName(),"it",2))
+ {
+ // join #kvirc.net on azzurra
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc Italian Channel on AzzurraNet"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_IT_ON_AZZURRA);
+ }
+ if(kvi_strEqualCIN(KviLocale::localeName(),"fr",2))
+ {
+ // join #kvirc-fr on freenode
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc French Channel on Freenode"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_FR_ON_FREENODE);
+ // join #kvirc on europnet
+ id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc French Channel on EuropNet"),m_pFrm,SLOT(executeInternalCommand(int)));
+ help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_FR_ON_EUROPNET);
+ }
+ // add your localized #kvirc channels here...
+}
+
+void KviMenuBar::setupSettingsPopup()
+{
+ // FIXME: Move everything to actions!
+
+ KviTalPopupMenu * opt = (KviTalPopupMenu *)sender();
+ opt->clear();
+
+ opt->insertItem(__tr2qs("Toolbars"),m_pToolbarsPopup);
+
+ int id = opt->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_STATUSBAR)),__tr2qs("Show StatusBar"),m_pFrm,SLOT(toggleStatusBar()));
+ opt->setItemChecked(id,m_pFrm->mainStatusBar());
+
+
+ opt->insertSeparator();
+ // FIXME: #warning "Toggle these items on the fly ?"
+ ACTION_POPUP_ITEM(KVI_COREACTION_GENERALOPTIONS,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_THEMEOPTIONS,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_MANAGETHEMES,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_MANAGEADDONS,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_SERVEROPTIONS,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_TOOLBAREDITOR,opt)
+ ACTION_POPUP_ITEM(KVI_COREACTION_EDITREGUSERS,opt)
+
+ opt->insertSeparator();
+ opt->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_FLOPPY)),__tr2qs("&Save Configuration"),g_pApp,SLOT(saveConfiguration()));
+}
+
+void KviMenuBar::setupScriptingPopup()
+{
+ KviTalPopupMenu * script = (KviTalPopupMenu *)sender();
+ script->clear();
+
+ ACTION_POPUP_ITEM(KVI_COREACTION_ACTIONEDITOR,script)
+ ACTION_POPUP_ITEM(KVI_COREACTION_ALIASEDITOR,script)
+ ACTION_POPUP_ITEM(KVI_COREACTION_EVENTEDITOR,script)
+ ACTION_POPUP_ITEM(KVI_COREACTION_POPUPEDITOR,script)
+ ACTION_POPUP_ITEM(KVI_COREACTION_RAWEDITOR,script)
+ script->insertSeparator();
+ ACTION_POPUP_ITEM(KVI_COREACTION_CODETESTER,script)
+ script->insertSeparator();
+ ACTION_POPUP_ITEM(KVI_COREACTION_EXECUTEKVS,script)
+
+ script->insertSeparator();
+ script->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TEXTEXCLAMATIVE)),__tr2qs("Restore &Default Script"),g_pApp,SLOT(restoreDefaultScript()));
+}
+
+void KviMenuBar::setupMainPopup()
+{
+ KviTalPopupMenu * main = (KviTalPopupMenu *)sender();
+ main->clear();
+
+ ACTION_POPUP_ITEM(KVI_COREACTION_NEWIRCCONTEXT,main)
+ if(m_pFrm->activeContext())
+ if(m_pFrm->activeContext()->state()==KviIrcContext::Connected)
+ {
+ int id = main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_QUIT)),__tr2qs("Disconnect"),m_pFrm,SLOT(executeInternalCommand(int)));
+ main->setItemParameter(id,KVI_INTERNALCOMMAND_QUIT);
+ }
+ main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_WORLD)),__tr2qs("New &Connection To"),m_pRecentServersPopup);
+
+ main->insertSeparator();
+
+ if(m_pFrm->dockExtension())
+ {
+ int id = main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DOCKWIDGET)),__tr2qs("Hide &Dock Icon"),m_pFrm,SLOT(executeInternalCommand(int)));
+ main->setItemParameter(id,KVI_INTERNALCOMMAND_DOCKWIDGET_HIDE);
+ } else {
+ int id = main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DOCKWIDGET)),__tr2qs("Show &Dock Icon"),m_pFrm,SLOT(executeInternalCommand(int)));
+ main->setItemParameter(id,KVI_INTERNALCOMMAND_DOCKWIDGET_SHOW);
+ }
+
+// Qt/Mac creates a Quit item on its own
+#ifndef Q_OS_MACX
+ main->insertSeparator();
+
+ main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_QUITAPP)),__tr2qs("&Quit"),g_pApp,SLOT(quit()));
+#endif //Q_OS_MACX
+}
+
+
+void KviMenuBar::setupRecentServersPopup()
+{
+ KviTalPopupMenu * m = (KviTalPopupMenu *)sender();
+ g_pApp->fillRecentServersPopup(m);
+ m->insertSeparator();
+ m->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_SERVER)),__tr2qs("&Other..."));
+}
+
+void KviMenuBar::newConnectionToServer(int id)
+{
+ QString text = m_pRecentServersPopup->text(id);
+ if(!text.isEmpty())
+ {
+ // the gentoo qt 3.3.4-r2 is broken
+ // since it adds random & characters to the popup texts...
+ if(text == __tr2qs("&Other..."))
+ {
+ KviKvsScript::run("options.edit KviServerOptionsWidget",m_pFrm->firstConsole());
+ } else {
+ text.replace(QString("&"),QString(""));
+ KviStr szCommand;
+ if(KviIrcUrl::parse(text.utf8().data(),szCommand,KVI_IRCURL_CONTEXT_NEW))
+ KviKvsScript::run(szCommand.ptr(),m_pFrm->firstConsole());
+ }
+ }
+}
+
+void KviMenuBar::setupToolsPopup()
+{
+ KviTalPopupMenu * m = (KviTalPopupMenu *)sender();
+ if(!m)return;
+
+ m->clear();
+
+ KviModuleExtensionDescriptorList * l = g_pModuleExtensionManager->getExtensionList("tool");
+ if(l)
+ {
+ for(KviModuleExtensionDescriptor * d = l->first();d;d = l->next())
+ {
+ int id;
+ if(d->icon())id = m->insertItem(*(d->icon()),d->visibleName());
+ else id = m->insertItem(d->visibleName());
+ //m->setItemChecked(id,(m_pFrm->moduleExtensionToolBar(d->id())));
+ m->setItemParameter(id,d->id());
+ }
+ }
+ m->insertSeparator();
+ ACTION_POPUP_ITEM(KVI_COREACTION_SOCKETSPY,m)
+ ACTION_POPUP_ITEM(KVI_COREACTION_NETWORKLINKS,m)
+ ACTION_POPUP_ITEM(KVI_COREACTION_CHANNELLIST,m)
+ m->insertSeparator();
+
+ ACTION_POPUP_ITEM(KVI_COREACTION_SCREENSHOT,m)
+
+ // moved the old tools here
+ m->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ICONMANAGER)),__tr2qs("Show &Icon Table"),g_pIconManager,SLOT(showIconWidget()));
+#ifdef COMPILE_KDE_SUPPORT
+ int id;
+ id = m->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TERMINAL)),__tr2qs("Open &Terminal"),m_pFrm,SLOT(executeInternalCommand(int)));
+ m->setItemParameter(id,KVI_INTERNALCOMMAND_TERM_OPEN);
+#endif
+
+
+ KviPointerList<KviAction> list;
+ KviActionManager::instance()->listActionsByCategory("tools",&list);
+ if(!list.isEmpty())
+ {
+ m->insertSeparator();
+ for(KviAction * ac = list.first();ac;ac = list.next())
+ ac->addToPopupMenu(m);
+ }
+}
+
+void KviMenuBar::toolsPopupSelected(int id)
+{
+ KviTalPopupMenu * m = (KviTalPopupMenu *)sender();
+ if(!m)return;
+ int idext = m->itemParameter(id);
+ g_pModuleExtensionManager->allocateExtension("tool",idext,m_pFrm->firstConsole());
+}
+
+
+void KviMenuBar::setupToolbarsPopup()
+{
+ m_pFrm->fillToolBarsPopup(m_pToolbarsPopup);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Script items
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+int KviMenuBar::getDefaultItemRealIndex(int iDefaultIndex)
+{
+ if(iDefaultIndex < 0)iDefaultIndex = 0;
+ if(iDefaultIndex >= m_iNumDefaultItems)
+ return indexOf(m_pDefaultItemId[m_iNumDefaultItems - 1]) + 1;
+ return indexOf(m_pDefaultItemId[iDefaultIndex]);
+}
+
+KviScriptMenuBarItem * KviMenuBar::findMenu(const QString &text)
+{
+ if(!m_pScriptItemList)return 0;
+ for(KviScriptMenuBarItem * i = m_pScriptItemList->first();i;i = m_pScriptItemList->next())
+ {
+ if(KviQString::equalCI(i->szText,text))return i;
+ }
+ return 0;
+}
+
+KviScriptMenuBarItem * KviMenuBar::findMenu(KviKvsPopupMenu * p)
+{
+ if(!m_pScriptItemList)return 0;
+ for(KviScriptMenuBarItem * i = m_pScriptItemList->first();i;i = m_pScriptItemList->next())
+ {
+ if(i->pPopup == p)return i;
+ }
+ return 0;
+}
+
+bool KviMenuBar::removeMenu(const QString &text)
+{
+ KviScriptMenuBarItem * i = findMenu(text);
+ if(i)
+ {
+ disconnect(i->pPopup,SIGNAL(destroyed()),this,SLOT(menuDestroyed()));
+ removeItem(i->id);
+ m_pScriptItemList->removeRef(i);
+ return true;
+ }
+ return false;
+}
+
+void KviMenuBar::menuDestroyed()
+{
+ KviScriptMenuBarItem * i = findMenu(((KviKvsPopupMenu *)sender()));
+ if(i)
+ {
+ removeItem(i->id);
+ m_pScriptItemList->removeRef(i);
+ }
+}
+
+void KviMenuBar::addMenu(const QString &text,KviKvsPopupMenu * p,int index)
+{
+ if(!m_pScriptItemList)
+ {
+ m_pScriptItemList = new KviPointerList<KviScriptMenuBarItem>;
+ m_pScriptItemList->setAutoDelete(true);
+ }/* else {
+ removeMenu(text);
+ }*/
+ KviScriptMenuBarItem * it = new KviScriptMenuBarItem;
+ it->szText = text;
+ it->szPopupName = p->name();
+ it->pPopup = p;
+ it->id = insertItem(text,p,-1,index);
+ connect(p,SIGNAL(destroyed()),this,SLOT(menuDestroyed()));
+ m_pScriptItemList->append(it);
+}
+
+#include "kvi_menubar.moc"