Kaydet (Commit) 7e01a02b authored tarafından Aleksei Nikiforov's avatar Aleksei Nikiforov Kaydeden (comit) Thorsten Behrens

tdf#120836 KDE5: allow adding multiple mime types to clipboard

Also correct processing "text/html" and "image/png" mime types
to fix slow select in Calc:
if both "text/html" and "image/png" mime types were present,
"image/png" data was requested, but it was processed as if it was
"text/html" data.

Change-Id: Ie192fff06cd9de28f466547dac32343620fe2730
Reviewed-on: https://gerrit.libreoffice.org/66576
Tested-by: Jenkins
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst ae34f471
...@@ -184,63 +184,92 @@ void VclQt5Clipboard::setContents( ...@@ -184,63 +184,92 @@ void VclQt5Clipboard::setContents(
bool bHasHtml = false, bHasImage = false; bool bHasHtml = false, bHasImage = false;
lcl_peekFormats(aFormats, bHasHtml, bHasImage); lcl_peekFormats(aFormats, bHasHtml, bHasImage);
css::datatransfer::DataFlavor aFlavor; std::unique_ptr<QMimeData> pMimeData(new QMimeData);
QClipboard* clipboard = QApplication::clipboard();
if (bHasImage) // Add html data if present
{ if (bHasHtml)
//FIXME: other image formats?
aFlavor.MimeType = "image/png";
aFlavor.DataType = cppu::UnoType<sal_Int8>::get();
}
else if (bHasHtml)
{ {
css::datatransfer::DataFlavor aFlavor;
aFlavor.MimeType = "text/html"; aFlavor.MimeType = "text/html";
aFlavor.DataType = cppu::UnoType<sal_Int8>::get(); aFlavor.DataType = cppu::UnoType<Sequence<sal_Int8>>::get();
}
else
{
aFlavor.MimeType = "text/plain;charset=utf-16";
aFlavor.DataType = cppu::UnoType<OUString>::get();
}
Any aValue; Any aValue;
try try
{ {
aValue = xTrans->getTransferData(aFlavor); aValue = xTrans->getTransferData(aFlavor);
} }
catch (...) catch (...)
{ {
} }
if (aValue.getValueTypeClass() == TypeClass_STRING)
{
OUString aString;
aValue >>= aString;
clipboard->setText(toQString(aString));
}
else if (aValue.getValueType() == cppu::UnoType<Sequence<sal_Int8>>::get())
{
Sequence<sal_Int8> aData;
aValue >>= aData;
if (bHasHtml) if (aValue.getValueType() == cppu::UnoType<Sequence<sal_Int8>>::get())
{ {
Sequence<sal_Int8> aData;
aValue >>= aData;
OUString aHtmlAsString(reinterpret_cast<const char*>(aData.getConstArray()), OUString aHtmlAsString(reinterpret_cast<const char*>(aData.getConstArray()),
aData.getLength(), RTL_TEXTENCODING_UTF8); aData.getLength(), RTL_TEXTENCODING_UTF8);
QMimeData* mimeData = new QMimeData;
mimeData->setHtml(toQString(aHtmlAsString)); pMimeData->setHtml(toQString(aHtmlAsString));
clipboard->setMimeData(mimeData);
} }
else if (bHasImage) }
// Add image data if present
if (bHasImage)
{
css::datatransfer::DataFlavor aFlavor;
//FIXME: other image formats?
aFlavor.MimeType = "image/png";
aFlavor.DataType = cppu::UnoType<Sequence<sal_Int8>>::get();
Any aValue;
try
{ {
aValue = xTrans->getTransferData(aFlavor);
}
catch (...)
{
}
if (aValue.getValueType() == cppu::UnoType<Sequence<sal_Int8>>::get())
{
Sequence<sal_Int8> aData;
aValue >>= aData;
QImage image; QImage image;
image.loadFromData(reinterpret_cast<const uchar*>(aData.getConstArray()), image.loadFromData(reinterpret_cast<const uchar*>(aData.getConstArray()),
aData.getLength()); aData.getLength());
clipboard->setImage(image);
pMimeData->setImageData(image);
}
}
// Add text data
// TODO: consider checking if text of suitable type is present
{
css::datatransfer::DataFlavor aFlavor;
aFlavor.MimeType = "text/plain;charset=utf-16";
aFlavor.DataType = cppu::UnoType<OUString>::get();
Any aValue;
try
{
aValue = xTrans->getTransferData(aFlavor);
}
catch (...)
{
}
if (aValue.getValueTypeClass() == TypeClass_STRING)
{
OUString aString;
aValue >>= aString;
pMimeData->setText(toQString(aString));
} }
} }
QClipboard* clipboard = QApplication::clipboard();
clipboard->setMimeData(pMimeData.release());
} }
aEv.Contents = getContents(); aEv.Contents = getContents();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment