1 /* This file is part of the KDE project
2 * Copyright (C) 2007-2008 Thorsten Zachmann <zachmann@kde.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "KoPAViewModeNormal.h"
21
22 #include <QKeyEvent>
23 #include <QPainter>
24
25 #include <KoToolProxy.h>
26 #include <KoShapeManager.h>
27 #include <KoShapePaintingContext.h>
28 #include <KoGridData.h>
29 #include <KoGuidesData.h>
30 #include "KoPACanvasBase.h"
31 #include "KoPADocument.h"
32 #include "KoPAPage.h"
33 #include "KoPAMasterPage.h"
34 #include "KoPAViewBase.h"
35 #include "commands/KoPAChangePageLayoutCommand.h"
36
KoPAViewModeNormal(KoPAViewBase * view,KoPACanvasBase * canvas)37 KoPAViewModeNormal::KoPAViewModeNormal( KoPAViewBase * view, KoPACanvasBase * canvas )
38 : KoPAViewMode( view, canvas )
39 , m_masterMode( false )
40 , m_savedPage( 0 )
41 {
42 }
43
~KoPAViewModeNormal()44 KoPAViewModeNormal::~KoPAViewModeNormal()
45 {
46 }
47
paint(KoPACanvasBase * canvas,QPainter & painter,const QRectF & paintRect)48 void KoPAViewModeNormal::paint(KoPACanvasBase* canvas, QPainter& painter, const QRectF &paintRect)
49 {
50 #ifdef NDEBUG
51 Q_UNUSED(canvas)
52 #else
53 Q_ASSERT( m_canvas == canvas );
54 #endif
55
56 painter.translate( -m_canvas->documentOffset() );
57 painter.setRenderHint( QPainter::Antialiasing );
58 QRect clipRect = paintRect.translated( m_canvas->documentOffset() ).toRect();
59 painter.setClipRect( clipRect );
60
61 painter.translate( m_canvas->documentOrigin().x(), m_canvas->documentOrigin().y() );
62
63 KoViewConverter * converter = m_view->viewConverter( m_canvas );
64 QRectF updateRect = converter->viewToDocument( m_canvas->widgetToView( clipRect ) );
65 KoShapePaintingContext context;
66 m_view->activePage()->paintBackground( painter, *converter, context );
67
68 const KoPageLayout &layout = activePageLayout();
69 QSizeF pageSize(layout.width, layout.height);
70 QRectF gridRect = QRectF(QPointF(), pageSize).intersected(updateRect);
71 if (m_canvas->document()->gridData().paintGridInBackground()) {
72 painter.setRenderHint(QPainter::Antialiasing, false);
73 m_canvas->document()->gridData().paintGrid(painter, *converter, gridRect );
74 }
75
76 // paint the page margins
77 paintMargins( painter, *converter );
78
79 painter.setRenderHint( QPainter::Antialiasing );
80
81 // paint the shapes
82 if ( m_view->activePage()->displayMasterShapes() ) {
83 m_canvas->masterShapeManager()->paint( painter, *converter, false );
84 }
85 m_canvas->shapeManager()->paint( painter, *converter, false );
86
87 painter.setRenderHint( QPainter::Antialiasing, false );
88
89 if (!m_canvas->document()->gridData().paintGridInBackground()) {
90 m_canvas->document()->gridData().paintGrid(painter, *converter, gridRect);
91 }
92 m_canvas->document()->guidesData().paintGuides(painter, *converter, updateRect);
93
94 painter.setRenderHint(QPainter::Antialiasing);
95 m_toolProxy->paint(painter, *converter);
96 }
97
tabletEvent(QTabletEvent * event,const QPointF & point)98 void KoPAViewModeNormal::tabletEvent( QTabletEvent *event, const QPointF &point )
99 {
100 m_toolProxy->tabletEvent( event, point );
101 }
102
mousePressEvent(QMouseEvent * event,const QPointF & point)103 void KoPAViewModeNormal::mousePressEvent( QMouseEvent *event, const QPointF &point )
104 {
105 m_toolProxy->mousePressEvent( event, point );
106 }
107
mouseDoubleClickEvent(QMouseEvent * event,const QPointF & point)108 void KoPAViewModeNormal::mouseDoubleClickEvent( QMouseEvent *event, const QPointF &point )
109 {
110 m_toolProxy->mouseDoubleClickEvent( event, point );
111 }
112
mouseMoveEvent(QMouseEvent * event,const QPointF & point)113 void KoPAViewModeNormal::mouseMoveEvent( QMouseEvent *event, const QPointF &point )
114 {
115 m_toolProxy->mouseMoveEvent( event, point );
116 }
117
mouseReleaseEvent(QMouseEvent * event,const QPointF & point)118 void KoPAViewModeNormal::mouseReleaseEvent( QMouseEvent *event, const QPointF &point )
119 {
120 m_toolProxy->mouseReleaseEvent( event, point );
121 }
122
shortcutOverrideEvent(QKeyEvent * event)123 void KoPAViewModeNormal::shortcutOverrideEvent( QKeyEvent *event )
124 {
125 m_toolProxy->shortcutOverrideEvent( event );
126 }
127
keyPressEvent(QKeyEvent * event)128 void KoPAViewModeNormal::keyPressEvent( QKeyEvent *event )
129 {
130 m_toolProxy->keyPressEvent( event );
131
132 if ( ! event->isAccepted() ) {
133 event->accept();
134
135 switch ( event->key() )
136 {
137 case Qt::Key_Home:
138 m_view->navigatePage( KoPageApp::PageFirst );
139 break;
140 case Qt::Key_PageUp:
141 m_view->navigatePage( KoPageApp::PagePrevious );
142 break;
143 case Qt::Key_PageDown:
144 m_view->navigatePage( KoPageApp::PageNext );
145 break;
146 case Qt::Key_End:
147 m_view->navigatePage( KoPageApp::PageLast );
148 break;
149 default:
150 event->ignore();
151 break;
152 }
153 }
154 }
155
keyReleaseEvent(QKeyEvent * event)156 void KoPAViewModeNormal::keyReleaseEvent( QKeyEvent *event )
157 {
158 m_toolProxy->keyReleaseEvent( event );
159 }
160
wheelEvent(QWheelEvent * event,const QPointF & point)161 void KoPAViewModeNormal::wheelEvent( QWheelEvent * event, const QPointF &point )
162 {
163 m_toolProxy->wheelEvent( event, point );
164 }
165
setMasterMode(bool master)166 void KoPAViewModeNormal::setMasterMode( bool master )
167 {
168 m_masterMode = master;
169 KoPAPage * page = dynamic_cast<KoPAPage *>( m_view->activePage() );
170 if ( m_masterMode ) {
171 if ( page ) {
172 m_view->doUpdateActivePage( page->masterPage() );
173 m_savedPage = page;
174 }
175 }
176 else if ( m_savedPage ) {
177 m_view->doUpdateActivePage( m_savedPage );
178 m_savedPage = 0;
179 }
180 }
181
masterMode()182 bool KoPAViewModeNormal::masterMode()
183 {
184 return m_masterMode;
185 }
186
addShape(KoShape * shape)187 void KoPAViewModeNormal::addShape( KoShape *shape )
188 {
189 // the KoShapeController sets the active layer as parent
190 KoPAPageBase * page( m_view->kopaDocument()->pageByShape( shape ) );
191
192 bool isMaster = dynamic_cast<KoPAMasterPage*>( page ) != 0;
193
194 KoPAPage * p;
195 if ( page == m_view->activePage() ) {
196 m_view->kopaCanvas()->shapeManager()->addShape( shape );
197 }
198 else if ( isMaster && ( p = dynamic_cast<KoPAPage*>( m_view->activePage() ) ) != 0 ) {
199 if ( p->masterPage() == page ) {
200 m_view->kopaCanvas()->masterShapeManager()->addShape( shape );
201 }
202 }
203 }
204
removeShape(KoShape * shape)205 void KoPAViewModeNormal::removeShape( KoShape *shape )
206 {
207 KoPAPageBase * page( m_view->kopaDocument()->pageByShape( shape ) );
208
209 bool isMaster = dynamic_cast<KoPAMasterPage*>( page ) != 0;
210
211 KoPAPage * p;
212 if ( page == m_view->activePage() ) {
213 m_view->kopaCanvas()->shapeManager()->remove( shape );
214 }
215 else if ( isMaster && ( p = dynamic_cast<KoPAPage*>( m_view->activePage() ) ) != 0 ) {
216 if ( p->masterPage() == page ) {
217 m_view->kopaCanvas()->masterShapeManager()->remove( shape );
218 }
219 }
220 }
221
changePageLayout(const KoPageLayout & pageLayout,bool applyToDocument,KUndo2Command * parent)222 void KoPAViewModeNormal::changePageLayout( const KoPageLayout &pageLayout, bool applyToDocument, KUndo2Command *parent )
223 {
224 KoPAPageBase *page = m_view->activePage();
225 KoPAMasterPage *masterPage = dynamic_cast<KoPAMasterPage *>( page );
226 if ( !masterPage ) {
227 masterPage = static_cast<KoPAPage *>( page )->masterPage();
228 }
229
230 new KoPAChangePageLayoutCommand( m_canvas->document(), masterPage, pageLayout, applyToDocument, parent );
231 }
232
paintMargins(QPainter & painter,const KoViewConverter & converter)233 void KoPAViewModeNormal::paintMargins( QPainter &painter, const KoViewConverter &converter )
234 {
235 if (!canvas()->showPageMargins()) {
236 return;
237 }
238 KoPAPageBase *page = m_view->activePage();
239 KoPageLayout pl = page->pageLayout();
240
241 QSizeF pageSize = QSizeF( pl.width, pl.height );
242 QRectF marginRect( pl.leftMargin, pl.topMargin,
243 pageSize.width() - pl.leftMargin - pl.rightMargin,
244 pageSize.height() - pl.topMargin - pl.bottomMargin );
245
246 QPen pen(Qt::gray, 0);
247 painter.setPen( pen );
248 painter.drawRect( converter.documentToView( marginRect ) );
249 }
250
251