diff options
Diffstat (limited to 'klinkstatus/src/ui/tabwidgetsession.cpp')
| -rw-r--r-- | klinkstatus/src/ui/tabwidgetsession.cpp | 274 | 
1 files changed, 274 insertions, 0 deletions
| diff --git a/klinkstatus/src/ui/tabwidgetsession.cpp b/klinkstatus/src/ui/tabwidgetsession.cpp new file mode 100644 index 00000000..9d9033a7 --- /dev/null +++ b/klinkstatus/src/ui/tabwidgetsession.cpp @@ -0,0 +1,274 @@ +/*************************************************************************** + *   Copyright (C) 2004 by Paulo Moura Guedes                              * + *   moura@kdewebdev.org                                                        * + *                                                                         * + *   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.                                   * + *                                                                         * + *   This program is distributed in the hope that it will be useful,       * + *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * + *   GNU General Public License for more details.                          * + *                                                                         * + *   You should have received a copy of the GNU General Public License     * + *   along with this program; if not, write to the                         * + *   Free Software Foundation, Inc.,                                       * + *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             * + ***************************************************************************/ +#include "tabwidgetsession.h" +#include "sessionwidget.h" +#include "klsconfig.h" +#include "treeview.h" +#include "../engine/searchmanager.h" +#include "../actionmanager.h" + +#include <qtoolbutton.h> +#include <qcursor.h> +#include <qtooltip.h> +#include <qpushbutton.h> +#include <qpixmap.h> +#include <qiconset.h> +#include <qstringlist.h> + +#include <kapplication.h> +#include <kstandarddirs.h> +#include <klocale.h> +#include <kstringhandler.h>  +#include <kcharsets.h> +#include <kmimetype.h> +#include <kaction.h> +#include <kiconloader.h> + + +TabWidgetSession::TabWidgetSession(QWidget* parent, const char* name, WFlags f) +        : KTabWidget(parent, name, f) // tabs_ is initialized with size 17 +{ +    setFocusPolicy(QTabWidget::NoFocus); +    setMargin(0); +    setTabReorderingEnabled(true); +    setHoverCloseButton(true); +    setHoverCloseButtonDelayed(true); +     +    tabs_.setAutoDelete(false); +     +    QToolButton* tabs_new = new QToolButton(this); +    tabs_new->setAccel(QKeySequence("Ctrl+N")); +    connect(tabs_new, SIGNAL(clicked()), this, SLOT(slotNewSession())); +    tabs_new->setIconSet(SmallIconSet("tab_new_raised")); +    tabs_new->adjustSize(); +    QToolTip::add(tabs_new, i18n("Open new tab")); +    setCornerWidget(tabs_new, TopLeft); + +    tabs_close_ = new QToolButton(this); +    tabs_close_->setAccel(QKeySequence("Ctrl+W")); +    connect(tabs_close_, SIGNAL(clicked()), this, SLOT(closeSession())); +    tabs_close_->setIconSet(SmallIconSet("tab_remove")); +    tabs_close_->adjustSize(); +    QToolTip::add(tabs_close_, i18n("Close the current tab")); +    setCornerWidget(tabs_close_, TopRight); + +    connect(this, SIGNAL(currentChanged(QWidget*)), this, SLOT(slotCurrentChanged(QWidget*))); +} + +TabWidgetSession::~TabWidgetSession() +{} + +SessionWidget* TabWidgetSession::currentSession() const +{ +    return tabs_[currentPageIndex()]; +} + +bool TabWidgetSession::emptySessionsExist() const +{ +    if(count() == 0) +        return true; + +    for(int i = 0; i != count(); ++i) +    { +        Q_ASSERT(tabs_[i]); +        if(tabs_[i]->isEmpty() && !tabs_[i]->getSearchManager()->searching()) +            return true; +    } +    return false; +} + +SessionWidget* TabWidgetSession::getEmptySession() const +{ +    Q_ASSERT(emptySessionsExist()); +    Q_ASSERT(count() != 0); + +    for(uint i = 0; i != tabs_.count(); ++i) +    { +        if(tabs_[i]->isEmpty()) +            return tabs_[i]; +    } +    return 0; +} + +// Remember to use count() and not size() +QIntDict<SessionWidget> const& TabWidgetSession::sessions() const +{ +    return tabs_; +} + +SessionWidget* TabWidgetSession::newSession() +{ +    // TODO: settings: number of connections, timeout +    SessionWidget* session_widget = newSessionWidget(); +    connect(session_widget, SIGNAL(signalUpdateTabLabel(const LinkStatus *, SessionWidget*)), +            this, SLOT(updateTabLabel(const LinkStatus *, SessionWidget*))); + +    insertTab(session_widget, i18n("Session") + i18n(QString::number(count() + 1).ascii())); +     +    tabs_.insert(count() - 1, session_widget); +    Q_ASSERT(tabs_[count() - 1]); +    setCurrentPage(count() - 1); + +    return session_widget; +} + +SessionWidget* TabWidgetSession::newSession(KURL const& url) +{ +    SessionWidget* sessionwidget = newSession(); +    currentSession()->setUrl(url); + +    return sessionwidget; +} + +void TabWidgetSession::closeSession() +{ +    if(count() > 1) +        removePage(currentPage()); + +    tabs_close_->setEnabled(count() > 1); +    ActionManager::getInstance()->action("close_tab")->setEnabled(count() > 1); +} + +SessionWidget* TabWidgetSession::newSessionWidget() +{ +    SessionWidget* session_widget = new SessionWidget(KLSConfig::maxConnectionsNumber(),  +            KLSConfig::timeOut(), this, QString("session_widget-" + count())); + +    QStringList columns; +     +    columns.push_back(TreeView::URL_LABEL); +    columns.push_back(TreeView::STATUS_LABEL); +    if(KLSConfig::showMarkupStatus()) +        columns.push_back(TreeView::MARKUP_LABEL); +    columns.push_back(TreeView::LINK_LABEL_LABEL); +     +    session_widget->setColumns(columns); + +    session_widget->tree_view->restoreLayout(KLSConfig::self()->config(), "klinkstatus"); + +    return session_widget; +} + +void TabWidgetSession::updateTabLabel(LinkStatus const* linkstatus, SessionWidget* page) +{ +    QString label; +    KURL url = linkstatus->absoluteUrl(); +     +    if(linkstatus->hasHtmlDocTitle()) +    { +        label = linkstatus->htmlDocTitle(); +        label = KStringHandler::csqueeze(label, 30); +    } +    else +    { +        if(url.fileName(false).isEmpty()) +            label = url.prettyURL(); +        else +            label = url.fileName(false); +         +        label = KStringHandler::lsqueeze(label, 30);         +    } +     +    changeTab(page, KCharsets::resolveEntities(label)); +    setTabIconSet(page, QIconSet(KMimeType::pixmapForURL(url))); +} + +void TabWidgetSession::slotLoadSettings() +{ +    for(uint i = 0; i != tabs_.count(); ++i) +    { +        if(tabs_[i]->isEmpty()) +        { +            SessionWidget* session_widget = tabs_[i]; +            if(session_widget->isEmpty()) +                session_widget->slotLoadSettings(true); +            else +                session_widget->slotLoadSettings(false); +        } +    } +} + +void TabWidgetSession::setUrl(KURL const& url) +{ +    currentSession()->setUrl(url); +} + +void TabWidgetSession::slotCurrentChanged(QWidget* /*page*/) +{ +    tabs_close_->setEnabled(count() > 1); + +    SessionWidget* session_widget = currentSession(); +    ActionManager::getInstance()->slotUpdateSessionWidgetActions(session_widget); +} + +void TabWidgetSession::slotHideSearchPanel() +{ +    currentSession()->slotHideSearchPanel(); +} + +void TabWidgetSession::slotFollowLastLinkChecked() +{ +    currentSession()->slotFollowLastLinkChecked(); +} + +void TabWidgetSession::slotResetSearchOptions() +{ +    currentSession()->slotResetSearchOptions(); +} + +void TabWidgetSession::slotNewSession(KURL const& url) +{ +    if(count() == 0 || !emptySessionsExist()) +    { +        SessionWidget* sessionwidget = newSession(url); +        ActionManager::getInstance()->initSessionWidget(sessionwidget);         +    } +    else +    { +        SessionWidget* sessionwidget = getEmptySession(); +        sessionwidget->setUrl(url); +        showPage(sessionwidget); +    } + +    ActionManager::getInstance()->action("close_tab")->setEnabled(count() > 1); +} + +void TabWidgetSession::slotStartSearch() +{ +    currentSession()->slotStartSearch(); +} + +void TabWidgetSession::slotPauseSearch() +{ +    currentSession()->slotPauseSearch(); +} + +void TabWidgetSession::slotStopSearch() +{ +    currentSession()->slotStopSearch(); +} + +void TabWidgetSession::slotExportAsHTML() +{ +    currentSession()->slotExportAsHTML(); +} + + +#include "tabwidgetsession.moc" | 
