okular/ui/bookmarklist.cpp
Jakob Petsovits d9de20dfe7 Masses of icon fixes and adaptions, caused by the original
desire to rename "edit" to "object-edit". I changed my mind
in the middle of the process (but had lots of other changes
lying around already and really need to stop), so many
or all of the newly renamed "object-edit" icons might
vanish again.

But all in all, there are improvements in many places.

svn path=/trunk/KDE/kdegraphics/okular/; revision=744272
2007-12-03 06:27:42 +00:00

276 lines
9 KiB
C++

/***************************************************************************
* Copyright (C) 2006 by Pino Toscano <pino@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "bookmarklist.h"
// qt/kde includes
#include <qaction.h>
#include <qcursor.h>
#include <qheaderview.h>
#include <qlayout.h>
#include <qtoolbar.h>
#include <qtreewidget.h>
#include <kdebug.h>
#include <kicon.h>
#include <klocale.h>
#include <kmenu.h>
#include <ktreewidgetsearchline.h>
#include "pageitemdelegate.h"
#include "core/action.h"
#include "core/bookmarkmanager.h"
#include "core/document.h"
static const int BookmarkItemType = QTreeWidgetItem::UserType + 1;
static const int FileItemType = QTreeWidgetItem::UserType + 2;
class BookmarkItem : public QTreeWidgetItem
{
public:
BookmarkItem( const KBookmark& bm )
: QTreeWidgetItem( BookmarkItemType ), m_bookmark( bm )
{
setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable );
m_url = m_bookmark.url();
m_viewport = Okular::DocumentViewport( m_url.htmlRef() );
m_url.setHTMLRef( QString() );
setText( 0, m_bookmark.fullText() );
if ( m_viewport.isValid() )
setData( 0, PageItemDelegate::PageRole, QString::number( m_viewport.pageNumber + 1 ) );
}
KBookmark& bookmark()
{
return m_bookmark;
}
const Okular::DocumentViewport& viewport() const
{
return m_viewport;
}
KUrl url() const
{
return m_url;
}
private:
KBookmark m_bookmark;
KUrl m_url;
Okular::DocumentViewport m_viewport;
};
BookmarkList::BookmarkList( Okular::Document *document, QWidget *parent )
: QWidget( parent ), m_document( document )
{
QVBoxLayout *mainlay = new QVBoxLayout( this );
mainlay->setMargin( 0 );
mainlay->setSpacing( 6 );
m_searchLine = new KTreeWidgetSearchLine( this );
mainlay->addWidget( m_searchLine );
m_tree = new QTreeWidget( this );
mainlay->addWidget( m_tree );
QStringList cols;
cols.append( "Bookmarks" );
m_tree->setContextMenuPolicy( Qt::CustomContextMenu );
m_tree->setHeaderLabels( cols );
m_tree->setSortingEnabled( false );
m_tree->setRootIsDecorated( true );
m_tree->setAlternatingRowColors( true );
m_tree->setItemDelegate( new PageItemDelegate( m_tree ) );
m_tree->header()->hide();
m_tree->setSelectionBehavior( QAbstractItemView::SelectRows );
m_tree->setEditTriggers( QAbstractItemView::EditKeyPressed );
connect( m_tree, SIGNAL( itemActivated( QTreeWidgetItem *, int ) ), this, SLOT( slotExecuted( QTreeWidgetItem * ) ) );
connect( m_tree, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( slotContextMenu( const QPoint& ) ) );
m_searchLine->addTreeWidget( m_tree );
QToolBar * bookmarkController = new QToolBar( this );
mainlay->addWidget( bookmarkController );
bookmarkController->setObjectName( "BookmarkControlBar" );
// change toolbar appearance
bookmarkController->setIconSize( QSize( 16, 16 ) );
bookmarkController->setMovable( false );
QSizePolicy sp = bookmarkController->sizePolicy();
sp.setVerticalPolicy( QSizePolicy::Minimum );
bookmarkController->setSizePolicy( sp );
// insert a togglebutton [show only bookmarks in the current document]
m_showBoomarkOnlyAction = bookmarkController->addAction( KIcon( "bookmark" ), i18n( "Current document only" ) );
m_showBoomarkOnlyAction->setCheckable( true );
connect( m_showBoomarkOnlyAction, SIGNAL( toggled( bool ) ), this, SLOT( slotFilterBookmarks( bool ) ) );
rebuildTree( m_showBoomarkOnlyAction->isChecked() );
}
BookmarkList::~BookmarkList()
{
}
uint BookmarkList::observerId() const
{
return BOOKMARKLIST_ID;
}
void BookmarkList::notifySetup( const QVector< Okular::Page * > & pages, int setupFlags )
{
if ( !( setupFlags & Okular::DocumentObserver::DocumentChanged ) )
return;
// clear contents
m_searchLine->clear();
rebuildTree( m_showBoomarkOnlyAction->isChecked() );
}
void BookmarkList::notifyPageChanged( int pageNumber, int changedFlags )
{
// only check if there are changes to bookmarks
if ( !( changedFlags & Okular::DocumentObserver::Bookmark ) )
return;
(void)pageNumber;
rebuildTree( m_showBoomarkOnlyAction->isChecked() );
}
void BookmarkList::slotFilterBookmarks( bool on )
{
rebuildTree( on );
}
void BookmarkList::slotExecuted( QTreeWidgetItem * item )
{
BookmarkItem* bmItem = dynamic_cast<BookmarkItem*>( item );
if ( !bmItem || !bmItem->viewport().isValid() )
return;
goTo( bmItem );
}
void BookmarkList::slotChanged( QTreeWidgetItem * item )
{
BookmarkItem* bmItem = dynamic_cast<BookmarkItem*>( item );
if ( !bmItem || !bmItem->viewport().isValid() )
return;
bmItem->bookmark().setFullText( bmItem->text( 0 ) );
m_document->bookmarkManager()->save();
}
void BookmarkList::slotContextMenu( const QPoint& p )
{
QTreeWidgetItem * item = m_tree->itemAt( p );
BookmarkItem* bmItem = item ? dynamic_cast<BookmarkItem*>( item ) : 0;
if ( !bmItem || !bmItem->viewport().isValid() )
return;
KMenu menu( this );
QAction * gotobm = menu.addAction( i18n( "Go to This Bookmark" ) );
QAction * editbm = menu.addAction( KIcon( "edit-rename" ), i18n( "Rename Bookmark" ) );
QAction * removebm = menu.addAction( KIcon( "list-remove" ), i18n( "Remove Bookmark" ) );
QAction * res = menu.exec( QCursor::pos() );
if ( !res )
return;
if ( res == gotobm )
goTo( bmItem );
else if ( res == editbm )
m_tree->editItem( item, 0 );
else if ( res == removebm )
m_document->bookmarkManager()->removeBookmark( bmItem->url(), bmItem->bookmark() );
}
QList<QTreeWidgetItem*> createItems( const KUrl& baseurl, const KBookmark::List& bmlist )
{
(void)baseurl;
QList<QTreeWidgetItem*> ret;
foreach ( const KBookmark& bm, bmlist )
{
// kDebug().nospace() << "checking '" << tmp << "'";
// kDebug().nospace() << " vs '" << baseurl << "'";
// TODO check that bm and baseurl are the same (#ref excluded)
QTreeWidgetItem * item = new BookmarkItem( bm );
ret.append( item );
}
return ret;
}
void BookmarkList::rebuildTree( bool filter )
{
// disconnect and reconnect later, otherwise we'll get many itemChanged()
// signals for all the current items
disconnect( m_tree, SIGNAL( itemChanged( QTreeWidgetItem *, int ) ), this, SLOT( slotChanged( QTreeWidgetItem * ) ) );
m_tree->clear();
KUrl::List urls = m_document->bookmarkManager()->files();
if ( filter )
{
if ( m_document->isOpened() )
{
foreach ( const KUrl& url, urls )
{
if ( url == m_document->currentDocument() )
{
m_tree->addTopLevelItems( createItems( url, m_document->bookmarkManager()->bookmarks( url ) ) );
break;
}
}
}
}
else
{
QTreeWidgetItem * currenturlitem = 0;
foreach ( const KUrl& url, urls )
{
QList<QTreeWidgetItem*> subitems = createItems( url, m_document->bookmarkManager()->bookmarks( url ) );
if ( !subitems.isEmpty() )
{
QTreeWidgetItem * item = new QTreeWidgetItem( m_tree, FileItemType );
QString fileString = url.isLocalFile() ? url.path() : url.prettyUrl();
item->setText( 0, fileString );
item->setToolTip( 0, i18ncp( "%1 is the file name", "%1\n\nOne bookmark", "%1\n\n%2 bookmarks", fileString, subitems.count() ) );
item->addChildren( subitems );
if ( !currenturlitem && url == m_document->currentDocument() )
{
currenturlitem = item;
}
}
}
if ( currenturlitem )
{
currenturlitem->setExpanded( true );
currenturlitem->setIcon( 0, KIcon( "bookmark" ) );
m_tree->scrollToItem( currenturlitem, QAbstractItemView::PositionAtTop );
}
}
connect( m_tree, SIGNAL( itemChanged( QTreeWidgetItem *, int ) ), this, SLOT( slotChanged( QTreeWidgetItem * ) ) );
}
void BookmarkList::goTo( BookmarkItem * item )
{
if ( item->url() == m_document->currentDocument() )
{
m_document->setViewport( item->viewport() );
}
else
{
Okular::GotoAction action( item->url().pathOrUrl(), item->viewport() );
m_document->processAction( &action );
}
}
#include "bookmarklist.moc"