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