Joost Verburg wrote:
> Done :) Everything will be installed and configured automatically.

that's quick!

>> we could perhaps have the default paste in original 
>> format and offer an additional "paste as eps"...
> 
> Yes, that's a good idea. Can you have a look at the clipboard 
> copy-pasting of metafile data?

was already looking at that (thus my installer request ;-), the attached is 
what i have. the getdata call seems to be unsuccessful so i am doing something 
wrong. 

am a bit stuck here i must admit...


Index: src/frontends/Clipboard.h
===================================================================
--- src/frontends/Clipboard.h	(revision 24140)
+++ src/frontends/Clipboard.h	(working copy)
@@ -37,6 +37,8 @@
 		PngGraphicsType,
 		JpegGraphicsType,
 		LinkBackGraphicsType,
+		EmfGraphicsType,
+		WmfGraphicsType,
 		AnyGraphicsType,
 	};
 
Index: src/frontends/qt4/GuiClipboard.cpp
===================================================================
--- src/frontends/qt4/GuiClipboard.cpp	(revision 24140)
+++ src/frontends/qt4/GuiClipboard.cpp	(working copy)
@@ -41,6 +41,11 @@
 #include <QString>
 #include <QStringList>
 
+#ifdef Q_WS_WIN
+#include <QWindowsMime>
+#include <objidl.h>
+#endif // Q_WS_WIN
+
 #include "boost/assert.hpp"
 
 #include <map>
@@ -54,11 +59,123 @@
 
 static char const * const lyx_mime_type = "application/x-lyx";
 static char const * const pdf_mime_type = "application/pdf";
+static char const * const emf_mime_type = "image/x-emf";
+static char const * const wmf_mime_type = "image/x-wmf";
 
 namespace lyx {
 
 namespace frontend {
 
+#ifdef Q_WS_WIN
+
+static FORMATETC setCf(int cf)
+{
+    FORMATETC formatetc;
+    formatetc.cfFormat = cf;
+    formatetc.ptd = NULL;
+    formatetc.dwAspect = DVASPECT_CONTENT;
+    formatetc.lindex = -1;
+    formatetc.tymed = TYMED_HGLOBAL;
+    return formatetc;
+}
+
+
+static bool canGetData(int cf, IDataObject * pDataObj)
+{
+    FORMATETC formatetc = setCf(cf);
+    return pDataObj->QueryGetData(&formatetc) == S_OK;
+}
+
+
+class QWindowsMimeMetafile : public QWindowsMime {
+public:
+	QWindowsMimeMetafile()
+		: QWindowsMime()
+	{}
+	~QWindowsMimeMetafile() {}
+	bool canConvertFromMime(const FORMATETC & formatetc, const QMimeData * mimeData) const;
+	bool canConvertToMime(const QString & mimeType, IDataObject * pDataObj) const;
+	bool convertFromMime(const FORMATETC & formatetc, const QMimeData * mimeData, STGMEDIUM * pmedium) const;
+	QVariant convertToMime(const QString & mimeType, IDataObject * pDataObj, QVariant::Type preferredType) const;
+	QVector<FORMATETC> formatsForMime(const QString & mimeType, const QMimeData * mimeData) const;
+	QString mimeForFormat(const FORMATETC &) const;
+};
+
+
+QString QWindowsMimeMetafile::mimeForFormat(const FORMATETC & formatetc) const
+{
+	QString f;
+	if (formatetc.cfFormat == CF_ENHMETAFILE)
+		f = emf_mime_type; 
+	else if (formatetc.cfFormat == CF_METAFILEPICT)
+		f = wmf_mime_type;
+	return f;
+}
+
+bool QWindowsMimeMetafile::canConvertFromMime(
+	const FORMATETC & formatetc, const QMimeData * mimeData) const
+{
+	return false;
+}
+
+
+bool QWindowsMimeMetafile::canConvertToMime(
+	const QString & mimeType, IDataObject * pDataObj) const
+{
+    return (mimeType == "image/x-emf" && canGetData(CF_ENHMETAFILE, pDataObj))
+           || (mimeType == "image/x-wmf" && canGetData(CF_METAFILEPICT, pDataObj));
+}
+
+
+bool QWindowsMimeMetafile::convertFromMime(
+	const FORMATETC & formatetc, const QMimeData * mimeData, 
+	STGMEDIUM * pmedium) const
+{
+	return false;
+}
+
+
+QVariant QWindowsMimeMetafile::convertToMime(
+	const QString & mimeType, IDataObject * pDataObj, 
+	QVariant::Type preferredType) const
+{
+	QVariant ret;
+    if (canConvertToMime(mimeType, pDataObj)) {
+		FORMATETC formatetc;
+		if (mimeType == "image/x-emf")
+			formatetc = setCf(CF_ENHMETAFILE);
+		if (mimeType == "image/x-wmf")
+			formatetc = setCf(CF_METAFILEPICT);
+		STGMEDIUM s;
+		QByteArray data;
+		if (pDataObj->GetData(&formatetc, &s) == S_OK) {
+			DWORD * val = (DWORD*)GlobalLock(s.hGlobal);
+			data = QByteArray::fromRawData((char*)val, GlobalSize(s.hGlobal));
+			data.detach();
+			GlobalUnlock(s.hGlobal);
+			ReleaseStgMedium(&s);
+		}
+		ret = data;
+	}
+	return ret;
+}
+
+
+QVector<FORMATETC> QWindowsMimeMetafile::formatsForMime(
+	const QString & mimeType, const QMimeData * mimeData) const
+{
+    QVector<FORMATETC> formats;
+    if (mimeType == "image/x-emf")
+        formats += setCf(CF_ENHMETAFILE);
+    if (mimeType == "image/x-wmf")
+        formats += setCf(CF_METAFILEPICT);
+    return formats;
+}
+
+static QWindowsMimeMetafile * metafileWindowsMime;
+
+#endif // Q_WS_WIN
+
 #ifdef Q_WS_MACX
 
 class QMacPasteboardMimeGraphics : public QMacPasteboardMime {
@@ -137,6 +254,11 @@
 	if (!graphicsPasteboardMime)
 		graphicsPasteboardMime = new QMacPasteboardMimeGraphics();
 #endif // Q_WS_MACX
+
+#ifdef Q_WS_WIN
+	if (!metafileWindowsMime)
+		metafileWindowsMime = new QWindowsMimeMetafile();
+#endif // Q_WS_WIN
 }
 
 
@@ -177,6 +299,10 @@
 {
 	// create file dialog filter according to the existing types in the clipboard
 	vector<Clipboard::GraphicsType> types;
+	if (hasGraphicsContents(Clipboard::EmfGraphicsType))
+		types.push_back(Clipboard::EmfGraphicsType);
+	if (hasGraphicsContents(Clipboard::WmfGraphicsType))
+		types.push_back(Clipboard::WmfGraphicsType);
 	if (hasGraphicsContents(Clipboard::LinkBackGraphicsType))
 		types.push_back(Clipboard::LinkBackGraphicsType);
 	if (hasGraphicsContents(Clipboard::PdfGraphicsType))
@@ -196,11 +322,15 @@
 	map<Clipboard::GraphicsType, string> extensions;
 	map<Clipboard::GraphicsType, docstring> typeNames;
 	
+	extensions[Clipboard::EmfGraphicsType] = "emf";
+	extensions[Clipboard::WmfGraphicsType] = "wmf";
 	extensions[Clipboard::LinkBackGraphicsType] = "linkback";
 	extensions[Clipboard::PdfGraphicsType] = "pdf";
 	extensions[Clipboard::PngGraphicsType] = "png";
 	extensions[Clipboard::JpegGraphicsType] = "jpeg";
 	
+	typeNames[Clipboard::EmfGraphicsType] = _("Enhanced Metafile");
+	typeNames[Clipboard::WmfGraphicsType] = _("Windows Metafile");
 	typeNames[Clipboard::LinkBackGraphicsType] = _("LinkBack PDF");
 	typeNames[Clipboard::PdfGraphicsType] = _("PDF");
 	typeNames[Clipboard::PngGraphicsType] = _("PNG");
@@ -329,6 +459,8 @@
 	switch (type) {
 	case PdfGraphicsType: mime = pdf_mime_type; break;
 	case LinkBackGraphicsType: mime = pdf_mime_type; break;
+	case EmfGraphicsType: mime = emf_mime_type; break;
+	case WmfGraphicsType: mime = wmf_mime_type; break;
 	default: BOOST_ASSERT(false);
 	}
 	
@@ -415,12 +547,14 @@
 		return hasGraphicsContents(PdfGraphicsType)
 			|| hasGraphicsContents(PngGraphicsType)
 			|| hasGraphicsContents(JpegGraphicsType)
+			|| hasGraphicsContents(EmfGraphicsType)
+			|| hasGraphicsContents(WmfGraphicsType)
 			|| hasGraphicsContents(LinkBackGraphicsType);
 	}
 
 	QMimeData const * const source =
 	qApp->clipboard()->mimeData(QClipboard::Clipboard);
-	
+
 	// handle image cases first
 	if (type == PngGraphicsType || type == JpegGraphicsType)
 		return source->hasImage();
@@ -444,6 +578,8 @@
 	// compute mime for type
 	QString mime;
 	switch (type) {
+	case EmfGraphicsType: mime = emf_mime_type; break;
+	case WmfGraphicsType: mime = wmf_mime_type; break;
 	case PdfGraphicsType: mime = pdf_mime_type; break;
 	default: BOOST_ASSERT(false);
 	}

Reply via email to