[Libreoffice-commits] core.git: 4 commits - sw/inc sw/source

Miklos Vajna vmiklos at collabora.co.uk
Sat Nov 14 04:41:38 PST 2015


 sw/inc/SidebarWin.hxx                        |    2 
 sw/inc/drawdoc.hxx                           |    2 
 sw/source/core/draw/drawdoc.cxx              |    6 +
 sw/source/uibase/docvw/SidebarTxtControl.cxx |   26 +++++++
 sw/source/uibase/docvw/SidebarTxtControl.hxx |    2 
 sw/source/uibase/docvw/SidebarWin.cxx        |   90 ++++++++++++++++++++-------
 sw/source/uibase/docvw/edtwin.cxx            |   10 +++
 7 files changed, 117 insertions(+), 21 deletions(-)

New commits:
commit d78432e9a077725046419902c542ce4e5f515705
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sat Nov 14 13:39:02 2015 +0100

    sw lok comments: fix cursor position of a newly created sidebar window
    
    With this, pressing ctrl-alt-c to create a new comment has the correct
    cursor position.
    
    Change-Id: Icb8d708dab015d8ffa9bcfe28de66238a75b50bc

diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx
index 7449887..22bb863 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -665,7 +665,24 @@ void SwSidebarWin::SetPosAndSize()
     {
         bChange = true;
         SetSizePixel(mPosSize.GetSize());
+
+        if (comphelper::LibreOfficeKit::isActive())
+        {
+            // Position is not yet set at VCL level, but the map mode should
+            // contain the right origin to emit the correct cursor position.
+            mpSidebarTextControl->Push(PushFlags::MAPMODE);
+            Point aOffset(mPosSize.Left(), mPosSize.Top());
+            aOffset = PixelToLogic(aOffset);
+            MapMode aMapMode(mpSidebarTextControl->GetMapMode());
+            aMapMode.SetOrigin(aOffset);
+            mpSidebarTextControl->SetMapMode(aMapMode);
+            mpSidebarTextControl->EnableMapMode(false);
+        }
+
         DoResize();
+
+        if (comphelper::LibreOfficeKit::isActive())
+            mpSidebarTextControl->Pop();
     }
 
     if (GetPosPixel().X() != mPosSize.TopLeft().X() || (std::abs(GetPosPixel().Y() - mPosSize.TopLeft().Y()) > 5) )
commit dacc616f7020d045a1cfdb3806436e06046dae10
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sat Nov 14 11:06:08 2015 +0100

    sw lok comments: fix callback of newly created outliner views
    
    SwPostItMgr::registerLibreOfficeKitCallback() already took care of
    informing existing outliners, this commit gives a callback to newly
    registered ones as well.
    
    Change-Id: I660dcb54231a9d404bf80b4284003d119dae6a5c

diff --git a/sw/inc/drawdoc.hxx b/sw/inc/drawdoc.hxx
index 339fbc7..97efdb5 100644
--- a/sw/inc/drawdoc.hxx
+++ b/sw/inc/drawdoc.hxx
@@ -41,6 +41,8 @@ public:
     virtual SdrPage* AllocPage(bool bMasterPage) override;
 
     virtual css::uno::Reference<css::embed::XStorage> GetDocumentStorage() const override;
+    /// Get the callback and callback data, previously given to registerLibreOfficeKitCallback().
+    void getLibreOfficeKitCallback(LibreOfficeKitCallback& rCallback, void*& rLibreOfficeKitData);
 
 protected:
     /// override of <SdrModel::createUnoModel()> is needed to provide corresponding uno model.
diff --git a/sw/source/core/draw/drawdoc.cxx b/sw/source/core/draw/drawdoc.cxx
index 786d86f..4e295d7 100644
--- a/sw/source/core/draw/drawdoc.cxx
+++ b/sw/source/core/draw/drawdoc.cxx
@@ -129,6 +129,12 @@ uno::Reference<embed::XStorage> SwDrawModel::GetDocumentStorage() const
     return m_pDoc->GetDocStorage();
 }
 
+void SwDrawModel::getLibreOfficeKitCallback(LibreOfficeKitCallback& rCallback, void*& rLibreOfficeKitData)
+{
+    rCallback = mpLibreOfficeKitCallback;
+    rLibreOfficeKitData = mpLibreOfficeKitData;
+}
+
 uno::Reference< uno::XInterface > SwDrawModel::createUnoModel()
 {
     uno::Reference< uno::XInterface > xModel;
diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx
index d1901f6..7449887 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -81,6 +81,8 @@
 #include <drawinglayer/primitive2d/shadowprimitive2d.hxx>
 #include <memory>
 #include <comphelper/lok.hxx>
+#include <IDocumentDrawModelAccess.hxx>
+#include <drawdoc.hxx>
 
 namespace
 {
@@ -531,6 +533,17 @@ void SwSidebarWin::InitControls()
 
     mpOutlinerView->SetAttribs(DefaultItem());
 
+    if (comphelper::LibreOfficeKit::isActive())
+    {
+        // If there is a callback already registered, inform the new outliner view about it.
+        SwDrawModel* pDrawModel = mrView.GetWrtShellPtr()->getIDocumentDrawModelAccess().GetDrawModel();
+        LibreOfficeKitCallback pCallback = 0;
+        void* pData = 0;
+        pDrawModel->getLibreOfficeKitCallback(pCallback, pData);
+        mpOutlinerView->setTiledRendering(mrView.GetWrtShellPtr()->isTiledRendering());
+        mpOutlinerView->registerLibreOfficeKitCallback(pCallback, pData);
+    }
+
     //create Scrollbars
     mpVScrollbar = VclPtr<ScrollBar>::Create(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
     mpVScrollbar->EnableNativeWidget(false);
commit e320d070bb0d4dd0ceb696f2c7cc5afb7c4273c3
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sat Nov 14 10:37:45 2015 +0100

    sw lok comments: implement setTextSelection() API
    
    So that it's possible to drag the text selection start/end handles in
    comment text when there is an existing selection.
    
    Change-Id: I3acc4770928d4f385f0ca09a2484a9e112409907

diff --git a/sw/inc/SidebarWin.hxx b/sw/inc/SidebarWin.hxx
index cb49140..bda077b 100644
--- a/sw/inc/SidebarWin.hxx
+++ b/sw/inc/SidebarWin.hxx
@@ -182,6 +182,8 @@ class SwSidebarWin : public vcl::Window
         void PaintTile(vcl::RenderContext& rRenderContext, const Rectangle& rRect);
         /// Is there a matching sub-widget inside this sidebar widget for rPointLogic?
         bool IsHitWindow(const Point& rPointLogic);
+        /// Allows adjusting the point or mark of the selection to a document coordinate.
+        void SetCursorLogicPosition(const Point& rPosition, bool bPoint, bool bClearMark);
 
     protected:
         virtual void    DataChanged( const DataChangedEvent& aEvent) override;
diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx
index 1877e70..d1901f6 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -82,6 +82,32 @@
 #include <memory>
 #include <comphelper/lok.hxx>
 
+namespace
+{
+
+/// Translate absolute <-> relative twips: LOK wants absolute coordinates as output and gives absolute coordinates as input.
+void lcl_translateTwips(vcl::Window& rParent, vcl::Window& rChild, MouseEvent* pMouseEvent)
+{
+    // Set map mode, so that callback payloads will contain absolute coordinates instead of relative ones.
+    Point aOffset(rChild.GetOutOffXPixel() - rParent.GetOutOffXPixel(), rChild.GetOutOffYPixel() - rParent.GetOutOffYPixel());
+    aOffset = rChild.PixelToLogic(aOffset);
+    MapMode aMapMode(rChild.GetMapMode());
+    aMapMode.SetOrigin(aOffset);
+    rChild.SetMapMode(aMapMode);
+    rChild.EnableMapMode(false);
+
+    if (pMouseEvent)
+    {
+        // Set event coordinates, so they contain relative coordinates instead of absolute ones.
+        Point aPos = pMouseEvent->GetPosPixel();
+        aPos.Move(-aOffset.getX(), -aOffset.getY());
+        MouseEvent aMouseEvent(aPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(), pMouseEvent->GetButtons(), pMouseEvent->GetModifier());
+        *pMouseEvent = aMouseEvent;
+    }
+}
+
+}
+
 namespace sw { namespace sidebarwindows {
 
 #define METABUTTON_WIDTH        16
@@ -289,6 +315,19 @@ bool SwSidebarWin::IsHitWindow(const Point& rPointLogic)
     return aRectangleLogic.IsInside(rPointLogic);
 }
 
+void SwSidebarWin::SetCursorLogicPosition(const Point& rPosition, bool bPoint, bool bClearMark)
+{
+    mpSidebarTextControl->Push(PushFlags::MAPMODE);
+    MouseEvent aMouseEvent(rPosition);
+    lcl_translateTwips(EditWin(), *mpSidebarTextControl, &aMouseEvent);
+    Point aPosition(aMouseEvent.GetPosPixel());
+
+    EditView& rEditView = GetOutlinerView()->GetEditView();
+    rEditView.SetCursorLogicPosition(aPosition, bPoint, bClearMark);
+
+    mpSidebarTextControl->Pop();
+}
+
 void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, DrawFlags nInFlags)
 {
     if (mpMetadataAuthor->IsVisible() )
@@ -357,27 +396,6 @@ void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, D
     }
 }
 
-/// Translate absolute <-> relative twips: LOK wants absolute coordinates as output and gives absolute coordinates as input.
-static void lcl_translateTwips(vcl::Window& rParent, vcl::Window& rChild, MouseEvent* pMouseEvent)
-{
-    // Set map mode, so that callback payloads will contain absolute coordinates instead of relative ones.
-    Point aOffset(rChild.GetOutOffXPixel() - rParent.GetOutOffXPixel(), rChild.GetOutOffYPixel() - rParent.GetOutOffYPixel());
-    aOffset = rChild.PixelToLogic(aOffset);
-    MapMode aMapMode(rChild.GetMapMode());
-    aMapMode.SetOrigin(aOffset);
-    rChild.SetMapMode(aMapMode);
-    rChild.EnableMapMode(false);
-
-    if (pMouseEvent)
-    {
-        // Set event coordinates, so they contain relative coordinates instead of absolute ones.
-        Point aPos = pMouseEvent->GetPosPixel();
-        aPos.Move(-aOffset.getX(), -aOffset.getY());
-        MouseEvent aMouseEvent(aPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(), pMouseEvent->GetButtons(), pMouseEvent->GetModifier());
-        *pMouseEvent = aMouseEvent;
-    }
-}
-
 void SwSidebarWin::KeyInput(const KeyEvent& rKeyEvent)
 {
     if (mpSidebarTextControl)
diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx
index 676a556..98aac51 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -6331,6 +6331,16 @@ void SwEditWin::SetCursorTwipPosition(const Point& rPosition, bool bPoint, bool
         }
     }
 
+    if (m_rView.GetPostItMgr())
+    {
+        if (sw::sidebarwindows::SwSidebarWin* pWin = m_rView.GetPostItMgr()->GetActiveSidebarWin())
+        {
+            // Editing postit text.
+            pWin->SetCursorLogicPosition(rPosition, bPoint, bClearMark);
+            return;
+        }
+    }
+
     // Not an SwWrtShell, as that would make SwCrsrShell::GetCrsr() inaccessible.
     SwEditShell& rShell = m_rView.GetWrtShell();
 
commit 4cbbaf571d3982eccd7f7267df3185b3d321d0da
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sat Nov 14 10:04:38 2015 +0100

    sw lok comments: emit invalidation events in SidebarTextControl
    
    With this, newly typed characters show up instantly in comments, not
    only after changing the zoom level.
    
    Change-Id: I1470db1ec03cc415917375f1f95434cf0944e559

diff --git a/sw/source/uibase/docvw/SidebarTxtControl.cxx b/sw/source/uibase/docvw/SidebarTxtControl.cxx
index 4b1c274..31ac8d0 100644
--- a/sw/source/uibase/docvw/SidebarTxtControl.cxx
+++ b/sw/source/uibase/docvw/SidebarTxtControl.cxx
@@ -25,6 +25,7 @@
 
 #include <SidebarWin.hxx>
 #include <PostItMgr.hxx>
+#include <edtwin.hxx>
 
 #include <cmdid.h>
 #include <docvw.hrc>
@@ -48,6 +49,7 @@
 #include <editeng/editeng.hxx>
 #include <editeng/editview.hxx>
 #include <editeng/flditem.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
 
 #include <uitool.hxx>
 #include <view.hxx>
@@ -187,6 +189,30 @@ void SidebarTextControl::Paint(vcl::RenderContext& rRenderContext, const Rectang
     }
 }
 
+void SidebarTextControl::LogicInvalidate(const Rectangle* pRectangle)
+{
+    OString sRectangle;
+    if (!pRectangle)
+        sRectangle = "EMPTY";
+    else
+    {
+        // Convert from relative twips to absolute ones.
+        Rectangle aRectangle(*pRectangle);
+        vcl::Window& rParent = mrSidebarWin.EditWin();
+        Point aOffset(GetOutOffXPixel() - rParent.GetOutOffXPixel(), GetOutOffYPixel() - rParent.GetOutOffYPixel());
+        rParent.Push(PushFlags::MAPMODE);
+        rParent.EnableMapMode();
+        aOffset = rParent.PixelToLogic(aOffset);
+        rParent.Pop();
+        aRectangle.Move(aOffset.getX(), aOffset.getY());
+
+        sRectangle = aRectangle.toString();
+    }
+
+    SwWrtShell& rWrtShell = mrDocView.GetWrtShell();
+    rWrtShell.libreOfficeKitCallback(LOK_CALLBACK_INVALIDATE_TILES, sRectangle.getStr());
+}
+
 void SidebarTextControl::KeyInput( const KeyEvent& rKeyEvt )
 {
     if (getenv("SW_DEBUG") && rKeyEvt.GetKeyCode().GetCode() == KEY_F12)
diff --git a/sw/source/uibase/docvw/SidebarTxtControl.hxx b/sw/source/uibase/docvw/SidebarTxtControl.hxx
index 6741019..ca7271a 100644
--- a/sw/source/uibase/docvw/SidebarTxtControl.hxx
+++ b/sw/source/uibase/docvw/SidebarTxtControl.hxx
@@ -40,6 +40,8 @@ class SidebarTextControl : public Control
 
     protected:
         virtual void    Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect) override;
+        /// @see OutputDevice::LogicInvalidate().
+        void LogicInvalidate(const Rectangle* pRectangle) override;
         virtual void    MouseMove( const MouseEvent& rMEvt ) override;
         virtual void    MouseButtonUp( const MouseEvent& rMEvt ) override;
         virtual void    Command( const CommandEvent& rCEvt ) override;


More information about the Libreoffice-commits mailing list