include/vcl/dockwin.hxx       |    2 
 include/vcl/settings.hxx      |    2 
 vcl/source/app/settings.cxx   |   10 -
 vcl/source/window/brdwin.cxx  |   26 +++-
 vcl/source/window/dockmgr.cxx |  226 ++++--------------------------------------
 5 files changed, 42 insertions(+), 224 deletions(-)

New commits:
commit c5ecb2990123d666dde0d66ce38dc3b9f03802c4
Author: Maxim Monastirsky <momonas...@gmail.com>
Date:   Thu Jan 18 00:49:17 2018 +0200

    Move toolbars to the border window tearoff mechanism
    
    and remove the one from ImplPopupFloatWin. Implemented using
    the FloatWinTitleType::TearOff case, which was unused otherwise.
    
    Change-Id: I82a86e5f5897ce1f2e76a2404bb382cbc007700c
    Reviewed-on: https://gerrit.libreoffice.org/48095
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Maxim Monastirsky <momonas...@gmail.com>

diff --git a/include/vcl/dockwin.hxx b/include/vcl/dockwin.hxx
index 1378e07c1911..af10bceef5d5 100644
--- a/include/vcl/dockwin.hxx
+++ b/include/vcl/dockwin.hxx
@@ -112,7 +112,7 @@ private:
                     DECL_LINK( PopupModeEnd, FloatingWindow*, void );
     void            ImplEnableStartDocking()  { mbStartDockingEnabled = true; }
     bool            ImplStartDockingEnabled() const { return 
mbStartDockingEnabled; }
-    void            ImplPreparePopupMode( FloatWinPopupFlags nFlags );
+    void            ImplPreparePopupMode();
 
 public:
     ImplDockingWindowWrapper( const vcl::Window *pWindow );
diff --git a/include/vcl/settings.hxx b/include/vcl/settings.hxx
index 9b6ab00f2029..6b061336f61d 100644
--- a/include/vcl/settings.hxx
+++ b/include/vcl/settings.hxx
@@ -483,8 +483,6 @@ public:
     void                            SetFloatTitleHeight( long nSize );
     long                            GetFloatTitleHeight() const;
 
-    long                            GetTearOffTitleHeight() const;
-
     void                            SetScrollBarSize( long nSize );
     long                            GetScrollBarSize() const;
 
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
index 97723e7a21b5..5429c20a400c 100644
--- a/vcl/source/app/settings.cxx
+++ b/vcl/source/app/settings.cxx
@@ -156,7 +156,6 @@ struct ImplStyleData
     long                            mnBorderSize;
     long                            mnTitleHeight;
     long                            mnFloatTitleHeight;
-    long                            mnTearOffTitleHeight;
     long                            mnScrollBarSize;
     long                            mnSplitSize;
     long                            mnSpinSize;
@@ -632,7 +631,6 @@ ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
     mnBorderSize                = rData.mnBorderSize;
     mnTitleHeight               = rData.mnTitleHeight;
     mnFloatTitleHeight          = rData.mnFloatTitleHeight;
-    mnTearOffTitleHeight        = rData.mnTearOffTitleHeight;
     mnScrollBarSize             = rData.mnScrollBarSize;
     mnMinThumbSize              = rData.mnMinThumbSize;
     mnSplitSize                 = rData.mnSplitSize;
@@ -752,7 +750,6 @@ void ImplStyleData::SetStandardStyles()
     mnBorderSize                = 1;
     mnTitleHeight               = 18;
     mnFloatTitleHeight          = 13;
-    mnTearOffTitleHeight        = 8;
     mbHighContrast              = false;
     mbUseSystemUIFonts          = true;
     mnUseFlatBorders            = false;
@@ -1755,12 +1752,6 @@ StyleSettings::GetFloatTitleHeight() const
     return mxData->mnFloatTitleHeight;
 }
 
-long
-StyleSettings::GetTearOffTitleHeight() const
-{
-    return mxData->mnTearOffTitleHeight;
-}
-
 void
 StyleSettings::SetScrollBarSize( long nSize )
 {
@@ -2286,7 +2277,6 @@ bool StyleSettings::operator ==( const StyleSettings& 
rSet ) const
          (mxData->mnBorderSize              == rSet.mxData->mnBorderSize)      
         &&
          (mxData->mnTitleHeight             == rSet.mxData->mnTitleHeight)     
         &&
          (mxData->mnFloatTitleHeight        == 
rSet.mxData->mnFloatTitleHeight)         &&
-         (mxData->mnTearOffTitleHeight      == 
rSet.mxData->mnTearOffTitleHeight)       &&
          (mxData->mnScrollBarSize           == rSet.mxData->mnScrollBarSize)   
         &&
          (mxData->mnMinThumbSize            == rSet.mxData->mnMinThumbSize)    
         &&
          (mxData->mnSplitSize               == rSet.mxData->mnSplitSize)       
         &&
diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx
index 5d8b14c7cde9..58914dd83fdc 100644
--- a/vcl/source/window/brdwin.cxx
+++ b/vcl/source/window/brdwin.cxx
@@ -36,6 +36,7 @@
 #include <vcl/edit.hxx>
 #include <vcl/metric.hxx>
 #include <vcl/settings.hxx>
+#include <vcl/toolbox.hxx>
 
 using namespace ::com::sun::star::uno;
 
@@ -153,7 +154,7 @@ void 
ImplBorderWindowView::ImplInitTitle(ImplBorderFrameData* pData)
     {
         const StyleSettings& rStyleSettings = 
pData->mpOutDev->GetSettings().GetStyleSettings();
         if (pData->mnTitleType == BorderWindowTitleType::Tearoff)
-            pData->mnTitleHeight = rStyleSettings.GetTearOffTitleHeight();
+            pData->mnTitleHeight = 
ToolBox::ImplGetDragWidth(*pData->mpBorderWindow.get(), false) + 2;
         else
         {
             if (pData->mnTitleType == BorderWindowTitleType::Small)
@@ -279,6 +280,9 @@ bool ImplBorderWindowView::ImplMouseMove( 
ImplBorderFrameData* pData, const Mous
         pData->mnCloseState |= DrawButtonFlags::Highlight;
     else if ( nHitTest & BorderWindowHitTest::Menu )
         pData->mnMenuState |= DrawButtonFlags::Highlight;
+    else if ( nHitTest & BorderWindowHitTest::Title &&
+              pData->mnTitleType == BorderWindowTitleType::Tearoff && 
!rMEvt.IsLeaveWindow() )
+        ePtrStyle = PointerStyle::Move;
     pData->mpBorderWindow->SetPointer( Pointer( ePtrStyle ) );
 
     if( pData->mnCloseState != oldCloseState )
@@ -1310,7 +1314,8 @@ void ImplStdBorderWindowView::Init( OutputDevice* pDev, 
long nWidth, long nHeigh
     if (pData->mnTitleHeight)
     {
         // to improve symbol display force a minimum title height
-        if( pData->mnTitleHeight < MIN_CAPTION_HEIGHT )
+        if (pData->mnTitleType != BorderWindowTitleType::Tearoff &&
+            pData->mnTitleHeight < MIN_CAPTION_HEIGHT)
             pData->mnTitleHeight = MIN_CAPTION_HEIGHT;
 
         // set a proper background for drawing
@@ -1418,7 +1423,7 @@ void 
ImplStdBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, con
     vcl::Region oldClipRgn(rRenderContext.GetClipRegion());
 
     // for popups, don't draw part of the frame
-    if (pData->mnTitleType >= BorderWindowTitleType::Popup)
+    if (pData->mnTitleType >= BorderWindowTitleType::Tearoff)
     {
         FloatingWindow* pWin = 
dynamic_cast<FloatingWindow*>(pData->mpBorderWindow->GetWindow(GetWindowType::Client));
         if (pWin)
@@ -1444,7 +1449,7 @@ void 
ImplStdBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, con
     --aInRect.Bottom();
 
     // restore
-    if (pData->mnTitleType >= BorderWindowTitleType::Popup)
+    if (pData->mnTitleType >= BorderWindowTitleType::Tearoff)
         rRenderContext.SetClipRegion(oldClipRgn);
 
     // Draw Border
@@ -1469,10 +1474,12 @@ void 
ImplStdBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, con
         aInRect = pData->maTitleRect;
 
         // use no gradient anymore, just a static titlecolor
-        if (pData->mnTitleType != BorderWindowTitleType::Popup)
-            rRenderContext.SetFillColor(aFrameColor);
-        else
+        if (pData->mnTitleType == BorderWindowTitleType::Tearoff)
+            rRenderContext.SetFillColor(rStyleSettings.GetFaceGradientColor());
+        else if (pData->mnTitleType == BorderWindowTitleType::Popup)
             rRenderContext.SetFillColor(aFaceColor);
+        else
+            rRenderContext.SetFillColor(aFrameColor);
 
         rRenderContext.SetTextColor(rStyleSettings.GetButtonTextColor());
         tools::Rectangle aTitleRect(pData->maTitleRect);
@@ -1510,6 +1517,11 @@ void 
ImplStdBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, con
 
             rRenderContext.DrawText(aInRect, pBorderWindow->GetText(), 
nTextStyle);
         }
+        else
+        {
+            ToolBox::ImplDrawGrip(rRenderContext, aTitleRect, 
ToolBox::ImplGetDragWidth(rRenderContext, false),
+                                  WindowAlign::Left, false);
+        }
     }
 
     if (!pData->maCloseRect.IsEmpty())
diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx
index 57b83e568215..ed026a3fdf0d 100644
--- a/vcl/source/window/dockmgr.cxx
+++ b/vcl/source/window/dockmgr.cxx
@@ -408,42 +408,24 @@ tools::Rectangle DockingManager::GetPosSizePixel( const 
vcl::Window *pWindow )
 class ImplPopupFloatWin : public FloatingWindow
 {
 private:
-    bool                        mbMoving;
-    bool                        mbTrackingEnabled;
-    Point                       maDelta;
-    bool                        mbHasGrip;
-    void                        ImplSetBorder();
+    bool mbToolBox;
 
 public:
-    ImplPopupFloatWin( vcl::Window* pParent, bool bHasGrip );
+    ImplPopupFloatWin( vcl::Window* pParent, bool bToolBox );
     virtual ~ImplPopupFloatWin() override;
-
     virtual css::uno::Reference< css::accessibility::XAccessible > 
CreateAccessible() override;
-    virtual void        Paint(vcl::RenderContext& rRenderContext, const 
tools::Rectangle& rRect) override;
-    virtual void        MouseMove( const MouseEvent& rMEvt ) override;
-    virtual void        MouseButtonDown( const MouseEvent& rMEvt ) override;
-    virtual void        MouseButtonUp( const MouseEvent& rMEvt ) override;
-    virtual void        Tracking( const TrackingEvent& rTEvt ) override;
-    virtual void        Resize() override;
-
-    tools::Rectangle           GetDragRect() const;
-    Point               GetToolboxPosition() const;
-    void                DrawGrip(vcl::RenderContext& rRenderContext);
-    void                DrawBorder(vcl::RenderContext& rRenderContext);
-
-    bool                hasGrip() const { return mbHasGrip; }
 };
 
-ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, bool bHasGrip ) :
-    FloatingWindow( pParent, WB_NOBORDER | WB_SYSTEMWINDOW | WB_NOSHADOW )
+ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, bool bToolBox ) :
+    FloatingWindow( pParent, bToolBox ? WB_BORDER | WB_POPUP | WB_SYSTEMWINDOW 
| WB_NOSHADOW : WB_STDPOPUP ),
+    mbToolBox( bToolBox )
 {
-    mpWindowImpl->mbToolbarFloatingWindow = true;   // indicate window type, 
required for accessibility
-                                                    // which should not see 
this window as a toplevel window
-    mbMoving = false;
-    mbTrackingEnabled = false;
-    mbHasGrip = bHasGrip;
-
-    ImplSetBorder();
+    if ( bToolBox )
+    {
+        // indicate window type, required for accessibility
+        // which should not see this window as a toplevel window
+        mpWindowImpl->mbToolbarFloatingWindow = true;
+    }
 }
 
 ImplPopupFloatWin::~ImplPopupFloatWin()
@@ -453,6 +435,9 @@ ImplPopupFloatWin::~ImplPopupFloatWin()
 
 css::uno::Reference< css::accessibility::XAccessible > 
ImplPopupFloatWin::CreateAccessible()
 {
+    if ( !mbToolBox )
+        return FloatingWindow::CreateAccessible();
+
     // switch off direct accessibility support for this window
 
     // this is to avoid appearance of this window as standalone window in the 
accessibility hierarchy
@@ -462,166 +447,6 @@ css::uno::Reference< css::accessibility::XAccessible > 
ImplPopupFloatWin::Create
     return css::uno::Reference< css::accessibility::XAccessible >();
 }
 
-void ImplPopupFloatWin::ImplSetBorder()
-{
-    // although we have no border in the sense of a borderwindow
-    //  we're using a special border for the grip
-    // by setting those members the method SetOutputSizePixel() can
-    //  be used to set the proper window size
-    mpWindowImpl->mnTopBorder     = 1;
-    if( hasGrip() )
-        mpWindowImpl->mnTopBorder += 1 + ToolBox::ImplGetDragWidth( *this, 
false );
-    mpWindowImpl->mnBottomBorder  = 1;
-    mpWindowImpl->mnLeftBorder    = 1;
-    mpWindowImpl->mnRightBorder   = 1;
-}
-
-void ImplPopupFloatWin::Resize()
-{
-    // the borderview overwrites the border during resize so restore it
-    ImplSetBorder();
-}
-
-tools::Rectangle ImplPopupFloatWin::GetDragRect() const
-{
-    if( !hasGrip() )
-        return tools::Rectangle();
-    return tools::Rectangle( 1, 1, GetOutputSizePixel().Width() - 1,
-                      2 + ToolBox::ImplGetDragWidth( *this, false ) );
-}
-
-Point ImplPopupFloatWin::GetToolboxPosition() const
-{
-    // return inner position where a toolbox could be placed
-    return Point( 1, 1 + ( hasGrip() ? GetDragRect().getHeight() : 0 ) );    
// grip + border
-}
-
-void ImplPopupFloatWin::DrawBorder(vcl::RenderContext& rRenderContext)
-{
-    rRenderContext.SetFillColor();
-    tools::Rectangle aRect( Point(), GetOutputSizePixel() );
-
-    vcl::Region oldClipRgn( GetClipRegion( ) );
-    vcl::Region aClipRgn( aRect );
-    tools::Rectangle aItemClipRect( ImplGetItemEdgeClipRect() );
-    if( !aItemClipRect.IsEmpty() )
-    {
-        aItemClipRect.SetPos( AbsoluteScreenToOutputPixel( 
aItemClipRect.TopLeft() ) );
-
-        // draw the excluded border part with the background color of a toolbox
-        rRenderContext.SetClipRegion( vcl::Region( aItemClipRect ) );
-        rRenderContext.SetLineColor( 
GetSettings().GetStyleSettings().GetFaceColor() );
-        rRenderContext.DrawRect( aRect );
-
-        aClipRgn.Exclude( aItemClipRect );
-        SetClipRegion( aClipRgn );
-    }
-    rRenderContext.SetLineColor( 
rRenderContext.GetSettings().GetStyleSettings().GetShadowColor() );
-    rRenderContext.DrawRect( aRect );
-    rRenderContext.SetClipRegion( oldClipRgn );
-}
-
-void ImplPopupFloatWin::DrawGrip(vcl::RenderContext& rRenderContext)
-{
-    bool bLinecolor     = rRenderContext.IsLineColor();
-    Color aLinecolor    = rRenderContext.GetLineColor();
-    bool bFillcolor     = rRenderContext.IsFillColor();
-    Color aFillcolor    = rRenderContext.GetFillColor();
-
-    if (!ToolBox::AlwaysLocked())  // no grip if toolboxes are locked
-    {
-        ToolBox::ImplDrawGrip(rRenderContext, GetDragRect(),
-                              ToolBox::ImplGetDragWidth( *this, false ), 
WindowAlign::Left, false );
-    }
-
-    if (bLinecolor)
-        rRenderContext.SetLineColor(aLinecolor);
-    else
-        rRenderContext.SetLineColor();
-    if (bFillcolor)
-        rRenderContext.SetFillColor(aFillcolor);
-    else
-        rRenderContext.SetFillColor();
-}
-
-void ImplPopupFloatWin::Paint(vcl::RenderContext& rRenderContext, const 
tools::Rectangle&)
-{
-    DrawBorder(rRenderContext);
-    if (hasGrip())
-        DrawGrip(rRenderContext);
-}
-
-void ImplPopupFloatWin::MouseMove( const MouseEvent& rMEvt )
-{
-    Point aMousePos = rMEvt.GetPosPixel();
-
-    if( !ToolBox::AlwaysLocked() )  // no tear off if locking is enabled
-    {
-        if( mbTrackingEnabled && rMEvt.IsLeft() && GetDragRect().IsInside( 
aMousePos ) )
-        {
-            // start window move
-            mbMoving = true;
-            StartTracking( StartTrackingFlags::NoKeyCancel );
-            return;
-        }
-        if( GetDragRect().IsInside( aMousePos ) )
-        {
-            if( GetPointer().GetStyle() != PointerStyle::Move )
-                SetPointer( Pointer( PointerStyle::Move ) );
-        }
-        if( rMEvt.IsLeaveWindow() || !GetDragRect().IsInside( aMousePos ) )
-        {
-            if( GetPointer().GetStyle() != PointerStyle::Arrow )
-                SetPointer( Pointer( PointerStyle::Arrow ) );
-        }
-    }
-}
-
-void ImplPopupFloatWin::MouseButtonUp( const MouseEvent& rMEvt )
-{
-    mbTrackingEnabled = false;
-    FloatingWindow::MouseButtonUp( rMEvt );
-}
-
-void ImplPopupFloatWin::MouseButtonDown( const MouseEvent& rMEvt )
-{
-    Point aMousePos = rMEvt.GetPosPixel();
-    if( GetDragRect().IsInside( aMousePos ) )
-    {
-        // get mouse pos at a static window to have a fixed reference point
-        PointerState aState = GetParent()->GetPointerState();
-        if (HasMirroredGraphics() && IsRTLEnabled())
-            ImplMirrorFramePos(aState.maPos);
-        maDelta = aState.maPos - GetWindow( GetWindowType::Border 
)->GetPosPixel();
-        mbTrackingEnabled = true;
-    }
-    else
-    {
-        mbTrackingEnabled = false;
-    }
-}
-
-void ImplPopupFloatWin::Tracking( const TrackingEvent& rTEvt )
-{
-    if( mbMoving )
-    {
-        if ( rTEvt.IsTrackingEnded() )
-        {
-            mbMoving = false;
-            EndPopupMode( FloatWinPopupEndFlags::TearOff );
-        }
-        else if ( !rTEvt.GetMouseEvent().IsSynthetic() )
-        {
-            // move the window according to mouse pos
-            PointerState aState = GetParent()->GetPointerState();
-            const OutputDevice *pOutDev = GetOutDev();
-            if (pOutDev->HasMirroredGraphics() && IsRTLEnabled())
-                ImplMirrorFramePos(aState.maPos);
-            GetWindow( GetWindowType::Border )->SetPosPixel( aState.maPos - 
maDelta );
-        }
-    }
-}
-
 ImplDockingWindowWrapper::ImplDockingWindowWrapper( const vcl::Window *pWindow 
)
     : mpDockingWindow(const_cast<vcl::Window*>(pWindow))
     , mpFloatWin(nullptr)
@@ -922,7 +747,7 @@ void ImplDockingWindowWrapper::ShowTitleButton( TitleButton 
nButton, bool bVisib
     }
 }
 
-void ImplDockingWindowWrapper::ImplPreparePopupMode( FloatWinPopupFlags nFlags 
)
+void ImplDockingWindowWrapper::ImplPreparePopupMode()
 {
     GetWindow()->Show( false, ShowFlags::NoFocusChange );
 
@@ -932,15 +757,8 @@ void ImplDockingWindowWrapper::ImplPreparePopupMode( 
FloatWinPopupFlags nFlags )
     if( mpOldBorderWin.get() == GetWindow() )
         mpOldBorderWin = nullptr;  // no border window found
 
-    bool bAllowTearOff = bool( nFlags & FloatWinPopupFlags::AllowTearOff );
-    bool bUseStdPopup = GetWindow()->GetType() != WindowType::TOOLBOX;
-
     // the new parent for popup mode
-    VclPtr<FloatingWindow> pWin;
-    if ( bUseStdPopup )
-        pWin = VclPtr<FloatingWindow>::Create( mpParent, WB_STDPOPUP );
-    else
-        pWin = VclPtr<ImplPopupFloatWin>::Create( mpParent, bAllowTearOff );
+    VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, GetWindow()->GetType() 
== WindowType::TOOLBOX );
     pWin->SetPopupModeEndHdl( LINK( this, ImplDockingWindowWrapper, 
PopupModeEnd ) );
 
     // At least for DockingWindow, GetText() has a side effect of setting 
deferred
@@ -957,10 +775,6 @@ void ImplDockingWindowWrapper::ImplPreparePopupMode( 
FloatWinPopupFlags nFlags )
     GetWindow()->mpWindowImpl->mnRightBorder   = 0;
     GetWindow()->mpWindowImpl->mnBottomBorder  = 0;
 
-    // position toolbox below the drag grip
-    if ( !bUseStdPopup )
-        GetWindow()->SetPosPixel( static_cast<ImplPopupFloatWin*>( pWin.get() 
)->GetToolboxPosition() );
-
     // reparent borderwindow and window
     if ( mpOldBorderWin )
         mpOldBorderWin->SetParent( pWin );
@@ -982,7 +796,11 @@ void ImplDockingWindowWrapper::StartPopupMode( ToolBox 
*pParentToolBox, FloatWin
     if( IsFloatingMode() )
         return;
 
-    ImplPreparePopupMode( nFlags );
+    ImplPreparePopupMode();
+
+    // don't allow tearoff, if globally disabled
+    if( GetWindow()->GetType() == WindowType::TOOLBOX && 
ToolBox::AlwaysLocked() )
+        nFlags &= ~FloatWinPopupFlags::AllowTearOff;
 
     // if the subtoolbar was opened via keyboard make sure that key events
     // will go into subtoolbar
@@ -1006,7 +824,7 @@ void ImplDockingWindowWrapper::StartPopupMode( const 
tools::Rectangle& rRect, Fl
     if( IsFloatingMode() )
         return;
 
-    ImplPreparePopupMode( nFlags );
+    ImplPreparePopupMode();
     mpFloatWin->StartPopupMode( rRect, nFlags );
     GetWindow()->Show();
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to