|
|
|
// -*- c-basic-offset:4; indent-tabs-mode:nil -*-
|
|
|
|
// vim: set ts=4 sts=4 sw=4 et:
|
|
|
|
/* 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., 51 Franklin Street, Fifth Floor,
|
|
|
|
Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "kbookmarkmenu.h"
|
|
|
|
#include "kbookmarkmenu_p.h"
|
|
|
|
#include "kbookmarkimporter.h"
|
|
|
|
#include "kbookmarkimporter_opera.h"
|
|
|
|
#include "kbookmarkimporter_ie.h"
|
|
|
|
#include "kbookmarkdrag.h"
|
|
|
|
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <kdialogbase.h>
|
|
|
|
#include <kiconloader.h>
|
|
|
|
#include <klineedit.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kmessagebox.h>
|
|
|
|
#include <kpopupmenu.h>
|
|
|
|
#include <kstdaccel.h>
|
|
|
|
#include <kstdaction.h>
|
|
|
|
#include <kstringhandler.h>
|
|
|
|
|
|
|
|
#include <tqclipboard.h>
|
|
|
|
#include <tqfile.h>
|
|
|
|
#include <tqheader.h>
|
|
|
|
#include <tqlabel.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqlineedit.h>
|
|
|
|
#include <tqlistview.h>
|
|
|
|
#include <tqpushbutton.h>
|
|
|
|
|
|
|
|
#include <dptrtemplate.h>
|
|
|
|
|
|
|
|
template class TQPtrList<KBookmarkMenu>;
|
|
|
|
|
|
|
|
static TQString makeTextNodeMod(KBookmark bk, const TQString &m_nodename, const TQString &m_newText) {
|
|
|
|
TQDomNode subnode = bk.internalElement().namedItem(m_nodename);
|
|
|
|
if (subnode.isNull()) {
|
|
|
|
subnode = bk.internalElement().ownerDocument().createElement(m_nodename);
|
|
|
|
bk.internalElement().appendChild(subnode);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (subnode.firstChild().isNull()) {
|
|
|
|
TQDomText domtext = subnode.ownerDocument().createTextNode("");
|
|
|
|
subnode.appendChild(domtext);
|
|
|
|
}
|
|
|
|
|
|
|
|
TQDomText domtext = subnode.firstChild().toText();
|
|
|
|
|
|
|
|
TQString m_oldText = domtext.data();
|
|
|
|
domtext.setData(m_newText);
|
|
|
|
|
|
|
|
return m_oldText;
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
KBookmarkMenu::KBookmarkMenu( KBookmarkManager* mgr,
|
|
|
|
KBookmarkOwner * _owner, KPopupMenu * _parentMenu,
|
|
|
|
KActionCollection *collec, bool _isRoot, bool _add,
|
|
|
|
const TQString & parentAddress )
|
|
|
|
: TQObject(),
|
|
|
|
m_bIsRoot(_isRoot), m_bAddBookmark(_add),
|
|
|
|
m_bAddShortcuts(true),
|
|
|
|
m_pManager(mgr), m_pOwner(_owner),
|
|
|
|
m_parentMenu( _parentMenu ),
|
|
|
|
m_actionCollection( collec ),
|
|
|
|
m_parentAddress( parentAddress )
|
|
|
|
{
|
|
|
|
m_parentMenu->setKeyboardShortcutsEnabled( true );
|
|
|
|
|
|
|
|
m_lstSubMenus.setAutoDelete( true );
|
|
|
|
m_actions.setAutoDelete( true );
|
|
|
|
|
|
|
|
if (m_actionCollection)
|
|
|
|
{
|
|
|
|
m_actionCollection->setHighlightingEnabled(true);
|
|
|
|
disconnect( m_actionCollection, TQT_SIGNAL( actionHighlighted( KAction * ) ), 0, 0 );
|
|
|
|
connect( m_actionCollection, TQT_SIGNAL( actionHighlighted( KAction * ) ),
|
|
|
|
this, TQT_SLOT( slotActionHighlighted( KAction * ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_bNSBookmark = m_parentAddress.isNull();
|
|
|
|
if ( !m_bNSBookmark ) // not for the netscape bookmark
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::KBookmarkMenu " << this << " address : " << m_parentAddress << endl;
|
|
|
|
|
|
|
|
connect( _parentMenu, TQT_SIGNAL( aboutToShow() ),
|
|
|
|
TQT_SLOT( slotAboutToShow() ) );
|
|
|
|
|
|
|
|
if ( KBookmarkSettings::self()->m_contextmenu )
|
|
|
|
{
|
|
|
|
(void) _parentMenu->contextMenu();
|
|
|
|
connect( _parentMenu, TQT_SIGNAL( aboutToShowContextMenu(KPopupMenu*, int, TQPopupMenu*) ),
|
|
|
|
this, TQT_SLOT( slotAboutToShowContextMenu(KPopupMenu*, int, TQPopupMenu*) ));
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( m_bIsRoot )
|
|
|
|
{
|
|
|
|
connect( m_pManager, TQT_SIGNAL( changed(const TQString &, const TQString &) ),
|
|
|
|
TQT_SLOT( slotBookmarksChanged(const TQString &) ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// add entries that possibly have a shortcut, so they are available _before_ first popup
|
|
|
|
if ( m_bIsRoot )
|
|
|
|
{
|
|
|
|
if ( m_bAddBookmark )
|
|
|
|
{
|
|
|
|
addAddBookmark();
|
|
|
|
if ( extOwner() )
|
|
|
|
addAddBookmarksList(); // FIXME
|
|
|
|
}
|
|
|
|
|
|
|
|
addEditBookmarks();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_bDirty = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
KBookmarkMenu::~KBookmarkMenu()
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::~KBookmarkMenu() " << this << endl;
|
|
|
|
TQPtrListIterator<KAction> it( m_actions );
|
|
|
|
for (; it.current(); ++it )
|
|
|
|
it.current()->unplugAll();
|
|
|
|
|
|
|
|
m_lstSubMenus.clear();
|
|
|
|
m_actions.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::ensureUpToDate()
|
|
|
|
{
|
|
|
|
slotAboutToShow();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotAboutToShow()
|
|
|
|
{
|
|
|
|
// Did the bookmarks change since the last time we showed them ?
|
|
|
|
if ( m_bDirty )
|
|
|
|
{
|
|
|
|
m_bDirty = false;
|
|
|
|
refill();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KBookmarkMenu::s_highlightedAddress;
|
|
|
|
TQString KBookmarkMenu::s_highlightedImportType;
|
|
|
|
TQString KBookmarkMenu::s_highlightedImportLocation;
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotActionHighlighted( KAction* action )
|
|
|
|
{
|
|
|
|
if (action->isA("KBookmarkActionMenu") || action->isA("KBookmarkAction"))
|
|
|
|
{
|
|
|
|
s_highlightedAddress = action->property("address").toString();
|
|
|
|
//kdDebug() << "KBookmarkMenu::slotActionHighlighted" << s_highlightedAddress << endl;
|
|
|
|
}
|
|
|
|
else if (action->isA("KImportedBookmarksActionMenu"))
|
|
|
|
{
|
|
|
|
s_highlightedImportType = action->property("type").toString();
|
|
|
|
s_highlightedImportLocation = action->property("location").toString();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s_highlightedAddress = TQString::null;
|
|
|
|
s_highlightedImportType = TQString::null;
|
|
|
|
s_highlightedImportLocation = TQString::null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
class KBookmarkMenuRMBAssoc : public dPtrTemplate<KBookmarkMenu, RMB> { };
|
|
|
|
template<> TQPtrDict<RMB>* dPtrTemplate<KBookmarkMenu, RMB>::d_ptr = 0;
|
|
|
|
|
|
|
|
static RMB* rmbSelf(KBookmarkMenu *m) { return KBookmarkMenuRMBAssoc::d(m); }
|
|
|
|
|
|
|
|
// TODO check via dcop before making any changes to the bookmarks file???
|
|
|
|
|
|
|
|
void RMB::begin_rmb_action(KBookmarkMenu *self)
|
|
|
|
{
|
|
|
|
RMB *s = rmbSelf(self);
|
|
|
|
s->recv = self;
|
|
|
|
s->m_parentAddress = self->m_parentAddress;
|
|
|
|
s->s_highlightedAddress = KBookmarkMenu::s_highlightedAddress;
|
|
|
|
s->m_pManager = self->m_pManager;
|
|
|
|
s->m_pOwner = self->m_pOwner;
|
|
|
|
s->m_parentMenu = self->m_parentMenu;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool RMB::invalid( int val )
|
|
|
|
{
|
|
|
|
bool valid = true;
|
|
|
|
|
|
|
|
if (val == 1)
|
|
|
|
s_highlightedAddress = m_parentAddress;
|
|
|
|
|
|
|
|
if (s_highlightedAddress.isNull())
|
|
|
|
valid = false;
|
|
|
|
|
|
|
|
return !valid;
|
|
|
|
}
|
|
|
|
|
|
|
|
KBookmark RMB::atAddress(const TQString & address)
|
|
|
|
{
|
|
|
|
KBookmark bookmark = m_pManager->tqfindByAddress( address );
|
|
|
|
Q_ASSERT(!bookmark.isNull());
|
|
|
|
return bookmark;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotAboutToShowContextMenu( KPopupMenu*, int, TQPopupMenu* contextMenu )
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::slotAboutToShowContextMenu" << s_highlightedAddress << endl;
|
|
|
|
if (s_highlightedAddress.isNull())
|
|
|
|
{
|
|
|
|
KPopupMenu::contextMenuFocus()->hideContextMenu();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
contextMenu->clear();
|
|
|
|
fillContextMenu( contextMenu, s_highlightedAddress, 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::fillContextMenu( TQPopupMenu* contextMenu, const TQString & address, int val )
|
|
|
|
{
|
|
|
|
KBookmark bookmark = atAddress(address);
|
|
|
|
|
|
|
|
int id;
|
|
|
|
|
|
|
|
// binner:
|
|
|
|
// "Add Bookmark Here" when pointing at a bookmark looks strange and if you
|
|
|
|
// call it you have to close and reopen the menu to see an entry was added?
|
|
|
|
//
|
|
|
|
// TODO rename these, but, message freeze... umm...
|
|
|
|
|
|
|
|
// if (bookmark.isGroup()) {
|
|
|
|
id = contextMenu->insertItem( SmallIcon("bookmark_add"), i18n( "Add Bookmark Here" ), recv, TQT_SLOT(slotRMBActionInsert(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
/* }
|
|
|
|
else
|
|
|
|
{
|
|
|
|
id = contextMenu->insertItem( SmallIcon("bookmark_add"), i18n( "Add Bookmark Here" ), recv, TQT_SLOT(slotRMBActionInsert(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::fillContextMenu2( TQPopupMenu* contextMenu, const TQString & address, int val )
|
|
|
|
{
|
|
|
|
KBookmark bookmark = atAddress(address);
|
|
|
|
|
|
|
|
int id;
|
|
|
|
|
|
|
|
if (bookmark.isGroup()) {
|
|
|
|
id = contextMenu->insertItem( i18n( "Open Folder in Bookmark Editor" ), recv, TQT_SLOT(slotRMBActionEditAt(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
contextMenu->insertSeparator();
|
|
|
|
id = contextMenu->insertItem( SmallIcon("editdelete"), i18n( "Delete Folder" ), recv, TQT_SLOT(slotRMBActionRemove(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
contextMenu->insertSeparator();
|
|
|
|
id = contextMenu->insertItem( i18n( "Properties" ), recv, TQT_SLOT(slotRMBActionProperties(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
id = contextMenu->insertItem( i18n( "Copy Link Address" ), recv, TQT_SLOT(slotRMBActionCopyLocation(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
contextMenu->insertSeparator();
|
|
|
|
id = contextMenu->insertItem( SmallIcon("editdelete"), i18n( "Delete Bookmark" ), recv, TQT_SLOT(slotRMBActionRemove(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
contextMenu->insertSeparator();
|
|
|
|
id = contextMenu->insertItem( i18n( "Properties" ), recv, TQT_SLOT(slotRMBActionProperties(int)) );
|
|
|
|
contextMenu->setItemParameter( id, val );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::slotRMBActionEditAt( int val )
|
|
|
|
{
|
|
|
|
kdDebug(7043) << "KBookmarkMenu::slotRMBActionEditAt" << s_highlightedAddress << endl;
|
|
|
|
if (invalid(val)) { hidePopup(); return; }
|
|
|
|
|
|
|
|
KBookmark bookmark = atAddress(s_highlightedAddress);
|
|
|
|
|
|
|
|
m_pManager->slotEditBookmarksAtAddress( s_highlightedAddress );
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::slotRMBActionProperties( int val )
|
|
|
|
{
|
|
|
|
kdDebug(7043) << "KBookmarkMenu::slotRMBActionProperties" << s_highlightedAddress << endl;
|
|
|
|
if (invalid(val)) { hidePopup(); return; }
|
|
|
|
|
|
|
|
KBookmark bookmark = atAddress(s_highlightedAddress);
|
|
|
|
|
|
|
|
TQString folder = bookmark.isGroup() ? TQString::null : bookmark.url().pathOrURL();
|
|
|
|
KBookmarkEditDialog dlg( bookmark.fullText(), folder,
|
|
|
|
m_pManager, KBookmarkEditDialog::ModifyMode, 0,
|
|
|
|
0, 0, i18n("Bookmark Properties") );
|
|
|
|
if ( dlg.exec() != KDialogBase::Accepted )
|
|
|
|
return;
|
|
|
|
|
|
|
|
makeTextNodeMod(bookmark, "title", dlg.finalTitle());
|
|
|
|
if ( !dlg.finalUrl().isNull() )
|
|
|
|
{
|
|
|
|
KURL u = KURL::fromPathOrURL(dlg.finalUrl());
|
|
|
|
bookmark.internalElement().setAttribute("href", u.url(0, 106));
|
|
|
|
}
|
|
|
|
|
|
|
|
kdDebug(7043) << "Requested move to " << dlg.finalAddress() << "!" << endl;
|
|
|
|
|
|
|
|
KBookmarkGroup parentBookmark = atAddress(m_parentAddress).toGroup();
|
|
|
|
m_pManager->emitChanged( parentBookmark );
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::slotRMBActionInsert( int val )
|
|
|
|
{
|
|
|
|
kdDebug(7043) << "KBookmarkMenu::slotRMBActionInsert" << s_highlightedAddress << endl;
|
|
|
|
if (invalid(val)) { hidePopup(); return; }
|
|
|
|
|
|
|
|
TQString url = m_pOwner->currentURL();
|
|
|
|
if (url.isEmpty())
|
|
|
|
{
|
|
|
|
KMessageBox::error( 0L, i18n("Cannot add bookmark with empty URL."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
TQString title = m_pOwner->currentTitle();
|
|
|
|
if (title.isEmpty())
|
|
|
|
title = url;
|
|
|
|
|
|
|
|
KBookmark bookmark = atAddress( s_highlightedAddress );
|
|
|
|
|
|
|
|
// TODO use unique title
|
|
|
|
|
|
|
|
if (bookmark.isGroup())
|
|
|
|
{
|
|
|
|
KBookmarkGroup parentBookmark = bookmark.toGroup();
|
|
|
|
Q_ASSERT(!parentBookmark.isNull());
|
|
|
|
parentBookmark.addBookmark( m_pManager, title, KURL( url ) );
|
|
|
|
m_pManager->emitChanged( parentBookmark );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
KBookmarkGroup parentBookmark = bookmark.parentGroup();
|
|
|
|
Q_ASSERT(!parentBookmark.isNull());
|
|
|
|
KBookmark newBookmark = parentBookmark.addBookmark( m_pManager, title, KURL( url ) );
|
|
|
|
parentBookmark.moveItem( newBookmark, parentBookmark.previous(bookmark) );
|
|
|
|
m_pManager->emitChanged( parentBookmark );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::slotRMBActionRemove( int val )
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::slotRMBActionRemove" << s_highlightedAddress << endl;
|
|
|
|
if (invalid(val)) { hidePopup(); return; }
|
|
|
|
|
|
|
|
KBookmark bookmark = atAddress( s_highlightedAddress );
|
|
|
|
bool folder = bookmark.isGroup();
|
|
|
|
|
|
|
|
if (KMessageBox::warningContinueCancel(
|
|
|
|
m_parentMenu,
|
|
|
|
folder ? i18n("Are you sure you wish to remove the bookmark folder\n\"%1\"?").arg(bookmark.text())
|
|
|
|
: i18n("Are you sure you wish to remove the bookmark\n\"%1\"?").arg(bookmark.text()),
|
|
|
|
folder ? i18n("Bookmark Folder Deletion")
|
|
|
|
: i18n("Bookmark Deletion"),
|
|
|
|
KStdGuiItem::del())
|
|
|
|
!= KMessageBox::Continue
|
|
|
|
)
|
|
|
|
return;
|
|
|
|
|
|
|
|
KBookmarkGroup parentBookmark = atAddress( m_parentAddress ).toGroup();
|
|
|
|
parentBookmark.deleteBookmark( bookmark );
|
|
|
|
m_pManager->emitChanged( parentBookmark );
|
|
|
|
if (m_parentMenu)
|
|
|
|
m_parentMenu->hide();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::slotRMBActionCopyLocation( int val )
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::slotRMBActionCopyLocation" << s_highlightedAddress << endl;
|
|
|
|
if (invalid(val)) { hidePopup(); return; }
|
|
|
|
|
|
|
|
KBookmark bookmark = atAddress( s_highlightedAddress );
|
|
|
|
|
|
|
|
if ( !bookmark.isGroup() )
|
|
|
|
{
|
|
|
|
kapp->clipboard()->setData( KBookmarkDrag::newDrag(bookmark, 0),
|
|
|
|
QClipboard::Selection );
|
|
|
|
kapp->clipboard()->setData( KBookmarkDrag::newDrag(bookmark, 0),
|
|
|
|
QClipboard::Clipboard );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void RMB::hidePopup() {
|
|
|
|
KPopupMenu::contextMenuFocus()->hideContextMenu();
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
void KBookmarkMenu::fillContextMenu( TQPopupMenu* contextMenu, const TQString & address, int val )
|
|
|
|
{
|
|
|
|
RMB::begin_rmb_action(this);
|
|
|
|
rmbSelf(this)->fillContextMenu(contextMenu, address, val);
|
|
|
|
emit aboutToShowContextMenu( rmbSelf(this)->atAddress(address), contextMenu);
|
|
|
|
rmbSelf(this)->fillContextMenu2(contextMenu, address, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotRMBActionEditAt( int val )
|
|
|
|
{ RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionEditAt( val ); }
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotRMBActionProperties( int val )
|
|
|
|
{ RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionProperties( val ); }
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotRMBActionInsert( int val )
|
|
|
|
{ RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionInsert( val ); }
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotRMBActionRemove( int val )
|
|
|
|
{ RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionRemove( val ); }
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotRMBActionCopyLocation( int val )
|
|
|
|
{ RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionCopyLocation( val ); }
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotBookmarksChanged( const TQString & groupAddress )
|
|
|
|
{
|
|
|
|
if (m_bNSBookmark)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( groupAddress == m_parentAddress )
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::slotBookmarksChanged -> setting m_bDirty on " << groupAddress << endl;
|
|
|
|
m_bDirty = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Iterate recursively into child menus
|
|
|
|
TQPtrListIterator<KBookmarkMenu> it( m_lstSubMenus );
|
|
|
|
for (; it.current(); ++it )
|
|
|
|
{
|
|
|
|
it.current()->slotBookmarksChanged( groupAddress );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::refill()
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "KBookmarkMenu::refill()" << endl;
|
|
|
|
m_lstSubMenus.clear();
|
|
|
|
|
|
|
|
TQPtrListIterator<KAction> it( m_actions );
|
|
|
|
for (; it.current(); ++it )
|
|
|
|
it.current()->unplug( m_parentMenu );
|
|
|
|
|
|
|
|
m_parentMenu->clear();
|
|
|
|
m_actions.clear();
|
|
|
|
|
|
|
|
fillBookmarkMenu();
|
|
|
|
m_parentMenu->adjustSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::addAddBookmarksList()
|
|
|
|
{
|
|
|
|
if (!kapp->authorizeKAction("bookmarks"))
|
|
|
|
return;
|
|
|
|
|
|
|
|
TQString title = i18n( "Bookmark Tabs as Folder..." );
|
|
|
|
|
|
|
|
KAction * paAddBookmarksList = new KAction( title,
|
|
|
|
"bookmarks_list_add",
|
|
|
|
0,
|
|
|
|
this,
|
|
|
|
TQT_SLOT( slotAddBookmarksList() ),
|
|
|
|
m_actionCollection, m_bIsRoot ? "add_bookmarks_list" : 0 );
|
|
|
|
|
|
|
|
paAddBookmarksList->setToolTip( i18n( "Add a folder of bookmarks for all open tabs." ) );
|
|
|
|
|
|
|
|
paAddBookmarksList->plug( m_parentMenu );
|
|
|
|
m_actions.append( paAddBookmarksList );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::addAddBookmark()
|
|
|
|
{
|
|
|
|
if (!kapp->authorizeKAction("bookmarks"))
|
|
|
|
return;
|
|
|
|
|
|
|
|
TQString title = i18n( "Add Bookmark" );
|
|
|
|
|
|
|
|
KAction * paAddBookmarks = new KAction( title,
|
|
|
|
"bookmark_add",
|
|
|
|
m_bIsRoot && m_bAddShortcuts ? KStdAccel::addBookmark() : KShortcut(),
|
|
|
|
this,
|
|
|
|
TQT_SLOT( slotAddBookmark() ),
|
|
|
|
m_actionCollection, m_bIsRoot ? "add_bookmark" : 0 );
|
|
|
|
|
|
|
|
paAddBookmarks->setToolTip( i18n( "Add a bookmark for the current document" ) );
|
|
|
|
|
|
|
|
paAddBookmarks->plug( m_parentMenu );
|
|
|
|
m_actions.append( paAddBookmarks );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::addEditBookmarks()
|
|
|
|
{
|
|
|
|
if (!kapp->authorizeKAction("bookmarks"))
|
|
|
|
return;
|
|
|
|
|
|
|
|
KAction * m_paEditBookmarks = KStdAction::editBookmarks( m_pManager, TQT_SLOT( slotEditBookmarks() ),
|
|
|
|
m_actionCollection, "edit_bookmarks" );
|
|
|
|
m_paEditBookmarks->plug( m_parentMenu );
|
|
|
|
m_paEditBookmarks->setToolTip( i18n( "Edit your bookmark collection in a separate window" ) );
|
|
|
|
m_actions.append( m_paEditBookmarks );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::addNewFolder()
|
|
|
|
{
|
|
|
|
if (!kapp->authorizeKAction("bookmarks"))
|
|
|
|
return;
|
|
|
|
|
|
|
|
TQString title = i18n( "&New Bookmark Folder..." );
|
|
|
|
int p;
|
|
|
|
while ( ( p = title.tqfind( '&' ) ) >= 0 )
|
|
|
|
title.remove( p, 1 );
|
|
|
|
|
|
|
|
KAction * paNewFolder = new KAction( title,
|
|
|
|
"folder_new", //"folder",
|
|
|
|
0,
|
|
|
|
this,
|
|
|
|
TQT_SLOT( slotNewFolder() ),
|
|
|
|
m_actionCollection );
|
|
|
|
|
|
|
|
paNewFolder->setToolTip( i18n( "Create a new bookmark folder in this menu" ) );
|
|
|
|
|
|
|
|
paNewFolder->plug( m_parentMenu );
|
|
|
|
m_actions.append( paNewFolder );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::fillBookmarkMenu()
|
|
|
|
{
|
|
|
|
if (!kapp->authorizeKAction("bookmarks"))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( m_bIsRoot )
|
|
|
|
{
|
|
|
|
if ( m_bAddBookmark )
|
|
|
|
{
|
|
|
|
addAddBookmark();
|
|
|
|
if ( extOwner() )
|
|
|
|
addAddBookmarksList(); // FIXME
|
|
|
|
}
|
|
|
|
|
|
|
|
addEditBookmarks();
|
|
|
|
|
|
|
|
if ( m_bAddBookmark && !KBookmarkSettings::self()->m_advancedaddbookmark )
|
|
|
|
addNewFolder();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( m_bIsRoot
|
|
|
|
&& KBookmarkManager::userBookmarksFile() == m_pManager->path() )
|
|
|
|
{
|
|
|
|
bool haveSep = false;
|
|
|
|
|
|
|
|
TQValueList<TQString> keys = KBookmarkMenu::dynamicBookmarksList();
|
|
|
|
TQValueList<TQString>::const_iterator it;
|
|
|
|
for ( it = keys.begin(); it != keys.end(); ++it )
|
|
|
|
{
|
|
|
|
DynMenuInfo info;
|
|
|
|
info = showDynamicBookmarks((*it));
|
|
|
|
|
|
|
|
if ( !info.show || !TQFile::exists( info.location ) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (!haveSep)
|
|
|
|
{
|
|
|
|
m_parentMenu->insertSeparator();
|
|
|
|
haveSep = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
KActionMenu * actionMenu;
|
|
|
|
actionMenu = new KImportedBookmarksActionMenu(
|
|
|
|
info.name, info.type,
|
|
|
|
m_actionCollection, "kbookmarkmenu" );
|
|
|
|
|
|
|
|
actionMenu->setProperty( "type", info.type );
|
|
|
|
actionMenu->setProperty( "location", info.location );
|
|
|
|
|
|
|
|
actionMenu->plug( m_parentMenu );
|
|
|
|
m_actions.append( actionMenu );
|
|
|
|
|
|
|
|
KBookmarkMenu *subMenu =
|
|
|
|
new KBookmarkMenu( m_pManager, m_pOwner, actionMenu->popupMenu(),
|
|
|
|
m_actionCollection, false,
|
|
|
|
m_bAddBookmark, TQString::null );
|
|
|
|
connect( subMenu, TQT_SIGNAL( openBookmark( const TQString &, Qt::ButtonState ) ),
|
|
|
|
this, TQT_SIGNAL( openBookmark( const TQString &, Qt::ButtonState ) ));
|
|
|
|
m_lstSubMenus.append(subMenu);
|
|
|
|
|
|
|
|
connect(actionMenu->popupMenu(), TQT_SIGNAL(aboutToShow()), subMenu, TQT_SLOT(slotNSLoad()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
KBookmarkGroup parentBookmark = m_pManager->tqfindByAddress( m_parentAddress ).toGroup();
|
|
|
|
Q_ASSERT(!parentBookmark.isNull());
|
|
|
|
bool separatorInserted = false;
|
|
|
|
for ( KBookmark bm = parentBookmark.first(); !bm.isNull(); bm = parentBookmark.next(bm) )
|
|
|
|
{
|
|
|
|
TQString text = KStringHandler::csqueeze(bm.fullText(), 60);
|
|
|
|
text.tqreplace( '&', "&&" );
|
|
|
|
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(7043) << "Creating URL bookmark menu item for " << bm.text() << endl;
|
|
|
|
KAction * action = new KBookmarkAction( text, bm.icon(), 0, m_actionCollection, 0 );
|
|
|
|
connect(action, TQT_SIGNAL( activated ( KAction::ActivationReason, Qt::ButtonState )),
|
|
|
|
this, TQT_SLOT( slotBookmarkSelected( KAction::ActivationReason, Qt::ButtonState ) ));
|
|
|
|
|
|
|
|
action->setProperty( "url", bm.url().url() );
|
|
|
|
action->setProperty( "address", bm.address() );
|
|
|
|
|
|
|
|
action->setToolTip( bm.url().pathOrURL() );
|
|
|
|
|
|
|
|
action->plug( m_parentMenu );
|
|
|
|
m_actions.append( action );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//kdDebug(7043) << "Creating bookmark submenu named " << bm.text() << endl;
|
|
|
|
KActionMenu * actionMenu = new KBookmarkActionMenu( text, bm.icon(),
|
|
|
|
m_actionCollection,
|
|
|
|
"kbookmarkmenu" );
|
|
|
|
actionMenu->setProperty( "address", bm.address() );
|
|
|
|
actionMenu->plug( m_parentMenu );
|
|
|
|
m_actions.append( actionMenu );
|
|
|
|
|
|
|
|
KBookmarkMenu *subMenu = new KBookmarkMenu( m_pManager, m_pOwner, actionMenu->popupMenu(),
|
|
|
|
m_actionCollection, false,
|
|
|
|
m_bAddBookmark,
|
|
|
|
bm.address() );
|
|
|
|
|
|
|
|
connect(subMenu, TQT_SIGNAL( aboutToShowContextMenu( const KBookmark &, TQPopupMenu * ) ),
|
|
|
|
this, TQT_SIGNAL( aboutToShowContextMenu( const KBookmark &, TQPopupMenu * ) ));
|
|
|
|
connect(subMenu, TQT_SIGNAL( openBookmark( const TQString &, Qt::ButtonState ) ),
|
|
|
|
this, TQT_SIGNAL( openBookmark( const TQString &, Qt::ButtonState ) ));
|
|
|
|
m_lstSubMenus.append( subMenu );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !m_bIsRoot && m_bAddBookmark )
|
|
|
|
{
|
|
|
|
if ( m_parentMenu->count() > 0 )
|
|
|
|
m_parentMenu->insertSeparator();
|
|
|
|
|
|
|
|
if ( KBookmarkSettings::self()->m_quickactions )
|
|
|
|
{
|
|
|
|
KActionMenu * actionMenu = new KActionMenu( i18n("Quick Actions"), m_actionCollection, 0L );
|
|
|
|
fillContextMenu( actionMenu->popupMenu(), m_parentAddress, 1 );
|
|
|
|
actionMenu->plug( m_parentMenu );
|
|
|
|
m_actions.append( actionMenu );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
addAddBookmark();
|
|
|
|
if ( extOwner() )
|
|
|
|
addAddBookmarksList(); // FIXME
|
|
|
|
addNewFolder();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotAddBookmarksList()
|
|
|
|
{
|
|
|
|
KExtendedBookmarkOwner *extOwner = dynamic_cast<KExtendedBookmarkOwner*>(m_pOwner);
|
|
|
|
if (!extOwner)
|
|
|
|
{
|
|
|
|
kdWarning() << "erm, sorry ;-)" << endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
KExtendedBookmarkOwner::QStringPairList list;
|
|
|
|
extOwner->fillBookmarksList( list );
|
|
|
|
|
|
|
|
KBookmarkGroup parentBookmark = m_pManager->tqfindByAddress( m_parentAddress ).toGroup();
|
|
|
|
Q_ASSERT(!parentBookmark.isNull());
|
|
|
|
KBookmarkGroup group = parentBookmark.createNewFolder( m_pManager );
|
|
|
|
if ( group.isNull() )
|
|
|
|
return; // user canceled i guess
|
|
|
|
|
|
|
|
KExtendedBookmarkOwner::QStringPairList::const_iterator it;
|
|
|
|
for ( it = list.begin(); it != list.end(); ++it )
|
|
|
|
group.addBookmark( m_pManager, (*it).first, KURL((*it).second) );
|
|
|
|
|
|
|
|
m_pManager->emitChanged( parentBookmark );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotAddBookmark()
|
|
|
|
{
|
|
|
|
KBookmarkGroup parentBookmark;
|
|
|
|
parentBookmark = m_pManager->addBookmarkDialog(m_pOwner->currentURL(), m_pOwner->currentTitle(), m_parentAddress);
|
|
|
|
if (!parentBookmark.isNull())
|
|
|
|
m_pManager->emitChanged( parentBookmark );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotNewFolder()
|
|
|
|
{
|
|
|
|
if ( !m_pOwner ) return; // this view doesn't handle bookmarks...
|
|
|
|
KBookmarkGroup parentBookmark = m_pManager->tqfindByAddress( 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 KBookmarkMenu::slotBookmarkSelected( KAction::ActivationReason /*reason*/, Qt::ButtonState state )
|
|
|
|
{
|
|
|
|
kdDebug(7043) << "KBookmarkMenu::slotBookmarkSelected()" << endl;
|
|
|
|
if ( !m_pOwner ) return; // this view doesn't handle bookmarks...
|
|
|
|
const KAction* action = dynamic_cast<const KAction *>(sender());
|
|
|
|
if(action)
|
|
|
|
{
|
|
|
|
const TQString& url = sender()->property("url").toString();
|
|
|
|
m_pOwner->openBookmarkURL( url );
|
|
|
|
emit openBookmark( url, state );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotBookmarkSelected()
|
|
|
|
{
|
|
|
|
slotBookmarkSelected(KAction::PopupMenuActivation, Qt::NoButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
KExtendedBookmarkOwner* KBookmarkMenu::extOwner()
|
|
|
|
{
|
|
|
|
return dynamic_cast<KExtendedBookmarkOwner*>(m_pOwner);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::slotNSLoad()
|
|
|
|
{
|
|
|
|
// only fill menu once
|
|
|
|
m_parentMenu->disconnect(TQT_SIGNAL(aboutToShow()));
|
|
|
|
|
|
|
|
// not NSImporter, but kept old name for BC reasons
|
|
|
|
KBookmarkMenuNSImporter importer( m_pManager, this, m_actionCollection );
|
|
|
|
importer.openBookmarks(s_highlightedImportLocation, s_highlightedImportType);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
KBookmarkEditFields::KBookmarkEditFields(TQWidget *main, TQBoxLayout *vbox, FieldsSet fieldsSet)
|
|
|
|
{
|
|
|
|
bool isF = (fieldsSet != FolderFieldsSet);
|
|
|
|
|
|
|
|
TQGridLayout *grid = new TQGridLayout( vbox, 2, isF ? 2 : 1 );
|
|
|
|
|
|
|
|
m_title = new KLineEdit( main );
|
|
|
|
grid->addWidget( m_title, 0, 1 );
|
|
|
|
grid->addWidget( new TQLabel( m_title, i18n( "Name:" ), main ), 0, 0 );
|
|
|
|
m_title->setFocus();
|
|
|
|
if (isF)
|
|
|
|
{
|
|
|
|
m_url = new KLineEdit( main );
|
|
|
|
grid->addWidget( m_url, 1, 1 );
|
|
|
|
grid->addWidget( new TQLabel( m_url, i18n( "Location:" ), main ), 1, 0 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_url = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
main->setMinimumSize( 300, 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkEditFields::setName(const TQString &str)
|
|
|
|
{
|
|
|
|
m_title->setText(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkEditFields::setLocation(const TQString &str)
|
|
|
|
{
|
|
|
|
m_url->setText(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
// TODO - make the dialog use Properties as a title when in Modify mode... (dirk noticed the bug...)
|
|
|
|
KBookmarkEditDialog::KBookmarkEditDialog(const TQString& title, const TQString& url, KBookmarkManager * mgr, BookmarkEditType editType, const TQString& address,
|
|
|
|
TQWidget * parent, const char * name, const TQString& caption )
|
|
|
|
: KDialogBase(parent, name, true, caption,
|
|
|
|
(editType == InsertionMode) ? (User1|Ok|Cancel) : (Ok|Cancel),
|
|
|
|
Ok, false, KGuiItem()),
|
|
|
|
m_folderTree(0), m_mgr(mgr), m_editType(editType), m_address(address)
|
|
|
|
{
|
|
|
|
setButtonOK( (editType == InsertionMode) ? KGuiItem( i18n( "&Add" ), "bookmark_add") : i18n( "&Update" ) );
|
|
|
|
if (editType == InsertionMode) {
|
|
|
|
setButtonGuiItem( User1, KGuiItem( i18n( "&New Folder..." ), "folder_new") );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool folder = url.isNull();
|
|
|
|
|
|
|
|
m_main = new TQWidget( this );
|
|
|
|
setMainWidget( m_main );
|
|
|
|
|
|
|
|
TQBoxLayout *vbox = new TQVBoxLayout( m_main, 0, spacingHint() );
|
|
|
|
KBookmarkEditFields::FieldsSet fs =
|
|
|
|
folder ? KBookmarkEditFields::FolderFieldsSet
|
|
|
|
: KBookmarkEditFields::BookmarkFieldsSet;
|
|
|
|
m_fields = new KBookmarkEditFields(m_main, vbox, fs);
|
|
|
|
m_fields->setName(title);
|
|
|
|
if ( !folder )
|
|
|
|
m_fields->setLocation(url);
|
|
|
|
|
|
|
|
if ( editType == InsertionMode )
|
|
|
|
{
|
|
|
|
m_folderTree = KBookmarkFolderTree::createTree( m_mgr, m_main, name, m_address );
|
|
|
|
connect( m_folderTree, TQT_SIGNAL( doubleClicked(TQListViewItem*) ),
|
|
|
|
this, TQT_SLOT( slotDoubleClicked(TQListViewItem*) ) );
|
|
|
|
vbox->addWidget( m_folderTree );
|
|
|
|
connect( this, TQT_SIGNAL( user1Clicked() ), TQT_SLOT( slotUser1() ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkEditDialog::slotDoubleClicked( TQListViewItem* item )
|
|
|
|
{
|
|
|
|
Q_ASSERT( m_folderTree );
|
|
|
|
m_folderTree->setCurrentItem( item );
|
|
|
|
accept();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkEditDialog::slotOk()
|
|
|
|
{
|
|
|
|
accept();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkEditDialog::slotCancel()
|
|
|
|
{
|
|
|
|
reject();
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KBookmarkEditDialog::finalAddress() const
|
|
|
|
{
|
|
|
|
Q_ASSERT( m_folderTree );
|
|
|
|
return KBookmarkFolderTree::selectedAddress( m_folderTree );
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KBookmarkEditDialog::finalUrl() const
|
|
|
|
{
|
|
|
|
return m_fields->m_url ? m_fields->m_url->text() : TQString::null;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KBookmarkEditDialog::finalTitle() const
|
|
|
|
{
|
|
|
|
return m_fields->m_title ? m_fields->m_title->text() : TQString::null;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkEditDialog::slotUser1()
|
|
|
|
{
|
|
|
|
// kdDebug(7043) << "KBookmarkEditDialog::slotUser1" << endl;
|
|
|
|
Q_ASSERT( m_folderTree );
|
|
|
|
|
|
|
|
TQString address = KBookmarkFolderTree::selectedAddress( m_folderTree );
|
|
|
|
if ( address.isNull() ) return;
|
|
|
|
KBookmarkGroup bm = m_mgr->tqfindByAddress( address ).toGroup();
|
|
|
|
Q_ASSERT(!bm.isNull());
|
|
|
|
Q_ASSERT(m_editType == InsertionMode);
|
|
|
|
|
|
|
|
KBookmarkGroup group = bm.createNewFolder( m_mgr );
|
|
|
|
if ( !group.isNull() )
|
|
|
|
{
|
|
|
|
KBookmarkGroup parentGroup = group.parentGroup();
|
|
|
|
m_mgr->emitChanged( parentGroup );
|
|
|
|
}
|
|
|
|
KBookmarkFolderTree::fillTree( m_folderTree, m_mgr );
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
static void fillGroup( TQListView* listview, KBookmarkFolderTreeItem * parentItem, KBookmarkGroup group, bool expandOpenGroups = true, const TQString& address = TQString::null )
|
|
|
|
{
|
|
|
|
bool noSubGroups = true;
|
|
|
|
KBookmarkFolderTreeItem * lastItem = 0L;
|
|
|
|
KBookmarkFolderTreeItem * item = 0L;
|
|
|
|
for ( KBookmark bk = group.first() ; !bk.isNull() ; bk = group.next(bk) )
|
|
|
|
{
|
|
|
|
if ( bk.isGroup() )
|
|
|
|
{
|
|
|
|
KBookmarkGroup grp = bk.toGroup();
|
|
|
|
item = new KBookmarkFolderTreeItem( parentItem, lastItem, grp );
|
|
|
|
fillGroup( listview, item, grp, expandOpenGroups, address );
|
|
|
|
if ( expandOpenGroups && grp.isOpen() )
|
|
|
|
item->setOpen( true );
|
|
|
|
lastItem = item;
|
|
|
|
noSubGroups = false;
|
|
|
|
}
|
|
|
|
if (bk.address() == address) {
|
|
|
|
listview->setCurrentItem( lastItem );
|
|
|
|
listview->ensureItemVisible( item );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( noSubGroups ) {
|
|
|
|
parentItem->setOpen( true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQListView* KBookmarkFolderTree::createTree( KBookmarkManager* mgr, TQWidget* parent, const char* name, const TQString& address )
|
|
|
|
{
|
|
|
|
TQListView *listview = new TQListView( parent, name );
|
|
|
|
|
|
|
|
listview->setRootIsDecorated( false );
|
|
|
|
listview->header()->hide();
|
|
|
|
listview->addColumn( i18n("Bookmark"), 200 );
|
|
|
|
listview->setSorting( -1, false );
|
|
|
|
listview->setSelectionMode( TQListView::Single );
|
|
|
|
listview->setAllColumnsShowFocus( true );
|
|
|
|
listview->setResizeMode( TQListView::AllColumns );
|
|
|
|
listview->setMinimumSize( 60, 100 );
|
|
|
|
|
|
|
|
fillTree( listview, mgr, address );
|
|
|
|
|
|
|
|
return listview;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkFolderTree::fillTree( TQListView *listview, KBookmarkManager* mgr, const TQString& address )
|
|
|
|
{
|
|
|
|
listview->clear();
|
|
|
|
|
|
|
|
KBookmarkGroup root = mgr->root();
|
|
|
|
KBookmarkFolderTreeItem * rootItem = new KBookmarkFolderTreeItem( listview, root );
|
|
|
|
listview->setCurrentItem( rootItem );
|
|
|
|
rootItem->setSelected( true );
|
|
|
|
fillGroup( listview, rootItem, root, (address == root.groupAddress() || address.isNull()) ? true : false, address );
|
|
|
|
rootItem->setOpen( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
static KBookmarkFolderTreeItem* ft_cast( TQListViewItem *i )
|
|
|
|
{
|
|
|
|
return static_cast<KBookmarkFolderTreeItem*>( i );
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KBookmarkFolderTree::selectedAddress( TQListView *listview )
|
|
|
|
{
|
|
|
|
if ( !listview)
|
|
|
|
return TQString::null;
|
|
|
|
KBookmarkFolderTreeItem *item = ft_cast( listview->currentItem() );
|
|
|
|
return item ? item->m_bookmark.address() : TQString::null;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkFolderTree::setAddress( TQListView *listview, const TQString & address )
|
|
|
|
{
|
|
|
|
KBookmarkFolderTreeItem* it = ft_cast( listview->firstChild() );
|
|
|
|
while ( true ) {
|
|
|
|
kdDebug(7043) << it->m_bookmark.address() << endl;
|
|
|
|
it = ft_cast( it->itemBelow() );
|
|
|
|
if ( !it )
|
|
|
|
return;
|
|
|
|
if ( it->m_bookmark.address() == address )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
it->setSelected( true );
|
|
|
|
listview->setCurrentItem( it );
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
// toplevel item
|
|
|
|
KBookmarkFolderTreeItem::KBookmarkFolderTreeItem( TQListView *parent, const KBookmark & gp )
|
|
|
|
: TQListViewItem(parent, i18n("Bookmarks")), m_bookmark(gp)
|
|
|
|
{
|
|
|
|
setPixmap(0, SmallIcon("bookmark"));
|
|
|
|
setExpandable(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
// group
|
|
|
|
KBookmarkFolderTreeItem::KBookmarkFolderTreeItem( KBookmarkFolderTreeItem *parent, TQListViewItem *after, const KBookmarkGroup & gp )
|
|
|
|
: TQListViewItem(parent, after, gp.fullText()), m_bookmark(gp)
|
|
|
|
{
|
|
|
|
setPixmap(0, SmallIcon( gp.icon() ) );
|
|
|
|
setExpandable(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
// NOTE - KBookmarkMenuNSImporter is really === KBookmarkMenuImporter
|
|
|
|
// i.e, it is _not_ ns specific. and in KDE4 it should be renamed.
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::openNSBookmarks()
|
|
|
|
{
|
|
|
|
openBookmarks( KNSBookmarkImporter::netscapeBookmarksFile(), "netscape" );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::openBookmarks( const TQString &location, const TQString &type )
|
|
|
|
{
|
|
|
|
mstack.push(m_menu);
|
|
|
|
|
|
|
|
KBookmarkImporterBase *importer = KBookmarkImporterBase::factory(type);
|
|
|
|
if (!importer)
|
|
|
|
return;
|
|
|
|
importer->setFilename(location);
|
|
|
|
connectToImporter(*importer);
|
|
|
|
importer->parse();
|
|
|
|
|
|
|
|
delete importer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::connectToImporter(const TQObject &importer)
|
|
|
|
{
|
|
|
|
connect( &importer, TQT_SIGNAL( newBookmark( const TQString &, const TQCString &, const TQString & ) ),
|
|
|
|
TQT_SLOT( newBookmark( const TQString &, const TQCString &, const TQString & ) ) );
|
|
|
|
connect( &importer, TQT_SIGNAL( newFolder( const TQString &, bool, const TQString & ) ),
|
|
|
|
TQT_SLOT( newFolder( const TQString &, bool, const TQString & ) ) );
|
|
|
|
connect( &importer, TQT_SIGNAL( newSeparator() ), TQT_SLOT( newSeparator() ) );
|
|
|
|
connect( &importer, TQT_SIGNAL( endFolder() ), TQT_SLOT( endFolder() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::newBookmark( const TQString & text, const TQCString & url, const TQString & )
|
|
|
|
{
|
|
|
|
TQString _text = KStringHandler::csqueeze(text);
|
|
|
|
_text.tqreplace( '&', "&&" );
|
|
|
|
KAction * action = new KBookmarkAction(_text, "html", 0, 0, "", m_actionCollection, 0);
|
|
|
|
connect(action, TQT_SIGNAL( activated ( KAction::ActivationReason, Qt::ButtonState )),
|
|
|
|
m_menu, TQT_SLOT( slotBookmarkSelected( KAction::ActivationReason, Qt::ButtonState ) ));
|
|
|
|
action->setProperty( "url", url );
|
|
|
|
action->setToolTip( url );
|
|
|
|
action->plug( mstack.top()->m_parentMenu );
|
|
|
|
mstack.top()->m_actions.append( action );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::newFolder( const TQString & text, bool, const TQString & )
|
|
|
|
{
|
|
|
|
TQString _text = KStringHandler::csqueeze(text);
|
|
|
|
_text.tqreplace( '&', "&&" );
|
|
|
|
KActionMenu * actionMenu = new KActionMenu( _text, "folder", m_actionCollection, 0L );
|
|
|
|
actionMenu->plug( mstack.top()->m_parentMenu );
|
|
|
|
mstack.top()->m_actions.append( actionMenu );
|
|
|
|
KBookmarkMenu *subMenu = new KBookmarkMenu( m_pManager, m_menu->m_pOwner, actionMenu->popupMenu(),
|
|
|
|
m_actionCollection, false,
|
|
|
|
m_menu->m_bAddBookmark, TQString::null );
|
|
|
|
connect( subMenu, TQT_SIGNAL( openBookmark( const TQString &, Qt::ButtonState ) ),
|
|
|
|
m_menu, TQT_SIGNAL( openBookmark( const TQString &, Qt::ButtonState ) ));
|
|
|
|
mstack.top()->m_lstSubMenus.append( subMenu );
|
|
|
|
|
|
|
|
mstack.push(subMenu);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::newSeparator()
|
|
|
|
{
|
|
|
|
mstack.top()->m_parentMenu->insertSeparator();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenuNSImporter::endFolder()
|
|
|
|
{
|
|
|
|
mstack.pop();
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
/********************************************************************/
|
|
|
|
|
|
|
|
KBookmarkMenu::DynMenuInfo KBookmarkMenu::showDynamicBookmarks( const TQString &id )
|
|
|
|
{
|
|
|
|
KConfig config("kbookmarkrc", false, false);
|
|
|
|
config.setGroup("Bookmarks");
|
|
|
|
|
|
|
|
DynMenuInfo info;
|
|
|
|
info.show = false;
|
|
|
|
|
|
|
|
if (!config.hasKey("DynamicMenus")) {
|
|
|
|
// upgrade path
|
|
|
|
if (id == "netscape") {
|
|
|
|
KBookmarkManager *manager = KBookmarkManager::userBookmarksManager();
|
|
|
|
info.show = manager->root().internalElement().attribute("hide_nsbk") != "yes";
|
|
|
|
info.location = KNSBookmarkImporter::netscapeBookmarksFile();
|
|
|
|
info.type = "netscape";
|
|
|
|
info.name = i18n("Netscape Bookmarks");
|
|
|
|
} // else, no show
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// have new version config
|
|
|
|
if (config.hasGroup("DynamicMenu-" + id)) {
|
|
|
|
config.setGroup("DynamicMenu-" + id);
|
|
|
|
info.show = config.readBoolEntry("Show");
|
|
|
|
info.location = config.readPathEntry("Location");
|
|
|
|
info.type = config.readEntry("Type");
|
|
|
|
info.name = config.readEntry("Name");
|
|
|
|
} // else, no show
|
|
|
|
}
|
|
|
|
|
|
|
|
return info;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQStringList KBookmarkMenu::dynamicBookmarksList()
|
|
|
|
{
|
|
|
|
KConfig config("kbookmarkrc", false, false);
|
|
|
|
config.setGroup("Bookmarks");
|
|
|
|
|
|
|
|
TQStringList mlist;
|
|
|
|
if (config.hasKey("DynamicMenus"))
|
|
|
|
mlist = config.readListEntry("DynamicMenus");
|
|
|
|
else
|
|
|
|
mlist << "netscape";
|
|
|
|
|
|
|
|
return mlist;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KBookmarkMenu::setDynamicBookmarks(const TQString &id, const DynMenuInfo &newMenu)
|
|
|
|
{
|
|
|
|
KConfig config("kbookmarkrc", false, false);
|
|
|
|
|
|
|
|
// add group unconditionally
|
|
|
|
config.setGroup("DynamicMenu-" + id);
|
|
|
|
config.writeEntry("Show", newMenu.show);
|
|
|
|
config.writePathEntry("Location", newMenu.location);
|
|
|
|
config.writeEntry("Type", newMenu.type);
|
|
|
|
config.writeEntry("Name", newMenu.name);
|
|
|
|
|
|
|
|
TQStringList elist;
|
|
|
|
|
|
|
|
config.setGroup("Bookmarks");
|
|
|
|
if (!config.hasKey("DynamicMenus")) {
|
|
|
|
if (newMenu.type != "netscape") {
|
|
|
|
// update from old xbel method to new rc method
|
|
|
|
// though only if not writing the netscape setting
|
|
|
|
config.setGroup("DynamicMenu-" "netscape");
|
|
|
|
DynMenuInfo xbelSetting;
|
|
|
|
xbelSetting = showDynamicBookmarks("netscape");
|
|
|
|
config.writeEntry("Show", xbelSetting.show);
|
|
|
|
config.writePathEntry("Location", xbelSetting.location);
|
|
|
|
config.writeEntry("Type", xbelSetting.type);
|
|
|
|
config.writeEntry("Name", xbelSetting.name);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
elist = config.readListEntry("DynamicMenus");
|
|
|
|
}
|
|
|
|
|
|
|
|
// make sure list includes type
|
|
|
|
config.setGroup("Bookmarks");
|
|
|
|
if (elist.tqcontains(id) < 1) {
|
|
|
|
elist << id;
|
|
|
|
config.writeEntry("DynamicMenus", elist);
|
|
|
|
}
|
|
|
|
|
|
|
|
config.sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "kbookmarkmenu.moc"
|
|
|
|
#include "kbookmarkmenu_p.moc"
|