merge queue_layout and queue_resize

so that any window derived class, and not just dialogs, can trigger layouting
of their children. Merge together the handful of hacked-up impls of this.

Do that then for the sidebar PanelLayout so that when the label of the custom
animation frame changes that the frame allocates enough space for the new label
to display fully

Change-Id: I9a95f6c3f60cd6cea47656e66cb9ffcc154a3a5a
This commit is contained in:
Caolán McNamara 2013-09-30 14:44:37 +01:00
parent dbd6ae7dfd
commit a48cf78fab
14 changed files with 70 additions and 26 deletions

View File

@ -186,7 +186,7 @@ private:
VectorOfNodes LoadNodes( Module* pModule, const OUString& rExtensionId );
void InsertNodes( const VectorOfNodes& rNodeList );
virtual void queue_layout();
virtual void queue_resize();
void SetPaneSize(Window *pPane);
protected:

View File

@ -930,7 +930,7 @@ bool OfaTreeOptionsDialog::hasTreePendingLayout() const
return maTreeLayoutTimer.IsActive();
}
void OfaTreeOptionsDialog::queue_layout()
void OfaTreeOptionsDialog::queue_resize()
{
if (hasTreePendingLayout())
return;

View File

@ -263,7 +263,7 @@ public:
virtual void ActivatePage();
virtual long DeactivatePage();
virtual void queue_layout();
virtual void queue_resize();
sal_Bool ShowPrevPage();
sal_Bool ShowNextPage();

View File

@ -14,19 +14,28 @@
#include <vcl/builder.hxx>
#include <vcl/ctrl.hxx>
#include <vcl/timer.hxx>
#include <com/sun/star/frame/XFrame.hpp>
/// This class is the base for the Widget Layout-based sidebar panels.
class SVX_DLLPUBLIC PanelLayout : public Control, public VclBuilderContainer
{
private:
Timer m_aPanelLayoutTimer;
bool m_bInClose;
bool hasPanelPendingLayout() const;
DECL_DLLPRIVATE_LINK( ImplHandlePanelLayoutTimerHdl, void* );
public:
PanelLayout(Window* pParent, const OString& rID, const OUString& rUIXMLDescription,
const com::sun::star::uno::Reference<com::sun::star::frame::XFrame> &rFrame);
virtual ~PanelLayout() {}
virtual ~PanelLayout();
virtual Size GetOptimalSize() const;
virtual void setPosSizePixel(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL);
virtual void queue_resize();
};
#endif

View File

@ -104,7 +104,7 @@ public:
bool isLayoutEnabled() const;
void setOptimalLayoutSize();
bool isCalculatingInitialLayoutSize() const { return mbIsCalculatingInitialLayoutSize; }
virtual void queue_layout();
virtual void queue_resize();
virtual bool set_property(const OString &rKey, const OString &rValue);
VclButtonBox* get_action_area();
VclBox* get_content_area();

View File

@ -39,6 +39,8 @@ public:
{
m_bLayoutDirty = true;
}
virtual void queue_resize();
protected:
//these are the two that need to be implemented by
//containers, figure out how much space you want...

View File

@ -201,6 +201,8 @@ public:
{
mbLayoutDirty = true;
}
virtual void queue_resize();
};
#endif // _SV_TABCTRL_HXX

View File

@ -1074,7 +1074,7 @@ public:
*
* akin to gtk_widget_queue_resize
*/
void queue_resize();
virtual void queue_resize();
/*
* Sets the "width-request" property

View File

@ -119,7 +119,7 @@ bool WizardDialog::hasWizardPendingLayout() const
return maWizardLayoutTimer.IsActive();
}
void WizardDialog::queue_layout()
void WizardDialog::queue_resize()
{
if (hasWizardPendingLayout())
return;

View File

@ -12,9 +12,18 @@
PanelLayout::PanelLayout(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, const com::sun::star::uno::Reference<com::sun::star::frame::XFrame> &rFrame)
: Control(pParent)
, m_bInClose(false)
{
SetStyle(GetStyle() | WB_DIALOGCONTROL);
m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID, rFrame);
m_aPanelLayoutTimer.SetTimeout(50);
m_aPanelLayoutTimer.SetTimeoutHdl( LINK( this, PanelLayout, ImplHandlePanelLayoutTimerHdl ) );
}
PanelLayout::~PanelLayout()
{
m_bInClose = true;
m_aPanelLayoutTimer.Stop();
}
Size PanelLayout::GetOptimalSize() const
@ -25,6 +34,30 @@ Size PanelLayout::GetOptimalSize() const
return Control::GetOptimalSize();
}
bool PanelLayout::hasPanelPendingLayout() const
{
return m_aPanelLayoutTimer.IsActive();
}
void PanelLayout::queue_resize()
{
if (m_bInClose)
return;
if (hasPanelPendingLayout())
return;
if (!isLayoutEnabled(this))
return;
m_aPanelLayoutTimer.Start();
}
IMPL_LINK( PanelLayout, ImplHandlePanelLayoutTimerHdl, void*, EMPTYARG )
{
Window *pChild = GetWindow(WINDOW_FIRSTCHILD);
assert(pChild);
VclContainer::setLayoutAllocation(*pChild, Point(0, 0), GetSizePixel());
return 0;
}
void PanelLayout::setPosSizePixel(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags)
{
bool bCanHandleSmallerWidth = false;

View File

@ -2361,4 +2361,10 @@ Size TabControl::GetOptimalSize() const
return calculateRequisition();
}
void TabControl::queue_resize()
{
markLayoutDirty();
Window::queue_resize();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@ -1254,7 +1254,7 @@ IMPL_LINK( Dialog, ImplHandleLayoutTimerHdl, void*, EMPTYARG )
return 0;
}
void Dialog::queue_layout()
void Dialog::queue_resize()
{
if (hasPendingLayout() || isCalculatingInitialLayoutSize())
return;
@ -1267,7 +1267,7 @@ void Dialog::queue_layout()
void Dialog::Resize()
{
queue_layout();
queue_resize();
}
bool Dialog::set_property(const OString &rKey, const OString &rValue)

View File

@ -156,6 +156,12 @@ void VclContainer::SetSizePixel(const Size& rAllocation)
}
}
void VclContainer::queue_resize()
{
markLayoutDirty();
Window::queue_resize();
}
void VclBox::accumulateMaxes(const Size &rChildSize, Size &rSize) const
{
long nSecondaryChildDimension = getSecondaryDimension(rChildSize);

View File

@ -1732,34 +1732,20 @@ namespace
{
bool bSomeoneCares = false;
Dialog *pDialog = NULL;
Window *pWindow = pOrigWindow;
while (pWindow)
Window *pWindow = pOrigWindow->GetParent();
if (pWindow)
{
if (isContainerWindow(*pWindow))
{
VclContainer *pContainer = static_cast<VclContainer*>(pWindow);
pContainer->markLayoutDirty();
bSomeoneCares = true;
}
else if (pWindow->GetType() == WINDOW_TABCONTROL)
{
TabControl *pTabControl = static_cast<TabControl*>(pWindow);
pTabControl->markLayoutDirty();
bSomeoneCares = true;
}
else if (pWindow->IsDialog())
{
pDialog = dynamic_cast<Dialog*>(pWindow);
break;
}
pWindow = pWindow->GetParent();
pWindow->queue_resize();
}
if (pDialog && pDialog != pOrigWindow)
pDialog->queue_layout();
return bSomeoneCares;
}
}