add context to string
[rekonq:nikhilms-mainline.git] / src / mainwindow.cpp
1 /* ============================================================
2 *
3 * This file is a part of the rekonq project
4 *
5 * Copyright (C) 2008-2010 by Andrea Diamantini <adjam7 at gmail dot com>
6 * Copyright (C) 2009 by Paweł Prażak <pawelprazak at gmail dot com>
7 * Copyright (C) 2009-2010 by Lionel Chauvin <megabigbug@yahoo.fr>
8 * Copyright (C) 2010 by Matthieu Gicquel <matgic78 at gmail dot com>
9 *
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of
14 * the License or (at your option) version 3 or any later version
15 * accepted by the membership of KDE e.V. (or its successor approved
16 * by the membership of KDE e.V.), which shall act as a proxy
17 * defined in Section 14 of version 3 of the license.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
26 *
27 * ============================================================ */
28
29
30 // Self Includes
31 #include "mainwindow.h"
32 #include "mainwindow.moc"
33
34 // Auto Includes
35 #include "rekonq.h"
36
37 // Local Includes
38 #include "analyzerpanel.h"
39 #include "application.h"
40 #include "bookmarkprovider.h"
41 #include "bookmarkspanel.h"
42 #include "bookmarkstoolbar.h"
43 #include "findbar.h"
44 #include "historypanel.h"
45 #include "iconmanager.h"
46 #include "mainview.h"
47 #include "settingsdialog.h"
48 #include "stackedurlbar.h"
49 #include "tabbar.h"
50 #include "urlbar.h"
51 #include "webinspectorpanel.h"
52 #include "webpage.h"
53 #include "webtab.h"
54 #include "zoombar.h"
55
56 // Ui Includes
57 #include "ui_cleardata.h"
58
59 // KDE Includes
60 #include <KIO/Job>
61
62 #include <KAction>
63 #include <KEditToolBar>
64 #include <KFileDialog>
65 #include <KJobUiDelegate>
66 #include <KMenu>
67 #include <KMenuBar>
68 #include <KMessageBox>
69 #include <KPassivePopup>
70 #include <KProcess>
71 #include <KPushButton>
72 #include <KStandardDirs>
73 #include <KToggleFullScreenAction>
74
75 // Qt Includes
76 #include <QtCore/QTimer>
77
78 #include <QtDBus/QDBusInterface>
79 #include <QtDBus/QDBusReply>
80
81 #include <QtGui/QDesktopWidget>
82 #include <QtGui/QLabel>
83 #include <QtGui/QPrintDialog>
84 #include <QtGui/QPrinter>
85 #include <QtGui/QPrintPreviewDialog>
86 #include <QtGui/QVBoxLayout>
87
88 #include <QtWebKit/QWebHistory>
89
90
91 MainWindow::MainWindow()
92         : KXmlGuiWindow()
93         , m_view(new MainView(this))
94         , m_findBar(new FindBar(this))
95         , m_zoomBar(new ZoomBar(this))
96         , m_historyPanel(0)
97         , m_bookmarksPanel(0)
98         , m_webInspectorPanel(0)
99         , m_analyzerPanel(0)
100         , m_historyBackMenu(0)
101         , m_encodingMenu(new KMenu(this))
102         , m_bookmarksBar(0)
103         , m_popup(new KPassivePopup(this))
104         , m_hidePopup(new QTimer(this))
105         , m_toolsMenu(0)
106 {
107     // creating a centralWidget containing panel, m_view and the hidden findbar
108     QWidget *centralWidget = new QWidget;
109     centralWidget->setContentsMargins(0, 0, 0, 0);
110
111     // setting layout
112     QVBoxLayout *layout = new QVBoxLayout;
113     layout->setContentsMargins(0, 0, 0, 0);
114     layout->addWidget(m_view);
115     layout->addWidget(m_findBar);
116     layout->addWidget(m_zoomBar);
117     centralWidget->setLayout(layout);
118
119     // central widget
120     setCentralWidget(centralWidget);
121
122     // setting size policies
123     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
124
125     // then, setup our actions
126     setupActions();
127
128     // setting Panels
129     setupPanels();
130
131     // setting up rekonq tools
132     setupTools();
133
134     // setting up rekonq toolbar(s)
135     setupToolbars();
136
137     // a call to KXmlGuiWindow::setupGUI() populates the GUI
138     // with actions, using KXMLGUI.
139     // It also applies the saved mainwindow settings, if any, and ask the
140     // mainwindow to automatically save settings if changed: window size,
141     // toolbar position, icon size, etc.
142     setupGUI();
143
144     // no menu bar in rekonq: we have other plans..
145     menuBar()->setVisible(false);
146
147     // no more status bar..
148     setStatusBar(0);
149
150     // give me some time to do all the other stuffs...
151     QTimer::singleShot(100, this, SLOT(postLaunch()));
152
153     kDebug() << "MainWindow ctor...DONE";
154 }
155
156
157 MainWindow::~MainWindow()
158 {
159     Application::bookmarkProvider()->removeBookmarkBar(m_bookmarksBar);
160     Application::bookmarkProvider()->removeBookmarkPanel(m_bookmarksPanel);
161     Application::instance()->removeMainWindow(this);
162
163     delete m_view;
164     delete m_findBar;
165     delete m_zoomBar;
166
167     delete m_historyPanel;
168     delete m_bookmarksPanel;
169     delete m_webInspectorPanel;
170
171     delete m_stopReloadAction;
172     delete m_historyBackMenu;
173     delete m_encodingMenu;
174
175     delete m_bookmarksBar;
176
177     delete m_popup;
178     delete m_hidePopup;
179 }
180
181
182 void MainWindow::setupToolbars()
183 {
184     kDebug() << "setup toolbars...";
185
186     KAction *a;
187
188     // location bar
189     a = new KAction(i18n("Location Bar"), this);
190     a->setDefaultWidget(m_view->widgetBar());
191     actionCollection()->addAction( QL1S("url_bar"), a);
192
193     KToolBar *mainBar = toolBar("mainToolBar");
194
195     mainBar->show();  // this just to fix reopening rekonq after fullscreen close
196 }
197
198
199 void MainWindow::initBookmarkBar()
200 {
201     KToolBar *XMLGUIBkBar = toolBar("bookmarkToolBar");
202     if (!XMLGUIBkBar)
203         return;
204
205     if (m_bookmarksBar)
206     {
207         Application::bookmarkProvider()->removeBookmarkBar(m_bookmarksBar);
208         delete m_bookmarksBar;
209     }
210     m_bookmarksBar = new BookmarkToolBar(XMLGUIBkBar, this);
211     Application::bookmarkProvider()->registerBookmarkBar(m_bookmarksBar);
212
213     // To update the bookmark toolbar action
214     initToolsMenu();
215 }
216
217
218 void MainWindow::configureToolbars()
219 {
220     if (autoSaveSettings())
221         saveAutoSaveSettings();
222
223     KEditToolBar dlg(factory(), this);
224     // The bookmark bar needs to be refill after the UI changes are finished
225     connect(&dlg, SIGNAL(newToolBarConfig()), this, SLOT(initBookmarkBar()));
226     dlg.exec();
227 }
228
229
230 void MainWindow::initToolsMenu()
231 {
232     if (!m_toolsMenu)
233         return;
234
235     m_toolsMenu->menu()->clear();
236
237     m_toolsMenu->addAction(actionByName(KStandardAction::name(KStandardAction::Open)));
238     m_toolsMenu->addAction(actionByName(KStandardAction::name(KStandardAction::SaveAs)));
239     m_toolsMenu->addAction(actionByName(KStandardAction::name(KStandardAction::Print)));
240     m_toolsMenu->addAction(actionByName(KStandardAction::name(KStandardAction::Find)));
241
242     QAction *action = actionByName(KStandardAction::name(KStandardAction::Zoom));
243     action->setCheckable(true);
244     connect (m_zoomBar, SIGNAL(visibilityChanged(bool)), action, SLOT(setChecked(bool)));
245     m_toolsMenu->addAction(action);
246
247     m_toolsMenu->addAction(actionByName(QL1S("encodings")));
248
249     m_toolsMenu->addSeparator();
250
251     m_toolsMenu->addAction(actionByName(QL1S("private_browsing")));
252     m_toolsMenu->addAction(actionByName(QL1S("clear_private_data")));
253
254     m_toolsMenu->addSeparator();
255
256     KActionMenu *webMenu = new KActionMenu(KIcon("applications-development-web"), i18n("Development"), this);
257     webMenu->addAction(actionByName(QL1S("web_inspector")));
258     webMenu->addAction(actionByName(QL1S("page_source")));
259     webMenu->addAction(actionByName(QL1S("net_analyzer")));
260     m_toolsMenu->addAction(webMenu);
261
262     m_toolsMenu->addSeparator();
263
264     action = m_bookmarksBar->toolBar()->toggleViewAction();
265     action->setText(i18n("Bookmarks Toolbar"));
266     action->setIcon(KIcon("bookmarks-bar"));
267     m_toolsMenu->addAction(action);
268
269     m_toolsMenu->addAction(actionByName(QL1S("show_history_panel")));
270     m_toolsMenu->addAction(actionByName(QL1S("show_bookmarks_panel")));
271     m_toolsMenu->addAction(actionByName(KStandardAction::name(KStandardAction::FullScreen)));
272
273     m_toolsMenu->addSeparator();
274
275     this->setHelpMenuEnabled(true);
276     helpMenu()->setIcon(KIcon("help-browser"));
277     m_toolsMenu->addAction(helpMenu()->menuAction());
278     m_toolsMenu->addAction(actionByName(KStandardAction::name(KStandardAction::Preferences)));
279 }
280
281
282 void MainWindow::postLaunch()
283 {
284     setupBookmarksAndToolsShortcuts();
285
286     // setting popup notification
287     m_popup->setAutoDelete(false);
288     connect(Application::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), m_popup, SLOT(hide()));
289     m_popup->setFrameShape(QFrame::NoFrame);
290     m_popup->setLineWidth(0);
291     connect(m_hidePopup, SIGNAL(timeout()), m_popup, SLOT(hide()));
292
293     // notification system
294     connect(m_view, SIGNAL(showStatusBarMessage(const QString&, Rekonq::Notify)), this, SLOT(notifyMessage(const QString&, Rekonq::Notify)));
295     connect(m_view, SIGNAL(linkHovered(const QString&)), this, SLOT(notifyMessage(const QString&)));
296
297     // --------- connect signals and slots
298     connect(m_view, SIGNAL(currentTitle(const QString &)), this, SLOT(updateWindowTitle(const QString &)));
299     connect(m_view, SIGNAL(printRequested(QWebFrame *)), this, SLOT(printRequested(QWebFrame *)));
300
301     // (shift +) ctrl + tab switching
302     connect(this, SIGNAL(ctrlTabPressed()), m_view, SLOT(nextTab()));
303     connect(this, SIGNAL(shiftCtrlTabPressed()), m_view, SLOT(previousTab()));
304
305     // update toolbar actions signals
306     connect(m_view, SIGNAL(tabsChanged()), this, SLOT(updateActions()));
307     connect(m_view, SIGNAL(currentChanged(int)), this, SLOT(updateActions()));
308
309     // launch it manually. Just the first time...
310     updateActions();
311
312     // Find Bar signal
313     connect(m_findBar, SIGNAL(searchString(const QString &)), this, SLOT(find(const QString &)));
314
315     // Zoom Bar signal
316     connect(m_view, SIGNAL(currentChanged(int)), m_zoomBar, SLOT(updateSlider(int)));
317     // Ctrl + wheel handling
318     connect(this->currentTab()->view(), SIGNAL(zoomChanged(int)), m_zoomBar, SLOT(setValue(int)));
319
320     // setting up toolbars to NOT have context menu enabled
321     setContextMenuPolicy(Qt::DefaultContextMenu);
322
323     // accept d'n'd
324     setAcceptDrops(true);
325
326     // Bookmark ToolBar (needs to be setup after the call to setupGUI())
327     initBookmarkBar();
328 }
329
330
331 QSize MainWindow::sizeHint() const
332 {
333     QRect desktopRect = QApplication::desktop()->screenGeometry();
334     QSize size = desktopRect.size() * 0.8;
335     return size;
336 }
337
338
339 void MainWindow::setupActions()
340 {
341     kDebug() << "setup actions...";
342
343     // this let shortcuts work..
344     actionCollection()->addAssociatedWidget(this);
345
346     KAction *a;
347
348     // new window action
349     a = new KAction(KIcon("window-new"), i18n("&New Window"), this);
350     a->setShortcut(KShortcut(Qt::CTRL | Qt::Key_N));
351     actionCollection()->addAction(QL1S("new_window"), a);
352     connect(a, SIGNAL(triggered(bool)), Application::instance(), SLOT(newWindow()));
353
354     // Standard Actions
355     KStandardAction::open(this, SLOT(fileOpen()), actionCollection());
356     KStandardAction::saveAs(this, SLOT(fileSaveAs()), actionCollection());
357     KStandardAction::print(this, SLOT(printRequested()), actionCollection());
358     KStandardAction::quit(this , SLOT(close()), actionCollection());
359
360     a = KStandardAction::find(m_findBar, SLOT(show()), actionCollection());
361     KShortcut findShortcut = KStandardShortcut::find();
362     findShortcut.setAlternate(Qt::Key_Slash);
363     a->setShortcut(findShortcut);
364
365     KStandardAction::findNext(this, SLOT(findNext()) , actionCollection());
366     KStandardAction::findPrev(this, SLOT(findPrevious()) , actionCollection());
367
368     a = KStandardAction::fullScreen(this, SLOT(viewFullScreen(bool)), this, actionCollection());
369     KShortcut fullScreenShortcut = KStandardShortcut::fullScreen();
370     fullScreenShortcut.setAlternate(Qt::Key_F11);
371     a->setShortcut(fullScreenShortcut);
372
373     a = actionCollection()->addAction(KStandardAction::Home);
374     connect(a, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)), this, SLOT(homePage(Qt::MouseButtons, Qt::KeyboardModifiers)));
375     KStandardAction::preferences(this, SLOT(preferences()), actionCollection());
376
377     a = KStandardAction::redisplay(m_view, SLOT(webReload()), actionCollection());
378     a->setText(i18n("Reload"));
379     KShortcut reloadShortcut = KStandardShortcut::reload();
380     reloadShortcut.setAlternate(Qt::CTRL + Qt::Key_R);
381     a->setShortcut(reloadShortcut);
382
383     a = new KAction(KIcon("process-stop"), i18n("&Stop"), this);
384     a->setShortcut(KShortcut(Qt::CTRL | Qt::Key_Period));
385     actionCollection()->addAction(QL1S("stop"), a);
386     connect(a, SIGNAL(triggered(bool)), m_view, SLOT(webStop()));
387
388     // stop reload Action
389     m_stopReloadAction = new KAction(this);
390     actionCollection()->addAction(QL1S("stop_reload") , m_stopReloadAction);
391     m_stopReloadAction->setShortcutConfigurable(false);
392     connect(m_view, SIGNAL(browserTabLoading(bool)), this, SLOT(browserLoading(bool)));
393     browserLoading(false); //first init for blank start page
394
395     a = new KAction(i18n("Open Location"), this);
396     KShortcut openLocationShortcut(Qt::CTRL + Qt::Key_L);
397     openLocationShortcut.setAlternate(Qt::Key_F6);
398     a->setShortcut(openLocationShortcut);
399     actionCollection()->addAction(QL1S("open_location"), a);
400     connect(a, SIGNAL(triggered(bool)) , this, SLOT(openLocation()));
401
402     // set zoom bar actions
403     m_zoomBar->setupActions(this);
404
405     // =============================== Tools Actions =================================
406     a = new KAction(i18n("Page S&ource"), this);
407     a->setIcon(KIcon("application-xhtml+xml"));
408     actionCollection()->addAction(QL1S("page_source"), a);
409     connect(a, SIGNAL(triggered(bool)), this, SLOT(viewPageSource()));
410
411     a = Application::instance()->privateBrowsingAction();
412     actionCollection()->addAction(QL1S("private_browsing"), a);
413     
414     a = new KAction(KIcon("edit-clear"), i18n("Clear Private Data..."), this);
415     actionCollection()->addAction(QL1S("clear_private_data"), a);
416     connect(a, SIGNAL(triggered(bool)), this, SLOT(clearPrivateData()));
417
418     // ========================= History related actions ==============================
419     a = actionCollection()->addAction(KStandardAction::Back);
420     connect(a, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)), this, SLOT(openPrevious(Qt::MouseButtons, Qt::KeyboardModifiers)));
421
422     m_historyBackMenu = new KMenu(this);
423     a->setMenu(m_historyBackMenu);
424     connect(m_historyBackMenu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowBackMenu()));
425     connect(m_historyBackMenu, SIGNAL(triggered(QAction *)), this, SLOT(openActionUrl(QAction *)));
426
427     a = actionCollection()->addAction(KStandardAction::Forward);
428     connect(a, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)), this, SLOT(openNext(Qt::MouseButtons, Qt::KeyboardModifiers)));
429
430     // ============================== General Tab Actions ====================================
431     a = new KAction(KIcon("tab-new"), i18n("New &Tab"), this);
432     a->setShortcut(KShortcut(Qt::CTRL + Qt::Key_T));
433     actionCollection()->addAction(QL1S("new_tab"), a);
434     connect(a, SIGNAL(triggered(bool)), m_view, SLOT(newTab()));
435
436     a = new KAction(KIcon("view-refresh"), i18n("Reload All Tabs"), this);
437     actionCollection()->addAction(QL1S("reload_all_tabs"), a);
438     connect(a, SIGNAL(triggered(bool)), m_view, SLOT(reloadAllTabs()));
439
440     a = new KAction(i18n("Show Next Tab"), this);
441     a->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabPrev() : KStandardShortcut::tabNext());
442     actionCollection()->addAction(QL1S("show_next_tab"), a);
443     connect(a, SIGNAL(triggered(bool)), m_view, SLOT(nextTab()));
444
445     a = new KAction(i18n("Show Previous Tab"), this);
446     a->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabNext() : KStandardShortcut::tabPrev());
447     actionCollection()->addAction(QL1S("show_prev_tab"), a);
448     connect(a, SIGNAL(triggered(bool)), m_view, SLOT(previousTab()));
449
450     a = new KAction(KIcon("tab-new"), i18n("Open Last Closed Tab"), this);
451     a->setShortcut(KShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T));
452     actionCollection()->addAction(QL1S("open_last_closed_tab"), a);
453     connect(a, SIGNAL(triggered(bool)), m_view, SLOT(openLastClosedTab()));
454
455     // Closed Tabs Menu
456     KActionMenu *closedTabsMenu = new KActionMenu(KIcon("tab-new"), i18n("Closed Tabs"), this);
457     closedTabsMenu->setDelayed(false);
458     actionCollection()->addAction(QL1S("closed_tab_menu"), closedTabsMenu);
459
460     // shortcuts for quickly switching to a tab
461     for( int i = 1; i <= 9; i++ ) {
462         a = new KAction(i18n("Switch to Tab %1", i), this);
463         a->setShortcut(KShortcut( QString("Alt+%1").arg(i) ));
464         a->setData( QVariant(i) );
465         actionCollection()->addAction(QL1S(("switch_tab_" + QString::number(i)).toAscii()), a);
466         connect(a, SIGNAL(triggered(bool)), m_view, SLOT(switchToTab()));
467     }
468
469     // ============================== Indexed Tab Actions ====================================
470     a = new KAction(KIcon("tab-close"), i18n("&Close Tab"), this);
471     a->setShortcuts( KStandardShortcut::close() );
472     actionCollection()->addAction(QL1S("close_tab"), a);
473     connect(a, SIGNAL(triggered(bool)), m_view->tabBar(), SLOT(closeTab()));
474
475     a = new KAction(KIcon("tab-duplicate"), i18n("Clone Tab"), this);
476     actionCollection()->addAction(QL1S("clone_tab"), a);
477     connect(a, SIGNAL(triggered(bool)), m_view->tabBar(), SLOT(cloneTab()));
478
479     a = new KAction(KIcon("tab-close-other"), i18n("Close &Other Tabs"), this);
480     actionCollection()->addAction(QL1S("close_other_tabs"), a);
481     connect(a, SIGNAL(triggered(bool)), m_view->tabBar(), SLOT(closeOtherTabs()));
482
483     a = new KAction(KIcon("view-refresh"), i18n("Reload Tab"), this);
484     actionCollection()->addAction(QL1S("reload_tab"), a);
485     connect(a, SIGNAL(triggered(bool)), m_view->tabBar(), SLOT(reloadTab()));
486
487     a = new KAction(KIcon("tab-detach"), i18n("Detach Tab"), this);
488     actionCollection()->addAction(QL1S("detach_tab"), a);
489     connect(a, SIGNAL(triggered(bool)), m_view->tabBar(), SLOT(detachTab()));
490
491     // Bookmark Menu
492     KActionMenu *bmMenu = Application::bookmarkProvider()->bookmarkActionMenu(this);
493     bmMenu->setIcon(KIcon("bookmarks"));
494     bmMenu->setDelayed(false);
495     bmMenu->setShortcutConfigurable(true);
496     bmMenu->setShortcut( KShortcut(Qt::ALT + Qt::Key_B) );
497     actionCollection()->addAction(QL1S("bookmarksActionMenu"), bmMenu);
498
499     // ---------------- Encodings -----------------------------------
500     a = new KAction(KIcon("character-set"), i18n("Set Encoding"), this);
501     actionCollection()->addAction(QL1S("encodings"), a);
502     a->setMenu(m_encodingMenu);
503     connect(m_encodingMenu, SIGNAL(aboutToShow()), this, SLOT(populateEncodingMenu()));
504     connect(m_encodingMenu, SIGNAL(triggered(QAction *)), this, SLOT(setEncoding(QAction *)));
505 }
506
507
508 void MainWindow::setupTools()
509 {
510     kDebug() << "setup tools...";
511     m_toolsMenu = new KActionMenu(KIcon("configure"), i18n("&Tools"), this);
512     m_toolsMenu->setDelayed(false);
513     m_toolsMenu->setShortcutConfigurable(true);
514     m_toolsMenu->setShortcut( KShortcut(Qt::ALT + Qt::Key_T) );
515
516     // adding rekonq_tools to rekonq actionCollection
517     actionCollection()->addAction(QL1S("rekonq_tools"), m_toolsMenu);
518
519     // Actions are added after the call to setupGUI() to ensure the help menu works
520 }
521
522
523 void MainWindow::setupPanels()
524 {
525     kDebug() << "setup panels...";
526     KAction* a;
527
528     // STEP 1
529     // Setup history panel
530     m_historyPanel = new HistoryPanel(i18n("History Panel"), this);
531     connect(m_historyPanel, SIGNAL(openUrl(const KUrl&, const Rekonq::OpenType &)), Application::instance(), SLOT(loadUrl(const KUrl&, const Rekonq::OpenType &)));
532     connect(m_historyPanel, SIGNAL(itemHovered(QString)), this, SLOT(notifyMessage(QString)));
533     connect(m_historyPanel, SIGNAL(destroyed()), Application::instance(), SLOT(saveConfiguration()));
534
535     addDockWidget(Qt::LeftDockWidgetArea, m_historyPanel);
536
537     // setup history panel action
538     a = (KAction *) m_historyPanel->toggleViewAction();
539     a->setShortcut(KShortcut(Qt::CTRL + Qt::Key_H));
540     a->setIcon(KIcon("view-history"));
541     actionCollection()->addAction(QL1S("show_history_panel"), a);
542
543     // STEP 2
544     // Setup bookmarks panel
545     m_bookmarksPanel = new BookmarksPanel(i18n("Bookmarks Panel"), this);
546     connect(m_bookmarksPanel, SIGNAL(openUrl(const KUrl&, const Rekonq::OpenType &)), Application::instance(), SLOT(loadUrl(const KUrl&, const Rekonq::OpenType &)));
547     connect(m_bookmarksPanel, SIGNAL(itemHovered(QString)), this, SLOT(notifyMessage(QString)));
548     connect(m_bookmarksPanel, SIGNAL(destroyed()), Application::instance(), SLOT(saveConfiguration()));
549
550     addDockWidget(Qt::LeftDockWidgetArea, m_bookmarksPanel);
551
552     Application::bookmarkProvider()->registerBookmarkPanel(m_bookmarksPanel);
553
554     // setup bookmarks panel action
555     a = (KAction *) m_bookmarksPanel->toggleViewAction();
556     a->setShortcut(KShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_B));
557     a->setIcon(KIcon("bookmarks-organize"));
558     actionCollection()->addAction(QL1S("show_bookmarks_panel"), a);
559
560     // STEP 3
561     // Setup webinspector panel
562     m_webInspectorPanel = new WebInspectorPanel(i18n("Web Inspector"), this);
563     connect(mainView(), SIGNAL(currentChanged(int)), m_webInspectorPanel, SLOT(changeCurrentPage()));
564
565     a = new KAction(KIcon("tools-report-bug"), i18n("Web &Inspector"), this);
566     a->setCheckable(true);
567     actionCollection()->addAction(QL1S("web_inspector"), a);
568     connect(a, SIGNAL(triggered(bool)), m_webInspectorPanel, SLOT(toggle(bool)));
569
570     addDockWidget(Qt::BottomDockWidgetArea, m_webInspectorPanel);
571     m_webInspectorPanel->hide();
572
573     // STEP 4
574     // Setup Network analyzer panel
575     m_analyzerPanel = new NetworkAnalyzerPanel( i18n("Network Analyzer"), this);
576     connect(mainView(), SIGNAL(currentChanged(int)), m_analyzerPanel, SLOT(changeCurrentPage()));
577
578     a = new KAction(KIcon("document-edit-decrypt-verify"), i18n("Network Analyzer"), this);
579     a->setCheckable(true);
580     actionCollection()->addAction(QL1S("net_analyzer"), a);
581     connect(a, SIGNAL(triggered(bool)), this, SLOT(enableNetworkAnalysis(bool)));
582
583     addDockWidget(Qt::BottomDockWidgetArea, m_analyzerPanel);
584     m_analyzerPanel->hide();
585 }
586
587
588 void MainWindow::openLocation()
589 {
590     if(isFullScreen())
591     {
592         setWidgetsVisible(true);
593     }
594     m_view->urlBar()->selectAll();
595     m_view->urlBar()->setFocus();
596 }
597
598
599 void MainWindow::fileSaveAs()
600 {
601     KUrl srcUrl;
602     WebTab *w = currentTab();
603     if (w->page()->isOnRekonqPage())
604     {
605         QWebElement el = w->page()->mainFrame()->documentElement();
606         srcUrl = KUrl( el.findFirst("object").attribute("data") );
607     }
608     else
609     {
610         srcUrl = w->url();
611     }
612     kDebug() << "URL to save: " << srcUrl;
613
614     QString name = srcUrl.fileName();
615     if (name.isNull())
616     {
617         name = srcUrl.host() + QString(".html");
618     }
619     const QString destUrl = KFileDialog::getSaveFileName(name, QString(), this);
620     if (destUrl.isEmpty()) return;
621     KIO::Job *job = KIO::file_copy(srcUrl, KUrl(destUrl), -1, KIO::Overwrite);
622     job->addMetaData("MaxCacheSize", "0");  // Don't store in http cache.
623     job->addMetaData("cache", "cache");     // Use entry from cache if available.
624     job->uiDelegate()->setAutoErrorHandlingEnabled(true);
625 }
626
627
628 void MainWindow::preferences()
629 {
630     // an instance the dialog could be already created and could be cached,
631     // in which case you want to display the cached dialog
632     if (SettingsDialog::showDialog("rekonfig"))
633         return;
634
635     // we didn't find an instance of this dialog, so lets create it
636     QPointer<SettingsDialog> s = new SettingsDialog(this);
637
638     // keep us informed when the user changes settings
639     connect(s, SIGNAL(settingsChanged(const QString&)), Application::instance(), SLOT(updateConfiguration()));
640
641     s->exec();
642     delete s;
643 }
644
645
646 void MainWindow::updateActions()
647 {
648     kDebug() << "updating actions..";
649     bool rekonqPage = currentTab()->page()->isOnRekonqPage();
650
651     QAction *historyBackAction = actionByName(KStandardAction::name(KStandardAction::Back));
652     if( rekonqPage && currentTab()->view()->history()->count() > 0 )
653         historyBackAction->setEnabled(true);
654     else
655         historyBackAction->setEnabled(currentTab()->view()->history()->canGoBack());
656
657     QAction *historyForwardAction = actionByName(KStandardAction::name(KStandardAction::Forward));
658     historyForwardAction->setEnabled(currentTab()->view()->history()->canGoForward());
659 }
660
661
662 void MainWindow::updateWindowTitle(const QString &title)
663 {
664     QWebSettings *settings = QWebSettings::globalSettings();
665     if (title.isEmpty())
666     {
667         if (settings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
668         {
669             setWindowTitle(i18nc("Window title when private browsing is activated", "rekonq (Private Browsing)"));
670         }
671         else
672         {
673             setWindowTitle("rekonq");
674         }
675     }
676     else
677     {
678         if (settings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
679         {
680             setWindowTitle(i18nc("window title, %1 = title of the active website", "%1 – rekonq (Private Browsing)", title));
681         }
682         else
683         {
684             setWindowTitle(i18nc("window title, %1 = title of the active website", "%1 – rekonq", title));
685         }
686     }
687 }
688
689
690 void MainWindow::fileOpen()
691 {
692     QString filePath = KFileDialog::getOpenFileName(KUrl(),
693                        i18n("*.html *.htm *.svg *.png *.gif *.svgz|Web Resources (*.html *.htm *.svg *.png *.gif *.svgz)\n"
694                             "*.*|All files (*.*)"),
695                        this,
696                        i18n("Open Web Resource"));
697
698     if (filePath.isEmpty())
699         return;
700
701     Application::instance()->loadUrl(filePath);
702 }
703
704
705 void MainWindow::printRequested(QWebFrame *frame)
706 {
707     if (!currentTab())
708         return;
709
710     QWebFrame *printFrame = 0;
711     if (frame == 0)
712     {
713         printFrame = currentTab()->page()->mainFrame();
714     }
715     else
716     {
717         printFrame = frame;
718     }
719
720     QPrinter printer;
721     QPrintPreviewDialog previewdlg(&printer, this);
722
723     connect(&previewdlg, SIGNAL(paintRequested(QPrinter *)), printFrame, SLOT(print(QPrinter *)));
724
725     previewdlg.exec();
726 }
727
728
729 void MainWindow::find(const QString & search)
730 {
731     if (!currentTab())
732         return;
733     m_lastSearch = search;
734
735     updateHighlight();
736     findNext();
737 }
738
739
740 void MainWindow::matchCaseUpdate()
741 {
742     if (!currentTab())
743         return;
744
745     currentTab()->view()->findText(m_lastSearch, QWebPage::FindBackward);
746     findNext();
747     updateHighlight();
748 }
749
750
751 void MainWindow::findNext()
752 {
753     if (!currentTab())
754         return;
755
756     if (m_findBar->isHidden())
757     {
758         QPoint previous_position = currentTab()->view()->page()->currentFrame()->scrollPosition();
759         currentTab()->view()->page()->focusNextPrevChild(true);
760         currentTab()->view()->page()->currentFrame()->setScrollPosition(previous_position);
761         return;
762     }
763
764     QWebPage::FindFlags options = QWebPage::FindWrapsAroundDocument;
765     if (m_findBar->matchCase())
766         options |= QWebPage::FindCaseSensitively;
767
768     bool found = currentTab()->view()->findText(m_lastSearch, options);
769     m_findBar->notifyMatch(found);
770
771     if (!found)
772     {
773         QPoint previous_position = currentTab()->view()->page()->currentFrame()->scrollPosition();
774         currentTab()->view()->page()->focusNextPrevChild(true);
775         currentTab()->view()->page()->currentFrame()->setScrollPosition(previous_position);
776     }
777 }
778
779
780 void MainWindow::findPrevious()
781 {
782     if (!currentTab())
783         return;
784
785     QWebPage::FindFlags options = QWebPage::FindBackward | QWebPage::FindWrapsAroundDocument;
786     if (m_findBar->matchCase())
787         options |= QWebPage::FindCaseSensitively;
788
789     bool found = currentTab()->view()->findText(m_lastSearch, options);
790     m_findBar->notifyMatch(found);
791 }
792
793
794 void MainWindow::updateHighlight()
795 {
796     if (!currentTab())
797         return;
798
799     QWebPage::FindFlags options = QWebPage::HighlightAllOccurrences;
800
801     currentTab()->view()->findText("", options); //Clear an existing highlight
802
803     if (m_findBar->highlightAllState() && !m_findBar->isHidden())
804     {
805         if (m_findBar->matchCase())
806             options |= QWebPage::FindCaseSensitively;
807
808         currentTab()->view()->findText(m_lastSearch, options);
809     }
810 }
811
812
813 void MainWindow::viewFullScreen(bool makeFullScreen)
814 {
815     setWidgetsVisible(!makeFullScreen);
816     KToggleFullScreenAction::setFullScreen(this, makeFullScreen);
817 }
818
819
820 void MainWindow::setWidgetsVisible(bool makeVisible)
821 {
822     // state flags
823     static bool bookmarksToolBarFlag;
824     static bool historyPanelFlag;
825     static bool bookmarksPanelFlag;
826
827     KToolBar *mainBar = toolBar("mainToolBar");
828     KToolBar *bookBar = toolBar("bookmarksToolBar");
829
830     if (!makeVisible)
831     {
832         // save current state, if in windowed mode
833         if (!isFullScreen())
834         {
835             bookmarksToolBarFlag = bookBar->isHidden();
836             historyPanelFlag = m_historyPanel->isHidden();
837             bookmarksPanelFlag = m_bookmarksPanel->isHidden();
838         }
839
840         bookBar->hide();
841         m_view->setTabBarHidden(true);
842         m_historyPanel->hide();
843         m_bookmarksPanel->hide();
844
845         // hide main toolbar
846         mainBar->hide();
847     }
848     else
849     {
850         // show main toolbar
851         mainBar->show();
852         m_view->setTabBarHidden(false);
853
854         // restore state of windowed mode
855         if (!bookmarksToolBarFlag)
856             bookBar->show();
857         if (!historyPanelFlag)
858             m_historyPanel->show();
859         if (!bookmarksPanelFlag)
860             m_bookmarksPanel->show();
861     }
862 }
863
864
865 QString MainWindow::selectedText() const
866 {
867     if (!currentTab())
868         return QString();
869
870     return currentTab()->view()->selectedText();
871 }
872
873
874 void MainWindow::viewPageSource()
875 {
876     if (!currentTab())
877         return;
878
879     KUrl url = currentTab()->url();
880     KRun::runUrl(url, QL1S("text/plain"), this, false);
881 }
882
883
884 void MainWindow::homePage(Qt::MouseButtons mouseButtons, Qt::KeyboardModifiers keyboardModifiers)
885 {
886     KUrl homeUrl = ReKonfig::useNewTabPage()
887         ? KUrl( QL1S("about:home") )
888         : KUrl( ReKonfig::homePage() );
889
890     if (mouseButtons == Qt::MidButton || keyboardModifiers == Qt::ControlModifier)
891         Application::instance()->loadUrl( homeUrl, Rekonq::NewTab);
892     else
893         currentTab()->view()->load( homeUrl );
894 }
895
896
897 WebTab *MainWindow::currentTab() const
898 {
899     return m_view->currentWebTab();
900 }
901
902
903 void MainWindow::browserLoading(bool v)
904 {
905     QAction *stop = actionCollection()->action( QL1S("stop") );
906     QAction *reload = actionCollection()->action( QL1S("view_redisplay") );
907     if (v)
908     {
909         disconnect(m_stopReloadAction, SIGNAL(triggered(bool)), reload , SIGNAL(triggered(bool)));
910         m_stopReloadAction->setIcon(KIcon("process-stop"));
911         m_stopReloadAction->setToolTip(i18n("Stop loading the current page"));
912         m_stopReloadAction->setText(i18n("Stop"));
913         connect(m_stopReloadAction, SIGNAL(triggered(bool)), stop, SIGNAL(triggered(bool)));
914     }
915     else
916     {
917         disconnect(m_stopReloadAction, SIGNAL(triggered(bool)), stop , SIGNAL(triggered(bool)));
918         m_stopReloadAction->setIcon(KIcon("view-refresh"));
919         m_stopReloadAction->setToolTip(i18n("Reload the current page"));
920         m_stopReloadAction->setText(i18n("Reload"));
921         connect(m_stopReloadAction, SIGNAL(triggered(bool)), reload, SIGNAL(triggered(bool)));
922
923     }
924 }
925
926
927 void MainWindow::openPrevious(Qt::MouseButtons mouseButtons, Qt::KeyboardModifiers keyboardModifiers)
928 {
929     QWebHistory *history = currentTab()->view()->history();
930     QWebHistoryItem *item = 0;
931
932     if (currentTab()->page()->isOnRekonqPage())
933     {
934         item = new QWebHistoryItem(history->currentItem());
935         currentTab()->view()->page()->setIsOnRekonqPage(false);
936     }
937     else
938     {
939         if (history->canGoBack())
940         {
941             item = new QWebHistoryItem(history->backItem());
942         }
943     }
944
945     if(!item)
946         return;
947
948     if (mouseButtons == Qt::MidButton || keyboardModifiers == Qt::ControlModifier)
949     {
950         Application::instance()->loadUrl(item->url(), Rekonq::NewTab);
951     }
952     else
953     {
954         history->goToItem(*item);
955     }
956
957     updateActions();
958 }
959
960
961 void MainWindow::openNext(Qt::MouseButtons mouseButtons, Qt::KeyboardModifiers keyboardModifiers)
962 {
963     QWebHistory *history = currentTab()->view()->history();
964     QWebHistoryItem *item = 0;
965
966     if (currentTab()->view()->page()->isOnRekonqPage())
967     {
968         item = new QWebHistoryItem(history->currentItem());
969         currentTab()->view()->page()->setIsOnRekonqPage(false);
970     }
971     else
972     {
973         if (history->canGoForward())
974         {
975             item = new QWebHistoryItem(history->forwardItem());
976         }
977     }
978
979     if(!item)
980         return;
981
982     if (mouseButtons == Qt::MidButton || keyboardModifiers == Qt::ControlModifier)
983     {
984         Application::instance()->loadUrl(item->url(), Rekonq::NewTab);
985     }
986     else
987     {
988         history->goToItem(*item);
989     }
990
991     updateActions();
992 }
993
994
995 void MainWindow::keyPressEvent(QKeyEvent *event)
996 {
997     // hide findbar
998     if (event->key() == Qt::Key_Escape)
999     {
1000         m_findBar->hide();
1001         currentTab()->setFocus();   // give focus to web pages
1002         return;
1003     }
1004
1005     // ctrl + tab action
1006     if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_Tab))
1007     {
1008         emit ctrlTabPressed();
1009         return;
1010     }
1011
1012     // shift + ctrl + tab action
1013     if ((event->modifiers() == Qt::ControlModifier + Qt::ShiftModifier) && (event->key() == Qt::Key_Backtab))
1014     {
1015         emit shiftCtrlTabPressed();
1016         return;
1017     }
1018
1019     KMainWindow::keyPressEvent(event);
1020 }
1021
1022
1023 void MainWindow::notifyMessage(const QString &msg, Rekonq::Notify status)
1024 {
1025     if (this != QApplication::activeWindow())
1026     {
1027         return;
1028     }
1029
1030     // deleting popus if empty msgs
1031     if (msg.isEmpty())
1032     {
1033         m_hidePopup->start(250);
1034         return;
1035     }
1036
1037     m_hidePopup->stop();
1038
1039
1040     switch (status)
1041     {
1042     case Rekonq::Url:
1043         break;
1044     case Rekonq::Info:
1045         m_hidePopup->start(500);
1046         break;
1047     case Rekonq::Success:
1048         break;
1049     case Rekonq::Error:
1050         break;
1051     case Rekonq::Download:
1052         break;
1053     default:
1054         break;
1055     }
1056
1057     int margin = 4;
1058
1059     // setting the popup
1060     QLabel *label = new QLabel(msg);
1061     m_popup->setView(label);
1062     QSize labelSize(label->fontMetrics().width(msg) + 2*margin, label->fontMetrics().height() + 2*margin);
1063     if (labelSize.width() > width()) labelSize.setWidth(width());
1064     m_popup->setFixedSize(labelSize);
1065     m_popup->layout()->setAlignment(Qt::AlignTop);
1066     m_popup->layout()->setMargin(margin);
1067
1068     // useful values
1069     WebTab *tab = m_view->currentWebTab();
1070
1071     // fix crash on window close
1072     if (!tab)
1073         return;
1074
1075     // fix crash on window close
1076     if (!tab->page())
1077         return;
1078
1079     bool scrollbarIsVisible = tab->page()->currentFrame()->scrollBarMaximum(Qt::Horizontal);
1080     int scrollbarSize = 0;
1081     if (scrollbarIsVisible)
1082     {
1083         //TODO: detect QStyle size
1084         scrollbarSize = 17;
1085     }
1086
1087     QPoint webViewOrigin = tab->view()->mapToGlobal(QPoint(0, 0));
1088     int bottomLeftY = webViewOrigin.y() + tab->page()->viewportSize().height() - labelSize.height() - scrollbarSize;
1089
1090     // setting popup in bottom-left position
1091     int x = geometry().x();
1092     int y = bottomLeftY;
1093
1094     QPoint mousePos = tab->mapToGlobal(tab->view()->mousePos());
1095     if (QRect(webViewOrigin.x() , bottomLeftY , labelSize.width() , labelSize.height()).contains(mousePos))
1096     {
1097         // setting popup above the mouse
1098         y = bottomLeftY - labelSize.height();
1099     }
1100
1101     m_popup->show(QPoint(x, y));
1102 }
1103
1104
1105 void MainWindow::clearPrivateData()
1106 {
1107     QPointer<KDialog> dialog = new KDialog(this);
1108     dialog->setCaption(i18nc("@title:window", "Clear Private Data"));
1109     dialog->setButtons(KDialog::Ok | KDialog::Cancel);
1110
1111     dialog->button(KDialog::Ok)->setIcon(KIcon("edit-clear"));
1112     dialog->button(KDialog::Ok)->setText(i18n("Clear"));
1113
1114     Ui::ClearDataWidget clearWidget;
1115     QWidget widget;
1116     clearWidget.setupUi(&widget);
1117
1118     dialog->setMainWidget(&widget);
1119     dialog->exec();
1120
1121     if (dialog->result() == QDialog::Accepted)
1122     {
1123         if (clearWidget.clearHistory->isChecked())
1124         {
1125             Application::historyManager()->clear();
1126         }
1127
1128         if (clearWidget.clearDownloads->isChecked())
1129         {
1130             Application::instance()->clearDownloadsHistory();
1131         }
1132
1133         if (clearWidget.clearCookies->isChecked())
1134         {
1135             QDBusInterface kcookiejar("org.kde.kded", "/modules/kcookiejar", "org.kde.KCookieServer");
1136             QDBusReply<void> reply = kcookiejar.call("deleteAllCookies");
1137         }
1138
1139         if (clearWidget.clearCachedPages->isChecked())
1140         {
1141             KProcess::startDetached(KStandardDirs::findExe("kio_http_cache_cleaner"),
1142                                     QStringList(QL1S("--clear-all")));
1143         }
1144
1145         if (clearWidget.clearWebIcons->isChecked())
1146         {
1147             Application::iconManager()->clearIconCache();
1148         }
1149
1150         if (clearWidget.homePageThumbs->isChecked())
1151         {
1152             QString path = KStandardDirs::locateLocal("cache", QString("thumbs/rekonq"), true);
1153             path.remove("rekonq");
1154             QDir cacheDir(path);
1155             QStringList fileList = cacheDir.entryList();
1156             foreach(const QString &str, fileList)
1157             {
1158                 QFile file(path + str);
1159                 file.remove();
1160             }
1161         }
1162     }
1163
1164     dialog->deleteLater();
1165 }
1166
1167
1168 void MainWindow::aboutToShowBackMenu()
1169 {
1170     m_historyBackMenu->clear();
1171     if (!currentTab())
1172         return;
1173     QWebHistory *history = currentTab()->view()->history();
1174     int pivot = history->currentItemIndex();
1175     int offset = 0;
1176     QList<QWebHistoryItem> historyList = history->backItems(8); //no more than 8 elements!
1177     int listCount = historyList.count();
1178     if (pivot >= 8)
1179         offset = pivot - 8;
1180
1181     /*
1182      * Need a bug report upstream.
1183      * Seems setHtml() do some garbage in history
1184      * Here history->currentItem() have backItem url and currentItem (error page) title
1185      */
1186     if (currentTab()->view()->page()->isOnRekonqPage())
1187     {
1188         QWebHistoryItem item = history->currentItem();
1189         KAction *action = new KAction(this);
1190         action->setData(listCount + offset++);
1191         KIcon icon = Application::iconManager()->iconForUrl(item.url());
1192         action->setIcon(icon);
1193         action->setText(item.title());
1194         m_historyBackMenu->addAction(action);
1195     }
1196
1197     for (int i = listCount - 1; i >= 0; --i)
1198     {
1199         QWebHistoryItem item = historyList.at(i);
1200         KAction *action = new KAction(this);
1201         action->setData(i + offset);
1202         KIcon icon = Application::iconManager()->iconForUrl(item.url());
1203         action->setIcon(icon);
1204         action->setText(item.title());
1205         m_historyBackMenu->addAction(action);
1206     }
1207 }
1208
1209
1210 void MainWindow::openActionUrl(QAction *action)
1211 {
1212     int index = action->data().toInt();
1213
1214     QWebHistory *history = currentTab()->view()->history();
1215     if (!history->itemAt(index).isValid())
1216     {
1217         kDebug() << "Invalid Index!: " << index;
1218         return;
1219     }
1220
1221     history->goToItem(history->itemAt(index));
1222 }
1223
1224
1225 void MainWindow::setEncoding(QAction *qa)
1226 {
1227     QString currentCodec = qa->text().toLatin1();
1228     currentCodec = currentCodec.remove('&');
1229     kDebug() << "Setting codec: " << currentCodec;
1230     if(currentCodec == QL1S("Default") )
1231     {
1232         kDebug() << "QWebSettings::globalSettings()->defaultTextEncoding() = " << QWebSettings::globalSettings()->defaultTextEncoding();
1233         currentTab()->view()->settings()->setDefaultTextEncoding( QWebSettings::globalSettings()->defaultTextEncoding() );
1234         currentTab()->view()->reload();
1235         return;
1236     }
1237
1238     currentTab()->view()->settings()->setDefaultTextEncoding(currentCodec);
1239     currentTab()->view()->reload();
1240 }
1241
1242
1243 void MainWindow::populateEncodingMenu()
1244 {
1245     QStringList codecs;
1246     QList<int> mibs = QTextCodec::availableMibs();
1247     Q_FOREACH (const int &mib, mibs)
1248     {
1249         QString codec = QL1S(QTextCodec::codecForMib(mib)->name());
1250         codecs.append(codec);
1251     }
1252     codecs.sort();
1253
1254     QString currentCodec = currentTab()->page()->settings()->defaultTextEncoding();
1255
1256     m_encodingMenu->clear();
1257     KMenu *isoMenu = new KMenu( QL1S("ISO"), m_encodingMenu);
1258     KMenu *winMenu = new KMenu( QL1S("Windows"), m_encodingMenu);
1259     KMenu *isciiMenu = new KMenu( QL1S("ISCII"), m_encodingMenu);
1260     KMenu *uniMenu = new KMenu( QL1S("Unicode"), m_encodingMenu);
1261     KMenu *otherMenu = new KMenu( i18n("Other"), m_encodingMenu);
1262
1263     QAction *a;
1264     bool isDefaultCodecUsed = true;
1265
1266     Q_FOREACH(const QString &codec, codecs)
1267     {
1268
1269         if( codec.startsWith( QL1S("ISO"), Qt::CaseInsensitive ) )
1270             a = isoMenu->addAction(codec);
1271         else if( codec.startsWith( QL1S("win") ) )
1272             a = winMenu->addAction(codec);
1273         else if( codec.startsWith( QL1S("Iscii") ) )
1274             a = isciiMenu->addAction(codec);
1275         else if( codec.startsWith( QL1S("UT") ) )
1276             a = uniMenu->addAction(codec);
1277         else
1278             a = otherMenu->addAction(codec);
1279
1280         a->setCheckable(true);
1281         if (currentCodec == codec)
1282         {
1283             a->setChecked(true);
1284             isDefaultCodecUsed = false;
1285         }
1286     }
1287
1288     a = new QAction( i18nc("Default website encoding", "Default"), this);
1289     a->setCheckable(true);
1290     a->setChecked(isDefaultCodecUsed);
1291
1292     m_encodingMenu->addAction( a );
1293     m_encodingMenu->addMenu( isoMenu );
1294     m_encodingMenu->addMenu( winMenu );
1295     m_encodingMenu->addMenu( isciiMenu );
1296     m_encodingMenu->addMenu( uniMenu );
1297     m_encodingMenu->addMenu( otherMenu );
1298 }
1299
1300
1301 void MainWindow::enableNetworkAnalysis(bool b)
1302 {
1303     currentTab()->page()->enableNetworkAnalyzer(b);
1304     m_analyzerPanel->toggle(b);
1305 }
1306
1307
1308 bool MainWindow::queryClose()
1309 {
1310     // this should fux bug 240432
1311     if(Application::instance()->sessionSaving())
1312         return true;
1313
1314     // smooth private browsing mode
1315     if(QWebSettings::globalSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled))
1316         return true;
1317     
1318     if (m_view->count() > 1)
1319     {
1320         int answer = KMessageBox::questionYesNoCancel(
1321                         this,
1322                         i18np("Are you sure you want to close the window?\n" "You have 1 tab open.",
1323                          "Are you sure you want to close the window?\n" "You have %1 tabs open.",
1324                         m_view->count()),
1325                         i18n("Are you sure you want to close the window?"),
1326                         KStandardGuiItem::quit(),
1327                         KGuiItem(i18n("C&lose Current Tab"), KIcon("tab-close")),
1328                         KStandardGuiItem::cancel(),
1329                         "confirmClosingMultipleTabs"
1330                                                         );
1331
1332         switch (answer)
1333         {
1334             case KMessageBox::Yes:
1335                 // Quit
1336                 return true;
1337
1338             case KMessageBox::No:
1339                 // Close only the current tab
1340                 m_view->closeTab();
1341
1342             default:
1343                 return false;
1344         }
1345     }
1346     return true;
1347 }
1348
1349
1350 void MainWindow::saveNewToolbarConfig()
1351 {
1352     KXmlGuiWindow::saveNewToolbarConfig();
1353     setupBookmarksAndToolsShortcuts();
1354 }
1355
1356
1357 void MainWindow::setupBookmarksAndToolsShortcuts()
1358 {
1359     KToolBar *mainBar = toolBar("mainToolBar");
1360
1361     QToolButton *bookmarksButton = qobject_cast<QToolButton*>(mainBar->widgetForAction(actionByName( QL1S("bookmarksActionMenu") )));
1362     if(bookmarksButton)
1363     {
1364         connect(actionByName(QL1S("bookmarksActionMenu")), SIGNAL(triggered()), bookmarksButton, SLOT(showMenu()));
1365     }
1366
1367     QToolButton *toolsButton = qobject_cast<QToolButton*>(mainBar->widgetForAction(actionByName( QL1S("rekonq_tools") )));
1368     if(toolsButton)
1369     {
1370         connect(actionByName(QL1S("rekonq_tools")), SIGNAL(triggered()), toolsButton, SLOT(showMenu()));
1371     }
1372 }