• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegraphics API Reference
  • KDE Home
  • Contact Us
 

okular

  • sources
  • kde-4.14
  • kdegraphics
  • okular
  • core
textdocumentgenerator_p.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2007 by Tobias Koenig <tokoe@kde.org> *
3  * *
4  * This program is free software; you can redistribute it and/or modify *
5  * it under the terms of the GNU General Public License as published by *
6  * the Free Software Foundation; either version 2 of the License, or *
7  * (at your option) any later version. *
8  ***************************************************************************/
9 
10 #ifndef _OKULAR_TEXTDOCUMENTGENERATOR_P_H_
11 #define _OKULAR_TEXTDOCUMENTGENERATOR_P_H_
12 
13 #include <QtGui/QAbstractTextDocumentLayout>
14 #include <QtGui/QTextBlock>
15 #include <QtGui/QTextDocument>
16 
17 #include "action.h"
18 #include "document.h"
19 #include "generator_p.h"
20 #include "textdocumentgenerator.h"
21 
22 namespace Okular {
23 
24 namespace TextDocumentUtils {
25 
26  static void calculateBoundingRect( QTextDocument *document, int startPosition, int endPosition,
27  QRectF &rect, int &page )
28  {
29  const QSizeF pageSize = document->pageSize();
30 
31  const QTextBlock startBlock = document->findBlock( startPosition );
32  const QRectF startBoundingRect = document->documentLayout()->blockBoundingRect( startBlock );
33 
34  const QTextBlock endBlock = document->findBlock( endPosition );
35  const QRectF endBoundingRect = document->documentLayout()->blockBoundingRect( endBlock );
36 
37  QTextLayout *startLayout = startBlock.layout();
38  QTextLayout *endLayout = endBlock.layout();
39  if (!startLayout || !endLayout) {
40  kWarning() << "Start or end layout not found" << startLayout << endLayout;
41  page = -1;
42  return;
43  }
44 
45  int startPos = startPosition - startBlock.position();
46  int endPos = endPosition - endBlock.position();
47  const QTextLine startLine = startLayout->lineForTextPosition( startPos );
48  const QTextLine endLine = endLayout->lineForTextPosition( endPos );
49 
50  double x = startBoundingRect.x() + startLine.cursorToX( startPos );
51  double y = startBoundingRect.y() + startLine.y();
52  double r = endBoundingRect.x() + endLine.cursorToX( endPos );
53  double b = endBoundingRect.y() + endLine.y() + endLine.height();
54 
55  int offset = qRound( y ) % qRound( pageSize.height() );
56 
57  if ( x > r ) { // line break, so return a pseudo character on the start line
58  rect = QRectF( x / pageSize.width(), offset / pageSize.height(),
59  3 / pageSize.width(), startLine.height() / pageSize.height() );
60  page = -1;
61  return;
62  }
63 
64  page = qRound( y ) / qRound( pageSize.height() );
65  rect = QRectF( x / pageSize.width(), offset / pageSize.height(),
66  (r - x) / pageSize.width(), (b - y) / pageSize.height() );
67  }
68 
69  static void calculatePositions( QTextDocument *document, int page, int &start, int &end )
70  {
71  const QAbstractTextDocumentLayout *layout = document->documentLayout();
72  const QSizeF pageSize = document->pageSize();
73  double margin = document->rootFrame()->frameFormat().margin();
74 
78  start = layout->hitTest( QPointF( margin, (page * pageSize.height()) + margin ), Qt::FuzzyHit );
79  end = layout->hitTest( QPointF( margin, ((page + 1) * pageSize.height()) - margin ), Qt::FuzzyHit );
80  }
81 
82  static Okular::DocumentViewport calculateViewport( QTextDocument *document, const QTextBlock &block )
83  {
84  const QSizeF pageSize = document->pageSize();
85  const QRectF rect = document->documentLayout()->blockBoundingRect( block );
86 
87  int page = qRound( rect.y() ) / qRound( pageSize.height() );
88  int offset = qRound( rect.y() ) % qRound( pageSize.height() );
89 
90  Okular::DocumentViewport viewport( page );
91  viewport.rePos.normalizedX = (double)rect.x() / (double)pageSize.width();
92  viewport.rePos.normalizedY = (double)offset / (double)pageSize.height();
93  viewport.rePos.enabled = true;
94  viewport.rePos.pos = Okular::DocumentViewport::Center;
95 
96  return viewport;
97  }
98 }
99 
100 class TextDocumentConverterPrivate
101 {
102  public:
103  TextDocumentConverterPrivate()
104  : mParent( 0 )
105  {
106  }
107 
108  TextDocumentGeneratorPrivate *mParent;
109  QTextDocument *mDocument;
110 };
111 
112 class TextDocumentGeneratorPrivate : public GeneratorPrivate
113 {
114  friend class TextDocumentConverter;
115 
116  public:
117  TextDocumentGeneratorPrivate( TextDocumentConverter *converter )
118  : mConverter( converter ), mDocument( 0 ), mGeneralSettings( 0 )
119  {
120  }
121 
122  virtual ~TextDocumentGeneratorPrivate()
123  {
124  delete mConverter;
125  delete mDocument;
126  }
127 
128  void initializeGenerator();
129 
130  Q_DECLARE_PUBLIC( TextDocumentGenerator )
131 
132  /* reimp */ QVariant metaData( const QString &key, const QVariant &option ) const;
133  /* reimp */ QImage image( PixmapRequest * );
134 
135  void calculateBoundingRect( int startPosition, int endPosition, QRectF &rect, int &page ) const;
136  void calculatePositions( int page, int &start, int &end ) const;
137  Okular::TextPage* createTextPage( int ) const;
138 
139  void addAction( Action *action, int cursorBegin, int cursorEnd );
140  void addAnnotation( Annotation *annotation, int cursorBegin, int cursorEnd );
141  void addTitle( int level, const QString &title, const QTextBlock &position );
142  void addMetaData( const QString &key, const QString &value, const QString &title );
143  void addMetaData( DocumentInfo::Key, const QString &value );
144 
145  void generateLinkInfos();
146  void generateAnnotationInfos();
147  void generateTitleInfos();
148 
149  TextDocumentConverter *mConverter;
150 
151  QTextDocument *mDocument;
152  Okular::DocumentInfo mDocumentInfo;
153  Okular::DocumentSynopsis mDocumentSynopsis;
154 
155  struct TitlePosition
156  {
157  int level;
158  QString title;
159  QTextBlock block;
160  };
161  QList<TitlePosition> mTitlePositions;
162 
163  struct LinkPosition
164  {
165  int startPosition;
166  int endPosition;
167  Action *link;
168  };
169  QList<LinkPosition> mLinkPositions;
170 
171  struct LinkInfo
172  {
173  int page;
174  QRectF boundingRect;
175  Action *link;
176  };
177  QList<LinkInfo> mLinkInfos;
178 
179  struct AnnotationPosition
180  {
181  int startPosition;
182  int endPosition;
183  Annotation *annotation;
184  };
185  QList<AnnotationPosition> mAnnotationPositions;
186 
187  struct AnnotationInfo
188  {
189  int page;
190  QRectF boundingRect;
191  Annotation *annotation;
192  };
193  QList<AnnotationInfo> mAnnotationInfos;
194 
195  TextDocumentSettings *mGeneralSettings;
196 
197  QFont mFont;
198 };
199 
200 }
201 
202 #endif
Okular::TextDocumentUtils::calculateBoundingRect
static void calculateBoundingRect(QTextDocument *document, int startPosition, int endPosition, QRectF &rect, int &page)
Definition: textdocumentgenerator_p.h:26
Okular::TextDocumentGeneratorPrivate::createTextPage
Okular::TextPage * createTextPage(int) const
Generic Generator Implementation.
Definition: textdocumentgenerator.cpp:83
Okular::TextDocumentUtils::calculatePositions
static void calculatePositions(QTextDocument *document, int page, int &start, int &end)
Definition: textdocumentgenerator_p.h:69
QTextDocument::pageSize
pageSize
Okular::TextDocumentGeneratorPrivate::addMetaData
void addMetaData(const QString &key, const QString &value, const QString &title)
Definition: textdocumentgenerator.cpp:160
Okular::TextDocumentGeneratorPrivate::LinkInfo::boundingRect
QRectF boundingRect
Definition: textdocumentgenerator_p.h:174
QTextBlock::position
int position() const
QTextLine::height
qreal height() const
Okular::TextDocumentGeneratorPrivate::mAnnotationInfos
QList< AnnotationInfo > mAnnotationInfos
Definition: textdocumentgenerator_p.h:193
Okular::TextDocumentGeneratorPrivate::LinkPosition::link
Action * link
Definition: textdocumentgenerator_p.h:167
Okular::DocumentViewport::Center
Relative to the center of the page.
Definition: document.h:1055
Okular::TextPage
The TextPage class represents the text of a page by providing.
Definition: textpage.h:90
Okular::TextDocumentGeneratorPrivate::mLinkPositions
QList< LinkPosition > mLinkPositions
Definition: textdocumentgenerator_p.h:169
Okular::TextDocumentConverterPrivate::mDocument
QTextDocument * mDocument
Definition: textdocumentgenerator_p.h:109
Okular::TextDocumentGeneratorPrivate::AnnotationInfo::boundingRect
QRectF boundingRect
Definition: textdocumentgenerator_p.h:190
QRectF::x
qreal x() const
QRectF::y
qreal y() const
QFont
Okular::TextDocumentGeneratorPrivate::AnnotationPosition::startPosition
int startPosition
Definition: textdocumentgenerator_p.h:181
Okular::TextDocumentGeneratorPrivate::AnnotationInfo::annotation
Annotation * annotation
Definition: textdocumentgenerator_p.h:191
Okular::TextDocumentGeneratorPrivate::addTitle
void addTitle(int level, const QString &title, const QTextBlock &position)
Definition: textdocumentgenerator.cpp:150
Okular::TextDocumentGeneratorPrivate::~TextDocumentGeneratorPrivate
virtual ~TextDocumentGeneratorPrivate()
Definition: textdocumentgenerator_p.h:122
QTextDocument::findBlock
QTextBlock findBlock(int pos) const
Okular::TextDocumentGeneratorPrivate::mLinkInfos
QList< LinkInfo > mLinkInfos
Definition: textdocumentgenerator_p.h:177
generator_p.h
Okular::TextDocumentGeneratorPrivate::addAnnotation
void addAnnotation(Annotation *annotation, int cursorBegin, int cursorEnd)
Definition: textdocumentgenerator.cpp:135
QAbstractTextDocumentLayout
Okular::TextDocumentConverterPrivate::mParent
TextDocumentGeneratorPrivate * mParent
Definition: textdocumentgenerator_p.h:108
QPointF
Okular::TextDocumentGeneratorPrivate::calculatePositions
void calculatePositions(int page, int &start, int &end) const
Okular::TextDocumentGeneratorPrivate::metaData
QVariant metaData(const QString &key, const QVariant &option) const
Definition: textdocumentgenerator.cpp:471
QTextLayout::lineForTextPosition
QTextLine lineForTextPosition(int pos) const
Okular::TextDocumentUtils::calculateViewport
static Okular::DocumentViewport calculateViewport(QTextDocument *document, const QTextBlock &block)
Definition: textdocumentgenerator_p.h:82
Okular::TextDocumentGeneratorPrivate::LinkInfo::page
int page
Definition: textdocumentgenerator_p.h:173
Okular::TextDocumentGeneratorPrivate::calculateBoundingRect
void calculateBoundingRect(int startPosition, int endPosition, QRectF &rect, int &page) const
QTextFrameFormat::margin
qreal margin() const
Okular::TextDocumentGeneratorPrivate::LinkInfo
Definition: textdocumentgenerator_p.h:171
Okular::TextDocumentConverterPrivate::TextDocumentConverterPrivate
TextDocumentConverterPrivate()
Definition: textdocumentgenerator_p.h:103
QTextDocument::rootFrame
QTextFrame * rootFrame() const
Okular::TextDocumentGeneratorPrivate::mDocument
QTextDocument * mDocument
Definition: textdocumentgenerator_p.h:151
action.h
Okular::TextDocumentGeneratorPrivate::mGeneralSettings
TextDocumentSettings * mGeneralSettings
Definition: textdocumentgenerator_p.h:195
Okular::TextDocumentConverter
Definition: textdocumentgenerator.h:29
QTextLayout
QTextLine::cursorToX
qreal cursorToX(int *cursorPos, Edge edge) const
Okular::TextDocumentGeneratorPrivate
Definition: textdocumentgenerator_p.h:112
QTextDocument::documentLayout
QAbstractTextDocumentLayout * documentLayout() const
document.h
Okular::TextDocumentGeneratorPrivate::mAnnotationPositions
QList< AnnotationPosition > mAnnotationPositions
Definition: textdocumentgenerator_p.h:185
Okular::TextDocumentGeneratorPrivate::AnnotationPosition::annotation
Annotation * annotation
Definition: textdocumentgenerator_p.h:183
QString
QList
QTextBlock::layout
QTextLayout * layout() const
Okular::TextDocumentGeneratorPrivate::LinkPosition::endPosition
int endPosition
Definition: textdocumentgenerator_p.h:166
Okular::TextDocumentGeneratorPrivate::generateTitleInfos
void generateTitleInfos()
Definition: textdocumentgenerator.cpp:202
Okular::TextDocumentGeneratorPrivate::AnnotationPosition
Definition: textdocumentgenerator_p.h:179
Okular::TextDocumentGeneratorPrivate::AnnotationInfo::page
int page
Definition: textdocumentgenerator_p.h:189
Okular::TextDocumentGeneratorPrivate::mDocumentInfo
Okular::DocumentInfo mDocumentInfo
Definition: textdocumentgenerator_p.h:152
Okular::TextDocumentGeneratorPrivate::LinkInfo::link
Action * link
Definition: textdocumentgenerator_p.h:175
Okular::TextDocumentGeneratorPrivate::TitlePosition::level
int level
Definition: textdocumentgenerator_p.h:157
Okular::TextDocumentGeneratorPrivate::mConverter
TextDocumentConverter * mConverter
Definition: textdocumentgenerator_p.h:149
QImage
Okular::Action
Encapsulates data that describes an action.
Definition: action.h:43
Okular::DocumentInfo
A DOM tree containing information about the document.
Definition: document.h:1086
Okular::TextDocumentGenerator
QTextDocument-based Generator.
Definition: textdocumentgenerator.h:153
Okular::TextDocumentConverterPrivate
Definition: textdocumentgenerator_p.h:100
Okular::TextDocumentGeneratorPrivate::addAction
void addAction(Action *action, int cursorBegin, int cursorEnd)
Definition: textdocumentgenerator.cpp:122
Okular::TextDocumentGeneratorPrivate::mTitlePositions
QList< TitlePosition > mTitlePositions
Definition: textdocumentgenerator_p.h:161
Okular::TextDocumentGeneratorPrivate::generateLinkInfos
void generateLinkInfos()
Definition: textdocumentgenerator.cpp:170
QTextLine
textdocumentgenerator.h
QSizeF
QTextLine::y
qreal y() const
QTextBlock
QTextDocument
QRectF
QAbstractTextDocumentLayout::hitTest
virtual int hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy) const =0
Okular::Annotation
Annotation struct holds properties shared by all annotations.
Definition: annotations.h:90
Okular::TextDocumentGeneratorPrivate::initializeGenerator
void initializeGenerator()
Definition: textdocumentgenerator.cpp:238
Okular::TextDocumentGeneratorPrivate::generateAnnotationInfos
void generateAnnotationInfos()
Definition: textdocumentgenerator.cpp:186
Okular::TextDocumentGeneratorPrivate::LinkPosition::startPosition
int startPosition
Definition: textdocumentgenerator_p.h:165
Okular::TextDocumentGeneratorPrivate::TitlePosition::title
QString title
Definition: textdocumentgenerator_p.h:158
Okular::TextDocumentGeneratorPrivate::AnnotationInfo
Definition: textdocumentgenerator_p.h:187
QAbstractTextDocumentLayout::blockBoundingRect
virtual QRectF blockBoundingRect(const QTextBlock &block) const =0
Okular::TextDocumentGeneratorPrivate::TitlePosition
Definition: textdocumentgenerator_p.h:155
Okular::TextDocumentGeneratorPrivate::AnnotationPosition::endPosition
int endPosition
Definition: textdocumentgenerator_p.h:182
Okular::DocumentViewport
A view on the document.
Definition: document.h:1016
QTextFrame::frameFormat
QTextFrameFormat frameFormat() const
Okular::TextDocumentGeneratorPrivate::mFont
QFont mFont
Definition: textdocumentgenerator_p.h:197
QSizeF::height
qreal height() const
Okular::TextDocumentGeneratorPrivate::TitlePosition::block
QTextBlock block
Definition: textdocumentgenerator_p.h:159
Okular::TextDocumentGeneratorPrivate::mDocumentSynopsis
Okular::DocumentSynopsis mDocumentSynopsis
Definition: textdocumentgenerator_p.h:153
Okular::TextDocumentSettings
TextDocumentSettings.
Definition: textdocumentsettings.h:106
Okular::TextDocumentGeneratorPrivate::LinkPosition
Definition: textdocumentgenerator_p.h:163
Okular::TextDocumentGeneratorPrivate::TextDocumentGeneratorPrivate
TextDocumentGeneratorPrivate(TextDocumentConverter *converter)
Definition: textdocumentgenerator_p.h:117
QSizeF::width
qreal width() const
Okular::GeneratorPrivate
Definition: generator_p.h:35
Okular::DocumentSynopsis
A DOM tree that describes the Table of Contents.
Definition: document.h:1167
Okular::PixmapRequest
Describes a pixmap type request.
Definition: generator.h:575
Okular::TextDocumentGeneratorPrivate::image
QImage image(PixmapRequest *)
Definition: textdocumentgenerator.cpp:393
QVariant
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:19:25 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okular

Skip menu "okular"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdegraphics API Reference

Skip menu "kdegraphics API Reference"
  •     libkdcraw
  •     libkexiv2
  •     libkipi
  •     libksane
  • okular

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal