File indexing completed on 2025-04-27 04:37:42
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 }