qdnd.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/gui/kernel/qdnd.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the QtGui module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qplatformdefs.h"-
35-
36#include "qbitmap.h"-
37#include "qdrag.h"-
38#include "qpixmap.h"-
39#include "qevent.h"-
40#include "qfile.h"-
41#include "qtextcodec.h"-
42#include "qguiapplication.h"-
43#include "qpoint.h"-
44#include "qbuffer.h"-
45#include "qimage.h"-
46#include "qpainter.h"-
47#include "qregexp.h"-
48#include "qdir.h"-
49#include "qdnd_p.h"-
50#include "qimagereader.h"-
51#include "qimagewriter.h"-
52#include "qdebug.h"-
53#include <ctype.h>-
54#include <qpa/qplatformintegration.h>-
55#include <qpa/qplatformdrag.h>-
56-
57#include <private/qguiapplication_p.h>-
58-
59#ifndef QT_NO_DRAGANDDROP-
60-
61QT_BEGIN_NAMESPACE-
62-
63// the universe's only drag manager-
64QDragManager *QDragManager::m_instance = 0;-
65-
66-
67QDragManager::QDragManager()-
68 : QObject(qApp), m_platformDropData(0), m_currentDropTarget(0),-
69 m_platformDrag(QGuiApplicationPrivate::platformIntegration()->drag()),-
70 m_object(0)-
71{-
72 Q_ASSERT(!m_instance);-
73-
74 if (m_platformDrag)
m_platformDragDescription
TRUEnever evaluated
FALSEnever evaluated
0
75 m_platformDropData = m_platformDrag->platformDropData();
never executed: m_platformDropData = m_platformDrag->platformDropData();
0
76}
never executed: end of block
0
77-
78-
79QDragManager::~QDragManager()-
80{-
81 m_instance = 0;-
82}
never executed: end of block
0
83-
84QDragManager *QDragManager::self()-
85{-
86 if (!m_instance && !QGuiApplication::closingDown())
!m_instanceDescription
TRUEnever evaluated
FALSEnever evaluated
!QGuiApplicati...:closingDown()Description
TRUEnever evaluated
FALSEnever evaluated
0
87 m_instance = new QDragManager;
never executed: m_instance = new QDragManager;
0
88 return m_instance;
never executed: return m_instance;
0
89}-
90-
91QObject *QDragManager::source() const-
92{-
93 if (m_object)
m_objectDescription
TRUEnever evaluated
FALSEnever evaluated
0
94 return m_object->source();
never executed: return m_object->source();
0
95 return 0;
never executed: return 0;
0
96}-
97-
98void QDragManager::setCurrentTarget(QObject *target, bool dropped)-
99{-
100 if (m_currentDropTarget == target)
m_currentDropTarget == targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
101 return;
never executed: return;
0
102-
103 m_currentDropTarget = target;-
104 if (!dropped && m_object) {
!droppedDescription
TRUEnever evaluated
FALSEnever evaluated
m_objectDescription
TRUEnever evaluated
FALSEnever evaluated
0
105 m_object->d_func()->target = target;-
106 emit m_object->targetChanged(target);-
107 }
never executed: end of block
0
108}
never executed: end of block
0
109-
110QObject *QDragManager::currentTarget() const-
111{-
112 return m_currentDropTarget;
never executed: return m_currentDropTarget;
0
113}-
114-
115Qt::DropAction QDragManager::drag(QDrag *o)-
116{-
117 if (!o || m_object == o)
!oDescription
TRUEnever evaluated
FALSEnever evaluated
m_object == oDescription
TRUEnever evaluated
FALSEnever evaluated
0
118 return Qt::IgnoreAction;
never executed: return Qt::IgnoreAction;
0
119-
120 if (!m_platformDrag || !o->source()) {
!m_platformDragDescription
TRUEnever evaluated
FALSEnever evaluated
!o->source()Description
TRUEnever evaluated
FALSEnever evaluated
0
121 o->deleteLater();-
122 return Qt::IgnoreAction;
never executed: return Qt::IgnoreAction;
0
123 }-
124-
125 if (m_object) {
m_objectDescription
TRUEnever evaluated
FALSEnever evaluated
0
126 qWarning("QDragManager::drag in possibly invalid state");-
127 return Qt::IgnoreAction;
never executed: return Qt::IgnoreAction;
0
128 }-
129-
130 m_object = o;-
131-
132 m_object->d_func()->target = 0;-
133-
134 QGuiApplicationPrivate::instance()->notifyDragStarted(o);-
135 const Qt::DropAction result = m_platformDrag->drag(m_object);-
136 m_object = 0;-
137 if (!m_platformDrag->ownsDragObject())
!m_platformDra...nsDragObject()Description
TRUEnever evaluated
FALSEnever evaluated
0
138 o->deleteLater();
never executed: o->deleteLater();
0
139 return result;
never executed: return result;
0
140}-
141-
142#endif // QT_NO_DRAGANDDROP-
143-
144#if !(defined(QT_NO_DRAGANDDROP) && defined(QT_NO_CLIPBOARD))-
145-
146static QStringList imageReadMimeFormats()-
147{-
148 QStringList formats;-
149 QList<QByteArray> imageFormats = QImageReader::supportedImageFormats();-
150 const int numImageFormats = imageFormats.size();-
151 formats.reserve(numImageFormats);-
152 for (int i = 0; i < numImageFormats; ++i) {
i < numImageFormatsDescription
TRUEnever evaluated
FALSEnever evaluated
0
153 QString format = QLatin1String("image/");-
154 format += QString::fromLatin1(imageFormats.at(i).toLower());-
155 formats.append(format);-
156 }
never executed: end of block
0
157-
158 //put png at the front because it is best-
159 int pngIndex = formats.indexOf(QLatin1String("image/png"));-
160 if (pngIndex != -1 && pngIndex != 0)
pngIndex != -1Description
TRUEnever evaluated
FALSEnever evaluated
pngIndex != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
161 formats.move(pngIndex, 0);
never executed: formats.move(pngIndex, 0);
0
162-
163 return formats;
never executed: return formats;
0
164}-
165-
166-
167static QStringList imageWriteMimeFormats()-
168{-
169 QStringList formats;-
170 QList<QByteArray> imageFormats = QImageWriter::supportedImageFormats();-
171 const int numImageFormats = imageFormats.size();-
172 formats.reserve(numImageFormats);-
173 for (int i = 0; i < numImageFormats; ++i) {
i < numImageFormatsDescription
TRUEnever evaluated
FALSEnever evaluated
0
174 QString format = QLatin1String("image/");-
175 format += QString::fromLatin1(imageFormats.at(i).toLower());-
176 formats.append(format);-
177 }
never executed: end of block
0
178-
179 //put png at the front because it is best-
180 int pngIndex = formats.indexOf(QLatin1String("image/png"));-
181 if (pngIndex != -1 && pngIndex != 0)
pngIndex != -1Description
TRUEnever evaluated
FALSEnever evaluated
pngIndex != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
182 formats.move(pngIndex, 0);
never executed: formats.move(pngIndex, 0);
0
183-
184 return formats;
never executed: return formats;
0
185}-
186-
187QInternalMimeData::QInternalMimeData()-
188 : QMimeData()-
189{-
190}
never executed: end of block
0
191-
192QInternalMimeData::~QInternalMimeData()-
193{-
194}-
195-
196bool QInternalMimeData::hasFormat(const QString &mimeType) const-
197{-
198 bool foundFormat = hasFormat_sys(mimeType);-
199 if (!foundFormat && mimeType == QLatin1String("application/x-qt-image")) {
!foundFormatDescription
TRUEnever evaluated
FALSEnever evaluated
mimeType == QL...n/x-qt-image")Description
TRUEnever evaluated
FALSEnever evaluated
0
200 QStringList imageFormats = imageReadMimeFormats();-
201 for (int i = 0; i < imageFormats.size(); ++i) {
i < imageFormats.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
202 if ((foundFormat = hasFormat_sys(imageFormats.at(i))))
(foundFormat =...ormats.at(i)))Description
TRUEnever evaluated
FALSEnever evaluated
0
203 break;
never executed: break;
0
204 }
never executed: end of block
0
205 }
never executed: end of block
0
206 return foundFormat;
never executed: return foundFormat;
0
207}-
208-
209QStringList QInternalMimeData::formats() const-
210{-
211 QStringList realFormats = formats_sys();-
212 if (!realFormats.contains(QLatin1String("application/x-qt-image"))) {
!realFormats.c.../x-qt-image"))Description
TRUEnever evaluated
FALSEnever evaluated
0
213 QStringList imageFormats = imageReadMimeFormats();-
214 for (int i = 0; i < imageFormats.size(); ++i) {
i < imageFormats.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
215 if (realFormats.contains(imageFormats.at(i))) {
realFormats.co...Formats.at(i))Description
TRUEnever evaluated
FALSEnever evaluated
0
216 realFormats += QLatin1String("application/x-qt-image");-
217 break;
never executed: break;
0
218 }-
219 }
never executed: end of block
0
220 }
never executed: end of block
0
221 return realFormats;
never executed: return realFormats;
0
222}-
223-
224QVariant QInternalMimeData::retrieveData(const QString &mimeType, QVariant::Type type) const-
225{-
226 QVariant data = retrieveData_sys(mimeType, type);-
227 if (mimeType == QLatin1String("application/x-qt-image")) {
mimeType == QL...n/x-qt-image")Description
TRUEnever evaluated
FALSEnever evaluated
0
228 if (data.isNull() || (data.type() == QVariant::ByteArray && data.toByteArray().isEmpty())) {
data.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
data.type() ==...ant::ByteArrayDescription
TRUEnever evaluated
FALSEnever evaluated
data.toByteArray().isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
229 // try to find an image-
230 QStringList imageFormats = imageReadMimeFormats();-
231 for (int i = 0; i < imageFormats.size(); ++i) {
i < imageFormats.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
232 data = retrieveData_sys(imageFormats.at(i), type);-
233 if (data.isNull() || (data.type() == QVariant::ByteArray && data.toByteArray().isEmpty()))
data.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
data.type() ==...ant::ByteArrayDescription
TRUEnever evaluated
FALSEnever evaluated
data.toByteArray().isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
234 continue;
never executed: continue;
0
235 break;
never executed: break;
0
236 }-
237 }
never executed: end of block
0
238 // we wanted some image type, but all we got was a byte array. Convert it to an image.-
239 if (data.type() == QVariant::ByteArray
data.type() ==...ant::ByteArrayDescription
TRUEnever evaluated
FALSEnever evaluated
0
240 && (type == QVariant::Image || type == QVariant::Pixmap || type == QVariant::Bitmap))
type == QVariant::ImageDescription
TRUEnever evaluated
FALSEnever evaluated
type == QVariant::PixmapDescription
TRUEnever evaluated
FALSEnever evaluated
type == QVariant::BitmapDescription
TRUEnever evaluated
FALSEnever evaluated
0
241 data = QImage::fromData(data.toByteArray());
never executed: data = QImage::fromData(data.toByteArray());
0
242-
243 } else if (mimeType == QLatin1String("application/x-color") && data.type() == QVariant::ByteArray) {
never executed: end of block
mimeType == QL...tion/x-color")Description
TRUEnever evaluated
FALSEnever evaluated
data.type() ==...ant::ByteArrayDescription
TRUEnever evaluated
FALSEnever evaluated
0
244 QColor c;-
245 QByteArray ba = data.toByteArray();-
246 if (ba.size() == 8) {
ba.size() == 8Description
TRUEnever evaluated
FALSEnever evaluated
0
247 ushort * colBuf = (ushort *)ba.data();-
248 c.setRgbF(qreal(colBuf[0]) / qreal(0xFFFF),-
249 qreal(colBuf[1]) / qreal(0xFFFF),-
250 qreal(colBuf[2]) / qreal(0xFFFF),-
251 qreal(colBuf[3]) / qreal(0xFFFF));-
252 data = c;-
253 } else {
never executed: end of block
0
254 qWarning("Qt: Invalid color format");-
255 }
never executed: end of block
0
256 } else if (data.type() != type && data.type() == QVariant::ByteArray) {
data.type() != typeDescription
TRUEnever evaluated
FALSEnever evaluated
data.type() ==...ant::ByteArrayDescription
TRUEnever evaluated
FALSEnever evaluated
0
257 // try to use mime data's internal conversion stuf.-
258 QInternalMimeData *that = const_cast<QInternalMimeData *>(this);-
259 that->setData(mimeType, data.toByteArray());-
260 data = QMimeData::retrieveData(mimeType, type);-
261 that->clear();-
262 }
never executed: end of block
0
263 return data;
never executed: return data;
0
264}-
265-
266bool QInternalMimeData::canReadData(const QString &mimeType)-
267{-
268 return imageReadMimeFormats().contains(mimeType);
never executed: return imageReadMimeFormats().contains(mimeType);
0
269}-
270-
271// helper functions for rendering mimedata to the system, this is needed because QMimeData is in core.-
272QStringList QInternalMimeData::formatsHelper(const QMimeData *data)-
273{-
274 QStringList realFormats = data->formats();-
275 if (realFormats.contains(QLatin1String("application/x-qt-image"))) {
realFormats.co.../x-qt-image"))Description
TRUEnever evaluated
FALSEnever evaluated
0
276 // add all supported image formats-
277 QStringList imageFormats = imageWriteMimeFormats();-
278 for (int i = 0; i < imageFormats.size(); ++i) {
i < imageFormats.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
279 if (!realFormats.contains(imageFormats.at(i)))
!realFormats.c...Formats.at(i))Description
TRUEnever evaluated
FALSEnever evaluated
0
280 realFormats.append(imageFormats.at(i));
never executed: realFormats.append(imageFormats.at(i));
0
281 }
never executed: end of block
0
282 }
never executed: end of block
0
283 return realFormats;
never executed: return realFormats;
0
284}-
285-
286bool QInternalMimeData::hasFormatHelper(const QString &mimeType, const QMimeData *data)-
287{-
288-
289 bool foundFormat = data->hasFormat(mimeType);-
290 if (!foundFormat) {
!foundFormatDescription
TRUEnever evaluated
FALSEnever evaluated
0
291 if (mimeType == QLatin1String("application/x-qt-image")) {
mimeType == QL...n/x-qt-image")Description
TRUEnever evaluated
FALSEnever evaluated
0
292 // check all supported image formats-
293 QStringList imageFormats = imageWriteMimeFormats();-
294 for (int i = 0; i < imageFormats.size(); ++i) {
i < imageFormats.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
295 if ((foundFormat = data->hasFormat(imageFormats.at(i))))
(foundFormat =...ormats.at(i)))Description
TRUEnever evaluated
FALSEnever evaluated
0
296 break;
never executed: break;
0
297 }
never executed: end of block
0
298 } else if (mimeType.startsWith(QLatin1String("image/"))) {
never executed: end of block
mimeType.start...ing("image/"))Description
TRUEnever evaluated
FALSEnever evaluated
0
299 return data->hasImage() && imageWriteMimeFormats().contains(mimeType);
never executed: return data->hasImage() && imageWriteMimeFormats().contains(mimeType);
data->hasImage()Description
TRUEnever evaluated
FALSEnever evaluated
imageWriteMime...ains(mimeType)Description
TRUEnever evaluated
FALSEnever evaluated
0
300 }-
301 }
never executed: end of block
0
302 return foundFormat;
never executed: return foundFormat;
0
303}-
304-
305QByteArray QInternalMimeData::renderDataHelper(const QString &mimeType, const QMimeData *data)-
306{-
307 QByteArray ba;-
308 if (mimeType == QLatin1String("application/x-color")) {
mimeType == QL...tion/x-color")Description
TRUEnever evaluated
FALSEnever evaluated
0
309 /* QMimeData can only provide colors as QColor or the name-
310 of a color as a QByteArray or a QString. So we need to do-
311 the conversion to application/x-color here.-
312 The application/x-color format is :-
313 type: application/x-color-
314 format: 16-
315 data[0]: red-
316 data[1]: green-
317 data[2]: blue-
318 data[3]: opacity-
319 */-
320 ba.resize(8);-
321 ushort * colBuf = (ushort *)ba.data();-
322 QColor c = qvariant_cast<QColor>(data->colorData());-
323 colBuf[0] = ushort(c.redF() * 0xFFFF);-
324 colBuf[1] = ushort(c.greenF() * 0xFFFF);-
325 colBuf[2] = ushort(c.blueF() * 0xFFFF);-
326 colBuf[3] = ushort(c.alphaF() * 0xFFFF);-
327 } else {
never executed: end of block
0
328 ba = data->data(mimeType);-
329 if (ba.isEmpty()) {
ba.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
330 if (mimeType == QLatin1String("application/x-qt-image") && data->hasImage()) {
mimeType == QL...n/x-qt-image")Description
TRUEnever evaluated
FALSEnever evaluated
data->hasImage()Description
TRUEnever evaluated
FALSEnever evaluated
0
331 QImage image = qvariant_cast<QImage>(data->imageData());-
332 QBuffer buf(&ba);-
333 buf.open(QBuffer::WriteOnly);-
334 // would there not be PNG ??-
335 image.save(&buf, "PNG");-
336 } else if (mimeType.startsWith(QLatin1String("image/")) && data->hasImage()) {
never executed: end of block
mimeType.start...ing("image/"))Description
TRUEnever evaluated
FALSEnever evaluated
data->hasImage()Description
TRUEnever evaluated
FALSEnever evaluated
0
337 QImage image = qvariant_cast<QImage>(data->imageData());-
338 QBuffer buf(&ba);-
339 buf.open(QBuffer::WriteOnly);-
340 image.save(&buf, mimeType.mid(mimeType.indexOf(QLatin1Char('/')) + 1).toLatin1().toUpper());-
341 }
never executed: end of block
0
342 }
never executed: end of block
0
343 }
never executed: end of block
0
344 return ba;
never executed: return ba;
0
345}-
346-
347#endif // QT_NO_DRAGANDDROP && QT_NO_CLIPBOARD-
348-
349QT_END_NAMESPACE-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9