summaryrefslogtreecommitdiff
path: root/src/tabwindow/tabwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tabwindow/tabwidget.cpp')
-rw-r--r--src/tabwindow/tabwidget.cpp900
1 files changed, 900 insertions, 0 deletions
diff --git a/src/tabwindow/tabwidget.cpp b/src/tabwindow/tabwidget.cpp
new file mode 100644
index 00000000..bb62ca27
--- /dev/null
+++ b/src/tabwindow/tabwidget.cpp
@@ -0,0 +1,900 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2012 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* 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, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "tabwidget.h"
+#include "tabwidget.moc"
+
+// Auto Includes
+#include "rekonq.h"
+
+// Local Includes
+#include "application.h"
+#include "rekonqwindow.h"
+
+#include "webpage.h"
+#include "webwindow.h"
+#include "tabbar.h"
+
+#include "tabhistory.h"
+
+#include "bookmarkmanager.h"
+#include "iconmanager.h"
+#include "sessionmanager.h"
+
+// KDE Includes
+#include <KAction>
+#include <KApplication>
+#include <KConfig>
+#include <KConfigGroup>
+#include <KLocalizedString>
+#include <KStandardDirs>
+#include <KUrl>
+#include <KToggleFullScreenAction>
+
+#include <KBookmark>
+#include <KBookmarkGroup>
+
+#include <KWindowInfo>
+#include <KWindowSystem>
+
+// Qt Includes
+#include <QDesktopWidget>
+#include <QLabel>
+#include <QMovie>
+#include <QTabBar>
+#include <QToolButton>
+#include <QSignalMapper>
+#include <QWebHistory>
+#include <QWebSettings>
+
+
+TabWidget::TabWidget(bool withTab, bool PrivateBrowsingMode, QWidget *parent)
+ : KTabWidget(parent)
+ , _addTabButton(new QToolButton(this))
+ , _openedTabsCounter(0)
+ , _isPrivateBrowsing(PrivateBrowsingMode)
+ , _ac(new KActionCollection(this))
+{
+ init();
+
+ // NOTE: we usually create TabWidget with AT LEAST one tab, but
+ // in one important case...
+ if (withTab)
+ {
+ WebWindow *tab = prepareNewTab();
+ addTab(tab, i18n("new tab"));
+ setCurrentWidget(tab);
+ }
+}
+
+
+TabWidget::TabWidget(WebPage *pg, QWidget *parent)
+ : KTabWidget(parent)
+ , _addTabButton(new QToolButton(this))
+ , _openedTabsCounter(0)
+ , _isPrivateBrowsing(false)
+ , _ac(new KActionCollection(this))
+{
+ init();
+
+ WebWindow *tab = prepareNewTab(pg);
+ addTab(tab, i18n("new tab"));
+ setCurrentWidget(tab);
+}
+
+
+void TabWidget::init()
+{
+ setContentsMargins(0, 0, 0, 0);
+
+ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+
+ // set mouse tracking for tab previews
+ setMouseTracking(true);
+
+ // setting tabbar
+ TabBar *tabBar = new TabBar(this);
+ setTabBar(tabBar);
+
+ // sets document mode; this removes the frame around the tabs
+ setDocumentMode(true);
+
+ // connecting tabbar signals
+ connect(tabBar, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int)));
+ connect(tabBar, SIGNAL(mouseMiddleClick(int)), this, SLOT(closeTab(int)));
+
+ connect(tabBar, SIGNAL(newTabRequest()), this, SLOT(newTab()));
+
+ connect(tabBar, SIGNAL(cloneTab(int)), this, SLOT(cloneTab(int)));
+ connect(tabBar, SIGNAL(closeTab(int)), this, SLOT(closeTab(int)));
+ connect(tabBar, SIGNAL(closeOtherTabs(int)), this, SLOT(closeOtherTabs(int)));
+ connect(tabBar, SIGNAL(reloadTab(int)), this, SLOT(reloadTab(int)));
+ connect(tabBar, SIGNAL(detachTab(int)), this, SLOT(detachTab(int)));
+
+ connect(tabBar, SIGNAL(tabLayoutChanged()), this, SLOT(updateNewTabButtonPosition()));
+
+ // ============================== Tab Window Actions ====================================
+ _ac->addAssociatedWidget(this);
+
+ KAction* a;
+
+ a = new KAction(KIcon("tab-new"), i18n("New &Tab"), this);
+ a->setShortcut(KShortcut(Qt::CTRL + Qt::Key_T));
+ actionCollection()->addAction(QL1S("new_tab"), a);
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(newTab()));
+
+ a = new KAction(KIcon("tab-new"), i18n("Open Last Closed Tab"), this);
+ a->setShortcut(KShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T));
+ actionCollection()->addAction(QL1S("open_last_closed_tab"), a);
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(restoreLastClosedTab()));
+
+ a = new KAction(KIcon("tab-close"), i18n("&Close Tab"), this);
+ a->setShortcuts(KStandardShortcut::close());
+ actionCollection()->addAction(QL1S("close_tab"), a);
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(closeTab()));
+
+ a = new KAction(i18n("Show Next Tab"), this);
+ a->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabPrev() : KStandardShortcut::tabNext());
+ actionCollection()->addAction(QL1S("show_next_tab"), a);
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(nextTab()));
+
+ a = new KAction(i18n("Show Previous Tab"), this);
+ a->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabNext() : KStandardShortcut::tabPrev());
+ actionCollection()->addAction(QL1S("show_prev_tab"), a);
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(previousTab()));
+
+ a = KStandardAction::fullScreen(this, SLOT(setFullScreen(bool)), this, actionCollection());
+ KShortcut fullScreenShortcut = KStandardShortcut::fullScreen();
+ fullScreenShortcut.setAlternate(Qt::Key_F11);
+ a->setShortcut(fullScreenShortcut);
+
+ a = new KAction(KIcon("bookmarks"), i18n("Bookmark all tabs"), this);
+ actionCollection()->addAction(QL1S("bookmark_all_tabs"), a);
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(bookmarkAllTabs()));
+
+ // ----------------------------------------------------------------------------------------------
+ // Add Tab Button
+ _addTabButton->setDefaultAction(actionByName(QL1S("new_tab")));
+ _addTabButton->setAutoRaise(true);
+ _addTabButton->raise();
+ _addTabButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
+
+ connect(this, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int)));
+
+ // ----------------------------------------------------------------------------------------------
+ RekonqWindow *rw = qobject_cast<RekonqWindow *>(parent());
+ // setup bookmarks panel action
+ a = new KAction(KIcon("bookmarks-organize"), i18n("Bookmarks Panel"), this);
+ a->setShortcut(KShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_B));
+ actionCollection()->addAction(QL1S("show_bookmarks_panel"), a);
+ a->setCheckable(true);
+ connect(a, SIGNAL(triggered(bool)), rw, SLOT(showBookmarksPanel(bool)));
+
+ // setup history panel action
+ a = new KAction(KIcon("view-history"), i18n("History Panel"), this);
+ a->setShortcut(KShortcut(Qt::CTRL + Qt::Key_H));
+ actionCollection()->addAction(QL1S("show_history_panel"), a);
+ a->setCheckable(true);
+ connect(a, SIGNAL(triggered(bool)), rw, SLOT(showHistoryPanel(bool)));
+
+ // ----------------------------------------------------------------------------------------------
+ // shortcuts for quickly switching to a tab
+ QSignalMapper *tabSignalMapper = new QSignalMapper(this);
+ for (int i = 0; i < 9; i++)
+ {
+ a = new KAction(i18n("Switch to Tab %1", i+1), this);
+ a->setShortcut(KShortcut(QString("Alt+%1").arg(i+1)));
+ actionCollection()->addAction(QL1S(QString("switch_tab_" + QString::number(i+1)).toAscii()), a);
+ connect(a, SIGNAL(triggered(bool)), tabSignalMapper, SLOT(map()));
+ tabSignalMapper->setMapping(a, i);
+ }
+ connect(tabSignalMapper, SIGNAL(mapped(int)), this, SLOT(setCurrentIndex(int)));
+
+ // shortcuts for loading favorite pages
+ QSignalMapper *favoritesSignalMapper = new QSignalMapper(this);
+ for (int i = 1; i <= 9; ++i)
+ {
+ a = new KAction(i18n("Switch to Favorite Page %1", i), this);
+ a->setShortcut(KShortcut(QString("Ctrl+%1").arg(i)));
+ actionCollection()->addAction(QL1S(QString("switch_favorite_" + QString::number(i)).toAscii()), a);
+ connect(a, SIGNAL(triggered(bool)), favoritesSignalMapper, SLOT(map()));
+ favoritesSignalMapper->setMapping(a, i);
+ }
+ connect(favoritesSignalMapper, SIGNAL(mapped(int)), this, SLOT(loadFavorite(int)));
+
+ _ac->readSettings();
+
+ // ----------------------------------------------------------------------------------------------
+ int n = rApp->rekonqWindowList().count() + 1;
+ QList<TabHistory> list = SessionManager::self()->closedSitesForWindow( QL1S("win") + QString::number(n) );
+ Q_FOREACH(const TabHistory & tab, list)
+ {
+ if (tab.url.startsWith(QL1S("about")))
+ continue;
+ m_recentlyClosedTabs.removeAll(tab);
+ m_recentlyClosedTabs.prepend(tab);
+ }
+}
+
+
+// ----------------------------------------------------------------------------------------------------
+
+
+KActionCollection *TabWidget::actionCollection() const
+{
+ return _ac;
+}
+
+
+QAction *TabWidget::actionByName(const QString &name)
+{
+ return actionCollection()->action(name);
+}
+
+
+TabBar *TabWidget::tabBar() const
+{
+ TabBar *tabBar = qobject_cast<TabBar *>(QTabWidget::tabBar());
+ return tabBar;
+}
+
+
+WebWindow *TabWidget::currentWebWindow() const
+{
+ return webWindow(currentIndex());
+}
+
+
+WebWindow *TabWidget::webWindow(int index) const
+{
+ WebWindow *tab = qobject_cast<WebWindow *>(this->widget(index));
+ if (tab)
+ {
+ return tab;
+ }
+
+ kDebug() << "WebWindow with index " << index << "not found. Returning NULL." ;
+ return 0;
+}
+
+
+QList<TabHistory> TabWidget::recentlyClosedTabs()
+{
+ return m_recentlyClosedTabs;
+}
+
+
+void TabWidget::newTab(WebPage *page)
+{
+ WebWindow *tab = prepareNewTab(page);
+ addTab(tab, i18n("new tab"));
+ setCurrentWidget(tab);
+
+ // no need to load an url if we already have a page...
+ if (page)
+ return;
+
+ switch (ReKonfig::newTabsBehaviour())
+ {
+ case 0: // new tab page
+ tab->load(KUrl("about:home"));
+ break;
+ case 2: // homepage
+ tab->load(KUrl(ReKonfig::homePage()));
+ break;
+ case 1: // blank page
+ default:
+ tab->load(KUrl("about:blank"));
+ break;
+ }
+}
+
+
+WebWindow *TabWidget::prepareNewTab(WebPage *page)
+{
+ WebWindow *tab = new WebWindow(this, _isPrivateBrowsing, page);
+
+ connect(tab, SIGNAL(titleChanged(QString)), this, SLOT(tabTitleChanged(QString)));
+ connect(tab, SIGNAL(urlChanged(QUrl)), this, SLOT(tabUrlChanged(QUrl)));
+ connect(tab, SIGNAL(iconChanged()), this, SLOT(tabIconChanged()));
+
+ connect(tab, SIGNAL(loadStarted()), this, SLOT(tabLoadStarted()));
+ connect(tab, SIGNAL(loadFinished(bool)), this, SLOT(tabLoadFinished(bool)));
+
+ connect(tab, SIGNAL(pageCreated(WebPage*)), this, SLOT(pageCreated(WebPage*)));
+
+ connect(tab, SIGNAL(setFullScreen(bool)), this, SLOT(setFullScreen(bool)));
+
+ return tab;
+}
+
+
+void TabWidget::loadUrl(const KUrl &url, Rekonq::OpenType type, TabHistory *history)
+{
+ WebWindow *tab = 0;
+ switch (type)
+ {
+ case Rekonq::NewTab:
+ tab = prepareNewTab();
+ _openedTabsCounter++;
+ insertTab(currentIndex() + _openedTabsCounter, tab, i18n("new tab"));
+ if (ReKonfig::openNewTabsInForeground())
+ {
+ setCurrentWidget(tab);
+ }
+ break;
+ case Rekonq::NewBackGroundTab:
+ tab = prepareNewTab();
+ _openedTabsCounter++;
+ insertTab(currentIndex() + _openedTabsCounter, tab, i18n("new tab"));
+ break;
+
+ case Rekonq::NewFocusedTab:
+ tab = prepareNewTab();
+ _openedTabsCounter++;
+ insertTab(currentIndex() + _openedTabsCounter, tab, i18n("new tab"));
+ setCurrentWidget(tab);
+ break;
+
+ case Rekonq::NewWindow:
+ case Rekonq::NewPrivateWindow:
+ rApp->loadUrl(url, type);
+ return;
+
+ case Rekonq::CurrentTab:
+ default:
+ tab = currentWebWindow();
+ break;
+ };
+
+ tab->load(url);
+
+ if (history)
+ {
+ history->applyHistory(tab->page()->history());
+ }
+}
+
+
+void TabWidget::pageCreated(WebPage *page)
+{
+ WebWindow *tab = prepareNewTab(page);
+
+ // Now, the dirty jobs...
+ _openedTabsCounter++;
+ insertTab(currentIndex() + _openedTabsCounter, tab, i18n("new tab"));
+
+ setCurrentWidget(tab);
+}
+
+
+void TabWidget::currentChanged(int newIndex)
+{
+ _openedTabsCounter = 0;
+
+ tabBar()->setTabHighlighted(newIndex, false);
+
+ // update window title & icon
+ WebWindow* tab = webWindow(newIndex);
+ if (!tab)
+ return;
+
+ QString t = tab->title();
+
+ (t.isEmpty() || t == QL1S("rekonq"))
+ ? setWindowTitle(QL1S("rekonq"))
+ : setWindowTitle(t + QL1S(" - rekonq"));
+
+ tab->checkFocus();
+}
+
+
+void TabWidget::updateNewTabButtonPosition()
+{
+ if (isFullScreen())
+ return;
+
+ setUpdatesEnabled(false);
+
+ int tabWidgetWidth = frameSize().width();
+ int tabBarWidth = tabBar()->sizeHint().width();
+
+ if (tabBarWidth + _addTabButton->width() > tabWidgetWidth)
+ {
+ setCornerWidget(_addTabButton);
+ }
+ else
+ {
+ setCornerWidget(0);
+ _addTabButton->move(tabBarWidth, 0);
+ }
+
+ _addTabButton->show();
+ setUpdatesEnabled(true);
+}
+
+
+void TabWidget::tabTitleChanged(const QString &title)
+{
+ WebWindow *tab = qobject_cast<WebWindow *>(sender());
+ if (!tab)
+ return;
+
+ QString tabTitle = title.isEmpty() ? tab->title() : title;
+ tabTitle.replace('&', "&&");
+
+ int index = indexOf(tab);
+
+ if (-1 != index && !tabBar()->tabData(index).toBool())
+ {
+ setTabText(index, tabTitle);
+ }
+
+ if (currentIndex() != index)
+ {
+ tabBar()->setTabHighlighted(index, true);
+ }
+ else
+ {
+ setWindowTitle(tabTitle + QL1S(" - rekonq"));
+ }
+
+ if (ReKonfig::hoveringTabOption() == 1)
+ tabBar()->setTabToolTip(index, tabTitle.remove('&'));
+}
+
+
+void TabWidget::tabUrlChanged(const QUrl &url)
+{
+ WebWindow *tab = qobject_cast<WebWindow *>(sender());
+ if (!tab)
+ return;
+
+ int index = indexOf(tab);
+ if (ReKonfig::hoveringTabOption() == 2)
+ tabBar()->setTabToolTip(index, url.toString());
+}
+
+
+void TabWidget::tabIconChanged()
+{
+ WebWindow *tab = qobject_cast<WebWindow *>(sender());
+ if (!tab)
+ return;
+
+ if (tab->isLoading())
+ return;
+
+ int index = indexOf(tab);
+
+ if (-1 == index)
+ return;
+
+ QLabel *label = qobject_cast<QLabel* >(tabBar()->tabButton(index, QTabBar::LeftSide));
+ if (!label)
+ {
+ label = new QLabel(this);
+ tabBar()->setTabButton(index, QTabBar::LeftSide, 0);
+ tabBar()->setTabButton(index, QTabBar::LeftSide, label);
+ }
+
+ KIcon ic = IconManager::self()->iconForUrl(tab->url());
+ label->setPixmap(ic.pixmap(16, 16));
+}
+
+
+void TabWidget::tabLoadStarted()
+{
+ WebWindow *tab = qobject_cast<WebWindow *>(sender());
+ if (!tab)
+ return;
+
+ int index = indexOf(tab);
+ if (index != -1)
+ {
+ QLabel *label = qobject_cast<QLabel* >(tabBar()->tabButton(index, QTabBar::LeftSide));
+ if (!label)
+ {
+ label = new QLabel(this);
+ }
+
+ if (!label->movie())
+ {
+ static QString loadingGitPath = KStandardDirs::locate("appdata" , "pics/loading.mng");
+
+ QMovie *movie = new QMovie(loadingGitPath, QByteArray(), label);
+ movie->setSpeed(50);
+ label->setMovie(movie);
+ movie->start();
+ }
+
+ tabBar()->setTabButton(index, QTabBar::LeftSide, 0);
+ tabBar()->setTabButton(index, QTabBar::LeftSide, label);
+
+ if (!tabBar()->tabData(index).toBool())
+ tabBar()->setTabText(index, i18n("Loading..."));
+ else
+ {
+ tabBar()->tabButton(index, QTabBar::RightSide)->hide(); // NOTE: not really good this, but..."Repetita iuvant"!!!
+ }
+ }
+}
+
+
+void TabWidget::tabLoadFinished(bool ok)
+{
+ Q_UNUSED(ok);
+
+ WebWindow *tab = qobject_cast<WebWindow *>(sender());
+ if (!tab)
+ return;
+
+ int index = indexOf(tab);
+
+ if (-1 == index)
+ return;
+
+ QLabel *label = qobject_cast<QLabel* >(tabBar()->tabButton(index, QTabBar::LeftSide));
+ if (!label)
+ {
+ label = new QLabel(this);
+ tabBar()->setTabButton(index, QTabBar::LeftSide, 0);
+ tabBar()->setTabButton(index, QTabBar::LeftSide, label);
+ }
+
+ QMovie *movie = label->movie();
+ if (movie)
+ {
+ movie->stop();
+ delete movie;
+ }
+
+ label->setMovie(0);
+
+ KIcon ic = IconManager::self()->iconForUrl(tab->url());
+ label->setPixmap(ic.pixmap(16, 16));
+
+ if (!tabBar()->tabData(index).toBool())
+ {
+ setTabText(index, tab->title());
+ }
+ else
+ {
+ setTabText(index, QString());
+ }
+
+ if (index == currentIndex())
+ tab->checkFocus();
+}
+
+
+void TabWidget::cloneTab(int index)
+{
+ if (index < 0)
+ index = currentIndex();
+ if (index < 0 || index >= count())
+ return;
+
+ QUrl u = webWindow(index)->url();
+ QWebHistory* history = webWindow(index)->page()->history();
+ TabHistory clonedHistory(history);
+
+ loadUrl(u, Rekonq::NewTab, &clonedHistory);
+}
+
+
+void TabWidget::closeTab(int index, bool del)
+{
+ if (index < 0)
+ index = currentIndex();
+ if (index < 0 || index >= count())
+ return;
+
+ WebWindow *tabToClose = webWindow(index);
+ if (!tabToClose)
+ return;
+
+ // what to do if there is just one tab...
+ if (count() == 1)
+ {
+ kDebug() << "CANNOT CLOSE WINDOW FROM HERE...";
+ currentWebWindow()->load(KUrl("about:home"));
+ return;
+ }
+
+ if (!tabToClose->url().isEmpty()
+ && tabToClose->url().scheme() != QL1S("about")
+ && !tabToClose->page()->settings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)
+ )
+ {
+ const int recentlyClosedTabsLimit = 8;
+ TabHistory history(tabToClose->page()->history());
+ history.title = tabToClose->title();
+ history.url = tabToClose->url().url();
+ history.position = index;
+
+ m_recentlyClosedTabs.removeAll(history);
+ if (m_recentlyClosedTabs.count() == recentlyClosedTabsLimit)
+ m_recentlyClosedTabs.removeLast();
+ m_recentlyClosedTabs.prepend(history);
+ }
+
+ removeTab(index);
+
+ if (del)
+ {
+ tabToClose->deleteLater();
+ }
+}
+
+
+void TabWidget::closeOtherTabs(int index)
+{
+ if (index < 0)
+ index = currentIndex();
+ if (index < 0 || index >= count())
+ return;
+
+ for (int i = count() - 1; i > index; --i)
+ {
+ closeTab(i);
+ }
+
+ for (int i = index - 1; i >= 0; --i)
+ {
+ closeTab(i);
+ }
+}
+
+
+void TabWidget::detachTab(int index, RekonqWindow *toWindow)
+{
+ if (index < 0)
+ index = currentIndex();
+ if (index < 0 || index >= count())
+ return;
+
+ WebWindow *tab = webWindow(index);
+ KUrl u = tab->url();
+ if (u.scheme() == QL1S("about"))
+ {
+ closeTab(index);
+ loadUrl(u, Rekonq::NewWindow);
+ return;
+ }
+ // else
+
+ closeTab(index, false);
+
+ RekonqWindow *w = 0;
+ w = (toWindow == 0)
+ ? new RekonqWindow(false)
+ : toWindow;
+
+ TabWidget *hostTabWidget = w->tabWidget();
+
+ hostTabWidget->addTab(tab, tab->title());
+ hostTabWidget->setCurrentWidget(tab);
+
+ // disconnect signals from old tabwindow
+ // WARNING: Code copied from prepareNewTab method.
+ // Any new changes there should be applied here...
+ disconnect(tab, SIGNAL(titleChanged(QString)), this, SLOT(tabTitleChanged(QString)));
+ disconnect(tab, SIGNAL(iconChanged()), this, SLOT(tabIconChanged()));
+ disconnect(tab, SIGNAL(loadStarted()), this, SLOT(tabLoadStarted()));
+ disconnect(tab, SIGNAL(loadFinished(bool)), this, SLOT(tabLoadFinished(bool)));
+ disconnect(tab, SIGNAL(pageCreated(WebPage*)), this, SLOT(pageCreated(WebPage*)));
+
+ // reconnect signals to new tabwindow
+ // WARNING: Code copied from prepareNewTab method.
+ // Any new changes there should be applied here...
+ connect(tab, SIGNAL(titleChanged(QString)), hostTabWidget, SLOT(tabTitleChanged(QString)));
+ connect(tab, SIGNAL(iconChanged()), hostTabWidget, SLOT(tabIconChanged()));
+ connect(tab, SIGNAL(loadStarted()), hostTabWidget, SLOT(tabLoadStarted()));
+ connect(tab, SIGNAL(loadFinished(bool)), hostTabWidget, SLOT(tabLoadFinished(bool)));
+ connect(tab, SIGNAL(pageCreated(WebPage*)), hostTabWidget, SLOT(pageCreated(WebPage*)));
+
+ w->show();
+}
+
+
+void TabWidget::reloadTab(int index)
+{
+ // When index is -1 index chooses the current tab
+ if (index < 0)
+ index = currentIndex();
+
+ if (index < 0 || index >= count())
+ return;
+
+ WebWindow *reloadingTab = webWindow(index);
+ QAction *action = reloadingTab->page()->action(QWebPage::Reload);
+ action->trigger();
+}
+
+
+void TabWidget::reloadAllTabs()
+{
+ for (int i = 0; i < count(); ++i)
+ {
+ reloadTab(i);
+ }
+}
+
+
+void TabWidget::bookmarkAllTabs()
+{
+ KBookmarkGroup rGroup = BookmarkManager::self()->rootGroup();
+ KBookmarkGroup folderGroup = rGroup.createNewFolder(i18n("Bookmarked tabs: ") + QDate::currentDate().toString());
+ for (int i = 0; i < count(); ++i)
+ {
+ WebWindow *tab = webWindow(i);
+ KBookmark bk = folderGroup.addBookmark(tab->title(), tab->url());
+ }
+}
+
+
+void TabWidget::restoreLastClosedTab()
+{
+ restoreClosedTab(0);
+}
+
+
+void TabWidget::restoreClosedTab(int index, bool inNewTab)
+{
+ if (m_recentlyClosedTabs.isEmpty())
+ return;
+
+ if (index >= m_recentlyClosedTabs.count())
+ return;
+
+ TabHistory history = m_recentlyClosedTabs.takeAt(index);
+
+ QUrl u = QUrl(history.url);
+
+ int restorePosition = history.position;
+
+ WebWindow *tab;
+
+ if (inNewTab)
+ {
+ tab = prepareNewTab();
+ if (restorePosition < count())
+ insertTab(restorePosition, tab, i18n("restored tab"));
+ else
+ addTab(tab, i18n("restored tab"));
+
+ setCurrentWidget(tab);
+ }
+ else
+ {
+ tab = currentWebWindow();
+ }
+
+ tab->load(u);
+
+ // just to get sure...
+ m_recentlyClosedTabs.removeAll(history);
+}
+
+
+void TabWidget::nextTab()
+{
+ int next = currentIndex() + 1;
+ if (next == count())
+ next = 0;
+ setCurrentIndex(next);
+}
+
+
+void TabWidget::previousTab()
+{
+ int next = currentIndex() - 1;
+ if (next < 0)
+ next = count() - 1;
+ setCurrentIndex(next);
+}
+
+
+void TabWidget::setFullScreen(bool makeFullScreen)
+{
+ tabBar()->setVisible(!makeFullScreen);
+ _addTabButton->setVisible(!makeFullScreen);
+
+ KToggleFullScreenAction::setFullScreen(this, makeFullScreen);
+
+ for (int i = 0; i < count(); i++)
+ webWindow(i)->setWidgetsHidden(makeFullScreen);
+}
+
+
+bool TabWidget::isPrivateBrowsingWindowMode()
+{
+ return _isPrivateBrowsing;
+}
+
+
+void TabWidget::loadFavorite(const int index)
+{
+ QStringList urls = ReKonfig::previewUrls();
+ if (index < 0 || index > urls.length())
+ return;
+
+ KUrl url = KUrl(urls.at(index - 1));
+ loadUrl(url);
+ currentWebWindow()->setFocus();
+}
+
+
+// NOTE: For internal purpose only ------------------------------------------------------
+
+
+int TabWidget::addTab(QWidget *page, const QString &label)
+{
+ setUpdatesEnabled(false);
+ int i = KTabWidget::addTab(page, label);
+ setUpdatesEnabled(true);
+
+ return i;
+}
+
+
+int TabWidget::addTab(QWidget *page, const QIcon &icon, const QString &label)
+{
+ setUpdatesEnabled(false);
+ int i = KTabWidget::addTab(page, icon, label);
+ setUpdatesEnabled(true);
+
+ return i;
+}
+
+
+int TabWidget::insertTab(int index, QWidget *page, const QString &label)
+{
+ if (! ReKonfig::openNewTabsNextToCurrent())
+ index = -1;
+ setUpdatesEnabled(false);
+ int i = KTabWidget::insertTab(index, page, label);
+ setUpdatesEnabled(true);
+
+ return i;
+}
+
+
+int TabWidget::insertTab(int index, QWidget *page, const QIcon &icon, const QString &label)
+{
+ if (! ReKonfig::openNewTabsNextToCurrent())
+ index = -1;
+ setUpdatesEnabled(false);
+ int i = KTabWidget::insertTab(index, page, icon, label);
+ setUpdatesEnabled(true);
+
+ return i;
+}
+
+
+// --------------------------------------------------------------------------------------