Kaydet (Commit) 0a6813ad authored tarafından Michael Stahl's avatar Michael Stahl

tdf#119235 svx,sd: fix drag&drop from ColorBar

This was using the SfxPoolItem serialisation of XATTR_FILL* items,
where only XFillColorItem and XFillStyleItem were actually used;
the binary serialisation was removed without being aware of this
feature.

Fix this by using uno::Any instead, rather than reviving the binary
serialisation.

Also change the clipboard format strings, just to be safe.

(regression from 97b889b8)

Change-Id: I1828621a9aae606a1ca47835eef608062efe64a0
Reviewed-on: https://gerrit.libreoffice.org/62455Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
Tested-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
üst e89e8941
...@@ -136,7 +136,7 @@ static const std::vector< FormatEntry > g_TranslTable { ...@@ -136,7 +136,7 @@ static const std::vector< FormatEntry > g_TranslTable {
// SotClipboardFormatId::SVIM // SotClipboardFormatId::SVIM
FormatEntry("application/x-openoffice-svim;windows_formatname=\"SVIM (StarView ImageMap)\"", "SVIM (StarView ImageMap)", nullptr, CF_INVALID, CPPUTYPE_DEFAULT), FormatEntry("application/x-openoffice-svim;windows_formatname=\"SVIM (StarView ImageMap)\"", "SVIM (StarView ImageMap)", nullptr, CF_INVALID, CPPUTYPE_DEFAULT),
// SotClipboardFormatId::XFA // SotClipboardFormatId::XFA
FormatEntry("application/x-openoffice-xfa;windows_formatname=\"XFA (XOutDev FillAttr)\"", "XFA (XOutDev FillAttr)", nullptr, CF_INVALID, CPPUTYPE_DEFAULT), FormatEntry("application/x-libreoffice-xfa;windows_formatname=\"XFA (XOutDev FillAttr Any)\"", "XFA (XOutDev FillAttr Any)", nullptr, CF_INVALID, CPPUTYPE_DEFAULT),
// SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT // SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT
FormatEntry("application/vnd.oasis.opendocument.text-flat-xml", "EditEngine ODF", nullptr, CF_INVALID, CPPUTYPE_DEFAULT), FormatEntry("application/vnd.oasis.opendocument.text-flat-xml", "EditEngine ODF", nullptr, CF_INVALID, CPPUTYPE_DEFAULT),
// SotClipboardFormatId::INTERNALLINK_STATE // SotClipboardFormatId::INTERNALLINK_STATE
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <vector> #include <vector>
#include <com/sun/star/embed/XEmbedPersist.hpp> #include <com/sun/star/embed/XEmbedPersist.hpp>
#include <comphelper/sequenceashashmap.hxx>
#include <tools/urlobj.hxx> #include <tools/urlobj.hxx>
#include <svx/svdetc.hxx> #include <svx/svdetc.hxx>
#include <svx/svdoole2.hxx> #include <svx/svdoole2.hxx>
...@@ -666,14 +667,19 @@ sal_Int8 View::ExecuteDrop( const ExecuteDropEvent& rEvt, ...@@ -666,14 +667,19 @@ sal_Int8 View::ExecuteDrop( const ExecuteDropEvent& rEvt,
{ {
if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel))
{ {
::tools::SvRef<SotStorageStream> xStm; uno::Any const data(aDataHelper.GetAny(SotClipboardFormatId::XFA, ""));
uno::Sequence<beans::NamedValue> props;
if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::XFA, xStm ) && xStm.is() ) if (data >>= props)
{ {
XFillExchangeData aFillData( XFillAttrSetItem( &mrDoc.GetPool() ) ); ::comphelper::SequenceAsHashMap const map(props);
Color aColor(COL_BLACK);
ReadXFillExchangeData( *xStm, aFillData ); auto const it = map.find("FillColor");
const Color aColor( aFillData.GetXFillAttrSetItem()->GetItemSet().Get( XATTR_FILLCOLOR ).GetColorValue() ); if (it != map.end())
{
XFillColorItem color;
color.PutValue(it->second, 0);
aColor = color.GetColorValue();
}
static_cast< SdrHdlColor* >( pIAOHandle )->SetColor( aColor, true ); static_cast< SdrHdlColor* >( pIAOHandle )->SetColor( aColor, true );
nRet = nDropAction; nRet = nDropAction;
} }
......
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
#include <ViewClipboard.hxx> #include <ViewClipboard.hxx>
#include <sfx2/ipclient.hxx> #include <sfx2/ipclient.hxx>
#include <sfx2/classificationhelper.hxx> #include <sfx2/classificationhelper.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <comphelper/storagehelper.hxx> #include <comphelper/storagehelper.hxx>
#include <comphelper/processfactory.hxx> #include <comphelper/processfactory.hxx>
#include <tools/stream.hxx> #include <tools/stream.hxx>
...@@ -1330,14 +1331,10 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper, ...@@ -1330,14 +1331,10 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
if(!bReturn && pPickObj && CHECK_FORMAT_TRANS( SotClipboardFormatId::XFA ) ) if(!bReturn && pPickObj && CHECK_FORMAT_TRANS( SotClipboardFormatId::XFA ) )
{ {
::tools::SvRef<SotStorageStream> xStm; uno::Any const data(aDataHelper.GetAny(SotClipboardFormatId::XFA, ""));
uno::Sequence<beans::NamedValue> props;
if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::XFA, xStm ) ) if (data >>= props)
{ {
XFillExchangeData aFillData( XFillAttrSetItem( &mrDoc.GetPool() ) );
ReadXFillExchangeData( *xStm, aFillData );
if( IsUndoEnabled() ) if( IsUndoEnabled() )
{ {
BegUndo( SdResId(STR_UNDO_DRAGDROP) ); BegUndo( SdResId(STR_UNDO_DRAGDROP) );
...@@ -1345,15 +1342,27 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper, ...@@ -1345,15 +1342,27 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper,
EndUndo(); EndUndo();
} }
XFillAttrSetItem* pSetItem = aFillData.GetXFillAttrSetItem(); ::comphelper::SequenceAsHashMap const map(props);
SfxItemSet rSet = pSetItem->GetItemSet(); drawing::FillStyle eFill(drawing::FillStyle_BITMAP); // default to something that's ignored
drawing::FillStyle eFill = rSet.Get( XATTR_FILLSTYLE ).GetValue(); Color aColor(COL_BLACK);
auto it = map.find("FillStyle");
if (it != map.end())
{
XFillStyleItem style;
style.PutValue(it->second, 0);
eFill = style.GetValue();
}
it = map.find("FillColor");
if (it != map.end())
{
XFillColorItem color;
color.PutValue(it->second, 0);
aColor = color.GetColorValue();
}
if( eFill == drawing::FillStyle_SOLID || eFill == drawing::FillStyle_NONE ) if( eFill == drawing::FillStyle_SOLID || eFill == drawing::FillStyle_NONE )
{ {
const XFillColorItem& rColItem = rSet.Get( XATTR_FILLCOLOR ); OUString aName;
Color aColor( rColItem.GetColorValue() );
OUString aName( rColItem.GetName() );
SfxItemSet aSet( mrDoc.GetPool() ); SfxItemSet aSet( mrDoc.GetPool() );
bool bClosed = pPickObj->IsClosedObj(); bool bClosed = pPickObj->IsClosedObj();
::sd::Window* pWin = mpViewSh->GetActiveWindow(); ::sd::Window* pWin = mpViewSh->GetActiveWindow();
......
...@@ -72,7 +72,7 @@ namespace ...@@ -72,7 +72,7 @@ namespace
/* 11 SotClipboardFormatId::DRAWING*/ { "application/x-openoffice-drawing;windows_formatname=\"Drawing Format\"", "Drawing Format", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 11 SotClipboardFormatId::DRAWING*/ { "application/x-openoffice-drawing;windows_formatname=\"Drawing Format\"", "Drawing Format", &cppu::UnoType<Sequence<sal_Int8>>::get() },
/* 12 SotClipboardFormatId::SVXB*/ { "application/x-openoffice-svxb;windows_formatname=\"SVXB (StarView Bitmap/Animation)\"", "SVXB (StarView Bitmap/Animation)", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 12 SotClipboardFormatId::SVXB*/ { "application/x-openoffice-svxb;windows_formatname=\"SVXB (StarView Bitmap/Animation)\"", "SVXB (StarView Bitmap/Animation)", &cppu::UnoType<Sequence<sal_Int8>>::get() },
/* 13 SotClipboardFormatId::SVIM*/ { "application/x-openoffice-svim;windows_formatname=\"SVIM (StarView ImageMap)\"", "SVIM (StarView ImageMap)", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 13 SotClipboardFormatId::SVIM*/ { "application/x-openoffice-svim;windows_formatname=\"SVIM (StarView ImageMap)\"", "SVIM (StarView ImageMap)", &cppu::UnoType<Sequence<sal_Int8>>::get() },
/* 14 SotClipboardFormatId::XFA*/ { "application/x-openoffice-xfa;windows_formatname=\"XFA (XOutDev FillAttr)\"", "XFA (XOutDev FillAttr)", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 14 SotClipboardFormatId::XFA*/ { "application/x-libreoffice-xfa;windows_formatname=\"XFA (XOutDev FillAttr Any)\"", "XFA (XOutDev FillAttr Any)", &cppu::UnoType<Sequence<sal_Int8>>::get() },
/* 15 SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT*/ { "application/vnd.oasis.opendocument.text-flat-xml", "Flat XML format (EditEngine ODF)", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 15 SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT*/ { "application/vnd.oasis.opendocument.text-flat-xml", "Flat XML format (EditEngine ODF)", &cppu::UnoType<Sequence<sal_Int8>>::get() },
/* 16 SotClipboardFormatId::INTERNALLINK_STATE*/ { "application/x-openoffice-internallink-state;windows_formatname=\"StatusInfo vom SvxInternalLink\"", "StatusInfo vom SvxInternalLink", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 16 SotClipboardFormatId::INTERNALLINK_STATE*/ { "application/x-openoffice-internallink-state;windows_formatname=\"StatusInfo vom SvxInternalLink\"", "StatusInfo vom SvxInternalLink", &cppu::UnoType<Sequence<sal_Int8>>::get() },
/* 17 SotClipboardFormatId::SOLK*/ { "application/x-openoffice-solk;windows_formatname=\"SOLK (StarOffice Link)\"", "SOLK (StarOffice Link)", &cppu::UnoType<Sequence<sal_Int8>>::get() }, /* 17 SotClipboardFormatId::SOLK*/ { "application/x-openoffice-solk;windows_formatname=\"SOLK (StarOffice Link)\"", "SOLK (StarOffice Link)", &cppu::UnoType<Sequence<sal_Int8>>::get() },
......
...@@ -48,18 +48,18 @@ class SvxColorValueSetData : public TransferableHelper ...@@ -48,18 +48,18 @@ class SvxColorValueSetData : public TransferableHelper
{ {
private: private:
XFillExchangeData maData; uno::Sequence<beans::NamedValue> m_Data;
protected: protected:
virtual void AddSupportedFormats() override; virtual void AddSupportedFormats() override;
virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override; virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override;
virtual bool WriteObject( tools::SvRef<SotStorageStream>& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const css::datatransfer::DataFlavor& rFlavor ) override;
public: public:
explicit SvxColorValueSetData( const XFillAttrSetItem& rSetItem ) : explicit SvxColorValueSetData(const uno::Sequence<beans::NamedValue>& rProps)
maData( rSetItem ) {} : m_Data(rProps)
{}
}; };
void SvxColorValueSetData::AddSupportedFormats() void SvxColorValueSetData::AddSupportedFormats()
...@@ -73,19 +73,13 @@ bool SvxColorValueSetData::GetData( const css::datatransfer::DataFlavor& rFlavor ...@@ -73,19 +73,13 @@ bool SvxColorValueSetData::GetData( const css::datatransfer::DataFlavor& rFlavor
if( SotExchange::GetFormat( rFlavor ) == SotClipboardFormatId::XFA ) if( SotExchange::GetFormat( rFlavor ) == SotClipboardFormatId::XFA )
{ {
SetObject( &maData, 0, rFlavor ); SetAny(uno::makeAny(m_Data));
bRet = true; bRet = true;
} }
return bRet; return bRet;
} }
bool SvxColorValueSetData::WriteObject( tools::SvRef<SotStorageStream>& rxOStm, void*, sal_uInt32, const css::datatransfer::DataFlavor& )
{
WriteXFillExchangeData( *rxOStm, maData );
return( rxOStm->GetError() == ERRCODE_NONE );
}
SvxColorValueSet_docking::SvxColorValueSet_docking( vcl::Window* _pParent ) : SvxColorValueSet_docking::SvxColorValueSet_docking( vcl::Window* _pParent ) :
SvxColorValueSet( _pParent, WB_ITEMBORDER ), SvxColorValueSet( _pParent, WB_ITEMBORDER ),
DragSourceHelper( this ), DragSourceHelper( this ),
...@@ -149,14 +143,18 @@ void SvxColorValueSet_docking::DoDrag() ...@@ -149,14 +143,18 @@ void SvxColorValueSet_docking::DoDrag()
if( pDocSh && nItemId ) if( pDocSh && nItemId )
{ {
XFillAttrSetItem aXFillSetItem( &pDocSh->GetPool() ); uno::Sequence<beans::NamedValue> props(2);
SfxItemSet& rSet = aXFillSetItem.GetItemSet(); XFillColorItem const color(GetItemText(nItemId), GetItemColor(nItemId));
props[0].Name = "FillColor";
rSet.Put( XFillColorItem( GetItemText( nItemId ), GetItemColor( nItemId ) ) ); color.QueryValue(props[0].Value, 0);
rSet.Put(XFillStyleItem( ( 1 == nItemId ) ? drawing::FillStyle_NONE : drawing::FillStyle_SOLID ) ); XFillStyleItem const style((1 == nItemId)
? drawing::FillStyle_NONE
: drawing::FillStyle_SOLID);
props[1].Name = "FillStyle";
style.QueryValue(props[1].Value, 0);
EndSelection(); EndSelection();
( new SvxColorValueSetData( aXFillSetItem ) )->StartDrag( this, DND_ACTION_COPY ); ( new SvxColorValueSetData(props) )->StartDrag( this, DND_ACTION_COPY );
ReleaseMouse(); ReleaseMouse();
} }
} }
......
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