1 /*
2  For general Scribus (>=1.3.2) copyright and licensing information please refer
3  to the COPYING file provided with the program. Following this notice may exist
4  a copyright and/or license notice that predates the release of Scribus 1.3.2
5  for which a new license (GPL+exception) is in place.
6  */
7 /***************************************************************************
8 *                                                                         *
9 *   This program is free software; you can redistribute it and/or modify  *
10 *   it under the terms of the GNU General Public License as published by  *
11 *   the Free Software Foundation; either version 2 of the License, or     *
12 *   (at your option) any later version.                                   *
13 *                                                                         *
14 ***************************************************************************/
15 
16 #include "scmimedata.h"
17 
18 #include <QApplication>
19 #include <QClipboard>
20 #include <QMimeData>
21 
22 // Define to 1 if you need to debug data contained in ScElemMimeData.
23 // This will have the effect of enabling the pasting of stored data
24 // in any text editor. Leave defined to 0 otherwise as this may trigger
25 // unwanted pasting of text in story editor (#15402).
26 #define DEBUG_SCELEMMIMEDATA 0
27 
28 const QString ScMimeData::ScribusElemMimeType     = "application/x-scribus-elem";
29 const QString ScMimeData::ScribusFragmentMimeType = "application/x-scribus-fragment";
30 const QString ScMimeData::ScribusTextMimeType     = "application/x-scribus-text";
31 
clipboardHasScribusData()32 bool ScMimeData::clipboardHasScribusData()
33 {
34 	bool  hasData = false;
35 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
36 	if (mimeData)
37 	{
38 		hasData |= mimeData->hasFormat(ScMimeData::ScribusElemMimeType);
39 		hasData |= mimeData->hasFormat(ScMimeData::ScribusFragmentMimeType);
40 		hasData |= mimeData->hasFormat(ScMimeData::ScribusTextMimeType);
41 		hasData |= mimeData->hasText();
42 		hasData |= mimeData->hasFormat("application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"");
43 		hasData |= mimeData->hasFormat("image/svg+xml");
44 		hasData |= mimeData->hasFormat("image/x-inkscape-svg");
45 		hasData |= mimeData->hasFormat("application/vnd.oasis.opendocument.graphics");
46 	}
47 	return hasData;
48 }
49 
clipboardHasScribusElem()50 bool ScMimeData::clipboardHasScribusElem()
51 {
52 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
53 	if (mimeData)
54 		return mimeData->hasFormat(ScMimeData::ScribusElemMimeType);
55 	return false;
56 }
57 
clipboardHasScribusFragment()58 bool ScMimeData::clipboardHasScribusFragment()
59 {
60 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
61 	if (mimeData)
62 		return mimeData->hasFormat(ScMimeData::ScribusFragmentMimeType);
63 	return false;
64 }
65 
clipboardHasScribusText()66 bool ScMimeData::clipboardHasScribusText()
67 {
68 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
69 	if (mimeData)
70 		return mimeData->hasFormat(ScMimeData::ScribusTextMimeType);
71 	return false;
72 }
73 
clipboardHasPlainText()74 bool ScMimeData::clipboardHasPlainText()
75 {
76 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
77 	if (mimeData)
78 		return mimeData->hasText();
79 	return false;
80 }
81 
clipboardHasKnownData()82 bool ScMimeData::clipboardHasKnownData()
83 {
84 	bool  hasData = false;
85 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
86 	if (mimeData)
87 	{
88 		hasData |= mimeData->hasFormat("application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"");
89 		hasData |= mimeData->hasFormat("image/svg+xml");
90 		hasData |= mimeData->hasFormat("image/x-inkscape-svg");
91 		hasData |= mimeData->hasFormat("application/vnd.oasis.opendocument.graphics");
92 	}
93 	return hasData;
94 }
95 
clipboardKnownDataExt()96 QString ScMimeData::clipboardKnownDataExt()
97 {
98 	QString ext;
99 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
100 	if (mimeData)
101 	{
102 		if (mimeData->hasFormat("application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\""))
103 			ext = "svm";
104 		else if (mimeData->hasFormat("image/svg+xml") || mimeData->hasFormat("image/x-inkscape-svg"))
105 			ext = "svg";
106 		else if (mimeData->hasFormat("application/vnd.oasis.opendocument.graphics"))
107 			ext = "odg";
108 	}
109 	return ext;
110 }
111 
clipboardKnownDataData()112 QByteArray ScMimeData::clipboardKnownDataData()
113 {
114 	QByteArray data;
115 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
116 	if (mimeData)
117 	{
118 		if (mimeData->hasFormat("application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\""))
119 			data = mimeData->data("application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"");
120 		else if (mimeData->hasFormat("image/svg+xml"))
121 			data = mimeData->data("image/svg+xml");
122 		else if (mimeData->hasFormat("image/x-inkscape-svg"))
123 			data = mimeData->data("image/x-inkscape-svg");
124 		else if (mimeData->hasFormat("application/vnd.oasis.opendocument.graphics"))
125 			data = mimeData->data("application/vnd.oasis.opendocument.graphics");
126 	}
127 	return data;
128 }
129 
clipboardScribusElem()130 QString ScMimeData::clipboardScribusElem()
131 {
132 	const QMimeData* mimeData = QApplication::clipboard()->mimeData();
133 	const ScElemMimeData* elemData = qobject_cast<const ScElemMimeData*>(mimeData);
134 	if (elemData)
135 		return elemData->scribusElem();
136 	QByteArray data = QApplication::clipboard()->mimeData()->data(ScribusElemMimeType);
137 	return QString::fromUtf8(data.data(), data.size());
138 }
139 
clipboardScribusFragment()140 QByteArray ScMimeData::clipboardScribusFragment()
141 {
142 	QByteArray data = QApplication::clipboard()->mimeData()->data(ScribusFragmentMimeType);
143 	return data;
144 }
145 
clipboardScribusText()146 QByteArray ScMimeData::clipboardScribusText()
147 {
148 	QByteArray data = QApplication::clipboard()->mimeData()->data(ScribusTextMimeType);
149 	return data;
150 }
151 
ScElemMimeData()152 ScElemMimeData::ScElemMimeData()
153 {
154 	m_formats << ScMimeData::ScribusElemMimeType;
155 #if DEBUG_SCELEMMIMEDATA
156 	m_formats << "text/plain";
157 #endif
158 }
159 
hasFormat(const QString & mimeType) const160 bool ScElemMimeData::hasFormat (const QString & mimeType) const
161 {
162 	if (mimeType == ScMimeData::ScribusElemMimeType)
163 	{
164 		if (m_scribusElemData.isEmpty())
165 			return false;
166 		QString elemtag = "SCRIBUSELEM";
167 		return (m_scribusElemData.lastIndexOf(elemtag, 50 + elemtag.length()) >= 0);
168 	}
169 #if DEBUG_SCELEMMIMEDATA
170 	if (mimeType == "text/plain")
171 		return (!m_scribusElemData.isEmpty());
172 #endif
173 	return QMimeData::hasFormat(mimeType);
174 }
175 
retrieveData(const QString & mimeType,QVariant::Type type) const176 QVariant ScElemMimeData::retrieveData (const QString &mimeType, QVariant::Type type) const
177 {
178 	if (mimeType == ScMimeData::ScribusElemMimeType)
179 	{
180 		if (m_scribusElemData.isEmpty())
181 			return QVariant();
182 		return QVariant(m_scribusElemData);
183 	}
184 #if DEBUG_SCELEMMIMEDATA
185 	if (mimeType == "text/plain")
186 		return QVariant(m_scribusElemData);
187 #endif
188 	return QVariant();
189 }
190