summaryrefslogtreecommitdiffstats
path: root/konversation/src/konversationmainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'konversation/src/konversationmainwindow.cpp')
-rw-r--r--konversation/src/konversationmainwindow.cpp654
1 files changed, 654 insertions, 0 deletions
diff --git a/konversation/src/konversationmainwindow.cpp b/konversation/src/konversationmainwindow.cpp
new file mode 100644
index 0000000..a85c5fd
--- /dev/null
+++ b/konversation/src/konversationmainwindow.cpp
@@ -0,0 +1,654 @@
+/*
+ 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 option) any later version.
+*/
+
+/*
+ Copyright (C) 2002 Dario Abatianni <eisfuchs@tigress.com>
+ Copyright (C) 2005 Ismail Donmez <ismail@kde.org>
+ Copyright (C) 2005 Peter Simonsson <psn@linux.se>
+ Copyright (C) 2005 John Tapsell <johnflux@gmail.com>
+ Copyright (C) 2005-2008 Eike Hein <hein@kde.org>
+*/
+
+#include "konversationmainwindow.h"
+#include "konversationapplication.h"
+#include "linkaddressbook/addressbook.h"
+#include "konvisettingsdialog.h"
+#include "viewcontainer.h"
+#include "konversationstatusbar.h"
+#include "konvibookmarkhandler.h"
+#include "trayicon.h"
+#include "serverlistdialog.h"
+#include "identitydialog.h"
+#include "notificationhandler.h"
+#include "irccharsets.h"
+#include "connectionmanager.h"
+#include "awaymanager.h"
+#include "dcctransfermanager.h"
+
+#include <qnamespace.h>
+#include <qwhatsthis.h>
+#include <qsignalmapper.h>
+#include <qobjectlist.h>
+
+#include <kaccel.h>
+#include <kaccelmanager.h>
+#include <kstdaction.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kmenubar.h>
+#include <kkeydialog.h>
+#include <kdeversion.h>
+#include <kedittoolbar.h>
+#include <kpopupmenu.h>
+#include <kwin.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <dcopclient.h>
+#include <scriptmanager.h>
+#include <kabc/addressbook.h>
+#include <kabc/errorhandler.h>
+
+#include <config.h>
+#ifdef USE_KNOTIFY
+#include <knotifydialog.h>
+#endif
+
+
+KonversationMainWindow::KonversationMainWindow() : KMainWindow(0,"main_window", WStyle_ContextHelp | WType_TopLevel | WDestructiveClose)
+{
+ m_hasDirtySettings = false;
+ m_closeApp = false;
+ m_serverListDialog = 0;
+ m_settingsDialog = NULL;
+
+ m_viewContainer = new ViewContainer(this);
+ setCentralWidget(m_viewContainer->getWidget());
+
+ //used for event compression. See header file for resetHasDirtySettings()
+ connect(KonversationApplication::instance(), SIGNAL(appearanceChanged()), this, SLOT(resetHasDirtySettings()));
+ connect(KonversationApplication::instance(), SIGNAL(appearanceChanged()), this, SLOT(updateTrayIcon()));
+
+
+ // Set up view container
+ connect(KonversationApplication::instance(), SIGNAL(appearanceChanged()), m_viewContainer, SLOT(updateAppearance()));
+ connect(KonversationApplication::instance(), SIGNAL(iconChanged(int)), m_viewContainer, SLOT(updateViewIcons()));
+ connect(KonversationApplication::instance(), SIGNAL(serverGroupsChanged(const Konversation::ServerGroupSettings*)),
+ m_viewContainer, SLOT(updateViews(const Konversation::ServerGroupSettings*)));
+ connect(m_viewContainer, SIGNAL(autoJoinToggled(const Konversation::ServerGroupSettings*)),
+ KonversationApplication::instance(), SIGNAL(serverGroupsChanged(const Konversation::ServerGroupSettings*)));
+ connect(m_viewContainer, SIGNAL(setWindowCaption(const QString&)), this, SLOT(setCaption(const QString&)));
+ connect(KonversationApplication::instance()->getConnectionManager(),
+ SIGNAL(connectionChangedState(Server*, Konversation::ConnectionState)),
+ m_viewContainer, SLOT(connectionStateChanged(Server*, Konversation::ConnectionState)));
+ connect(this, SIGNAL(triggerRememberLine()), m_viewContainer, SLOT(insertRememberLine()));
+ connect(this, SIGNAL(triggerRememberLines(Server*)), m_viewContainer, SLOT(insertRememberLines(Server*)));
+ connect(this, SIGNAL(cancelRememberLine()), m_viewContainer, SLOT(cancelRememberLine()));
+ connect(this, SIGNAL(insertMarkerLine()), m_viewContainer, SLOT(insertMarkerLine()));
+
+ // Set up status bar
+ m_statusBar = new KonversationStatusBar(this);
+ connect(KonversationApplication::instance(), SIGNAL(appearanceChanged()), m_statusBar, SLOT(updateAppearance()));
+
+ createStandardStatusBarAction();
+
+ connect(actionCollection(), SIGNAL(actionStatusText(const QString&)), m_statusBar, SLOT(setMainLabelTempText(const QString&)));
+ connect(actionCollection(), SIGNAL(clearStatusText()), m_statusBar, SLOT(clearMainLabelTempText()));
+ actionCollection()->setHighlightingEnabled(true);
+
+ connect(m_viewContainer, SIGNAL(resetStatusBar()), m_statusBar, SLOT(resetStatusBar()));
+ connect(m_viewContainer, SIGNAL(setStatusBarTempText(const QString&)), m_statusBar, SLOT(setMainLabelTempText(const QString&)));
+ connect(m_viewContainer, SIGNAL(clearStatusBarTempText()), m_statusBar, SLOT(clearMainLabelTempText()));
+ connect(m_viewContainer, SIGNAL(setStatusBarInfoLabel(const QString&)), m_statusBar, SLOT(updateInfoLabel(const QString&)));
+ connect(m_viewContainer, SIGNAL(clearStatusBarInfoLabel()), m_statusBar, SLOT(clearInfoLabel()));
+ connect(m_viewContainer, SIGNAL(setStatusBarLagLabelShown(bool)), m_statusBar, SLOT(setLagLabelShown(bool)));
+ connect(m_viewContainer, SIGNAL(updateStatusBarLagLabel(Server*, int)), m_statusBar, SLOT(updateLagLabel(Server*, int)));
+ connect(m_viewContainer, SIGNAL(resetStatusBarLagLabel()), m_statusBar, SLOT(resetLagLabel()));
+ connect(m_viewContainer, SIGNAL(setStatusBarLagLabelTooLongLag(Server*, int)), m_statusBar, SLOT(setTooLongLag(Server*, int)));
+ connect(m_viewContainer, SIGNAL(updateStatusBarSSLLabel(Server*)), m_statusBar, SLOT(updateSSLLabel(Server*)));
+ connect(m_viewContainer, SIGNAL(removeStatusBarSSLLabel()), m_statusBar, SLOT(removeSSLLabel()));
+
+
+ // Actions
+ KStdAction::quit(this,SLOT(quitProgram()),actionCollection());
+
+ hideMenuBarAction = KStdAction::showMenubar(this, SLOT(toggleMenubar()), actionCollection());
+
+ setStandardToolBarMenuEnabled(true);
+ KStdAction::configureToolbars(this, SLOT(configureToolbar()), actionCollection());
+
+ KStdAction::keyBindings(this, SLOT(openKeyBindings()), actionCollection());
+ KAction *preferencesAction = KStdAction::preferences(this, SLOT(openPrefsDialog()), actionCollection());
+
+#ifdef USE_KNOTIFY // options_configure_notifications
+ KAction *configureNotificationsAction = KStdAction::configureNotifications(this,SLOT(openNotifications()), actionCollection());
+#endif
+
+ KAction* action;
+
+ (new KAction(i18n("&Server List..."), "server", KShortcut("F2"), this, SLOT(openServerList()),
+ actionCollection(), "open_server_list"))->setToolTip(i18n("Manage networks and servers"));
+ (new KAction(i18n("Quick &Connect..."), "connect_creating", KShortcut("F7"), this, SLOT(openQuickConnectDialog()),
+ actionCollection(), "quick_connect_dialog"))->setToolTip(i18n("Type in the address of a new IRC server to connect to"));
+
+ action = new KAction(i18n("&Reconnect"), "connect_creating", 0, m_viewContainer, SLOT(reconnectFrontServer()), actionCollection(), "reconnect_server");
+ action->setEnabled(false);
+ action->setToolTip(i18n("Reconnect to the current server."));
+
+ action = new KAction(i18n("&Disconnect"), "connect_no", 0, m_viewContainer, SLOT(disconnectFrontServer()), actionCollection(), "disconnect_server");
+ action->setEnabled(false);
+ action->setToolTip(i18n("Disconnect from the current server."));
+
+ (new KAction(i18n("&Identities..."), "identity", KShortcut("F8"), this, SLOT(openIdentitiesDialog()),
+ actionCollection(), "identities_dialog"))->setToolTip(i18n("Manage your nick, away and other identity settings"));
+
+ new KToggleAction(i18n("&Watched Nicks Online"), "kontact_contacts", KShortcut("F4"), m_viewContainer, SLOT(openNicksOnlinePanel()), actionCollection(), "open_nicksonline_window");
+ new KToggleAction(i18n("&DCC Status"), "2rightarrow", KShortcut("F9"), m_viewContainer, SLOT(toggleDccPanel()), actionCollection(), "open_dccstatus_window");
+ action = new KAction(i18n("&Open Logfile"), "history", KShortcut("Ctrl+O"), m_viewContainer, SLOT(openLogFile()), actionCollection(), "open_logfile");
+ action->setEnabled(false);
+ action->setToolTip(i18n("Open the known history for this channel in a new tab"));
+
+ action = new KAction(i18n("&Channel Settings..."), "edit", m_viewContainer, SLOT(openChannelSettings()), actionCollection(), "channel_settings");
+ action->setEnabled(false);
+ action->setToolTip(i18n("Open the channel settings dialog for this tab"));
+
+ KToggleAction* channelListAction = new KToggleAction(i18n("Channel &List"), "view_text", KShortcut("F5"), m_viewContainer, SLOT(openChannelList()), actionCollection(), "open_channel_list");
+ channelListAction->setEnabled(false);
+ channelListAction->setToolTip(i18n("Show a list of all the known channels on this server"));
+
+ action = new KToggleAction(i18n("&URL Catcher"), "enhanced_browsing", KShortcut("F6"), m_viewContainer, SLOT(addUrlCatcher()), actionCollection(), "open_url_catcher");
+ action->setToolTip(i18n("List all URLs that have been mentioned recently in a new tab"));
+
+ if (kapp->authorize("shell_access"))
+ {
+ action = new KAction(i18n("New &Konsole"), "openterm", 0, m_viewContainer, SLOT(addKonsolePanel()), actionCollection(), "open_konsole");
+ action->setToolTip(i18n("Open a terminal in a new tab"));
+ }
+
+ // Actions to navigate through the different pages
+ KShortcut nextShortcut = KStdAccel::tabNext();
+ nextShortcut.setSeq(1, KKeySequence("Alt+Right"));
+ KShortcut prevShortcut = KStdAccel::tabPrev();
+ prevShortcut.setSeq(1, KKeySequence("Alt+Left"));
+ action = new KAction(i18n("&Next Tab"), QApplication::reverseLayout() ? "previous" : "next",
+ QApplication::reverseLayout() ? prevShortcut : nextShortcut,
+ m_viewContainer, SLOT(showNextView()), actionCollection(), "next_tab");
+ action->setEnabled(false);
+ action = new KAction(i18n("&Previous Tab"), QApplication::reverseLayout() ? "next" : "previous",
+ QApplication::reverseLayout() ? nextShortcut : prevShortcut,
+ m_viewContainer, SLOT(showPreviousView()),actionCollection(),"previous_tab");
+ action->setEnabled(false);
+ action = new KAction(i18n("Close &Tab"),"tab_remove",KShortcut("Ctrl+w"), m_viewContainer, SLOT(closeCurrentView()),actionCollection(),"close_tab");
+ action->setEnabled(false);
+ action = new KAction(i18n("Next Active Tab"), 0, KShortcut("Ctrl+Alt+Space"), m_viewContainer, SLOT(showNextActiveView()),
+ actionCollection(), "next_active_tab");
+ action->setEnabled(false);
+
+ if (Preferences::tabPlacement()==Preferences::Left)
+ {
+ action = new KAction(i18n("Move Tab Up"), "1uparrow", KShortcut("Alt+Shift+Left"),
+ m_viewContainer, SLOT(moveViewLeft()), actionCollection(), "move_tab_left");
+ action->setEnabled(false);
+ action->setToolTip("Move this tab");
+ action = new KAction(i18n("Move Tab Down"), "1downarrow", KShortcut("Alt+Shift+Right"),
+ m_viewContainer, SLOT(moveViewRight()), actionCollection(), "move_tab_right");
+ action->setEnabled(false);
+ action->setToolTip("Move this tab");
+ }
+ else
+ {
+ KAction* action2;
+ if (QApplication::reverseLayout())
+ {
+ action2 = new KAction(i18n("Move Tab Right"), "1rightarrow", KShortcut("Alt+Shift+Right"),
+ m_viewContainer, SLOT(moveViewLeft()), actionCollection(), "move_tab_left");
+ action = new KAction(i18n("Move Tab Left"), "1leftarrow", KShortcut("Alt+Shift+Left"),
+ m_viewContainer, SLOT(moveViewRight()), actionCollection(), "move_tab_right");
+ }
+ else
+ {
+ action = new KAction(i18n("Move Tab Left"), "1leftarrow", KShortcut("Alt+Shift+Left"),
+ m_viewContainer, SLOT(moveViewLeft()), actionCollection(), "move_tab_left");
+ action2 = new KAction(i18n("Move Tab Right"), "1rightarrow", KShortcut("Alt+Shift+Right"),
+ m_viewContainer, SLOT(moveViewRight()), actionCollection(), "move_tab_right");
+ }
+
+ action->setEnabled(false);
+ action->setToolTip("Move this tab");
+ action2->setEnabled(false);
+ action2->setToolTip("Move this tab");
+ }
+
+ action = new KAction(i18n("Rejoin Channel"), 0, m_viewContainer, SLOT(rejoinChannel()), actionCollection(), "rejoin_channel");
+ action->setEnabled(false);
+
+ action = new KToggleAction(i18n("Enable Notifications"), 0, 0, m_viewContainer, SLOT(toggleViewNotifications()), actionCollection(), "tab_notifications");
+ action->setEnabled(false);
+
+ action = new KToggleAction(i18n("Join on Connect"), 0, 0, m_viewContainer, SLOT(toggleAutoJoin()), actionCollection(), "tab_autojoin");
+ action->setEnabled(false);
+
+ KSelectAction* selectAction = new KSelectAction(i18n("Set Encoding"), "charset", 0, actionCollection(), "tab_encoding");
+ selectAction->setEditable(false);
+ QStringList encodingDescs = Konversation::IRCCharsets::self()->availableEncodingDescriptiveNames();
+ encodingDescs.prepend(i18n("Default"));
+ selectAction->setItems(encodingDescs);
+ selectAction->setEnabled(false);
+ connect(selectAction, SIGNAL(activated(int)), m_viewContainer, SLOT(changeViewCharset(int)));
+
+ QSignalMapper* tabSelectionMapper = new QSignalMapper(this);
+ connect(tabSelectionMapper, SIGNAL(mapped(int)), m_viewContainer, SLOT(goToView(int)));
+
+ for (uint i = 1; i <= 10; ++i)
+ {
+ KAction* tabSelectionAction = new KAction(i18n("Go to Tab %1").arg(i), 0, KShortcut(QString("Alt+%1").arg(i%10)),
+ tabSelectionMapper, SLOT(map()), actionCollection(), QString("go_to_tab_%1").arg(i).local8Bit());
+ tabSelectionMapper->setMapping( tabSelectionAction, i-1);
+ }
+
+ action = new KAction(i18n("Clear &Marker Lines"), 0, KShortcut("CTRL+SHIFT+R"), m_viewContainer, SLOT(clearViewLines()),actionCollection(),"clear_lines");
+ action->setToolTip(i18n("Clear marker lines in the current tab"));
+ action->setEnabled(false);
+ action = new KAction(i18n("&Clear Window"), 0, KShortcut("Ctrl+L"), m_viewContainer, SLOT(clearView()),actionCollection(),"clear_window");
+ action->setToolTip(i18n("Clear the contents of the current tab"));
+ action->setEnabled(false);
+ action = new KAction(i18n("Clear &All Windows"),0,KShortcut("CTRL+SHIFT+L"), m_viewContainer, SLOT(clearAllViews()),actionCollection(),"clear_tabs");
+ action->setToolTip(i18n("Clear the contents of all open tabs"));
+ action->setEnabled(false);
+
+ KToggleAction* awayAction = new KToggleAction(i18n("Global Away"), KShortcut("Ctrl+Shift+A"), actionCollection(), "toggle_away");
+ connect(awayAction, SIGNAL(toggled(bool)), static_cast<KonversationApplication*>(kapp)->getAwayManager(), SLOT(toggleGlobalAway(bool)));
+ awayAction->setEnabled(false);
+
+ action = new KAction(i18n("&Join Channel..."), "add", KShortcut("Ctrl+J"), m_viewContainer, SLOT(showJoinChannelDialog()), actionCollection(), "join_channel");
+ action->setEnabled(false);
+ action->setToolTip("Join a new channel on this server");
+
+ action = KStdAction::find(m_viewContainer, SLOT(findText()), actionCollection());
+ action->setEnabled(false);
+ action = KStdAction::findNext(m_viewContainer, SLOT(findNextText()), actionCollection());
+ action->setEnabled(false);
+ action = KStdAction::findPrev(m_viewContainer, SLOT(findPrevText()), actionCollection());
+ action->setEnabled(false);
+
+ action = new KAction(i18n("&IRC Color..."), "colorize", CTRL+Key_K, m_viewContainer, SLOT(insertIRCColor()), actionCollection(), "irc_colors");
+ action->setToolTip(i18n("Set the color of your current IRC message"));
+ action->setEnabled(false);
+ action = new KAction(i18n("&Marker Line"), 0, KShortcut("Ctrl+R") , m_viewContainer, SLOT(insertMarkerLine()), actionCollection(), "insert_marker_line");
+ action->setToolTip(i18n("Insert a horizontal line into the current tab that only you can see"));
+ action->setEnabled(false);
+ action = new KAction(i18n("Special &Character..."), "char", KShortcut("Alt+Shift+C"), m_viewContainer, SLOT(insertCharacter()), actionCollection(), "insert_character");
+ action->setToolTip(i18n("Insert any character into your current IRC message"));
+ action->setEnabled(false);
+
+ action = new KAction(i18n("Close &All Open Queries"), 0, KShortcut("F11"), m_viewContainer, SLOT(closeQueries()), actionCollection(), "close_queries");
+ action->setEnabled(false);
+
+ KToggleAction* toggleChannelNickListsAction = new KToggleAction(i18n("Hide Nicklist"), 0,
+ KShortcut("Ctrl+H"), m_viewContainer, SLOT(toggleChannelNicklists()), actionCollection(), "hide_nicknamelist");
+ if (!Preferences::showNickList())
+ toggleChannelNickListsAction->setChecked(true);
+
+ // set up system tray
+ m_trayIcon = new Konversation::TrayIcon(this);
+ connect(this, SIGNAL(endNotification()), m_trayIcon, SLOT(endNotification()));
+ connect(KonversationApplication::instance(), SIGNAL(iconChanged(int)), m_trayIcon, SLOT(updateAppearance()));
+ connect(m_trayIcon, SIGNAL(quitSelected()), this, SLOT(quitProgram()));
+ KPopupMenu *trayMenu = m_trayIcon->contextMenu();
+ #ifdef USE_KNOTIFY
+ configureNotificationsAction->plug(trayMenu);
+ #endif
+ preferencesAction->plug(trayMenu);
+ awayAction->plug(trayMenu);
+
+ // decide whether to show the tray icon or not
+ updateTrayIcon();
+
+ createGUI(NULL, false);
+
+ resize(700, 500); // Give the app a sane default size
+ setAutoSaveSettings();
+
+ // Apply menubar show/hide pref
+ hideMenuBarAction->setChecked(Preferences::showMenuBar());
+ toggleMenubar(true);
+
+ // Bookmarks
+ m_bookmarkHandler = new KonviBookmarkHandler(this);
+
+ // set up KABC with a nice gui error dialog
+ KABC::GuiErrorHandler *m_guiErrorHandler = new KABC::GuiErrorHandler(this);
+ kapp->dcopClient()->setAcceptCalls( false );
+ Konversation::Addressbook::self()->getAddressBook()->setErrorHandler(m_guiErrorHandler);
+ kapp->dcopClient()->setAcceptCalls( true );
+
+ if (Preferences::useNotify() && Preferences::openWatchedNicksAtStartup())
+ m_viewContainer->openNicksOnlinePanel();
+
+}
+
+KonversationMainWindow::~KonversationMainWindow()
+{
+ delete m_viewContainer;
+}
+
+int KonversationMainWindow::confirmQuit()
+{
+ KonversationApplication* konvApp = static_cast<KonversationApplication*>(kapp);
+
+ if (konvApp->getConnectionManager()->connectionCount() == 0)
+ return KMessageBox::Continue;
+
+ int result = KMessageBox::Cancel;
+
+ if (!KMessageBox::shouldBeShownContinue("systemtrayquitKonversation")
+ && konvApp->getDccTransferManager()->hasActiveTransfers())
+ {
+ result = KMessageBox::warningContinueCancel(
+ this,
+ i18n("<qt>You have active DCC file transfers. Are you sure you want to quit <b>Konversation</b>?</qt>"),
+ i18n("Confirm Quit"),
+ i18n("Quit"),
+ "QuitWithActiveDccTransfers");
+ }
+ else
+ {
+ result = KMessageBox::warningContinueCancel(
+ this,
+ i18n("<qt>Are you sure you want to quit <b>Konversation</b>?</qt>"),
+ i18n("Confirm Quit"),
+ i18n("Quit"),
+ "systemtrayquitKonversation");
+ }
+
+ return result;
+}
+
+void KonversationMainWindow::quitProgram()
+{
+ if (Preferences::showTrayIcon() &&
+ sender() != m_trayIcon &&
+ confirmQuit() == KMessageBox::Cancel) return;
+
+ // will call queryClose()
+ m_closeApp = true;
+ close();
+}
+
+bool KonversationMainWindow::queryClose()
+{
+ KonversationApplication* konvApp = static_cast<KonversationApplication*>(kapp);
+
+ if (!konvApp->sessionSaving())
+ {
+ if (sender() == m_trayIcon)
+ m_closeApp = true;
+
+ if (Preferences::showTrayIcon() && !m_closeApp)
+ {
+ KMessageBox::information( this,
+ i18n("<p>Closing the main window will keep Konversation running in the system tray. "
+ "Use <b>Quit</b> from the <b>Konversation</b> menu to quit the application.</p>"),
+ i18n( "Docking in System Tray" ), "HideOnCloseInfo" );
+ hide();
+
+ return false;
+ }
+
+ if (!Preferences::showTrayIcon() && confirmQuit() == KMessageBox::Cancel)
+ return false;
+ }
+
+ return true;
+}
+
+void KonversationMainWindow::hideEvent(QHideEvent *e)
+{
+ emit triggerRememberLine();
+
+ m_statusBar->clearMainLabelTempText();
+
+ KMainWindow::hideEvent(e);
+}
+
+void KonversationMainWindow::showEvent(QShowEvent *e)
+{
+ emit cancelRememberLine();
+
+ KMainWindow::showEvent(e);
+}
+
+void KonversationMainWindow::leaveEvent(QEvent* e)
+{
+ m_statusBar->clearMainLabelTempText();
+
+ KMainWindow::leaveEvent(e);
+}
+
+bool KonversationMainWindow::event(QEvent* e)
+{
+ if (e->type() == QEvent::WindowActivate)
+ {
+ emit endNotification();
+ emit cancelRememberLine();
+ }
+ else if(e->type() == QEvent::WindowDeactivate)
+ {
+ m_statusBar->clearMainLabelTempText();
+
+ if (kapp->activeModalWidget() == 0)
+ emit triggerRememberLine();
+ }
+
+ return KMainWindow::event(e);
+}
+
+void KonversationMainWindow::settingsChangedSlot()
+{
+ // This is for compressing the events. m_hasDirtySettings is set to true
+ // when the settings have changed, then set to false when the app reacts to it
+ // via the appearanceChanged signal. This prevents a series of settingsChanged signals
+ // causing the app expensively rereading its settings many times.
+ // The appearanceChanged signal is connected to resetHasDirtySettings to reset this bool
+ if (!m_hasDirtySettings)
+ {
+ QTimer::singleShot(0, KonversationApplication::instance(), SIGNAL(appearanceChanged()));
+ m_hasDirtySettings = true;
+ }
+}
+
+void KonversationMainWindow::resetHasDirtySettings()
+{
+ m_hasDirtySettings = false;
+}
+
+void KonversationMainWindow::updateTrayIcon()
+{
+ m_trayIcon->setNotificationEnabled(Preferences::trayNotify());
+
+ if (Preferences::showTrayIcon())
+ m_trayIcon->show();
+ else
+ m_trayIcon->hide();
+}
+
+void KonversationMainWindow::toggleMenubar(bool dontShowWarning)
+{
+ if (hideMenuBarAction->isChecked())
+ menuBar()->show();
+ else
+ {
+ if (!dontShowWarning)
+ {
+ QString accel = hideMenuBarAction->shortcut().toString();
+ KMessageBox::information(this,
+ i18n("<qt>This will hide the menu bar completely. You can show it again by typing %1.</qt>").arg(accel),
+ "Hide menu bar","HideMenuBarWarning");
+ }
+ menuBar()->hide();
+ }
+
+ Preferences::setShowMenuBar(hideMenuBarAction->isChecked());
+}
+
+int KonversationMainWindow::configureToolbar()
+{
+ saveMainWindowSettings(KGlobal::config());
+ KEditToolbar dlg(actionCollection(), xmlFile(), true, this);
+ connect(&dlg, SIGNAL(newToolbarConfig()), SLOT(saveToolbarConfig()));
+ return dlg.exec();
+}
+
+void KonversationMainWindow::saveToolbarConfig()
+{
+ createGUI(xmlFile(), false);
+ applyMainWindowSettings(KGlobal::config());
+}
+
+void KonversationMainWindow::focusAndShowErrorMessage(const QString &errorMsg)
+{
+ show();
+ KWin::demandAttention(winId());
+ KWin::activateWindow(winId());
+ KMessageBox::error(this, errorMsg);
+}
+
+void KonversationMainWindow::openPrefsDialog()
+{
+ //An instance of your dialog could be already created and could be cached,
+ //in which case you want to display the cached dialog instead of creating
+ //another one
+ if (!m_settingsDialog)
+ {
+ m_settingsDialog = new KonviSettingsDialog(this);
+ //User edited the configuration - update your local copies of the
+ //configuration data
+ connect(m_settingsDialog, SIGNAL(settingsChanged()), this, SLOT(settingsChangedSlot()));
+ }
+ m_settingsDialog->show();
+}
+
+void KonversationMainWindow::openKeyBindings()
+{
+ // Change a number of action names to make them friendlier for the shortcut list.
+ actionCollection()->action("tab_notifications")->setText(i18n("Toggle Notifications"));
+ actionCollection()->action("toggle_away")->setText(i18n("Toggle Away Globally"));
+ actionCollection()->action("irc_colors")->setText(i18n("Insert &IRC Color..."));
+ actionCollection()->action("insert_character")->setText(i18n("Insert Special &Character..."));
+ actionCollection()->action("insert_marker_line")->setText(i18n("Insert &Marker Line"));
+ QString openChannelListString = actionCollection()->action("open_channel_list")->text();
+ actionCollection()->action("open_channel_list")->setText(i18n("&Channel List"));
+ QString openLogFileString = actionCollection()->action("open_logfile")->text();
+ actionCollection()->action("open_logfile")->setText(i18n("&Open Logfile"));
+
+ // Open shortcut configuration dialog.
+ KKeyDialog::configure(actionCollection());
+
+ // Reset action names.
+ actionCollection()->action("tab_notifications")->setText(i18n("Enable Notifications"));
+ actionCollection()->action("toggle_away")->setText(i18n("Set &Away Globally"));
+ actionCollection()->action("irc_colors")->setText(i18n("&IRC Color..."));
+ actionCollection()->action("insert_character")->setText(i18n("Special &Character..."));
+ actionCollection()->action("insert_marker_line")->setText(i18n("&Marker Line"));
+ actionCollection()->action("open_channel_list")->setText(openChannelListString);
+ actionCollection()->action("open_logfile")->setText(openLogFileString);
+}
+
+void KonversationMainWindow::openServerList()
+{
+ if (!m_serverListDialog)
+ {
+ m_serverListDialog = new Konversation::ServerListDialog(this);
+ KonversationApplication* konvApp = static_cast<KonversationApplication*>(kapp);
+
+ connect(m_serverListDialog, SIGNAL(serverGroupsChanged(const Konversation::ServerGroupSettings*)),
+ konvApp, SIGNAL(serverGroupsChanged(const Konversation::ServerGroupSettings*)));
+ connect(konvApp, SIGNAL(serverGroupsChanged(const Konversation::ServerGroupSettings*)),
+ m_serverListDialog, SLOT(updateServerList()));
+ connect(m_serverListDialog, SIGNAL(connectTo(Konversation::ConnectionFlag, int)),
+ konvApp->getConnectionManager(), SLOT(connectTo(Konversation::ConnectionFlag, int)));
+ connect(m_serverListDialog, SIGNAL(connectTo(Konversation::ConnectionFlag, ConnectionSettings&)),
+ konvApp->getConnectionManager(), SLOT(connectTo(Konversation::ConnectionFlag, ConnectionSettings&)));
+ connect(konvApp->getConnectionManager(), SIGNAL(closeServerList()), m_serverListDialog, SLOT(slotClose()));
+ }
+
+ m_serverListDialog->show();
+}
+
+void KonversationMainWindow::openQuickConnectDialog()
+{
+ emit showQuickConnectDialog();
+}
+
+// open the preferences dialog and show the watched nicknames page
+void KonversationMainWindow::openNotify()
+{
+ openPrefsDialog();
+ if (m_settingsDialog) m_settingsDialog->openWatchedNicknamesPage();
+}
+
+void KonversationMainWindow::openIdentitiesDialog()
+{
+ Konversation::IdentityDialog dlg(this);
+
+ if (dlg.exec() == KDialog::Accepted)
+ {
+ if (m_serverListDialog)
+ m_serverListDialog->updateServerList();
+ m_viewContainer->updateViewEncoding(m_viewContainer->getFrontView());
+ }
+}
+
+IdentityPtr KonversationMainWindow::editIdentity(IdentityPtr identity)
+{
+ IdentityPtr newIdentity;
+
+ Konversation::IdentityDialog dlg(this);
+ newIdentity = dlg.setCurrentIdentity(identity);
+
+ if ((dlg.exec() == KDialog::Accepted) && m_serverListDialog)
+ {
+ m_serverListDialog->updateServerList();
+ return newIdentity;
+ }
+ else
+ return 0;
+}
+
+void KonversationMainWindow::openNotifications()
+{
+ #ifdef USE_KNOTIFY
+ (void) KNotifyDialog::configure(this);
+ #endif
+}
+
+void KonversationMainWindow::notifyAction(const QString& serverName, const QString& nick)
+{
+ KonversationApplication* konvApp = static_cast<KonversationApplication*>(kapp);
+ Server* server = konvApp->getConnectionManager()->getServerByName(serverName);
+ if (server) server->notifyAction(nick);
+}
+
+// TODO: Let an own class handle notify things
+void KonversationMainWindow::setOnlineList(Server* notifyServer,const QStringList& /*list*/, bool /*changed*/)
+{
+ emit nicksNowOnline(notifyServer);
+ // FIXME if (changed && nicksOnlinePanel) newText(nicksOnlinePanel, QString::null, true);
+}
+
+QString KonversationMainWindow::currentURL(bool passNetwork)
+{
+ return m_viewContainer->currentViewURL(passNetwork);
+}
+
+QString KonversationMainWindow::currentTitle()
+{
+ return m_viewContainer->currentViewTitle();
+}
+
+#include "konversationmainwindow.moc"