kcelbookmarkmenu.cpp
来自「celestia源代码」· C++ 代码 · 共 468 行
CPP
468 行
// -*- mode: c++; c-basic-offset: 2 -*-/* This file is part of the KDE project Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/#include <sys/types.h>#include <sys/stat.h>#include <assert.h>#include <dirent.h>#include <errno.h>#include <fcntl.h>#include <stddef.h>#include <stdlib.h>#include <unistd.h>#include "kcelbookmarkmenu.h"#include <kbookmarkmenu.h>#include "kbookmarkimporter.h"#include "kcelbookmarkowner.h"#include <qfile.h>#include <qregexp.h>#include <kaction.h>#include <kdebug.h>#include <klocale.h>#include <kmessagebox.h>#include <kpopupmenu.h>#include <kstdaccel.h>#include <kstdaction.h>template class QPtrList<KCelBookmarkMenu>;/******************************************************************** * * KCelBookmarkMenu * ********************************************************************/KCelBookmarkMenu::KCelBookmarkMenu( KBookmarkManager* mgr, KCelBookmarkOwner * _owner, KPopupMenu * _parentMenu, KActionCollection *collec, bool _isRoot, bool _add, const QString & parentAddress ) : m_bIsRoot(_isRoot), m_bAddBookmark(_add), m_pManager(mgr), m_pOwner(_owner), m_parentMenu( _parentMenu ), m_actionCollection( collec ), m_parentAddress( parentAddress ){ m_lstSubMenus.setAutoDelete( true ); m_actions.setAutoDelete( true ); m_bNSBookmark = m_parentAddress.isNull(); if ( !m_bNSBookmark ) // not for the netscape bookmark { //kdDebug(1203) << "KBookmarkMenu::KBookmarkMenu " << this << " address : " << m_parentAddress << endl; connect( _parentMenu, SIGNAL( aboutToShow() ), SLOT( slotAboutToShow() ) ); if ( m_bIsRoot ) { connect( m_pManager, SIGNAL( changed(const QString &, const QString &) ), SLOT( slotBookmarksChanged(const QString &) ) ); } } // add entries that possibly have a shortcut, so they are available _before_ first popup if ( m_bIsRoot ) { if ( m_bAddBookmark ) { addAddBookmark(); } addEditBookmarks(); } m_bDirty = true;}KCelBookmarkMenu::~KCelBookmarkMenu(){ //kdDebug(1203) << "KBookmarkMenu::~KBookmarkMenu() " << this << endl; QPtrListIterator<KAction> it( m_actions ); for (; it.current(); ++it ) it.current()->unplugAll(); m_lstSubMenus.clear(); m_actions.clear();}void KCelBookmarkMenu::ensureUpToDate(){ slotAboutToShow();}void KCelBookmarkMenu::slotAboutToShow(){ // Did the bookmarks change since the last time we showed them ? if ( m_bDirty ) { m_bDirty = false; refill(); }}void KCelBookmarkMenu::slotBookmarksChanged( const QString & groupAddress ){ if (m_bNSBookmark) return; if ( groupAddress == m_parentAddress ) { //kdDebug(1203) << "KBookmarkMenu::slotBookmarksChanged -> setting m_bDirty on " << groupAddress << endl; m_bDirty = true; } else { // Iterate recursively into child menus QPtrListIterator<KCelBookmarkMenu> it( m_lstSubMenus ); for (; it.current(); ++it ) { it.current()->slotBookmarksChanged( groupAddress ); } }}void KCelBookmarkMenu::refill(){ //kdDebug(1203) << "KBookmarkMenu::refill()" << endl; m_lstSubMenus.clear(); QPtrListIterator<KAction> it( m_actions ); for (; it.current(); ++it ) it.current()->unplug( m_parentMenu ); m_parentMenu->clear(); m_actions.clear(); fillBookmarkMenu(); m_parentMenu->adjustSize();}void KCelBookmarkMenu::addAddBookmark(){ KAction * paAddBookmarks = new KAction( i18n( "&Add Bookmark" ), "bookmark_add", m_bIsRoot ? ALT + Key_B : 0, this, SLOT( slotAddBookmark() ), m_actionCollection, m_bIsRoot ? "add_bookmark" : 0 ); paAddBookmarks->setStatusText( i18n( "Add a bookmark for the current document" ) ); paAddBookmarks->plug( m_parentMenu ); m_actions.append( paAddBookmarks ); addAddRelativeBookmark(); addAddSettingsBookmark();}void KCelBookmarkMenu::addAddRelativeBookmark(){ KAction * paAddBookmarks = new KAction( i18n( "Add &Relative Bookmark" ), "bookmark_add", m_bIsRoot ? ALT + Key_R : 0, //m_bIsRoot ? KStdAccel::addBookmark() : KShortcut(), this, SLOT( slotAddRelativeBookmark() ), m_actionCollection, m_bIsRoot ? "add_relative_bookmark" : 0 ); paAddBookmarks->setStatusText( i18n( "Add a relative bookmark for the current document" ) ); paAddBookmarks->plug( m_parentMenu ); m_actions.append( paAddBookmarks );}void KCelBookmarkMenu::addAddSettingsBookmark(){ KAction * paAddBookmarks = new KAction( i18n( "Add &Settings Bookmark" ), "bookmark_add", m_bIsRoot ? CTRL + ALT + Key_S : 0, //m_bIsRoot ? KStdAccel::addBookmark() : KShortcut(), this, SLOT( slotAddSettingsBookmark() ), m_actionCollection, m_bIsRoot ? "add_settings_bookmark" : 0 ); paAddBookmarks->setStatusText( i18n( "Add a settings bookmark for the current document" ) ); paAddBookmarks->plug( m_parentMenu ); m_actions.append( paAddBookmarks );}void KCelBookmarkMenu::addEditBookmarks(){ KAction * m_paEditBookmarks = KStdAction::editBookmarks( m_pManager, SLOT( slotEditBookmarks() ), m_actionCollection, "edit_bookmarks" ); m_paEditBookmarks->plug( m_parentMenu ); m_paEditBookmarks->setStatusText( i18n( "Edit your bookmark collection in a separate window" ) ); m_actions.append( m_paEditBookmarks );}void KCelBookmarkMenu::addNewFolder(){ KAction * paNewFolder = new KAction( i18n( "&New Folder..." ), "folder_new", //"folder", 0, this, SLOT( slotNewFolder() ), m_actionCollection ); paNewFolder->setStatusText( i18n( "Create a new bookmark folder in this menu" ) ); paNewFolder->plug( m_parentMenu ); m_actions.append( paNewFolder );}void KCelBookmarkMenu::fillBookmarkMenu(){ if ( m_bIsRoot ) { if ( m_bAddBookmark ) addAddBookmark(); addEditBookmarks(); if ( m_bAddBookmark ) addNewFolder(); } KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup(); Q_ASSERT(!parentBookmark.isNull()); bool separatorInserted = false; for ( KBookmark bm = parentBookmark.first(); !bm.isNull(); bm = parentBookmark.next(bm) ) { QString text = bm.text(); text.replace( QRegExp( "&" ), "&&" ); if ( !separatorInserted && m_bIsRoot) { // inserted before the first konq bookmark, to avoid the separator if no konq bookmark m_parentMenu->insertSeparator(); separatorInserted = true; } if ( !bm.isGroup() ) { if ( bm.isSeparator() ) { m_parentMenu->insertSeparator(); } else { // kdDebug(1203) << "Creating URL bookmark menu item for " << bm.text() << endl; // create a normal URL item, with ID as a name KAction * action = new KAction( text, bm.icon(), 0, this, SLOT( slotBookmarkSelected() ), m_actionCollection, bm.url().url().utf8() ); action->setStatusText( bm.url().prettyURL() ); action->plug( m_parentMenu ); m_actions.append( action ); } } else { // kdDebug(1203) << "Creating bookmark submenu named " << bm.text() << endl; KActionMenu * actionMenu = new KActionMenu( text, bm.icon(), m_actionCollection, 0L ); actionMenu->plug( m_parentMenu ); m_actions.append( actionMenu ); KCelBookmarkMenu *subMenu = new KCelBookmarkMenu( m_pManager, m_pOwner, actionMenu->popupMenu(), m_actionCollection, false, m_bAddBookmark, bm.address() ); m_lstSubMenus.append( subMenu ); } } if ( !m_bIsRoot && m_bAddBookmark ) { m_parentMenu->insertSeparator(); addAddBookmark(); addNewFolder(); }}void KCelBookmarkMenu::slotAddRelativeBookmark(){ Url Url = m_pOwner->currentUrl(Url::Relative); QString url = QString(Url.getAsString().c_str());; if (url.isEmpty()) { KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL")); return; } QString title = QString(Url.getName().c_str()); if (title.isEmpty()) title = url; KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup(); Q_ASSERT(!parentBookmark.isNull()); // If this title is already used, we'll try to find something unused. KBookmark ch = parentBookmark.first(); int count = 1; QString uniqueTitle = title; do { while ( !ch.isNull() ) { if ( uniqueTitle == ch.text() ) { // Title already used ! if ( url != ch.url().url() ) { uniqueTitle = title + QString(" (%1)").arg(++count); // New title -> restart search from the beginning ch = parentBookmark.first(); break; } else { // this exact URL already exists return; } } ch = parentBookmark.next( ch ); } } while ( !ch.isNull() ); parentBookmark.addBookmark( m_pManager, uniqueTitle, url, m_pOwner->currentIcon() ); m_pManager->emitChanged( parentBookmark );}void KCelBookmarkMenu::slotAddSettingsBookmark(){ Url Url = m_pOwner->currentUrl(Url::Settings); QString url = QString(Url.getAsString().c_str());; if (url.isEmpty()) { KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL")); return; } QString title = QString(Url.getName().c_str()); if (title.isEmpty()) title = url; KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup(); Q_ASSERT(!parentBookmark.isNull()); // If this title is already used, we'll try to find something unused. KBookmark ch = parentBookmark.first(); int count = 1; QString uniqueTitle = title; do { while ( !ch.isNull() ) { if ( uniqueTitle == ch.text() ) { // Title already used ! if ( url != ch.url().url() ) { uniqueTitle = title + QString(" (%1)").arg(++count); // New title -> restart search from the beginning ch = parentBookmark.first(); break; } else { // this exact URL already exists return; } } ch = parentBookmark.next( ch ); } } while ( !ch.isNull() ); parentBookmark.addBookmark( m_pManager, uniqueTitle, url, m_pOwner->currentIcon() ); m_pManager->emitChanged( parentBookmark );}void KCelBookmarkMenu::slotAddBookmark(){ Url Url = m_pOwner->currentUrl(Url::Absolute); QString url = QString(Url.getAsString().c_str());; if (url.isEmpty()) { KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL")); return; } QString title = QString(Url.getName().c_str()); if (title.isEmpty()) title = url; KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup(); Q_ASSERT(!parentBookmark.isNull()); // If this title is already used, we'll try to find something unused. KBookmark ch = parentBookmark.first(); int count = 1; QString uniqueTitle = title; do { while ( !ch.isNull() ) { if ( uniqueTitle == ch.text() ) { // Title already used ! if ( url != ch.url().url() ) { uniqueTitle = title + QString(" (%1)").arg(++count); // New title -> restart search from the beginning ch = parentBookmark.first(); break; } else { // this exact URL already exists return; } } ch = parentBookmark.next( ch ); } } while ( !ch.isNull() ); parentBookmark.addBookmark( m_pManager, uniqueTitle, url, m_pOwner->currentIcon() ); m_pManager->emitChanged( parentBookmark );}void KCelBookmarkMenu::slotNewFolder(){ if ( !m_pOwner ) return; // this view doesn't handle bookmarks... KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup(); Q_ASSERT(!parentBookmark.isNull()); KBookmarkGroup group = parentBookmark.createNewFolder( m_pManager ); if ( !group.isNull() ) { KBookmarkGroup parentGroup = group.parentGroup(); m_pManager->emitChanged( parentGroup ); }}void KCelBookmarkMenu::slotBookmarkSelected(){ //kdDebug(1203) << "KBookmarkMenu::slotBookmarkSelected()" << endl; if ( !m_pOwner ) return; // this view doesn't handle bookmarks... //kdDebug(1203) << sender()->name() << endl; // The name of the action is the URL to open m_pOwner->openBookmarkURL( QString::fromUtf8(sender()->name()) );}// -----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?