⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toc.cpp.svn-base

📁 okular
💻 SVN-BASE
字号:
/*************************************************************************** *   Copyright (C) 2004-2006 by Albert Astals Cid <tsdgeos@terra.es>       * *                                                                         * *   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.                                   * ***************************************************************************/// qt/kde includes#include <qheaderview.h>#include <qlayout.h>#include <qstringlist.h>#include <qtoolbutton.h>#include <qtreewidget.h>#include <kicon.h>#include <klocale.h>#include <ktreewidgetsearchline.h>// local includes#include "toc.h"#include "core/document.h"#include "core/page.h"#include "settings.h"#include "core/link.h"// uncomment following to enable a 2nd column showing the page referred// by each tree entry note: PDF uses often references to viewports and// they're slow when converted to page number. drop the 2nd column idea.// to enable set TocPageColumn=true in [Nav Panel]class TOCItem : public QTreeWidgetItem{    public:        TOCItem( QTreeWidget *parent, TOCItem *after, const QDomElement & e )            : QTreeWidgetItem( parent, after ), m_element( e )        {            setText( 0, e.tagName() );            if ( KpdfSettings::tocPageColumn() && e.hasAttribute( "Page" ) )                setText( 1, e.attribute( "Page" ) );        }        TOCItem( QTreeWidgetItem *parent, TOCItem *after, const QDomElement & e )            : QTreeWidgetItem( parent, after ), m_element( e )        {            setText( 0, e.tagName() );            if ( KpdfSettings::tocPageColumn() && e.hasAttribute( "Page" ) )                setText( 1, e.attribute( "Page" ) );        }        const QDomElement & element() const        {            return m_element;        }        void setSelected( bool selected )        {            setIcon( 0, selected ? KIcon( treeWidget()->layoutDirection() == Qt::RightToLeft ? "1leftarrow" : "1rightarrow" ) : QIcon() );        }    private:        QDomElement m_element;};TOC::TOC(QWidget *parent, KPDFDocument *document) : QWidget(parent), m_document(document), m_current(0), m_currentPage(-1){    QVBoxLayout *mainlay = new QVBoxLayout( this );    mainlay->setMargin( 0 );    QHBoxLayout *searchlay = new QHBoxLayout();    searchlay->setSpacing( 2 );    mainlay->addLayout( searchlay );    QToolButton *clearBtn =  new QToolButton( this );    clearBtn->setIcon( KIcon( layoutDirection() == Qt::RightToLeft ? "clear_left" : "locationbar_erase" ) );    clearBtn->setToolTip( i18n( "Clear filter" ) );    clearBtn->setAutoRaise( true );    searchlay->addWidget( clearBtn );    m_searchLine = new KTreeWidgetSearchLine( this );    connect( clearBtn, SIGNAL( clicked() ), m_searchLine, SLOT( clear() ) );    searchlay->addWidget( m_searchLine );    m_treeView = new QTreeWidget( this );    mainlay->addWidget( m_treeView );    QStringList cols;    cols.append( i18n("Topic") );    if (KpdfSettings::tocPageColumn())        cols.append( i18n("Page") );    m_treeView->setHeaderLabels( cols );    m_treeView->setSortingEnabled( false );    m_treeView->setRootIsDecorated( true );    m_treeView->setAlternatingRowColors( true );    m_treeView->header()->setResizeMode( QHeaderView::Stretch );    m_treeView->header()->hide();    m_treeView->setSelectionBehavior( QAbstractItemView::SelectRows );    connect( m_treeView, SIGNAL( itemClicked( QTreeWidgetItem *, int ) ), this, SLOT( slotExecuted( QTreeWidgetItem * ) ) );    connect( m_treeView, SIGNAL( itemActivated( QTreeWidgetItem *, int ) ), this, SLOT( slotExecuted( QTreeWidgetItem * ) ) );    m_searchLine->addTreeWidget( m_treeView );}TOC::~TOC(){    m_document->removeObserver( this );}uint TOC::observerId() const{    return TOC_ID;}void TOC::notifySetup( const QVector< KPDFPage * > & /*pages*/, bool documentChanged ){    if ( !documentChanged )        return;    // clear contents    m_treeView->clear();    m_searchLine->clear();    m_current = 0;    m_currentPage = -1;    // request synopsis description (is a dom tree)    const DocumentSynopsis * syn = m_document->documentSynopsis();    // if not present, disable the contents tab    if ( !syn )    {        emit hasTOC( false );        return;    }    // else populate the listview and enable the tab    addChildren( *syn );    emit hasTOC( true );}void TOC::notifyViewportChanged( bool /*smoothMove*/ ){    int newpage = m_document->viewport().pageNumber;    if ( m_currentPage == newpage )        return;    m_currentPage = newpage;    if ( m_current )    {        m_current->setSelected( false );        m_current = 0;    }    QTreeWidgetItemIterator it( m_treeView );    while ( (*it) && !m_current )    {        TOCItem *tmp = dynamic_cast<TOCItem*>( *it );        int p = tmp ? getViewport( tmp->element() ).pageNumber : -1;        if ( p == newpage )        {            m_current = tmp;            m_current->setSelected( true );        }        ++it;    }}void TOC::addChildren( const QDomNode & parentNode, QTreeWidgetItem * parentItem ){    // keep track of the current listViewItem    TOCItem * currentItem = 0;    QDomNode n = parentNode.firstChild();    while( !n.isNull() )    {        // convert the node to an element (sure it is)        QDomElement e = n.toElement();        // insert the entry as top level (listview parented) or 2nd+ level        if ( !parentItem )            currentItem = new TOCItem( m_treeView, currentItem, e );        else            currentItem = new TOCItem( parentItem, currentItem, e );        // descend recursively and advance to the next node        if ( e.hasChildNodes() )            addChildren( n, currentItem );        n = n.nextSibling();    }}void TOC::slotExecuted( QTreeWidgetItem *i ){    TOCItem* tocItem = dynamic_cast<TOCItem*>( i );    // that filters clicks on [+] that for a strange reason don't seem to be TOCItem*    if (tocItem == NULL)        return;    const QDomElement & e = tocItem->element();    QString externalFileName = e.attribute( "ExternalFileName" );    if ( !externalFileName.isEmpty() )    {        KPDFLinkGoto link( externalFileName, getViewport( e ) );        m_document->processLink( &link );    }    else    {        m_document->setViewport( getViewport( e ) );    }}DocumentViewport TOC::getViewport( const QDomElement &e ) const{    if ( e.hasAttribute( "Viewport" ) )    {        // if the node has a viewport, set it        return DocumentViewport( e.attribute( "Viewport" ) );    }    else if ( e.hasAttribute( "ViewportName" ) )    {        // if the node references a viewport, get the reference and set it        const QString & page = e.attribute( "ViewportName" );        const QString & viewport = m_document->getMetaData( "NamedViewport", page );        if ( !viewport.isNull() )            return DocumentViewport( viewport );    }    return DocumentViewport();}#include "toc.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -