kcelbookmarkmenu.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:14k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // -*- mode: c++; c-basic-offset: 2 -*-
  2. /* This file is part of the KDE project
  3.    Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
  4.    This library is free software; you can redistribute it and/or
  5.    modify it under the terms of the GNU Library General Public
  6.    License as published by the Free Software Foundation; either
  7.    version 2 of the License, or (at your option) any later version.
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    You should have received a copy of the GNU Library General Public License
  13.    along with this library; see the file COPYING.LIB.  If not, write to
  14.    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15.    Boston, MA 02111-1307, USA.
  16. */
  17. #include <sys/types.h>
  18. #include <sys/stat.h>
  19. #include <assert.h>
  20. #include <dirent.h>
  21. #include <errno.h>
  22. #include <fcntl.h>
  23. #include <stddef.h>
  24. #include <stdlib.h>
  25. #include <unistd.h>
  26. #include "kcelbookmarkmenu.h"
  27. #include <kbookmarkmenu.h>
  28. #include "kbookmarkimporter.h"
  29. #include "kcelbookmarkowner.h"
  30. #include <qfile.h>
  31. #include <qregexp.h>
  32. #include <kaction.h>
  33. #include <kdebug.h>
  34. #include <klocale.h>
  35. #include <kmessagebox.h>
  36. #include <kpopupmenu.h>
  37. #include <kstdaccel.h>
  38. #include <kstdaction.h>
  39. template class QPtrList<KCelBookmarkMenu>;
  40. /********************************************************************
  41.  *
  42.  * KCelBookmarkMenu
  43.  *
  44.  ********************************************************************/
  45. KCelBookmarkMenu::KCelBookmarkMenu( KBookmarkManager* mgr,
  46.                               KCelBookmarkOwner * _owner, KPopupMenu * _parentMenu,
  47.                               KActionCollection *collec, bool _isRoot, bool _add,
  48.                               const QString & parentAddress )
  49.   : m_bIsRoot(_isRoot), m_bAddBookmark(_add),
  50.     m_pManager(mgr), m_pOwner(_owner),
  51.     m_parentMenu( _parentMenu ),
  52.     m_actionCollection( collec ),
  53.     m_parentAddress( parentAddress )
  54. {
  55.   m_lstSubMenus.setAutoDelete( true );
  56.   m_actions.setAutoDelete( true );
  57.   m_bNSBookmark = m_parentAddress.isNull();
  58.   if ( !m_bNSBookmark ) // not for the netscape bookmark
  59.   {
  60.     //kdDebug(1203) << "KBookmarkMenu::KBookmarkMenu " << this << " address : " << m_parentAddress << endl;
  61.     connect( _parentMenu, SIGNAL( aboutToShow() ),
  62.              SLOT( slotAboutToShow() ) );
  63.     if ( m_bIsRoot )
  64.     {
  65.       connect( m_pManager, SIGNAL( changed(const QString &, const QString &) ),
  66.                SLOT( slotBookmarksChanged(const QString &) ) );
  67.     }
  68.   }
  69.   // add entries that possibly have a shortcut, so they are available _before_ first popup
  70.   if ( m_bIsRoot )
  71.   {
  72.     if ( m_bAddBookmark ) {
  73.           addAddBookmark();
  74.     }
  75.     addEditBookmarks();
  76.   }
  77.   m_bDirty = true;
  78. }
  79. KCelBookmarkMenu::~KCelBookmarkMenu()
  80. {
  81.   //kdDebug(1203) << "KBookmarkMenu::~KBookmarkMenu() " << this << endl;
  82.   QPtrListIterator<KAction> it( m_actions );
  83.   for (; it.current(); ++it )
  84.     it.current()->unplugAll();
  85.   m_lstSubMenus.clear();
  86.   m_actions.clear();
  87. }
  88. void KCelBookmarkMenu::ensureUpToDate()
  89. {
  90.   slotAboutToShow();
  91. }
  92. void KCelBookmarkMenu::slotAboutToShow()
  93. {
  94.   // Did the bookmarks change since the last time we showed them ?
  95.   if ( m_bDirty )
  96.   {
  97.     m_bDirty = false;
  98.     refill();
  99.   }
  100. }
  101. void KCelBookmarkMenu::slotBookmarksChanged( const QString & groupAddress )
  102. {
  103.   if (m_bNSBookmark)
  104.     return;
  105.   if ( groupAddress == m_parentAddress )
  106.   {
  107.     //kdDebug(1203) << "KBookmarkMenu::slotBookmarksChanged -> setting m_bDirty on " << groupAddress << endl;
  108.     m_bDirty = true;
  109.   }
  110.   else
  111.   {
  112.     // Iterate recursively into child menus
  113.     QPtrListIterator<KCelBookmarkMenu> it( m_lstSubMenus );
  114.     for (; it.current(); ++it )
  115.     {
  116.       it.current()->slotBookmarksChanged( groupAddress );
  117.     }
  118.   }
  119. }
  120. void KCelBookmarkMenu::refill()
  121. {
  122.   //kdDebug(1203) << "KBookmarkMenu::refill()" << endl;
  123.   m_lstSubMenus.clear();
  124.   QPtrListIterator<KAction> it( m_actions );
  125.   for (; it.current(); ++it )
  126.     it.current()->unplug( m_parentMenu );
  127.   m_parentMenu->clear();
  128.   m_actions.clear();
  129.   fillBookmarkMenu();
  130.   m_parentMenu->adjustSize();
  131. }
  132. void KCelBookmarkMenu::addAddBookmark()
  133. {
  134.   KAction * paAddBookmarks = new KAction( i18n( "&Add Bookmark" ),
  135.                                           "bookmark_add",
  136.                                           m_bIsRoot ? ALT + Key_B : 0,
  137.                                           this,
  138.                                           SLOT( slotAddBookmark() ),
  139.                                           m_actionCollection, m_bIsRoot ? "add_bookmark" : 0 );
  140.   paAddBookmarks->setStatusText( i18n( "Add a bookmark for the current document" ) );
  141.   paAddBookmarks->plug( m_parentMenu );
  142.   m_actions.append( paAddBookmarks );
  143.   addAddRelativeBookmark();
  144.   addAddSettingsBookmark();
  145. }
  146. void KCelBookmarkMenu::addAddRelativeBookmark()
  147. {
  148.   KAction * paAddBookmarks = new KAction( i18n( "Add &Relative Bookmark" ),
  149.                                           "bookmark_add",
  150.                                           m_bIsRoot ? ALT + Key_R : 0, //m_bIsRoot ? KStdAccel::addBookmark() : KShortcut(),
  151.                                           this,
  152.                                           SLOT( slotAddRelativeBookmark() ),
  153.                                           m_actionCollection, m_bIsRoot ? "add_relative_bookmark" : 0 );
  154.   paAddBookmarks->setStatusText( i18n( "Add a relative bookmark for the current document" ) );
  155.   paAddBookmarks->plug( m_parentMenu );
  156.   m_actions.append( paAddBookmarks );
  157. }
  158. void KCelBookmarkMenu::addAddSettingsBookmark()
  159. {
  160.   KAction * paAddBookmarks = new KAction( i18n( "Add &Settings Bookmark" ),
  161.                                           "bookmark_add",
  162.                                           m_bIsRoot ? CTRL + ALT + Key_S : 0, //m_bIsRoot ? KStdAccel::addBookmark() : KShortcut(),
  163.                                           this,
  164.                                           SLOT( slotAddSettingsBookmark() ),
  165.                                           m_actionCollection, m_bIsRoot ? "add_settings_bookmark" : 0 );
  166.   paAddBookmarks->setStatusText( i18n( "Add a settings bookmark for the current document" ) );
  167.   paAddBookmarks->plug( m_parentMenu );
  168.   m_actions.append( paAddBookmarks );
  169. }
  170. void KCelBookmarkMenu::addEditBookmarks()
  171. {
  172.   KAction * m_paEditBookmarks = KStdAction::editBookmarks( m_pManager, SLOT( slotEditBookmarks() ),
  173.                                                              m_actionCollection, "edit_bookmarks" );
  174.   m_paEditBookmarks->plug( m_parentMenu );
  175.   m_paEditBookmarks->setStatusText( i18n( "Edit your bookmark collection in a separate window" ) );
  176.   m_actions.append( m_paEditBookmarks );
  177. }
  178. void KCelBookmarkMenu::addNewFolder()
  179. {
  180.   KAction * paNewFolder = new KAction( i18n( "&New Folder..." ),
  181.                                        "folder_new", //"folder",
  182.                                        0,
  183.                                        this,
  184.                                        SLOT( slotNewFolder() ),
  185.                                        m_actionCollection );
  186.   paNewFolder->setStatusText( i18n( "Create a new bookmark folder in this menu" ) );
  187.   paNewFolder->plug( m_parentMenu );
  188.   m_actions.append( paNewFolder );
  189. }
  190. void KCelBookmarkMenu::fillBookmarkMenu()
  191. {
  192.   if ( m_bIsRoot )
  193.   {
  194.     if ( m_bAddBookmark )
  195.       addAddBookmark();
  196.     addEditBookmarks();
  197.     if ( m_bAddBookmark )
  198.       addNewFolder();
  199.   }
  200.   KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
  201.   Q_ASSERT(!parentBookmark.isNull());
  202.   bool separatorInserted = false;
  203.   for ( KBookmark bm = parentBookmark.first(); !bm.isNull();  bm = parentBookmark.next(bm) )
  204.   {
  205.     QString text = bm.text();
  206.     text.replace( QRegExp( "&" ), "&&" );
  207.     if ( !separatorInserted && m_bIsRoot) { // inserted before the first konq bookmark, to avoid the separator if no konq bookmark
  208.       m_parentMenu->insertSeparator();
  209.       separatorInserted = true;
  210.     }
  211.     if ( !bm.isGroup() )
  212.     {
  213.       if ( bm.isSeparator() )
  214.       {
  215.         m_parentMenu->insertSeparator();
  216.       }
  217.       else
  218.       {
  219.         // kdDebug(1203) << "Creating URL bookmark menu item for " << bm.text() << endl;
  220.         // create a normal URL item, with ID as a name
  221.         KAction * action = new KAction( text, bm.icon(), 0,
  222.                                         this, SLOT( slotBookmarkSelected() ),
  223.                                         m_actionCollection, bm.url().url().utf8() );
  224.         action->setStatusText( bm.url().prettyURL() );
  225.         action->plug( m_parentMenu );
  226.         m_actions.append( action );
  227.       }
  228.     }
  229.     else
  230.     {
  231.       // kdDebug(1203) << "Creating bookmark submenu named " << bm.text() << endl;
  232.       KActionMenu * actionMenu = new KActionMenu( text, bm.icon(),
  233.                                                   m_actionCollection, 0L );
  234.       actionMenu->plug( m_parentMenu );
  235.       m_actions.append( actionMenu );
  236.       KCelBookmarkMenu *subMenu = new KCelBookmarkMenu( m_pManager, m_pOwner, actionMenu->popupMenu(),
  237.                                                   m_actionCollection, false,
  238.                                                   m_bAddBookmark,
  239.                                                   bm.address() );
  240.       m_lstSubMenus.append( subMenu );
  241.     }
  242.   }
  243.   if ( !m_bIsRoot && m_bAddBookmark )
  244.   {
  245.     m_parentMenu->insertSeparator();
  246.     addAddBookmark();
  247.     addNewFolder();
  248.   }
  249. }
  250. void KCelBookmarkMenu::slotAddRelativeBookmark()
  251. {
  252.   Url Url = m_pOwner->currentUrl(Url::Relative);
  253.   QString url = QString(Url.getAsString().c_str());;
  254.   if (url.isEmpty())
  255.   {
  256.     KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL"));
  257.     return;
  258.   }
  259.   QString title = QString(Url.getName().c_str());
  260.   if (title.isEmpty())
  261.     title = url;
  262.   KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
  263.   Q_ASSERT(!parentBookmark.isNull());
  264.   // If this title is already used, we'll try to find something unused.
  265.   KBookmark ch = parentBookmark.first();
  266.   int count = 1;
  267.   QString uniqueTitle = title;
  268.   do
  269.   {
  270.     while ( !ch.isNull() )
  271.     {
  272.       if ( uniqueTitle == ch.text() )
  273.       {
  274.         // Title already used !
  275.         if ( url != ch.url().url() )
  276.         {
  277.           uniqueTitle = title + QString(" (%1)").arg(++count);
  278.           // New title -> restart search from the beginning
  279.           ch = parentBookmark.first();
  280.           break;
  281.         }
  282.         else
  283.         {
  284.           // this exact URL already exists
  285.           return;
  286.         }
  287.       }
  288.       ch = parentBookmark.next( ch );
  289.     }
  290.   } while ( !ch.isNull() );
  291.   parentBookmark.addBookmark( m_pManager, uniqueTitle, url, m_pOwner->currentIcon() );
  292.   m_pManager->emitChanged( parentBookmark );
  293. }
  294. void KCelBookmarkMenu::slotAddSettingsBookmark()
  295. {
  296.   Url Url = m_pOwner->currentUrl(Url::Settings);
  297.   QString url = QString(Url.getAsString().c_str());;
  298.   if (url.isEmpty())
  299.   {
  300.     KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL"));
  301.     return;
  302.   }
  303.   QString title = QString(Url.getName().c_str());
  304.   if (title.isEmpty())
  305.     title = url;
  306.   KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
  307.   Q_ASSERT(!parentBookmark.isNull());
  308.   // If this title is already used, we'll try to find something unused.
  309.   KBookmark ch = parentBookmark.first();
  310.   int count = 1;
  311.   QString uniqueTitle = title;
  312.   do
  313.   {
  314.     while ( !ch.isNull() )
  315.     {
  316.       if ( uniqueTitle == ch.text() )
  317.       {
  318.         // Title already used !
  319.         if ( url != ch.url().url() )
  320.         {
  321.           uniqueTitle = title + QString(" (%1)").arg(++count);
  322.           // New title -> restart search from the beginning
  323.           ch = parentBookmark.first();
  324.           break;
  325.         }
  326.         else
  327.         {
  328.           // this exact URL already exists
  329.           return;
  330.         }
  331.       }
  332.       ch = parentBookmark.next( ch );
  333.     }
  334.   } while ( !ch.isNull() );
  335.   parentBookmark.addBookmark( m_pManager, uniqueTitle, url, m_pOwner->currentIcon() );
  336.   m_pManager->emitChanged( parentBookmark );
  337. }
  338. void KCelBookmarkMenu::slotAddBookmark()
  339. {
  340.   Url Url = m_pOwner->currentUrl(Url::Absolute);
  341.   QString url = QString(Url.getAsString().c_str());;
  342.   if (url.isEmpty())
  343.   {
  344.     KMessageBox::error( 0L, i18n("Can't add bookmark with empty URL"));
  345.     return;
  346.   }
  347.   QString title = QString(Url.getName().c_str());
  348.   if (title.isEmpty())
  349.     title = url;
  350.   KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
  351.   Q_ASSERT(!parentBookmark.isNull());
  352.   // If this title is already used, we'll try to find something unused.
  353.   KBookmark ch = parentBookmark.first();
  354.   int count = 1;
  355.   QString uniqueTitle = title;
  356.   do
  357.   {
  358.     while ( !ch.isNull() )
  359.     {
  360.       if ( uniqueTitle == ch.text() )
  361.       {
  362.         // Title already used !
  363.         if ( url != ch.url().url() )
  364.         {
  365.           uniqueTitle = title + QString(" (%1)").arg(++count);
  366.           // New title -> restart search from the beginning
  367.           ch = parentBookmark.first();
  368.           break;
  369.         }
  370.         else
  371.         {
  372.           // this exact URL already exists
  373.           return;
  374.         }
  375.       }
  376.       ch = parentBookmark.next( ch );
  377.     }
  378.   } while ( !ch.isNull() );
  379.   parentBookmark.addBookmark( m_pManager, uniqueTitle, url, m_pOwner->currentIcon() );
  380.   m_pManager->emitChanged( parentBookmark );
  381. }
  382. void KCelBookmarkMenu::slotNewFolder()
  383. {
  384.   if ( !m_pOwner ) return; // this view doesn't handle bookmarks...
  385.   KBookmarkGroup parentBookmark = m_pManager->findByAddress( m_parentAddress ).toGroup();
  386.   Q_ASSERT(!parentBookmark.isNull());
  387.   KBookmarkGroup group = parentBookmark.createNewFolder( m_pManager );
  388.   if ( !group.isNull() )
  389.   {
  390.     KBookmarkGroup parentGroup = group.parentGroup();
  391.     m_pManager->emitChanged( parentGroup );
  392.   }
  393. }
  394. void KCelBookmarkMenu::slotBookmarkSelected()
  395. {
  396.   //kdDebug(1203) << "KBookmarkMenu::slotBookmarkSelected()" << endl;
  397.   if ( !m_pOwner ) return; // this view doesn't handle bookmarks...
  398.   //kdDebug(1203) << sender()->name() << endl;
  399.   // The name of the action is the URL to open
  400.   m_pOwner->openBookmarkURL( QString::fromUtf8(sender()->name()) );
  401. }
  402. // -----------------------------------------------------------------------------