[Libreoffice-commits] core.git: 2 commits - comphelper/inc comphelper/source include/vcl vcl/source
Caolán McNamara
caolanm at redhat.com
Sat Aug 30 11:35:41 PDT 2014
comphelper/inc/pch/precompiled_comphelper.hxx | 1
comphelper/source/misc/officeresourcebundle.cxx | 4
include/vcl/dialog.hxx | 22 ---
include/vcl/syswin.hxx | 49 +++++--
vcl/source/window/builder.cxx | 4
vcl/source/window/dialog.cxx | 151 +++--------------------
vcl/source/window/paint.cxx | 2
vcl/source/window/syswin.cxx | 155 +++++++++++++++++++++++-
8 files changed, 216 insertions(+), 172 deletions(-)
New commits:
commit 2602a41f766625e03b961ed2293fd1f2fe851a05
Author: Caolán McNamara <caolanm at redhat.com>
Date: Sat Aug 30 18:15:59 2014 +0100
coverity#706466 Uncaught exception
and
coverity#706463 Uncaught exception
Change-Id: I77cb09054f00d86cd3e206e44ef4942ddf148a7f
diff --git a/comphelper/inc/pch/precompiled_comphelper.hxx b/comphelper/inc/pch/precompiled_comphelper.hxx
index 36ec107..5acedfd 100644
--- a/comphelper/inc/pch/precompiled_comphelper.hxx
+++ b/comphelper/inc/pch/precompiled_comphelper.hxx
@@ -111,7 +111,6 @@
#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <com/sun/star/lang/Locale.hpp>
#include <com/sun/star/lang/NotInitializedException.hpp>
-#include <com/sun/star/lang/NullPointerException.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/lang/XLocalizable.hpp>
diff --git a/comphelper/source/misc/officeresourcebundle.cxx b/comphelper/source/misc/officeresourcebundle.cxx
index 3fe6b8d..5d9032a 100644
--- a/comphelper/source/misc/officeresourcebundle.cxx
+++ b/comphelper/source/misc/officeresourcebundle.cxx
@@ -21,7 +21,6 @@
#include <com/sun/star/resource/XResourceBundle.hpp>
#include <com/sun/star/resource/XResourceBundleLoader.hpp>
-#include <com/sun/star/lang/NullPointerException.hpp>
#include <osl/mutex.hxx>
#include <osl/diagnose.h>
#include <rtl/ustrbuf.hxx>
@@ -36,7 +35,6 @@ namespace comphelper
using com::sun::star::resource::XResourceBundleLoader;
using com::sun::star::resource::MissingResourceException;
using ::com::sun::star::uno::XComponentContext;
- using ::com::sun::star::lang::NullPointerException;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::Any;
@@ -191,8 +189,6 @@ namespace comphelper
OfficeResourceBundle::OfficeResourceBundle( const Reference< XComponentContext >& _context, const sal_Char* _bundleBaseAsciiName )
:m_pImpl( new ResourceBundle_Impl( _context, OUString::createFromAscii( _bundleBaseAsciiName ) ) )
{
- if ( !_context.is() )
- throw NullPointerException();
}
commit e8fb86134c6f6052ab6748698039760827fbcd37
Author: Caolán McNamara <caolanm at redhat.com>
Date: Sat Aug 30 16:58:59 2014 +0100
move layout from dialog to systemwindow
*distant sounds of hammering in basement*
so we can get Floating Windows layout aware
as well without duplicate of dialog layout logic
Change-Id: I063375f2f7d4e5c3bfbfedf55649078d4dbe4139
diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx
index 361c860..94ea7d6 100644
--- a/include/vcl/dialog.hxx
+++ b/include/vcl/dialog.hxx
@@ -22,7 +22,6 @@
#include <tools/solar.h>
#include <vcl/dllapi.h>
-#include <vcl/builder.hxx>
#include <vcl/syswin.hxx>
#include <vcl/timer.hxx>
@@ -36,11 +35,8 @@
struct DialogImpl;
class VclBox;
class VclButtonBox;
-class VclContainer;
-class VCL_DLLPUBLIC Dialog
- : public SystemWindow
- , public VclBuilderContainer
+class VCL_DLLPUBLIC Dialog : public SystemWindow
{
private:
Window* mpDialogParent;
@@ -52,8 +48,7 @@ private:
bool mbInClose;
bool mbModalMode;
bool mbIsDefferedInit;
- bool mbIsCalculatingInitialLayoutSize;
- Timer maLayoutTimer;
+
VclButtonBox* mpActionArea;
VclBox* mpContentArea;
@@ -65,16 +60,13 @@ private:
SAL_DLLPRIVATE Dialog & operator= (const Dialog &);
DECL_DLLPRIVATE_LINK( ImplAsyncCloseHdl, void* );
- DECL_DLLPRIVATE_LINK( ImplHandleLayoutTimerHdl, void* );
protected:
using Window::ImplInit;
SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle );
- SAL_DLLPRIVATE void setPosSizeOnContainee(Size aSize, VclContainer &rBox);
public:
SAL_DLLPRIVATE bool IsInClose() const { return mbInClose; }
- SAL_DLLPRIVATE bool hasPendingLayout() const { return maLayoutTimer.IsActive(); }
SAL_DLLPRIVATE void doDeferredInit(bool bResizable);
SAL_DLLPRIVATE bool isDeferredInit() const { return mbIsDefferedInit; }
@@ -82,6 +74,7 @@ protected:
explicit Dialog( WindowType nType );
explicit Dialog( Window* pParent, const OString& rID, const OUString& rUIXMLDescription, WindowType nType );
virtual void Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) SAL_OVERRIDE;
+ virtual void settingOptimalLayoutSize(VclBox *pBox) SAL_OVERRIDE;
protected:
friend class VclBuilder;
@@ -97,11 +90,6 @@ public:
virtual void StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
- virtual Size GetOptimalSize() const SAL_OVERRIDE;
- virtual void Resize() SAL_OVERRIDE;
- bool isLayoutEnabled() const;
- void setOptimalLayoutSize();
- bool isCalculatingInitialLayoutSize() const { return mbIsCalculatingInitialLayoutSize; }
virtual void queue_resize(StateChangedType eReason = STATE_CHANGE_LAYOUT) SAL_OVERRIDE;
virtual bool set_property(const OString &rKey, const OString &rValue) SAL_OVERRIDE;
VclButtonBox* get_action_area() { return mpActionArea;}
@@ -112,10 +100,6 @@ public:
virtual short Execute();
bool IsInExecute() const { return mbInExecute; }
- virtual void SetText( const OUString& rStr ) SAL_OVERRIDE;
- virtual OUString GetText() const SAL_OVERRIDE;
-
-
// Dialog::Execute replacement API
public:
// Link impl: DECL_LINK( MyEndDialogHdl, Dialog* ); <= param is dialog just ended
diff --git a/include/vcl/syswin.hxx b/include/vcl/syswin.hxx
index 871c52d..033018b 100644
--- a/include/vcl/syswin.hxx
+++ b/include/vcl/syswin.hxx
@@ -22,16 +22,16 @@
#include <tools/solar.h>
#include <vcl/dllapi.h>
+#include <vcl/builder.hxx>
#include <vcl/window.hxx>
class ModalDialog;
class MenuBar;
class TaskPaneList;
-
+class VclContainer;
+class VclBox;
// - Icon-Types -
-
-
#define ICON_LO_DEFAULT 1
#define ICON_TEXT_DOCUMENT 2
#define ICON_TEXT_TEMPLATE 3
@@ -128,12 +128,10 @@ public:
#define TITLE_BUTTON_HIDE ((sal_uInt16)2)
#define TITLE_BUTTON_MENU ((sal_uInt16)4)
-
// - SystemWindow -
-
-
-
-class VCL_DLLPUBLIC SystemWindow : public Window
+class VCL_DLLPUBLIC SystemWindow
+ : public Window
+ , public VclBuilderContainer
{
friend class WorkWindow;
class ImplData;
@@ -149,23 +147,34 @@ private:
bool mbDockBtn;
bool mbHideBtn;
bool mbSysChild;
- sal_uInt16 mnMenuBarMode;
- sal_uInt16 mnIcon;
+ bool mbIsDefferedInit;
+ bool mbIsCalculatingInitialLayoutSize;
+ bool mbInitialLayoutDone;
+ sal_uInt16 mnMenuBarMode;
+ sal_uInt16 mnIcon;
ImplData* mpImplData;
+ Timer maLayoutTimer;
public:
using Window::ImplIsInTaskPaneList;
SAL_DLLPRIVATE bool ImplIsInTaskPaneList( Window* pWin );
private:
+ SAL_DLLPRIVATE void Init();
SAL_DLLPRIVATE void ImplMoveToScreen( long& io_rX, long& io_rY, long i_nWidth, long i_nHeight, Window* i_pConfigureWin );
+ SAL_DLLPRIVATE void setPosSizeOnContainee(Size aSize, VclContainer &rBox);
+ DECL_DLLPRIVATE_LINK( ImplHandleLayoutTimerHdl, void* );
protected:
// Single argument ctors shall be explicit.
- explicit SystemWindow( WindowType nType );
+ explicit SystemWindow(WindowType nType);
+ explicit SystemWindow(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, WindowType nType);
+
+ void SetWindowStateData( const WindowStateData& rData );
- void SetWindowStateData( const WindowStateData& rData );
+ virtual void settingOptimalLayoutSize(VclBox *pBox);
+ SAL_DLLPRIVATE void DoInitialLayout();
public:
virtual ~SystemWindow();
virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
@@ -176,6 +185,13 @@ public:
virtual void Pin();
virtual void Roll();
virtual void Resizing( Size& rSize );
+ virtual void Resize() SAL_OVERRIDE;
+ virtual Size GetOptimalSize() const SAL_OVERRIDE;
+ virtual void StateChanged(StateChangedType nStateChange) SAL_OVERRIDE;
+ virtual void queue_resize(StateChangedType eReason = STATE_CHANGE_LAYOUT) SAL_OVERRIDE;
+ bool isLayoutEnabled() const;
+ void setOptimalLayoutSize();
+ bool isCalculatingInitialLayoutSize() const { return mbIsCalculatingInitialLayoutSize; }
void SetIcon( sal_uInt16 nIcon );
sal_uInt16 GetIcon() const { return mnIcon; }
@@ -205,16 +221,19 @@ public:
const Size& GetMaxOutputSizePixel() const;
void SetWindowState(const OString& rStr);
- OString GetWindowState(sal_uLong nMask = WINDOWSTATE_MASK_ALL) const;
+ OString GetWindowState(sal_uLong nMask = WINDOWSTATE_MASK_ALL) const;
void SetMenuBar( MenuBar* pMenuBar );
MenuBar* GetMenuBar() const { return mpMenuBar; }
void SetMenuBarMode( sal_uInt16 nMode );
- sal_uInt16 GetMenuBarMode() const { return mnMenuBarMode; }
+ sal_uInt16 GetMenuBarMode() const { return mnMenuBarMode; }
TaskPaneList* GetTaskPaneList();
void GetWindowStateData( WindowStateData& rData ) const;
+ virtual void SetText( const OUString& rStr ) SAL_OVERRIDE;
+ virtual OUString GetText() const SAL_OVERRIDE;
+
/**
Returns the screen number the window is on
@@ -253,6 +272,8 @@ public:
void SetCloseHdl(const Link& rLink);
const Link& GetCloseHdl() const;
+
+ SAL_DLLPRIVATE bool hasPendingLayout() const { return maLayoutTimer.IsActive(); }
};
#endif // INCLUDED_VCL_SYSWIN_HXX
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 65cf06c..636e227 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -176,7 +176,7 @@ VclBuilder::VclBuilder(Window *pParent, const OUString& sUIDir, const OUString&
, m_pParserState(new ParserState)
, m_xFrame(rFrame)
{
- m_bToplevelHasDeferredInit = pParent && pParent->IsDialog() && ((Dialog*)pParent)->isDeferredInit();
+ m_bToplevelHasDeferredInit = pParent && pParent->IsDialog() && static_cast<Dialog*>(pParent)->isDeferredInit();
m_bToplevelHasDeferredProperties = m_bToplevelHasDeferredInit;
sal_Int32 nIdx = m_sHelpRoot.lastIndexOf('.');
@@ -1663,7 +1663,7 @@ Window *VclBuilder::insertObject(Window *pParent, const OString &rClass,
//toplevels default to resizable
if (pCurrentChild->IsDialog())
{
- Dialog *pDialog = (Dialog*)pCurrentChild;
+ Dialog *pDialog = static_cast<Dialog*>(pCurrentChild);
pDialog->doDeferredInit(extractResizable(rProps));
m_bToplevelHasDeferredInit = false;
}
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index f8afa9f..1fa6f40 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -347,13 +347,8 @@ void Dialog::ImplInitDialogData()
mbModalMode = false;
mpContentArea = NULL;
mpActionArea = NULL;
- mbIsCalculatingInitialLayoutSize = false;
mnMousePositioned = 0;
mpDialogImpl = new DialogImpl;
-
- //To-Do, reuse maResizeTimer
- maLayoutTimer.SetTimeout(50);
- maLayoutTimer.SetTimeoutHdl( LINK( this, Dialog, ImplHandleLayoutTimerHdl ) );
}
void Dialog::ImplInit( Window* pParent, WinBits nStyle )
@@ -531,9 +526,24 @@ void Dialog::set_content_area(VclBox* pContentArea)
mpContentArea = pContentArea;
}
+void Dialog::settingOptimalLayoutSize(VclBox *pBox)
+{
+ const DialogStyle& rDialogStyle =
+ GetSettings().GetStyleSettings().GetDialogStyle();
+ pBox->set_border_width(rDialogStyle.content_area_border);
+ pBox->set_spacing(pBox->get_spacing() +
+ rDialogStyle.content_area_spacing);
+
+ VclButtonBox *pActionArea = getActionArea(this);
+ if (pActionArea)
+ {
+ pActionArea->set_border_width(rDialogStyle.action_area_border);
+ pActionArea->set_spacing(rDialogStyle.button_spacing);
+ }
+}
+
Dialog::~Dialog()
{
- maLayoutTimer.Stop();
delete mpDialogImpl;
mpDialogImpl = NULL;
}
@@ -614,54 +624,14 @@ Size bestmaxFrameSizeForScreenSize(const Size &rScreenSize)
return Size(w, h);
}
-void Dialog::setOptimalLayoutSize()
-{
- maLayoutTimer.Stop();
-
- //resize dialog to fit requisition on initial show
- VclBox *pBox = static_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD));
-
- const DialogStyle& rDialogStyle =
- GetSettings().GetStyleSettings().GetDialogStyle();
- pBox->set_border_width(rDialogStyle.content_area_border);
- pBox->set_spacing(pBox->get_spacing() +
- rDialogStyle.content_area_spacing);
-
- VclButtonBox *pActionArea = getActionArea(this);
- if (pActionArea)
- {
- pActionArea->set_border_width(rDialogStyle.action_area_border);
- pActionArea->set_spacing(rDialogStyle.button_spacing);
- }
-
- Size aSize = get_preferred_size();
-
- Size aMax(bestmaxFrameSizeForScreenSize(GetDesktopRectPixel().GetSize()));
-
- aSize.Width() = std::min(aMax.Width(), aSize.Width());
- aSize.Height() = std::min(aMax.Height(), aSize.Height());
-
- SetMinOutputSizePixel(aSize);
- SetSizePixel(aSize);
- setPosSizeOnContainee(aSize, *pBox);
-}
-
void Dialog::StateChanged( StateChangedType nType )
{
- SystemWindow::StateChanged( nType );
-
- if ( nType == STATE_CHANGE_INITSHOW )
+ if (nType == STATE_CHANGE_INITSHOW)
{
if ( GetSettings().GetStyleSettings().GetAutoMnemonic() )
ImplWindowAutoMnemonic( this );
- if (isLayoutEnabled())
- {
- mbIsCalculatingInitialLayoutSize = true;
- setDeferredProperties();
- setOptimalLayoutSize();
- mbIsCalculatingInitialLayoutSize = false;
- }
+ DoInitialLayout();
if ( !HasChildPathFocus() || HasFocus() )
GrabFocusToFirstControl();
@@ -676,7 +646,10 @@ void Dialog::StateChanged( StateChangedType nType )
ImplMouseAutoPos( this );
}
- else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
+
+ SystemWindow::StateChanged( nType );
+
+ if (nType == STATE_CHANGE_CONTROLBACKGROUND)
{
ImplInitSettings();
Invalidate();
@@ -1166,75 +1139,11 @@ void Dialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal
pDev->Pop();
}
-bool Dialog::isLayoutEnabled() const
-{
- //pre dtor called, and single child is a container => we're layout enabled
- return mpDialogImpl && ::isLayoutEnabled(this);
-}
-
-Size Dialog::GetOptimalSize() const
-{
- if (!isLayoutEnabled())
- return SystemWindow::GetOptimalSize();
-
- Size aSize = VclContainer::getLayoutRequisition(*GetWindow(WINDOW_FIRSTCHILD));
-
- sal_Int32 nBorderWidth = get_border_width();
-
- aSize.Height() += mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
- + 2*nBorderWidth;
- aSize.Width() += mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
- + 2*nBorderWidth;
-
- return Window::CalcWindowSize(aSize);
-}
-
-void Dialog::setPosSizeOnContainee(Size aSize, VclContainer &rBox)
-{
- sal_Int32 nBorderWidth = get_border_width();
-
- aSize.Width() -= mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
- + 2 * nBorderWidth;
- aSize.Height() -= mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
- + 2 * nBorderWidth;
-
- Point aPos(mpWindowImpl->mnLeftBorder + nBorderWidth,
- mpWindowImpl->mnTopBorder + nBorderWidth);
-
- VclContainer::setLayoutAllocation(rBox, aPos, aSize);
-}
-
-IMPL_LINK( Dialog, ImplHandleLayoutTimerHdl, void*, EMPTYARG )
+void Dialog::queue_resize(StateChangedType eReason)
{
- if (!isLayoutEnabled())
- {
- SAL_WARN("vcl.layout", "Dialog has become non-layout because extra children have been added directly to it.");
- return 0;
- }
-
- VclBox *pBox = static_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD));
- assert(pBox);
- setPosSizeOnContainee(GetSizePixel(), *pBox);
- return 0;
-}
-
-void Dialog::queue_resize(StateChangedType /*eReason*/)
-{
- if (hasPendingLayout() || isCalculatingInitialLayoutSize())
- return;
if (IsInClose())
return;
- if (!isLayoutEnabled())
- return;
- WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
- pWindowImpl->mnOptimalWidthCache = -1;
- pWindowImpl->mnOptimalHeightCache = -1;
- maLayoutTimer.Start();
-}
-
-void Dialog::Resize()
-{
- queue_resize();
+ SystemWindow::queue_resize(eReason);
}
bool Dialog::set_property(const OString &rKey, const OString &rValue)
@@ -1246,18 +1155,6 @@ bool Dialog::set_property(const OString &rKey, const OString &rValue)
return true;
}
-void Dialog::SetText(const OUString& rStr)
-{
- setDeferredProperties();
- SystemWindow::SetText(rStr);
-}
-
-OUString Dialog::GetText() const
-{
- const_cast<Dialog*>(this)->setDeferredProperties();
- return SystemWindow::GetText();
-}
-
VclBuilderContainer::VclBuilderContainer()
: m_pUIBuilder(NULL)
{
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 18fab8a..9255cc6 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -284,7 +284,7 @@ void Window::ImplPostPaint()
IMPL_LINK_NOARG(Window, ImplHandlePaintHdl)
{
// save paint events until layout is done
- if (!ImplDoTiledRendering() && IsDialog() && static_cast<const Dialog*>(this)->hasPendingLayout())
+ if (!ImplDoTiledRendering() && IsSystemWindow() && static_cast<const SystemWindow*>(this)->hasPendingLayout())
{
mpWindowImpl->mpFrameData->maPaintTimer.Start();
return 0;
diff --git a/vcl/source/window/syswin.cxx b/vcl/source/window/syswin.cxx
index c4077a1..a3e6ef7 100644
--- a/vcl/source/window/syswin.cxx
+++ b/vcl/source/window/syswin.cxx
@@ -23,6 +23,7 @@
#include <tools/debug.hxx>
+#include <vcl/layout.hxx>
#include <vcl/svapp.hxx>
#include <vcl/menu.hxx>
#include <vcl/event.hxx>
@@ -60,12 +61,10 @@ SystemWindow::ImplData::ImplData()
SystemWindow::ImplData::~ImplData()
{
- if( mpTaskPaneList )
- delete mpTaskPaneList;
+ delete mpTaskPaneList;
}
-SystemWindow::SystemWindow( WindowType nType ) :
- Window( nType )
+void SystemWindow::Init()
{
mpImplData = new ImplData;
mpWindowImpl->mbSysWin = true;
@@ -78,12 +77,32 @@ SystemWindow::SystemWindow( WindowType nType ) :
mbDockBtn = false;
mbHideBtn = false;
mbSysChild = false;
+ mbIsCalculatingInitialLayoutSize = false;
+ mbInitialLayoutDone = false;
mnMenuBarMode = MENUBAR_MODE_NORMAL;
mnIcon = 0;
+
+ //To-Do, reuse maResizeTimer
+ maLayoutTimer.SetTimeout(50);
+ maLayoutTimer.SetTimeoutHdl( LINK( this, SystemWindow, ImplHandleLayoutTimerHdl ) );
+}
+
+SystemWindow::SystemWindow(WindowType nType)
+ : Window(nType)
+{
+ Init();
+}
+
+SystemWindow::SystemWindow(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, WindowType nType)
+ : Window(pParent, nType)
+{
+ Init();
+ m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID);
}
SystemWindow::~SystemWindow()
{
+ maLayoutTimer.Stop();
delete mpImplData;
mpImplData = NULL;
}
@@ -965,4 +984,132 @@ const Link& SystemWindow::GetCloseHdl() const
return mpImplData->maCloseHdl;
}
+void SystemWindow::queue_resize(StateChangedType /*eReason*/)
+{
+ if (hasPendingLayout() || isCalculatingInitialLayoutSize())
+ return;
+ if (!isLayoutEnabled())
+ return;
+ WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
+ pWindowImpl->mnOptimalWidthCache = -1;
+ pWindowImpl->mnOptimalHeightCache = -1;
+ maLayoutTimer.Start();
+}
+
+void SystemWindow::Resize()
+{
+ queue_resize();
+}
+
+bool SystemWindow::isLayoutEnabled() const
+{
+ //pre dtor called, and single child is a container => we're layout enabled
+ return mpImplData && ::isLayoutEnabled(this);
+}
+
+Size SystemWindow::GetOptimalSize() const
+{
+ if (!isLayoutEnabled())
+ return Window::GetOptimalSize();
+
+ Size aSize = VclContainer::getLayoutRequisition(*GetWindow(WINDOW_FIRSTCHILD));
+
+ sal_Int32 nBorderWidth = get_border_width();
+
+ aSize.Height() += mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
+ + 2*nBorderWidth;
+ aSize.Width() += mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
+ + 2*nBorderWidth;
+
+ return Window::CalcWindowSize(aSize);
+}
+
+void SystemWindow::setPosSizeOnContainee(Size aSize, VclContainer &rBox)
+{
+ sal_Int32 nBorderWidth = get_border_width();
+
+ aSize.Width() -= mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
+ + 2 * nBorderWidth;
+ aSize.Height() -= mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
+ + 2 * nBorderWidth;
+
+ Point aPos(mpWindowImpl->mnLeftBorder + nBorderWidth,
+ mpWindowImpl->mnTopBorder + nBorderWidth);
+
+ VclContainer::setLayoutAllocation(rBox, aPos, aSize);
+}
+
+IMPL_LINK( SystemWindow, ImplHandleLayoutTimerHdl, void*, EMPTYARG )
+{
+ if (!isLayoutEnabled())
+ {
+ SAL_WARN("vcl.layout", "SystemWindow has become non-layout because extra children have been added directly to it.");
+ return 0;
+ }
+
+ VclBox *pBox = static_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD));
+ assert(pBox);
+ setPosSizeOnContainee(GetSizePixel(), *pBox);
+ return 0;
+}
+
+void SystemWindow::SetText(const OUString& rStr)
+{
+ setDeferredProperties();
+ Window::SetText(rStr);
+}
+
+OUString SystemWindow::GetText() const
+{
+ const_cast<SystemWindow*>(this)->setDeferredProperties();
+ return Window::GetText();
+}
+
+void SystemWindow::settingOptimalLayoutSize(VclBox* /*pBox*/)
+{
+}
+
+void SystemWindow::setOptimalLayoutSize()
+{
+ maLayoutTimer.Stop();
+
+ //resize SystemWindow to fit requisition on initial show
+ VclBox *pBox = static_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD));
+
+ settingOptimalLayoutSize(pBox);
+
+ Size aSize = get_preferred_size();
+
+ Size aMax(bestmaxFrameSizeForScreenSize(GetDesktopRectPixel().GetSize()));
+
+ aSize.Width() = std::min(aMax.Width(), aSize.Width());
+ aSize.Height() = std::min(aMax.Height(), aSize.Height());
+
+ SetMinOutputSizePixel(aSize);
+ SetSizePixel(aSize);
+ setPosSizeOnContainee(aSize, *pBox);
+}
+
+void SystemWindow::DoInitialLayout()
+{
+ if (isLayoutEnabled())
+ {
+ mbIsCalculatingInitialLayoutSize = true;
+ setDeferredProperties();
+ setOptimalLayoutSize();
+ mbIsCalculatingInitialLayoutSize = false;
+ mbInitialLayoutDone = true;
+ }
+}
+
+void SystemWindow::StateChanged( StateChangedType nType )
+{
+ Window::StateChanged(nType);
+
+ if (nType == STATE_CHANGE_INITSHOW && !mbInitialLayoutDone)
+ {
+ DoInitialLayout();
+ }
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list