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 }