File indexing completed on 2024-04-28 08:51:02

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