Kaydet (Commit) ad769c30 authored tarafından Maxim Monastirsky's avatar Maxim Monastirsky

Adjust DockingWindow layout calculation, tdf#106762 prep

This is needed for the color widget to have the correct size at
initial show, and to keep this size after selecting a different
palette.

The parent FloatingWindow will assume that the border width stays
outside the space that was allocated to the DockingWindow (see
VclContainer::setLayoutPosSize), and yet DockingWindow tries to
handle the border width as part of its allocated space. One option
could be to let FloatingWindow handle this alone, but this won't
work for other possible parents. The current solution is to load
and store the border width in a way that can be used internally,
but not visible to the outside world via get_border_width().

Change-Id: Id51152cf64eef719368e29253eb93e99834489cd
üst 506f7a5e
......@@ -244,7 +244,7 @@ protected:
private:
SAL_DLLPRIVATE void ImplInitDockingWindowData();
SAL_DLLPRIVATE void setPosSizeOnContainee(Size aSize, Window &rBox);
SAL_DLLPRIVATE void setPosSizeOnContainee();
DECL_DLLPRIVATE_LINK( ImplHandleLayoutTimerHdl, Timer*, void );
DockingWindow (const DockingWindow &) = delete;
......
......@@ -55,7 +55,6 @@
<property name="stock">gtk-goto-last</property>
</object>
<object class="GtkWindow" id="DockingAnimation">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
......
......@@ -3,7 +3,6 @@
<interface domain="sm">
<requires lib="gtk+" version="3.0"/>
<object class="GtkWindow" id="DockingElements">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
......
......@@ -256,7 +256,6 @@
<property name="pixbuf">svx/res/normflat.png</property>
</object>
<object class="GtkWindow" id="Docking3DEffects">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
......
......@@ -10,7 +10,6 @@
<property name="page_increment">10</property>
</object>
<object class="GtkWindow" id="DockingColorReplace">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
......
......@@ -10,7 +10,6 @@
<property name="page_increment">1</property>
</object>
<object class="GtkWindow" id="DockingFontwork">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
......
......@@ -707,9 +707,12 @@ void DockingWindow::SetFloatingMode( bool bFloatMode )
if ( bFloatMode )
{
Show( false, ShowFlags::NoFocusChange );
// set deferred properties early, so border width will end up
// in our mpWindowImpl->mnBorderWidth, not in mpBorderWindow.
// (see its usage in setPosSizeOnContainee and GetOptimalSize.)
setDeferredProperties();
sal_Int32 nBorderWidth = get_border_width();
Show( false, ShowFlags::NoFocusChange );
maDockPos = Window::GetPosPixel();
......@@ -757,19 +760,13 @@ void DockingWindow::SetFloatingMode( bool bFloatMode )
ToggleFloatingMode();
set_border_width(nBorderWidth);
if ( bVisible )
Show();
mpFloatWin->queue_resize();
}
else
{
Show( false, ShowFlags::NoFocusChange );
sal_Int32 nBorderWidth = get_border_width();
// store FloatingData in FloatingWindow
maFloatPos = mpFloatWin->GetPosPixel();
mbDockBtn = mpFloatWin->IsTitleButtonVisible( TitleButton::Docking );
......@@ -795,8 +792,6 @@ void DockingWindow::SetFloatingMode( bool bFloatMode )
ToggleFloatingMode();
set_border_width(nBorderWidth);
if ( bVisible )
Show();
}
......@@ -844,19 +839,7 @@ void DockingWindow::setPosSizePixel( long nX, long nY,
}
if (::isLayoutEnabled(this))
{
Size aSize(GetSizePixel());
sal_Int32 nBorderWidth = get_border_width();
aSize.Width() -= 2 * nBorderWidth;
aSize.Height() -= 2 * nBorderWidth;
Point aPos(nBorderWidth, nBorderWidth);
Window *pBox = GetWindow(GetWindowType::FirstChild);
assert(pBox);
VclContainer::setLayoutAllocation(*pBox, aPos, aSize);
}
setPosSizeOnContainee();
}
Point DockingWindow::GetPosPixel() const
......@@ -998,8 +981,6 @@ void DockingWindow::setOptimalLayoutSize()
maLayoutIdle.Stop();
//resize DockingWindow to fit requisition on initial show
Window *pBox = GetWindow(GetWindowType::FirstChild);
Size aSize = get_preferred_size();
Size aMax(bestmaxFrameSizeForScreenSize(GetDesktopRectPixel().GetSize()));
......@@ -1008,19 +989,23 @@ void DockingWindow::setOptimalLayoutSize()
aSize.Height() = std::min(aMax.Height(), aSize.Height());
SetMinOutputSizePixel(aSize);
SetSizePixel(aSize);
setPosSizeOnContainee(aSize, *pBox);
setPosSizeOnContainee();
}
void DockingWindow::setPosSizeOnContainee(Size aSize, Window &rBox)
void DockingWindow::setPosSizeOnContainee()
{
sal_Int32 nBorderWidth = get_border_width();
Size aSize = GetOutputSizePixel();
// Can't use get_border_width() here, because we don't want
// the border to be also visible to the floating window.
sal_Int32 nBorderWidth = mpWindowImpl->mnBorderWidth;
aSize.Width() -= 2 * nBorderWidth;
aSize.Height() -= 2 * nBorderWidth;
Point aPos(nBorderWidth, nBorderWidth);
VclContainer::setLayoutAllocation(rBox, aPos, aSize);
Window* pBox = GetWindow(GetWindowType::FirstChild);
assert(pBox);
VclContainer::setLayoutAllocation(*pBox, Point(nBorderWidth, nBorderWidth), aSize);
}
Size DockingWindow::GetOptimalSize() const
......@@ -1030,12 +1015,14 @@ Size DockingWindow::GetOptimalSize() const
Size aSize = VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
sal_Int32 nBorderWidth = get_border_width();
// Can't use get_border_width() here, because we don't want
// the border to be also visible to the floating window.
sal_Int32 nBorderWidth = mpWindowImpl->mnBorderWidth;
aSize.Height() += 2 * nBorderWidth;
aSize.Width() += 2 * nBorderWidth;
return Window::CalcWindowSize(aSize);
return aSize;
}
void DockingWindow::queue_resize(StateChangedType eReason)
......@@ -1064,10 +1051,7 @@ IMPL_LINK_NOARG(DockingWindow, ImplHandleLayoutTimerHdl, Timer*, void)
SAL_WARN("vcl.layout", "DockingWindow has become non-layout because extra children have been added directly to it.");
return;
}
Window *pBox = GetWindow(GetWindowType::FirstChild);
assert(pBox);
setPosSizeOnContainee(GetSizePixel(), *pBox);
setPosSizeOnContainee();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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