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 <kconfig.h>
00051
00052 #include <qlistview.h>
00053 #include <qheader.h>
00054
00055 #include <kiconloader.h>
00056
00057 #include <dptrtemplate.h>
00058
00059 template class QPtrList<KBookmarkMenu>;
00060
00061 static QString makeTextNodeMod(KBookmark bk, const QString &m_nodename, const QString &m_newText) {
00062 QDomNode subnode = bk.internalElement().namedItem(m_nodename);
00063 if (subnode.isNull()) {
00064 subnode = bk.internalElement().ownerDocument().createElement(m_nodename);
00065 bk.internalElement().appendChild(subnode);
00066 }
00067
00068 if (subnode.firstChild().isNull()) {
00069 QDomText domtext = subnode.ownerDocument().createTextNode("");
00070 subnode.appendChild(domtext);
00071 }
00072
00073 QDomText domtext = subnode.firstChild().toText();
00074
00075 QString m_oldText = domtext.data();
00076 domtext.setData(m_newText);
00077
00078 return m_oldText;
00079 }
00080
00081
00082
00083
00084
00085 KBookmarkMenu::KBookmarkMenu( KBookmarkManager* mgr,
00086 KBookmarkOwner * _owner, KPopupMenu * _parentMenu,
00087 KActionCollection *collec, bool _isRoot, bool _add,
00088 const QString & parentAddress )
00089 : m_bIsRoot(_isRoot), m_bAddBookmark(_add),
00090 m_bAddShortcuts(true),
00091 m_pManager(mgr), m_pOwner(_owner),
00092 m_parentMenu( _parentMenu ),
00093 m_actionCollection( collec ),
00094 m_parentAddress( parentAddress )
00095 {
00096 m_parentMenu->setKeyboardShortcutsEnabled( true );
00097
00098 m_lstSubMenus.setAutoDelete( true );
00099 m_actions.setAutoDelete( true );
00100
00101 if (m_actionCollection)
00102 {
00103 m_actionCollection->setHighlightingEnabled(true);
00104 disconnect( m_actionCollection, SIGNAL( actionHighlighted( KAction * ) ), 0, 0 );
00105 connect( m_actionCollection, SIGNAL( actionHighlighted( KAction * ) ),
00106 this, SLOT( slotActionHighlighted( KAction * ) ) );
00107 }
00108
00109 m_bNSBookmark = m_parentAddress.isNull();
00110 if ( !m_bNSBookmark )
00111 {
00112
00113
00114 connect( _parentMenu, SIGNAL( aboutToShow() ),
00115 SLOT( slotAboutToShow() ) );
00116
00117 if ( KBookmarkSettings::self()->m_contextmenu )
00118 {
00119 (void) _parentMenu->contextMenu();
00120 connect( _parentMenu, SIGNAL( aboutToShowContextMenu(KPopupMenu*, int, QPopupMenu*) ),
00121 this, SLOT( slotAboutToShowContextMenu(KPopupMenu*, int, QPopupMenu*) ));
00122 }
00123
00124 if ( m_bIsRoot )
00125 {
00126 connect( m_pManager, SIGNAL( changed(const QString &, const QString &) ),
00127 SLOT( slotBookmarksChanged(const QString &) ) );
00128 }
00129 }
00130
00131
00132 if ( m_bIsRoot )
00133 {
00134 if ( m_bAddBookmark )
00135 {
00136 addAddBookmark();
00137 if ( extOwner() )
00138 addAddBookmarksList();
00139 }
00140
00141 addEditBookmarks();
00142 }
00143
00144 m_bDirty = true;
00145 }
00146
00147 KBookmarkMenu::~KBookmarkMenu()
00148 {
00149
00150 QPtrListIterator<KAction> it( m_actions );
00151 for (; it.current(); ++it )
00152 it.current()->unplugAll();
00153
00154 m_lstSubMenus.clear();
00155 m_actions.clear();
00156 }
00157
00158 void KBookmarkMenu::ensureUpToDate()
00159 {
00160 slotAboutToShow();
00161 }
00162
00163 void KBookmarkMenu::slotAboutToShow()
00164 {
00165
00166 if ( m_bDirty )
00167 {
00168 m_bDirty = false;
00169 refill();
00170 }
00171 }
00172
00173 QString KBookmarkMenu::s_highlightedAddress;
00174 QString KBookmarkMenu::s_highlightedImportType;
00175 QString KBookmarkMenu::s_highlightedImportLocation;
00176
00177 void KBookmarkMenu::slotActionHighlighted( KAction* action )
00178 {
00179 if (action->isA("KBookmarkActionMenu") || action->isA("KBookmarkAction"))
00180 {
00181 s_highlightedAddress = action->property("address").toString();
00182
00183 }
00184 else if (action->isA("KImportedBookmarksActionMenu"))
00185 {
00186 s_highlightedImportType = action->property("type").toString();
00187 s_highlightedImportLocation = action->property("location").toString();
00188 }
00189 else
00190 {
00191 s_highlightedAddress = QString::null;
00192 s_highlightedImportType = QString::null;
00193 s_highlightedImportLocation = QString::null;
00194 }
00195 }
00196
00197
00198
00199
00200
00201 class KBookmarkMenuRMBAssoc : public dPtrTemplate<KBookmarkMenu, RMB> { };
00202 template<> QPtrDict<RMB>* dPtrTemplate<KBookmarkMenu, RMB>::d_ptr = 0;
00203
00204 static RMB* rmbSelf(KBookmarkMenu *m) { return KBookmarkMenuRMBAssoc::d(m); }
00205
00206
00207
00208 void RMB::begin_rmb_action(KBookmarkMenu *self)
00209 {
00210 RMB *s = rmbSelf(self);
00211 s->recv = self;
00212 s->m_parentAddress = self->m_parentAddress;
00213 s->s_highlightedAddress = KBookmarkMenu::s_highlightedAddress;
00214 s->m_pManager = self->m_pManager;
00215 s->m_pOwner = self->m_pOwner;
00216 s->m_parentMenu = self->m_parentMenu;
00217 }
00218
00219 bool RMB::invalid( int val )
00220 {
00221 bool valid = true;
00222
00223 if (val == 1)
00224 s_highlightedAddress = m_parentAddress;
00225
00226 if (s_highlightedAddress.isNull())
00227 valid = false;
00228
00229 return !valid;
00230 }
00231
00232 KBookmark RMB::atAddress(const QString & address)
00233 {
00234 KBookmark bookmark = m_pManager->findByAddress( address );
00235 Q_ASSERT(!bookmark.isNull());
00236 return bookmark;
00237 }
00238
00239 void KBookmarkMenu::slotAboutToShowContextMenu( KPopupMenu*, int, QPopupMenu* contextMenu )
00240 {
00241
00242 if (s_highlightedAddress.isNull())
00243 {
00244 KPopupMenu::contextMenuFocus()->hideContextMenu();
00245 return;
00246 }
00247 contextMenu->clear();
00248 fillContextMenu( contextMenu, s_highlightedAddress, 0 );
00249 }
00250
00251 void RMB::fillContextMenu( QPopupMenu* contextMenu, const QString & address, int val )
00252 {
00253 KBookmark bookmark = atAddress(address);
00254
00255 int id;
00256
00257
00258
00259
00260
00261
00262
00263
00264 id = contextMenu->insertItem( SmallIcon("bookmark_add"), i18n( "Add Bookmark Here" ), recv, SLOT(slotRMBActionInsert(int)) );
00265 contextMenu->setItemParameter( id, val );
00266
00267
00268
00269
00270
00271
00272 }
00273
00274 void RMB::fillContextMenu2( QPopupMenu* contextMenu, const QString & address, int val )
00275 {
00276 KBookmark bookmark = atAddress(address);
00277
00278 int id;
00279
00280 if (bookmark.isGroup()) {
00281 id = contextMenu->insertItem( i18n( "Open Folder in Bookmark Editor" ), recv, SLOT(slotRMBActionEditAt(int)) );
00282 contextMenu->setItemParameter( id, val );
00283 contextMenu->insertSeparator();
00284 id = contextMenu->insertItem( SmallIcon("editdelete"), i18n( "Delete Folder" ), recv, SLOT(slotRMBActionRemove(int)) );
00285 contextMenu->setItemParameter( id, val );
00286 contextMenu->insertSeparator();
00287 id = contextMenu->insertItem( i18n( "Properties" ), recv, SLOT(slotRMBActionProperties(int)) );
00288 contextMenu->setItemParameter( id, val );
00289 }
00290 else
00291 {
00292 id = contextMenu->insertItem( i18n( "Copy Link Location" ), recv, SLOT(slotRMBActionCopyLocation(int)) );
00293 contextMenu->setItemParameter( id, val );
00294 contextMenu->insertSeparator();
00295 id = contextMenu->insertItem( SmallIcon("editdelete"), i18n( "Delete Bookmark" ), recv, SLOT(slotRMBActionRemove(int)) );
00296 contextMenu->setItemParameter( id, val );
00297 contextMenu->insertSeparator();
00298 id = contextMenu->insertItem( i18n( "Properties" ), recv, SLOT(slotRMBActionProperties(int)) );
00299 contextMenu->setItemParameter( id, val );
00300 }
00301 }
00302
00303 void RMB::slotRMBActionEditAt( int val )
00304 {
00305 kdDebug(7043) << "KBookmarkMenu::slotRMBActionEditAt" << s_highlightedAddress << endl;
00306 if (invalid(val)) { hidePopup(); return; }
00307
00308 KBookmark bookmark = atAddress(s_highlightedAddress);
00309
00310 m_pManager->slotEditBookmarksAtAddress( s_highlightedAddress );
00311 }
00312
00313 void RMB::slotRMBActionProperties( int val )
00314 {
00315 kdDebug(7043) << "KBookmarkMenu::slotRMBActionProperties" << s_highlightedAddress << endl;
00316 if (invalid(val)) { hidePopup(); return; }
00317
00318 KBookmark bookmark = atAddress(s_highlightedAddress);
00319
00320 QString folder = bookmark.isGroup() ? QString::null : bookmark.url().url();
00321 KBookmarkEditDialog dlg( bookmark.fullText(), folder,
00322 m_pManager, KBookmarkEditDialog::ModifyMode );
00323 if ( dlg.exec() != KDialogBase::Accepted )
00324 return;
00325
00326 makeTextNodeMod(bookmark, "title", dlg.finalTitle());
00327 if ( !dlg.finalUrl().isNull() )
00328 bookmark.internalElement().setAttribute("href", dlg.finalUrl());
00329
00330 kdDebug(7043) << "Requested move to " << dlg.finalAddress() << "!" << endl;
00331
00332 KBookmarkGroup parentBookmark = atAddress(m_parentAddress).toGroup();
00333 m_pManager->emitChanged( parentBookmark );
00334 }
00335
00336 void RMB::slotRMBActionInsert( int val )
00337 {
00338 kdDebug(7043) << "KBookmarkMenu::slotRMBActionInsert" << s_highlightedAddress << endl;
00339 if (invalid(val)) { hidePopup(); return; }
00340
00341 QString url = m_pOwner->currentURL();
00342 if (url.isEmpty())
00343 {
00344 KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL"));
00345 return;
00346 }
00347 QString title = m_pOwner->currentTitle();
00348 if (title.isEmpty())
00349 title = url;
00350
00351 KBookmark bookmark = atAddress( s_highlightedAddress );
00352
00353
00354
00355 if (bookmark.isGroup())
00356 {
00357 KBookmarkGroup parentBookmark = bookmark.toGroup();
00358 Q_ASSERT(!parentBookmark.isNull());
00359 parentBookmark.addBookmark( m_pManager, title, KURL( url ) );
00360 m_pManager->emitChanged( parentBookmark );
00361 }
00362 else
00363 {
00364 KBookmarkGroup parentBookmark = bookmark.parentGroup();
00365 Q_ASSERT(!parentBookmark.isNull());
00366 KBookmark newBookmark = parentBookmark.addBookmark( m_pManager, title, KURL( url ) );
00367 parentBookmark.moveItem( newBookmark, parentBookmark.previous(bookmark) );
00368 m_pManager->emitChanged( parentBookmark );
00369 }
00370 }
00371
00372 void RMB::slotRMBActionRemove( int val )
00373 {
00374
00375 if (invalid(val)) { hidePopup(); return; }
00376
00377 KBookmark bookmark = atAddress( s_highlightedAddress );
00378 bool folder = bookmark.isGroup();
00379
00380 if (KMessageBox::warningYesNo(
00381 m_parentMenu,
00382 folder ? i18n("Are you sure you wish to remove this bookmark folder?")
00383 : i18n("Are you sure you wish to remove this bookmark?"),
00384 folder ? i18n("Bookmark Folder Removal")
00385 : i18n("Bookmark Removal"),
00386 KGuiItem( i18n("Remove"), "editdelete"), KStdGuiItem::cancel())
00387 != KMessageBox::Yes
00388 )
00389 return;
00390
00391 KBookmarkGroup parentBookmark = atAddress( m_parentAddress ).toGroup();
00392 parentBookmark.deleteBookmark( bookmark );
00393 m_pManager->emitChanged( parentBookmark );
00394 if (m_parentMenu)
00395 m_parentMenu->hide();
00396 }
00397
00398 void RMB::slotRMBActionCopyLocation( int val )
00399 {
00400
00401 if (invalid(val)) { hidePopup(); return; }
00402
00403 KBookmark bookmark = atAddress( s_highlightedAddress );
00404
00405 if ( !bookmark.isGroup() )
00406 {
00407 kapp->clipboard()->setData( KBookmarkDrag::newDrag(bookmark, 0),
00408 QClipboard::Selection );
00409 kapp->clipboard()->setData( KBookmarkDrag::newDrag(bookmark, 0),
00410 QClipboard::Clipboard );
00411 }
00412 }
00413
00414 void RMB::hidePopup() {
00415 KPopupMenu::contextMenuFocus()->hideContextMenu();
00416 }
00417
00418
00419
00420
00421
00422 void KBookmarkMenu::fillContextMenu( QPopupMenu* contextMenu, const QString & address, int val )
00423 {
00424 RMB::begin_rmb_action(this);
00425 rmbSelf(this)->fillContextMenu(contextMenu, address, val);
00426 emit aboutToShowContextMenu( rmbSelf(this)->atAddress(address), contextMenu);
00427 rmbSelf(this)->fillContextMenu2(contextMenu, address, val);
00428 }
00429
00430 void KBookmarkMenu::slotRMBActionEditAt( int val )
00431 { RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionEditAt( val ); }
00432
00433 void KBookmarkMenu::slotRMBActionProperties( int val )
00434 { RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionProperties( val ); }
00435
00436 void KBookmarkMenu::slotRMBActionInsert( int val )
00437 { RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionInsert( val ); }
00438
00439 void KBookmarkMenu::slotRMBActionRemove( int val )
00440 { RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionRemove( val ); }
00441
00442 void KBookmarkMenu::slotRMBActionCopyLocation( int val )
00443 { RMB::begin_rmb_action(this); rmbSelf(this)->slotRMBActionCopyLocation( val ); }
00444
00445 void KBookmarkMenu::slotBookmarksChanged( const QString & groupAddress )
00446 {
00447 if (m_bNSBookmark)
00448 return;
00449
00450 if ( groupAddress == m_parentAddress )
00451 {
00452
00453 m_bDirty = true;
00454 }
00455 else
00456 {
00457
00458 QPtrListIterator<KBookmarkMenu> it( m_lstSubMenus );
00459 for (; it.current(); ++it )
00460 {
00461 it.current()->slotBookmarksChanged( groupAddress );
00462 }
00463 }
00464 }
00465
00466 void KBookmarkMenu::refill()
00467 {
00468
00469 m_lstSubMenus.clear();
00470
00471 QPtrListIterator<KAction> it( m_actions );
00472 for (; it.current(); ++it )
00473 it.current()->unplug( m_parentMenu );
00474
00475 m_parentMenu->clear();
00476 m_actions.clear();
00477
00478 fillBookmarkMenu();
00479 m_parentMenu->adjustSize();
00480 }
00481
00482 void KBookmarkMenu::addAddBookmarksList()
00483 {
00484 if (!kapp->authorizeKAction("bookmarks"))
00485 return;
00486
00487 QString title = i18n( "Bookmark Tabs as Folder..." );
00488
00489 KAction * paAddBookmarksList = new KAction( title,
00490 "bookmarks_list_add",
00491 0,
00492 this,
00493 SLOT( slotAddBookmarksList() ),
00494 m_actionCollection, m_bIsRoot ? "add_bookmarks_list" : 0 );
00495
00496 paAddBookmarksList->setToolTip( i18n( "Add a folder of bookmarks for all open tabs." ) );
00497
00498 paAddBookmarksList->plug( m_parentMenu );
00499 m_actions.append( paAddBookmarksList );
00500 }
00501
00502 void KBookmarkMenu::addAddBookmark()
00503 {
00504 if (!kapp->authorizeKAction("bookmarks"))
00505 return;
00506
00507 QString title = i18n( "&Add Bookmark" );
00508 int p;
00509 while ( ( p = title.find( '&' ) ) >= 0 )
00510 title.remove( p, 1 );
00511
00512 KAction * paAddBookmarks = new KAction( title,
00513 "bookmark_add",
00514 m_bIsRoot && m_bAddShortcuts ? KStdAccel::addBookmark() : KShortcut(),
00515 this,
00516 SLOT( slotAddBookmark() ),
00517 m_actionCollection, m_bIsRoot ? "add_bookmark" : 0 );
00518
00519 paAddBookmarks->setToolTip( i18n( "Add a bookmark for the current document" ) );
00520
00521 paAddBookmarks->plug( m_parentMenu );
00522 m_actions.append( paAddBookmarks );
00523 }
00524
00525 void KBookmarkMenu::addEditBookmarks()
00526 {
00527 if (!kapp->authorizeKAction("bookmarks"))
00528 return;
00529
00530 KAction * m_paEditBookmarks = KStdAction::editBookmarks( m_pManager, SLOT( slotEditBookmarks() ),
00531 m_actionCollection, "edit_bookmarks" );
00532 m_paEditBookmarks->plug( m_parentMenu );
00533 m_paEditBookmarks->setToolTip( i18n( "Edit your bookmark collection in a separate window" ) );
00534 m_actions.append( m_paEditBookmarks );
00535 }
00536
00537 void KBookmarkMenu::addNewFolder()
00538 {
00539 if (!kapp->authorizeKAction("bookmarks"))
00540 return;
00541
00542 QString title = i18n( "&New Bookmark Folder..." );
00543 int p;
00544 while ( ( p = title.find( '&' ) ) >= 0 )
00545 title.remove( p, 1 );
00546
00547 KAction * paNewFolder = new KAction( title,
00548 "folder_new",
00549 0,
00550 this,
00551 SLOT( slotNewFolder() ),
00552 m_actionCollection );
00553
00554 paNewFolder->setToolTip( i18n( "Create a new bookmark folder in this menu" ) );
00555
00556 paNewFolder->plug( m_parentMenu );
00557 m_actions.append( paNewFolder );
00558 }
00559
00560 void KBookmarkMenu::fillBookmarkMenu()
00561 {
00562 if (!kapp->authorizeKAction("bookmarks"))
00563 return;
00564
00565 if ( m_bIsRoot )
00566 {
00567 if ( m_bAddBookmark )
00568 {
00569 addAddBookmark();
00570 if ( extOwner() )
00571 addAddBookmarksList();
00572 }
00573
00574 addEditBookmarks();
00575
00576 if ( m_bAddBookmark && !KBookmarkSettings::self()->m_advancedaddbookmark )
00577 addNewFolder();
00578 }
00579
00580 if ( m_bIsRoot
00581 && KBookmarkManager::userBookmarksManager()->path() == m_pManager->path() )
00582 {
00583 bool haveSep = false;
00584
00585 QValueList<QString> keys = KBookmarkMenu::dynamicBookmarksList();
00586 QValueList<QString>::const_iterator it;
00587 for ( it = keys.begin(); it != keys.end(); ++it )
00588 {
00589 DynMenuInfo info;
00590 info = showDynamicBookmarks((*it));
00591
00592 if ( !info.show || !QFile::exists( info.location ) )
00593 continue;
00594
00595 if (!haveSep)
00596 {
00597 m_parentMenu->insertSeparator();
00598 haveSep = true;
00599 }
00600
00601 KActionMenu * actionMenu;
00602 actionMenu = new KImportedBookmarksActionMenu(
00603 info.name, info.type,
00604 m_actionCollection, "kbookmarkmenu" );
00605
00606 actionMenu->setProperty( "type", info.type );
00607 actionMenu->setProperty( "location", info.location );
00608
00609 actionMenu->plug( m_parentMenu );
00610 m_actions.append( actionMenu );
00611
00612 KBookmarkMenu *subMenu =
00613 new KBookmarkMenu( m_pManager, m_pOwner, actionMenu->popupMenu(),
00614 m_actionCollection, false,
00615 m_bAddBookmark, QString::null );
00616 m_lstSubMenus.append(subMenu);
00617
00618 connect(actionMenu->popupMenu(), SIGNAL(aboutToShow()), subMenu, SLOT(slotNSLoad()));
00619 }
00620 }
00621
00622 KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
00623 Q_ASSERT(!parentBookmark.isNull());
00624 bool separatorInserted = false;
00625 for ( KBookmark bm = parentBookmark.first(); !bm.isNull(); bm = parentBookmark.next(bm) )
00626 {
00627 QString text = bm.text();
00628 text.replace( '&', "&&" );
00629 if ( !separatorInserted && m_bIsRoot) {
00630
00631 m_parentMenu->insertSeparator();
00632 separatorInserted = true;
00633 }
00634 if ( !bm.isGroup() )
00635 {
00636 if ( bm.isSeparator() )
00637 {
00638 m_parentMenu->insertSeparator();
00639 }
00640 else
00641 {
00642
00643 KAction * action = new KBookmarkAction( text, bm.icon(), 0,
00644 this, SLOT( slotBookmarkSelected() ),
00645 m_actionCollection, 0 );
00646
00647 action->setProperty( "url", bm.url().url() );
00648 action->setProperty( "address", bm.address() );
00649
00650 action->setToolTip( bm.url().prettyURL() );
00651
00652 action->plug( m_parentMenu );
00653 m_actions.append( action );
00654 }
00655 }
00656 else
00657 {
00658
00659 KActionMenu * actionMenu = new KBookmarkActionMenu( text, bm.icon(),
00660 m_actionCollection,
00661 "kbookmarkmenu" );
00662 actionMenu->setProperty( "address", bm.address() );
00663 actionMenu->plug( m_parentMenu );
00664 m_actions.append( actionMenu );
00665
00666 KBookmarkMenu *subMenu = new KBookmarkMenu( m_pManager, m_pOwner, actionMenu->popupMenu(),
00667 m_actionCollection, false,
00668 m_bAddBookmark,
00669 bm.address() );
00670 connect(subMenu, SIGNAL( aboutToShowContextMenu(const KBookmark &, QPopupMenu * ) ),
00671 this, SIGNAL( aboutToShowContextMenu(const KBookmark &, QPopupMenu * ) ));
00672 m_lstSubMenus.append( subMenu );
00673 }
00674 }
00675
00676 if ( !m_bIsRoot && m_bAddBookmark )
00677 {
00678 if ( m_parentMenu->count() > 0 )
00679 m_parentMenu->insertSeparator();
00680
00681 if ( KBookmarkSettings::self()->m_quickactions )
00682 {
00683 KActionMenu * actionMenu = new KActionMenu( i18n("Quick Actions"), m_actionCollection, 0L );
00684 fillContextMenu( actionMenu->popupMenu(), m_parentAddress, 1 );
00685 actionMenu->plug( m_parentMenu );
00686 m_actions.append( actionMenu );
00687 }
00688 else
00689 {
00690 addAddBookmark();
00691 if ( extOwner() )
00692 addAddBookmarksList();
00693 addNewFolder();
00694 }
00695 }
00696 }
00697
00698 void KBookmarkMenu::slotAddBookmarksList()
00699 {
00700 KExtendedBookmarkOwner *extOwner = dynamic_cast<KExtendedBookmarkOwner*>(m_pOwner);
00701 if (!extOwner)
00702 {
00703 kdWarning() << "erm, sorry ;-)" << endl;
00704 return;
00705 }
00706
00707 KExtendedBookmarkOwner::QStringPairList list;
00708 extOwner->fillBookmarksList( list );
00709
00710 KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
00711 Q_ASSERT(!parentBookmark.isNull());
00712 KBookmarkGroup group = parentBookmark.createNewFolder( m_pManager );
00713 if ( group.isNull() )
00714 return;
00715
00716 KExtendedBookmarkOwner::QStringPairList::const_iterator it;
00717 for ( it = list.begin(); it != list.end(); ++it )
00718 group.addBookmark( m_pManager, (*it).first, KURL((*it).second) );
00719
00720 m_pManager->emitChanged( parentBookmark );
00721 }
00722
00723
00724 void KBookmarkMenu::slotAddBookmark()
00725 {
00726 KBookmarkGroup parentBookmark;
00727 parentBookmark = m_pManager->addBookmarkDialog(m_pOwner->currentURL(), m_pOwner->currentTitle(), m_parentAddress);
00728 if (!parentBookmark.isNull())
00729 m_pManager->emitChanged( parentBookmark );
00730 }
00731
00732 void KBookmarkMenu::slotNewFolder()
00733 {
00734 if ( !m_pOwner ) return;
00735 KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
00736 Q_ASSERT(!parentBookmark.isNull());
00737 KBookmarkGroup group = parentBookmark.createNewFolder( m_pManager );
00738 if ( !group.isNull() )
00739 {
00740 KBookmarkGroup parentGroup = group.parentGroup();
00741 m_pManager->emitChanged( parentGroup );
00742 }
00743 }
00744
00745 void KBookmarkMenu::slotBookmarkSelected()
00746 {
00747
00748 if ( !m_pOwner ) return;
00749 m_pOwner->openBookmarkURL( sender()->property("url").toString() );
00750 }
00751
00752 KExtendedBookmarkOwner* KBookmarkMenu::extOwner()
00753 {
00754 return dynamic_cast<KExtendedBookmarkOwner*>(m_pOwner);
00755 }
00756
00757 void KBookmarkMenu::slotNSLoad()
00758 {
00759
00760 m_parentMenu->disconnect(SIGNAL(aboutToShow()));
00761
00762
00763 KBookmarkMenuNSImporter importer( m_pManager, this, m_actionCollection );
00764 importer.openBookmarks(s_highlightedImportLocation, s_highlightedImportType);
00765 }
00766
00767
00768
00769
00770
00771 KBookmarkEditFields::KBookmarkEditFields(QWidget *main, QBoxLayout *vbox, FieldsSet fieldsSet)
00772 {
00773 bool isF = (fieldsSet != FolderFieldsSet);
00774
00775 QGridLayout *grid = new QGridLayout( vbox, 2, isF ? 2 : 1 );
00776
00777 m_title = new KLineEdit( main );
00778 grid->addWidget( m_title, 0, 1 );
00779 grid->addWidget( new QLabel( m_title, i18n( "Name:" ), main ), 0, 0 );
00780 m_title->setFocus();
00781 if (isF)
00782 {
00783 m_url = new KLineEdit( main );
00784 grid->addWidget( m_url, 1, 1 );
00785 grid->addWidget( new QLabel( m_url, i18n( "Location:" ), main ), 1, 0 );
00786 }
00787 else
00788 {
00789 m_url = 0;
00790 }
00791 }
00792
00793 void KBookmarkEditFields::setName(const QString &str)
00794 {
00795 m_title->setText(str);
00796 }
00797
00798 void KBookmarkEditFields::setLocation(const QString &str)
00799 {
00800 m_url->setText(str);
00801 }
00802
00803
00804
00805
00806
00807
00808 KBookmarkEditDialog::KBookmarkEditDialog(const QString& title, const QString& url, KBookmarkManager * mgr, BookmarkEditType editType, const QString& address,
00809 QWidget * parent, const char * name, const QString& caption )
00810 : KDialogBase(parent, name, true, caption,
00811 (editType == InsertionMode) ? (User1|Ok|Cancel) : (Ok|Cancel),
00812 Ok, false, KGuiItem()),
00813 m_folderTree(0), m_mgr(mgr), m_editType(editType), m_address(address)
00814 {
00815 setButtonOK( KGuiItem((editType == InsertionMode) ? i18n( "Add" ) : i18n( "Update" )) );
00816 if (editType == InsertionMode) {
00817 setButtonText( User1, i18n( "New Folder..." ) );
00818 if (KGlobalSettings::showIconsOnPushButtons()) {
00819 actionButton( User1 )->setIconSet( SmallIcon( "folder_new" ) );
00820 actionButton( Ok )->setIconSet( SmallIcon( "bookmark_add" ) );
00821 }
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 = 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 = 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"