1 /*
2  * This file is part of the KDE project
3  *
4  * Copyright (C) 2006-2009 Thorsten Zachmann <zachmann@kde.org>
5  * Copyright (C) 2007 Thomas Zander <zander@kde.org>
6  * Copyright (C) 2009 Inge Wallin   <inge@lysator.liu.se>
7  * Copyright (C) 2010 Boudewijn Rempt <boud@kogmbh.com>
8  * Copyright (C) 2011 Shantanu Tushar <shaan7in@gmail.com>
9  * Copyright (C) 2013 Arjen Hiemstra <ahiemstra@heimr.nl>
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; either version 2 of
14  * the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24  * 02110-1301 USA
25  */
26 
27 #include "CQPresentationView.h"
28 #include "CQCanvasController.h"
29 
30 #include <KoZoomController.h>
31 #include <KoPADocument.h>
32 #include <KoPACanvasBase.h>
33 #include <KoPAPageBase.h>
34 #include <KoPAViewModeNormal.h>
35 #include <stage/part/KPrDocument.h>
36 #include <KoShapeManager.h>
37 #include <KoShapeLayer.h>
38 #include <KoSelection.h>
39 #include <KoPAPage.h>
40 #include <KoPAMasterPage.h>
41 #include <KoCanvasController.h>
42 #include <KoPACanvasItem.h>
43 #include <KoZoomHandler.h>
44 #include <KoPart.h>
45 
46 #include <QGraphicsItem>
47 
48 //TODO: Cleanup code that is not called
CQPresentationView(KoCanvasController * canvasController,KoPACanvasBase * canvas,KPrDocument * prDocument)49 CQPresentationView::CQPresentationView (KoCanvasController* canvasController, KoPACanvasBase* canvas, KPrDocument* prDocument)
50     : m_canvasController (canvasController), m_zoomController(0), m_paCanvas (canvas), m_prDocument (prDocument), m_page (0)
51 {
52     KoPAViewModeNormal* mode = new KoPAViewModeNormal (this, m_paCanvas);
53     setViewMode (mode);
54 }
55 
~CQPresentationView()56 CQPresentationView::~CQPresentationView()
57 {
58 
59 }
60 
setShowRulers(bool show)61 void CQPresentationView::setShowRulers (bool show)
62 {
63     Q_UNUSED(show);
64 }
65 
editPaste()66 void CQPresentationView::editPaste()
67 {
68 
69 }
70 
pagePaste()71 void CQPresentationView::pagePaste()
72 {
73 
74 }
75 
insertPage()76 void CQPresentationView::insertPage()
77 {
78 
79 }
80 
updatePageNavigationActions()81 void CQPresentationView::updatePageNavigationActions()
82 {
83 
84 }
85 
setActionEnabled(int actions,bool enable)86 void CQPresentationView::setActionEnabled (int actions, bool enable)
87 {
88     Q_UNUSED(actions);
89     Q_UNUSED(enable);
90 
91 }
92 
navigatePage(KoPageApp::PageNavigation pageNavigation)93 void CQPresentationView::navigatePage (KoPageApp::PageNavigation pageNavigation)
94 {
95     Q_UNUSED(pageNavigation);
96 }
97 
activePage() const98 KoPAPageBase* CQPresentationView::activePage() const
99 {
100     return m_page;
101 }
102 
setActivePage(KoPAPageBase * page)103 void CQPresentationView::setActivePage (KoPAPageBase* page)
104 {
105     KoShapeManager* shapeManager = m_paCanvas->shapeManager();
106     KoShapeManager* masterShapeManager = m_paCanvas->masterShapeManager();
107     shapeManager->removeAdditional (m_page);
108     m_page = page;
109     shapeManager->addAdditional (page);
110     QList<KoShape*> shapes = page->shapes();
111     shapeManager->setShapes (shapes, KoShapeManager::AddWithoutRepaint);
112     //Make the top most layer active
113     if (!shapes.isEmpty()) {
114         KoShapeLayer* layer = dynamic_cast<KoShapeLayer*> (shapes.last());
115         shapeManager->selection()->setActiveLayer (layer);
116     }
117 
118     // if the page is not a master page itself set shapes of the master page
119     KoPAPage* paPage = dynamic_cast<KoPAPage*> (page);
120     if (paPage) {
121         KoPAMasterPage* masterPage = paPage->masterPage();
122         QList<KoShape*> masterShapes = masterPage->shapes();
123         masterShapeManager->setShapes (masterShapes, KoShapeManager::AddWithoutRepaint);
124         //Make the top most layer active
125         if (!masterShapes.isEmpty()) {
126             KoShapeLayer* layer = dynamic_cast<KoShapeLayer*> (masterShapes.last());
127             masterShapeManager->selection()->setActiveLayer (layer);
128         }
129     } else {
130         // if the page is a master page no shapes are in the masterShapeManager
131         masterShapeManager->setShapes (QList<KoShape*>());
132     }
133 
134     // Set the current page number in the canvas resource provider
135     m_paCanvas->resourceManager()->setResource (KoCanvasResourceManager::CurrentPage, m_prDocument->pageIndex (page) + 1);
136 }
137 
doUpdateActivePage(KoPAPageBase * page)138 void CQPresentationView::doUpdateActivePage (KoPAPageBase* page)
139 {
140     // save the old offset into the page so we can use it also on the new page
141     setActivePage (page);
142 
143     m_paCanvas->updateSize();
144     KoPageLayout& layout = page->pageLayout();
145 
146     QSizeF pageSize (layout.width, layout.height);
147     //m_paCanvas->setDocumentOrigin(QPointF(layout.width, layout.height));
148     m_paCanvas->setDocumentOrigin (QPointF (0, 0));
149     // the page is in the center of the canvas
150     m_paCanvas->resourceManager()->setResource (KoCanvasResourceManager::PageSize, pageSize);
151     zoomController()->setPageSize(pageSize);
152     zoomController()->setDocumentSize(pageSize);
153     //zoomController()->setZoom(KoZoomMode::ZOOM_PAGE, 1);
154 
155     m_paCanvas->updateSize();
156     QGraphicsItem* item = dynamic_cast<QGraphicsItem*> (m_paCanvas);
157     item->update();
158 
159     proxyObject->emitActivePageChanged();
160 }
161 
zoomController() const162 KoZoomController* CQPresentationView::zoomController() const
163 {
164     return m_zoomController;
165 }
166 
kopaDocument() const167 KoPADocument* CQPresentationView::kopaDocument() const
168 {
169     return m_prDocument;
170 }
171 
kopaCanvas() const172 KoPACanvasBase* CQPresentationView::kopaCanvas() const
173 {
174     return m_paCanvas;
175 }
176 
connectToZoomController()177 void CQPresentationView::connectToZoomController()
178 {
179     connect (zoomController(), SIGNAL(zoomChanged(KoZoomMode::Mode,qreal)), SLOT(slotZoomChanged(KoZoomMode::Mode,qreal)));
180 }
181 
slotZoomChanged(KoZoomMode::Mode mode,qreal zoom)182 void CQPresentationView::slotZoomChanged (KoZoomMode::Mode mode, qreal zoom)
183 {
184     Q_UNUSED (zoom);
185     if (m_page) {
186         if (mode == KoZoomMode::ZOOM_PAGE) {
187             KoPageLayout& layout = m_page->pageLayout();
188             QRectF pageRect (0, 0, layout.width, layout.height);
189             m_canvasController->ensureVisible (m_paCanvas->viewConverter()->documentToView (pageRect));
190         } else if (mode == KoZoomMode::ZOOM_WIDTH) {
191             // horizontally center the page
192             KoPageLayout& layout = m_page->pageLayout();
193             QRectF pageRect (0, 0, layout.width, layout.height);
194             QRect viewRect = m_paCanvas->viewConverter()->documentToView (pageRect).toRect();
195             viewRect.translate (m_paCanvas->documentOrigin());
196             QRect currentVisible (qMax (0, -m_canvasController->canvasOffsetX()),
197                                   qMax (0, -m_canvasController->canvasOffsetY()),
198                                   m_canvasController->visibleWidth(),
199                                   m_canvasController->visibleHeight());
200             int horizontalMove = viewRect.center().x() - currentVisible.center().x();
201             m_canvasController->pan (QPoint (horizontalMove, 0));
202         }
203         dynamic_cast<KoPACanvasItem*> (m_paCanvas)->update();
204     }
205 }
206 
setZoomController(KoZoomController * controller)207 void CQPresentationView::setZoomController(KoZoomController* controller)
208 {
209     m_zoomController = controller;
210 }
211