1 /* This file is part of the KDE project
2  * Copyright (C) 2006, 2010 Thomas Zander <zander@kde.org>
3  * Copyright (C) 2011 Jan Hambrecht <jaham@gmx.net>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20 
21 #include "KoToolBase.h"
22 #include "KoToolBase_p.h"
23 
24 #include "KoCanvasBase.h"
25 #include "KoPointerEvent.h"
26 #include "KoDocumentResourceManager.h"
27 #include "KoCanvasResourceManager.h"
28 #include "KoViewConverter.h"
29 #include "KoShapeController.h"
30 #include "KoShapeBasedDocumentBase.h"
31 #include "KoToolSelection.h"
32 
33 #include <klocalizedstring.h>
34 #include <kactioncollection.h>
35 
36 #include <QAction>
37 #include <QWidget>
38 #include <QFile>
39 #include <QDomDocument>
40 #include <QDomElement>
41 
KoToolBase(KoCanvasBase * canvas)42 KoToolBase::KoToolBase(KoCanvasBase *canvas)
43     : d_ptr(new KoToolBasePrivate(this, canvas))
44 {
45     Q_D(KoToolBase);
46     d->connectSignals();
47 }
48 
KoToolBase(KoToolBasePrivate & dd)49 KoToolBase::KoToolBase(KoToolBasePrivate &dd)
50     : d_ptr(&dd)
51 {
52     Q_D(KoToolBase);
53     d->connectSignals();
54 }
55 
~KoToolBase()56 KoToolBase::~KoToolBase()
57 {
58 
59     //Q_D(const KoToolBase);
60 
61 // Enable this to easily generate action files for tools
62 //    if (d->actionCollection.size() > 0) {
63 
64 //        QDomDocument doc;
65 //        QDomElement e = doc.createElement("Actions");
66 //        e.setAttribute("name", toolId());
67 //        e.setAttribute("version", "1");
68 //        doc.appendChild(e);
69 
70 //        foreach(QAction *ac, d->actionCollection.values()) {
71 //            QAction *action = qobject_cast<QAction*>(ac);
72 //            if (action) {
73 //                QDomElement a = doc.createElement("Action");
74 //                a.setAttribute("name", action->objectName());
75 //                a.setAttribute("icon", action->icon().name());
76 //                a.setAttribute("text" , action->text());
77 //                a.setAttribute("whatsThis" , action->whatsThis());
78 //                a.setAttribute("toolTip" , action->toolTip());
79 //                a.setAttribute("iconText" , action->iconText());
80 //                a.setAttribute("shortcut" , action->shortcut(QAction::ActiveShortcut).toString());
81 //                a.setAttribute("defaultShortcut" , action->shortcut(QAction::DefaultShortcut).toString());
82 //                a.setAttribute("isCheckable" , QString((action->isChecked() ? "true" : "false")));
83 //                a.setAttribute("statusTip", action->statusTip());
84 //                e.appendChild(a);
85 //            }
86 //            else {
87 //                qDebug() << "Got a QAction:" << ac->objectName();
88 //            }
89 
90 //        }
91 //        QFile f(toolId() + ".action");
92 //        f.open(QFile::WriteOnly);
93 //        f.write(doc.toString().toUtf8());
94 //        f.close();
95 
96 //    }
97 //    else {
98 //        qDebug() << "Tool" << toolId() << "has no actions";
99 //    }
100     qDeleteAll(d_ptr->optionWidgets);
101     delete d_ptr;
102 }
103 
104 /// Ultimately only called from Calligra Sheets
updateShapeController(KoShapeBasedDocumentBase * shapeController)105 void KoToolBase::updateShapeController(KoShapeBasedDocumentBase *shapeController)
106 {
107     if (shapeController) {
108         KoDocumentResourceManager *scrm = shapeController->resourceManager();
109         if (scrm) {
110             connect(scrm, SIGNAL(resourceChanged(int,QVariant)),
111                     this, SLOT(documentResourceChanged(int,QVariant)));
112         }
113     }
114 }
115 
deactivate()116 void KoToolBase::deactivate()
117 {
118 }
119 
canvasResourceChanged(int key,const QVariant & res)120 void KoToolBase::canvasResourceChanged(int key, const QVariant & res)
121 {
122     Q_UNUSED(key);
123     Q_UNUSED(res);
124 }
125 
documentResourceChanged(int key,const QVariant & res)126 void KoToolBase::documentResourceChanged(int key, const QVariant &res)
127 {
128     Q_UNUSED(key);
129     Q_UNUSED(res);
130 }
131 
wantsAutoScroll() const132 bool KoToolBase::wantsAutoScroll() const
133 {
134     return true;
135 }
136 
mouseDoubleClickEvent(KoPointerEvent * event)137 void KoToolBase::mouseDoubleClickEvent(KoPointerEvent *event)
138 {
139     event->ignore();
140 }
141 
mouseTripleClickEvent(KoPointerEvent * event)142 void KoToolBase::mouseTripleClickEvent(KoPointerEvent *event)
143 {
144     event->ignore();
145 }
146 
shortcutOverrideEvent(QKeyEvent * e)147 void KoToolBase::shortcutOverrideEvent(QKeyEvent *e)
148 {
149     e->ignore();
150 }
151 
keyPressEvent(QKeyEvent * e)152 void KoToolBase::keyPressEvent(QKeyEvent *e)
153 {
154     e->ignore();
155 }
156 
keyReleaseEvent(QKeyEvent * e)157 void KoToolBase::keyReleaseEvent(QKeyEvent *e)
158 {
159     e->ignore();
160 }
161 
wheelEvent(KoPointerEvent * e)162 void KoToolBase::wheelEvent(KoPointerEvent * e)
163 {
164     e->ignore();
165 }
166 
touchEvent(QTouchEvent * event)167 void KoToolBase::touchEvent(QTouchEvent *event)
168 {
169     event->ignore();
170 }
171 
inputMethodQuery(Qt::InputMethodQuery query,const KoViewConverter &) const172 QVariant KoToolBase::inputMethodQuery(Qt::InputMethodQuery query, const KoViewConverter &) const
173 {
174     Q_D(const KoToolBase);
175     if (d->canvas->canvasWidget() == 0)
176         return QVariant();
177 
178     switch (query) {
179     case Qt::ImMicroFocus:
180         return QRect(d->canvas->canvasWidget()->width() / 2, 0, 1, d->canvas->canvasWidget()->height());
181     case Qt::ImFont:
182         return d->canvas->canvasWidget()->font();
183     default:
184         return QVariant();
185     }
186 }
187 
inputMethodEvent(QInputMethodEvent * event)188 void KoToolBase::inputMethodEvent(QInputMethodEvent * event)
189 {
190     if (! event->commitString().isEmpty()) {
191         QKeyEvent ke(QEvent::KeyPress, -1, 0, event->commitString());
192         keyPressEvent(&ke);
193     }
194     event->accept();
195 }
196 
customPressEvent(KoPointerEvent * event)197 void KoToolBase::customPressEvent(KoPointerEvent * event)
198 {
199     event->ignore();
200 }
201 
customReleaseEvent(KoPointerEvent * event)202 void KoToolBase::customReleaseEvent(KoPointerEvent * event)
203 {
204     event->ignore();
205 }
206 
customMoveEvent(KoPointerEvent * event)207 void KoToolBase::customMoveEvent(KoPointerEvent * event)
208 {
209     event->ignore();
210 }
211 
wantsTouch() const212 bool KoToolBase::wantsTouch() const
213 {
214     return false;
215 }
216 
useCursor(const QCursor & cursor)217 void KoToolBase::useCursor(const QCursor &cursor)
218 {
219     Q_D(KoToolBase);
220     d->currentCursor = cursor;
221     emit cursorChanged(d->currentCursor);
222 }
223 
optionWidgets()224 QList<QPointer<QWidget> > KoToolBase::optionWidgets()
225 {
226     Q_D(KoToolBase);
227     if (d->optionWidgets.empty()) {
228         d->optionWidgets = createOptionWidgets();
229     }
230     return d->optionWidgets;
231 }
232 
addAction(const QString & name,QAction * action)233 void KoToolBase::addAction(const QString &name, QAction *action)
234 {
235     Q_D(KoToolBase);
236     if (action->objectName().isEmpty()) {
237         action->setObjectName(name);
238     }
239     d->actionCollection.insert(name, action);
240 }
241 
actions() const242 QHash<QString, QAction *> KoToolBase::actions() const
243 {
244     Q_D(const KoToolBase);
245     return d->actionCollection;
246 }
247 
action(const QString & name) const248 QAction *KoToolBase::action(const QString &name) const
249 {
250     Q_D(const KoToolBase);
251     return d->actionCollection.value(name);
252 }
253 
createOptionWidget()254 QWidget * KoToolBase::createOptionWidget()
255 {
256     return 0;
257 }
258 
createOptionWidgets()259 QList<QPointer<QWidget> >  KoToolBase::createOptionWidgets()
260 {
261     QList<QPointer<QWidget> > ow;
262     if (QWidget *widget = createOptionWidget()) {
263         if (widget->objectName().isEmpty()) {
264             widget->setObjectName(toolId());
265         }
266         ow.append(widget);
267     }
268     return ow;
269 }
270 
setToolId(const QString & id)271 void KoToolBase::setToolId(const QString &id)
272 {
273     Q_D(KoToolBase);
274     d->toolId = id;
275 }
276 
toolId() const277 QString KoToolBase::toolId() const
278 {
279     Q_D(const KoToolBase);
280     return d->toolId;
281 }
282 
cursor() const283 QCursor KoToolBase::cursor() const
284 {
285     Q_D(const KoToolBase);
286     return d->currentCursor;
287 }
288 
deleteSelection()289 void KoToolBase::deleteSelection()
290 {
291 }
292 
cut()293 void KoToolBase::cut()
294 {
295     copy();
296     deleteSelection();
297 }
298 
popupActionList() const299 QList<QAction*> KoToolBase::popupActionList() const
300 {
301     Q_D(const KoToolBase);
302     return d->popupActionList;
303 }
304 
setPopupActionList(const QList<QAction * > & list)305 void KoToolBase::setPopupActionList(const QList<QAction*> &list)
306 {
307     Q_D(KoToolBase);
308     d->popupActionList = list;
309 }
310 
canvas() const311 KoCanvasBase * KoToolBase::canvas() const
312 {
313     Q_D(const KoToolBase);
314     return d->canvas;
315 }
316 
setStatusText(const QString & statusText)317 void KoToolBase::setStatusText(const QString &statusText)
318 {
319     emit statusTextChanged(statusText);
320 }
321 
handleRadius() const322 uint KoToolBase::handleRadius() const
323 {
324     Q_D(const KoToolBase);
325     if(d->canvas->shapeController()->resourceManager())
326     {
327         return d->canvas->shapeController()->resourceManager()->handleRadius();
328     } else {
329         return 3;
330     }
331 }
332 
grabSensitivity() const333 uint KoToolBase::grabSensitivity() const
334 {
335     Q_D(const KoToolBase);
336     if(d->canvas->shapeController()->resourceManager())
337     {
338         return d->canvas->shapeController()->resourceManager()->grabSensitivity();
339     } else {
340         return 3;
341     }
342 }
343 
handleGrabRect(const QPointF & position) const344 QRectF KoToolBase::handleGrabRect(const QPointF &position) const
345 {
346     Q_D(const KoToolBase);
347     const KoViewConverter * converter = d->canvas->viewConverter();
348     uint handleSize = 2*grabSensitivity();
349     QRectF r = converter->viewToDocument(QRectF(0, 0, handleSize, handleSize));
350     r.moveCenter(position);
351     return r;
352 }
353 
handlePaintRect(const QPointF & position) const354 QRectF KoToolBase::handlePaintRect(const QPointF &position) const
355 {
356     Q_D(const KoToolBase);
357     const KoViewConverter * converter = d->canvas->viewConverter();
358     uint handleSize = 2*handleRadius();
359     QRectF r = converter->viewToDocument(QRectF(0, 0, handleSize, handleSize));
360     r.moveCenter(position);
361     return r;
362 }
363 
setTextMode(bool value)364 void KoToolBase::setTextMode(bool value)
365 {
366     Q_D(KoToolBase);
367     d->isInTextMode=value;
368 }
369 
supportedPasteMimeTypes() const370 QStringList KoToolBase::supportedPasteMimeTypes() const
371 {
372     return QStringList();
373 }
374 
paste()375 bool KoToolBase::paste()
376 {
377     return false;
378 }
379 
copy() const380 void KoToolBase::copy() const
381 {
382 }
383 
dragMoveEvent(QDragMoveEvent * event,const QPointF & point)384 void KoToolBase::dragMoveEvent(QDragMoveEvent *event, const QPointF &point)
385 {
386     Q_UNUSED(event);
387     Q_UNUSED(point);
388 }
389 
dragLeaveEvent(QDragLeaveEvent * event)390 void KoToolBase::dragLeaveEvent(QDragLeaveEvent *event)
391 {
392     Q_UNUSED(event);
393 }
394 
dropEvent(QDropEvent * event,const QPointF & point)395 void KoToolBase::dropEvent(QDropEvent *event, const QPointF &point)
396 {
397     Q_UNUSED(event);
398     Q_UNUSED(point);
399 }
400 
hasSelection()401 bool KoToolBase::hasSelection()
402 {
403     KoToolSelection *sel = selection();
404     return (sel && sel->hasSelection());
405 }
406 
selection()407 KoToolSelection *KoToolBase::selection()
408 {
409     return 0;
410 }
411 
repaintDecorations()412 void KoToolBase::repaintDecorations()
413 {
414 }
415 
isInTextMode() const416 bool KoToolBase::isInTextMode() const
417 {
418     Q_D(const KoToolBase);
419     return d->isInTextMode;
420 }
421