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