~adamreichold/qpdfview/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*

Copyright 2014 S. Razi Alavizadeh
Copyright 2013-2014 Adam Reichold

This file is part of qpdfview.

qpdfview 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.

qpdfview is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with qpdfview.  If not, see <http://www.gnu.org/licenses/>.

*/

#ifndef DOCUMENTLAYOUT_H
#define DOCUMENTLAYOUT_H

#include <QMap>
#include <QPair>

#include "global.h"

class QRectF;

namespace qpdfview
{

class Settings;
class PageItem;

struct DocumentLayout
{
    DocumentLayout();
    virtual ~DocumentLayout() {}

    static DocumentLayout* fromLayoutMode(LayoutMode layoutMode);

    virtual LayoutMode layoutMode() const = 0;

    virtual int currentPage(int page) const = 0;
    virtual int previousPage(int page) const = 0;
    virtual int nextPage(int page, int count) const = 0;

    bool isCurrentPage(const QRectF& visibleRect, const QRectF& pageRect) const;

    virtual QPair< int, int > prefetchRange(int page, int count) const = 0;

    virtual int leftIndex(int index) const = 0;
    virtual int rightIndex(int index, int count) const = 0;

    virtual qreal visibleWidth(int viewportWidth) const = 0;
    qreal visibleHeight(int viewportHeight) const;

    virtual void prepareLayout(const QVector< PageItem* >& pageItems, bool rightToLeft,
                               qreal& left, qreal& right, qreal& height) = 0;

protected:
    static Settings* s_settings;

};

struct SinglePageLayout : public DocumentLayout
{
    LayoutMode layoutMode() const { return SinglePageMode; }

    int currentPage(int page) const;
    int previousPage(int page) const;
    int nextPage(int page, int count) const;

    QPair< int, int > prefetchRange(int page, int count) const;

    int leftIndex(int index) const;
    int rightIndex(int index, int count) const;

    qreal visibleWidth(int viewportWidth) const;

    void prepareLayout(const QVector< PageItem* >& pageItems, bool rightToLeft,
                       qreal& left, qreal& right, qreal& height);

};

struct TwoPagesLayout : public DocumentLayout
{
    LayoutMode layoutMode() const { return TwoPagesMode; }

    int currentPage(int page) const;
    int previousPage(int page) const;
    int nextPage(int page, int count) const;

    QPair< int, int > prefetchRange(int page, int count) const;

    int leftIndex(int index) const;
    int rightIndex(int index, int count) const;

    qreal visibleWidth(int viewportWidth) const;

    void prepareLayout(const QVector< PageItem* >& pageItems, bool rightToLeft,
                       qreal& left, qreal& right, qreal& height);

};

struct TwoPagesWithCoverPageLayout : public TwoPagesLayout
{
    LayoutMode layoutMode() const { return TwoPagesWithCoverPageMode; }

    int currentPage(int page) const;

    int leftIndex(int index) const;
    int rightIndex(int index, int count) const;

};

struct MultiplePagesLayout : public DocumentLayout
{
    LayoutMode layoutMode() const { return MultiplePagesMode; }

    int currentPage(int page) const;
    int previousPage(int page) const;
    int nextPage(int page, int count) const;

    QPair< int, int > prefetchRange(int page, int count) const;

    int leftIndex(int index) const;
    int rightIndex(int index, int count) const;

    qreal visibleWidth(int viewportWidth) const;

    void prepareLayout(const QVector< PageItem* >& pageItems, bool rightToLeft,
                       qreal& left, qreal& right, qreal& height);

};

} // qpdfview

#endif // DOCUMENTLAYOUT_H