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

okular

  • sources
  • kde-4.12
  • 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 };
110 
111 class TextDocumentGeneratorPrivate : public GeneratorPrivate
112 {
113  friend class TextDocumentConverter;
114 
115  public:
116  TextDocumentGeneratorPrivate( TextDocumentConverter *converter )
117  : mConverter( converter ), mDocument( 0 ), mGeneralSettings( 0 )
118  {
119  }
120 
121  virtual ~TextDocumentGeneratorPrivate()
122  {
123  delete mConverter;
124  delete mDocument;
125  }
126 
127  void initializeGenerator();
128 
129  Q_DECLARE_PUBLIC( TextDocumentGenerator )
130 
131  /* reimp */ QVariant metaData( const QString &key, const QVariant &option ) const;
132  /* reimp */ QImage image( PixmapRequest * );
133 
134  void calculateBoundingRect( int startPosition, int endPosition, QRectF &rect, int &page ) const;
135  void calculatePositions( int page, int &start, int &end ) const;
136  Okular::TextPage* createTextPage( int ) const;
137 
138  void addAction( Action *action, int cursorBegin, int cursorEnd );
139  void addAnnotation( Annotation *annotation, int cursorBegin, int cursorEnd );
140  void addTitle( int level, const QString &title, const QTextBlock &position );
141  void addMetaData( const QString &key, const QString &value, const QString &title );
142  void addMetaData( DocumentInfo::Key, const QString &value );
143 
144  void generateLinkInfos();
145  void generateAnnotationInfos();
146  void generateTitleInfos();
147 
148  TextDocumentConverter *mConverter;
149 
150  QTextDocument *mDocument;
151  Okular::DocumentInfo mDocumentInfo;
152  Okular::DocumentSynopsis mDocumentSynopsis;
153 
154  struct TitlePosition
155  {
156  int level;
157  QString title;
158  QTextBlock block;
159  };
160  QList<TitlePosition> mTitlePositions;
161 
162  struct LinkPosition
163  {
164  int startPosition;
165  int endPosition;
166  Action *link;
167  };
168  QList<LinkPosition> mLinkPositions;
169 
170  struct LinkInfo
171  {
172  int page;
173  QRectF boundingRect;
174  Action *link;
175  };
176  QList<LinkInfo> mLinkInfos;
177 
178  struct AnnotationPosition
179  {
180  int startPosition;
181  int endPosition;
182  Annotation *annotation;
183  };
184  QList<AnnotationPosition> mAnnotationPositions;
185 
186  struct AnnotationInfo
187  {
188  int page;
189  QRectF boundingRect;
190  Annotation *annotation;
191  };
192  QList<AnnotationInfo> mAnnotationInfos;
193 
194  TextDocumentSettings *mGeneralSettings;
195 
196  QFont mFont;
197 };
198 
199 }
200 
201 #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:61
Okular::TextDocumentUtils::calculatePositions
static void calculatePositions(QTextDocument *document, int page, int &start, int &end)
Definition: textdocumentgenerator_p.h:69
Okular::TextDocumentGeneratorPrivate::addMetaData
void addMetaData(const QString &key, const QString &value, const QString &title)
Definition: textdocumentgenerator.cpp:138
Okular::TextDocumentGeneratorPrivate::LinkInfo::boundingRect
QRectF boundingRect
Definition: textdocumentgenerator_p.h:173
Okular::TextDocumentGeneratorPrivate::mAnnotationInfos
QList< AnnotationInfo > mAnnotationInfos
Definition: textdocumentgenerator_p.h:192
Okular::TextDocumentGeneratorPrivate::LinkPosition::link
Action * link
Definition: textdocumentgenerator_p.h:166
Okular::DocumentViewport::Center
Relative to the center of the page.
Definition: document.h:1042
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:168
Okular::TextDocumentGeneratorPrivate::AnnotationInfo::boundingRect
QRectF boundingRect
Definition: textdocumentgenerator_p.h:189
Okular::TextDocumentGeneratorPrivate::AnnotationPosition::startPosition
int startPosition
Definition: textdocumentgenerator_p.h:180
Okular::TextDocumentGeneratorPrivate::AnnotationInfo::annotation
Annotation * annotation
Definition: textdocumentgenerator_p.h:190
Okular::TextDocumentGeneratorPrivate::addTitle
void addTitle(int level, const QString &title, const QTextBlock &position)
Definition: textdocumentgenerator.cpp:128
Okular::TextDocumentGeneratorPrivate::~TextDocumentGeneratorPrivate
virtual ~TextDocumentGeneratorPrivate()
Definition: textdocumentgenerator_p.h:121
Okular::TextDocumentGeneratorPrivate::mLinkInfos
QList< LinkInfo > mLinkInfos
Definition: textdocumentgenerator_p.h:176
generator_p.h
Okular::TextDocumentGeneratorPrivate::addAnnotation
void addAnnotation(Annotation *annotation, int cursorBegin, int cursorEnd)
Definition: textdocumentgenerator.cpp:113
Okular::TextDocumentConverterPrivate::mParent
TextDocumentGeneratorPrivate * mParent
Definition: textdocumentgenerator_p.h:108
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:438
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:172
Okular::TextDocumentGeneratorPrivate::calculateBoundingRect
void calculateBoundingRect(int startPosition, int endPosition, QRectF &rect, int &page) const
Okular::TextDocumentGeneratorPrivate::LinkInfo
Definition: textdocumentgenerator_p.h:170
Okular::TextDocumentConverterPrivate::TextDocumentConverterPrivate
TextDocumentConverterPrivate()
Definition: textdocumentgenerator_p.h:103
Okular::TextDocumentGeneratorPrivate::mDocument
QTextDocument * mDocument
Definition: textdocumentgenerator_p.h:150
action.h
Okular::TextDocumentGeneratorPrivate::mGeneralSettings
TextDocumentSettings * mGeneralSettings
Definition: textdocumentgenerator_p.h:194
Okular::TextDocumentConverter
Definition: textdocumentgenerator.h:29
Okular::TextDocumentGeneratorPrivate
Definition: textdocumentgenerator_p.h:111
document.h
Okular::TextDocumentGeneratorPrivate::mAnnotationPositions
QList< AnnotationPosition > mAnnotationPositions
Definition: textdocumentgenerator_p.h:184
Okular::TextDocumentGeneratorPrivate::AnnotationPosition::annotation
Annotation * annotation
Definition: textdocumentgenerator_p.h:182
Okular::TextDocumentGeneratorPrivate::LinkPosition::endPosition
int endPosition
Definition: textdocumentgenerator_p.h:165
Okular::TextDocumentGeneratorPrivate::generateTitleInfos
void generateTitleInfos()
Definition: textdocumentgenerator.cpp:180
Okular::TextDocumentGeneratorPrivate::AnnotationPosition
Definition: textdocumentgenerator_p.h:178
Okular::TextDocumentGeneratorPrivate::AnnotationInfo::page
int page
Definition: textdocumentgenerator_p.h:188
Okular::TextDocumentGeneratorPrivate::mDocumentInfo
Okular::DocumentInfo mDocumentInfo
Definition: textdocumentgenerator_p.h:151
Okular::TextDocumentGeneratorPrivate::LinkInfo::link
Action * link
Definition: textdocumentgenerator_p.h:174
Okular::TextDocumentGeneratorPrivate::TitlePosition::level
int level
Definition: textdocumentgenerator_p.h:156
Okular::TextDocumentGeneratorPrivate::mConverter
TextDocumentConverter * mConverter
Definition: textdocumentgenerator_p.h:148
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:1073
Okular::TextDocumentGenerator
QTextDocument-based Generator.
Definition: textdocumentgenerator.h:136
Okular::TextDocumentConverterPrivate
Definition: textdocumentgenerator_p.h:100
Okular::TextDocumentGeneratorPrivate::addAction
void addAction(Action *action, int cursorBegin, int cursorEnd)
Definition: textdocumentgenerator.cpp:100
Okular::TextDocumentGeneratorPrivate::mTitlePositions
QList< TitlePosition > mTitlePositions
Definition: textdocumentgenerator_p.h:160
Okular::TextDocumentGeneratorPrivate::generateLinkInfos
void generateLinkInfos()
Definition: textdocumentgenerator.cpp:148
textdocumentgenerator.h
Okular::Annotation
Annotation struct holds properties shared by all annotations.
Definition: annotations.h:90
Okular::TextDocumentGeneratorPrivate::initializeGenerator
void initializeGenerator()
Definition: textdocumentgenerator.cpp:216
Okular::TextDocumentGeneratorPrivate::generateAnnotationInfos
void generateAnnotationInfos()
Definition: textdocumentgenerator.cpp:164
Okular::TextDocumentGeneratorPrivate::LinkPosition::startPosition
int startPosition
Definition: textdocumentgenerator_p.h:164
Okular::TextDocumentGeneratorPrivate::TitlePosition::title
QString title
Definition: textdocumentgenerator_p.h:157
Okular::TextDocumentGeneratorPrivate::AnnotationInfo
Definition: textdocumentgenerator_p.h:186
Okular::TextDocumentGeneratorPrivate::TitlePosition
Definition: textdocumentgenerator_p.h:154
Okular::TextDocumentGeneratorPrivate::AnnotationPosition::endPosition
int endPosition
Definition: textdocumentgenerator_p.h:181
Okular::DocumentViewport
A view on the document.
Definition: document.h:1003
Okular::TextDocumentGeneratorPrivate::mFont
QFont mFont
Definition: textdocumentgenerator_p.h:196
Okular::TextDocumentGeneratorPrivate::TitlePosition::block
QTextBlock block
Definition: textdocumentgenerator_p.h:158
Okular::TextDocumentGeneratorPrivate::mDocumentSynopsis
Okular::DocumentSynopsis mDocumentSynopsis
Definition: textdocumentgenerator_p.h:152
Okular::TextDocumentSettings
TextDocumentSettings.
Definition: textdocumentsettings.h:106
Okular::TextDocumentGeneratorPrivate::LinkPosition
Definition: textdocumentgenerator_p.h:162
Okular::TextDocumentGeneratorPrivate::TextDocumentGeneratorPrivate
TextDocumentGeneratorPrivate(TextDocumentConverter *converter)
Definition: textdocumentgenerator_p.h:116
Okular::GeneratorPrivate
Definition: generator_p.h:34
Okular::DocumentSynopsis
A DOM tree that describes the Table of Contents.
Definition: document.h:1154
Okular::PixmapRequest
Describes a pixmap type request.
Definition: generator.h:522
Okular::TextDocumentGeneratorPrivate::image
QImage image(PixmapRequest *)
Definition: textdocumentgenerator.cpp:368
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:45:03 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