okular/ui/toc.cpp
Piotr Szymanski 36ab5c8965 - make generators plugins by:
* moving all xpdf stuff from core and part to inside generator_pdf
   * adding abstract KPDFText class and KPDFTextEntity to hold either
     glyph, or word or textline
- support for importing PS files as pdf like on annots branch
- synced with annots branch
- abstract text layer with search for words in different lines
- added RegularArea<NormalizedShape,Shape> template class
  which inherits QValueList<NormalizedShape*> and is used
  to hold regular areas of given shape (finite collections of the shape)
- loading of relevant generators via ktrader for given mimetype
- the deliverables 1 and 2 of my SoC proposition are delivered
  next: 1. fix one spotted regression and 2. code ghostview backend


svn path=/trunk/playground/graphics/oKular/kpdf/; revision=434883
2005-07-15 18:20:57 +00:00

148 lines
4.8 KiB
C++

/***************************************************************************
* Copyright (C) 2004 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 <qheader.h>
#include <klocale.h>
// local includes
#include "toc.h"
#include "core/document.h"
#include "core/page.h"
#include "conf/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 KListViewItem
{
public:
TOCItem( KListView *parent, TOCItem *after, const QDomElement & e )
: KListViewItem( parent, after, e.tagName() ), m_element( e )
{
if ( Settings::tocPageColumn() && e.hasAttribute( "Page" ) )
setText( 1, e.attribute( "Page" ) );
}
TOCItem( KListViewItem *parent, TOCItem *after, const QDomElement & e )
: KListViewItem( parent, after, e.tagName() ), m_element( e )
{
if ( Settings::tocPageColumn() && e.hasAttribute( "Page" ) )
setText( 1, e.attribute( "Page" ) );
}
const QDomElement & element() const
{
return m_element;
}
private:
QDomElement m_element;
};
TOC::TOC(QWidget *parent, KPDFDocument *document) : KListView(parent), m_document(document)
{
addColumn( i18n("Topic") );
if (Settings::tocPageColumn())
addColumn( i18n("Page") );
setSorting(-1);
setRootIsDecorated(true);
setResizeMode(AllColumns);
setAllColumnsShowFocus(true);
connect(this, SIGNAL(clicked(QListViewItem *)), this, SLOT(slotExecuted(QListViewItem *)));
connect(this, SIGNAL(returnPressed(QListViewItem *)), this, SLOT(slotExecuted(QListViewItem *)));
}
uint TOC::observerId() const
{
return TOC_ID;
}
void TOC::notifySetup( const QValueVector< KPDFPage * > & pages, bool documentChanged )
{
if ( !documentChanged || pages.size() < 1 )
return;
// clear contents
clear();
// 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::addChildren( const QDomNode & parentNode, KListViewItem * 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( this, 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( QListViewItem *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, DocumentViewport() );
m_document->processLink( &link );
}
else
{
if ( e.hasAttribute( "Viewport" ) )
{
// if the node has a viewport, set it
m_document->setViewport( DocumentViewport( e.attribute( "Viewport" ) ), TOC_ID );
}
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() )
m_document->setViewport( DocumentViewport( viewport ), TOC_ID );
}
}
}
#include "toc.moc"