comphelper/source/misc/lok.cxx                  |   15 +++++++++++++
 desktop/source/lib/init.cxx                     |   15 +++++++++++++
 include/comphelper/lok.hxx                      |    8 +++++++
 sd/qa/unit/tiledrendering/data/signature.pkcs7  |    1 
 sd/qa/unit/tiledrendering/tiledrendering2.cxx   |   16 ++++++++++++++
 sd/source/ui/view/drviewse.cxx                  |    7 ++++++
 sfx2/source/doc/objserv.cxx                     |   19 +++++++++++++++--
 sw/qa/extras/tiledrendering/data/3pages.odt     |binary
 sw/qa/extras/tiledrendering/tiledrendering2.cxx |   26 ++++++++++++++++++++++++
 sw/source/core/view/vnew.cxx                    |    9 ++++++++
 10 files changed, 114 insertions(+), 2 deletions(-)

New commits:
commit bba965b655a9181c07e5cfb6d3a59363e49e650b
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Fri Feb 7 14:09:22 2025 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Feb 13 10:41:15 2025 +0100

    cool#11064 sw lok: allow specifying the visible area during doc load
    
    Large enough documents significantly faster on the desktop than in LOK
    mode for some reason.
    
    Investigating the reason, it turns out that the layout mechanism to
    layout the visible area (first page, typically) of the document as part
    of doc load goes wrong in the LOK case, where nominally the entire
    document is visible.
    
    Fix the problem by adding new "ClientVisibleArea" option to
    lo_documentLoadWithOptions(), so the LOK client can inform us about what
    is the visible area before SwXTextDocument::setClientVisibleArea() can
    be called.
    
    lok::Office::documentLoad() cost for the bugdoc:
    - before: 540 ms
    - after: 112 ms
    
    Conflicts:
            sw/qa/extras/tiledrendering/tiledrendering2.cxx
    
    Change-Id: Ib1df71e768fc42cf92b858a717d7a0e5d51678b6

diff --git a/comphelper/source/misc/lok.cxx b/comphelper/source/misc/lok.cxx
index cd1333711e4d..2fe5d6c181a2 100644
--- a/comphelper/source/misc/lok.cxx
+++ b/comphelper/source/misc/lok.cxx
@@ -8,12 +8,17 @@
  */
 
 #include <comphelper/lok.hxx>
+
+#include <com/sun/star/awt/Rectangle.hpp>
+
 #include <osl/process.h>
 #include <i18nlangtag/languagetag.hxx>
 #include <sal/log.hxx>
 
 #include <iostream>
 
+using namespace com::sun::star;
+
 namespace comphelper::LibreOfficeKit
 {
 
@@ -43,6 +48,9 @@ static void* g_pAnyInputCallbackData;
 static std::function<void(int)> g_pViewSetter;
 static std::function<int()> g_pViewGetter;
 
+/// Visible area of the first view during document load.
+static awt::Rectangle g_aInitialClientVisibleArea;
+
 namespace
 {
 
@@ -370,6 +378,13 @@ int getView()
     return g_pViewGetter();
 }
 
+void setInitialClientVisibleArea(const awt::Rectangle& rClientVisibleArea)
+{
+    g_aInitialClientVisibleArea = rClientVisibleArea;
+}
+
+awt::Rectangle getInitialClientVisibleArea() { return 
g_aInitialClientVisibleArea; }
+
 } // namespace
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 2005b935484d..236fe1402b90 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -2888,6 +2888,21 @@ static LibreOfficeKitDocument* 
lo_documentLoadWithOptions(LibreOfficeKit* pThis,
         }
         SvtSecurityOptions::SetMacroSecurityLevel(nMacroSecurityLevel);
 
+        OUString aClientVisibleArea = extractParameter(aOptions, 
u"ClientVisibleArea");
+        if (!aClientVisibleArea.isEmpty())
+        {
+            std::vector<OUString> aTokens = 
comphelper::string::split(aClientVisibleArea, ';');
+            if (aTokens.size() >= 4)
+            {
+                awt::Rectangle aRectangle;
+                aRectangle.X = aTokens[0].toInt32();
+                aRectangle.Y = aTokens[1].toInt32();
+                aRectangle.Width = aTokens[2].toInt32();
+                aRectangle.Height = aTokens[3].toInt32();
+                
comphelper::LibreOfficeKit::setInitialClientVisibleArea(aRectangle);
+            }
+        }
+
 #if defined(ANDROID) && HAVE_FEATURE_ANDROID_LOK
         sal_Int16 nMacroExecMode = document::MacroExecMode::USE_CONFIG;
 #else
diff --git a/include/comphelper/lok.hxx b/include/comphelper/lok.hxx
index 0565fa78d6da..3cee8180ccb1 100644
--- a/include/comphelper/lok.hxx
+++ b/include/comphelper/lok.hxx
@@ -16,6 +16,10 @@
 #include <rtl/ustring.hxx>
 
 class LanguageTag;
+namespace com::sun::star::awt
+{
+struct Rectangle;
+}
 
 // Interface between the LibreOfficeKit implementation called by 
LibreOfficeKit clients and other
 // LibreOffice code.
@@ -144,6 +148,10 @@ COMPHELPER_DLLPUBLIC void 
setViewSetter(std::function<void(int)> pViewSetter);
 COMPHELPER_DLLPUBLIC void setView(int nView);
 COMPHELPER_DLLPUBLIC void setViewGetter(std::function<int()> pViewGetter);
 COMPHELPER_DLLPUBLIC int getView();
+
+COMPHELPER_DLLPUBLIC void
+setInitialClientVisibleArea(const css::awt::Rectangle& rClientVisibleArea);
+COMPHELPER_DLLPUBLIC css::awt::Rectangle getInitialClientVisibleArea();
 }
 
 #endif // INCLUDED_COMPHELPER_LOK_HXX
diff --git a/sw/qa/extras/tiledrendering/data/3pages.odt 
b/sw/qa/extras/tiledrendering/data/3pages.odt
new file mode 100644
index 000000000000..565cdeae77a5
Binary files /dev/null and b/sw/qa/extras/tiledrendering/data/3pages.odt differ
diff --git a/sw/qa/extras/tiledrendering/tiledrendering2.cxx 
b/sw/qa/extras/tiledrendering/tiledrendering2.cxx
index 753016cf8d58..a314d2587617 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering2.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering2.cxx
@@ -20,6 +20,7 @@
 #include <vcl/scheduler.hxx>
 #include <comphelper/propertyvalue.hxx>
 #include <comphelper/dispatchcommand.hxx>
+#include <comphelper/scopeguard.hxx>
 
 #include <view.hxx>
 #include <IDocumentLayoutAccess.hxx>
@@ -307,6 +308,31 @@ CPPUNIT_TEST_FIXTURE(SwTiledRenderingTest, 
testPDFExportViewSwitch)
     CPPUNIT_ASSERT(aView1.m_aExportFile.isEmpty());
     CPPUNIT_ASSERT(!aView2.m_aExportFile.isEmpty());
 }
+
+CPPUNIT_TEST_FIXTURE(SwTiledRenderingTest, testLoadVisibleArea)
+{
+    // Given a document with 3 pages, the LOK visible area at load time is set 
to the first page:
+    awt::Rectangle aVisibleArea{ 0, 0, 12240, 15840 };
+    comphelper::LibreOfficeKit::setInitialClientVisibleArea(aVisibleArea);
+    comphelper::ScopeGuard g([] { 
comphelper::LibreOfficeKit::setInitialClientVisibleArea({}); });
+
+    // When loading that document:
+    OUString aURL = createFileURL(u"3pages.odt");
+    UnoApiXmlTest::loadFromURL(aURL);
+
+    // Then make sure only the first page is laid out:
+    SwDocShell* pDocShell = getSwDocShell();
+    SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
+    SwRootFrame* pLayout = pWrtShell->GetLayout();
+    SwPageFrame* pPage1 = pLayout->GetLower()->DynCastPageFrame();
+    CPPUNIT_ASSERT(!pPage1->IsInvalidContent());
+    SwPageFrame* pPage2 = pPage1->GetNext()->DynCastPageFrame();
+    // Without the accompanying fix in place, this test failed, as the entire 
document was laid out
+    // before the loading finished.
+    CPPUNIT_ASSERT(pPage2->IsInvalidContent());
+    SwPageFrame* pPage3 = pPage2->GetNext()->DynCastPageFrame();
+    CPPUNIT_ASSERT(pPage3->IsInvalidContent());
+}
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx
index 613a15df633b..4c19f954d699 100644
--- a/sw/source/core/view/vnew.cxx
+++ b/sw/source/core/view/vnew.cxx
@@ -20,6 +20,7 @@
 #include <sfx2/printer.hxx>
 #include <sal/log.hxx>
 #include <osl/diagnose.h>
+#include <comphelper/lok.hxx>
 #include <doc.hxx>
 #include <IDocumentDrawModelAccess.hxx>
 #include <IDocumentUndoRedo.hxx>
@@ -138,6 +139,14 @@ void SwViewShell::Init( const SwViewOption *pNewOpt )
             MakeDrawView();
         mpOpt->SetFormView( ! GetDrawView()->IsDesignMode() );
     }
+
+    awt::Rectangle aClientVisibleArea = 
comphelper::LibreOfficeKit::getInitialClientVisibleArea();
+    if (aClientVisibleArea.Width && aClientVisibleArea.Height)
+    {
+        maLOKVisibleArea
+            = tools::Rectangle(Point(aClientVisibleArea.X, 
aClientVisibleArea.Y),
+                               Size(aClientVisibleArea.Width, 
aClientVisibleArea.Height));
+    }
 }
 
 /// CTor for the first Shell.
commit 68b3a7836d8cb89addf122b98c76d37336a796df
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Wed Jan 22 08:58:55 2025 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Feb 13 10:41:14 2025 +0100

    cool#10630 lok doc sign: reduce the default size of the signature line
    
    This is obviously somewhat subjective, but the default shape size in
    officecfg/registry/schema/org/openoffice/Office/Impress.xcs,
    DefaultObjectSize is 8x5cm, and I find myself always reduring the
    inserted signature line when I test it on a few sample PDF files where
    others left some space for a signature.
    
    Improve this by going with the half of the default in case of signature
    lines, so people typically need to only move the inserted shape, not
    resize it.
    
    The need to only move it is especially helpful as our resize would not
    keep aspect ratio by default and only few users will know they need to
    hold ctrl-shift while resizing to do proportional resize.
    
    Change-Id: Ieaad56601be8277b39a5403e3c3f2e6ed1fd1c97
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180587
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx
index f9466b51a3d1..b815cf0818f3 100644
--- a/sd/source/ui/view/drviewse.cxx
+++ b/sd/source/ui/view/drviewse.cxx
@@ -669,6 +669,13 @@ void DrawViewShell::FuPermanent(SfxRequest& rReq)
     SdOptions* pOptions = 
SdModule::get()->GetSdOptions(GetDoc()->GetDocumentType());
     sal_uInt32 nDefaultObjectSizeWidth(pOptions->GetDefaultObjectSizeWidth());
     sal_uInt32 
nDefaultObjectSizeHeight(pOptions->GetDefaultObjectSizeHeight());
+    if (nSId == SID_INSERT_SIGNATURELINE)
+    {
+        // Half of the default to better match the space available for 
signatures in many real-world
+        // documents.
+        nDefaultObjectSizeWidth *= 0.5;
+        nDefaultObjectSizeHeight *= 0.5;
+    }
 
     // calc position and size
     ::tools::Rectangle aVisArea = 
GetActiveWindow()->PixelToLogic(::tools::Rectangle(Point(0,0), 
GetActiveWindow()->GetOutputSizePixel()));
commit 479748ac0fa089c7c5bd8316ef780c1d5efbcf6a
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Mon Jan 20 09:27:54 2025 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Feb 13 10:41:14 2025 +0100

    cool#10630 doc electronic sign: unselect & reject reselect
    
    Insert a signature line, move/resize the selected shape, finish signing,
    the signature line is still selected and you can still move/resize it.
    
    This was working for the desktop visual signing which
    SfxViewShell::GetSignPDFCertificate() returned an XCertificate, but not
    for electronic signing, which is a separate branch in
    SfxObjectShell::ExecFile_Impl().
    
    Fix the problem by deselecting the shape even in the desktop case and
    the moving this cleanup code to a new ResetSignatureSelection() and
    calling that in the electronic sign case, too.
    
    SdrMarkView::UnmarkAllObj() is private to sfx2/, so go via UNO to do the
    same.
    
    Conflicts:
            sfx2/source/doc/objserv.cxx
    
    Change-Id: I52c89c4aea0203f8624bd801a900186211541dc3

diff --git a/sd/qa/unit/tiledrendering/data/signature.pkcs7 
b/sd/qa/unit/tiledrendering/data/signature.pkcs7
new file mode 100644
index 000000000000..08f32ab26381
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/signature.pkcs7
@@ -0,0 +1 @@
+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
diff --git a/sd/qa/unit/tiledrendering/tiledrendering2.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering2.cxx
index 5b56c5033966..9a76076271b9 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering2.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering2.cxx
@@ -13,6 +13,7 @@
 #include <vcl/scheduler.hxx>
 #include <comphelper/propertyvalue.hxx>
 #include <comphelper/sequenceashashmap.hxx>
+#include <svl/cryptosign.hxx>
 
 #include <DrawDocShell.hxx>
 #include <ViewShell.hxx>
@@ -60,6 +61,8 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testInsertSignatureLineExternal)
     // Without the accompanying fix in place, this test would hang here in the 
certificate chooser
     // dialog.
     dispatchCommand(mxComponent, ".uno:InsertSignatureLine", aArgs);
+    // Signature line is selected right after inserting:
+    CPPUNIT_ASSERT(pViewShell->GetViewShell()->GetSignPDFCertificate().Is());
 
     // Then make sure the shape is marked as a signature line:
     std::vector<SdrObject*> aMarkedObjects = pView->GetMarkedObjects();
@@ -90,6 +93,19 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testInsertSignatureLineExternal)
         bSignature = aProps.get<bool>("isSignature");
     }
     CPPUNIT_ASSERT(bSignature);
+
+    // Make sure there is no leaked selection after signing is finished:
+    OUString aSigUrl = createFileURL(u"signature.pkcs7");
+    SvFileStream aSigStream(aSigUrl, StreamMode::READ);
+    auto aSigValue
+        = OUString::fromUtf8(read_uInt8s_ToOString(aSigStream, 
aSigStream.remainingSize()));
+    aArgs = {
+        comphelper::makePropertyValue(u"SignatureTime"_ustr, 
u"1643201995722"_ustr),
+        comphelper::makePropertyValue(u"SignatureValue"_ustr, aSigValue),
+    };
+    dispatchCommand(mxComponent, u".uno:Signature"_ustr, aArgs);
+    // Signature line is not selected after finishing signing:
+    CPPUNIT_ASSERT(!pViewShell->GetViewShell()->GetSignPDFCertificate().Is());
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx
index 54c759c99eae..1e3a0d9a4972 100644
--- a/sfx2/source/doc/objserv.cxx
+++ b/sfx2/source/doc/objserv.cxx
@@ -92,6 +92,7 @@
 #include <sfx2/sfxuno.hxx>
 #include <sfx2/sfxsids.hrc>
 #include <sfx2/lokhelper.hxx>
+#include <comphelper/dispatchcommand.hxx>
 #include <SfxRedactionHelper.hxx>
 
 #include <com/sun/star/util/XCloseable.hpp>
@@ -520,6 +521,17 @@ void SfxObjectShell::AfterSignContent(bool bHaveWeSigned, 
weld::Window* pDialogP
     }
 }
 
+namespace
+{
+/// Updates the UI so it doesn't try to modify an already finalized signature 
line shape.
+void ResetSignatureSelection(SfxObjectShell& rObjectShell, SfxViewShell& 
rViewShell)
+{
+    rViewShell.SetSignPDFCertificate({});
+    comphelper::dispatchCommand(".uno:DeSelect", {});
+    rObjectShell.RecheckSignature(false);
+}
+}
+
 static weld::Window* GetReqDialogParent(SfxRequest &rReq, SfxObjectShell& 
rShell)
 {
     weld::Window* pDialogParent = rReq.GetFrameWeld();
@@ -563,8 +575,7 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
                 // the infobar back to "sign document".
                 if (pViewShell)
                 {
-                    pViewShell->SetSignPDFCertificate({});
-                    RecheckSignature(false);
+                    ResetSignatureSelection(*this, *pViewShell);
                     pFrame->RemoveInfoBar(u"readonly");
                     pFrame->AppendReadOnlyInfobar();
                 }
@@ -606,6 +617,10 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
                 if (!aSigningContext.m_aSignatureValue.empty())
                 {
                     SignDocumentContentUsingCertificate(aSigningContext);
+                    if (pViewShell)
+                    {
+                        ResetSignatureSelection(*this, *pViewShell);
+                    }
                     rReq.Done();
                     return;
                 }

Reply via email to