File indexing completed on 2024-04-21 04:58:14

0001 /* This file is part of the KDE project
0002     SPDX-FileCopyrightText: 1998, 1999 Michael Reiher <michael.reiher@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 // Own
0008 #include "konqframe.h"
0009 #include "konqurl.h"
0010 
0011 // Local
0012 #include "konqtabs.h"
0013 #include "konqview.h"
0014 #include "konqviewmanager.h"
0015 #include "konqframevisitor.h"
0016 #include "konqframestatusbar.h"
0017 #include "placeholderpart.h"
0018 
0019 // Qt
0020 #include <QApplication>
0021 #include <QVBoxLayout>
0022 #include <QUrl>
0023 
0024 // KDE
0025 #include <kactioncollection.h>
0026 #include "konqdebug.h"
0027 #include <kiconloader.h>
0028 #include <KLocalizedString>
0029 #include <ksqueezedtextlabel.h>
0030 #include <konq_events.h>
0031 #include <kconfiggroup.h>
0032 
0033 KonqFrameBase::KonqFrameBase()
0034     : m_pParentContainer(nullptr)
0035 {
0036 }
0037 
0038 QString KonqFrameBase::frameTypeToString(const KonqFrameBase::FrameType frameType)
0039 {
0040     switch (frameType) {
0041     case View :
0042         return QStringLiteral("View");
0043     case Tabs :
0044         return QStringLiteral("Tabs");
0045     case ContainerBase :
0046         return QStringLiteral("ContainerBase");
0047     case Container :
0048         return QStringLiteral("Container");
0049     case MainWindow :
0050         return QStringLiteral("MainWindow");
0051     }
0052     Q_ASSERT(0);
0053     return QString();
0054 }
0055 
0056 KonqFrameBase::FrameType frameTypeFromString(const QString &str)
0057 {
0058     if (str == QLatin1String("View")) {
0059         return KonqFrameBase::View;
0060     }
0061     if (str == QLatin1String("Tabs")) {
0062         return KonqFrameBase::Tabs;
0063     }
0064     if (str == QLatin1String("ContainerBase")) {
0065         return KonqFrameBase::ContainerBase;
0066     }
0067     if (str == QLatin1String("Container")) {
0068         return KonqFrameBase::Container;
0069     }
0070     if (str == QLatin1String("MainWindow")) {
0071         return KonqFrameBase::MainWindow;
0072     }
0073     Q_ASSERT(0);
0074     return KonqFrameBase::View;
0075 }
0076 
0077 KonqFrame::KonqFrame(QWidget *parent, KonqFrameContainerBase *parentContainer)
0078     : QWidget(parent)
0079 {
0080     //qCDebug(KONQUEROR_LOG) << "KonqFrame::KonqFrame()";
0081 
0082     m_pLayout = nullptr;
0083     m_pView = nullptr;
0084 
0085     // the frame statusbar
0086     m_pStatusBar = new KonqFrameStatusBar(this);
0087     m_pStatusBar->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
0088     connect(m_pStatusBar, &KonqFrameStatusBar::clicked, this, &KonqFrame::slotStatusBarClicked);
0089     connect(m_pStatusBar, &KonqFrameStatusBar::linkedViewClicked, this, &KonqFrame::slotLinkedViewClicked);
0090     m_separator = nullptr;
0091     m_pParentContainer = parentContainer;
0092 }
0093 
0094 KonqFrame::~KonqFrame()
0095 {
0096     //qCDebug(KONQUEROR_LOG) << this;
0097 }
0098 
0099 bool KonqFrame::isActivePart()
0100 {
0101     return (m_pView &&
0102             static_cast<KonqView *>(m_pView) == m_pView->mainWindow()->currentView());
0103 }
0104 
0105 void KonqFrame::saveConfig(KConfigGroup &config, const QString &prefix, const KonqFrameBase::Options &options, KonqFrameBase *docContainer, int /*id*/, int /*depth*/)
0106 {
0107     if (m_pView) {
0108         m_pView->saveConfig(config, prefix, options);
0109     }
0110     config.writeEntry( QString::fromLatin1( "ShowStatusBar" ).prepend( prefix ), statusbar()->isVisible() );
0111     if (this == docContainer) {
0112         config.writeEntry(QStringLiteral("docContainer").prepend(prefix), true);
0113     }
0114 }
0115 
0116 void KonqFrame::copyHistory(KonqFrameBase *other)
0117 {
0118     Q_ASSERT(other->frameType() == KonqFrameBase::View);
0119     if (m_pView) {
0120         m_pView->copyHistory(static_cast<KonqFrame *>(other)->childView());
0121     }
0122 }
0123 
0124 KParts::ReadOnlyPart *KonqFrame::attach(const KonqViewFactory &viewFactory, bool allowPlaceholder)
0125 {
0126     KonqViewFactory factory(viewFactory);
0127 
0128     // Note that we set the parent to 0.
0129     // We don't want that deleting the widget deletes the part automatically
0130     // because we already have that taken care of in KParts...
0131 
0132     if (!viewFactory.isNull()) {
0133         m_pPart = factory.create(this, nullptr);
0134     }
0135 
0136     if (!m_pPart) {
0137         if (allowPlaceholder) {
0138             m_pPart = new Konq::PlaceholderPart(nullptr);
0139         } else {
0140             qCWarning(KONQUEROR_LOG) << "No part was created!";
0141             return nullptr;
0142         }
0143     }
0144 
0145     if (!m_pPart->widget()) {
0146         qCWarning(KONQUEROR_LOG) << "The part" << m_pPart << "didn't create a widget!";
0147         delete m_pPart;
0148         m_pPart = nullptr;
0149         return nullptr;
0150     }
0151 
0152     attachWidget(m_pPart->widget());
0153 
0154     m_pStatusBar->slotConnectToNewView(nullptr, nullptr, m_pPart);
0155 
0156     return m_pPart;
0157 }
0158 
0159 void KonqFrame::attachWidget(QWidget *widget)
0160 {
0161     //qCDebug(KONQUEROR_LOG) << "KonqFrame::attachInternal()";
0162     delete m_pLayout;
0163 
0164     m_pLayout = new QVBoxLayout(this);
0165     m_pLayout->setObjectName(QStringLiteral("KonqFrame's QVBoxLayout"));
0166     m_pLayout->setContentsMargins(0, 0, 0, 0);
0167     m_pLayout->setSpacing(0);
0168 
0169     m_pLayout->addWidget(widget, 1);
0170     m_pLayout->addWidget(m_pStatusBar, 0);
0171     widget->show();
0172 
0173     m_pLayout->activate();
0174 
0175     installEventFilter(m_pView->mainWindow()); // for Ctrl+Tab
0176 }
0177 
0178 void KonqFrame::insertTopWidget(QWidget *widget)
0179 {
0180     Q_ASSERT(m_pLayout);
0181     Q_ASSERT(widget);
0182     m_pLayout->insertWidget(0, widget);
0183     installEventFilter(m_pView->mainWindow()); // for Ctrl+Tab
0184 }
0185 
0186 void KonqFrame::setView(KonqView *child)
0187 {
0188     m_pView = child;
0189     if (m_pView) {
0190         connect(m_pView, SIGNAL(sigPartChanged(KonqView*,KParts::ReadOnlyPart*,KParts::ReadOnlyPart*)),
0191                 m_pStatusBar, SLOT(slotConnectToNewView(KonqView*,KParts::ReadOnlyPart*,KParts::ReadOnlyPart*)));
0192     }
0193 }
0194 
0195 void KonqFrame::setTitle(const QString &title, QWidget * /*sender*/)
0196 {
0197     //qCDebug(KONQUEROR_LOG) << "KonqFrame::setTitle( " << title << " )";
0198     m_title = title;
0199     if (m_pParentContainer) {
0200         m_pParentContainer->setTitle(title, this);
0201     }
0202 }
0203 
0204 void KonqFrame::setTabIcon(const QUrl &url, QWidget * /*sender*/)
0205 {
0206     //qCDebug(KONQUEROR_LOG) << "KonqFrame::setTabIcon( " << url << " )";
0207     if (m_pParentContainer) {
0208         m_pParentContainer->setTabIcon(url, this);
0209     }
0210 }
0211 
0212 void KonqFrame::slotStatusBarClicked()
0213 {
0214     if (!isActivePart() && m_pView && !m_pView->isPassiveMode()) {
0215         m_pView->mainWindow()->viewManager()->setActivePart(part());
0216     }
0217 }
0218 
0219 void KonqFrame::slotLinkedViewClicked(bool mode)
0220 {
0221     if (m_pView->mainWindow()->linkableViewsCount() == 2) {
0222         m_pView->mainWindow()->slotLinkView();
0223     } else {
0224         m_pView->setLinkedView(mode);
0225     }
0226 }
0227 
0228 void KonqFrame::slotRemoveView()
0229 {
0230     m_pView->mainWindow()->viewManager()->removeView(m_pView);
0231 }
0232 
0233 void KonqFrame::activateChild()
0234 {
0235     if (m_pView && !m_pView->isPassiveMode()) {
0236         m_pView->mainWindow()->viewManager()->setActivePart(part());
0237 
0238         if (!m_pView->isLoading() && (m_pView->url().isEmpty() ||  KonqUrl::isKonqBlank(m_pView->url()))) {
0239             //qCDebug(KONQUEROR_LOG) << "SET FOCUS on the location bar";
0240             m_pView->mainWindow()->focusLocationBar(); // #84867 usability improvement
0241         }
0242     }
0243 }
0244 
0245 KonqView *KonqFrame::childView() const
0246 {
0247     return m_pView;
0248 }
0249 
0250 KonqView *KonqFrame::activeChildView() const
0251 {
0252     return m_pView;
0253 }
0254 
0255 bool KonqFrame::accept(KonqFrameVisitor *visitor)
0256 {
0257     return visitor->visit(this);
0258 }