File indexing completed on 2024-04-14 04:53:30

0001 /*
0002     SPDX-FileCopyrightText: 2007 Urs Wolfer <uwolfer@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "bookmarkmanager.h"
0008 #include "krdc_debug.h"
0009 #include "mainwindow.h"
0010 
0011 #include <KLocalizedString>
0012 
0013 #include <QStandardPaths>
0014 
0015 BookmarkManager::BookmarkManager(KActionCollection *collection, QMenu *menu, MainWindow *parent)
0016     : QObject(parent)
0017     , KBookmarkOwner()
0018     , m_mainWindow(parent)
0019 {
0020     const QString dir = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QString(), QStandardPaths::LocateOption::LocateDirectory);
0021     const QString file = dir + QLatin1String("krdc/bookmarks.xml");
0022 
0023 #if QT_VERSION_MAJOR < 6
0024     m_manager = KBookmarkManager::managerForFile(file, QLatin1String("krdc"));
0025     m_manager->setUpdate(true);
0026 #else
0027     m_manager = new KBookmarkManager(file, this);
0028 #endif
0029 
0030     m_bookmarkMenu = new KBookmarkMenu(m_manager, this, menu);
0031     collection->addActions(menu->actions());
0032 
0033     KBookmarkGroup root = m_manager->root();
0034     KBookmark bm = root.first();
0035     while (!bm.isNull()) {
0036         if (bm.metaDataItem(QLatin1String("krdc-history")) == QLatin1String("historyfolder")) // get it also when user renamed it
0037             break;
0038         bm = root.next(bm);
0039     }
0040 
0041     if (bm.isNull()) {
0042         qCDebug(KRDC) << "History folder not found. Create it.";
0043         bm = m_manager->root().createNewFolder(i18n("History"));
0044         bm.setMetaDataItem(QStringLiteral("krdc-history"), QStringLiteral("historyfolder"));
0045         m_manager->emitChanged();
0046     }
0047 
0048     m_historyGroup = bm.toGroup();
0049 }
0050 
0051 BookmarkManager::~BookmarkManager()
0052 {
0053     delete m_bookmarkMenu;
0054 }
0055 
0056 void BookmarkManager::addHistoryBookmark(RemoteView *view)
0057 {
0058     KBookmark bm = m_historyGroup.first();
0059     const QString urlString = urlForView(view);
0060     const QUrl url = QUrl::fromUserInput(urlString);
0061     while (!bm.isNull()) {
0062         if (bm.url() == url) {
0063             qCDebug(KRDC) << "Found URL. Move it at the history start.";
0064             m_historyGroup.moveBookmark(bm, KBookmark());
0065             bm.updateAccessMetadata();
0066             m_manager->emitChanged(m_historyGroup);
0067             return;
0068         }
0069         bm = m_historyGroup.next(bm);
0070     }
0071 
0072     if (bm.isNull()) {
0073         qCDebug(KRDC) << "Add new history bookmark.";
0074         bm = m_historyGroup.addBookmark(titleForUrl(url), url, QString());
0075         bm.updateAccessMetadata();
0076         m_historyGroup.moveBookmark(bm, KBookmark());
0077         m_manager->emitChanged(m_historyGroup);
0078     }
0079 }
0080 
0081 void BookmarkManager::openBookmark(const KBookmark &bm, Qt::MouseButtons, Qt::KeyboardModifiers)
0082 {
0083     Q_EMIT openUrl(bm.url());
0084 }
0085 
0086 void BookmarkManager::openFolderinTabs(const KBookmarkGroup &bookmarkGroup)
0087 {
0088     KBookmark bm = bookmarkGroup.first();
0089     while (!bm.isNull()) {
0090         Q_EMIT openUrl(bm.url());
0091         bm = bookmarkGroup.next(bm);
0092     }
0093 }
0094 
0095 bool BookmarkManager::addBookmarkEntry() const
0096 {
0097     return true;
0098 }
0099 
0100 bool BookmarkManager::editBookmarkEntry() const
0101 {
0102     return true;
0103 }
0104 
0105 QUrl BookmarkManager::currentUrl() const
0106 {
0107     RemoteView *view = m_mainWindow->currentRemoteView();
0108     if (view)
0109         return QUrl(urlForView(view));
0110     else
0111         return QUrl();
0112 }
0113 
0114 QString BookmarkManager::urlForView(RemoteView *view) const
0115 {
0116     return view->url().toDisplayString(QUrl::UrlFormattingOption::StripTrailingSlash);
0117 }
0118 
0119 QString BookmarkManager::currentTitle() const
0120 {
0121     return titleForUrl(currentUrl());
0122 }
0123 
0124 QString BookmarkManager::titleForUrl(const QUrl &url) const
0125 {
0126     return url.toDisplayString(QUrl::UrlFormattingOption::StripTrailingSlash);
0127 }
0128 
0129 bool BookmarkManager::supportsTabs() const
0130 {
0131     return true;
0132 }
0133 
0134 QList<KBookmarkOwner::FutureBookmark> BookmarkManager::currentBookmarkList() const
0135 {
0136     QList<KBookmarkOwner::FutureBookmark> list;
0137 
0138     QMapIterator<QWidget *, RemoteView *> iter(m_mainWindow->remoteViewList());
0139 
0140     while (iter.hasNext()) {
0141         RemoteView *next = iter.next().value();
0142         const QUrl url = next->url();
0143         const QString title = titleForUrl(url);
0144         KBookmarkOwner::FutureBookmark bookmark = KBookmarkOwner::FutureBookmark(title, url, QString());
0145         list.append(bookmark);
0146     }
0147 
0148     return list;
0149 }
0150 
0151 void BookmarkManager::addManualBookmark(const QUrl &url, const QString &text)
0152 {
0153     m_manager->root().addBookmark(text, url, QString());
0154     m_manager->emitChanged();
0155 }
0156 
0157 KBookmarkManager *BookmarkManager::getManager()
0158 {
0159     return m_manager;
0160 }
0161 
0162 const QStringList BookmarkManager::findBookmarkAddresses(const KBookmarkGroup &group, const QString &url)
0163 {
0164     QStringList bookmarkAddresses = QStringList();
0165     KBookmark bm = group.first();
0166     while (!bm.isNull()) {
0167         if (bm.isGroup()) {
0168             bookmarkAddresses.append(findBookmarkAddresses(bm.toGroup(), url));
0169         }
0170 
0171         if (bm.url() == QUrl::fromUserInput(url)) {
0172             bookmarkAddresses.append(bm.address());
0173         }
0174         bm = group.next(bm);
0175     }
0176     return bookmarkAddresses;
0177 }
0178 
0179 void BookmarkManager::removeByUrl(KBookmarkManager *manager, const QString &url, bool ignoreHistory, const QString &updateTitle)
0180 {
0181     const QStringList addresses = findBookmarkAddresses(manager->root(), url);
0182     for (const QString &address : addresses) {
0183         KBookmark bm = manager->findByAddress(address);
0184         if (ignoreHistory && bm.parentGroup().metaDataItem(QStringLiteral("krdc-history")) == QLatin1String("historyfolder")) {
0185             if (!updateTitle.isEmpty()) {
0186                 qCDebug(KRDC) << "Update" << bm.fullText();
0187                 bm.setFullText(updateTitle);
0188             }
0189         } else {
0190             if (!bm.isGroup()) { // please don't delete groups... happened in testing
0191                 qCDebug(KRDC) << "Delete" << bm.fullText();
0192                 bm.parentGroup().deleteBookmark(bm);
0193             }
0194         }
0195     }
0196 
0197     manager->emitChanged();
0198 }
0199 
0200 void BookmarkManager::updateTitle(KBookmarkManager *manager, const QString &url, const QString &title)
0201 {
0202     const QStringList addresses = findBookmarkAddresses(manager->root(), url);
0203     for (const QString &address : addresses) {
0204         KBookmark bm = manager->findByAddress(address);
0205         bm.setFullText(title);
0206         qCDebug(KRDC) << "Update" << bm.fullText();
0207     }
0208     manager->emitChanged();
0209 }