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