00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "kbookmarkmenu.h"
00023
#include "kbookmarkmenu_p.h"
00024
#include "kbookmarkimporter.h"
00025
#include "kbookmarkimporter_opera.h"
00026
#include "kbookmarkimporter_ie.h"
00027
#include "kbookmarkdrag.h"
00028
00029
#include <qstring.h>
00030
#include <qlineedit.h>
00031
#include <qlabel.h>
00032
#include <kdialogbase.h>
00033
#include <qlayout.h>
00034
#include <qpushbutton.h>
00035
00036
#include <qclipboard.h>
00037
00038
#include <klineedit.h>
00039
00040
#include <qfile.h>
00041
00042
#include <kapplication.h>
00043
#include <kaction.h>
00044
#include <kdebug.h>
00045
#include <klocale.h>
00046
#include <kmessagebox.h>
00047
#include <kpopupmenu.h>
00048
#include <kstdaccel.h>
00049
#include <kstdaction.h>
00050
#include <kstringhandler.h>
00051
#include <kconfig.h>
00052
00053
#include <qlistview.h>
00054
#include <qheader.h>
00055
00056
#include <kiconloader.h>
00057
00058
#include <dptrtemplate.h>
00059
00060
template class QPtrList<KBookmarkMenu>;
00061
00062
static QString makeTextNodeMod(KBookmark bk,
const QString &m_nodename,
const QString &m_newText) {
00063
QDomNode subnode = bk.internalElement().namedItem(m_nodename);
00064
if (subnode.isNull()) {
00065 subnode = bk.internalElement().ownerDocument().createElement(m_nodename);
00066 bk.internalElement().appendChild(subnode);
00067 }
00068
00069
if (subnode.firstChild().isNull()) {
00070
QDomText domtext = subnode.ownerDocument().createTextNode(
"");
00071 subnode.appendChild(domtext);
00072 }
00073
00074
QDomText domtext = subnode.firstChild().toText();
00075
00076
QString m_oldText = domtext.data();
00077 domtext.setData(m_newText);
00078
00079
return m_oldText;
00080 }
00081
00082
00083
00084
00085
00086 KBookmarkMenu::KBookmarkMenu(
KBookmarkManager* mgr,
00087
KBookmarkOwner * _owner,
KPopupMenu * _parentMenu,
00088
KActionCollection *collec,
bool _isRoot,
bool _add,
00089
const QString & parentAddress )
00090 : m_bIsRoot(_isRoot), m_bAddBookmark(_add),
00091 m_bAddShortcuts(true),
00092 m_pManager(mgr), m_pOwner(_owner),
00093 m_parentMenu( _parentMenu ),
00094 m_actionCollection( collec ),
00095 m_parentAddress( parentAddress )
00096 {
00097
m_parentMenu->
setKeyboardShortcutsEnabled(
true );
00098
00099
m_lstSubMenus.setAutoDelete(
true );
00100
m_actions.setAutoDelete(
true );
00101
00102
if (m_actionCollection)
00103 {
00104 m_actionCollection->
setHighlightingEnabled(
true);
00105 disconnect( m_actionCollection, SIGNAL( actionHighlighted(
KAction * ) ), 0, 0 );
00106 connect( m_actionCollection, SIGNAL( actionHighlighted(
KAction * ) ),
00107
this, SLOT( slotActionHighlighted(
KAction * ) ) );
00108 }
00109
00110 m_bNSBookmark =
m_parentAddress.isNull();
00111
if ( !m_bNSBookmark )
00112 {
00113
00114
00115 connect( _parentMenu, SIGNAL( aboutToShow() ),
00116 SLOT( slotAboutToShow() ) );
00117
00118
if ( KBookmarkSettings::self()->m_contextmenu )
00119 {
00120 (
void) _parentMenu->
contextMenu();
00121 connect( _parentMenu, SIGNAL( aboutToShowContextMenu(
KPopupMenu*,
int,
QPopupMenu*) ),
00122
this, SLOT( slotAboutToShowContextMenu(
KPopupMenu*,
int,
QPopupMenu*) ));
00123 }
00124
00125
if ( m_bIsRoot )
00126 {
00127 connect( m_pManager, SIGNAL( changed(
const QString &,
const QString &) ),
00128 SLOT( slotBookmarksChanged(
const QString &) ) );
00129 }
00130 }
00131
00132
00133
if ( m_bIsRoot )
00134 {
00135
if ( m_bAddBookmark )
00136 {
00137 addAddBookmark();
00138
if ( extOwner() )
00139 addAddBookmarksList();
00140 }
00141
00142 addEditBookmarks();
00143 }
00144
00145 m_bDirty =
true;
00146 }
00147
00148 KBookmarkMenu::~KBookmarkMenu()
00149 {
00150
00151
QPtrListIterator<KAction> it( m_actions );
00152
for (; it.current(); ++it )
00153 it.current()->unplugAll();
00154
00155 m_lstSubMenus.clear();
00156 m_actions.clear();
00157 }
00158
00159 void KBookmarkMenu::ensureUpToDate()
00160 {
00161 slotAboutToShow();
00162 }
00163
00164
void KBookmarkMenu::slotAboutToShow()
00165 {
00166
00167
if ( m_bDirty )
00168 {
00169 m_bDirty =
false;
00170 refill();
00171 }
00172 }
00173
00174
QString KBookmarkMenu::s_highlightedAddress;
00175
QString KBookmarkMenu::s_highlightedImportType;
00176
QString KBookmarkMenu::s_highlightedImportLocation;
00177
00178
void KBookmarkMenu::slotActionHighlighted(
KAction* action )
00179 {
00180
if (
action->isA(
"KBookmarkActionMenu") ||
action->isA(
"KBookmarkAction"))
00181 {
00182 s_highlightedAddress =
action->property(
"address").toString();
00183
00184 }
00185
else if (
action->isA(
"KImportedBookmarksActionMenu"))
00186 {
00187 s_highlightedImportType =
action->property(
"type").toString();
00188 s_highlightedImportLocation =
action->property(
"location").toString();
00189 }
00190
else
00191 {
00192 s_highlightedAddress = QString::null;
00193 s_highlightedImportType = QString::null;
00194 s_highlightedImportLocation = QString::null;
00195 }
00196 }
00197
00198
00199
00200
00201
00202
class KBookmarkMenuRMBAssoc :
public dPtrTemplate<KBookmarkMenu, RMB> { };
00203
template<>
QPtrDict<RMB>* dPtrTemplate<KBookmarkMenu, RMB>::d_ptr = 0;
00204
00205
static RMB* rmbSelf(
KBookmarkMenu *m) {
return KBookmarkMenuRMBAssoc::d(m); }
00206
00207
00208
00209
void RMB::begin_rmb_action(
KBookmarkMenu *
self)
00210 {
00211 RMB *s = rmbSelf(
self);
00212 s->recv =
self;
00213 s->m_parentAddress =
self->m_parentAddress;
00214 s->s_highlightedAddress = KBookmarkMenu::s_highlightedAddress;
00215 s->m_pManager =
self->m_pManager;
00216 s->m_pOwner =
self->m_pOwner;
00217 s->m_parentMenu =
self->m_parentMenu;
00218 }
00219
00220
bool RMB::invalid(
int val )
00221 {
00222
bool valid =
true;
00223
00224
if (val == 1)
00225 s_highlightedAddress =
m_parentAddress;
00226
00227
if (s_highlightedAddress.isNull())
00228 valid =
false;
00229
00230
return !valid;
00231 }
00232
00233 KBookmark RMB::atAddress(
const QString & address)
00234 {
00235 KBookmark bookmark = m_pManager->
findByAddress( address );
00236 Q_ASSERT(!bookmark.isNull());
00237
return bookmark;
00238 }
00239
00240
void KBookmarkMenu::slotAboutToShowContextMenu(
KPopupMenu*,
int,
QPopupMenu* contextMenu )
00241 {
00242
00243
if (s_highlightedAddress.isNull())
00244 {
00245
KPopupMenu::contextMenuFocus()->
hideContextMenu();
00246
return;
00247 }
00248 contextMenu->clear();
00249 fillContextMenu( contextMenu, s_highlightedAddress, 0 );
00250 }
00251
00252
void RMB::fillContextMenu(
QPopupMenu* contextMenu,
const QString & address,
int val )
00253 {
00254 KBookmark bookmark = atAddress(address);
00255
00256
int id;
00257
00258
00259
00260
00261
00262
00263
00264
00265
id = contextMenu->insertItem( SmallIcon(
"bookmark_add"), i18n(
"Add Bookmark Here" ), recv, SLOT(slotRMBActionInsert(
int)) );
00266 contextMenu->setItemParameter(
id, val );
00267
00268
00269
00270
00271
00272
00273 }
00274
00275
void RMB::fillContextMenu2(
QPopupMenu* contextMenu,
const QString & address,
int val )
00276 {
00277 KBookmark bookmark = atAddress(address);
00278
00279
int id;
00280
00281
if (bookmark.isGroup()) {
00282
id = contextMenu->insertItem( i18n(
"Open Folder in Bookmark Editor" ), recv, SLOT(slotRMBActionEditAt(
int)) );
00283 contextMenu->setItemParameter(
id, val );
00284 contextMenu->insertSeparator();
00285
id = contextMenu->insertItem( SmallIcon(
"editdelete"), i18n(
"Delete Folder" ), recv, SLOT(slotRMBActionRemove(
int)) );
00286 contextMenu->setItemParameter(
id, val );
00287 contextMenu->insertSeparator();
00288
id = contextMenu->insertItem( i18n(
"Properties" ), recv, SLOT(slotRMBActionProperties(
int)) );
00289 contextMenu->setItemParameter(
id, val );
00290 }
00291
else
00292 {
00293
id = contextMenu->insertItem( i18n(
"Copy Link Address" ), recv, SLOT(slotRMBActionCopyLocation(
int)) );
00294 contextMenu->setItemParameter(
id, val );
00295 contextMenu->insertSeparator();
00296
id = contextMenu->insertItem( SmallIcon(
"editdelete"), i18n(
"Delete Bookmark" ), recv, SLOT(slotRMBActionRemove(
int)) );
00297 contextMenu->setItemParameter(
id, val );
00298 contextMenu->insertSeparator();
00299
id = contextMenu->insertItem( i18n(
"Properties" ), recv, SLOT(slotRMBActionProperties(
int)) );
00300 contextMenu->setItemParameter(
id, val );
00301 }
00302 }
00303
00304
void RMB::slotRMBActionEditAt(
int val )
00305 {
00306
kdDebug(7043) <<
"KBookmarkMenu::slotRMBActionEditAt" << s_highlightedAddress <<
endl;
00307
if (invalid(val)) { hidePopup();
return; }
00308
00309 KBookmark bookmark = atAddress(s_highlightedAddress);
00310
00311 m_pManager->
slotEditBookmarksAtAddress( s_highlightedAddress );
00312 }
00313
00314
void RMB::slotRMBActionProperties(
int val )
00315 {
00316
kdDebug(7043) <<
"KBookmarkMenu::slotRMBActionProperties" << s_highlightedAddress <<
endl;
00317
if (invalid(val)) { hidePopup();
return; }
00318
00319 KBookmark bookmark = atAddress(s_highlightedAddress);
00320
00321
QString folder = bookmark.isGroup() ? QString::null : bookmark.url().url();
00322 KBookmarkEditDialog dlg( bookmark.fullText(), folder,
00323 m_pManager, KBookmarkEditDialog::ModifyMode, 0,
00324 0, 0, i18n(
"Bookmark Properties") );
00325
if ( dlg.exec() != KDialogBase::Accepted )
00326
return;
00327
00328 makeTextNodeMod(bookmark,
"title", dlg.finalTitle());
00329
if ( !dlg.finalUrl().isNull() )
00330 bookmark.internalElement().setAttribute(
"href", dlg.finalUrl());
00331
00332
kdDebug(7043) <<
"Requested move to " << dlg.finalAddress() <<
"!" <<
endl;
00333
00334
KBookmarkGroup parentBookmark = atAddress(m_parentAddress).toGroup();
00335 m_pManager->emitChanged( parentBookmark );
00336 }
00337
00338
void RMB::slotRMBActionInsert(
int val )
00339 {
00340
kdDebug(7043) <<
"KBookmarkMenu::slotRMBActionInsert" << s_highlightedAddress <<
endl;
00341
if (invalid(val)) { hidePopup();
return; }
00342
00343
QString url = m_pOwner->
currentURL();
00344
if (url.isEmpty())
00345 {
00346
KMessageBox::error( 0L, i18n(
"Cannot add bookmark with empty URL."));
00347
return;
00348 }
00349
QString title = m_pOwner->
currentTitle();
00350
if (title.isEmpty())
00351 title = url;
00352
00353 KBookmark bookmark = atAddress( s_highlightedAddress );
00354
00355
00356
00357
if (bookmark.isGroup())
00358 {
00359
KBookmarkGroup parentBookmark = bookmark.toGroup();
00360 Q_ASSERT(!parentBookmark.isNull());
00361 parentBookmark.
addBookmark( m_pManager, title,
KURL( url ) );
00362 m_pManager->
emitChanged( parentBookmark );
00363 }
00364
else
00365 {
00366
KBookmarkGroup parentBookmark = bookmark.parentGroup();
00367 Q_ASSERT(!parentBookmark.isNull());
00368 KBookmark newBookmark = parentBookmark.
addBookmark( m_pManager, title,
KURL( url ) );
00369 parentBookmark.
moveItem( newBookmark, parentBookmark.
previous(bookmark) );
00370 m_pManager->
emitChanged( parentBookmark );
00371 }
00372 }
00373
00374
void RMB::slotRMBActionRemove(
int val )
00375 {
00376
00377
if (invalid(val)) { hidePopup();
return; }
00378
00379 KBookmark bookmark = atAddress( s_highlightedAddress );
00380
bool folder = bookmark.isGroup();
00381
00382
if (
KMessageBox::warningYesNo(
00383 m_parentMenu,
00384 folder ? i18n(
"Are you sure you wish to remove this bookmark folder?")
00385 : i18n(
"Are you sure you wish to remove this bookmark?"),
00386 folder ? i18n(
"Bookmark Folder Deletion")
00387 : i18n(
"Bookmark Deletion"),
00388
KGuiItem( i18n(
"&Delete"),
"editdelete"), KStdGuiItem::cancel())
00389 != KMessageBox::Yes
00390 )
00391
return;
00392
00393
KBookmarkGroup parentBookmark = atAddress( m_parentAddress ).toGroup();
00394 parentBookmark.
deleteBookmark( bookmark );
00395 m_pManager->
emitChanged( parentBookmark );
00396
if (
m_parentMenu)
00397
m_parentMenu->hide();
00398 }
00399
00400
void RMB::slotRMBActionCopyLocation(
int val )
00401 {
00402
00403
if (invalid(val)) { hidePopup();
return; }
00404
00405 KBookmark bookmark = atAddress( s_highlightedAddress );
00406
00407
if ( !bookmark.isGroup() )
00408 {
00409 kapp->clipboard()->setData( KBookmarkDrag::newDrag(bookmark, 0),
00410 QClipboard::Selection );
00411 kapp->clipboard()->setData( KBookmarkDrag::newDrag(bookmark, 0),
00412 QClipboard::Clipboard );
00413 }
00414 }
00415
00416
void RMB::hidePopup() {
00417
KPopupMenu::contextMenuFocus()->
hideContextMenu();
00418 }
00419
00420
00421
00422
00423
00424
void KBookmarkMenu::fillContextMenu(
QPopupMenu* contextMenu,
const QString & address,
int val )
00425 {
00426 RMB::begin_rmb_action(
this);
00427 rmbSelf(
this)->fillContextMenu(contextMenu, address, val);
00428 emit aboutToShowContextMenu( rmbSelf(
this)->atAddress(address), contextMenu);
00429 rmbSelf(
this)->fillContextMenu2(contextMenu, address, val);
00430 }
00431
00432
void KBookmarkMenu::slotRMBActionEditAt(
int val )
00433 { RMB::begin_rmb_action(
this); rmbSelf(
this)->slotRMBActionEditAt( val ); }
00434
00435
void KBookmarkMenu::slotRMBActionProperties(
int val )
00436 { RMB::begin_rmb_action(
this); rmbSelf(
this)->slotRMBActionProperties( val ); }
00437
00438
void KBookmarkMenu::slotRMBActionInsert(
int val )
00439 { RMB::begin_rmb_action(
this); rmbSelf(
this)->slotRMBActionInsert( val ); }
00440
00441
void KBookmarkMenu::slotRMBActionRemove(
int val )
00442 { RMB::begin_rmb_action(
this); rmbSelf(
this)->slotRMBActionRemove( val ); }
00443
00444
void KBookmarkMenu::slotRMBActionCopyLocation(
int val )
00445 { RMB::begin_rmb_action(
this); rmbSelf(
this)->slotRMBActionCopyLocation( val ); }
00446
00447
void KBookmarkMenu::slotBookmarksChanged(
const QString & groupAddress )
00448 {
00449
if (m_bNSBookmark)
00450
return;
00451
00452
if ( groupAddress ==
m_parentAddress )
00453 {
00454
00455 m_bDirty =
true;
00456 }
00457
else
00458 {
00459
00460
QPtrListIterator<KBookmarkMenu> it( m_lstSubMenus );
00461
for (; it.current(); ++it )
00462 {
00463 it.current()->slotBookmarksChanged( groupAddress );
00464 }
00465 }
00466 }
00467
00468
void KBookmarkMenu::refill()
00469 {
00470
00471
m_lstSubMenus.clear();
00472
00473
QPtrListIterator<KAction> it( m_actions );
00474
for (; it.current(); ++it )
00475 it.current()->unplug( m_parentMenu );
00476
00477
m_parentMenu->clear();
00478
m_actions.clear();
00479
00480
fillBookmarkMenu();
00481
m_parentMenu->adjustSize();
00482 }
00483
00484
void KBookmarkMenu::addAddBookmarksList()
00485 {
00486
if (!kapp->authorizeKAction(
"bookmarks"))
00487
return;
00488
00489
QString title = i18n(
"Bookmark Tabs as Folder..." );
00490
00491
KAction * paAddBookmarksList =
new KAction( title,
00492
"bookmarks_list_add",
00493 0,
00494
this,
00495 SLOT( slotAddBookmarksList() ),
00496 m_actionCollection, m_bIsRoot ?
"add_bookmarks_list" : 0 );
00497
00498 paAddBookmarksList->
setToolTip( i18n(
"Add a folder of bookmarks for all open tabs." ) );
00499
00500 paAddBookmarksList->
plug( m_parentMenu );
00501
m_actions.append( paAddBookmarksList );
00502 }
00503
00504
void KBookmarkMenu::addAddBookmark()
00505 {
00506
if (!kapp->authorizeKAction(
"bookmarks"))
00507
return;
00508
00509
QString title = i18n(
"&Add Bookmark" );
00510
int p;
00511
while ( ( p = title.find(
'&' ) ) >= 0 )
00512 title.remove( p, 1 );
00513
00514
KAction * paAddBookmarks =
new KAction( title,
00515
"bookmark_add",
00516 m_bIsRoot && m_bAddShortcuts ? KStdAccel::addBookmark() :
KShortcut(),
00517
this,
00518 SLOT( slotAddBookmark() ),
00519 m_actionCollection, m_bIsRoot ?
"add_bookmark" : 0 );
00520
00521 paAddBookmarks->
setToolTip( i18n(
"Add a bookmark for the current document" ) );
00522
00523 paAddBookmarks->
plug( m_parentMenu );
00524
m_actions.append( paAddBookmarks );
00525 }
00526
00527
void KBookmarkMenu::addEditBookmarks()
00528 {
00529
if (!kapp->authorizeKAction(
"bookmarks"))
00530
return;
00531
00532
KAction * m_paEditBookmarks =
KStdAction::editBookmarks( m_pManager, SLOT( slotEditBookmarks() ),
00533 m_actionCollection,
"edit_bookmarks" );
00534 m_paEditBookmarks->
plug( m_parentMenu );
00535 m_paEditBookmarks->
setToolTip( i18n(
"Edit your bookmark collection in a separate window" ) );
00536
m_actions.append( m_paEditBookmarks );
00537 }
00538
00539
void KBookmarkMenu::addNewFolder()
00540 {
00541
if (!kapp->authorizeKAction(
"bookmarks"))
00542
return;
00543
00544
QString title = i18n(
"&New Bookmark Folder..." );
00545
int p;
00546
while ( ( p = title.find(
'&' ) ) >= 0 )
00547 title.remove( p, 1 );
00548
00549
KAction * paNewFolder =
new KAction( title,
00550
"folder_new",
00551 0,
00552
this,
00553 SLOT( slotNewFolder() ),
00554 m_actionCollection );
00555
00556 paNewFolder->
setToolTip( i18n(
"Create a new bookmark folder in this menu" ) );
00557
00558 paNewFolder->
plug( m_parentMenu );
00559
m_actions.append( paNewFolder );
00560 }
00561
00562 void KBookmarkMenu::fillBookmarkMenu()
00563 {
00564
if (!kapp->authorizeKAction(
"bookmarks"))
00565
return;
00566
00567
if ( m_bIsRoot )
00568 {
00569
if ( m_bAddBookmark )
00570 {
00571 addAddBookmark();
00572
if ( extOwner() )
00573 addAddBookmarksList();
00574 }
00575
00576 addEditBookmarks();
00577
00578
if ( m_bAddBookmark && !KBookmarkSettings::self()->m_advancedaddbookmark )
00579 addNewFolder();
00580 }
00581
00582
if ( m_bIsRoot
00583 &&
KBookmarkManager::userBookmarksManager()->
path() == m_pManager->
path() )
00584 {
00585
bool haveSep =
false;
00586
00587
QValueList<QString> keys =
KBookmarkMenu::dynamicBookmarksList();
00588
QValueList<QString>::const_iterator it;
00589
for ( it = keys.begin(); it != keys.end(); ++it )
00590 {
00591
DynMenuInfo info;
00592 info =
showDynamicBookmarks((*it));
00593
00594
if ( !info.
show || !QFile::exists( info.
location ) )
00595
continue;
00596
00597
if (!haveSep)
00598 {
00599
m_parentMenu->insertSeparator();
00600 haveSep =
true;
00601 }
00602
00603
KActionMenu * actionMenu;
00604 actionMenu =
new KImportedBookmarksActionMenu(
00605 info.
name, info.
type,
00606 m_actionCollection,
"kbookmarkmenu" );
00607
00608 actionMenu->setProperty(
"type", info.
type );
00609 actionMenu->setProperty(
"location", info.
location );
00610
00611 actionMenu->
plug(
m_parentMenu );
00612
m_actions.append( actionMenu );
00613
00614
KBookmarkMenu *subMenu =
00615
new KBookmarkMenu( m_pManager, m_pOwner, actionMenu->
popupMenu(),
00616 m_actionCollection,
false,
00617 m_bAddBookmark, QString::null );
00618
m_lstSubMenus.append(subMenu);
00619
00620 connect(actionMenu->
popupMenu(), SIGNAL(aboutToShow()), subMenu, SLOT(
slotNSLoad()));
00621 }
00622 }
00623
00624
KBookmarkGroup parentBookmark = m_pManager->
findByAddress(
m_parentAddress ).toGroup();
00625 Q_ASSERT(!parentBookmark.isNull());
00626
bool separatorInserted =
false;
00627
for ( KBookmark bm = parentBookmark.
first(); !bm.isNull(); bm = parentBookmark.
next(bm) )
00628 {
00629
QString text = bm.text();
00630 text.replace(
'&',
"&&" );
00631
if ( !separatorInserted && m_bIsRoot) {
00632
00633
m_parentMenu->insertSeparator();
00634 separatorInserted =
true;
00635 }
00636
if ( !bm.isGroup() )
00637 {
00638
if ( bm.isSeparator() )
00639 {
00640
m_parentMenu->insertSeparator();
00641 }
00642
else
00643 {
00644
00645
KAction * action =
new KBookmarkAction( text, bm.icon(), 0,
00646
this, SLOT( slotBookmarkSelected() ),
00647 m_actionCollection, 0 );
00648
00649 action->setProperty(
"url", bm.url().url() );
00650 action->setProperty(
"address", bm.address() );
00651
00652 action->setToolTip( bm.url().prettyURL() );
00653
00654 action->plug(
m_parentMenu );
00655
m_actions.append( action );
00656 }
00657 }
00658
else
00659 {
00660
00661
KActionMenu * actionMenu =
new KBookmarkActionMenu( text, bm.icon(),
00662 m_actionCollection,
00663
"kbookmarkmenu" );
00664 actionMenu->setProperty(
"address", bm.address() );
00665 actionMenu->
plug(
m_parentMenu );
00666
m_actions.append( actionMenu );
00667
00668
KBookmarkMenu *subMenu =
new KBookmarkMenu( m_pManager, m_pOwner, actionMenu->
popupMenu(),
00669 m_actionCollection,
false,
00670 m_bAddBookmark,
00671 bm.address() );
00672 connect(subMenu, SIGNAL( aboutToShowContextMenu(
const KBookmark &,
QPopupMenu * ) ),
00673
this, SIGNAL( aboutToShowContextMenu(
const KBookmark &,
QPopupMenu * ) ));
00674
m_lstSubMenus.append( subMenu );
00675 }
00676 }
00677
00678
if ( !m_bIsRoot && m_bAddBookmark )
00679 {
00680
if (
m_parentMenu->count() > 0 )
00681
m_parentMenu->insertSeparator();
00682
00683
if ( KBookmarkSettings::self()->m_quickactions )
00684 {
00685
KActionMenu * actionMenu =
new KActionMenu( i18n(
"Quick Actions"), m_actionCollection, 0L );
00686 fillContextMenu( actionMenu->
popupMenu(),
m_parentAddress, 1 );
00687 actionMenu->
plug(
m_parentMenu );
00688
m_actions.append( actionMenu );
00689 }
00690
else
00691 {
00692 addAddBookmark();
00693
if ( extOwner() )
00694 addAddBookmarksList();
00695 addNewFolder();
00696 }
00697 }
00698 }
00699
00700
void KBookmarkMenu::slotAddBookmarksList()
00701 {
00702
KExtendedBookmarkOwner *extOwner = dynamic_cast<KExtendedBookmarkOwner*>(m_pOwner);
00703
if (!extOwner)
00704 {
00705
kdWarning() <<
"erm, sorry ;-)" <<
endl;
00706
return;
00707 }
00708
00709
KExtendedBookmarkOwner::QStringPairList list;
00710 extOwner->
fillBookmarksList( list );
00711
00712
KBookmarkGroup parentBookmark = m_pManager->
findByAddress( m_parentAddress ).toGroup();
00713 Q_ASSERT(!parentBookmark.isNull());
00714
KBookmarkGroup group = parentBookmark.
createNewFolder( m_pManager );
00715
if ( group.isNull() )
00716
return;
00717
00718 KExtendedBookmarkOwner::QStringPairList::const_iterator it;
00719
for ( it = list.begin(); it != list.end(); ++it )
00720 group.
addBookmark( m_pManager, (*it).first,
KURL((*it).second) );
00721
00722 m_pManager->
emitChanged( parentBookmark );
00723 }
00724
00725
00726
void KBookmarkMenu::slotAddBookmark()
00727 {
00728
KBookmarkGroup parentBookmark;
00729 parentBookmark = m_pManager->
addBookmarkDialog(m_pOwner->
currentURL(), m_pOwner->
currentTitle(),
m_parentAddress);
00730
if (!parentBookmark.isNull())
00731 m_pManager->
emitChanged( parentBookmark );
00732 }
00733
00734
void KBookmarkMenu::slotNewFolder()
00735 {
00736
if ( !m_pOwner )
return;
00737
KBookmarkGroup parentBookmark = m_pManager->
findByAddress( m_parentAddress ).toGroup();
00738 Q_ASSERT(!parentBookmark.isNull());
00739
KBookmarkGroup group = parentBookmark.
createNewFolder( m_pManager );
00740
if ( !group.isNull() )
00741 {
00742
KBookmarkGroup parentGroup = group.parentGroup();
00743 m_pManager->
emitChanged( parentGroup );
00744 }
00745 }
00746
00747
void KBookmarkMenu::slotBookmarkSelected()
00748 {
00749
00750
if ( !m_pOwner )
return;
00751 m_pOwner->
openBookmarkURL( sender()->property(
"url").toString() );
00752 }
00753
00754
KExtendedBookmarkOwner* KBookmarkMenu::extOwner()
00755 {
00756
return dynamic_cast<KExtendedBookmarkOwner*>(m_pOwner);
00757 }
00758
00759 void KBookmarkMenu::slotNSLoad()
00760 {
00761
00762
m_parentMenu->disconnect(SIGNAL(aboutToShow()));
00763
00764
00765
KBookmarkMenuNSImporter importer( m_pManager,
this, m_actionCollection );
00766 importer.
openBookmarks(s_highlightedImportLocation, s_highlightedImportType);
00767 }
00768
00769
00770
00771
00772
00773 KBookmarkEditFields::KBookmarkEditFields(
QWidget *main,
QBoxLayout *vbox, FieldsSet fieldsSet)
00774 {
00775
bool isF = (fieldsSet != FolderFieldsSet);
00776
00777
QGridLayout *grid =
new QGridLayout( vbox, 2, isF ? 2 : 1 );
00778
00779 m_title =
new KLineEdit( main );
00780 grid->addWidget( m_title, 0, 1 );
00781 grid->addWidget(
new QLabel( m_title, i18n(
"Name:" ), main ), 0, 0 );
00782 m_title->setFocus();
00783
if (isF)
00784 {
00785 m_url =
new KLineEdit( main );
00786 grid->addWidget( m_url, 1, 1 );
00787 grid->addWidget(
new QLabel( m_url, i18n(
"Location:" ), main ), 1, 0 );
00788 }
00789
else
00790 {
00791 m_url = 0;
00792 }
00793
00794 main->setMinimumSize( 300, 0 );
00795 }
00796
00797
void KBookmarkEditFields::setName(
const QString &str)
00798 {
00799 m_title->setText(str);
00800 }
00801
00802
void KBookmarkEditFields::setLocation(
const QString &str)
00803 {
00804 m_url->setText(str);
00805 }
00806
00807
00808
00809
00810
00811
00812 KBookmarkEditDialog::KBookmarkEditDialog(
const QString& title,
const QString& url,
KBookmarkManager * mgr, BookmarkEditType editType,
const QString& address,
00813
QWidget * parent,
const char * name,
const QString& caption )
00814 :
KDialogBase(parent,
name, true, caption,
00815 (editType == InsertionMode) ? (User1|Ok|Cancel) : (Ok|Cancel),
00816 Ok, false,
KGuiItem()),
00817 m_folderTree(0), m_mgr(mgr), m_editType(editType), m_address(address)
00818 {
00819 setButtonOK( (editType == InsertionMode) ?
KGuiItem( i18n(
"&Add" ),
"bookmark_add") : i18n(
"&Update" ) );
00820
if (editType == InsertionMode) {
00821 setButtonGuiItem( User1,
KGuiItem( i18n(
"&New Folder..." ),
"folder_new") );
00822 }
00823
00824
bool folder = url.isNull();
00825
00826 m_main =
new QWidget(
this );
00827 setMainWidget( m_main );
00828
00829
QBoxLayout *vbox =
new QVBoxLayout( m_main, spacingHint() );
00830 KBookmarkEditFields::FieldsSet fs =
00831 folder ? KBookmarkEditFields::FolderFieldsSet
00832 : KBookmarkEditFields::BookmarkFieldsSet;
00833 m_fields =
new KBookmarkEditFields(m_main, vbox, fs);
00834 m_fields->setName(title);
00835
if ( !folder )
00836 m_fields->setLocation(url);
00837
00838
if ( editType == InsertionMode )
00839 {
00840 m_folderTree = KBookmarkFolderTree::createTree( m_mgr, m_main, name, m_address );
00841 connect( m_folderTree, SIGNAL( doubleClicked(
QListViewItem*) ),
00842
this, SLOT( slotDoubleClicked(
QListViewItem*) ) );
00843 vbox->
addWidget( m_folderTree );
00844 connect(
this, SIGNAL( user1Clicked() ), SLOT( slotUser1() ) );
00845 }
00846 }
00847
00848
void KBookmarkEditDialog::slotDoubleClicked(
QListViewItem* item )
00849 {
00850 Q_ASSERT( m_folderTree );
00851 m_folderTree->setCurrentItem( item );
00852 accept();
00853 }
00854
00855
void KBookmarkEditDialog::slotOk()
00856 {
00857 accept();
00858 }
00859
00860
void KBookmarkEditDialog::slotCancel()
00861 {
00862 reject();
00863 }
00864
00865
QString KBookmarkEditDialog::finalAddress()
const
00866
{
00867 Q_ASSERT( m_folderTree );
00868
return KBookmarkFolderTree::selectedAddress( m_folderTree );
00869 }
00870
00871
QString KBookmarkEditDialog::finalUrl()
const
00872
{
00873
return m_fields->m_url ? m_fields->m_url->text() :
QString::null;
00874 }
00875
00876
QString KBookmarkEditDialog::finalTitle()
const
00877
{
00878
return m_fields->m_title ? m_fields->m_title->text() :
QString::null;
00879 }
00880
00881
void KBookmarkEditDialog::slotUser1()
00882 {
00883
00884 Q_ASSERT( m_folderTree );
00885
00886
QString address = KBookmarkFolderTree::selectedAddress( m_folderTree );
00887
if ( address.isNull() )
return;
00888
KBookmarkGroup bm = m_mgr->findByAddress( address ).toGroup();
00889 Q_ASSERT(!bm.isNull());
00890 Q_ASSERT(m_editType == InsertionMode);
00891
00892
KBookmarkGroup group = bm.
createNewFolder( m_mgr );
00893
if ( !group.isNull() )
00894 {
00895
KBookmarkGroup parentGroup = group.parentGroup();
00896 m_mgr->emitChanged( parentGroup );
00897 }
00898 KBookmarkFolderTree::fillTree( m_folderTree, m_mgr );
00899 }
00900
00901
00902
00903
00904
00905
static void fillGroup(
QListView* listview, KBookmarkFolderTreeItem * parentItem,
KBookmarkGroup group,
bool expandOpenGroups =
true,
const QString& address = QString::null )
00906 {
00907
bool noSubGroups =
true;
00908 KBookmarkFolderTreeItem * lastItem = 0L;
00909 KBookmarkFolderTreeItem * item = 0L;
00910
for ( KBookmark bk = group.
first() ; !bk.isNull() ; bk = group.
next(bk) )
00911 {
00912
if ( bk.isGroup() )
00913 {
00914
KBookmarkGroup grp = bk.toGroup();
00915 item =
new KBookmarkFolderTreeItem( parentItem, lastItem, grp );
00916 fillGroup( listview, item, grp, expandOpenGroups, address );
00917
if ( expandOpenGroups && grp.
isOpen() )
00918 item->setOpen(
true );
00919 lastItem = item;
00920 noSubGroups =
false;
00921 }
00922
if (bk.address() == address) {
00923 listview->setCurrentItem( lastItem );
00924 listview->ensureItemVisible( item );
00925 }
00926 }
00927
if ( noSubGroups ) {
00928 parentItem->setOpen(
true );
00929 }
00930 }
00931
00932
QListView* KBookmarkFolderTree::createTree(
KBookmarkManager* mgr,
QWidget* parent,
const char* name,
const QString& address )
00933 {
00934
QListView *listview =
new QListView( parent, name );
00935
00936 listview->setRootIsDecorated(
false );
00937 listview->header()->hide();
00938 listview->addColumn( i18n(
"Bookmark"), 200 );
00939 listview->setSorting( -1,
false );
00940 listview->setSelectionMode( QListView::Single );
00941 listview->setAllColumnsShowFocus(
true );
00942 listview->setResizeMode( QListView::AllColumns );
00943 listview->setMinimumSize( 60, 100 );
00944
00945 fillTree( listview, mgr, address );
00946
00947
return listview;
00948 }
00949
00950
void KBookmarkFolderTree::fillTree(
QListView *listview,
KBookmarkManager* mgr,
const QString& address )
00951 {
00952 listview->clear();
00953
00954
KBookmarkGroup root = mgr->
root();
00955 KBookmarkFolderTreeItem * rootItem =
new KBookmarkFolderTreeItem( listview, root );
00956 listview->setCurrentItem( rootItem );
00957 rootItem->setSelected(
true );
00958 fillGroup( listview, rootItem, root, (address == root.
groupAddress() || address == QString::null) ?
true :
false, address );
00959 rootItem->setOpen(
true );
00960 }
00961
00962
static KBookmarkFolderTreeItem* ft_cast(
QListViewItem *i )
00963 {
00964
return static_cast<KBookmarkFolderTreeItem*>( i );
00965 }
00966
00967
QString KBookmarkFolderTree::selectedAddress(
QListView *listview )
00968 {
00969
if ( !listview)
00970
return QString::null;
00971 KBookmarkFolderTreeItem *item = ft_cast( listview->currentItem() );
00972
return item ? item->m_bookmark.address() :
QString::null;
00973 }
00974
00975
void KBookmarkFolderTree::setAddress(
QListView *listview,
const QString & address )
00976 {
00977 KBookmarkFolderTreeItem* it = ft_cast( listview->firstChild() );
00978
while (
true ) {
00979
kdDebug(7043) << it->m_bookmark.address() <<
endl;
00980 it = ft_cast( it->itemBelow() );
00981
if ( !it )
00982
return;
00983
if ( it->m_bookmark.address() == address )
00984
break;
00985 }
00986 it->setSelected(
true );
00987 listview->setCurrentItem( it );
00988 }
00989
00990
00991
00992
00993
00994
00995 KBookmarkFolderTreeItem::KBookmarkFolderTreeItem(
QListView *parent,
const KBookmark & gp )
00996 :
QListViewItem(parent, i18n(
"Bookmarks")), m_bookmark(gp)
00997 {
00998 setPixmap(0, SmallIcon(
"bookmark"));
00999 setExpandable(
true);
01000 }
01001
01002
01003 KBookmarkFolderTreeItem::KBookmarkFolderTreeItem( KBookmarkFolderTreeItem *parent,
QListViewItem *after,
const KBookmarkGroup & gp )
01004 :
QListViewItem(parent, after, gp.fullText()), m_bookmark(gp)
01005 {
01006 setPixmap(0, SmallIcon( gp.icon() ) );
01007 setExpandable(
true);
01008 }
01009
01010
01011
01012
01013
01014
01015
01016
01017
void KBookmarkMenuNSImporter::openNSBookmarks()
01018 {
01019 openBookmarks( KNSBookmarkImporter::netscapeBookmarksFile(),
"netscape" );
01020 }
01021
01022
void KBookmarkMenuNSImporter::openBookmarks(
const QString &location,
const QString &type )
01023 {
01024 mstack.push(m_menu);
01025
01026
KBookmarkImporterBase *importer = KBookmarkImporterBase::factory(type);
01027
if (!importer)
01028
return;
01029 importer->
setFilename(location);
01030 connectToImporter(*importer);
01031 importer->
parse();
01032
01033
delete importer;
01034 }
01035
01036
void KBookmarkMenuNSImporter::connectToImporter(
const QObject &importer)
01037 {
01038 connect( &importer, SIGNAL( newBookmark(
const QString &,
const QCString &,
const QString & ) ),
01039 SLOT( newBookmark(
const QString &,
const QCString &,
const QString & ) ) );
01040 connect( &importer, SIGNAL( newFolder(
const QString &,
bool,
const QString & ) ),
01041 SLOT( newFolder(
const QString &,
bool,
const QString & ) ) );
01042 connect( &importer, SIGNAL( newSeparator() ), SLOT( newSeparator() ) );
01043 connect( &importer, SIGNAL( endFolder() ), SLOT( endFolder() ) );
01044 }
01045
01046
void KBookmarkMenuNSImporter::newBookmark(
const QString & text,
const QCString & url,
const QString & )
01047 {
01048
QString _text =
KStringHandler::csqueeze(text);
01049 _text.replace(
'&',
"&&" );
01050
KAction *
action =
new KBookmarkAction(_text,
"html", 0,
01051 m_menu, SLOT( slotBookmarkSelected() ),
01052 m_actionCollection, 0);
01053
action->setProperty(
"url", url );
01054
action->setToolTip( url );
01055
action->plug( mstack.top()->m_parentMenu );
01056 mstack.top()->m_actions.append( action );
01057 }
01058
01059
void KBookmarkMenuNSImporter::newFolder(
const QString & text,
bool,
const QString & )
01060 {
01061
QString _text =
KStringHandler::csqueeze(text);
01062 _text.replace(
'&',
"&&" );
01063
KActionMenu * actionMenu =
new KActionMenu( _text,
"folder", m_actionCollection, 0L );
01064 actionMenu->
plug( mstack.top()->m_parentMenu );
01065 mstack.top()->m_actions.append( actionMenu );
01066
KBookmarkMenu *subMenu =
new KBookmarkMenu( m_pManager, m_menu->
m_pOwner, actionMenu->
popupMenu(),
01067 m_actionCollection,
false,
01068 m_menu->
m_bAddBookmark, QString::null );
01069 mstack.top()->m_lstSubMenus.append( subMenu );
01070
01071 mstack.push(subMenu);
01072 }
01073
01074
void KBookmarkMenuNSImporter::newSeparator()
01075 {
01076 mstack.top()->m_parentMenu->insertSeparator();
01077 }
01078
01079
void KBookmarkMenuNSImporter::endFolder()
01080 {
01081 mstack.pop();
01082 }
01083
01084
01085
01086
01087
01088 KBookmarkMenu::DynMenuInfo KBookmarkMenu::showDynamicBookmarks(
const QString &
id )
01089 {
01090
KConfig config(
"kbookmarkrc",
false,
false);
01091 config.
setGroup(
"Bookmarks");
01092
01093
DynMenuInfo info;
01094 info.
show =
false;
01095
01096
if (!config.
hasKey(
"DynamicMenus")) {
01097
01098
if (
id ==
"netscape") {
01099
KBookmarkManager *manager =
KBookmarkManager::userBookmarksManager();
01100 info.
show = manager->
root().internalElement().attribute(
"hide_nsbk") !=
"yes";
01101 info.
location = KNSBookmarkImporter::netscapeBookmarksFile();
01102 info.
type =
"netscape";
01103 info.
name = i18n(
"Netscape Bookmarks");
01104 }
01105
01106 }
else {
01107
01108
if (config.
hasGroup(
"DynamicMenu-" +
id)) {
01109 config.
setGroup(
"DynamicMenu-" +
id);
01110 info.
show = config.
readBoolEntry(
"Show");
01111 info.
location = config.
readPathEntry(
"Location");
01112 info.
type = config.
readEntry(
"Type");
01113 info.
name = config.
readEntry(
"Name");
01114 }
01115 }
01116
01117
return info;
01118 }
01119
01120 QStringList KBookmarkMenu::dynamicBookmarksList()
01121 {
01122
KConfig config(
"kbookmarkrc",
false,
false);
01123 config.
setGroup(
"Bookmarks");
01124
01125
QStringList mlist;
01126
if (config.
hasKey(
"DynamicMenus"))
01127 mlist = config.
readListEntry(
"DynamicMenus");
01128
else
01129 mlist <<
"netscape";
01130
01131
return mlist;
01132 }
01133
01134 void KBookmarkMenu::setDynamicBookmarks(
const QString &
id,
const DynMenuInfo &newMenu)
01135 {
01136
KConfig config(
"kbookmarkrc",
false,
false);
01137
01138
01139 config.
setGroup(
"DynamicMenu-" +
id);
01140 config.
writeEntry(
"Show", newMenu.
show);
01141 config.
writePathEntry(
"Location", newMenu.
location);
01142 config.
writeEntry(
"Type", newMenu.
type);
01143 config.
writeEntry(
"Name", newMenu.
name);
01144
01145
QStringList elist;
01146
01147 config.
setGroup(
"Bookmarks");
01148
if (!config.
hasKey(
"DynamicMenus")) {
01149
if (newMenu.
type !=
"netscape") {
01150
01151
01152 config.
setGroup(
"DynamicMenu-" "netscape");
01153
DynMenuInfo xbelSetting;
01154 xbelSetting =
showDynamicBookmarks(
"netscape");
01155 config.
writeEntry(
"Show", xbelSetting.
show);
01156 config.
writePathEntry(
"Location", xbelSetting.
location);
01157 config.
writeEntry(
"Type", xbelSetting.
type);
01158 config.
writeEntry(
"Name", xbelSetting.
name);
01159 }
01160 }
else {
01161 elist = config.
readListEntry(
"DynamicMenus");
01162 }
01163
01164
01165 config.
setGroup(
"Bookmarks");
01166
if (elist.contains(
id) < 1) {
01167 elist <<
id;
01168 config.
writeEntry(
"DynamicMenus", elist);
01169 }
01170
01171 config.
sync();
01172 }
01173
01174
#include "kbookmarkmenu.moc"
01175
#include "kbookmarkmenu_p.moc"