[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