editeng/source/editeng/editeng.cxx   |    4 ++--
 editeng/source/editeng/editview.cxx  |    4 ++--
 editeng/source/editeng/impedit.cxx   |    4 ++--
 editeng/source/editeng/impedit.hxx   |    4 ++--
 editeng/source/editeng/impedit2.cxx  |   32 +++++++++++++++++++++++++++++---
 editeng/source/outliner/outlvw.cxx   |    8 ++++----
 include/editeng/editeng.hxx          |    4 +++-
 include/editeng/editview.hxx         |    3 ++-
 include/editeng/outliner.hxx         |    5 +++--
 sc/source/ui/drawfunc/drtxtob1.cxx   |    3 ++-
 sd/source/ui/func/fuinsert.cxx       |    1 +
 sd/source/ui/view/sdview3.cxx        |   30 ++++++++++++++++++++++++++++++
 sw/source/uibase/shells/drwtxtex.cxx |    3 ++-
 13 files changed, 84 insertions(+), 21 deletions(-)

New commits:
commit f08803d9fb3a65800d053d35da5243e0fbae4674
Author:     Oliver Specht <oliver.spe...@cib.de>
AuthorDate: Mon Oct 30 13:26:49 2023 +0100
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Sun Nov 12 21:17:09 2023 +0100

    tdf#157363 add HTML format when pasting into draw text
    
    adds HTML to paste(special) in draw text in impress/draw/calc/writer
    
    Change-Id: Iaede82e1b3d48be362b70bd631e7f912b02b9822
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158659
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/editeng/source/editeng/editeng.cxx 
b/editeng/source/editeng/editeng.cxx
index c766328fd667..acca942ab12f 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -849,9 +849,9 @@ EditSelection EditEngine::InsertText(const EditTextObject& 
rTextObject, const Ed
 
 EditSelection EditEngine::InsertText(
     uno::Reference<datatransfer::XTransferable > const & rxDataObj,
-    const OUString& rBaseURL, const EditPaM& rPaM, bool bUseSpecial)
+    const OUString& rBaseURL, const EditPaM& rPaM, bool bUseSpecial, 
SotClipboardFormatId format)
 {
-    return pImpEditEngine->PasteText(rxDataObj, rBaseURL, rPaM, bUseSpecial);
+    return pImpEditEngine->PasteText(rxDataObj, rBaseURL, rPaM, bUseSpecial, 
format);
 }
 
 EditPaM EditEngine::EndOfWord(const EditPaM& rPaM)
diff --git a/editeng/source/editeng/editview.cxx 
b/editeng/source/editeng/editview.cxx
index f6c90309747c..0e3985c49459 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -675,10 +675,10 @@ void EditView::Paste()
     pImpEditView->Paste( aClipBoard );
 }
 
-void EditView::PasteSpecial()
+void EditView::PasteSpecial(SotClipboardFormatId format)
 {
     Reference<css::datatransfer::clipboard::XClipboard> 
aClipBoard(GetClipboard());
-    pImpEditView->Paste(aClipBoard, true );
+    pImpEditView->Paste(aClipBoard, true, format );
 }
 
 Point EditView::GetWindowPosTopLeft( sal_Int32 nParagraph )
diff --git a/editeng/source/editeng/impedit.cxx 
b/editeng/source/editeng/impedit.cxx
index 2e5e778d0cbd..92af0e24b848 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -1944,7 +1944,7 @@ void ImpEditView::CutCopy( css::uno::Reference< 
css::datatransfer::clipboard::XC
     }
 }
 
-void ImpEditView::Paste( css::uno::Reference< 
css::datatransfer::clipboard::XClipboard > const & rxClipboard, bool 
bUseSpecial )
+void ImpEditView::Paste( css::uno::Reference< 
css::datatransfer::clipboard::XClipboard > const & rxClipboard, bool 
bUseSpecial, SotClipboardFormatId format)
 {
     if ( !rxClipboard.is() )
         return;
@@ -2004,7 +2004,7 @@ void ImpEditView::Paste( css::uno::Reference< 
css::datatransfer::clipboard::XCli
         // paragraphs. Collect and broadcast when done instead.
         aSel = pEditEngine->InsertText(
             xDataObj, OUString(), aSel.Min(),
-            bUseSpecial && 
pEditEngine->GetInternalEditStatus().AllowPasteSpecial());
+            bUseSpecial && 
pEditEngine->GetInternalEditStatus().AllowPasteSpecial(), format);
     }
 
     aPasteOrDropInfos.nEndPara = pEditEngine->GetEditDoc().GetPos( 
aSel.Max().GetNode() );
diff --git a/editeng/source/editeng/impedit.hxx 
b/editeng/source/editeng/impedit.hxx
index 6db82ab2392a..5ff09c67257a 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -373,7 +373,7 @@ public:
     bool            Command(const CommandEvent& rCEvt);
 
     void            CutCopy( css::uno::Reference< 
css::datatransfer::clipboard::XClipboard > const & rxClipboard, bool bCut );
-    void            Paste( css::uno::Reference< 
css::datatransfer::clipboard::XClipboard > const & rxClipboard, bool 
bUseSpecial = false );
+    void            Paste( css::uno::Reference< 
css::datatransfer::clipboard::XClipboard > const & rxClipboard, bool 
bUseSpecial = false, SotClipboardFormatId format = SotClipboardFormatId::NONE);
 
     void            SetVisDocStartPos( const Point& rPos ) { aVisDocStartPos = 
rPos; }
 
@@ -640,7 +640,7 @@ private:
     std::unique_ptr<EditTextObject>
                         CreateTextObject(EditSelection aSelection, 
SfxItemPool*, bool bAllowBigObjects = false, sal_Int32 nBigObjStart = 0);
     EditSelection       InsertTextObject( const EditTextObject&, EditPaM aPaM 
);
-    EditSelection       PasteText( css::uno::Reference< 
css::datatransfer::XTransferable > const & rxDataObj, const OUString& rBaseURL, 
const EditPaM& rPaM, bool bUseSpecial );
+    EditSelection       PasteText( css::uno::Reference< 
css::datatransfer::XTransferable > const & rxDataObj, const OUString& rBaseURL, 
const EditPaM& rPaM, bool bUseSpecial, SotClipboardFormatId format = 
SotClipboardFormatId::NONE);
 
     void                CheckPageOverflow();
 
diff --git a/editeng/source/editeng/impedit2.cxx 
b/editeng/source/editeng/impedit2.cxx
index 6b1f226d90cc..a1c61c0c3b54 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -30,6 +30,7 @@
 #include "eeobj.hxx"
 #include <editeng/txtrange.hxx>
 #include <sfx2/app.hxx>
+#include <sfx2/mieclip.hxx>
 #include <svtools/colorcfg.hxx>
 #include <svl/ctloptions.hxx>
 #include <unotools/securityoptions.hxx>
@@ -3876,7 +3877,7 @@ uno::Reference< datatransfer::XTransferable > 
ImpEditEngine::CreateTransferable(
     return pDataObj;
 }
 
-EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransferable > const & rxDataObj, const OUString& rBaseURL, 
const EditPaM& rPaM, bool bUseSpecial )
+EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransferable > const & rxDataObj, const OUString& rBaseURL, 
const EditPaM& rPaM, bool bUseSpecial, SotClipboardFormatId format)
 {
     EditSelection aNewSelection( rPaM );
 
@@ -3890,7 +3891,7 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransfera
     {
         // XML
         SotExchange::GetFormatDataFlavor( 
SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT, aFlavor );
-        if ( rxDataObj->isDataFlavorSupported( aFlavor ) )
+        if ( rxDataObj->isDataFlavorSupported( aFlavor ) && 
(SotClipboardFormatId::NONE == format || 
SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT == format))
         {
             try
             {
@@ -3918,7 +3919,7 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransfera
             SotExchange::GetFormatDataFlavor( SotClipboardFormatId::RICHTEXT, 
aFlavorRichtext );
             bool bRtfSupported = rxDataObj->isDataFlavorSupported( aFlavor );
             bool bRichtextSupported  = rxDataObj->isDataFlavorSupported( 
aFlavorRichtext );
-            if ( bRtfSupported || bRichtextSupported )
+            if ( (bRtfSupported || bRichtextSupported) && 
(SotClipboardFormatId::NONE == format || SotClipboardFormatId::RICHTEXT == 
format || SotClipboardFormatId::RTF == format))
             {
                 if(bRichtextSupported)
                 {
@@ -3940,6 +3941,31 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransfera
                 }
             }
         }
+        if (!bDone) {
+            // HTML
+            
SotExchange::GetFormatDataFlavor(SotClipboardFormatId::HTML_SIMPLE, aFlavor);
+            bool bHtmlSupported = rxDataObj->isDataFlavorSupported(aFlavor);
+            if (bHtmlSupported && (SotClipboardFormatId::NONE == format || 
SotClipboardFormatId::HTML_SIMPLE == format)) {
+                MSE40HTMLClipFormatObj aMSE40HTMLClipFormatObj;
+                try
+                {
+                    uno::Any aData = rxDataObj->getTransferData(aFlavor);
+                    uno::Sequence< sal_Int8 > aSeq;
+                    aData >>= aSeq;
+                    {
+                        SvMemoryStream aHtmlStream(aSeq.getArray(), 
aSeq.getLength(), StreamMode::READ);
+                        SvStream* pHtmlStream = 
aMSE40HTMLClipFormatObj.IsValid(aHtmlStream);
+                        if (pHtmlStream != nullptr) {
+                            aNewSelection = Read(*pHtmlStream, rBaseURL, 
EETextFormat::Html, rPaM);
+                        }
+                    }
+                    bDone = true;
+                }
+                catch (const css::uno::Exception&)
+                {
+                }
+            }
+        }
     }
     if ( !bDone )
     {
diff --git a/editeng/source/outliner/outlvw.cxx 
b/editeng/source/outliner/outlvw.cxx
index 705b5e10b06b..fa17099f043f 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -667,12 +667,12 @@ void OutlinerView::Cut()
     }
 }
 
-void OutlinerView::PasteSpecial()
+void OutlinerView::PasteSpecial(SotClipboardFormatId format)
 {
-    Paste( true );
+    Paste( true, format );
 }
 
-void OutlinerView::Paste( bool bUseSpecial )
+void OutlinerView::Paste( bool bUseSpecial, SotClipboardFormatId format)
 {
     if ( ImpCalcSelectedPages( false ) && !pOwner->ImpCanDeleteSelectedPages( 
this ) )
         return;
@@ -683,7 +683,7 @@ void OutlinerView::Paste( bool bUseSpecial )
     pOwner->bPasting = true;
 
     if ( bUseSpecial )
-        pEditView->PasteSpecial();
+        pEditView->PasteSpecial(format);
     else
         pEditView->Paste();
 
diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx
index 85accc9d36e3..a65ad1a2e10e 100644
--- a/include/editeng/editeng.hxx
+++ b/include/editeng/editeng.hxx
@@ -30,6 +30,7 @@
 #include <com/sun/star/i18n/CharacterIteratorMode.hpp>
 
 #include <o3tl/span.hxx>
+#include <sot/formats.hxx>
 #include <svl/typedwhich.hxx>
 #include <editeng/editdata.hxx>
 #include <editeng/editstat.hxx>
@@ -154,7 +155,8 @@ public:
 
     EditSelection InsertText(
         css::uno::Reference<css::datatransfer::XTransferable > const & 
rxDataObj,
-        const OUString& rBaseURL, const EditPaM& rPaM, bool bUseSpecial);
+        const OUString& rBaseURL, const EditPaM& rPaM, bool bUseSpecial,
+        SotClipboardFormatId format = SotClipboardFormatId::NONE);
 
 private:
     std::unique_ptr<ImpEditEngine>  pImpEditEngine;
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index 73d4c23f49a9..f014e3abfeb9 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -24,6 +24,7 @@
 #include <com/sun/star/i18n/WordType.hpp>
 
 #include <i18nlangtag/lang.h>
+#include <sot/formats.hxx>
 #include <tools/color.hxx>
 #include <tools/gen.hxx>
 #include <comphelper/errcode.hxx>
@@ -246,7 +247,7 @@ public:
     void            Cut();
     void            Copy();
     void            Paste();
-    void            PasteSpecial();
+    void            PasteSpecial(SotClipboardFormatId format = 
SotClipboardFormatId::NONE);
 
     void            Undo();
     void            Redo();
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 7622138271ee..d48bb251e617 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -19,6 +19,7 @@
 #ifndef INCLUDED_EDITENG_OUTLINER_HXX
 #define INCLUDED_EDITENG_OUTLINER_HXX
 
+#include <sot/formats.hxx>
 #include <editeng/editdata.hxx>
 #include <editeng/editstat.hxx>
 #include <editeng/overflowingtxt.hxx>
@@ -264,8 +265,8 @@ public:
 
     void        Cut();
     void        Copy();
-    void        Paste( bool bUseSpecial = false );
-    void        PasteSpecial();
+    void        Paste( bool bUseSpecial = false, SotClipboardFormatId format = 
SotClipboardFormatId::NONE );
+    void        PasteSpecial(SotClipboardFormatId format = 
SotClipboardFormatId::NONE);
 
     const SfxStyleSheet*  GetStyleSheet() const;
     SfxStyleSheet*  GetStyleSheet();
diff --git a/sc/source/ui/drawfunc/drtxtob1.cxx 
b/sc/source/ui/drawfunc/drtxtob1.cxx
index 63dc62daeb60..4810876a33c4 100644
--- a/sc/source/ui/drawfunc/drtxtob1.cxx
+++ b/sc/source/ui/drawfunc/drtxtob1.cxx
@@ -105,6 +105,7 @@ void ScDrawTextObjectBar::ExecutePasteContents( SfxRequest 
& /* rReq */ )
     pDlg->Insert( SotClipboardFormatId::STRING, OUString() );
     pDlg->Insert( SotClipboardFormatId::RTF,    OUString() );
     pDlg->Insert( SotClipboardFormatId::RICHTEXT,  OUString() );
+    pDlg->Insert(SotClipboardFormatId::HTML_SIMPLE, OUString());
 
     TransferableDataHelper aDataHelper( 
TransferableDataHelper::CreateFromSystemClipboard( mrViewData.GetActiveWin() ) 
);
 
@@ -117,7 +118,7 @@ void ScDrawTextObjectBar::ExecutePasteContents( SfxRequest 
& /* rReq */ )
         if (nFormat == SotClipboardFormatId::STRING)
             pOutView->Paste();
         else
-            pOutView->PasteSpecial();
+            pOutView->PasteSpecial(nFormat);
     }
 }
 
diff --git a/sd/source/ui/func/fuinsert.cxx b/sd/source/ui/func/fuinsert.cxx
index 64b266f42060..7c6971ab9ccd 100644
--- a/sd/source/ui/func/fuinsert.cxx
+++ b/sd/source/ui/func/fuinsert.cxx
@@ -225,6 +225,7 @@ void FuInsertClipboard::DoExecute( SfxRequest&  )
     pDlg->Insert( SotClipboardFormatId::NETSCAPE_BOOKMARK, OUString() );
     pDlg->Insert( SotClipboardFormatId::STRING, OUString() );
     pDlg->Insert( SotClipboardFormatId::HTML, OUString() );
+    pDlg->Insert(SotClipboardFormatId::HTML_SIMPLE, OUString());
     pDlg->Insert( SotClipboardFormatId::RTF, OUString() );
     pDlg->Insert( SotClipboardFormatId::RICHTEXT, OUString() );
     pDlg->Insert( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT, OUString() );
diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx
index 7065c677246b..3f04c25d5900 100644
--- a/sd/source/ui/view/sdview3.cxx
+++ b/sd/source/ui/view/sdview3.cxx
@@ -1491,6 +1491,36 @@ bool View::InsertData( const TransferableDataHelper& 
rDataHelper,
                 }
             }
         }
+
+        bool bIsHtmlSimple = 
CHECK_FORMAT_TRANS(SotClipboardFormatId::HTML_SIMPLE);
+        if (bIsHtmlSimple)
+        {
+            ::tools::SvRef<SotTempStream> xStm;
+
+            if 
(aDataHelper.GetSotStorageStream(SotClipboardFormatId::HTML_SIMPLE, xStm))
+            {
+                xStm->Seek(0);
+
+                OutlinerView* pOLV = GetTextEditOutlinerView();
+
+                if (pOLV)
+                {
+                    ::tools::Rectangle   aRect(pOLV->GetOutputArea());
+                    Point       
aPos(pOLV->GetWindow()->PixelToLogic(maDropPos));
+
+                    if (aRect.Contains(aPos) || (!bDrag && IsTextEdit()))
+                    {
+                        // mba: clipboard always must contain absolute URLs 
(could be from alien source)
+                        pOLV->Read(*xStm, EETextFormat::Html, 
mpDocSh->GetHeaderAttributes());
+                        bReturn = true;
+                    }
+                }
+
+                if (!bReturn)
+                    // mba: clipboard always must contain absolute URLs (could 
be from alien source)
+                    bReturn = SdrView::Paste(*xStm, EETextFormat::Html, 
maDropPos, pPage, nPasteOptions);
+            }
+        }
     }
 
     if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::FILE_LIST))
diff --git a/sw/source/uibase/shells/drwtxtex.cxx 
b/sw/source/uibase/shells/drwtxtex.cxx
index 44ad4bd82058..b5727c97543b 100644
--- a/sw/source/uibase/shells/drwtxtex.cxx
+++ b/sw/source/uibase/shells/drwtxtex.cxx
@@ -1081,6 +1081,7 @@ void SwDrawTextShell::ExecClpbrd(SfxRequest const &rReq)
             pDlg->Insert(SotClipboardFormatId::STRING, OUString());
             pDlg->Insert(SotClipboardFormatId::RTF, OUString());
             pDlg->Insert(SotClipboardFormatId::RICHTEXT, OUString());
+            pDlg->Insert(SotClipboardFormatId::HTML_SIMPLE, OUString());
 
             TransferableDataHelper 
aDataHelper(TransferableDataHelper::CreateFromSystemClipboard(&GetView().GetEditWin()));
             SotClipboardFormatId nFormat = 
pDlg->GetFormat(aDataHelper.GetTransferable());
@@ -1090,7 +1091,7 @@ void SwDrawTextShell::ExecClpbrd(SfxRequest const &rReq)
                 if (nFormat == SotClipboardFormatId::STRING)
                     pOLV->Paste();
                 else
-                    pOLV->PasteSpecial();
+                    pOLV->PasteSpecial(nFormat);
             }
 
             break;

Reply via email to