page.h 5.44 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/***************************************************************************
 *   Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>                  *
 *                                                                         *
 *   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.                                   *
 ***************************************************************************/

#ifndef _KPDF_PAGE_H_
#define _KPDF_PAGE_H_

13 14 15
#include <qmap.h>
#include <qvaluelist.h>

16
class QPainter;
17
class QPixmap;
18
class TextPage;
19
class KPDFPageRect;
20 21 22

/**
 * @short Collector for all the data belonging to a page.
23
 * ### MERGE: definition and implementation must be moved to kpdfpage.h/.cpp
24
 * ### RECOMMENT
25
 *
26 27 28 29 30
 * The KPDFPage class contains pixmaps (referenced using obsedvers id as key),
 * a search page (a class used internally for searching data), link classes
 * (that describe links in the current page) plus graphics overlays and more.
 *
 * Note: All objects passed to this class will be destoryed on class deletion.
31
 */
32
class KPDFPage
33
{
34 35 36 37 38 39 40 41 42 43 44 45 46 47
    public:
        KPDFPage( uint number, float width, float height, int rotation );
        ~KPDFPage();

        enum KPDFPageAttributes { Highlight = 1, Bookmark = 2 };

        // query properties (const read-only methods)
        inline int number() const { return m_number; }
        inline int rotation() const { return m_rotation; }
        inline int attributes() const { return m_attributes; }
        inline float width() const { return m_width; }
        inline float height() const { return m_height; }
        inline float ratio() const { return m_height / m_width; }

48
        bool hasPixmap( int id, int width = -1, int height = -1 ) const;
49 50
        bool hasSearchPage() const;
        bool hasRect( int mouseX, int mouseY ) const;
51
        bool hasLink( int mouseX, int mouseY ) const;
52
        const KPDFPageRect * getRect( int mouseX, int mouseY ) const;
53 54
        const QString getTextInRect( const QRect & rect, double zoom = 1.0 ) const;

55
        // operations (by KPDFDocument)
56 57 58 59 60
        inline void setAttribute( int att ) { m_attributes |= att; }
        inline void clearAttribute( int att ) { m_attributes &= ~att; }
        inline void toggleAttribute( int att ) { m_attributes ^= att; }
        bool hasText( const QString & text, bool strictCase, bool fromTop );

61
        // set/delete contents (by KPDFDocument)
62 63
        void setPixmap( int id, QPixmap * pixmap );
        void setSearchPage( TextPage * text );
64
        void setRects( const QValueList< KPDFPageRect * > rects );
65
        void deletePixmap( int id );
66
        void deletePixmapsAndRects();
67 68 69 70 71 72 73 74 75

    private:
        friend class PagePainter;
        int m_number, m_rotation, m_attributes;
        float m_width, m_height;
        double m_sLeft, m_sTop, m_sRight, m_sBottom;

        QMap< int, QPixmap * > m_pixmaps;
        TextPage * m_text;
76
        QValueList< KPDFPageRect * > m_rects;
77
};
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

/**
 * @short A rect on the page that may contain an object.
 *
 * This class describes a rect (geometrical coordinates) and may hold a
 * pointer to an associated object. An object is reparented to this class
 * and deleted when this class is deleted.
 *
 * Objects are stored and read as 'void pointers' so you have to perform
 * the cast on the code that handles the object using information provided
 * by pointerType().
 *
 * Type / Class correspondency tab:
 *  - NoPointer : ''              : no object is stored
 *  - Link      : class KPDFLink  : description of a link
 *  - Image     : class KPDFImage : description of an image
 *
 */
class KPDFPageRect
{
    public:
        KPDFPageRect( int left, int top, int right, int bottom );
        ~KPDFPageRect();

        // query geometric properties
        bool contains( int x, int y ) const;
        QRect geometry() const; //TODO add intersects( qrect )

        // set a pointer to data associated to this rect
        enum PointerType { NoPointer, Link, Image };
        void setPointer( void * object, enum PointerType pType );

        // query type and get a const pointer to the stored object
        PointerType pointerType() const;
        const void * pointer() const;

    private:
        void deletePointer();
        int m_xMin, m_xMax, m_yMin, m_yMax;
        PointerType m_pointerType;
        void * m_pointer;
};



124 125 126 127 128
/**
 * @short Paints a KPDFPage to an open painter using given flags.
 * ### MERGE: since this file will be empty, we might consider renaming
 * ###        definition and implementation to pagepainter.*
 */
129 130 131
class PagePainter
{
    public:
132 133 134
        // list of flags passed to the painting function. by OR-ing those flags
        // you can decide wether or not to permit drawing of a certain feature.
        enum PagePainterFlags { Accessibility = 1, EnhanceLinks = 2,
135
                                EnhanceImages = 4, Highlight = 8 };
136 137 138 139 140 141

        // draw (using painter 'p') the 'page' requested by 'id' using features
        // in 'flags'. 'limits' is the bounding rect of the paint operation,
        // 'width' and 'height' the expected size of page contents (used only
        // to pick up an alternative pixmap if the pixmap of 'id' is missing.
        static void paintPageOnPainter( const KPDFPage * page, int id, int flags,
142 143 144
            QPainter * p, const QRect & limits, int width = -1, int height = -1 );
};

145
#endif