File indexing completed on 2024-05-19 03:55:15

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 1998, 1999 Torben Weis <weis@kde.org>
0004     SPDX-FileCopyrightText: 2006 Daniel Teske <teske@squorn.de>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "kbookmarkcontextmenu.h"
0010 #include "kbookmarkdialog.h"
0011 #include "kbookmarkmanager.h"
0012 #include "kbookmarkowner.h"
0013 #include "keditbookmarks_p.h"
0014 
0015 #include <QApplication>
0016 #include <QClipboard>
0017 #include <QMessageBox>
0018 #include <QMimeData>
0019 
0020 KBookmarkContextMenu::KBookmarkContextMenu(const KBookmark &bk, KBookmarkManager *manager, KBookmarkOwner *owner, QWidget *parent)
0021     : QMenu(parent)
0022     , bm(bk)
0023     , m_pManager(manager)
0024     , m_pOwner(owner)
0025 {
0026     connect(this, &QMenu::aboutToShow, this, &KBookmarkContextMenu::slotAboutToShow);
0027 }
0028 
0029 void KBookmarkContextMenu::slotAboutToShow()
0030 {
0031     addActions();
0032 }
0033 
0034 void KBookmarkContextMenu::addActions()
0035 {
0036     if (bm.isGroup()) {
0037         addOpenFolderInTabs();
0038         addBookmark();
0039         addFolderActions();
0040     } else {
0041         addBookmark();
0042         addBookmarkActions();
0043     }
0044 }
0045 
0046 KBookmarkContextMenu::~KBookmarkContextMenu()
0047 {
0048 }
0049 
0050 void KBookmarkContextMenu::addBookmark()
0051 {
0052     if (m_pOwner && m_pOwner->enableOption(KBookmarkOwner::ShowAddBookmark)) {
0053         addAction(QIcon::fromTheme(QStringLiteral("bookmark-new")), tr("Add Bookmark Here", "@action:inmenu"), this, &KBookmarkContextMenu::slotInsert);
0054     }
0055 }
0056 
0057 void KBookmarkContextMenu::addFolderActions()
0058 {
0059     addAction(tr("Open Folder in Bookmark Editor", "@action:inmenu"), this, &KBookmarkContextMenu::slotEditAt);
0060     addProperties();
0061     addSeparator();
0062     addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), tr("Delete Folder", "@action:inmenu"), this, &KBookmarkContextMenu::slotRemove);
0063 }
0064 
0065 void KBookmarkContextMenu::addProperties()
0066 {
0067     addAction(tr("Properties", "@action:inmenu"), this, &KBookmarkContextMenu::slotProperties);
0068 }
0069 
0070 void KBookmarkContextMenu::addBookmarkActions()
0071 {
0072     addAction(tr("Copy Link Address", "@action:inmenu"), this, &KBookmarkContextMenu::slotCopyLocation);
0073     addProperties();
0074     addSeparator();
0075     addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), tr("Delete Bookmark", "@action:inmenu"), this, &KBookmarkContextMenu::slotRemove);
0076 }
0077 
0078 void KBookmarkContextMenu::addOpenFolderInTabs()
0079 {
0080     if (m_pOwner->supportsTabs()) {
0081         addAction(QIcon::fromTheme(QStringLiteral("tab-new")), tr("Open Folder in Tabs", "@action:inmenu"), this, &KBookmarkContextMenu::slotOpenFolderInTabs);
0082     }
0083 }
0084 
0085 void KBookmarkContextMenu::slotEditAt()
0086 {
0087     // qCDebug(KBOOKMARKS_LOG) << "KBookmarkMenu::slotEditAt" << m_highlightedAddress;
0088     KEditBookmarks editBookmarks;
0089     editBookmarks.setBrowserMode(m_browserMode);
0090     auto result = editBookmarks.openForFileAtAddress(m_pManager->path(), bm.address());
0091 
0092     if (!result.sucess()) {
0093         QMessageBox::critical(QApplication::activeWindow(), QApplication::applicationDisplayName(), result.errorMessage());
0094     }
0095 }
0096 
0097 void KBookmarkContextMenu::slotProperties()
0098 {
0099     // qCDebug(KBOOKMARKS_LOG) << "KBookmarkMenu::slotProperties" << m_highlightedAddress;
0100 
0101     KBookmarkDialog *dlg = new KBookmarkDialog(m_pManager, QApplication::activeWindow());
0102     dlg->editBookmark(bm);
0103     delete dlg;
0104 }
0105 
0106 void KBookmarkContextMenu::slotInsert()
0107 {
0108     // qCDebug(KBOOKMARKS_LOG) << "KBookmarkMenu::slotInsert" << m_highlightedAddress;
0109 
0110     QUrl url = m_pOwner->currentUrl();
0111     if (url.isEmpty()) {
0112         QMessageBox::critical(QApplication::activeWindow(), QApplication::applicationName(), tr("Cannot add bookmark with empty URL.", "@info"));
0113         return;
0114     }
0115     QString title = m_pOwner->currentTitle();
0116     if (title.isEmpty()) {
0117         title = url.toDisplayString();
0118     }
0119 
0120     if (bm.isGroup()) {
0121         KBookmarkGroup parentBookmark = bm.toGroup();
0122         Q_ASSERT(!parentBookmark.isNull());
0123         parentBookmark.addBookmark(title, url, m_pOwner->currentIcon());
0124         m_pManager->emitChanged(parentBookmark);
0125     } else {
0126         KBookmarkGroup parentBookmark = bm.parentGroup();
0127         Q_ASSERT(!parentBookmark.isNull());
0128         KBookmark newBookmark = parentBookmark.addBookmark(title, m_pOwner->currentUrl(), m_pOwner->currentIcon());
0129         parentBookmark.moveBookmark(newBookmark, parentBookmark.previous(bm));
0130         m_pManager->emitChanged(parentBookmark);
0131     }
0132 }
0133 
0134 void KBookmarkContextMenu::slotRemove()
0135 {
0136     // qCDebug(KBOOKMARKS_LOG) << "KBookmarkMenu::slotRemove" << m_highlightedAddress;
0137 
0138     bool folder = bm.isGroup();
0139 
0140     if (QMessageBox::warning(QApplication::activeWindow(),
0141                              folder ? tr("Bookmark Folder Deletion", "@title:window") : tr("Bookmark Deletion", "@title:window"),
0142                              folder ? tr("Are you sure you wish to remove the bookmark folder\n\"%1\"?").arg(bm.text())
0143                                     : tr("Are you sure you wish to remove the bookmark\n\"%1\"?").arg(bm.text()),
0144                              QMessageBox::Yes | QMessageBox::Cancel)
0145         != QMessageBox::Yes) {
0146         return;
0147     }
0148 
0149     KBookmarkGroup parentBookmark = bm.parentGroup();
0150     parentBookmark.deleteBookmark(bm);
0151     m_pManager->emitChanged(parentBookmark);
0152 }
0153 
0154 void KBookmarkContextMenu::slotCopyLocation()
0155 {
0156     // qCDebug(KBOOKMARKS_LOG) << "KBookmarkMenu::slotCopyLocation" << m_highlightedAddress;
0157 
0158     if (!bm.isGroup()) {
0159         QMimeData *mimeData = new QMimeData;
0160         bm.populateMimeData(mimeData);
0161         QApplication::clipboard()->setMimeData(mimeData, QClipboard::Selection);
0162         mimeData = new QMimeData;
0163         bm.populateMimeData(mimeData);
0164         QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard);
0165     }
0166 }
0167 
0168 void KBookmarkContextMenu::slotOpenFolderInTabs()
0169 {
0170     owner()->openFolderinTabs(bookmark().toGroup());
0171 }
0172 
0173 KBookmarkManager *KBookmarkContextMenu::manager() const
0174 {
0175     return m_pManager;
0176 }
0177 
0178 KBookmarkOwner *KBookmarkContextMenu::owner() const
0179 {
0180     return m_pOwner;
0181 }
0182 
0183 KBookmark KBookmarkContextMenu::bookmark() const
0184 {
0185     return bm;
0186 }
0187 
0188 void KBookmarkContextMenu::setBrowserMode(bool browserMode)
0189 {
0190     m_browserMode = browserMode;
0191 }
0192 
0193 bool KBookmarkContextMenu::browserMode() const
0194 {
0195     return m_browserMode;
0196 }
0197 
0198 #include "moc_kbookmarkcontextmenu.cpp"