Warning, file /office/calligra/libs/pageapp/KoPAViewModeNormal.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /* This file is part of the KDE project
0002  * Copyright (C) 2007-2008 Thorsten Zachmann <zachmann@kde.org>
0003  *
0004  * This library is free software; you can redistribute it and/or
0005  * modify it under the terms of the GNU Library General Public
0006  * License as published by the Free Software Foundation; either
0007  * version 2 of the License, or (at your option) any later version.
0008  *
0009  * This library is distributed in the hope that it will be useful,
0010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012  * Library General Public License for more details.
0013  *
0014  * You should have received a copy of the GNU Library General Public License
0015  * along with this library; see the file COPYING.LIB.  If not, write to
0016  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017  * Boston, MA 02110-1301, USA.
0018  */
0019 
0020 #include "KoPAViewModeNormal.h"
0021 
0022 #include <QKeyEvent>
0023 #include <QPainter>
0024 
0025 #include <KoToolProxy.h>
0026 #include <KoShapeManager.h>
0027 #include <KoShapePaintingContext.h>
0028 #include <KoGridData.h>
0029 #include <KoGuidesData.h>
0030 #include "KoPACanvasBase.h"
0031 #include "KoPADocument.h"
0032 #include "KoPAPage.h"
0033 #include "KoPAMasterPage.h"
0034 #include "KoPAViewBase.h"
0035 #include "commands/KoPAChangePageLayoutCommand.h"
0036 
0037 KoPAViewModeNormal::KoPAViewModeNormal( KoPAViewBase * view, KoPACanvasBase * canvas )
0038 : KoPAViewMode( view, canvas )
0039 , m_masterMode( false )
0040 , m_savedPage( 0 )
0041 {
0042 }
0043 
0044 KoPAViewModeNormal::~KoPAViewModeNormal()
0045 {
0046 }
0047 
0048 void KoPAViewModeNormal::paint(KoPACanvasBase* canvas, QPainter& painter, const QRectF &paintRect)
0049 {
0050 #ifdef NDEBUG
0051     Q_UNUSED(canvas)
0052 #else
0053     Q_ASSERT( m_canvas == canvas );
0054 #endif
0055 
0056     painter.translate( -m_canvas->documentOffset() );
0057     painter.setRenderHint( QPainter::Antialiasing );
0058     QRect clipRect = paintRect.translated( m_canvas->documentOffset() ).toRect();
0059     painter.setClipRect( clipRect );
0060 
0061     painter.translate( m_canvas->documentOrigin().x(), m_canvas->documentOrigin().y() );
0062 
0063     KoViewConverter * converter = m_view->viewConverter( m_canvas );
0064     QRectF updateRect = converter->viewToDocument( m_canvas->widgetToView( clipRect ) );
0065     KoShapePaintingContext context;
0066     m_view->activePage()->paintBackground( painter, *converter, context );
0067 
0068     const KoPageLayout &layout = activePageLayout();
0069     QSizeF pageSize(layout.width, layout.height);
0070     QRectF gridRect = QRectF(QPointF(), pageSize).intersected(updateRect);
0071     if (m_canvas->document()->gridData().paintGridInBackground()) {
0072         painter.setRenderHint(QPainter::Antialiasing, false);
0073         m_canvas->document()->gridData().paintGrid(painter, *converter, gridRect );
0074     }
0075 
0076     // paint the page margins
0077     paintMargins( painter, *converter );
0078 
0079     painter.setRenderHint( QPainter::Antialiasing );
0080 
0081     // paint the shapes
0082     if ( m_view->activePage()->displayMasterShapes() ) {
0083         m_canvas->masterShapeManager()->paint( painter, *converter, false );
0084     }
0085     m_canvas->shapeManager()->paint( painter, *converter, false );
0086 
0087     painter.setRenderHint( QPainter::Antialiasing, false );
0088 
0089     if (!m_canvas->document()->gridData().paintGridInBackground()) {
0090         m_canvas->document()->gridData().paintGrid(painter, *converter, gridRect);
0091     }
0092     m_canvas->document()->guidesData().paintGuides(painter, *converter, updateRect);
0093 
0094     painter.setRenderHint(QPainter::Antialiasing);
0095     m_toolProxy->paint(painter, *converter);
0096 }
0097 
0098 void KoPAViewModeNormal::tabletEvent( QTabletEvent *event, const QPointF &point )
0099 {
0100     m_toolProxy->tabletEvent( event, point );
0101 }
0102 
0103 void KoPAViewModeNormal::mousePressEvent( QMouseEvent *event, const QPointF &point )
0104 {
0105     m_toolProxy->mousePressEvent( event, point );
0106 }
0107 
0108 void KoPAViewModeNormal::mouseDoubleClickEvent( QMouseEvent *event, const QPointF &point )
0109 {
0110     m_toolProxy->mouseDoubleClickEvent( event, point );
0111 }
0112 
0113 void KoPAViewModeNormal::mouseMoveEvent( QMouseEvent *event, const QPointF &point )
0114 {
0115     m_toolProxy->mouseMoveEvent( event, point );
0116 }
0117 
0118 void KoPAViewModeNormal::mouseReleaseEvent( QMouseEvent *event, const QPointF &point )
0119 {
0120     m_toolProxy->mouseReleaseEvent( event, point );
0121 }
0122 
0123 void KoPAViewModeNormal::shortcutOverrideEvent( QKeyEvent *event )
0124 {
0125     m_toolProxy->shortcutOverrideEvent( event );
0126 }
0127 
0128 void KoPAViewModeNormal::keyPressEvent( QKeyEvent *event )
0129 {
0130     m_toolProxy->keyPressEvent( event );
0131 
0132     if ( ! event->isAccepted() ) {
0133         event->accept();
0134 
0135         switch ( event->key() )
0136         {
0137             case Qt::Key_Home:
0138                 m_view->navigatePage( KoPageApp::PageFirst );
0139                 break;
0140             case Qt::Key_PageUp:
0141                 m_view->navigatePage( KoPageApp::PagePrevious );
0142                 break;
0143             case Qt::Key_PageDown:
0144                 m_view->navigatePage( KoPageApp::PageNext );
0145                 break;
0146             case Qt::Key_End:
0147                 m_view->navigatePage( KoPageApp::PageLast );
0148                 break;
0149             default:
0150                 event->ignore();
0151                 break;
0152         }
0153     }
0154 }
0155 
0156 void KoPAViewModeNormal::keyReleaseEvent( QKeyEvent *event )
0157 {
0158     m_toolProxy->keyReleaseEvent( event );
0159 }
0160 
0161 void KoPAViewModeNormal::wheelEvent( QWheelEvent * event, const QPointF &point )
0162 {
0163     m_toolProxy->wheelEvent( event, point );
0164 }
0165 
0166 void KoPAViewModeNormal::setMasterMode( bool master )
0167 {
0168     m_masterMode = master;
0169     KoPAPage * page = dynamic_cast<KoPAPage *>( m_view->activePage() );
0170     if ( m_masterMode ) {
0171         if ( page ) {
0172             m_view->doUpdateActivePage( page->masterPage() );
0173             m_savedPage = page;
0174         }
0175     }
0176     else if ( m_savedPage ) {
0177         m_view->doUpdateActivePage( m_savedPage );
0178         m_savedPage = 0;
0179     }
0180 }
0181 
0182 bool KoPAViewModeNormal::masterMode()
0183 {
0184     return m_masterMode;
0185 }
0186 
0187 void KoPAViewModeNormal::addShape( KoShape *shape )
0188 {
0189     // the KoShapeController sets the active layer as parent
0190     KoPAPageBase * page( m_view->kopaDocument()->pageByShape( shape ) );
0191 
0192     bool isMaster = dynamic_cast<KoPAMasterPage*>( page ) != 0;
0193 
0194     KoPAPage * p;
0195     if ( page == m_view->activePage() ) {
0196         m_view->kopaCanvas()->shapeManager()->addShape( shape );
0197     }
0198     else if ( isMaster && ( p = dynamic_cast<KoPAPage*>( m_view->activePage() ) ) != 0 ) {
0199         if ( p->masterPage() == page ) {
0200             m_view->kopaCanvas()->masterShapeManager()->addShape( shape );
0201         }
0202     }
0203 }
0204 
0205 void KoPAViewModeNormal::removeShape( KoShape *shape )
0206 {
0207     KoPAPageBase * page( m_view->kopaDocument()->pageByShape( shape ) );
0208 
0209     bool isMaster = dynamic_cast<KoPAMasterPage*>( page ) != 0;
0210 
0211     KoPAPage * p;
0212     if ( page == m_view->activePage() ) {
0213         m_view->kopaCanvas()->shapeManager()->remove( shape );
0214     }
0215     else if ( isMaster && ( p = dynamic_cast<KoPAPage*>( m_view->activePage() ) ) != 0 ) {
0216         if ( p->masterPage() == page ) {
0217             m_view->kopaCanvas()->masterShapeManager()->remove( shape );
0218         }
0219     }
0220 }
0221 
0222 void KoPAViewModeNormal::changePageLayout( const KoPageLayout &pageLayout, bool applyToDocument, KUndo2Command *parent )
0223 {
0224     KoPAPageBase *page = m_view->activePage();
0225     KoPAMasterPage *masterPage = dynamic_cast<KoPAMasterPage *>( page );
0226     if ( !masterPage ) {
0227         masterPage = static_cast<KoPAPage *>( page )->masterPage();
0228     }
0229 
0230     new KoPAChangePageLayoutCommand( m_canvas->document(), masterPage, pageLayout, applyToDocument, parent );
0231 }
0232 
0233 void KoPAViewModeNormal::paintMargins( QPainter &painter, const KoViewConverter &converter )
0234 {
0235     if (!canvas()->showPageMargins()) {
0236         return;
0237     }
0238     KoPAPageBase *page = m_view->activePage();
0239     KoPageLayout pl = page->pageLayout();
0240 
0241     QSizeF pageSize = QSizeF( pl.width, pl.height );
0242     QRectF marginRect( pl.leftMargin, pl.topMargin,
0243                        pageSize.width() - pl.leftMargin - pl.rightMargin,
0244                        pageSize.height() - pl.topMargin - pl.bottomMargin );
0245 
0246     QPen pen(Qt::gray, 0);
0247     painter.setPen( pen );
0248     painter.drawRect( converter.documentToView( marginRect ) );
0249 }
0250