diff options
Diffstat (limited to 'vcl')
156 files changed, 2898 insertions, 1807 deletions
diff --git a/vcl/CppunitTest_vcl_lifecycle.mk b/vcl/CppunitTest_vcl_lifecycle.mk new file mode 100644 index 000000000000..54d4affc1ce0 --- /dev/null +++ b/vcl/CppunitTest_vcl_lifecycle.mk @@ -0,0 +1,52 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,vcl_lifecycle)) + +$(eval $(call gb_CppunitTest_set_include,vcl_lifecycle,\ + $$(INCLUDE) \ + -I$(SRCDIR)/vcl/inc \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,vcl_lifecycle, \ + vcl/qa/cppunit/lifecycle \ +)) + +$(eval $(call gb_CppunitTest_use_externals,vcl_lifecycle,boost_headers)) + +$(eval $(call gb_CppunitTest_use_libraries,vcl_lifecycle, \ + comphelper \ + cppu \ + cppuhelper \ + sal \ + svt \ + test \ + tl \ + unotest \ + vcl \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_api,vcl_lifecycle,\ + udkapi \ + offapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,vcl_lifecycle)) +$(eval $(call gb_CppunitTest_use_vcl,vcl_lifecycle)) + +$(eval $(call gb_CppunitTest_use_components,vcl_lifecycle,\ + configmgr/source/configmgr \ + i18npool/util/i18npool \ + ucb/source/core/ucb1 \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,vcl_lifecycle)) + +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index f5be45ec10c8..8cb05ba73bd8 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -103,6 +103,7 @@ $(eval $(call gb_Module_add_check_targets,vcl,\ CppunitTest_vcl_fontcharmap \ CppunitTest_vcl_complextext \ CppunitTest_vcl_filters_test \ + CppunitTest_vcl_lifecycle \ CppunitTest_vcl_outdev \ CppunitTest_vcl_app_test \ CppunitTest_vcl_wmf_test \ diff --git a/vcl/README.lifecycle b/vcl/README.lifecycle new file mode 100644 index 000000000000..c4ca67a19944 --- /dev/null +++ b/vcl/README.lifecycle @@ -0,0 +1,261 @@ +** Understanding transitional VCL lifecycle ** + +---------- How it used to look ---------- + + All VCL classes were explicitly lifecycle managed; so you would +do: + Dialog aDialog(...); // old - on stack allocation + aDialog.Execute(...); +or: + Dialog *pDialog = new Dialog(...); // old - manual heap allocation + pDialog->Execute(...); + delete pDialog; +or: + boost::shared_ptr<Dialog> xDialog(new pDialog()); // old + xDialog->Execute(...); + // depending who shared the ptr this would be freed sometime + + In several cases this lead to rather unpleasant code, when +various shared_ptr wrappers were used, the lifecycle was far less than +obvious. Where controls were wrapped by other ref-counted classes - +such as UNO interfaces, which were also used by native Window +pointers, the lifecycle became extremely opaque. In addition VCL had +significant issues with re-enterancy and event emission - adding +various means such as DogTags to try to detect destruction of a window +between calls: + + ImplDelData aDogTag( this ); // 'orrible old code + Show( true, SHOW_NOACTIVATE ); + if( !aDogTag.IsDead() ) // did 'this' go invalid yet ? + Update(); + + Unfortunately use of such protection is/was ad-hoc, and far +from uniform, despite the prevelance of such potential problems. + + When a lifecycle problem was hit, typically it would take the +form of accessing memory that had been freed, and contained garbage due +to lingering pointers to freed objects. + + +---------- Where we are now: ---------- + + To fix this situation we now have a VclPtr - which is a smart + reference-counting pointer (include/vcl/vclptr.hxx) which is + designed to look and behave -very- much like a normal pointer + to reduce code-thrash. VclPtr is used to wrap all OutputDevice + derived classes thus: + + VclPtr<Dialog> pDialog( new Dialog( ... ), SAL_NO_ACQUIRE ); + ... + pDialog.disposeAndClear(); + + However - while the VclPtr reference count controls the + lifecycle of the Dialog object, it is necessary to be able to + break reference count cycles. These are extremely common in + widget hierarchies as each widget holds (smart) pointers to + its parents and also its children. + + Thus - all previous 'delete' calls are replaced with 'dispose' + method calls: + +** What is dispose ? + + Dispose is defined to be a method that releases all references + that an object holds - thus allowing their underlying + resources to be released. However - in this specific case it + also releases all backing graphical resources. In practical + terms, all destructor functionality has been moved into + 'dispose' methods, in order to provide a minimal initial + behavioral change. + + As such a VclPtr can have three states: + + VclPtr<PushButton> pButton; + ... + assert (pButton == nullptr || !pButton); // null + assert (pButton && !pButton->IsDisposed()); // alive + assert (pButton && pButton->IsDisposed()); // disposed + +** ScopedVclPtr - making disposes easier + + While replacing existing code with new, it can be a bit + tiresome to have to manually add 'disposeAndClear()' + calls to VclPtr<> instances. + + Luckily it is easy to avoid that with a ScopedVclPtr which + does this for you when it goes out of scope. + +** One extra gotcha - an initial reference-count of 1 + + In the normal world of love and sanity, eg. creating UNO + objects, the objects start with a ref-count of zero. Thus + the first reference is always taken after construction by + the surrounding smart pointer. + + Unfortunately, the existing VCL code is somewhat tortured, + and does a lot of reference and de-reference action on the + class -during- construction. This forces us to construct with + a reference of 1 - and to hand that into the initial smart + pointer with a SAL_NO_ACQUIRE. + + To make this easier, we have 'Instance' template wrappers + that make this apparently easier, by constructing the + pointer for you. + +** How does my familiar code change ? + + Lets tweak the exemplary code above to fit the new model: + +- Dialog aDialog(... dialog params ... ); +- aDialog.Execute(...); ++ ScopedVclPtrInstance<Dialog> pDialog(... dialog params ... ); ++ pDialog->Execute(...); // VclPtr behaves much like a pointer + +or: +- Dialog *pDialog = new Dialog(... dialog params ...); ++ VclPtrInstance<Dialog> pDialog(... dialog params ...); + pDialog->Execute(...); +- delete pDialog; ++ pDialog.disposeAndClear(); // done manually - replaces a delete +or: +- boost::shared_ptr<Dialog> xDialog(new Dialog(...)); ++ ScopedVclPtrInstance<Dialog> xDialog(...); + xDialog->Execute(...); ++ // depending how shared_ptr was shared perhaps ++ // someone else gets a VclPtr to xDialog +or: +- VirtualDevice aDev; ++ ScopedVclPtrInstance<VirtualDevice> pDev; + + Other things that are changed are these: + +- pButton = new PushButton(NULL); ++ pButton = VclPtr<PushButton>::Create(nullptr); +... +- vcl::Window *pWindow = new PushButton(NULL); ++ VclPtr<vcl::Window> pWindow; ++ pWindow.reset(VclPtr<PushButton>::Create(nullptr)); + +** Why are these 'disposeOnce' calls in destructors ? + + This is an interim measure while we are migrating, such that + it is possible to delete an object conventionally and ensure + that its dispose method gets called. In the 'end' we would + instead assert that a Window has been disposed in it's + destructor, and elide these calls. + + As the object's vtable is altered as we go down the + destruction process, and we want to call the correct dispose + methods we need this disposeOnce(); call for the interim in + every destructor. This is enforced by a clang plugin. + + The plus side of disposeOnce is that the mechanics behind it + ensure that a dispose() method is only called a single time, + simplifying their implementation. + + +---------- Who owns & disposes what ? ---------- + +** referencing / ownership inheritance / hierarchy. + +** VclBuilder + + and it's magic dispose method. + + +---------- What remains to be done ? ---------- + + * Cleanup DogTags and LazyDelete. + + * Expand the VclPtr pattern to many other less + than safe VCL types. + + * create factory functions for VclPtr<> types and privatize + their constructors. + + * Pass 'const VclPtr<> &' instead of pointers everywhere + + add 'explicit' keywords to VclPtr constructors to + accelerate compilation etc. + + * Cleanup common existing methods such that they continue to + work post-dispose. + + * Dispose functions should be audited to: + + not leave dangling pointsr + + shrink them - some work should incrementally + migrate back to destructors. + + * VclBuilder + + ideally should keep a reference to pointers assigned + in 'get()' calls - to avoid needing explicit 'clear' + code in destructors. + + * VclBuilder 'makeFoo' methods + + these should return VclPtr<> types and have their + signatures adjusted en-masse. + + currently we use a VclPtr<> constructor with + SAL_NO_ACQUIRE inside the builder. + +---------- FAQ / debugging hints ---------- + +** Compile with dbgutil + + This is by far the best way to turn on debugging and + assertions that help you find problems. In particular + there are a few that are really helpful: + + vcl/source/window/window.cxx (Window::dispose) + "Window ( N4sfx27sidebar20SidebarDockingWindowE (Properties)) + ^^^ class name window title ^^^ + with live children destroyed: N4sfx27sidebar6TabBarE () + N4sfx27sidebar4DeckE () 10FixedImage ()" + + You can de-mangle these names if you can't read them thus: + + $ c++filt -t N4sfx27sidebar20SidebarDockingWindowE + sfx2::sidebar::SidebarDockingWindow + + In the above case - it is clear that the children have not been + disposed before their parents. As an aside, having a dispose chain + separate from destructors allows us to emit real type names for + parents here. + + To fix this, we will need to get the dispose ordering right, + occasionally in the conversion we re-ordered destruction, or + omitted a disposeAndClear() in a ::dispose() method. + + => If you see this, check the order of disposeAndClear() in + the sfx2::Sidebar::SidebarDockingWindow::dispose() method + + => also worth git grepping for 'new sfx::sidebar::TabBar' to + see where those children were added. + +** Check what it used to do + + While a ton of effort has been put into ensuring that the new + lifecycle code is the functional equivalent of the old code, + the code was created by humans. If you identify an area where + something asserts or crashes here are a few helpful heuristics: + + * Read the git log -u -- path/to/file.cxx + + => Is the order of destruction different ? + + in the past many things were destructed (in reverse order of + declaration in the class) without explicit code. Some of these + may be important to do explicitly at the end of the destructor. + + eg. having a 'Idle' or 'Timer' as a member, may now need an + explicit .Stop() and/or protection from running on a + disposed Window in its callback. + + => Is it 'clear' not 'disposeAndClear' ? + + sometimes we get this wrong. If the code previously used to + use 'delete pFoo;' it should now read pFoo->disposeAndClear(); + Conversely if it didn't delete it, it should be 'clear()' it + is by far the best to leave disposing to the VclBuilder where + possible. + + In simple cases, if we allocate the widget with VclPtrInstance + or VclPtr<Foo>::Create - then we need to disposeAndClear it too. + diff --git a/vcl/generic/print/genprnpsp.cxx b/vcl/generic/print/genprnpsp.cxx index 71f35eb2d3e0..05dfc4003351 100644 --- a/vcl/generic/print/genprnpsp.cxx +++ b/vcl/generic/print/genprnpsp.cxx @@ -91,16 +91,24 @@ namespace class QueryString : public ModalDialog { private: - OKButton* m_pOKButton; - FixedText* m_pFixedText; - Edit* m_pEdit; - OUString& m_rReturnValue; + VclPtr<OKButton> m_pOKButton; + VclPtr<FixedText> m_pFixedText; + VclPtr<Edit> m_pEdit; + OUString& m_rReturnValue; DECL_LINK( ClickBtnHdl, Button* ); public: // parent window, Query text, initial value QueryString(vcl::Window*, OUString &, OUString &); + virtual ~QueryString() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE + { + m_pOKButton.clear(); + m_pFixedText.clear(); + m_pEdit.clear(); + ModalDialog::dispose(); + } }; /* @@ -136,8 +144,8 @@ namespace int QueryFaxNumber(OUString& rNumber) { OUString aTmpString(VclResId(SV_PRINT_QUERYFAXNUMBER_TXT)); - QueryString aQuery(NULL, aTmpString, rNumber); - return aQuery.Execute(); + ScopedVclPtrInstance< QueryString > aQuery( nullptr, aTmpString, rNumber ); + return aQuery->Execute(); } } @@ -1071,7 +1079,7 @@ bool PspSalPrinter::StartJob( const OUString* i_pFileName, const OUString& i_rJo std::shared_ptr<vcl::PDFWriter> xWriter; std::vector< PDFPrintFile > aPDFFiles; - std::shared_ptr<Printer> xPrinter(i_rController.getPrinter()); + VclPtr<Printer> xPrinter( i_rController.getPrinter() ); int nAllPages = i_rController.getFilteredPageCount(); i_rController.createProgressDialog(); bool bAborted = false; diff --git a/vcl/generic/print/prtsetup.cxx b/vcl/generic/print/prtsetup.cxx index cbe60c35f3f5..738d00de721a 100644 --- a/vcl/generic/print/prtsetup.cxx +++ b/vcl/generic/print/prtsetup.cxx @@ -93,8 +93,17 @@ RTSDialog::RTSDialog(const PrinterInfo& rJobData, vcl::Window* pParent) RTSDialog::~RTSDialog() { - delete m_pPaperPage; - delete m_pDevicePage; + disposeOnce(); +} + +void RTSDialog::dispose() +{ + m_pTabControl.clear(); + m_pOKButton.clear(); + m_pCancelButton.clear(); + m_pPaperPage.disposeAndClear(); + m_pDevicePage.disposeAndClear(); + TabDialog::dispose(); } IMPL_LINK( RTSDialog, ActivatePage, TabControl*, pTabCtrl ) @@ -108,9 +117,9 @@ IMPL_LINK( RTSDialog, ActivatePage, TabControl*, pTabCtrl ) { TabPage *pPage = NULL; if (sPage == "paper") - pPage = m_pPaperPage = new RTSPaperPage( this ); + pPage = m_pPaperPage = VclPtr<RTSPaperPage>::Create( this ); else if (sPage == "device") - pPage = m_pDevicePage = new RTSDevicePage( this ); + pPage = m_pDevicePage = VclPtr<RTSDevicePage>::Create( this ); if( pPage ) m_pTabControl->SetTabPage( nId, pPage ); } @@ -187,6 +196,20 @@ RTSPaperPage::RTSPaperPage(RTSDialog* pParent) RTSPaperPage::~RTSPaperPage() { + disposeOnce(); +} + +void RTSPaperPage::dispose() +{ + m_pParent.clear(); + m_pPaperText.clear(); + m_pPaperBox.clear(); + m_pOrientBox.clear(); + m_pDuplexText.clear(); + m_pDuplexBox.clear(); + m_pSlotText.clear(); + m_pSlotBox.clear(); + TabPage::dispose(); } void RTSPaperPage::update() @@ -355,6 +378,19 @@ RTSDevicePage::RTSDevicePage( RTSDialog* pParent ) RTSDevicePage::~RTSDevicePage() { + disposeOnce(); +} + +void RTSDevicePage::dispose() +{ + m_pParent.clear(); + m_pPPDKeyBox.clear(); + m_pPPDValueBox.clear(); + m_pCustomEdit.clear(); + m_pLevelBox.clear(); + m_pSpaceBox.clear(); + m_pDepthBox.clear(); + TabPage::dispose(); } sal_uLong RTSDevicePage::getDepth() @@ -466,11 +502,11 @@ void RTSDevicePage::FillValueBox( const PPDKey* pKey ) int SetupPrinterDriver(::psp::PrinterInfo& rJobData) { int nRet = 0; - RTSDialog aDialog( rJobData, NULL ); + ScopedVclPtrInstance< RTSDialog > aDialog( rJobData, nullptr ); - if( aDialog.Execute() ) + if( aDialog->Execute() ) { - rJobData = aDialog.getSetup(); + rJobData = aDialog->getSetup(); nRet = 1; } diff --git a/vcl/generic/print/prtsetup.hxx b/vcl/generic/print/prtsetup.hxx index 6d641bedadf9..67b6cd2216b8 100644 --- a/vcl/generic/print/prtsetup.hxx +++ b/vcl/generic/print/prtsetup.hxx @@ -45,13 +45,13 @@ class RTSDialog : public TabDialog ::psp::PrinterInfo m_aJobData; // controls - TabControl* m_pTabControl; - OKButton* m_pOKButton; - CancelButton* m_pCancelButton; + VclPtr<TabControl> m_pTabControl; + VclPtr<OKButton> m_pOKButton; + VclPtr<CancelButton> m_pCancelButton; // pages - RTSPaperPage* m_pPaperPage; - RTSDevicePage* m_pDevicePage; + VclPtr<RTSPaperPage> m_pPaperPage; + VclPtr<RTSDevicePage> m_pDevicePage; // some resources OUString m_aInvalidString; @@ -64,29 +64,31 @@ class RTSDialog : public TabDialog public: RTSDialog(const ::psp::PrinterInfo& rJobData, vcl::Window* pParent = NULL); virtual ~RTSDialog(); + virtual void dispose() SAL_OVERRIDE; const ::psp::PrinterInfo& getSetup() const { return m_aJobData; } }; class RTSPaperPage : public TabPage { - RTSDialog* m_pParent; + VclPtr<RTSDialog> m_pParent; - FixedText* m_pPaperText; - ListBox* m_pPaperBox; + VclPtr<FixedText> m_pPaperText; + VclPtr<ListBox> m_pPaperBox; - ListBox* m_pOrientBox; + VclPtr<ListBox> m_pOrientBox; - FixedText* m_pDuplexText; - ListBox* m_pDuplexBox; + VclPtr<FixedText> m_pDuplexText; + VclPtr<ListBox> m_pDuplexBox; - FixedText* m_pSlotText; - ListBox* m_pSlotBox; + VclPtr<FixedText> m_pSlotText; + VclPtr<ListBox> m_pSlotBox; DECL_LINK( SelectHdl, ListBox* ); public: RTSPaperPage( RTSDialog* ); virtual ~RTSPaperPage(); + virtual void dispose() SAL_OVERRIDE; void update(); @@ -95,16 +97,16 @@ public: class RTSDevicePage : public TabPage { - RTSDialog* m_pParent; + VclPtr<RTSDialog> m_pParent; - ListBox* m_pPPDKeyBox; - ListBox* m_pPPDValueBox; + VclPtr<ListBox> m_pPPDKeyBox; + VclPtr<ListBox> m_pPPDValueBox; const psp::PPDValue* m_pCustomValue; - Edit* m_pCustomEdit; + VclPtr<Edit> m_pCustomEdit; - ListBox* m_pLevelBox; - ListBox* m_pSpaceBox; - ListBox* m_pDepthBox; + VclPtr<ListBox> m_pLevelBox; + VclPtr<ListBox> m_pSpaceBox; + VclPtr<ListBox> m_pDepthBox; void FillValueBox( const ::psp::PPDKey* ); @@ -113,6 +115,7 @@ class RTSDevicePage : public TabPage public: RTSDevicePage( RTSDialog* ); virtual ~RTSDevicePage(); + virtual void dispose() SAL_OVERRIDE; sal_uLong getLevel(); sal_uLong getPDFDevice(); diff --git a/vcl/inc/brdwin.hxx b/vcl/inc/brdwin.hxx index d47f07103e00..77a690c75dc0 100644 --- a/vcl/inc/brdwin.hxx +++ b/vcl/inc/brdwin.hxx @@ -83,14 +83,14 @@ class ImplBorderWindow : public vcl::Window private: ImplBorderWindowView* mpBorderView; - vcl::Window* mpMenuBarWindow; + VclPtr<vcl::Window> mpMenuBarWindow; long mnMinWidth; long mnMinHeight; long mnMaxWidth; long mnMaxHeight; long mnRollHeight; long mnOrgMenuHeight; - sal_uInt16 mnTitleType; + sal_uInt16 mnTitleType; WindowBorderStyle mnBorderStyle; bool mbFloatWindow; bool mbSmallOutBorder; @@ -121,7 +121,8 @@ public: sal_uInt16 nTypeStyle = 0 ); ImplBorderWindow( vcl::Window* pParent, WinBits nStyle = 0, sal_uInt16 nTypeStyle = 0 ); - virtual ~ImplBorderWindow(); + virtual ~ImplBorderWindow(); + virtual void dispose() SAL_OVERRIDE; virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE; virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE; @@ -173,8 +174,8 @@ public: struct ImplBorderFrameData { - ImplBorderWindow* mpBorderWindow; - OutputDevice* mpOutDev; + VclPtr<ImplBorderWindow> mpBorderWindow; + VclPtr<OutputDevice> mpOutDev; Rectangle maTitleRect; Rectangle maPinRect; Rectangle maCloseRect; @@ -252,8 +253,8 @@ public: class ImplSmallBorderWindowView : public ImplBorderWindowView { - ImplBorderWindow* mpBorderWindow; - OutputDevice* mpOutDev; + VclPtr<ImplBorderWindow> mpBorderWindow; + VclPtr<OutputDevice> mpOutDev; long mnWidth; long mnHeight; sal_Int32 mnLeftBorder; @@ -275,8 +276,8 @@ public: class ImplStdBorderWindowView : public ImplBorderWindowView { ImplBorderFrameData maFrameData; - VirtualDevice* mpATitleVirDev; - VirtualDevice* mpDTitleVirDev; + VclPtr<VirtualDevice> mpATitleVirDev; + VclPtr<VirtualDevice> mpDTitleVirDev; public: ImplStdBorderWindowView( ImplBorderWindow* pBorderWindow ); diff --git a/vcl/inc/controldata.hxx b/vcl/inc/controldata.hxx index 20720911d038..0ef77c809541 100644 --- a/vcl/inc/controldata.hxx +++ b/vcl/inc/controldata.hxx @@ -30,7 +30,7 @@ namespace vcl struct ImplControlData { mutable ControlLayoutData* mpLayoutData; - OutputDevice* mpReferenceDevice; + VclPtr<OutputDevice> mpReferenceDevice; ImplControlData() :mpLayoutData( NULL ) diff --git a/vcl/inc/dndevdis.hxx b/vcl/inc/dndevdis.hxx index 978910a46f01..b542581efee1 100644 --- a/vcl/inc/dndevdis.hxx +++ b/vcl/inc/dndevdis.hxx @@ -32,9 +32,9 @@ class DNDEventDispatcher: public ::cppu::WeakImplHelper3< ::com::sun::star::datatransfer::dnd::XDropTargetDragContext, ::com::sun::star::datatransfer::dnd::XDragGestureListener > { - vcl::Window * m_pTopWindow; + VclPtr<vcl::Window> m_pTopWindow; - vcl::Window * m_pCurrentWindow; + VclPtr<vcl::Window> m_pCurrentWindow; void designate_currentwindow(vcl::Window *pWindow); DECL_LINK(WindowEventListener, VclSimpleEvent*); diff --git a/vcl/inc/helpwin.hxx b/vcl/inc/helpwin.hxx index b6beda35a6d3..c092d292d4ea 100644 --- a/vcl/inc/helpwin.hxx +++ b/vcl/inc/helpwin.hxx @@ -38,8 +38,8 @@ private: Timer maShowTimer; Timer maHideTimer; - sal_uInt16 mnHelpWinStyle; - sal_uInt16 mnStyle; + sal_uInt16 mnHelpWinStyle; + sal_uInt16 mnStyle; protected: DECL_LINK( TimerHdl, Timer* ); @@ -50,7 +50,8 @@ protected: public: HelpTextWindow( vcl::Window* pParent, const OUString& rText, sal_uInt16 nHelpWinStyle, sal_uInt16 nStyle ); - virtual ~HelpTextWindow(); + virtual ~HelpTextWindow(); + virtual void dispose() SAL_OVERRIDE; const OUString& GetHelpText() const { return maHelpText; } void SetHelpText( const OUString& rHelpText ); diff --git a/vcl/inc/ilstbox.hxx b/vcl/inc/ilstbox.hxx index 0efc7e12988b..dfab1ad7185b 100644 --- a/vcl/inc/ilstbox.hxx +++ b/vcl/inc/ilstbox.hxx @@ -87,7 +87,7 @@ struct ImplEntryType class ImplEntryList { private: - vcl::Window* mpWindow; ///< For getting the current locale when matching strings + VclPtr<vcl::Window> mpWindow; ///< For getting the current locale when matching strings sal_Int32 mnLastSelected; sal_Int32 mnSelectionAnchor; sal_Int32 mnImages; @@ -266,7 +266,8 @@ public: virtual void FillLayoutData() const SAL_OVERRIDE; ImplListBoxWindow( vcl::Window* pParent, WinBits nWinStyle ); - virtual ~ImplListBoxWindow(); + virtual ~ImplListBoxWindow(); + virtual void dispose() SAL_OVERRIDE; ImplEntryList* GetEntryList() const { return mpEntryList; } @@ -380,10 +381,10 @@ protected: class ImplListBox : public Control { private: - ImplListBoxWindow maLBWindow; - ScrollBar* mpHScrollBar; - ScrollBar* mpVScrollBar; - ScrollBarBox* mpScrollBarBox; + VclPtr<ImplListBoxWindow> maLBWindow; + VclPtr<ScrollBar> mpHScrollBar; + VclPtr<ScrollBar> mpVScrollBar; + VclPtr<ScrollBarBox> mpScrollBarBox; /// bitfield bool mbVScroll : 1; // VScroll an oder aus @@ -412,9 +413,10 @@ protected: public: ImplListBox( vcl::Window* pParent, WinBits nWinStyle ); virtual ~ImplListBox(); + virtual void dispose() SAL_OVERRIDE; - const ImplEntryList* GetEntryList() const { return maLBWindow.GetEntryList(); } - ImplListBoxWindow& GetMainWindow() { return maLBWindow; } + const ImplEntryList* GetEntryList() const { return maLBWindow->GetEntryList(); } + ImplListBoxWindow* GetMainWindow() { return maLBWindow.get(); } virtual void Resize() SAL_OVERRIDE; virtual const Wallpaper& GetDisplayBackground() const SAL_OVERRIDE; @@ -423,91 +425,91 @@ public: sal_Int32 InsertEntry( sal_Int32 nPos, const OUString& rStr ); sal_Int32 InsertEntry( sal_Int32 nPos, const OUString& rStr, const Image& rImage ); void RemoveEntry( sal_Int32 nPos ); - void SetEntryData( sal_Int32 nPos, void* pNewData ) { maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); } + void SetEntryData( sal_Int32 nPos, void* pNewData ) { maLBWindow->GetEntryList()->SetEntryData( nPos, pNewData ); } void Clear(); void SetEntryFlags( sal_Int32 nPos, long nFlags ); void SelectEntry( sal_Int32 nPos, bool bSelect ); void SetNoSelection(); - void ResetCurrentPos() { maLBWindow.ResetCurrentPos(); } - sal_Int32 GetCurrentPos() const { return maLBWindow.GetCurrentPos(); } + void ResetCurrentPos() { maLBWindow->ResetCurrentPos(); } + sal_Int32 GetCurrentPos() const { return maLBWindow->GetCurrentPos(); } - bool ProcessKeyInput( const KeyEvent& rKEvt ) { return maLBWindow.ProcessKeyInput( rKEvt ); } + bool ProcessKeyInput( const KeyEvent& rKEvt ) { return maLBWindow->ProcessKeyInput( rKEvt ); } bool HandleWheelAsCursorTravel( const CommandEvent& rCEvt ); - void SetSeparatorPos( sal_Int32 n ) { maLBWindow.SetSeparatorPos( n ); } - sal_Int32 GetSeparatorPos() const { return maLBWindow.GetSeparatorPos(); } + void SetSeparatorPos( sal_Int32 n ) { maLBWindow->SetSeparatorPos( n ); } + sal_Int32 GetSeparatorPos() const { return maLBWindow->GetSeparatorPos(); } - void SetTopEntry( sal_Int32 nTop ) { maLBWindow.SetTopEntry( nTop ); } - sal_Int32 GetTopEntry() const { return maLBWindow.GetTopEntry(); } - void ShowProminentEntry( sal_Int32 nPos ) { maLBWindow.ShowProminentEntry( nPos ); } + void SetTopEntry( sal_Int32 nTop ) { maLBWindow->SetTopEntry( nTop ); } + sal_Int32 GetTopEntry() const { return maLBWindow->GetTopEntry(); } + void ShowProminentEntry( sal_Int32 nPos ) { maLBWindow->ShowProminentEntry( nPos ); } using Window::IsVisible; - bool IsVisible( sal_Int32 nEntry ) const { return maLBWindow.IsVisible( nEntry ); } + bool IsVisible( sal_Int32 nEntry ) const { return maLBWindow->IsVisible( nEntry ); } - void SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); } - ProminentEntry GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); } + void SetProminentEntryType( ProminentEntry eType ) { maLBWindow->SetProminentEntryType( eType ); } + ProminentEntry GetProminentEntryType() const { return maLBWindow->GetProminentEntryType(); } - long GetLeftIndent() const { return maLBWindow.GetLeftIndent(); } - void SetLeftIndent( sal_uInt16 n ) { maLBWindow.SetLeftIndent( n ); } - void ScrollHorz( short nDiff ) { maLBWindow.ScrollHorz( nDiff ); } + long GetLeftIndent() const { return maLBWindow->GetLeftIndent(); } + void SetLeftIndent( sal_uInt16 n ) { maLBWindow->SetLeftIndent( n ); } + void ScrollHorz( short nDiff ) { maLBWindow->ScrollHorz( nDiff ); } - void SetTravelSelect( bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); } - bool IsTravelSelect() const { return maLBWindow.IsTravelSelect(); } - bool IsTrackingSelect() const { return maLBWindow.IsTrackingSelect(); } + void SetTravelSelect( bool bTravelSelect ) { maLBWindow->SetTravelSelect( bTravelSelect ); } + bool IsTravelSelect() const { return maLBWindow->IsTravelSelect(); } + bool IsTrackingSelect() const { return maLBWindow->IsTrackingSelect(); } - void EnableMultiSelection( bool bMulti, bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); } - bool IsMultiSelectionEnabled() const { return maLBWindow.IsMultiSelectionEnabled(); } + void EnableMultiSelection( bool bMulti, bool bStackMode ) { maLBWindow->EnableMultiSelection( bMulti, bStackMode ); } + bool IsMultiSelectionEnabled() const { return maLBWindow->IsMultiSelectionEnabled(); } - void SetMultiSelectionSimpleMode( bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); } - bool IsMultiSelectionSimpleMode() const { return maLBWindow.IsMultiSelectionSimpleMode(); } + void SetMultiSelectionSimpleMode( bool bSimple ) { maLBWindow->SetMultiSelectionSimpleMode( bSimple ); } + bool IsMultiSelectionSimpleMode() const { return maLBWindow->IsMultiSelectionSimpleMode(); } - void SetReadOnly( bool b ) { maLBWindow.SetReadOnly( b ); } - bool IsReadOnly() const { return maLBWindow.IsReadOnly(); } + void SetReadOnly( bool b ) { maLBWindow->SetReadOnly( b ); } + bool IsReadOnly() const { return maLBWindow->IsReadOnly(); } - Size CalcSize( sal_Int32 nMaxLines ) const { return maLBWindow.CalcSize( nMaxLines ); } - long GetEntryHeight() const { return maLBWindow.GetEntryHeight(); } - long GetMaxEntryWidth() const { return maLBWindow.GetMaxEntryWidth(); } + Size CalcSize( sal_Int32 nMaxLines ) const { return maLBWindow->CalcSize( nMaxLines ); } + long GetEntryHeight() const { return maLBWindow->GetEntryHeight(); } + long GetMaxEntryWidth() const { return maLBWindow->GetMaxEntryWidth(); } void SetScrollHdl( const Link& rLink ) { maScrollHdl = rLink; } const Link& GetScrollHdl() const { return maScrollHdl; } - void SetSelectHdl( const Link& rLink ) { maLBWindow.SetSelectHdl( rLink ); } - const Link& GetSelectHdl() const { return maLBWindow.GetSelectHdl(); } - void SetCancelHdl( const Link& rLink ) { maLBWindow.SetCancelHdl( rLink ); } - const Link& GetCancelHdl() const { return maLBWindow.GetCancelHdl(); } - void SetDoubleClickHdl( const Link& rLink ) { maLBWindow.SetDoubleClickHdl( rLink ); } - const Link& GetDoubleClickHdl() const { return maLBWindow.GetDoubleClickHdl(); } + void SetSelectHdl( const Link& rLink ) { maLBWindow->SetSelectHdl( rLink ); } + const Link& GetSelectHdl() const { return maLBWindow->GetSelectHdl(); } + void SetCancelHdl( const Link& rLink ) { maLBWindow->SetCancelHdl( rLink ); } + const Link& GetCancelHdl() const { return maLBWindow->GetCancelHdl(); } + void SetDoubleClickHdl( const Link& rLink ) { maLBWindow->SetDoubleClickHdl( rLink ); } + const Link& GetDoubleClickHdl() const { return maLBWindow->GetDoubleClickHdl(); } boost::signals2::signal< void ( UserDrawEvent* ) > userDrawSignal; - void SetFocusHdl( const Link& rLink ) { maLBWindow.SetFocusHdl( rLink ); } - const Link& GetFocusHdl() const { return maLBWindow.GetFocusHdl(); } - void SetListItemSelectHdl( const Link& rLink ) { maLBWindow.SetListItemSelectHdl( rLink ); } - const Link& GetListItemSelectHdl() const { return maLBWindow.GetListItemSelectHdl(); } - void SetSelectionChangedHdl( const Link& rLnk ) { maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); } - void SetCallSelectionChangedHdl( bool bCall ) { maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); } - bool IsSelectionChanged() const { return maLBWindow.IsSelectionChanged(); } - sal_uInt16 GetSelectModifier() const { return maLBWindow.GetSelectModifier(); } + void SetFocusHdl( const Link& rLink ) { maLBWindow->SetFocusHdl( rLink ); } + const Link& GetFocusHdl() const { return maLBWindow->GetFocusHdl(); } + void SetListItemSelectHdl( const Link& rLink ) { maLBWindow->SetListItemSelectHdl( rLink ); } + const Link& GetListItemSelectHdl() const { return maLBWindow->GetListItemSelectHdl(); } + void SetSelectionChangedHdl( const Link& rLnk ) { maLBWindow->GetEntryList()->SetSelectionChangedHdl( rLnk ); } + void SetCallSelectionChangedHdl( bool bCall ) { maLBWindow->GetEntryList()->SetCallSelectionChangedHdl( bCall ); } + bool IsSelectionChanged() const { return maLBWindow->IsSelectionChanged(); } + sal_uInt16 GetSelectModifier() const { return maLBWindow->GetSelectModifier(); } void SetMRUEntries( const OUString& rEntries, sal_Unicode cSep ); OUString GetMRUEntries( sal_Unicode cSep ) const; - void SetMaxMRUCount( sal_Int32 n ) { maLBWindow.GetEntryList()->SetMaxMRUCount( n ); } - sal_Int32 GetMaxMRUCount() const { return maLBWindow.GetEntryList()->GetMaxMRUCount(); } + void SetMaxMRUCount( sal_Int32 n ) { maLBWindow->GetEntryList()->SetMaxMRUCount( n ); } + sal_Int32 GetMaxMRUCount() const { return maLBWindow->GetEntryList()->GetMaxMRUCount(); } sal_uInt16 GetDisplayLineCount() const - { return maLBWindow.GetDisplayLineCount(); } + { return maLBWindow->GetDisplayLineCount(); } bool GetEdgeBlending() const { return mbEdgeBlending; } void SetEdgeBlending(bool bNew); /// pb: #106948# explicit mirroring for calc - inline void EnableMirroring() { maLBWindow.EnableMirroring(); } + inline void EnableMirroring() { maLBWindow->EnableMirroring(); } inline void SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; } }; class ImplListBoxFloatingWindow : public FloatingWindow { private: - ImplListBox* mpImplLB; + VclPtr<ImplListBox> mpImplLB; Size maPrefSz; sal_uInt16 mnDDLineCount; sal_Int32 mnPopupModeStartSaveSelection; @@ -518,7 +520,8 @@ protected: public: ImplListBoxFloatingWindow( vcl::Window* pParent ); - + virtual ~ImplListBoxFloatingWindow(); + virtual void dispose() SAL_OVERRIDE; void SetImplListBox( ImplListBox* pLB ) { mpImplLB = pLB; } void SetPrefSize( const Size& rSz ) { maPrefSz = rSz; } @@ -565,7 +568,6 @@ protected: public: ImplWin( vcl::Window* pParent, WinBits nWinStyle = 0 ); - virtual ~ImplWin() {}; virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE; virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; @@ -607,7 +609,6 @@ private: public: ImplBtn( vcl::Window* pParent, WinBits nWinStyle = 0 ); - virtual ~ImplBtn() {}; virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE; void MBDown(); diff --git a/vcl/inc/outdev.h b/vcl/inc/outdev.h index a1e1b850d66c..eae0c597a03b 100644 --- a/vcl/inc/outdev.h +++ b/vcl/inc/outdev.h @@ -25,6 +25,7 @@ #include <vector> #include <tools/gen.hxx> +#include <vcl/vclptr.hxx> #include "outfont.hxx" #include "PhysicalFontFace.hxx" @@ -164,7 +165,7 @@ namespace basegfx { class B2DHomMatrix; } struct ImplOutDevData { - VirtualDevice* mpRotateDev; + VclPtr<VirtualDevice> mpRotateDev; vcl::ControlLayoutData* mpRecordLayout; Rectangle maRecordRect; diff --git a/vcl/inc/printdlg.hxx b/vcl/inc/printdlg.hxx index fef1da807543..a071c9d5cbac 100644 --- a/vcl/inc/printdlg.hxx +++ b/vcl/inc/printdlg.hxx @@ -51,19 +51,20 @@ namespace vcl GDIMetaFile maMtf; Size maOrigSize; Size maPreviewSize; - VirtualDevice maPageVDev; + VclPtr<VirtualDevice> maPageVDev; Bitmap maPreviewBitmap; - OUString maReplacementString; - OUString maToolTipString; + OUString maReplacementString; + OUString maToolTipString; bool mbGreyscale; - FixedLine maHorzDim; - FixedLine maVertDim; + VclPtr<FixedLine> maHorzDim; + VclPtr<FixedLine> maVertDim; void preparePreviewBitmap(); public: PrintPreviewWindow( vcl::Window* pParent ); virtual ~PrintPreviewWindow(); + virtual void dispose() SAL_OVERRIDE; virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; virtual void Command( const CommandEvent& ) SAL_OVERRIDE; @@ -86,7 +87,6 @@ namespace vcl void ImplInitSettings(); public: ShowNupOrderWindow( vcl::Window* pParent ); - virtual ~ShowNupOrderWindow(); virtual Size GetOptimalSize() const SAL_OVERRIDE; @@ -106,31 +106,31 @@ namespace vcl class NUpTabPage { public: - RadioButton* mpPagesBtn; - RadioButton* mpBrochureBtn; - FixedText* mpPagesBoxTitleTxt; - ListBox* mpNupPagesBox; + VclPtr<RadioButton> mpPagesBtn; + VclPtr<RadioButton> mpBrochureBtn; + VclPtr<FixedText> mpPagesBoxTitleTxt; + VclPtr<ListBox> mpNupPagesBox; // controls for "Custom" page mode - FixedText* mpNupNumPagesTxt; - NumericField* mpNupColEdt; - FixedText* mpNupTimesTxt; - NumericField* mpNupRowsEdt; - FixedText* mpPageMarginTxt1; - MetricField* mpPageMarginEdt; - FixedText* mpPageMarginTxt2; - FixedText* mpSheetMarginTxt1; - MetricField* mpSheetMarginEdt; - FixedText* mpSheetMarginTxt2; - FixedText* mpNupOrientationTxt; - ListBox* mpNupOrientationBox; + VclPtr<FixedText> mpNupNumPagesTxt; + VclPtr<NumericField> mpNupColEdt; + VclPtr<FixedText> mpNupTimesTxt; + VclPtr<NumericField> mpNupRowsEdt; + VclPtr<FixedText> mpPageMarginTxt1; + VclPtr<MetricField> mpPageMarginEdt; + VclPtr<FixedText> mpPageMarginTxt2; + VclPtr<FixedText> mpSheetMarginTxt1; + VclPtr<MetricField> mpSheetMarginEdt; + VclPtr<FixedText> mpSheetMarginTxt2; + VclPtr<FixedText> mpNupOrientationTxt; + VclPtr<ListBox> mpNupOrientationBox; // page order ("left to right, then down") - FixedText* mpNupOrderTxt; - ListBox* mpNupOrderBox; - ShowNupOrderWindow* mpNupOrderWin; + VclPtr<FixedText> mpNupOrderTxt; + VclPtr<ListBox> mpNupOrderBox; + VclPtr<ShowNupOrderWindow> mpNupOrderWin; /// border around each page - CheckBox* mpBorderCB; + VclPtr<CheckBox> mpBorderCB; void setupLayout(); @@ -145,18 +145,18 @@ namespace vcl class JobTabPage { public: - ListBox* mpPrinters; - FixedText* mpStatusTxt; - FixedText* mpLocationTxt; - FixedText* mpCommentTxt; + VclPtr<ListBox> mpPrinters; + VclPtr<FixedText> mpStatusTxt; + VclPtr<FixedText> mpLocationTxt; + VclPtr<FixedText> mpCommentTxt; - PushButton* mpSetupButton; + VclPtr<PushButton> mpSetupButton; - FixedLine* mpCopySpacer; - NumericField* mpCopyCountField; - CheckBox* mpCollateBox; - FixedImage* mpCollateImage; - CheckBox* mpReverseOrderBox; + VclPtr<FixedLine> mpCopySpacer; + VclPtr<NumericField> mpCopyCountField; + VclPtr<CheckBox> mpCollateBox; + VclPtr<FixedImage> mpCollateImage; + VclPtr<CheckBox> mpReverseOrderBox; Image maCollateImg; Image maNoCollateImg; @@ -172,9 +172,9 @@ namespace vcl class OutputOptPage { public: - CheckBox* mpToFileBox; - CheckBox* mpCollateSingleJobsBox; - CheckBox* mpPapersizeFromSetup; + VclPtr<CheckBox> mpToFileBox; + VclPtr<CheckBox> mpCollateSingleJobsBox; + VclPtr<CheckBox> mpPapersizeFromSetup; OutputOptPage( VclBuilder* ); @@ -185,31 +185,31 @@ namespace vcl VclBuilder* mpCustomOptionsUIBuilder; std::shared_ptr<PrinterController> maPController; - TabControl* mpTabCtrl; + VclPtr<TabControl> mpTabCtrl; NUpTabPage maNUpPage; JobTabPage maJobPage; OutputOptPage maOptionsPage; - PrintPreviewWindow* mpPreviewWindow; - NumericField* mpPageEdit; + VclPtr<PrintPreviewWindow> mpPreviewWindow; + VclPtr<NumericField> mpPageEdit; - FixedText* mpNumPagesText; - PushButton* mpBackwardBtn; - PushButton* mpForwardBtn; + VclPtr<FixedText> mpNumPagesText; + VclPtr<PushButton> mpBackwardBtn; + VclPtr<PushButton> mpForwardBtn; - OKButton* mpOKButton; - CancelButton* mpCancelButton; - HelpButton* mpHelpButton; + VclPtr<OKButton> mpOKButton; + VclPtr<CancelButton> mpCancelButton; + VclPtr<HelpButton> mpHelpButton; - OUString maPageStr; - OUString maNoPageStr; + OUString maPageStr; + OUString maNoPageStr; sal_Int32 mnCurPage; sal_Int32 mnCachedPages; - std::map< vcl::Window*, OUString > maControlToPropertyMap; - std::map< OUString, std::vector< vcl::Window* > > + std::map< VclPtr<vcl::Window>, OUString > maControlToPropertyMap; + std::map< OUString, std::vector< VclPtr<vcl::Window> > > maPropertyToWindowMap; - std::map< vcl::Window*, sal_Int32 > maControlToNumValMap; - std::set< OUString > maReverseDependencySet; + std::map< VclPtr<vcl::Window>, sal_Int32 > maControlToNumValMap; + std::set< OUString > maReverseDependencySet; Size maNupPortraitSize; Size maNupLandscapeSize; @@ -258,6 +258,7 @@ namespace vcl public: PrintDialog( vcl::Window*, const std::shared_ptr< PrinterController >& ); virtual ~PrintDialog(); + virtual void dispose() SAL_OVERRIDE; bool isPrintToFile(); bool isCollate(); @@ -270,9 +271,9 @@ namespace vcl class PrintProgressDialog : public ModelessDialog { OUString maStr; - FixedText* mpText; - ProgressBar* mpProgress; - CancelButton* mpButton; + VclPtr<FixedText> mpText; + VclPtr<ProgressBar> mpProgress; + VclPtr<CancelButton> mpButton; bool mbCanceled; sal_Int32 mnCur; @@ -282,7 +283,8 @@ namespace vcl public: PrintProgressDialog(vcl::Window* i_pParent, int i_nMax); - + virtual ~PrintProgressDialog(); + virtual void dispose() SAL_OVERRIDE; bool isCanceled() const { return mbCanceled; } void setProgress( int i_nCurrent, int i_nMax = -1 ); void tick(); diff --git a/vcl/inc/salframe.hxx b/vcl/inc/salframe.hxx index 6d54ca9a0864..84cd1f53567c 100644 --- a/vcl/inc/salframe.hxx +++ b/vcl/inc/salframe.hxx @@ -33,6 +33,8 @@ #include <vcl/impdel.hxx> #include <rtl/ustring.hxx> #include <vcl/keycod.hxx> +#include <vcl/window.hxx> +#include <vcl/vclptr.hxx> #include <vcl/window.hxx> // complete vcl::Window for SalFrame::CallCallback under -fsanitize=function @@ -100,11 +102,11 @@ class VCL_PLUGIN_PUBLIC SalFrame , public SalGeometryProvider { // the VCL window corresponding to this frame - vcl::Window* m_pWindow; + VclPtr<vcl::Window> m_pWindow; SALFRAMEPROC m_pProc; public: - SalFrame() : m_pWindow( NULL ), m_pProc( NULL ) {} + SalFrame(); virtual ~SalFrame(); SalFrameGeometry maGeometry; @@ -230,8 +232,7 @@ public: // Callbacks (indepent part in vcl/source/window/winproc.cxx) // for default message handling return 0 - void SetCallback( vcl::Window* pWindow, SALFRAMEPROC pProc ) - { m_pWindow = pWindow; m_pProc = pProc; } + void SetCallback( vcl::Window* pWindow, SALFRAMEPROC pProc ); // returns the instance set vcl::Window* GetWindow() const { return m_pWindow; } diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx index c4da2e8db51c..82ae80ebbde6 100644 --- a/vcl/inc/svdata.hxx +++ b/vcl/inc/svdata.hxx @@ -122,7 +122,7 @@ struct ImplSVAppData Help* mpHelp; // Application help PopupMenu* mpActivePopupMenu; // Actives Popup-Menu (in Execute) ImplIdleMgr* mpIdleMgr; // Idle-Manager - ImplWheelWindow* mpWheelWindow; // WheelWindow + VclPtr<ImplWheelWindow> mpWheelWindow; // WheelWindow ImplHotKey* mpFirstHotKey; // HotKey-Verwaltung ImplEventHook* mpFirstEventHook; // Event-Hooks VclEventListeners2* mpPostYieldListeners; // post yield listeners @@ -153,18 +153,20 @@ struct ImplSVAppData struct ImplSVGDIData { - OutputDevice* mpFirstWinGraphics; // First OutputDevice with a Frame Graphics - OutputDevice* mpLastWinGraphics; // Last OutputDevice with a Frame Graphics - OutputDevice* mpFirstVirGraphics; // First OutputDevice with a VirtualDevice Graphics - OutputDevice* mpLastVirGraphics; // Last OutputDevice with a VirtualDevice Graphics - OutputDevice* mpFirstPrnGraphics; // First OutputDevice with a InfoPrinter Graphics - OutputDevice* mpLastPrnGraphics; // Last OutputDevice with a InfoPrinter Graphics - VirtualDevice* mpFirstVirDev; // First VirtualDevice - VirtualDevice* mpLastVirDev; // Last VirtualDevice + ~ImplSVGDIData(); + + VclPtr<OutputDevice> mpFirstWinGraphics; // First OutputDevice with a Frame Graphics + VclPtr<OutputDevice> mpLastWinGraphics; // Last OutputDevice with a Frame Graphics + VclPtr<OutputDevice> mpFirstVirGraphics; // First OutputDevice with a VirtualDevice Graphics + VclPtr<OutputDevice> mpLastVirGraphics; // Last OutputDevice with a VirtualDevice Graphics + VclPtr<OutputDevice> mpFirstPrnGraphics; // First OutputDevice with a InfoPrinter Graphics + VclPtr<OutputDevice> mpLastPrnGraphics; // Last OutputDevice with a InfoPrinter Graphics + VclPtr<VirtualDevice> mpFirstVirDev; // First VirtualDevice + VclPtr<VirtualDevice> mpLastVirDev; // Last VirtualDevice OpenGLContext* mpFirstContext; // First OpenGLContext OpenGLContext* mpLastContext; // Last OpenGLContext - Printer* mpFirstPrinter; // First Printer - Printer* mpLastPrinter; // Last Printer + VclPtr<Printer> mpFirstPrinter; // First Printer + VclPtr<Printer> mpLastPrinter; // Last Printer ImplPrnQueueList* mpPrinterQueueList; // List of all printer queue PhysicalFontCollection* mpScreenFontList; // Screen-Font-List ImplFontCache* mpScreenFontCache; // Screen-Font-Cache @@ -179,20 +181,20 @@ struct ImplSVGDIData struct ImplSVWinData { - vcl::Window* mpFirstFrame; // First FrameWindow - vcl::Window* mpDefDialogParent; // Default Dialog Parent - WorkWindow* mpAppWin; // Application-Window - vcl::Window* mpFocusWin; // window, that has the focus - vcl::Window* mpActiveApplicationFrame; // the last active application frame, can be used as DefModalDialogParent if no focuswin set - vcl::Window* mpCaptureWin; // window, that has the mouse capture - vcl::Window* mpLastDeacWin; // Window, that need a deactivate (FloatingWindow-Handling) - FloatingWindow* mpFirstFloat; // First FloatingWindow in PopupMode - Dialog* mpLastExecuteDlg; // First Dialog that is in Execute - vcl::Window* mpExtTextInputWin; // Window, which is in ExtTextInput - vcl::Window* mpTrackWin; // window, that is in tracking mode + VclPtr<vcl::Window> mpFirstFrame; // First FrameWindow + VclPtr<vcl::Window> mpDefDialogParent; // Default Dialog Parent + VclPtr<WorkWindow> mpAppWin; // Application-Window + VclPtr<vcl::Window> mpFocusWin; // window, that has the focus + VclPtr<vcl::Window> mpActiveApplicationFrame; // the last active application frame, can be used as DefModalDialogParent if no focuswin set + VclPtr<vcl::Window> mpCaptureWin; // window, that has the mouse capture + VclPtr<vcl::Window> mpLastDeacWin; // Window, that need a deactivate (FloatingWindow-Handling) + VclPtr<FloatingWindow> mpFirstFloat; // First FloatingWindow in PopupMode + VclPtr<Dialog> mpLastExecuteDlg; // First Dialog that is in Execute + VclPtr<vcl::Window> mpExtTextInputWin; // Window, which is in ExtTextInput + VclPtr<vcl::Window> mpTrackWin; // window, that is in tracking mode AutoTimer* mpTrackTimer; // tracking timer ImageList* mpMsgBoxImgList; // ImageList for MessageBox - vcl::Window* mpAutoScrollWin; // window, that is in AutoScrollMode mode + VclPtr<vcl::Window> mpAutoScrollWin; // window, that is in AutoScrollMode mode sal_uInt16 mnTrackFlags; // tracking flags sal_uInt16 mnAutoScrollFlags; // auto scroll flags bool mbNoDeactivate; // true: do not execute Deactivate @@ -239,7 +241,7 @@ struct ImplSVHelpData bool mbKeyboardHelp : 1; // tiphelp was activated by keyboard bool mbAutoHelpId : 1; // generate HelpIds bool mbRequestingHelp : 1; // In Window::RequestHelp - HelpTextWindow* mpHelpWin; // HelpWindow + VclPtr<HelpTextWindow> mpHelpWin; // HelpWindow sal_uInt64 mnLastHelpHideTime; // ticks of last show }; @@ -307,7 +309,7 @@ struct ImplSVData SalData* mpSalData; SalInstance* mpDefInst; // Default SalInstance Application* mpApp; // pApp - WorkWindow* mpDefaultWin; // Default-Window + VclPtr<WorkWindow> mpDefaultWin; // Default-Window bool mbDeInit; // Is VCL deinitializing sal_uLong mnThreadCount; // is VCL MultiThread enabled ImplConfigData* mpFirstConfigData; // pointer to the first config block @@ -325,7 +327,7 @@ struct ImplSVData ImplSVHelpData maHelpData; // indepen data for Help classes ImplSVNWFData maNWFData; UnoWrapperBase* mpUnoWrapper; - vcl::Window* mpIntroWindow; // the splash screen + VclPtr<vcl::Window> mpIntroWindow; // the splash screen DockingManager* mpDockingManager; BlendFrameCache* mpBlendFrameCache; bool mbIsTestTool; @@ -372,15 +374,10 @@ FieldUnitStringList* ImplGetCleanedFieldUnits(); struct ImplDelData { ImplDelData* mpNext; - const vcl::Window* mpWindow; + VclPtr<vcl::Window> mpWindow; bool mbDel; - ImplDelData( const vcl::Window* pWindow = NULL ) : - mpNext( NULL ), - mpWindow( NULL ), - mbDel( false ) - { if( pWindow ) AttachToWindow( pWindow ); } - + ImplDelData( vcl::Window* pWindow = NULL ); virtual ~ImplDelData(); bool IsDead() const @@ -396,14 +393,14 @@ private: struct ImplFocusDelData : public ImplDelData { - vcl::Window* mpFocusWin; + VclPtr<vcl::Window> mpFocusWin; }; struct ImplSVEvent { void* mpData; Link* mpLink; - vcl::Window* mpWindow; + VclPtr<vcl::Window> mpWindow; ImplDelData maDelData; bool mbCall; }; diff --git a/vcl/inc/toolbox.h b/vcl/inc/toolbox.h index 935d1184e81c..61d247bd270b 100644 --- a/vcl/inc/toolbox.h +++ b/vcl/inc/toolbox.h @@ -37,7 +37,7 @@ namespace vcl { class Window; } struct ImplToolItem { - vcl::Window* mpWindow; + VclPtr<vcl::Window> mpWindow; void* mpUserData; Image maImage; Image maImageOriginal; diff --git a/vcl/inc/unx/i18n_status.hxx b/vcl/inc/unx/i18n_status.hxx index ee0ff3419bb8..ff954ceb37c4 100644 --- a/vcl/inc/unx/i18n_status.hxx +++ b/vcl/inc/unx/i18n_status.hxx @@ -22,6 +22,7 @@ #include <rtl/ustring.hxx> #include <salimestatus.hxx> +#include <vcl/vclptr.hxx> #include <vector> @@ -57,7 +58,7 @@ public: }; private: SalFrame* m_pParent; - StatusWindow* m_pStatusWindow; + VclPtr<StatusWindow> m_pStatusWindow; OUString m_aCurrentIM; ::std::vector< ChoiceData > m_aChoices; diff --git a/vcl/inc/window.h b/vcl/inc/window.h index 75b8f5af3f61..a2066d4bf5b0 100644 --- a/vcl/inc/window.h +++ b/vcl/inc/window.h @@ -35,6 +35,7 @@ #include <vcl/timer.hxx> #include <vcl/idle.hxx> #include <vcl/vclevent.hxx> +#include <vcl/vclptr.hxx> #include <vector> struct SalPaintEvent; @@ -114,15 +115,15 @@ struct ImplWinData sal_uInt16 mnIsTopWindow; bool mbMouseOver; //< tracks mouse over for native widget paint effect bool mbEnableNativeWidget; //< toggle native widget rendering - ::std::list< vcl::Window* > + ::std::list< VclPtr<vcl::Window> > maTopWindowChildren; }; struct ImplOverlapData { - VirtualDevice* mpSaveBackDev; //< saved background bitmap - vcl::Region* mpSaveBackRgn; //< saved region, which must be invalidated - vcl::Window* mpNextBackWin; //< next window with saved background + VclPtr<VirtualDevice> mpSaveBackDev; //< saved background bitmap + vcl::Region* mpSaveBackRgn; //< saved region, which must be invalidated + VclPtr<vcl::Window> mpNextBackWin; //< next window with saved background sal_uIntPtr mnSaveBackSize; //< bitmap size of saved background bool mbSaveBack; //< true: save background sal_uInt8 mnTopLevel; //< Level for Overlap-Window @@ -133,13 +134,13 @@ struct ImplFrameData Idle maPaintIdle; //< paint idle handler Idle maResizeIdle; //< resize timer InputContext maOldInputContext; //< last set Input Context - vcl::Window* mpNextFrame; //< next frame window - vcl::Window* mpFirstOverlap; //< first overlap vcl::Window - vcl::Window* mpFocusWin; //< focus window (is also set, when frame doesn't have the focous) - vcl::Window* mpMouseMoveWin; //< last window, where MouseMove() called - vcl::Window* mpMouseDownWin; //< last window, where MouseButtonDown() called - vcl::Window* mpFirstBackWin; //< first overlap-window with saved background - ::std::vector<vcl::Window *> maOwnerDrawList; //< List of system windows with owner draw decoration + VclPtr<vcl::Window> mpNextFrame; //< next frame window + VclPtr<vcl::Window> mpFirstOverlap; //< first overlap vcl::Window + VclPtr<vcl::Window> mpFocusWin; //< focus window (is also set, when frame doesn't have the focous) + VclPtr<vcl::Window> mpMouseMoveWin; //< last window, where MouseMove() called + VclPtr<vcl::Window> mpMouseDownWin; //< last window, where MouseButtonDown() called + VclPtr<vcl::Window> mpFirstBackWin; //< first overlap-window with saved background + ::std::vector<VclPtr<vcl::Window> > maOwnerDrawList; //< List of system windows with owner draw decoration PhysicalFontCollection* mpFontCollection; //< Font-List for this frame ImplFontCache* mpFontCache; //< Font-Cache for this frame sal_Int32 mnDPIX; //< Original Screen Resolution @@ -188,9 +189,9 @@ struct ImplAccessibleInfos sal_uInt16 nAccessibleRole; OUString* pAccessibleName; OUString* pAccessibleDescription; - vcl::Window* pLabeledByWindow; - vcl::Window* pLabelForWindow; - vcl::Window* pMemberOfWindow; + VclPtr<vcl::Window> pLabeledByWindow; + VclPtr<vcl::Window> pLabelForWindow; + VclPtr<vcl::Window> pMemberOfWindow; ImplAccessibleInfos(); ~ImplAccessibleInfos(); @@ -212,21 +213,21 @@ public: ImplFrameData* mpFrameData; SalFrame* mpFrame; SalObject* mpSysObj; - vcl::Window* mpFrameWindow; - vcl::Window* mpOverlapWindow; - vcl::Window* mpBorderWindow; - vcl::Window* mpClientWindow; - vcl::Window* mpParent; - vcl::Window* mpRealParent; - vcl::Window* mpFirstChild; - vcl::Window* mpLastChild; - vcl::Window* mpFirstOverlap; - vcl::Window* mpLastOverlap; - vcl::Window* mpPrev; - vcl::Window* mpNext; - vcl::Window* mpNextOverlap; - vcl::Window* mpLastFocusWindow; - vcl::Window* mpDlgCtrlDownWindow; + VclPtr<vcl::Window> mpFrameWindow; + VclPtr<vcl::Window> mpOverlapWindow; + VclPtr<vcl::Window> mpBorderWindow; + VclPtr<vcl::Window> mpClientWindow; + VclPtr<vcl::Window> mpParent; + VclPtr<vcl::Window> mpRealParent; + VclPtr<vcl::Window> mpFirstChild; + VclPtr<vcl::Window> mpLastChild; + VclPtr<vcl::Window> mpFirstOverlap; + VclPtr<vcl::Window> mpLastOverlap; + VclPtr<vcl::Window> mpPrev; + VclPtr<vcl::Window> mpNext; + VclPtr<vcl::Window> mpNextOverlap; + VclPtr<vcl::Window> mpLastFocusWindow; + VclPtr<vcl::Window> mpDlgCtrlDownWindow; VclEventListeners maEventListeners; VclEventListeners maChildEventListeners; @@ -261,8 +262,8 @@ public: InputContext maInputContext; ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > mxWindowPeer; ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > mxAccessible; - std::shared_ptr<VclSizeGroup> m_xSizeGroup; - std::vector<FixedText*> m_aMnemonicLabels; + std::shared_ptr< VclSizeGroup > m_xSizeGroup; + std::vector< VclPtr<FixedText> > m_aMnemonicLabels; ImplAccessibleInfos* mpAccessibleInfos; VCLXWindow* mpVCLXWindow; vcl::Region maWinRegion; //< region to 'shape' the VCL window (frame coordinates) @@ -354,7 +355,7 @@ public: mbCompoundControlHasFocus:1, mbPaintDisabled:1, mbAllResize:1, - mbInDtor:1, + mbInDispose:1, mbExtTextInput:1, mbInFocusHdl:1, mbOverlapVisible:1, diff --git a/vcl/osx/a11ylistener.cxx b/vcl/osx/a11ylistener.cxx index bc966361633a..630a126dc7a9 100644 --- a/vcl/osx/a11ylistener.cxx +++ b/vcl/osx/a11ylistener.cxx @@ -71,7 +71,7 @@ AquaA11yEventListener::notifyEvent( const AccessibleEventObject& aEvent ) throw( { NSString * notification = nil; id element = m_wrapperObject; - Rectangle bounds; + ::css::awt::Rectangle bounds; // TODO: NSAccessibilityValueChanged, NSAccessibilitySelectedRowsChangedNotification switch( aEvent.EventId ) diff --git a/vcl/osx/salprn.cxx b/vcl/osx/salprn.cxx index 0becb853426a..ed631b082b75 100644 --- a/vcl/osx/salprn.cxx +++ b/vcl/osx/salprn.cxx @@ -448,7 +448,7 @@ bool AquaSalInfoPrinter::StartJob( const OUString* i_pFileName, // information (e.g. brochure printing scales to the found paper size) // also SetPaperSizeUser has the advantage that we can share a // platform independent paper matching algorithm - std::shared_ptr<Printer> pPrinter( i_rController.getPrinter() ); + VclPtr<Printer> pPrinter( i_rController.getPrinter() ); pPrinter->SetMapMode( MapMode( MAP_100TH_MM ) ); pPrinter->SetPaperSizeUser( aCurSize, true ); diff --git a/vcl/qa/cppunit/complextext.cxx b/vcl/qa/cppunit/complextext.cxx index a6330e4880c8..0c666c356a93 100644 --- a/vcl/qa/cppunit/complextext.cxx +++ b/vcl/qa/cppunit/complextext.cxx @@ -43,10 +43,10 @@ void VclComplexTextTest::testArabic() OUString aOneTwoThree( reinterpret_cast<char const *>(pOneTwoThreeUTF8), SAL_N_ELEMENTS( pOneTwoThreeUTF8 ) - 1, RTL_TEXTENCODING_UTF8 ); - vcl::Window* pWin = new WorkWindow( (vcl::Window *)NULL ); - CPPUNIT_ASSERT( pWin != NULL ); + VclPtr<vcl::Window> pWin = VclPtr<WorkWindow>::Create( (vcl::Window *)nullptr ); + CPPUNIT_ASSERT( pWin ); - OutputDevice *pOutDev = static_cast< OutputDevice * >( pWin ); + OutputDevice *pOutDev = static_cast< OutputDevice * >( pWin.get() ); vcl::Font aFont = OutputDevice::GetDefaultFont( DEFAULTFONT_CTL_SPREADSHEET, diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx new file mode 100644 index 000000000000..4a0bebff8d0c --- /dev/null +++ b/vcl/qa/cppunit/lifecycle.cxx @@ -0,0 +1,150 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <unotest/filters-test.hxx> +#include <test/bootstrapfixture.hxx> + +#include <vcl/wrkwin.hxx> +#include <vcl/button.hxx> +#include <vcl/edit.hxx> +#include <vcl/combobox.hxx> +#include <vcl/field.hxx> +#include <vcl/virdev.hxx> + +class LifecycleTest : public test::BootstrapFixture +{ + void testWidgets(vcl::Window *pParent); + +public: + LifecycleTest() : BootstrapFixture(true, false) {} + + void testCast(); + void testVirtualDevice(); + void testMultiDispose(); + void testIsolatedWidgets(); + void testParentedWidgets(); + void testChildDispose(); + void testPostDispose(); + + CPPUNIT_TEST_SUITE(LifecycleTest); + CPPUNIT_TEST(testCast); + CPPUNIT_TEST(testVirtualDevice); + CPPUNIT_TEST(testMultiDispose); + CPPUNIT_TEST(testIsolatedWidgets); + CPPUNIT_TEST(testParentedWidgets); + CPPUNIT_TEST(testChildDispose); + CPPUNIT_TEST(testPostDispose); + CPPUNIT_TEST_SUITE_END(); +}; + +// A compile time sanity check +void LifecycleTest::testCast() +{ + ScopedVclPtrInstance< PushButton > xButton( nullptr, 0 ); + ScopedVclPtr<vcl::Window> xWindow(xButton); + + ScopedVclPtrInstance< MetricField > xField( nullptr, 0 ); + ScopedVclPtr<SpinField> xSpin(xField); + ScopedVclPtr<Edit> xEdit(xField); + +// the following line should NOT compile +// VclPtr<PushButton> xButton2(xWindow); +} + +void LifecycleTest::testVirtualDevice() +{ + VclPtr<VirtualDevice> pVDev = VclPtr< VirtualDevice >::Create(); + ScopedVclPtrInstance< VirtualDevice > pVDev2; + VclPtrInstance<VirtualDevice> pVDev3; + VclPtrInstance<VirtualDevice> pVDev4( 1 ); + CPPUNIT_ASSERT(!!pVDev && !!pVDev2 && !!pVDev3 && !!pVDev4); +} + +void LifecycleTest::testMultiDispose() +{ + VclPtrInstance<WorkWindow> xWin(nullptr, WB_APP|WB_STDWORK); + CPPUNIT_ASSERT(xWin.get() != NULL); + xWin->disposeOnce(); + xWin->disposeOnce(); + xWin->disposeOnce(); + CPPUNIT_ASSERT(xWin->GetWindow(0) == NULL); + CPPUNIT_ASSERT(xWin->GetChild(0) == NULL); + CPPUNIT_ASSERT(xWin->GetChildCount() == 0); +} + +void LifecycleTest::testWidgets(vcl::Window *pParent) +{ + { ScopedVclPtrInstance< PushButton > aPtr( pParent ); } + { ScopedVclPtrInstance< OKButton > aPtr( pParent ); } + { ScopedVclPtrInstance< CancelButton > aPtr( pParent ); } + { ScopedVclPtrInstance< HelpButton > aPtr( pParent ); } + + // Some widgets really insist on adoption. + if (pParent) + { + { ScopedVclPtrInstance< CheckBox > aPtr( pParent ); } + { ScopedVclPtrInstance< Edit > aPtr( pParent ); } + { ScopedVclPtrInstance< ComboBox > aPtr( pParent ); } + { ScopedVclPtrInstance< RadioButton > aPtr( pParent ); } + } +} + +void LifecycleTest::testIsolatedWidgets() +{ + testWidgets(NULL); +} + +void LifecycleTest::testParentedWidgets() +{ + ScopedVclPtrInstance<WorkWindow> xWin(nullptr, WB_APP|WB_STDWORK); + CPPUNIT_ASSERT(xWin.get() != NULL); + xWin->Show(); + testWidgets(xWin); +} + +class DisposableChild : public vcl::Window +{ +public: + DisposableChild(vcl::Window *pParent) : vcl::Window(pParent) {} + virtual ~DisposableChild() + { + disposeOnce(); + } +}; + +void LifecycleTest::testChildDispose() +{ + VclPtrInstance<WorkWindow> xWin(nullptr, WB_APP|WB_STDWORK); + CPPUNIT_ASSERT(xWin.get() != NULL); + VclPtrInstance< DisposableChild > xChild( xWin.get() ); + xWin->Show(); + xChild->disposeOnce(); + xWin->disposeOnce(); +} + +void LifecycleTest::testPostDispose() +{ + VclPtrInstance<WorkWindow> xWin(nullptr, WB_APP|WB_STDWORK); + xWin->disposeOnce(); + + // check selected methods continue to work post-dispose + CPPUNIT_ASSERT(!xWin->GetParent()); + xWin->Show(); + CPPUNIT_ASSERT(!xWin->IsReallyShown()); + CPPUNIT_ASSERT(!xWin->IsEnabled()); + CPPUNIT_ASSERT(!xWin->IsInputEnabled()); + CPPUNIT_ASSERT(!xWin->GetChild(0)); + CPPUNIT_ASSERT(!xWin->GetWindow(0)); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(LifecycleTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qa/cppunit/outdev.cxx b/vcl/qa/cppunit/outdev.cxx index 6ee359320931..a32ee7d3fd94 100644 --- a/vcl/qa/cppunit/outdev.cxx +++ b/vcl/qa/cppunit/outdev.cxx @@ -32,17 +32,17 @@ public: void VclOutdevTest::testVirtualDevice() { - VirtualDevice aVDev; - aVDev.SetOutputSizePixel(Size(32,32)); - aVDev.SetBackground(Wallpaper(COL_WHITE)); - aVDev.Erase(); - aVDev.DrawPixel(Point(1,2),COL_BLUE); - aVDev.DrawPixel(Point(31,30),COL_RED); - - Size aSize = aVDev.GetOutputSizePixel(); + ScopedVclPtrInstance< VirtualDevice > pVDev; + pVDev->SetOutputSizePixel(Size(32,32)); + pVDev->SetBackground(Wallpaper(COL_WHITE)); + pVDev->Erase(); + pVDev->DrawPixel(Point(1,2),COL_BLUE); + pVDev->DrawPixel(Point(31,30),COL_RED); + + Size aSize = pVDev->GetOutputSizePixel(); CPPUNIT_ASSERT(aSize == Size(32,32)); - Bitmap aBmp = aVDev.GetBitmap(Point(),aSize); + Bitmap aBmp = pVDev->GetBitmap(Point(),aSize); #if 0 OUString rFileName("/tmp/foo-unx.png"); @@ -56,12 +56,12 @@ void VclOutdevTest::testVirtualDevice() } #endif - CPPUNIT_ASSERT_EQUAL(COL_WHITE, aVDev.GetPixel(Point(0,0)).GetColor()); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, pVDev->GetPixel(Point(0,0)).GetColor()); #if defined LINUX //TODO: various failures on Mac and Windows tinderboxes - CPPUNIT_ASSERT_EQUAL(COL_BLUE, aVDev.GetPixel(Point(1,2)).GetColor()); - CPPUNIT_ASSERT_EQUAL(COL_RED, aVDev.GetPixel(Point(31,30)).GetColor()); + CPPUNIT_ASSERT_EQUAL(COL_BLUE, pVDev->GetPixel(Point(1,2)).GetColor()); + CPPUNIT_ASSERT_EQUAL(COL_RED, pVDev->GetPixel(Point(31,30)).GetColor()); #endif - CPPUNIT_ASSERT_EQUAL(COL_WHITE, aVDev.GetPixel(Point(30,31)).GetColor()); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, pVDev->GetPixel(Point(30,31)).GetColor()); // Gotcha: y and x swap for BitmapReadAccess: deep joy. Bitmap::ScopedReadAccess pAcc(aBmp); @@ -73,8 +73,8 @@ void VclOutdevTest::testVirtualDevice() CPPUNIT_ASSERT_EQUAL(COL_WHITE, Color(pAcc->GetPixel(31,30)).GetColor()); #if 0 - vcl::Window* pWin = new WorkWindow( (vcl::Window *)NULL ); - CPPUNIT_ASSERT( pWin != NULL ); + VclPtr<vcl::Window> pWin = VclPtr<WorkWindow>::Create( (vcl::Window *)nullptr ); + CPPUNIT_ASSERT( pWin ); OutputDevice *pOutDev = static_cast< OutputDevice * >( pWin ); #endif } diff --git a/vcl/quartz/cairo_quartz_cairo.cxx b/vcl/quartz/cairo_quartz_cairo.cxx index b3a05541c438..0b0835c8fb05 100644 --- a/vcl/quartz/cairo_quartz_cairo.cxx +++ b/vcl/quartz/cairo_quartz_cairo.cxx @@ -244,13 +244,13 @@ namespace cairo * * @return The new virtual device **/ - boost::shared_ptr<VirtualDevice> QuartzSurface::createVirtualDevice() const + VclPtr<VirtualDevice> QuartzSurface::createVirtualDevice() const { SystemGraphicsData aSystemGraphicsData; aSystemGraphicsData.nSize = sizeof(SystemGraphicsData); aSystemGraphicsData.rCGContext = getCGContext(); - return boost::shared_ptr<VirtualDevice>( - new VirtualDevice( &aSystemGraphicsData, Size(1, 1), getDepth() )); + return VclPtr<VirtualDevice>( + VclPtr<VirtualDevice>::Create( &aSystemGraphicsData, Size(1, 1), getDepth() )); } } // namespace cairo diff --git a/vcl/quartz/cairo_quartz_cairo.hxx b/vcl/quartz/cairo_quartz_cairo.hxx index a3f94d20abf3..9c31c42c6ab9 100644 --- a/vcl/quartz/cairo_quartz_cairo.hxx +++ b/vcl/quartz/cairo_quartz_cairo.hxx @@ -55,7 +55,7 @@ namespace cairo { virtual CairoSurfaceSharedPtr getCairoSurface() const { return mpSurface; } virtual SurfaceSharedPtr getSimilar( Content aContent, int width, int height ) const; - virtual boost::shared_ptr<VirtualDevice> createVirtualDevice() const; + virtual VclPtr<VirtualDevice> createVirtualDevice() const; virtual void flush() const; diff --git a/vcl/source/app/dbggui.cxx b/vcl/source/app/dbggui.cxx index 1c643f241176..e8d27ae769eb 100644 --- a/vcl/source/app/dbggui.cxx +++ b/vcl/source/app/dbggui.cxx @@ -207,98 +207,104 @@ NULL class DbgInfoDialog : public ModalDialog { private: - ListBox maListBox; - OKButton maOKButton; - bool mbHelpText; + VclPtr<ListBox> maListBox; + VclPtr<OKButton> maOKButton; + bool mbHelpText; public: DbgInfoDialog( vcl::Window* pParent, bool bHelpText = false ); void SetInfoText( const OUString& rStr ); +private: + virtual void dispose() SAL_OVERRIDE; + virtual ~DbgInfoDialog() { disposeOnce(); } }; class DbgDialog : public ModalDialog { private: - CheckBox maRes; - CheckBox maDialog; - CheckBox maBoldAppFont; - GroupBox maBox3; + VclPtr<CheckBox> maRes; + VclPtr<CheckBox> maDialog; + VclPtr<CheckBox> maBoldAppFont; + VclPtr<GroupBox> maBox3; - OKButton maOKButton; - CancelButton maCancelButton; - HelpButton maHelpButton; + VclPtr<OKButton> maOKButton; + VclPtr<CancelButton> maCancelButton; + VclPtr<HelpButton> maHelpButton; public: DbgDialog(); DECL_LINK( ClickHdl, Button* ); void RequestHelp( const HelpEvent& rHEvt ) SAL_OVERRIDE; +private: + virtual void dispose() SAL_OVERRIDE; + virtual ~DbgDialog() { disposeOnce(); } }; DbgDialog::DbgDialog() : ModalDialog( NULL, WB_STDMODAL | WB_SYSTEMWINDOW ), - maRes( this ), - maDialog( this ), - maBoldAppFont( this ), - maBox3( this ), - maOKButton( this, WB_DEFBUTTON ), - maCancelButton( this ), - maHelpButton( this ) + maRes(VclPtr<CheckBox>::Create(this)), + maDialog(VclPtr<CheckBox>::Create(this)), + maBoldAppFont(VclPtr<CheckBox>::Create(this)), + maBox3(VclPtr<GroupBox>::Create(this)), + maOKButton(VclPtr<OKButton>::Create(this, WB_DEFBUTTON)), + maCancelButton(VclPtr<CancelButton>::Create(this)), + maHelpButton(VclPtr<HelpButton>::Create(this)) { DbgData* pData = DbgGetData(); MapMode aAppMap( MAP_APPFONT ); Size aButtonSize = LogicToPixel( Size( 60, 12 ), aAppMap ); { - maRes.Show(); - maRes.SetText("~Resourcen"); + maRes->Show(); + maRes->SetText("~Resourcen"); if ( pData->nTestFlags & DBG_TEST_RESOURCE ) - maRes.Check( true ); - maRes.SetPosSizePixel( LogicToPixel( Point( 75, 95 ), aAppMap ), + maRes->Check( true ); + maRes->SetPosSizePixel( LogicToPixel( Point( 75, 95 ), aAppMap ), aButtonSize ); } { - maDialog.Show(); - maDialog.SetText("~Dialog"); + maDialog->Show(); + maDialog->SetText("~Dialog"); if ( pData->nTestFlags & DBG_TEST_DIALOG ) - maDialog.Check( true ); - maDialog.SetPosSizePixel( LogicToPixel( Point( 140, 95 ), aAppMap ), + maDialog->Check( true ); + maDialog->SetPosSizePixel( LogicToPixel( Point( 140, 95 ), aAppMap ), aButtonSize ); } { - maBoldAppFont.Show(); - maBoldAppFont.SetText("~Bold AppFont"); + maBoldAppFont->Show(); + maBoldAppFont->SetText("~Bold AppFont"); if ( pData->nTestFlags & DBG_TEST_BOLDAPPFONT ) - maBoldAppFont.Check( true ); - maBoldAppFont.SetPosSizePixel( LogicToPixel( Point( 205, 95 ), aAppMap ), + maBoldAppFont->Check( true ); + maBoldAppFont->SetPosSizePixel( LogicToPixel( Point( 205, 95 ), aAppMap ), aButtonSize ); - maBoldAppFont.SaveValue(); + maBoldAppFont->SaveValue(); } { - maBox3.Show(); - maBox3.SetText("Test Options"); - maBox3.SetPosSizePixel( LogicToPixel( Point( 5, 85 ), aAppMap ), + maBox3->Show(); + maBox3->SetText("Test Options"); + maBox3->SetPosSizePixel( LogicToPixel( Point( 5, 85 ), aAppMap ), LogicToPixel( Size( 330, 30 ), aAppMap ) ); } { - maOKButton.Show(); - maOKButton.SetClickHdl( LINK( this, DbgDialog, ClickHdl ) ); - maOKButton.SetPosSizePixel( LogicToPixel( Point( 10, 260 ), aAppMap ), + maOKButton->Show(); + maOKButton->SetClickHdl( LINK( this, DbgDialog, ClickHdl ) ); + maOKButton->SetPosSizePixel( LogicToPixel( Point( 10, 260 ), aAppMap ), LogicToPixel( Size( 50, 15 ), aAppMap ) ); } { - maCancelButton.Show(); - maCancelButton.SetPosSizePixel( LogicToPixel( Point( 70, 260 ), aAppMap ), + maCancelButton->Show(); + maCancelButton->SetPosSizePixel( LogicToPixel( Point( 70, 260 ), aAppMap ), LogicToPixel( Size( 50, 15 ), aAppMap ) ); } { - maHelpButton.Show(); - maHelpButton.SetPosSizePixel( LogicToPixel( Point( 190, 260 ), aAppMap ), + maHelpButton->Show(); + maHelpButton->SetPosSizePixel( LogicToPixel( Point( 190, 260 ), aAppMap ), LogicToPixel( Size( 50, 15 ), aAppMap ) ); } @@ -310,20 +316,20 @@ DbgDialog::DbgDialog() : IMPL_LINK( DbgDialog, ClickHdl, Button*, pButton ) { - if ( pButton == &maOKButton ) + if ( pButton == maOKButton ) { DbgData aData; memcpy( &aData, DbgGetData(), sizeof( DbgData ) ); aData.nTestFlags = 0; - if ( maRes.IsChecked() ) + if ( maRes->IsChecked() ) aData.nTestFlags |= DBG_TEST_RESOURCE; - if ( maDialog.IsChecked() ) + if ( maDialog->IsChecked() ) aData.nTestFlags |= DBG_TEST_DIALOG; - if ( maBoldAppFont.IsChecked() ) + if ( maBoldAppFont->IsChecked() ) aData.nTestFlags |= DBG_TEST_BOLDAPPFONT; // Daten speichern @@ -333,12 +339,12 @@ IMPL_LINK( DbgDialog, ClickHdl, Button*, pButton ) #define IMMEDIATE_FLAGS (DBG_TEST_RESOURCE | DBG_TEST_DIALOG | DBG_TEST_BOLDAPPFONT) pData->nTestFlags &= ~IMMEDIATE_FLAGS; pData->nTestFlags |= aData.nTestFlags & IMMEDIATE_FLAGS; - if ( maBoldAppFont.IsValueChangedFromSaved() ) + if ( maBoldAppFont->IsValueChangedFromSaved() ) { AllSettings aSettings = Application::GetSettings(); StyleSettings aStyleSettings = aSettings.GetStyleSettings(); vcl::Font aFont = aStyleSettings.GetAppFont(); - if ( maBoldAppFont.IsChecked() ) + if ( maBoldAppFont->IsChecked() ) aFont.SetWeight( WEIGHT_BOLD ); else aFont.SetWeight( WEIGHT_NORMAL ); @@ -348,10 +354,10 @@ IMPL_LINK( DbgDialog, ClickHdl, Button*, pButton ) } if( (aData.nTestFlags & ~IMMEDIATE_FLAGS) != (pData->nTestFlags & ~IMMEDIATE_FLAGS) ) { - MessageDialog aBox(this, OUString( + ScopedVclPtrInstance<MessageDialog> aBox(this, OUString( "Some of the changed settings will only be active after " "restarting the process"), VCL_MESSAGE_INFO); - aBox.Execute(); + aBox->Execute(); } EndDialog( RET_OK ); } @@ -363,7 +369,7 @@ void DbgDialog::RequestHelp( const HelpEvent& rHEvt ) { if ( rHEvt.GetMode() & HelpEventMode::CONTEXT ) { - DbgInfoDialog aInfoDialog( this, true ); + ScopedVclPtrInstance< DbgInfoDialog > aInfoDialog( this, true ); OUString aHelpText; const sal_Char** pHelpStrs = pDbgHelpText; while ( *pHelpStrs ) @@ -371,16 +377,28 @@ void DbgDialog::RequestHelp( const HelpEvent& rHEvt ) aHelpText += OUString::createFromAscii(*pHelpStrs); pHelpStrs++; } - aInfoDialog.SetText( "Debug Hilfe" ); - aInfoDialog.SetInfoText( aHelpText ); - aInfoDialog.Execute(); + aInfoDialog->SetText( "Debug Hilfe" ); + aInfoDialog->SetInfoText( aHelpText ); + aInfoDialog->Execute(); } } +void DbgDialog::dispose() +{ + maRes.disposeAndClear(); + maDialog.disposeAndClear(); + maBoldAppFont.disposeAndClear(); + maBox3.disposeAndClear(); + maOKButton.disposeAndClear(); + maCancelButton.disposeAndClear(); + maHelpButton.disposeAndClear(); + ModalDialog::dispose(); +} + DbgInfoDialog::DbgInfoDialog( vcl::Window* pParent, bool bHelpText ) : ModalDialog( pParent, WB_STDMODAL ), - maListBox( this, WB_BORDER | WB_AUTOHSCROLL ), - maOKButton( this, WB_DEFBUTTON ) + maListBox(VclPtr<ListBox>::Create( this, WB_BORDER | WB_AUTOHSCROLL )), + maOKButton(VclPtr<OKButton>::Create(this, WB_DEFBUTTON)) { mbHelpText = bHelpText; @@ -389,21 +407,21 @@ DbgInfoDialog::DbgInfoDialog( vcl::Window* pParent, bool bHelpText ) : vcl::Font aFont = GetDefaultFont( DEFAULTFONT_FIXED, LANGUAGE_ENGLISH_US, 0 ); aFont.SetHeight( 8 ); aFont.SetPitch( PITCH_FIXED ); - maListBox.SetControlFont( aFont ); + maListBox->SetControlFont( aFont ); } - maListBox.SetPosSizePixel( Point( 5, 5 ), Size( 630, 380 ) ); - maListBox.Show(); + maListBox->SetPosSizePixel( Point( 5, 5 ), Size( 630, 380 ) ); + maListBox->Show(); - maOKButton.SetPosSizePixel( Point( 290, 390 ), Size( 60, 25 ) ); - maOKButton.Show(); + maOKButton->SetPosSizePixel( Point( 290, 390 ), Size( 60, 25 ) ); + maOKButton->Show(); SetOutputSizePixel( Size( 640, 420 ) ); } void DbgInfoDialog::SetInfoText( const OUString& rStr ) { - maListBox.SetUpdateMode( false ); - maListBox.Clear(); + maListBox->SetUpdateMode( false ); + maListBox->Clear(); OUString aStr = convertLineEnd(rStr, LINEEND_LF); sal_Int32 nStrIndex = 0; sal_Int32 nFoundIndex; @@ -413,18 +431,18 @@ void DbgInfoDialog::SetInfoText( const OUString& rStr ) OUString aTextParagraph = aStr.copy( nStrIndex, nFoundIndex-nStrIndex ); if ( mbHelpText ) { - long nMaxWidth = maListBox.GetOutputSizePixel().Width()-30; + long nMaxWidth = maListBox->GetOutputSizePixel().Width()-30; sal_Int32 nLastIndex = 0; sal_Int32 nIndex = aTextParagraph.indexOf( ' ' ); while ( nIndex != -1 ) { - if ( maListBox.GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth ) + if ( maListBox->GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth ) { if ( !nLastIndex ) nLastIndex = nIndex+1; OUString aTempStr = aTextParagraph.copy( 0, nLastIndex ); aTextParagraph = aTextParagraph.replaceAt( 0, nLastIndex, "" ); - maListBox.InsertEntry( aTempStr ); + maListBox->InsertEntry( aTempStr ); nLastIndex = 0; } else @@ -432,20 +450,27 @@ void DbgInfoDialog::SetInfoText( const OUString& rStr ) nIndex = aTextParagraph.indexOf( ' ', nLastIndex ); } - if ( maListBox.GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth ) + if ( maListBox->GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth ) { if ( !nLastIndex ) nLastIndex = nIndex+1; OUString aTempStr = aTextParagraph.copy( 0, nLastIndex ); aTextParagraph = aTextParagraph.replaceAt( 0, nLastIndex, "" ); - maListBox.InsertEntry( aTempStr ); + maListBox->InsertEntry( aTempStr ); } } - maListBox.InsertEntry( aTextParagraph ); + maListBox->InsertEntry( aTextParagraph ); nStrIndex = nFoundIndex+1; } while ( nFoundIndex != -1 ); - maListBox.SetUpdateMode( true ); + maListBox->SetUpdateMode( true ); +} + +void DbgInfoDialog::dispose() +{ + maListBox.disposeAndClear(); + maOKButton.disposeAndClear(); + ModalDialog::dispose(); } void DbgDialogTest( vcl::Window* pWindow ) @@ -808,7 +833,7 @@ void DbgGUIStart() if ( pData ) { - std::unique_ptr<DbgDialog> xDialog(new DbgDialog); + ScopedVclPtrInstance< DbgDialog > xDialog; // we switch off dialog tests for the debug dialog sal_uLong nOldFlags = pData->nTestFlags; pData->nTestFlags &= ~DBG_TEST_DIALOG; diff --git a/vcl/source/app/help.cxx b/vcl/source/app/help.cxx index 53ebd746a3f6..2f52375d1e02 100644 --- a/vcl/source/app/help.cxx +++ b/vcl/source/app/help.cxx @@ -204,9 +204,9 @@ sal_uIntPtr Help::ShowTip( vcl::Window* pParent, const Rectangle& rScreenRect, const OUString& rText, sal_uInt16 nStyle ) { sal_uInt16 nHelpWinStyle = ( ( nStyle & QUICKHELP_TIP_STYLE_BALLOON ) != 0 ) ? HELPWINSTYLE_BALLOON : HELPWINSTYLE_QUICK; - HelpTextWindow* pHelpWin = new HelpTextWindow( pParent, rText, nHelpWinStyle, nStyle ); + VclPtrInstance<HelpTextWindow> pHelpWin( pParent, rText, nHelpWinStyle, nStyle ); - sal_uIntPtr nId = reinterpret_cast< sal_uIntPtr >( pHelpWin ); + sal_uIntPtr nId = reinterpret_cast< sal_uIntPtr >( pHelpWin.get() ); UpdateTip( nId, pParent, rScreenRect, rText ); pHelpWin->ShowHelp( HELPDELAY_NONE ); @@ -229,12 +229,12 @@ void Help::UpdateTip( sal_uIntPtr nId, vcl::Window* pParent, const Rectangle& rS void Help::HideTip( sal_uLong nId ) { - HelpTextWindow* pHelpWin = reinterpret_cast<HelpTextWindow*>(nId); + VclPtr<HelpTextWindow> pHelpWin = reinterpret_cast<HelpTextWindow*>(nId); vcl::Window* pFrameWindow = pHelpWin->ImplGetFrameWindow(); pHelpWin->Hide(); // trigger update, so that a Paint is instantly triggered since we do not save the background pFrameWindow->ImplUpdateAll(); - delete pHelpWin; + pHelpWin.disposeAndClear(); ImplGetSVData()->maHelpData.mnLastHelpHideTime = tools::Time::GetSystemTicks(); } @@ -290,11 +290,17 @@ HelpTextWindow::HelpTextWindow( vcl::Window* pParent, const OUString& rText, sal HelpTextWindow::~HelpTextWindow() { + disposeOnce(); +} + +void HelpTextWindow::dispose() +{ maShowTimer.Stop(); maHideTimer.Stop(); if( this == ImplGetSVData()->maHelpData.mpHelpWin ) ImplGetSVData()->maHelpData.mpHelpWin = NULL; + FloatingWindow::dispose(); } void HelpTextWindow::SetHelpText( const OUString& rHelpText ) @@ -524,7 +530,7 @@ void ImplShowHelpWindow( vcl::Window* pParent, sal_uInt16 nHelpWinStyle, sal_uIn nDelayMode = HELPDELAY_NONE; DBG_ASSERT( !pHelpWin, "Noch ein HelpWin ?!" ); - pHelpWin = new HelpTextWindow( pParent, rHelpText, nHelpWinStyle, nStyle ); + pHelpWin = VclPtr<HelpTextWindow>::Create( pParent, rHelpText, nHelpWinStyle, nStyle ); pSVData->maHelpData.mpHelpWin = pHelpWin; pHelpWin->SetStatusText( rStatusText ); if ( pHelpArea ) @@ -544,7 +550,7 @@ void ImplShowHelpWindow( vcl::Window* pParent, sal_uInt16 nHelpWinStyle, sal_uIn void ImplDestroyHelpWindow( bool bUpdateHideTime ) { ImplSVData* pSVData = ImplGetSVData(); - HelpTextWindow* pHelpWin = pSVData->maHelpData.mpHelpWin; + VclPtr<HelpTextWindow> pHelpWin = pSVData->maHelpData.mpHelpWin; if ( pHelpWin ) { vcl::Window * pWindow = pHelpWin->GetParent()->ImplGetFrameWindow(); @@ -555,7 +561,7 @@ void ImplDestroyHelpWindow( bool bUpdateHideTime ) pSVData->maHelpData.mpHelpWin = NULL; pSVData->maHelpData.mbKeyboardHelp = false; pHelpWin->Hide(); - delete pHelpWin; + pHelpWin.disposeAndClear(); if( bUpdateHideTime ) pSVData->maHelpData.mnLastHelpHideTime = tools::Time::GetSystemTicks(); } diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index a0447312a778..e05b73480148 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -28,6 +28,9 @@ #include <salobj.hxx> #include <salmenu.hxx> + +SalFrame::SalFrame() : m_pWindow( NULL ), m_pProc( NULL ) {} + // this file contains the virtual destructors of the sal interface // compilers usually put their vtables where the destructor is @@ -35,6 +38,12 @@ SalFrame::~SalFrame() { } +void SalFrame::SetCallback( vcl::Window* pWindow, SALFRAMEPROC pProc ) +{ + m_pWindow = pWindow; + m_pProc = pProc; +} + // default to full-frame flushes // on ports where partial-flushes are much cheaper this method should be overridden void SalFrame::Flush( const Rectangle& ) diff --git a/vcl/source/app/stdtext.cxx b/vcl/source/app/stdtext.cxx index 8093a6fe6900..fcf7b9d129c7 100644 --- a/vcl/source/app/stdtext.cxx +++ b/vcl/source/app/stdtext.cxx @@ -39,8 +39,8 @@ void ShowServiceNotAvailableError(vcl::Window* pParent, { OUString aText = GetStandardText(STANDARD_TEXT_SERVICE_NOT_AVAILABLE). replaceAll("%s", rServiceName); - MessageDialog aBox(pParent, aText, bError ? VCL_MESSAGE_ERROR : VCL_MESSAGE_WARNING); - aBox.Execute(); + ScopedVclPtrInstance< MessageDialog > aBox( pParent, aText, bError ? VCL_MESSAGE_ERROR : VCL_MESSAGE_WARNING ); + aBox->Execute(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 3d22d7cf5621..7859ccc370c4 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -156,28 +156,28 @@ struct ImplEventHook struct ImplPostEventData { sal_uLong mnEvent; - const vcl::Window* mpWin; + VclPtr<vcl::Window> mpWin; ImplSVEvent * mnEventId; KeyEvent maKeyEvent; MouseEvent maMouseEvent; ZoomEvent maZoomEvent; ScrollEvent maScrollEvent; - ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const KeyEvent& rKeyEvent ) : + ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const KeyEvent& rKeyEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {} - ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const MouseEvent& rMouseEvent ) : + ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const MouseEvent& rMouseEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {} #if !HAVE_FEATURE_DESKTOP - ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const ZoomEvent& rZoomEvent ) : + ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const ZoomEvent& rZoomEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maZoomEvent( rZoomEvent ) {} - ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const ScrollEvent& rScrollEvent ) : + ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const ScrollEvent& rScrollEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maScrollEvent( rScrollEvent ) {} #endif ~ImplPostEventData() {} }; -typedef ::std::pair< vcl::Window*, ImplPostEventData* > ImplPostEventPair; +typedef ::std::pair< VclPtr<vcl::Window>, ImplPostEventData* > ImplPostEventPair; static ::std::list< ImplPostEventPair > aPostedEventList; @@ -855,8 +855,8 @@ IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData ) break; }; - if( pData->mpWin && pData->mpWin->mpWindowImpl->mpFrameWindow && pEventData ) - ImplWindowFrameProc( pData->mpWin->mpWindowImpl->mpFrameWindow, NULL, (sal_uInt16) nEvent, pEventData ); + if( pData->mpWin && pData->mpWin.get()->mpWindowImpl->mpFrameWindow.get() && pEventData ) + ImplWindowFrameProc( pData->mpWin.get()->mpWindowImpl->mpFrameWindow.get(), NULL, (sal_uInt16) nEvent, pEventData ); // remove this event from list of posted events, watch for destruction of internal data ::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() ); @@ -1010,7 +1010,7 @@ long Application::GetTopWindowCount() { long nRet = 0; ImplSVData* pSVData = ImplGetSVData(); - vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame : NULL; + vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame.get() : NULL; while( pWin ) { if( pWin->ImplGetWindow()->IsTopWindow() ) @@ -1024,7 +1024,7 @@ vcl::Window* Application::GetTopWindow( long nIndex ) { long nIdx = 0; ImplSVData* pSVData = ImplGetSVData(); - vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame : NULL; + vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame.get() : NULL; while( pWin ) { if( pWin->ImplGetWindow()->IsTopWindow() ) @@ -1268,7 +1268,7 @@ vcl::Window* Application::GetDefDialogParent() // #103442# find some useful dialog parent if there // was no default set // NOTE: currently even the default is not used - if( false && pSVData->maWinData.mpDefDialogParent != NULL ) + if( false && pSVData->maWinData.mpDefDialogParent.get() != NULL ) return pSVData->maWinData.mpDefDialogParent; else { @@ -1629,11 +1629,24 @@ void Application::setDeInitHook(Link const & hook) { pSVData->maAppData.mbInAppMain = true; } +ImplDelData::ImplDelData( vcl::Window* pWindow ) : + mpNext( NULL ), + mpWindow( NULL ), + mbDel( false ) +{ + if( pWindow ) AttachToWindow( pWindow ); +} + // helper method to allow inline constructor even for pWindow!=NULL case void ImplDelData::AttachToWindow( const vcl::Window* pWindow ) { if( pWindow ) - const_cast<vcl::Window*>(pWindow)->ImplAddDel( this ); + { + if( pWindow->IsDisposed() ) + mbDel = true; + else + const_cast<vcl::Window*>(pWindow)->ImplAddDel( this ); + } } // define dtor for ImplDelData @@ -1644,7 +1657,7 @@ ImplDelData::~ImplDelData() if( !mbDel && mpWindow ) { // the window still exists but we were not removed - const_cast<vcl::Window*>(mpWindow)->ImplRemoveDel( this ); + const_cast<vcl::Window*>(mpWindow.get())->ImplRemoveDel( this ); mpWindow = NULL; } } diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx index 155b5cc0ba3c..14cf94de9dd2 100644 --- a/vcl/source/app/svdata.cxx +++ b/vcl/source/app/svdata.cxx @@ -37,6 +37,8 @@ #include "vcl/layout.hxx" #include "vcl/button.hxx" #include "vcl/dockwin.hxx" +#include "vcl/print.hxx" +#include "vcl/virdev.hxx" #include "salinst.hxx" #include "salframe.hxx" #include "salgdi.hxx" @@ -45,6 +47,8 @@ #include "salimestatus.hxx" #include "salsys.hxx" #include "svids.hrc" +#include "helpwin.hxx" +#include "../window/scrwnd.hxx" #include "com/sun/star/accessibility/MSAAService.hpp" @@ -84,6 +88,14 @@ ImplSVData::ImplSVData() maNWFData.maMenuBarHighlightTextColor = Color( COL_TRANSPARENT ); } +ImplSVGDIData::~ImplSVGDIData() +{ + // FIXME: deliberately leak any remaining OutputDevice + // until we have their pGraphics reference counted, doing + // any disposes so late in shutdown is rather unsafe. + memset( this, 0, sizeof( ImplSVGDIData ) ); +} + void ImplDeInitSVData() { ImplSVData* pSVData = ImplGetSVData(); @@ -124,7 +136,7 @@ vcl::Window* ImplGetDefaultWindow() if ( !pSVData->mpDefaultWin && !pSVData->mbDeInit ) { DBG_WARNING( "ImplGetDefaultWindow(): No AppWindow" ); - pSVData->mpDefaultWin = new WorkWindow( 0, WB_DEFAULTWIN ); + pSVData->mpDefaultWin = VclPtr<WorkWindow>::Create( nullptr, WB_DEFAULTWIN ); pSVData->mpDefaultWin->SetText( OUString( "VCL ImplGetDefaultWindow" ) ); // Add a reference to the default context so it never gets deleted @@ -160,8 +172,8 @@ ResMgr* ImplGetResMgr() "Missing vcl resource. This indicates that files vital to localization are missing. " "You might have a corrupt installation."; fprintf( stderr, "%s\n", pMsg ); - MessageDialog aBox(NULL, OUString(pMsg, strlen(pMsg), RTL_TEXTENCODING_ASCII_US)); - aBox.Execute(); + ScopedVclPtrInstance< MessageDialog > aBox( nullptr, OUString(pMsg, strlen(pMsg), RTL_TEXTENCODING_ASCII_US) ); + aBox->Execute(); } } return pSVData->mpResMgr; diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index a80d576c1987..fce2961c2c53 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -423,11 +423,7 @@ void DeInitVCL() delete pSVData->maCtrlData.mpDisclosureMinus; pSVData->maCtrlData.mpDisclosureMinus = NULL; } - if ( pSVData->mpDefaultWin ) - { - delete pSVData->mpDefaultWin; - pSVData->mpDefaultWin = NULL; - } + pSVData->mpDefaultWin.disposeAndClear(); DBGGUI_DEINIT_SOLARMUTEXCHECK(); diff --git a/vcl/source/app/vclevent.cxx b/vcl/source/app/vclevent.cxx index 11d03e3f8b03..325c9b659b18 100644 --- a/vcl/source/app/vclevent.cxx +++ b/vcl/source/app/vclevent.cxx @@ -18,6 +18,7 @@ */ #include "vcl/vclevent.hxx" +#include "vcl/window.hxx" #include "svdata.hxx" @@ -158,4 +159,12 @@ void VclEventListeners2::callListeners( VclSimpleEvent* i_pEvent ) m_aIterators.pop_back(); } + +VclWindowEvent::VclWindowEvent( vcl::Window* pWin, sal_uLong n, void* pDat ) : VclSimpleEvent(n) +{ + pWindow = pWin; pData = pDat; +} + +VclWindowEvent::~VclWindowEvent() {} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index 09abe44f5f80..bf23b10fb9d4 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -88,14 +88,19 @@ ImplCommonButtonData::~ImplCommonButtonData() } Button::Button( WindowType nType ) : - Control( nType ) + Control( nType ), + mpButtonData( new ImplCommonButtonData ) { - mpButtonData = new ImplCommonButtonData; } Button::~Button() { - delete mpButtonData; + disposeOnce(); +} + +void Button::dispose() +{ + Control::dispose(); } void Button::SetCommandHandler(const OUString& aCommand) @@ -1173,10 +1178,6 @@ PushButton::PushButton( vcl::Window* pParent, const ResId& rResId ) : Show(); } -PushButton::~PushButton() -{ -} - void PushButton::MouseButtonDown( const MouseEvent& rMEvt ) { if ( rMEvt.IsLeft() && @@ -1583,7 +1584,8 @@ void PushButton::SetPressed( bool bPressed ) void PushButton::EndSelection() { EndTracking( ENDTRACK_CANCEL ); - if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED ) + if ( !IsDisposed() && + ImplGetButtonState() & BUTTON_DRAW_PRESSED ) { ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED; if ( !mbPressed ) @@ -2143,20 +2145,20 @@ void RadioButton::group(RadioButton &rOther) if (!m_xGroup) { - m_xGroup.reset(new std::vector<RadioButton*>); + m_xGroup.reset(new std::vector<VclPtr<RadioButton> >); m_xGroup->push_back(this); } - std::vector<RadioButton*>::iterator aFind = std::find(m_xGroup->begin(), m_xGroup->end(), &rOther); + auto aFind = std::find(m_xGroup->begin(), m_xGroup->end(), VclPtr<RadioButton>(&rOther)); if (aFind == m_xGroup->end()) { m_xGroup->push_back(&rOther); if (rOther.m_xGroup) { - std::vector< RadioButton* > aOthers(rOther.GetRadioButtonGroup(false)); + std::vector< VclPtr<RadioButton> > aOthers(rOther.GetRadioButtonGroup(false)); //make all members of the group share the same button group - for (std::vector<RadioButton*>::iterator aI = aOthers.begin(), aEnd = aOthers.end(); aI != aEnd; ++aI) + for (auto aI = aOthers.begin(), aEnd = aOthers.end(); aI != aEnd; ++aI) { aFind = std::find(m_xGroup->begin(), m_xGroup->end(), *aI); if (aFind == m_xGroup->end()) @@ -2165,8 +2167,7 @@ void RadioButton::group(RadioButton &rOther) } //make all members of the group share the same button group - for (std::vector<RadioButton*>::iterator aI = m_xGroup->begin(), aEnd = m_xGroup->end(); - aI != aEnd; ++aI) + for (auto aI = m_xGroup->begin(), aEnd = m_xGroup->end(); aI != aEnd; ++aI) { RadioButton* pButton = *aI; pButton->m_xGroup = m_xGroup; @@ -2178,14 +2179,14 @@ void RadioButton::group(RadioButton &rOther) ImplUncheckAllOther(); } -std::vector< RadioButton* > RadioButton::GetRadioButtonGroup(bool bIncludeThis) const +std::vector< VclPtr<RadioButton> > RadioButton::GetRadioButtonGroup(bool bIncludeThis) const { if (m_xGroup) { if (bIncludeThis) return *m_xGroup; - std::vector< RadioButton* > aGroup; - for (std::vector<RadioButton*>::iterator aI = m_xGroup->begin(), aEnd = m_xGroup->end(); aI != aEnd; ++aI) + std::vector< VclPtr<RadioButton> > aGroup; + for (auto aI = m_xGroup->begin(), aEnd = m_xGroup->end(); aI != aEnd; ++aI) { RadioButton *pRadioButton = *aI; if (pRadioButton == this) @@ -2207,7 +2208,7 @@ std::vector< RadioButton* > RadioButton::GetRadioButtonGroup(bool bIncludeThis) else break; } - std::vector< RadioButton* > aGroup; + std::vector< VclPtr<RadioButton> > aGroup; // insert radiobuttons up to next group do { @@ -2226,9 +2227,9 @@ void RadioButton::ImplUncheckAllOther() { mpWindowImpl->mnStyle |= WB_TABSTOP; - std::vector<RadioButton*> aGroup(GetRadioButtonGroup(false)); + std::vector<VclPtr<RadioButton> > aGroup(GetRadioButtonGroup(false)); // iterate over radio button group and checked buttons - for (std::vector<RadioButton*>::iterator aI = aGroup.begin(), aEnd = aGroup.end(); aI != aEnd; ++aI) + for (auto aI = aGroup.begin(), aEnd = aGroup.end(); aI != aEnd; ++aI) { RadioButton *pWindow = *aI; if ( pWindow->IsChecked() ) @@ -2305,11 +2306,18 @@ void RadioButton::ImplLoadRes( const ResId& rResId ) RadioButton::~RadioButton() { + disposeOnce(); +} + +void RadioButton::dispose() +{ if (m_xGroup) { - m_xGroup->erase(std::remove(m_xGroup->begin(), m_xGroup->end(), this), - m_xGroup->end()); + m_xGroup->erase(std::remove(m_xGroup->begin(), m_xGroup->end(), VclPtr<RadioButton>(this)), + m_xGroup->end()); + m_xGroup.reset(); } + Button::dispose(); } void RadioButton::MouseButtonDown( const MouseEvent& rMEvt ) @@ -3753,10 +3761,6 @@ ImageButton::ImageButton( vcl::Window* pParent, const ResId& rResId ) : ImplInitStyle(); } -ImageButton::~ImageButton() -{ -} - void ImageButton::ImplInitStyle() { WinBits nStyle = GetStyle(); @@ -3775,20 +3779,12 @@ ImageRadioButton::ImageRadioButton( vcl::Window* pParent, WinBits nStyle ) : { } -ImageRadioButton::~ImageRadioButton() -{ -} - TriStateBox::TriStateBox( vcl::Window* pParent, WinBits nStyle ) : CheckBox( pParent, nStyle ) { EnableTriState( true ); } -TriStateBox::~TriStateBox() -{ -} - DisclosureButton::DisclosureButton( vcl::Window* pParent, WinBits nStyle ) : CheckBox( pParent, nStyle ) { diff --git a/vcl/source/control/combobox.cxx b/vcl/source/control/combobox.cxx index be0e048991c6..e9e24ee3cabc 100644 --- a/vcl/source/control/combobox.cxx +++ b/vcl/source/control/combobox.cxx @@ -68,20 +68,25 @@ ComboBox::ComboBox( vcl::Window* pParent, const ResId& rResId ) : ComboBox::~ComboBox() { - SetSubEdit( NULL ); - delete mpSubEdit; + disposeOnce(); +} + +void ComboBox::dispose() +{ + mpSubEdit.disposeAndClear(); - ImplListBox *pImplLB = mpImplLB; - mpImplLB = NULL; - delete pImplLB; + VclPtr< ImplListBox > pImplLB = mpImplLB; + mpImplLB.clear(); + pImplLB.disposeAndClear(); - delete mpFloatWin; - delete mpBtn; + mpFloatWin.disposeAndClear(); + mpBtn.disposeAndClear(); + Edit::dispose(); } void ComboBox::ImplInitComboBoxData() { - mpSubEdit = NULL; + mpSubEdit.disposeAndClear(); mpBtn = NULL; mpImplLB = NULL; mpFloatWin = NULL; @@ -142,11 +147,11 @@ void ComboBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) WinBits nListStyle = nStyle; if( nStyle & WB_DROPDOWN ) { - mpFloatWin = new ImplListBoxFloatingWindow( this ); + mpFloatWin = VclPtr<ImplListBoxFloatingWindow>::Create( this ); mpFloatWin->SetAutoWidth( true ); mpFloatWin->SetPopupModeEndHdl( LINK( this, ComboBox, ImplPopupModeEndHdl ) ); - mpBtn = new ImplBtn( this, WB_NOLIGHTBORDER | WB_RECTSTYLE ); + mpBtn = VclPtr<ImplBtn>::Create( this, WB_NOLIGHTBORDER | WB_RECTSTYLE ); ImplInitDropDownButton( mpBtn ); mpBtn->buttonDownSignal.connect( boost::bind( &ComboBox::ImplClickButtonHandler, this, _1 )); mpBtn->Show(); @@ -165,7 +170,7 @@ void ComboBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) } } - mpSubEdit = new Edit( this, nEditStyle ); + mpSubEdit.set( VclPtr<Edit>::Create( this, nEditStyle ) ); mpSubEdit->EnableRTL( false ); SetSubEdit( mpSubEdit ); mpSubEdit->SetPosPixel( Point() ); @@ -175,7 +180,7 @@ void ComboBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) vcl::Window* pLBParent = this; if ( mpFloatWin ) pLBParent = mpFloatWin; - mpImplLB = new ImplListBox( pLBParent, nListStyle|WB_SIMPLEMODE|WB_AUTOHSCROLL ); + mpImplLB = VclPtr<ImplListBox>::Create( pLBParent, nListStyle|WB_SIMPLEMODE|WB_AUTOHSCROLL ); mpImplLB->SetPosPixel( Point() ); mpImplLB->SetSelectHdl( LINK( this, ComboBox, ImplSelectHdl ) ); mpImplLB->SetCancelHdl( LINK( this, ComboBox, ImplCancelHdl ) ); @@ -188,7 +193,7 @@ void ComboBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) if ( mpFloatWin ) mpFloatWin->SetImplListBox( mpImplLB ); else - mpImplLB->GetMainWindow().AllowGrabFocus( true ); + mpImplLB->GetMainWindow()->AllowGrabFocus( true ); ImplCalcEditHeight(); @@ -253,7 +258,7 @@ void ComboBox::ImplClickButtonHandler( ImplBtn* ) ImplClearLayoutData(); if( mpImplLB ) - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); } IMPL_LINK_NOARG(ComboBox, ImplPopupModeEndHdl) @@ -272,7 +277,7 @@ IMPL_LINK_NOARG(ComboBox, ImplPopupModeEndHdl) ImplClearLayoutData(); if( mpImplLB ) - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); mpBtn->SetPressed( false ); CallEventListeners( VCLEVENT_DROPDOWN_CLOSE ); @@ -581,20 +586,20 @@ void ComboBox::FillLayoutData() const mpControlData->mpLayoutData = new vcl::ControlLayoutData(); AppendLayoutData( *mpSubEdit ); mpSubEdit->SetLayoutDataParent( this ); - Control& rMainWindow = mpImplLB->GetMainWindow(); + ImplListBoxWindow* rMainWindow = mpImplLB->GetMainWindow(); if( mpFloatWin ) { // dropdown mode if( mpFloatWin->IsReallyVisible() ) { - AppendLayoutData( rMainWindow ); - rMainWindow.SetLayoutDataParent( this ); + AppendLayoutData( *rMainWindow ); + rMainWindow->SetLayoutDataParent( this ); } } else { - AppendLayoutData( rMainWindow ); - rMainWindow.SetLayoutDataParent( this ); + AppendLayoutData( *rMainWindow ); + rMainWindow->SetLayoutDataParent( this ); } } @@ -647,7 +652,7 @@ void ComboBox::StateChanged( StateChangedType nType ) else if ( nType == StateChangedType::STYLE ) { SetStyle( ImplInitStyle( GetStyle() ) ); - mpImplLB->GetMainWindow().EnableSort( ( GetStyle() & WB_SORT ) != 0 ); + mpImplLB->GetMainWindow()->EnableSort( ( GetStyle() & WB_SORT ) != 0 ); } else if( nType == StateChangedType::MIRRORING ) { @@ -765,7 +770,7 @@ bool ComboBox::Notify( NotifyEvent& rNEvt ) nDone = false; // don't eat this event, let the default handling happen (i.e. scroll the context) } } - else if( ( rNEvt.GetType() == MouseNotifyEvent::MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == &mpImplLB->GetMainWindow() ) ) + else if( ( rNEvt.GetType() == MouseNotifyEvent::MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == mpImplLB->GetMainWindow() ) ) { mpSubEdit->GrabFocus(); } @@ -799,6 +804,9 @@ void ComboBox::Modify() void ComboBox::ImplUpdateFloatSelection() { + if (!mpImplLB) + return; + // move text in the ListBox into the visible region mpImplLB->SetCallSelectionChangedHdl( false ); if ( !IsMultiSelectionEnabled() ) @@ -1106,7 +1114,7 @@ void ComboBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines long nCharWidth = GetTextWidth(OUString(static_cast<sal_Unicode>('x'))); if ( !IsDropDownBox() ) { - Size aOutSz = mpImplLB->GetMainWindow().GetOutputSizePixel(); + Size aOutSz = mpImplLB->GetMainWindow()->GetOutputSizePixel(); rnCols = (nCharWidth > 0) ? (sal_uInt16)(aOutSz.Width()/nCharWidth) : 1; rnLines = (sal_uInt16)(aOutSz.Height()/mpImplLB->GetEntryHeight()); } @@ -1120,11 +1128,11 @@ void ComboBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines void ComboBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) { - mpImplLB->GetMainWindow().ImplInitSettings( true, true, true ); + mpImplLB->GetMainWindow()->ImplInitSettings( true, true, true ); Point aPos = pDev->LogicToPixel( rPos ); Size aSize = pDev->LogicToPixel( rSize ); - vcl::Font aFont = mpImplLB->GetMainWindow().GetDrawPixelFont( pDev ); + vcl::Font aFont = mpImplLB->GetMainWindow()->GetDrawPixelFont( pDev ); OutDevType eOutDevType = pDev->GetOutDevType(); pDev->Push(); @@ -1233,18 +1241,18 @@ void ComboBox::UserDraw( const UserDrawEvent& ) void ComboBox::SetUserItemSize( const Size& rSz ) { - mpImplLB->GetMainWindow().SetUserItemSize( rSz ); + mpImplLB->GetMainWindow()->SetUserItemSize( rSz ); } void ComboBox::EnableUserDraw( bool bUserDraw ) { - mpImplLB->GetMainWindow().EnableUserDraw( bUserDraw ); + mpImplLB->GetMainWindow()->EnableUserDraw( bUserDraw ); } void ComboBox::DrawEntry( const UserDrawEvent& rEvt, bool bDrawImage, bool bDrawText, bool bDrawTextAtImagePos ) { - DBG_ASSERT( rEvt.GetDevice() == &mpImplLB->GetMainWindow(), "DrawEntry?!" ); - mpImplLB->GetMainWindow().DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos ); + DBG_ASSERT( rEvt.GetDevice() == mpImplLB->GetMainWindow(), "DrawEntry?!" ); + mpImplLB->GetMainWindow()->DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos ); } void ComboBox::SetSeparatorPos( sal_Int32 n ) @@ -1259,7 +1267,7 @@ void ComboBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep ) OUString ComboBox::GetMRUEntries( sal_Unicode cSep ) const { - return mpImplLB->GetMRUEntries( cSep ); + return mpImplLB ? mpImplLB->GetMRUEntries( cSep ) : OUString(); } void ComboBox::SetMaxMRUCount( sal_Int32 n ) @@ -1269,12 +1277,12 @@ void ComboBox::SetMaxMRUCount( sal_Int32 n ) sal_Int32 ComboBox::GetMaxMRUCount() const { - return mpImplLB->GetMaxMRUCount(); + return mpImplLB ? mpImplLB->GetMaxMRUCount() : 0; } sal_uInt16 ComboBox::GetDisplayLineCount() const { - return mpImplLB->GetDisplayLineCount(); + return mpImplLB ? mpImplLB->GetDisplayLineCount() : 0; } void ComboBox::SetEntryData( sal_Int32 nPos, void* pNewData ) @@ -1355,8 +1363,8 @@ void ComboBox::SetNoSelection() Rectangle ComboBox::GetBoundingRectangle( sal_Int32 nItem ) const { - Rectangle aRect = mpImplLB->GetMainWindow().GetBoundingRectangle( nItem ); - Rectangle aOffset = mpImplLB->GetMainWindow().GetWindowExtentsRelative( (vcl::Window*)this ); + Rectangle aRect = mpImplLB->GetMainWindow()->GetBoundingRectangle( nItem ); + Rectangle aOffset = mpImplLB->GetMainWindow()->GetWindowExtentsRelative( (vcl::Window*)this ); aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() ); return aRect; } @@ -1382,16 +1390,16 @@ long ComboBox::GetIndexForPoint( const Point& rPoint, sal_Int32& rPos ) const { // point must be either in main list window // or in impl window (dropdown case) - ImplListBoxWindow& rMain = mpImplLB->GetMainWindow(); + ImplListBoxWindow* rMain = mpImplLB->GetMainWindow(); // convert coordinates to ImplListBoxWindow pixel coordinate space Point aConvPoint = LogicToPixel( rPoint ); aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint ); - aConvPoint = rMain.AbsoluteScreenToOutputPixel( aConvPoint ); - aConvPoint = rMain.PixelToLogic( aConvPoint ); + aConvPoint = rMain->AbsoluteScreenToOutputPixel( aConvPoint ); + aConvPoint = rMain->PixelToLogic( aConvPoint ); // try to find entry - sal_Int32 nEntry = rMain.GetEntryPosForPoint( aConvPoint ); + sal_Int32 nEntry = rMain->GetEntryPosForPoint( aConvPoint ); if( nEntry == LISTBOX_ENTRY_NOTFOUND ) nIndex = -1; else diff --git a/vcl/source/control/ctrl.cxx b/vcl/source/control/ctrl.cxx index 411243cccaeb..85ca49501f24 100644 --- a/vcl/source/control/ctrl.cxx +++ b/vcl/source/control/ctrl.cxx @@ -67,7 +67,13 @@ Control::Control( vcl::Window* pParent, const ResId& rResId ) : Control::~Control() { + disposeOnce(); +} + +void Control::dispose() +{ delete mpControlData, mpControlData = NULL; + Window::dispose(); } void Control::EnableRTL( bool bEnable ) @@ -107,7 +113,7 @@ void Control::CreateLayoutData() const bool Control::HasLayoutData() const { - return mpControlData->mpLayoutData != NULL; + return mpControlData ? mpControlData->mpLayoutData != NULL : false; } ::vcl::ControlLayoutData* Control::GetLayoutData() const @@ -121,6 +127,10 @@ void Control::SetText( const OUString& rStr ) Window::SetText( rStr ); } +ControlLayoutData::ControlLayoutData() : m_pParent( NULL ) +{ +} + Rectangle ControlLayoutData::GetCharacterBounds( long nIndex ) const { return (nIndex >= 0 && nIndex < (long) m_aUnicodeBoundRects.size()) ? m_aUnicodeBoundRects[ nIndex ] : Rectangle(); @@ -338,7 +348,11 @@ void Control::SetLayoutDataParent( const Control* pParent ) const void Control::ImplClearLayoutData() const { - delete mpControlData->mpLayoutData, mpControlData->mpLayoutData = NULL; + if (mpControlData) + { + delete mpControlData->mpLayoutData; + mpControlData->mpLayoutData = NULL; + } } void Control::ImplDrawFrame( OutputDevice* pDev, Rectangle& rRect ) diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx index 809e9445fe1a..6efac8a766b7 100644 --- a/vcl/source/control/edit.cxx +++ b/vcl/source/control/edit.cxx @@ -239,7 +239,14 @@ bool Edit::set_property(const OString &rKey, const OString &rValue) Edit::~Edit() { + disposeOnce(); +} + +void Edit::dispose() +{ delete mpDDInfo; + mpDDInfo = NULL; + vcl::Cursor* pCursor = GetCursor(); if ( pCursor ) { @@ -248,8 +255,10 @@ Edit::~Edit() } delete mpIMEInfos; + mpIMEInfos = NULL; delete mpUpdateDataTimer; + mpUpdateDataTimer = NULL; if ( mxDnDListener.is() ) { @@ -266,14 +275,18 @@ Edit::~Edit() uno::Reference< lang::XEventListener> xEL( mxDnDListener, uno::UNO_QUERY ); xEL->disposing( lang::EventObject() ); // #95154# #96585# Empty Source means it's the Client + mxDnDListener.clear(); } SetType(WINDOW_WINDOW); + + mpSubEdit.disposeAndClear(); + Control::dispose(); } void Edit::ImplInitEditData() { - mpSubEdit = NULL; + mpSubEdit = VclPtr<Edit>(); mpUpdateDataTimer = NULL; mpFilterText = NULL; mnXOffset = 0; @@ -792,8 +805,8 @@ void Edit::ShowTruncationWarning( vcl::Window* pParent ) ResMgr* pResMgr = ImplGetResMgr(); if( pResMgr ) { - MessageDialog aBox(pParent, ResId(SV_EDIT_WARNING_STR, *pResMgr), VCL_MESSAGE_WARNING); - aBox.Execute(); + ScopedVclPtrInstance< MessageDialog > aBox( pParent, ResId(SV_EDIT_WARNING_STR, *pResMgr), VCL_MESSAGE_WARNING ); + aBox->Execute(); } } @@ -2696,7 +2709,8 @@ void Edit::ClearModifyFlag() void Edit::SetSubEdit( Edit* pEdit ) { - mpSubEdit = pEdit; + mpSubEdit.disposeAndClear(); + mpSubEdit.set( pEdit ); if ( mpSubEdit ) { SetPointer( POINTER_ARROW ); // Nur das SubEdit hat den BEAM... @@ -2771,8 +2785,8 @@ Size Edit::CalcMinimumSize() const Size Edit::GetMinimumEditSize() { vcl::Window* pDefWin = ImplGetDefaultWindow(); - Edit aEdit( pDefWin, WB_BORDER ); - Size aSize( aEdit.CalcMinimumSize() ); + ScopedVclPtrInstance< Edit > aEdit( pDefWin, WB_BORDER ); + Size aSize( aEdit->CalcMinimumSize() ); return aSize; } diff --git a/vcl/source/control/field.cxx b/vcl/source/control/field.cxx index c71b7265c32e..cb6b46b8cb7a 100644 --- a/vcl/source/control/field.cxx +++ b/vcl/source/control/field.cxx @@ -842,10 +842,6 @@ void NumericField::ImplLoadRes( const ResId& rResId ) mnSpinSize = ReadLongRes(); } -NumericField::~NumericField() -{ -} - bool NumericField::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -979,10 +975,6 @@ Size NumericBox::CalcMinimumSize() const return aRet; } -NumericBox::~NumericBox() -{ -} - bool NumericBox::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -1679,10 +1671,6 @@ void MetricField::ImplLoadRes( const ResId& rResId ) Reformat(); } -MetricField::~MetricField() -{ -} - void MetricField::SetUnit( FieldUnit nNewUnit ) { sal_Int64 nRawMax = GetMax( nNewUnit ); @@ -1826,10 +1814,6 @@ Size MetricBox::CalcMinimumSize() const return aRet; } -MetricBox::~MetricBox() -{ -} - bool MetricBox::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -2056,10 +2040,6 @@ CurrencyField::CurrencyField( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -CurrencyField::~CurrencyField() -{ -} - bool CurrencyField::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -2138,10 +2118,6 @@ CurrencyBox::CurrencyBox( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -CurrencyBox::~CurrencyBox() -{ -} - bool CurrencyBox::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) diff --git a/vcl/source/control/field2.cxx b/vcl/source/control/field2.cxx index 4bf320f61f48..3f343b215760 100644 --- a/vcl/source/control/field2.cxx +++ b/vcl/source/control/field2.cxx @@ -820,10 +820,6 @@ PatternField::PatternField( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -PatternField::~PatternField() -{ -} - bool PatternField::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -870,10 +866,6 @@ PatternBox::PatternBox( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -PatternBox::~PatternBox() -{ -} - bool PatternBox::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -1738,10 +1730,6 @@ DateField::DateField( vcl::Window* pParent, WinBits nWinStyle ) : ResetLastDate(); } -DateField::~DateField() -{ -} - bool DateField::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && IsStrictFormat() && @@ -1841,10 +1829,6 @@ DateBox::DateBox( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -DateBox::~DateBox() -{ -} - bool DateBox::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && IsStrictFormat() && @@ -2532,10 +2516,6 @@ TimeField::TimeField( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -TimeField::~TimeField() -{ -} - bool TimeField::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) @@ -2673,10 +2653,6 @@ TimeBox::TimeBox( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -TimeBox::~TimeBox() -{ -} - bool TimeBox::PreNotify( NotifyEvent& rNEvt ) { if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && !rNEvt.GetKeyEvent()->GetKeyCode().IsMod2() ) diff --git a/vcl/source/control/fixed.cxx b/vcl/source/control/fixed.cxx index 62c6135438b6..69922de6df07 100644 --- a/vcl/source/control/fixed.cxx +++ b/vcl/source/control/fixed.cxx @@ -460,7 +460,14 @@ void FixedText::set_mnemonic_widget(vcl::Window *pWindow) FixedText::~FixedText() { + disposeOnce(); +} + +void FixedText::dispose() +{ set_mnemonic_widget(NULL); + m_pMnemonicWindow.clear(); + Control::dispose(); } SelectableFixedText::SelectableFixedText(vcl::Window* pParent, WinBits nStyle) @@ -748,10 +755,6 @@ FixedBitmap::FixedBitmap( vcl::Window* pParent, WinBits nStyle ) : ImplInit( pParent, nStyle ); } -FixedBitmap::~FixedBitmap() -{ -} - void FixedBitmap::ImplDraw( OutputDevice* pDev, sal_uLong /* nDrawFlags */, const Point& rPos, const Size& rSize ) { @@ -915,10 +918,6 @@ FixedImage::FixedImage( vcl::Window* pParent, const ResId& rResId ) : Show(); } -FixedImage::~FixedImage() -{ -} - void FixedImage::ImplDraw( OutputDevice* pDev, sal_uLong nDrawFlags, const Point& rPos, const Size& rSize ) { diff --git a/vcl/source/control/fixedhyper.cxx b/vcl/source/control/fixedhyper.cxx index 6926a0c843c6..db36f90c2572 100644 --- a/vcl/source/control/fixedhyper.cxx +++ b/vcl/source/control/fixedhyper.cxx @@ -26,10 +26,6 @@ FixedHyperlink::FixedHyperlink(vcl::Window* pParent, WinBits nWinStyle) Initialize(); } -FixedHyperlink::~FixedHyperlink() -{ -} - void FixedHyperlink::Initialize() { // saves the old pointer diff --git a/vcl/source/control/ilstbox.cxx b/vcl/source/control/ilstbox.cxx index 64d009ab9e34..083faf072e96 100644 --- a/vcl/source/control/ilstbox.cxx +++ b/vcl/source/control/ilstbox.cxx @@ -536,7 +536,13 @@ ImplListBoxWindow::ImplListBoxWindow( vcl::Window* pParent, WinBits nWinStyle ) ImplListBoxWindow::~ImplListBoxWindow() { + disposeOnce(); +} + +void ImplListBoxWindow::dispose() +{ delete mpEntryList; + Control::dispose(); } void ImplListBoxWindow::ImplInitSettings( bool bFont, bool bForeground, bool bBackground ) @@ -2135,16 +2141,16 @@ sal_uInt16 ImplListBoxWindow::ImplGetTextStyle() const ImplListBox::ImplListBox( vcl::Window* pParent, WinBits nWinStyle ) : Control( pParent, nWinStyle ), - maLBWindow( this, nWinStyle&(~WB_BORDER) ) + maLBWindow(VclPtr<ImplListBoxWindow>::Create( this, nWinStyle&(~WB_BORDER) )) { - maLBWindow.userDrawSignal.connect( userDrawSignal ); + maLBWindow->userDrawSignal.connect( userDrawSignal ); // for native widget rendering we must be able to detect this window type SetType( WINDOW_LISTBOXWINDOW ); - mpVScrollBar = new ScrollBar( this, WB_VSCROLL | WB_DRAG ); - mpHScrollBar = new ScrollBar( this, WB_HSCROLL | WB_DRAG ); - mpScrollBarBox = new ScrollBarBox( this ); + mpVScrollBar = VclPtr<ScrollBar>::Create( this, WB_VSCROLL | WB_DRAG ); + mpHScrollBar = VclPtr<ScrollBar>::Create( this, WB_HSCROLL | WB_DRAG ); + mpScrollBarBox = VclPtr<ScrollBarBox>::Create( this ); Link aLink( LINK( this, ImplListBox, ScrollBarHdl ) ); mpVScrollBar->SetScrollHdl( aLink ); @@ -2155,26 +2161,33 @@ ImplListBox::ImplListBox( vcl::Window* pParent, WinBits nWinStyle ) : mbAutoHScroll = ( nWinStyle & WB_AUTOHSCROLL ); mbEdgeBlending = false; - maLBWindow.SetScrollHdl( LINK( this, ImplListBox, LBWindowScrolled ) ); - maLBWindow.SetMRUChangedHdl( LINK( this, ImplListBox, MRUChanged ) ); - maLBWindow.SetEdgeBlending(GetEdgeBlending()); - maLBWindow.Show(); + maLBWindow->SetScrollHdl( LINK( this, ImplListBox, LBWindowScrolled ) ); + maLBWindow->SetMRUChangedHdl( LINK( this, ImplListBox, MRUChanged ) ); + maLBWindow->SetEdgeBlending(GetEdgeBlending()); + maLBWindow->Show(); } ImplListBox::~ImplListBox() { - delete mpHScrollBar; - delete mpVScrollBar; - delete mpScrollBarBox; + disposeOnce(); +} + +void ImplListBox::dispose() +{ + mpHScrollBar.disposeAndClear(); + mpVScrollBar.disposeAndClear(); + mpScrollBarBox.disposeAndClear(); + maLBWindow.disposeAndClear(); + Control::dispose(); } void ImplListBox::Clear() { - maLBWindow.Clear(); + maLBWindow->Clear(); if ( GetEntryList()->GetMRUCount() ) { - maLBWindow.GetEntryList()->SetMRUCount( 0 ); - maLBWindow.SetSeparatorPos( LISTBOX_ENTRY_NOTFOUND ); + maLBWindow->GetEntryList()->SetMRUCount( 0 ); + maLBWindow->SetSeparatorPos( LISTBOX_ENTRY_NOTFOUND ); } mpVScrollBar->SetThumbPos( 0 ); mpHScrollBar->SetThumbPos( 0 ); @@ -2184,7 +2197,7 @@ void ImplListBox::Clear() sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr ) { ImplEntryType* pNewEntry = new ImplEntryType( rStr ); - sal_Int32 nNewPos = maLBWindow.InsertEntry( nPos, pNewEntry ); + sal_Int32 nNewPos = maLBWindow->InsertEntry( nPos, pNewEntry ); if (nNewPos == LISTBOX_ERROR) { delete pNewEntry; @@ -2197,7 +2210,7 @@ sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr ) sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr, const Image& rImage ) { ImplEntryType* pNewEntry = new ImplEntryType( rStr, rImage ); - sal_Int32 nNewPos = maLBWindow.InsertEntry( nPos, pNewEntry ); + sal_Int32 nNewPos = maLBWindow->InsertEntry( nPos, pNewEntry ); if (nNewPos == LISTBOX_ERROR) { delete pNewEntry; @@ -2209,33 +2222,33 @@ sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr, const void ImplListBox::RemoveEntry( sal_Int32 nPos ) { - maLBWindow.RemoveEntry( nPos ); + maLBWindow->RemoveEntry( nPos ); StateChanged( StateChangedType::DATA ); } void ImplListBox::SetEntryFlags( sal_Int32 nPos, long nFlags ) { - maLBWindow.SetEntryFlags( nPos, nFlags ); + maLBWindow->SetEntryFlags( nPos, nFlags ); } void ImplListBox::SelectEntry( sal_Int32 nPos, bool bSelect ) { - maLBWindow.SelectEntry( nPos, bSelect ); + maLBWindow->SelectEntry( nPos, bSelect ); } void ImplListBox::SetNoSelection() { - maLBWindow.DeselectAll(); + maLBWindow->DeselectAll(); } void ImplListBox::GetFocus() { - maLBWindow.GrabFocus(); + maLBWindow->GrabFocus(); } vcl::Window* ImplListBox::GetPreferredKeyInputWindow() { - return &maLBWindow; + return maLBWindow.get(); } void ImplListBox::Resize() @@ -2359,7 +2372,7 @@ void ImplListBox::ImplCheckScrollBars() void ImplListBox::ImplInitScrollBars() { - Size aOutSz = maLBWindow.GetOutputSizePixel(); + Size aOutSz = maLBWindow->GetOutputSizePixel(); if ( mbVScroll ) { @@ -2396,9 +2409,9 @@ void ImplListBox::ImplResizeControls() // pb: #106948# explicit mirroring for calc // Scrollbar on left or right side? - bool bMirroring = maLBWindow.IsMirroring(); + bool bMirroring = maLBWindow->IsMirroring(); Point aWinPos( bMirroring && mbVScroll ? nSBWidth : 0, 0 ); - maLBWindow.SetPosSizePixel( aWinPos, aInnerSz ); + maLBWindow->SetPosSizePixel( aWinPos, aInnerSz ); // ScrollBarBox if( mbVScroll && mbHScroll ) @@ -2450,7 +2463,7 @@ void ImplListBox::StateChanged( StateChangedType nType ) else if ( ( nType == StateChangedType::UPDATEMODE ) || ( nType == StateChangedType::DATA ) ) { bool bUpdate = IsUpdateMode(); - maLBWindow.SetUpdateMode( bUpdate ); + maLBWindow->SetUpdateMode( bUpdate ); if ( bUpdate && IsReallyVisible() ) ImplCheckScrollBars(); } @@ -2459,30 +2472,30 @@ void ImplListBox::StateChanged( StateChangedType nType ) mpHScrollBar->Enable( IsEnabled() ); mpVScrollBar->Enable( IsEnabled() ); mpScrollBarBox->Enable( IsEnabled() ); - maLBWindow.Enable( IsEnabled() ); + maLBWindow->Enable( IsEnabled() ); Invalidate(); } else if ( nType == StateChangedType::ZOOM ) { - maLBWindow.SetZoom( GetZoom() ); + maLBWindow->SetZoom( GetZoom() ); Resize(); } else if ( nType == StateChangedType::CONTROLFONT ) { - maLBWindow.SetControlFont( GetControlFont() ); + maLBWindow->SetControlFont( GetControlFont() ); } else if ( nType == StateChangedType::CONTROLFOREGROUND ) { - maLBWindow.SetControlForeground( GetControlForeground() ); + maLBWindow->SetControlForeground( GetControlForeground() ); } else if ( nType == StateChangedType::CONTROLBACKGROUND ) { - maLBWindow.SetControlBackground( GetControlBackground() ); + maLBWindow->SetControlBackground( GetControlBackground() ); } else if( nType == StateChangedType::MIRRORING ) { - maLBWindow.EnableRTL( IsRTLEnabled() ); + maLBWindow->EnableRTL( IsRTLEnabled() ); mpHScrollBar->EnableRTL( IsRTLEnabled() ); mpVScrollBar->EnableRTL( IsRTLEnabled() ); ImplResizeControls(); @@ -2517,7 +2530,7 @@ bool ImplListBox::Notify( NotifyEvent& rNEvt ) const Wallpaper& ImplListBox::GetDisplayBackground() const { - return maLBWindow.GetDisplayBackground(); + return maLBWindow->GetDisplayBackground(); } bool ImplListBox::HandleWheelAsCursorTravel( const CommandEvent& rCEvt ) @@ -2542,7 +2555,7 @@ void ImplListBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep ) // Remove old MRU entries for ( sal_Int32 n = GetEntryList()->GetMRUCount();n; ) - maLBWindow.RemoveEntry( --n ); + maLBWindow->RemoveEntry( --n ); sal_Int32 nMRUCount = 0; sal_Int32 nIndex = 0; @@ -2553,7 +2566,7 @@ void ImplListBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep ) if ( GetEntryList()->FindEntry( aEntry ) != LISTBOX_ENTRY_NOTFOUND ) { ImplEntryType* pNewEntry = new ImplEntryType( aEntry ); - maLBWindow.GetEntryList()->InsertEntry( nMRUCount++, pNewEntry, false ); + maLBWindow->GetEntryList()->InsertEntry( nMRUCount++, pNewEntry, false ); bChanges = true; } } @@ -2561,7 +2574,7 @@ void ImplListBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep ) if ( bChanges ) { - maLBWindow.GetEntryList()->SetMRUCount( nMRUCount ); + maLBWindow->GetEntryList()->SetMRUCount( nMRUCount ); SetSeparatorPos( nMRUCount ? nMRUCount-1 : 0 ); StateChanged( StateChangedType::DATA ); } @@ -2584,7 +2597,7 @@ void ImplListBox::SetEdgeBlending(bool bNew) if(mbEdgeBlending != bNew) { mbEdgeBlending = bNew; - maLBWindow.SetEdgeBlending(GetEdgeBlending()); + maLBWindow->SetEdgeBlending(GetEdgeBlending()); } } @@ -2918,6 +2931,18 @@ ImplListBoxFloatingWindow::ImplListBoxFloatingWindow( vcl::Window* pParent ) : } +ImplListBoxFloatingWindow::~ImplListBoxFloatingWindow() +{ + disposeOnce(); +} + +void ImplListBoxFloatingWindow::dispose() +{ + mpImplLB.clear(); + FloatingWindow::dispose(); +} + + bool ImplListBoxFloatingWindow::PreNotify( NotifyEvent& rNEvt ) { if( rNEvt.GetType() == MouseNotifyEvent::LOSEFOCUS ) @@ -2959,13 +2984,13 @@ void ImplListBoxFloatingWindow::setPosSizePixel( long nX, long nY, long nWidth, // this the presence of the vertical Scrollbar has to be known. mpImplLB->SetSizePixel( GetOutputSizePixel() ); ((vcl::Window*)mpImplLB)->Resize(); - ((vcl::Window&)mpImplLB->GetMainWindow()).Resize(); + ((vcl::Window*)mpImplLB->GetMainWindow())->Resize(); } } void ImplListBoxFloatingWindow::Resize() { - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); FloatingWindow::Resize(); } @@ -3085,12 +3110,12 @@ void ImplListBoxFloatingWindow::StartFloat( bool bStartTracking ) mpImplLB->ShowProminentEntry( nPos ); if( bStartTracking ) - mpImplLB->GetMainWindow().EnableMouseMoveSelect( true ); + mpImplLB->GetMainWindow()->EnableMouseMoveSelect( true ); - if ( mpImplLB->GetMainWindow().IsGrabFocusAllowed() ) - mpImplLB->GetMainWindow().GrabFocus(); + if ( mpImplLB->GetMainWindow()->IsGrabFocusAllowed() ) + mpImplLB->GetMainWindow()->GrabFocus(); - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); } } diff --git a/vcl/source/control/longcurr.cxx b/vcl/source/control/longcurr.cxx index 5f081bed20de..77724b0b02d3 100644 --- a/vcl/source/control/longcurr.cxx +++ b/vcl/source/control/longcurr.cxx @@ -468,10 +468,6 @@ LongCurrencyField::LongCurrencyField( vcl::Window* pParent, WinBits nWinStyle ) Reformat(); } -LongCurrencyField::~LongCurrencyField() -{ -} - bool LongCurrencyField::PreNotify( NotifyEvent& rNEvt ) { if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) @@ -546,10 +542,6 @@ LongCurrencyBox::LongCurrencyBox( vcl::Window* pParent, WinBits nWinStyle ) : Reformat(); } -LongCurrencyBox::~LongCurrencyBox() -{ -} - bool LongCurrencyBox::PreNotify( NotifyEvent& rNEvt ) { if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) diff --git a/vcl/source/control/lstbox.cxx b/vcl/source/control/lstbox.cxx index a35c502851fd..06da9a114911 100644 --- a/vcl/source/control/lstbox.cxx +++ b/vcl/source/control/lstbox.cxx @@ -39,7 +39,7 @@ void ListBox::EnableQuickSelection( const bool& b ) { - mpImplLB->GetMainWindow().EnableQuickSelection(b); + mpImplLB->GetMainWindow()->EnableQuickSelection(b); } ListBox::ListBox(WindowType nType) @@ -70,17 +70,19 @@ ListBox::ListBox( vcl::Window* pParent, const ResId& rResId ) : ListBox::~ListBox() { + disposeOnce(); +} + +void ListBox::dispose() +{ CallEventListeners( VCLEVENT_OBJECT_DYING ); - // When destroying the FloatWin TH does a GrabFocus to the Parent: - // that means this "ListBox => PreNotify() ..." - ImplListBox *pImplLB = mpImplLB; - mpImplLB = NULL; - delete pImplLB; + mpImplLB.disposeAndClear(); + mpFloatWin.disposeAndClear(); + mpImplWin.disposeAndClear(); + mpBtn.disposeAndClear(); - delete mpFloatWin; - delete mpImplWin; - delete mpBtn; + Control::dispose(); } void ListBox::ImplInitListBoxData() @@ -130,19 +132,19 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) } } - mpFloatWin = new ImplListBoxFloatingWindow( this ); + mpFloatWin = VclPtr<ImplListBoxFloatingWindow>::Create( this ); mpFloatWin->SetAutoWidth( true ); mpFloatWin->SetPopupModeEndHdl( LINK( this, ListBox, ImplPopupModeEndHdl ) ); mpFloatWin->GetDropTarget()->addDropTargetListener(xDrop); - mpImplWin = new ImplWin( this, (nStyle & (WB_LEFT|WB_RIGHT|WB_CENTER))|WB_NOBORDER ); + mpImplWin = VclPtr<ImplWin>::Create( this, (nStyle & (WB_LEFT|WB_RIGHT|WB_CENTER))|WB_NOBORDER ); mpImplWin->buttonDownSignal.connect( boost::bind( &ListBox::ImplClickButtonHandler, this, _1 )); mpImplWin->userDrawSignal.connect( boost::bind( &ListBox::ImplUserDrawHandler, this, _1 ) ); mpImplWin->Show(); mpImplWin->GetDropTarget()->addDropTargetListener(xDrop); mpImplWin->SetEdgeBlending(GetEdgeBlending()); - mpBtn = new ImplBtn( this, WB_NOLIGHTBORDER | WB_RECTSTYLE ); + mpBtn = VclPtr<ImplBtn>::Create( this, WB_NOLIGHTBORDER | WB_RECTSTYLE ); ImplInitDropDownButton( mpBtn ); mpBtn->buttonDownSignal.connect( boost::bind( &ListBox::ImplClickButtonHandler, this, _1 )); mpBtn->Show(); @@ -152,7 +154,7 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) vcl::Window* pLBParent = this; if ( mpFloatWin ) pLBParent = mpFloatWin; - mpImplLB = new ImplListBox( pLBParent, nStyle&(~WB_BORDER) ); + mpImplLB = VclPtr<ImplListBox>::Create( pLBParent, nStyle&(~WB_BORDER) ); mpImplLB->SetSelectHdl( LINK( this, ListBox, ImplSelectHdl ) ); mpImplLB->SetScrollHdl( LINK( this, ListBox, ImplScrollHdl ) ); mpImplLB->SetCancelHdl( LINK( this, ListBox, ImplCancelHdl ) ); @@ -173,7 +175,7 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) mpImplLB->SetSelectionChangedHdl( LINK( this, ListBox, ImplSelectionChangedHdl ) ); } else - mpImplLB->GetMainWindow().AllowGrabFocus( true ); + mpImplLB->GetMainWindow()->AllowGrabFocus( true ); SetCompoundControl( true ); } @@ -311,7 +313,7 @@ void ListBox::ImplClickButtonHandler( Control* ) ImplClearLayoutData(); if( mpImplLB ) - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); if( mpImplWin ) mpImplWin->ImplClearLayoutData(); } @@ -341,7 +343,7 @@ IMPL_LINK_NOARG(ListBox, ImplPopupModeEndHdl) ImplClearLayoutData(); if( mpImplLB ) - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); if( mpImplWin ) mpImplWin->ImplClearLayoutData(); @@ -369,11 +371,11 @@ void ListBox::ToggleDropDown() void ListBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) { - mpImplLB->GetMainWindow().ImplInitSettings( true, true, true ); + mpImplLB->GetMainWindow()->ImplInitSettings( true, true, true ); Point aPos = pDev->LogicToPixel( rPos ); Size aSize = pDev->LogicToPixel( rSize ); - vcl::Font aFont = mpImplLB->GetMainWindow().GetDrawPixelFont( pDev ); + vcl::Font aFont = mpImplLB->GetMainWindow()->GetDrawPixelFont( pDev ); OutDevType eOutDevType = pDev->GetOutDevType(); pDev->Push(); @@ -519,9 +521,15 @@ vcl::Window* ListBox::GetPreferredKeyInputWindow() void ListBox::LoseFocus() { if( IsDropDownBox() ) - mpImplWin->HideFocus(); + { + if (mpImplWin) + mpImplWin->HideFocus(); + } else - mpImplLB->HideFocus(); + { + if (mpImplLB) + mpImplLB->HideFocus(); + } Control::LoseFocus(); } @@ -691,7 +699,7 @@ void ListBox::Resize() void ListBox::FillLayoutData() const { mpControlData->mpLayoutData = new vcl::ControlLayoutData(); - const Control& rMainWin = mpImplLB->GetMainWindow(); + const ImplListBoxWindow* rMainWin = mpImplLB->GetMainWindow(); if( mpFloatWin ) { // Dropdown mode @@ -699,14 +707,14 @@ void ListBox::FillLayoutData() const mpImplWin->SetLayoutDataParent( this ); if( mpFloatWin->IsReallyVisible() ) { - AppendLayoutData( rMainWin ); - rMainWin.SetLayoutDataParent( this ); + AppendLayoutData( *rMainWin ); + rMainWin->SetLayoutDataParent( this ); } } else { - AppendLayoutData( rMainWin ); - rMainWin.SetLayoutDataParent( this ); + AppendLayoutData( *rMainWin ); + rMainWin->SetLayoutDataParent( this ); } } @@ -721,16 +729,16 @@ long ListBox::GetIndexForPoint( const Point& rPoint, sal_Int32& rPos ) const { // Point must be either in main list window // or in impl window (dropdown case) - ImplListBoxWindow& rMain = mpImplLB->GetMainWindow(); + ImplListBoxWindow* rMain = mpImplLB->GetMainWindow(); // Convert coordinates to ImplListBoxWindow pixel coordinate space Point aConvPoint = LogicToPixel( rPoint ); aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint ); - aConvPoint = rMain.AbsoluteScreenToOutputPixel( aConvPoint ); - aConvPoint = rMain.PixelToLogic( aConvPoint ); + aConvPoint = rMain->AbsoluteScreenToOutputPixel( aConvPoint ); + aConvPoint = rMain->PixelToLogic( aConvPoint ); // Try to find entry - sal_Int32 nEntry = rMain.GetEntryPosForPoint( aConvPoint ); + sal_Int32 nEntry = rMain->GetEntryPosForPoint( aConvPoint ); if( nEntry == LISTBOX_ENTRY_NOTFOUND ) { // Not found, maybe dropdown case @@ -803,7 +811,7 @@ void ListBox::StateChanged( StateChangedType nType ) if ( mpImplWin ) { mpImplWin->SetZoom( GetZoom() ); - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } Resize(); @@ -814,7 +822,7 @@ void ListBox::StateChanged( StateChangedType nType ) if ( mpImplWin ) { mpImplWin->SetControlFont( GetControlFont() ); - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } Resize(); @@ -826,7 +834,7 @@ void ListBox::StateChanged( StateChangedType nType ) { mpImplWin->SetControlForeground( GetControlForeground() ); mpImplWin->SetTextColor( GetControlForeground() ); - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } } @@ -843,17 +851,17 @@ void ListBox::StateChanged( StateChangedType nType ) } else { - mpImplWin->SetBackground( mpImplLB->GetMainWindow().GetControlBackground() ); - mpImplWin->SetControlBackground( mpImplLB->GetMainWindow().GetControlBackground() ); + mpImplWin->SetBackground( mpImplLB->GetMainWindow()->GetControlBackground() ); + mpImplWin->SetControlBackground( mpImplLB->GetMainWindow()->GetControlBackground() ); } - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } } else if ( nType == StateChangedType::STYLE ) { SetStyle( ImplInitStyle( GetStyle() ) ); - mpImplLB->GetMainWindow().EnableSort( ( GetStyle() & WB_SORT ) != 0 ); + mpImplLB->GetMainWindow()->EnableSort( ( GetStyle() & WB_SORT ) != 0 ); bool bSimpleMode = ( GetStyle() & WB_SIMPLEMODE ) != 0; mpImplLB->SetMultiSelectionSimpleMode( bSimpleMode ); } @@ -1157,8 +1165,8 @@ bool ListBox::IsInDropDown() const Rectangle ListBox::GetBoundingRectangle( sal_Int32 nItem ) const { - Rectangle aRect = mpImplLB->GetMainWindow().GetBoundingRectangle( nItem ); - Rectangle aOffset = mpImplLB->GetMainWindow().GetWindowExtentsRelative( (vcl::Window*)this ); + Rectangle aRect = mpImplLB->GetMainWindow()->GetBoundingRectangle( nItem ); + Rectangle aOffset = mpImplLB->GetMainWindow()->GetWindowExtentsRelative( (vcl::Window*)this ); aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() ); return aRect; } @@ -1180,7 +1188,7 @@ void ListBox::EnableMultiSelection( bool bMulti, bool bStackSelection ) // In a MultiSelection, we can't see us travelling without focus if ( mpFloatWin ) - mpImplLB->GetMainWindow().AllowGrabFocus( bMulti ); + mpImplLB->GetMainWindow()->AllowGrabFocus( bMulti ); } bool ListBox::IsMultiSelectionEnabled() const @@ -1348,7 +1356,7 @@ void ListBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines float nCharWidth = approximate_char_width(); if ( !IsDropDownBox() ) { - Size aOutSz = mpImplLB->GetMainWindow().GetOutputSizePixel(); + Size aOutSz = mpImplLB->GetMainWindow()->GetOutputSizePixel(); rnCols = (sal_uInt16) (aOutSz.Width()/nCharWidth); rnLines = (sal_uInt16) (aOutSz.Height()/mpImplLB->GetEntryHeight()); } @@ -1371,22 +1379,22 @@ void ListBox::UserDraw( const UserDrawEvent& ) void ListBox::DrawEntry( const UserDrawEvent& rEvt, bool bDrawImage, bool bDrawText, bool bDrawTextAtImagePos ) { - if ( rEvt.GetDevice() == &mpImplLB->GetMainWindow() ) - mpImplLB->GetMainWindow().DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos ); + if ( rEvt.GetDevice() == mpImplLB->GetMainWindow() ) + mpImplLB->GetMainWindow()->DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos ); else if ( rEvt.GetDevice() == mpImplWin ) mpImplWin->DrawEntry( bDrawImage, bDrawText, bDrawTextAtImagePos ); } void ListBox::SetUserItemSize( const Size& rSz ) { - mpImplLB->GetMainWindow().SetUserItemSize( rSz ); + mpImplLB->GetMainWindow()->SetUserItemSize( rSz ); if ( mpImplWin ) mpImplWin->SetUserItemSize( rSz ); } void ListBox::EnableUserDraw( bool bUserDraw ) { - mpImplLB->GetMainWindow().EnableUserDraw( bUserDraw ); + mpImplLB->GetMainWindow()->EnableUserDraw( bUserDraw ); if ( mpImplWin ) mpImplWin->EnableUserDraw( bUserDraw ); } diff --git a/vcl/source/control/menubtn.cxx b/vcl/source/control/menubtn.cxx index a78c5612ec86..314c41ab7f9f 100644 --- a/vcl/source/control/menubtn.cxx +++ b/vcl/source/control/menubtn.cxx @@ -82,8 +82,14 @@ MenuButton::MenuButton( vcl::Window* pParent, WinBits nWinBits ) MenuButton::~MenuButton() { + disposeOnce(); +} + +void MenuButton::dispose() +{ delete mpMenuTimer; delete mpOwnMenu; + PushButton::dispose(); } IMPL_LINK_NOARG(MenuButton, ImplMenuTimeoutHdl) diff --git a/vcl/source/control/morebtn.cxx b/vcl/source/control/morebtn.cxx index 95cd171afd81..999c3c308d73 100644 --- a/vcl/source/control/morebtn.cxx +++ b/vcl/source/control/morebtn.cxx @@ -22,7 +22,7 @@ #include <tools/rc.h> #include <vector> -typedef ::std::vector< vcl::Window* > ImplMoreWindowList; +typedef ::std::vector< VclPtr<vcl::Window> > ImplMoreWindowList; struct ImplMoreButtonData { @@ -80,8 +80,14 @@ MoreButton::MoreButton( vcl::Window* pParent, WinBits nStyle ) : MoreButton::~MoreButton() { + disposeOnce(); +} + +void MoreButton::dispose() +{ delete mpMBData->mpItemList; delete mpMBData; + PushButton::dispose(); } void MoreButton::Click() diff --git a/vcl/source/control/prgsbar.cxx b/vcl/source/control/prgsbar.cxx index d6443cd16515..a89afac723bb 100644 --- a/vcl/source/control/prgsbar.cxx +++ b/vcl/source/control/prgsbar.cxx @@ -56,10 +56,6 @@ ProgressBar::ProgressBar( vcl::Window* pParent, WinBits nWinStyle ) : ImplInit(); } -ProgressBar::~ProgressBar() -{ -} - void ProgressBar::ImplInitSettings( bool bFont, bool bForeground, bool bBackground ) { diff --git a/vcl/source/control/scrbar.cxx b/vcl/source/control/scrbar.cxx index e31391d27ab3..b239c623e3ff 100644 --- a/vcl/source/control/scrbar.cxx +++ b/vcl/source/control/scrbar.cxx @@ -125,7 +125,13 @@ ScrollBar::ScrollBar( vcl::Window* pParent, WinBits nStyle ) : ScrollBar::~ScrollBar() { - delete mpData; + disposeOnce(); +} + +void ScrollBar::dispose() +{ + delete mpData; mpData = NULL; + Control::dispose(); } void ScrollBar::ImplUpdateRects( bool bUpdate ) diff --git a/vcl/source/control/spinbtn.cxx b/vcl/source/control/spinbtn.cxx index 9b16b4753751..c9feafa07663 100644 --- a/vcl/source/control/spinbtn.cxx +++ b/vcl/source/control/spinbtn.cxx @@ -55,10 +55,6 @@ SpinButton::SpinButton( vcl::Window* pParent, WinBits nStyle ) ImplInit( pParent, nStyle ); } -SpinButton::~SpinButton() -{ -} - IMPL_LINK( SpinButton, ImplTimeout, Timer*, pTimer ) { if ( pTimer->GetTimeout() == GetSettings().GetMouseSettings().GetButtonStartRepeat() ) diff --git a/vcl/source/control/spinfld.cxx b/vcl/source/control/spinfld.cxx index 972bded96429..fe1feea8ef05 100644 --- a/vcl/source/control/spinfld.cxx +++ b/vcl/source/control/spinfld.cxx @@ -286,7 +286,7 @@ void ImplDrawSpinButton( OutputDevice* pOutDev, void SpinField::ImplInitSpinFieldData() { - mpEdit = NULL; + mpEdit.disposeAndClear(); mbSpin = false; mbRepeat = false; mbUpperIn = false; @@ -311,11 +311,11 @@ void SpinField::ImplInit( vcl::Window* pParent, WinBits nWinStyle ) if ( (nWinStyle & WB_SPIN) && ImplUseNativeBorder( nWinStyle ) ) { SetBackground(); - mpEdit = new Edit( this, WB_NOBORDER ); + mpEdit.set( VclPtr<Edit>::Create( this, WB_NOBORDER ) ); mpEdit->SetBackground(); } else - mpEdit = new Edit( this, WB_NOBORDER ); + mpEdit.set( VclPtr<Edit>::Create( this, WB_NOBORDER ) ); mpEdit->EnableRTL( false ); mpEdit->SetPosPixel( Point() ); @@ -359,7 +359,14 @@ SpinField::SpinField( vcl::Window* pParent, const ResId& rResId ) : SpinField::~SpinField() { - delete mpEdit; + disposeOnce(); +} + +void SpinField::dispose() +{ + mpEdit.disposeAndClear(); + + Edit::dispose(); } void SpinField::Up() diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx index ca63e5485d68..3bf2d59598d6 100644 --- a/vcl/source/control/tabctrl.cxx +++ b/vcl/source/control/tabctrl.cxx @@ -42,7 +42,7 @@ struct ImplTabItem { sal_uInt16 mnId; - TabPage* mpTabPage; + VclPtr<TabPage> mpTabPage; OUString maText; OUString maFormatText; OUString maHelpText; @@ -67,7 +67,7 @@ struct ImplTabCtrlData std::vector< Rectangle > maTabRectangles; Point maItemsOffset; // offset of the tabitems std::vector< ImplTabItem > maItemList; - ListBox* mpListBox; + VclPtr<ListBox> mpListBox; }; #define TAB_OFFSET 3 @@ -112,7 +112,7 @@ void TabControl::ImplInit( vcl::Window* pParent, WinBits nStyle ) if( (nStyle & WB_DROPDOWN) ) { - mpTabCtrlData->mpListBox = new ListBox( this, WB_DROPDOWN ); + mpTabCtrlData->mpListBox = VclPtr<ListBox>::Create( this, WB_DROPDOWN ); mpTabCtrlData->mpListBox->SetPosSizePixel( Point( 0, 0 ), Size( 200, 20 ) ); mpTabCtrlData->mpListBox->SetSelectHdl( LINK( this, TabControl, ImplListBoxSelectHdl ) ); mpTabCtrlData->mpListBox->Show(); @@ -192,6 +192,11 @@ TabControl::TabControl( vcl::Window* pParent, WinBits nStyle ) : TabControl::~TabControl() { + disposeOnce(); +} + +void TabControl::dispose() +{ Window *pParent = GetParent(); if (pParent && pParent->IsDialog()) GetParent()->RemoveChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) ); @@ -199,12 +204,11 @@ TabControl::~TabControl() ImplFreeLayoutData(); // delete TabCtrl data - if ( mpTabCtrlData ) - { - if( mpTabCtrlData->mpListBox ) - delete mpTabCtrlData->mpListBox; - delete mpTabCtrlData; - } + if (mpTabCtrlData) + mpTabCtrlData->mpListBox.disposeAndClear(); + delete mpTabCtrlData; + mpTabCtrlData = NULL; + Control::dispose(); } ImplTabItem* TabControl::ImplGetItem( sal_uInt16 nId ) const @@ -574,9 +578,9 @@ void TabControl::ImplChangeTabPage( sal_uInt16 nId, sal_uInt16 nOldId ) ImplTabItem* pOldItem = ImplGetItem( nOldId ); ImplTabItem* pItem = ImplGetItem( nId ); - TabPage* pOldPage = (pOldItem) ? pOldItem->mpTabPage : NULL; - TabPage* pPage = (pItem) ? pItem->mpTabPage : NULL; - vcl::Window* pCtrlParent = GetParent(); + TabPage* pOldPage = (pOldItem) ? pOldItem->mpTabPage.get() : NULL; + TabPage* pPage = (pItem) ? pItem->mpTabPage.get() : NULL; + vcl::Window* pCtrlParent = GetParent(); if ( IsReallyVisible() && IsUpdateMode() ) { @@ -1013,7 +1017,7 @@ IMPL_LINK( TabControl, ImplWindowEventListener, VclSimpleEvent*, pEvent ) void TabControl::MouseButtonDown( const MouseEvent& rMEvt ) { - if( mpTabCtrlData->mpListBox == NULL ) + if( mpTabCtrlData->mpListBox.get() == NULL ) { if( rMEvt.IsLeft() ) { @@ -1083,7 +1087,7 @@ void TabControl::ImplPaint( const Rectangle& rRect, bool bLayout ) // in this case we're only interested in the top border of the tabpage because the tabitems are used // standalone (eg impress) bool bNoTabPage = false; - TabPage* pCurPage = pCurItem ? pCurItem->mpTabPage : NULL; + TabPage* pCurPage = pCurItem ? pCurItem->mpTabPage.get() : NULL; if( !pCurPage || !pCurPage->IsVisible() ) { bNoTabPage = true; @@ -1169,7 +1173,7 @@ void TabControl::ImplPaint( const Rectangle& rRect, bool bLayout ) } } - if ( !mpTabCtrlData->maItemList.empty() && mpTabCtrlData->mpListBox == NULL ) + if ( !mpTabCtrlData->maItemList.empty() && mpTabCtrlData->mpListBox == nullptr ) { // Some native toolkits (GTK+) draw tabs right-to-left, with an // overlap between adjacent tabs @@ -1427,7 +1431,7 @@ void TabControl::RequestHelp( const HelpEvent& rHEvt ) void TabControl::Command( const CommandEvent& rCEvt ) { - if( (mpTabCtrlData->mpListBox == NULL) && (rCEvt.GetCommand() == COMMAND_CONTEXTMENU) && (GetPageCount() > 1) ) + if( (mpTabCtrlData->mpListBox == nullptr) && (rCEvt.GetCommand() == COMMAND_CONTEXTMENU) && (GetPageCount() > 1) ) { Point aMenuPos; bool bMenu; @@ -1879,7 +1883,7 @@ void TabControl::SetTabPage( sal_uInt16 nPageId, TabPage* pTabPage ) { ImplTabItem* pItem = ImplGetItem( nPageId ); - if ( pItem && (pItem->mpTabPage != pTabPage) ) + if ( pItem && (pItem->mpTabPage.get() != pTabPage) ) { if ( pTabPage ) { diff --git a/vcl/source/control/throbber.cxx b/vcl/source/control/throbber.cxx index 347f24a32e31..eedadc4e5637 100644 --- a/vcl/source/control/throbber.cxx +++ b/vcl/source/control/throbber.cxx @@ -59,7 +59,13 @@ Throbber::Throbber( vcl::Window* i_parentWindow, WinBits i_style, const ImageSet Throbber::~Throbber() { + disposeOnce(); +} + +void Throbber::dispose() +{ maWaitTimer.Stop(); + ImageControl::dispose(); } namespace diff --git a/vcl/source/edit/texteng.cxx b/vcl/source/edit/texteng.cxx index f4a11a2d0ec3..235dd138be99 100644 --- a/vcl/source/edit/texteng.cxx +++ b/vcl/source/edit/texteng.cxx @@ -116,7 +116,7 @@ TextEngine::~TextEngine() delete mpDoc; delete mpTEParaPortions; delete mpViews; // only the list, not the Views - delete mpRefDev; + mpRefDev.disposeAndClear(); delete mpUndoManager; delete mpIMEInfos; delete mpLocaleDataWrapper; diff --git a/vcl/source/edit/textview.cxx b/vcl/source/edit/textview.cxx index 768125bf2a35..2dd8da99768f 100644 --- a/vcl/source/edit/textview.cxx +++ b/vcl/source/edit/textview.cxx @@ -147,7 +147,7 @@ struct ImpTextView { TextEngine* mpTextEngine; - vcl::Window* mpWindow; + VclPtr<vcl::Window> mpWindow; TextSelection maSelection; Point maStartDocPos; // TextPaM maMBDownPaM; @@ -156,7 +156,7 @@ struct ImpTextView TextDDInfo* mpDDInfo; - VirtualDevice* mpVirtDev; + VclPtr<VirtualDevice> mpVirtDev; SelectionEngine* mpSelEngine; TextSelFunctionSet* mpSelFuncSet; @@ -235,7 +235,7 @@ TextView::~TextView() { delete mpImpl->mpSelEngine; delete mpImpl->mpSelFuncSet; - delete mpImpl->mpVirtDev; + mpImpl->mpVirtDev.disposeAndClear(); if ( mpImpl->mpWindow->GetCursor() == mpImpl->mpCursor ) mpImpl->mpWindow->SetCursor( 0 ); @@ -541,8 +541,7 @@ VirtualDevice* TextView::GetVirtualDevice() void TextView::EraseVirtualDevice() { - delete mpImpl->mpVirtDev; - mpImpl->mpVirtDev = 0; + mpImpl->mpVirtDev.disposeAndClear(); } bool TextView::KeyInput( const KeyEvent& rKeyEvent ) diff --git a/vcl/source/edit/vclmedit.cxx b/vcl/source/edit/vclmedit.cxx index dd46cdad48fd..cc3a5898cab7 100644 --- a/vcl/source/edit/vclmedit.cxx +++ b/vcl/source/edit/vclmedit.cxx @@ -47,7 +47,8 @@ private: public: TextWindow( vcl::Window* pParent ); - virtual ~TextWindow(); + virtual ~TextWindow(); + virtual void dispose() SAL_OVERRIDE; ExtTextEngine* GetTextEngine() const { return mpExtTextEngine; } ExtTextView* GetTextView() const { return mpExtTextView; } @@ -75,12 +76,12 @@ public: class ImpVclMEdit : public SfxListener { private: - VclMultiLineEdit* pVclMultiLineEdit; + VclPtr<VclMultiLineEdit> pVclMultiLineEdit; - TextWindow* mpTextWindow; - ScrollBar* mpHScrollBar; - ScrollBar* mpVScrollBar; - ScrollBarBox* mpScrollBox; + VclPtr<TextWindow> mpTextWindow; + VclPtr<ScrollBar> mpHScrollBar; + VclPtr<ScrollBar> mpVScrollBar; + VclPtr<ScrollBarBox> mpScrollBox; Point maTextWindowOffset; sal_Int32 mnTextWidth; @@ -152,7 +153,7 @@ ImpVclMEdit::ImpVclMEdit( VclMultiLineEdit* pEdt, WinBits nWinStyle ) { pVclMultiLineEdit = pEdt; mnTextWidth = 0; - mpTextWindow = new TextWindow( pEdt ); + mpTextWindow = VclPtr<TextWindow>::Create( pEdt ); mpTextWindow->Show(); InitFromStyle( nWinStyle ); StartListening( *mpTextWindow->GetTextEngine() ); @@ -160,9 +161,9 @@ ImpVclMEdit::ImpVclMEdit( VclMultiLineEdit* pEdt, WinBits nWinStyle ) void ImpVclMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) { - const bool bHaveVScroll = (NULL != mpVScrollBar); - const bool bHaveHScroll = (NULL != mpHScrollBar); - const bool bHaveScrollBox = (NULL != mpScrollBox); + const bool bHaveVScroll = (nullptr != mpVScrollBar); + const bool bHaveHScroll = (nullptr != mpHScrollBar); + const bool bHaveScrollBox = (nullptr != mpScrollBox); bool bNeedVScroll = ( nWinStyle & WB_VSCROLL ) == WB_VSCROLL; const bool bNeedHScroll = ( nWinStyle & WB_HSCROLL ) == WB_HSCROLL; @@ -183,8 +184,8 @@ void ImpVclMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) bool bScrollbarsChanged = false; if ( bHaveVScroll != bNeedVScroll ) { - delete mpVScrollBar; - mpVScrollBar = bNeedVScroll ? new ScrollBar( pVclMultiLineEdit, WB_VSCROLL|WB_DRAG ) : NULL; + mpVScrollBar.disposeAndClear(); + mpVScrollBar = bNeedVScroll ? VclPtr<ScrollBar>::Create( pVclMultiLineEdit, WB_VSCROLL|WB_DRAG ) : nullptr; if ( bNeedVScroll ) { @@ -197,8 +198,8 @@ void ImpVclMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) if ( bHaveHScroll != bNeedHScroll ) { - delete mpHScrollBar; - mpHScrollBar = bNeedHScroll ? new ScrollBar( pVclMultiLineEdit, WB_HSCROLL|WB_DRAG ) : NULL; + mpHScrollBar.disposeAndClear(); + mpHScrollBar = bNeedHScroll ? VclPtr<ScrollBar>::Create( pVclMultiLineEdit, WB_HSCROLL|WB_DRAG ) : nullptr; if ( bNeedHScroll ) { @@ -211,8 +212,8 @@ void ImpVclMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) if ( bHaveScrollBox != bNeedScrollBox ) { - delete mpScrollBox; - mpScrollBox = bNeedScrollBox ? new ScrollBarBox( pVclMultiLineEdit, WB_SIZEABLE ) : NULL; + mpScrollBox.disposeAndClear(); + mpScrollBox = bNeedScrollBox ? VclPtr<ScrollBarBox>::Create( pVclMultiLineEdit, WB_SIZEABLE ) : nullptr; if ( bNeedScrollBox ) mpScrollBox->Show(); @@ -257,10 +258,11 @@ void ImpVclMEdit::InitFromStyle( WinBits nWinStyle ) ImpVclMEdit::~ImpVclMEdit() { EndListening( *mpTextWindow->GetTextEngine() ); - delete mpTextWindow; - delete mpHScrollBar; - delete mpVScrollBar; - delete mpScrollBox; + mpTextWindow.disposeAndClear(); + mpHScrollBar.disposeAndClear(); + mpVScrollBar.disposeAndClear(); + mpScrollBox.disposeAndClear(); + pVclMultiLineEdit.disposeAndClear(); } void ImpVclMEdit::ImpSetScrollBarRanges() @@ -730,8 +732,14 @@ TextWindow::TextWindow( vcl::Window* pParent ) : Window( pParent ) TextWindow::~TextWindow() { + disposeOnce(); +} + +void TextWindow::dispose() +{ delete mpExtTextView; delete mpExtTextEngine; + Window::dispose(); } void TextWindow::MouseMove( const MouseEvent& rMEvt ) @@ -937,11 +945,19 @@ VclMultiLineEdit::VclMultiLineEdit( vcl::Window* pParent, WinBits nWinStyle ) VclMultiLineEdit::~VclMultiLineEdit() { + disposeOnce(); +} + +void VclMultiLineEdit::dispose() +{ { std::unique_ptr< ImpVclMEdit > xDelete(pImpVclMEdit); pImpVclMEdit = NULL; } delete pUpdateDataTimer; + pUpdateDataTimer = NULL; + + Edit::dispose(); } WinBits VclMultiLineEdit::ImplInitStyle( WinBits nStyle ) @@ -1145,17 +1161,17 @@ void VclMultiLineEdit::SetText( const OUString& rStr ) OUString VclMultiLineEdit::GetText() const { - return pImpVclMEdit->GetText(); + return pImpVclMEdit ? pImpVclMEdit->GetText() : OUString(""); } OUString VclMultiLineEdit::GetText( LineEnd aSeparator ) const { - return pImpVclMEdit->GetText( aSeparator ); + return pImpVclMEdit ? pImpVclMEdit->GetText( aSeparator ) : OUString(""); } -OUString VclMultiLineEdit::GetTextLines( LineEnd aSeparator ) const +OUString VclMultiLineEdit::GetTextLines( LineEnd aSeparator ) const { - return pImpVclMEdit->GetTextLines( aSeparator ); + return pImpVclMEdit ? pImpVclMEdit->GetTextLines( aSeparator ) : OUString(""); } void VclMultiLineEdit::Resize() diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 147070e52810..961679796fc7 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1892,16 +1892,16 @@ sal_uInt16 GraphicFilter::ExportGraphic( const Graphic& rGraphic, const OUString { Size aSizePixel; sal_uLong nColorCount,nBitsPerPixel,nNeededMem,nMaxMem; - VirtualDevice aVirDev; + ScopedVclPtrInstance< VirtualDevice > aVirDev; nMaxMem = 1024; nMaxMem *= 1024; // In Bytes // Calculate how big the image would normally be: - aSizePixel=aVirDev.LogicToPixel(aGraphic.GetPrefSize(),aGraphic.GetPrefMapMode()); + aSizePixel=aVirDev->LogicToPixel(aGraphic.GetPrefSize(),aGraphic.GetPrefMapMode()); // Calculate how much memory the image will take up - nColorCount=aVirDev.GetColorCount(); + nColorCount=aVirDev->GetColorCount(); if (nColorCount<=2) nBitsPerPixel=1; else if (nColorCount<=4) nBitsPerPixel=2; else if (nColorCount<=16) nBitsPerPixel=4; @@ -1918,12 +1918,12 @@ sal_uInt16 GraphicFilter::ExportGraphic( const Graphic& rGraphic, const OUString aSizePixel.Height()=(sal_uLong)(((double)aSizePixel.Height())*fFak); } - aVirDev.SetMapMode(MapMode(MAP_PIXEL)); - aVirDev.SetOutputSizePixel(aSizePixel); + aVirDev->SetMapMode(MapMode(MAP_PIXEL)); + aVirDev->SetOutputSizePixel(aSizePixel); Graphic aGraphic2=aGraphic; - aGraphic2.Draw(&aVirDev,Point(0,0),aSizePixel); // this changes the MapMode - aVirDev.SetMapMode(MapMode(MAP_PIXEL)); - aGraphic=Graphic(aVirDev.GetBitmap(Point(0,0),aSizePixel)); + aGraphic2.Draw(aVirDev.get(),Point(0,0),aSizePixel); // this changes the MapMode + aVirDev->SetMapMode(MapMode(MAP_PIXEL)); + aGraphic=Graphic(aVirDev->GetBitmap(Point(0,0),aSizePixel)); } } if( rOStm.GetError() ) diff --git a/vcl/source/filter/sgfbram.cxx b/vcl/source/filter/sgfbram.cxx index 8e9d167cd486..277e4af32366 100644 --- a/vcl/source/filter/sgfbram.cxx +++ b/vcl/source/filter/sgfbram.cxx @@ -390,7 +390,7 @@ Color Hpgl2SvFarbe( sal_uInt8 nFarb ) bool SgfFilterVect(SvStream& rInp, SgfHeader& rHead, SgfEntry&, GDIMetaFile& rMtf) { - VirtualDevice aOutDev; + ScopedVclPtrInstance< VirtualDevice > aOutDev; SgfVector aVect; sal_uInt8 nFarb; sal_uInt8 nFrb0=7; @@ -401,9 +401,9 @@ bool SgfFilterVect(SvStream& rInp, SgfHeader& rHead, SgfEntry&, GDIMetaFile& rMt Point aP1(0,0); sal_uInt16 RecNr=0; - rMtf.Record(&aOutDev); - aOutDev.SetLineColor(Color(COL_BLACK)); - aOutDev.SetFillColor(Color(COL_BLACK)); + rMtf.Record(aOutDev.get()); + aOutDev->SetLineColor(Color(COL_BLACK)); + aOutDev->SetFillColor(Color(COL_BLACK)); while (!bEoDt && !rInp.GetError()) { ReadSgfVector( rInp, aVect ); RecNr++; @@ -429,15 +429,15 @@ bool SgfFilterVect(SvStream& rInp, SgfHeader& rHead, SgfEntry&, GDIMetaFile& rMt switch(nOTyp) { case 1: if (nFarb!=nFrb0) { switch(rHead.SwGrCol) { - case SgfVectFarb: aOutDev.SetLineColor(Hpgl2SvFarbe(nFarb)); break; + case SgfVectFarb: aOutDev->SetLineColor(Hpgl2SvFarbe(nFarb)); break; case SgfVectGray: break; case SgfVectWdth: break; } } - aOutDev.DrawLine(aP0,aP1); break; // line + aOutDev->DrawLine(aP0,aP1); break; // line case 2: break; // circle case 3: break; // text - case 5: aOutDev.DrawRect(Rectangle(aP0,aP1)); break; // rectangle (solid) + case 5: aOutDev->DrawRect(Rectangle(aP0,aP1)); break; // rectangle (solid) } } aP0=aP1; diff --git a/vcl/source/filter/sgvmain.cxx b/vcl/source/filter/sgvmain.cxx index 63526dccecad..ca754c28e4d9 100644 --- a/vcl/source/filter/sgvmain.cxx +++ b/vcl/source/filter/sgvmain.cxx @@ -794,13 +794,13 @@ bool SgfFilterSDrw( SvStream& rInp, SgfHeader&, SgfEntry&, GDIMetaFile& rMtf ) { bool bRet = false; PageType aPage; - VirtualDevice aOutDev; + ScopedVclPtrInstance< VirtualDevice > aOutDev; OutputDevice* pOutDev; sal_uLong nStdPos; sal_uLong nCharPos; sal_uInt16 Num; - pOutDev=&aOutDev; + pOutDev=aOutDev.get(); DtHdOverSeek(rInp); // read dataheader nStdPos=rInp.Tell(); diff --git a/vcl/source/filter/sgvtext.cxx b/vcl/source/filter/sgvtext.cxx index 2a01dbcb3ae9..290ff1427912 100644 --- a/vcl/source/filter/sgvtext.cxx +++ b/vcl/source/filter/sgvtext.cxx @@ -660,7 +660,7 @@ void FormatLine(UCHAR* TBuf, sal_uInt16& Index, ObjTextType& Atr0, ObjTextType& double, double, UCHAR* cLine, bool TextFit) { - VirtualDevice vOut; + ScopedVclPtrInstance< VirtualDevice > vOut; UCHAR c,c0; bool First; // first char ? sal_uInt8 Just = 0; // paragraph format @@ -684,18 +684,18 @@ void FormatLine(UCHAR* TBuf, sal_uInt16& Index, ObjTextType& Atr0, ObjTextType& sal_uInt16 i,j,k,h; sal_uInt16 re,li; - vOut.SetMapMode(MapMode(MAP_10TH_MM,Point(),Fraction(1,4),Fraction(1,4))); + vOut->SetMapMode(MapMode(MAP_10TH_MM,Point(),Fraction(1,4),Fraction(1,4))); nChars=0; - SetTextContext(vOut,AktAtr,false,0,1,1,1,1); + SetTextContext(*vOut.get(),AktAtr,false,0,1,1,1,1); InitProcessCharState(*R,AktAtr,Index); (*R0)=(*R); (*WErec)=(*R); WEnChar=0; c0=0; Border0=false; Border=false; First=true; WordEndCnt=0; do { // check how many words to on that line - if (Border) c=ProcessChar(vOut,TBuf,*R,Atr0,nChars,DoTrenn,Line,cLine); - else c=ProcessChar(vOut,TBuf,*R,Atr0,nChars,NoTrenn,Line,cLine); + if (Border) c=ProcessChar(*vOut.get(),TBuf,*R,Atr0,nChars,DoTrenn,Line,cLine); + else c=ProcessChar(*vOut.get(),TBuf,*R,Atr0,nChars,NoTrenn,Line,cLine); AbsEnd=(c==AbsatzEnd || c==TextEnd); //if not AbsEnd then { @@ -729,8 +729,8 @@ void FormatLine(UCHAR* TBuf, sal_uInt16& Index, ObjTextType& Atr0, ObjTextType& (*TRrec)=(*R); TRnChar=nChars; Border0=false; Border=false; do { // first check how many syllables fit - UCHAR ct=ProcessChar(vOut,TBuf,*TRrec,Atr0,TRnChar,DoTrenn,Line,cLine); - c=ProcessChar(vOut,TBuf,*R,Atr0,nChars,NoTrenn,Line,cLine); + UCHAR ct=ProcessChar(*vOut.get(),TBuf,*TRrec,Atr0,TRnChar,DoTrenn,Line,cLine); + c=ProcessChar(*vOut.get(),TBuf,*R,Atr0,nChars,NoTrenn,Line,cLine); AbsEnd=(ct==AbsatzEnd) || (ct==TextEnd) || (nChars>=MaxLineChars); Border=TRrec->ChrXP>UmbWdt; @@ -754,7 +754,7 @@ void FormatLine(UCHAR* TBuf, sal_uInt16& Index, ObjTextType& Atr0, ObjTextType& } while (!(AbsEnd || (Border && ((WordEndCnt>0) || WordEnd || Trenn)))); while (WErec0->Index<WErec->Index) { // to assure Line[] matches } - ProcessChar(vOut,TBuf,*WErec0,Atr0,WEnChar0,WEnChar-WEnChar0-1,Line,cLine); + ProcessChar(*vOut.get(),TBuf,*WErec0,Atr0,WEnChar0,WEnChar-WEnChar0-1,Line,cLine); } (*R)=(*WErec); nChars=WEnChar; diff --git a/vcl/source/filter/wmf/emfwr.cxx b/vcl/source/filter/wmf/emfwr.cxx index ea74f6b618ad..3d50e2667bd9 100644 --- a/vcl/source/filter/wmf/emfwr.cxx +++ b/vcl/source/filter/wmf/emfwr.cxx @@ -266,7 +266,7 @@ void EMFWriter::ImplWritePlusColor( const Color& rColor, const sal_uInt32& nTran void EMFWriter::ImplWritePlusPoint( const Point& rPoint ) { // Convert to pixels - const Point aPoint(maVDev.LogicToPixel( rPoint, maDestMapMode )); + const Point aPoint(maVDev->LogicToPixel( rPoint, maDestMapMode )); m_rStm.WriteUInt16( aPoint.X() ).WriteUInt16( aPoint.Y() ); } @@ -276,7 +276,7 @@ void EMFWriter::ImplWritePlusFillPolygonRecord( const Polygon& rPoly, const sal_ if( rPoly.GetSize() ) { ImplBeginPlusRecord( EmfPlusFillPolygon, 0xC000 ); // Sets the color as well - ImplWritePlusColor( maVDev.GetFillColor(), nTrans ); + ImplWritePlusColor( maVDev->GetFillColor(), nTrans ); m_rStm.WriteUInt32( rPoly.GetSize() ); for( sal_uInt16 i = 0; i < rPoly.GetSize(); i++ ) ImplWritePlusPoint( rPoly[ i ] ); @@ -289,8 +289,8 @@ bool EMFWriter::WriteEMF(const GDIMetaFile& rMtf) { const sal_uLong nHeaderPos = m_rStm.Tell(); - maVDev.EnableOutput( false ); - maVDev.SetMapMode( rMtf.GetPrefMapMode() ); + maVDev->EnableOutput( false ); + maVDev->SetMapMode( rMtf.GetPrefMapMode() ); // don't work with pixel as destination map mode -> higher resolution preferrable maDestMapMode.SetMapUnit( MAP_100TH_MM ); mpHandlesUsed = new bool[ MAXHANDLES ]; @@ -301,7 +301,7 @@ bool EMFWriter::WriteEMF(const GDIMetaFile& rMtf) mnLineHandle = mnFillHandle = mnTextHandle = HANDLE_INVALID; mnHorTextAlign = 0; - const Size aMtfSizePix( maVDev.LogicToPixel( rMtf.GetPrefSize(), rMtf.GetPrefMapMode() ) ); + const Size aMtfSizePix( maVDev->LogicToPixel( rMtf.GetPrefSize(), rMtf.GetPrefMapMode() ) ); const Size aMtfSizeLog( OutputDevice::LogicToLogic( rMtf.GetPrefSize(), rMtf.GetPrefMapMode(), MAP_100TH_MM ) ); // seek over header @@ -319,7 +319,7 @@ bool EMFWriter::WriteEMF(const GDIMetaFile& rMtf) ImplEndRecord(); ImplBeginRecord( WIN_EMR_SETVIEWPORTEXTEX ); - m_rStm.WriteInt32( maVDev.GetDPIX() ).WriteInt32( maVDev.GetDPIY() ); + m_rStm.WriteInt32( maVDev->GetDPIX() ).WriteInt32( maVDev->GetDPIY() ); ImplEndRecord(); ImplBeginRecord( WIN_EMR_SETWINDOWEXTEX ); @@ -466,12 +466,12 @@ void EMFWriter::ImplCheckLineAttr() { if( mbLineChanged && ImplPrepareHandleSelect( mnLineHandle, LINE_SELECT ) ) { - sal_uInt32 nStyle = maVDev.IsLineColor() ? 0 : 5; + sal_uInt32 nStyle = maVDev->IsLineColor() ? 0 : 5; sal_uInt32 nWidth = 0, nHeight = 0; ImplBeginRecord( WIN_EMR_CREATEPEN ); m_rStm.WriteUInt32( mnLineHandle ).WriteUInt32( nStyle ).WriteUInt32( nWidth ).WriteUInt32( nHeight ); - ImplWriteColor( maVDev.GetLineColor() ); + ImplWriteColor( maVDev->GetLineColor() ); ImplEndRecord(); ImplBeginRecord( WIN_EMR_SELECTOBJECT ); @@ -484,12 +484,12 @@ void EMFWriter::ImplCheckFillAttr() { if( mbFillChanged && ImplPrepareHandleSelect( mnFillHandle, FILL_SELECT ) ) { - sal_uInt32 nStyle = maVDev.IsFillColor() ? 0 : 1; + sal_uInt32 nStyle = maVDev->IsFillColor() ? 0 : 1; sal_uInt32 nPatternStyle = 0; ImplBeginRecord( WIN_EMR_CREATEBRUSHINDIRECT ); m_rStm.WriteUInt32( mnFillHandle ).WriteUInt32( nStyle ); - ImplWriteColor( maVDev.GetFillColor() ); + ImplWriteColor( maVDev->GetFillColor() ); m_rStm.WriteUInt32( nPatternStyle ); ImplEndRecord(); @@ -503,7 +503,7 @@ void EMFWriter::ImplCheckTextAttr() { if( mbTextChanged && ImplPrepareHandleSelect( mnTextHandle, TEXT_SELECT ) ) { - const vcl::Font& rFont = maVDev.GetFont(); + const vcl::Font& rFont = maVDev->GetFont(); OUString aFontName( rFont.GetName() ); sal_Int32 nWeight; sal_uInt16 i; @@ -601,7 +601,7 @@ void EMFWriter::ImplCheckTextAttr() // Text color ImplBeginRecord( WIN_EMR_SETTEXTCOLOR ); - ImplWriteColor( maVDev.GetTextColor() ); + ImplWriteColor( maVDev->GetTextColor() ); ImplEndRecord(); ImplBeginRecord( WIN_EMR_SELECTOBJECT ); @@ -638,25 +638,25 @@ void EMFWriter::ImplWriteRasterOp( RasterOp eRop ) void EMFWriter::ImplWriteExtent( long nExtent ) { - nExtent = OutputDevice::LogicToLogic( Size( nExtent, 0 ), maVDev.GetMapMode(), maDestMapMode ).Width(); + nExtent = OutputDevice::LogicToLogic( Size( nExtent, 0 ), maVDev->GetMapMode(), maDestMapMode ).Width(); m_rStm.WriteInt32( nExtent ); } void EMFWriter::ImplWritePoint( const Point& rPoint ) { - const Point aPoint( OutputDevice::LogicToLogic( rPoint, maVDev.GetMapMode(), maDestMapMode )); + const Point aPoint( OutputDevice::LogicToLogic( rPoint, maVDev->GetMapMode(), maDestMapMode )); m_rStm.WriteInt32( aPoint.X() ).WriteInt32( aPoint.Y() ); } void EMFWriter::ImplWriteSize( const Size& rSize) { - const Size aSize( OutputDevice::LogicToLogic( rSize, maVDev.GetMapMode(), maDestMapMode )); + const Size aSize( OutputDevice::LogicToLogic( rSize, maVDev->GetMapMode(), maDestMapMode )); m_rStm.WriteInt32( aSize.Width() ).WriteInt32( aSize.Height() ); } void EMFWriter::ImplWriteRect( const Rectangle& rRect ) { - const Rectangle aRect( OutputDevice::LogicToLogic ( rRect, maVDev.GetMapMode(), maDestMapMode )); + const Rectangle aRect( OutputDevice::LogicToLogic ( rRect, maVDev->GetMapMode(), maDestMapMode )); m_rStm .WriteInt32( aRect.Left() ) .WriteInt32( aRect.Top() ) @@ -840,7 +840,7 @@ void EMFWriter::ImplWriteBmpRecord( const Bitmap& rBmp, const Point& rPt, const sal_uLong nOffPos = m_rStm.Tell(); m_rStm.SeekRel( 16 ); - m_rStm.WriteUInt32( 0 ).WriteInt32( ( ROP_XOR == maVDev.GetRasterOp() && WIN_SRCCOPY == nROP ) ? WIN_SRCINVERT : nROP ); + m_rStm.WriteUInt32( 0 ).WriteInt32( ( ROP_XOR == maVDev->GetRasterOp() && WIN_SRCCOPY == nROP ) ? WIN_SRCINVERT : nROP ); ImplWriteSize( rSz ); WriteDIB(rBmp, aMemStm, true, false); @@ -898,19 +898,19 @@ void EMFWriter::ImplWriteTextRecord( const Point& rPos, const OUString& rText, c // get text sizes if( pDXArray ) { - nNormWidth = maVDev.GetTextWidth( rText ); + nNormWidth = maVDev->GetTextWidth( rText ); pDX = const_cast<long*>(pDXArray); } else { pOwnArray.reset(new long[ nLen ]); - nNormWidth = maVDev.GetTextArray( rText, pOwnArray.get() ); + nNormWidth = maVDev->GetTextArray( rText, pOwnArray.get() ); pDX = pOwnArray.get(); } if( nLen > 1 ) { - nNormWidth = pDX[ nLen - 2 ] + maVDev.GetTextWidth( OUString(rText[ nLen - 1 ]) ); + nNormWidth = pDX[ nLen - 2 ] + maVDev->GetTextWidth( OUString(rText[ nLen - 1 ]) ); if( nWidth && nNormWidth && ( nWidth != nNormWidth ) ) { @@ -924,7 +924,7 @@ void EMFWriter::ImplWriteTextRecord( const Point& rPos, const OUString& rText, c // write text record ImplBeginRecord( WIN_EMR_EXTTEXTOUTW ); - ImplWriteRect( Rectangle( rPos, Size( nNormWidth, maVDev.GetTextHeight() ) ) ); + ImplWriteRect( Rectangle( rPos, Size( nNormWidth, maVDev->GetTextHeight() ) ) ); m_rStm.WriteUInt32( 1 ); m_rStm.WriteInt32( 0 ).WriteInt32( 0 ); ImplWritePoint( rPos ); @@ -975,11 +975,11 @@ void EMFWriter::Impl_handleLineInfoPolyPolygons(const LineInfo& rInfo, const bas if(aFillPolyPolygon.count()) { - const Color aOldLineColor(maVDev.GetLineColor()); - const Color aOldFillColor(maVDev.GetFillColor()); + const Color aOldLineColor(maVDev->GetLineColor()); + const Color aOldFillColor(maVDev->GetFillColor()); - maVDev.SetLineColor(); - maVDev.SetFillColor(aOldLineColor); + maVDev->SetLineColor(); + maVDev->SetFillColor(aOldLineColor); for(sal_uInt32 a(0); a < aFillPolyPolygon.count(); a++) { @@ -987,8 +987,8 @@ void EMFWriter::Impl_handleLineInfoPolyPolygons(const LineInfo& rInfo, const bas ImplWritePolyPolygonRecord(tools::PolyPolygon(Polygon(aPolygon))); } - maVDev.SetLineColor(aOldLineColor); - maVDev.SetFillColor(aOldFillColor); + maVDev->SetLineColor(aOldLineColor); + maVDev->SetFillColor(aOldFillColor); } } } @@ -1016,14 +1016,14 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_POINT_ACTION ): { - if( maVDev.IsLineColor() ) + if( maVDev->IsLineColor() ) { const MetaPointAction* pA = static_cast<const MetaPointAction*>(pAction); ImplCheckLineAttr(); ImplBeginRecord( WIN_EMR_SETPIXELV ); ImplWritePoint( pA->GetPoint() ); - ImplWriteColor( maVDev.GetLineColor() ); + ImplWriteColor( maVDev->GetLineColor() ); ImplEndRecord(); } } @@ -1031,7 +1031,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_LINE_ACTION ): { - if( maVDev.IsLineColor() ) + if( maVDev->IsLineColor() ) { const MetaLineAction* pA = static_cast<const MetaLineAction*>(pAction); @@ -1049,7 +1049,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) ImplBeginRecord( WIN_EMR_SETPIXELV ); ImplWritePoint( pA->GetEndPoint() ); - ImplWriteColor( maVDev.GetLineColor() ); + ImplWriteColor( maVDev->GetLineColor() ); ImplEndRecord(); } else @@ -1066,7 +1066,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_RECT_ACTION ): { - if( maVDev.IsLineColor() || maVDev.IsFillColor() ) + if( maVDev->IsLineColor() || maVDev->IsFillColor() ) { const MetaRectAction* pA = static_cast<const MetaRectAction*>(pAction); @@ -1082,7 +1082,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_ROUNDRECT_ACTION ): { - if( maVDev.IsLineColor() || maVDev.IsFillColor() ) + if( maVDev->IsLineColor() || maVDev->IsFillColor() ) { const MetaRoundRectAction* pA = static_cast<const MetaRoundRectAction*>(pAction); @@ -1099,7 +1099,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_ELLIPSE_ACTION ): { - if( maVDev.IsLineColor() || maVDev.IsFillColor() ) + if( maVDev->IsLineColor() || maVDev->IsFillColor() ) { const MetaEllipseAction* pA = static_cast<const MetaEllipseAction*>(pAction); @@ -1118,7 +1118,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_CHORD_ACTION ): case( META_POLYGON_ACTION ): { - if( maVDev.IsLineColor() || maVDev.IsFillColor() ) + if( maVDev->IsLineColor() || maVDev->IsFillColor() ) { Polygon aPoly; @@ -1157,7 +1157,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_POLYLINE_ACTION ): { - if( maVDev.IsLineColor() ) + if( maVDev->IsLineColor() ) { const MetaPolyLineAction* pA = static_cast<const MetaPolyLineAction*>(pAction); const Polygon& rPoly = pA->GetPolygon(); @@ -1180,7 +1180,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_POLYPOLYGON_ACTION ): { - if( maVDev.IsLineColor() || maVDev.IsFillColor() ) + if( maVDev->IsLineColor() || maVDev->IsFillColor() ) ImplWritePolyPolygonRecord( static_cast<const MetaPolyPolygonAction*>(pAction)->GetPolyPolygon() ); } break; @@ -1190,7 +1190,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) const MetaGradientAction* pA = static_cast<const MetaGradientAction*>(pAction); GDIMetaFile aTmpMtf; - maVDev.AddGradientActions( pA->GetRect(), pA->GetGradient(), aTmpMtf ); + maVDev->AddGradientActions( pA->GetRect(), pA->GetGradient(), aTmpMtf ); ImplWrite( aTmpMtf ); } break; @@ -1200,7 +1200,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) const MetaHatchAction* pA = static_cast<const MetaHatchAction*>(pAction); GDIMetaFile aTmpMtf; - maVDev.AddHatchActions( pA->GetPolyPolygon(), pA->GetHatch(), aTmpMtf ); + maVDev->AddHatchActions( pA->GetPolyPolygon(), pA->GetHatch(), aTmpMtf ); ImplWrite( aTmpMtf ); } break; @@ -1261,19 +1261,19 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) const MetaAction* pSubstAct = aSubstitute.GetAction( i ); if( pSubstAct->GetType() == META_BMPSCALE_ACTION ) { - maVDev.Push( PushFlags::ALL ); + maVDev->Push( PushFlags::ALL ); ImplBeginRecord( WIN_EMR_SAVEDC ); ImplEndRecord(); MapMode aMapMode( aSubstitute.GetPrefMapMode() ); - Size aOutSize( OutputDevice::LogicToLogic( pA->GetSize(), maVDev.GetMapMode(), aMapMode ) ); + Size aOutSize( OutputDevice::LogicToLogic( pA->GetSize(), maVDev->GetMapMode(), aMapMode ) ); aMapMode.SetScaleX( Fraction( aOutSize.Width(), aSubstitute.GetPrefSize().Width() ) ); aMapMode.SetScaleY( Fraction( aOutSize.Height(), aSubstitute.GetPrefSize().Height() ) ); - aMapMode.SetOrigin( OutputDevice::LogicToLogic( pA->GetPoint(), maVDev.GetMapMode(), aMapMode ) ); - maVDev.SetMapMode( aMapMode ); + aMapMode.SetOrigin( OutputDevice::LogicToLogic( pA->GetPoint(), maVDev->GetMapMode(), aMapMode ) ); + maVDev->SetMapMode( aMapMode ); ImplWrite( aSubstitute ); - maVDev.Pop(); + maVDev->Pop(); ImplBeginRecord( WIN_EMR_RESTOREDC ); m_rStm.WriteInt32( -1 ); ImplEndRecord(); @@ -1286,7 +1286,7 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case META_BMP_ACTION: { const MetaBmpAction* pA = static_cast<const MetaBmpAction *>(pAction); - ImplWriteBmpRecord( pA->GetBitmap(), pA->GetPoint(), maVDev.PixelToLogic( pA->GetBitmap().GetSizePixel() ), WIN_SRCCOPY ); + ImplWriteBmpRecord( pA->GetBitmap(), pA->GetPoint(), maVDev->PixelToLogic( pA->GetBitmap().GetSizePixel() ), WIN_SRCCOPY ); } break; @@ -1317,8 +1317,8 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) { aBmp.Replace( aMsk, COL_WHITE ); aMsk.Invert(); - ImplWriteBmpRecord( aMsk, pA->GetPoint(), maVDev.PixelToLogic( aMsk.GetSizePixel() ), WIN_SRCPAINT ); - ImplWriteBmpRecord( aBmp, pA->GetPoint(), maVDev.PixelToLogic( aBmp.GetSizePixel() ), WIN_SRCAND ); + ImplWriteBmpRecord( aMsk, pA->GetPoint(), maVDev->PixelToLogic( aMsk.GetSizePixel() ), WIN_SRCPAINT ); + ImplWriteBmpRecord( aBmp, pA->GetPoint(), maVDev->PixelToLogic( aBmp.GetSizePixel() ), WIN_SRCAND ); } else ImplWriteBmpRecord( aBmp, pA->GetPoint(), aBmp.GetSizePixel(), WIN_SRCCOPY ); @@ -1405,14 +1405,14 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_LINECOLOR_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); mbLineChanged = true; } break; case( META_FILLCOLOR_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); mbFillChanged = true; } break; @@ -1423,14 +1423,14 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_TEXTALIGN_ACTION ): case( META_FONT_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); mbTextChanged = true; } break; case( META_ISECTRECTCLIPREGION_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); ImplBeginRecord( WIN_EMR_INTERSECTCLIPRECT ); ImplWriteRect( static_cast<const MetaISectRectClipRegionAction*>(pAction)->GetRect() ); @@ -1442,18 +1442,18 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_ISECTREGIONCLIPREGION_ACTION ): case( META_MOVECLIPREGION_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); } break; case( META_REFPOINT_ACTION ): case( META_MAPMODE_ACTION ): - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); break; case( META_PUSH_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); ImplBeginRecord( WIN_EMR_SAVEDC ); ImplEndRecord(); @@ -1462,20 +1462,20 @@ void EMFWriter::ImplWrite( const GDIMetaFile& rMtf ) case( META_POP_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); ImplBeginRecord( WIN_EMR_RESTOREDC ); m_rStm.WriteInt32( -1 ); ImplEndRecord(); - ImplWriteRasterOp( maVDev.GetRasterOp() ); + ImplWriteRasterOp( maVDev->GetRasterOp() ); mbLineChanged = mbFillChanged = mbTextChanged = true; } break; case( META_RASTEROP_ACTION ): { - const_cast<MetaAction*>(pAction)->Execute( &maVDev ); + const_cast<MetaAction*>(pAction)->Execute( maVDev ); ImplWriteRasterOp( static_cast<const MetaRasterOpAction*>(pAction)->GetRasterOp() ); } break; diff --git a/vcl/source/filter/wmf/emfwr.hxx b/vcl/source/filter/wmf/emfwr.hxx index 5bf294a0e323..d037bdeb9d6c 100644 --- a/vcl/source/filter/wmf/emfwr.hxx +++ b/vcl/source/filter/wmf/emfwr.hxx @@ -33,7 +33,7 @@ class EMFWriter { private: - VirtualDevice maVDev; + ScopedVclPtr<VirtualDevice> maVDev; MapMode maDestMapMode; SvStream& m_rStm; bool* mpHandlesUsed; @@ -90,7 +90,8 @@ private: public: EMFWriter(SvStream &rStream) - : m_rStm(rStream) + : maVDev( VclPtr<VirtualDevice>::Create() ) + , m_rStm(rStream) , mpHandlesUsed(NULL) , mnHandleCount(0) , mnRecordCount(0) diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx index 72c20cb0ac25..740ac493f353 100644 --- a/vcl/source/filter/wmf/winmtf.cxx +++ b/vcl/source/filter/wmf/winmtf.cxx @@ -236,12 +236,11 @@ WinMtfFontStyle::WinMtfFontStyle( LOGFONTW& rFont ) { // #i117968# VirtualDevice is not thread safe, but filter is used in multithreading SolarMutexGuard aGuard; - VirtualDevice aVDev; - + VclPtrInstance< VirtualDevice > pVDev; // converting the cell height into a font height aFont.SetSize( aFontSize ); - aVDev.SetFont( aFont ); - FontMetric aMetric( aVDev.GetFontMetric() ); + pVDev->SetFont( aFont ); + FontMetric aMetric( pVDev->GetFontMetric() ); long nHeight = aMetric.GetAscent() + aMetric.GetDescent(); if (nHeight) { @@ -1448,20 +1447,19 @@ void WinMtfOutput::DrawText( Point& rPosition, OUString& rText, long* pDXArry, b { // #i117968# VirtualDevice is not thread safe, but filter is used in multithreading SolarMutexGuard aGuard; - VirtualDevice aVDev; - + VclPtrInstance< VirtualDevice > pVDev; sal_Int32 nTextWidth; - aVDev.SetMapMode( MapMode( MAP_100TH_MM ) ); - aVDev.SetFont( maFont ); + pVDev->SetMapMode( MapMode( MAP_100TH_MM ) ); + pVDev->SetFont( maFont ); if( pDXArry ) { sal_uInt32 nLen = rText.getLength(); - nTextWidth = aVDev.GetTextWidth( OUString(rText[ nLen - 1 ]) ); + nTextWidth = pVDev->GetTextWidth( OUString(rText[ nLen - 1 ]) ); if( nLen > 1 ) nTextWidth += pDXArry[ nLen - 2 ]; } else - nTextWidth = aVDev.GetTextWidth( rText ); + nTextWidth = pVDev->GetTextWidth( rText ); if( mnTextAlign & TA_UPDATECP ) rPosition = maActPos; @@ -1497,12 +1495,11 @@ void WinMtfOutput::DrawText( Point& rPosition, OUString& rText, long* pDXArry, b { // #i117968# VirtualDevice is not thread safe, but filter is used in multithreading SolarMutexGuard aGuard; - VirtualDevice aVDev; - + VclPtrInstance< VirtualDevice > pVDev; pDX = new long[ rText.getLength() ]; - aVDev.SetMapMode( MAP_100TH_MM ); - aVDev.SetFont( maLatestFont ); - aVDev.GetTextArray( rText, pDX, 0, rText.getLength()); + pVDev->SetMapMode( MAP_100TH_MM ); + pVDev->SetFont( maLatestFont ); + pVDev->GetTextArray( rText, pDX, 0, rText.getLength()); } mpGDIMetaFile->AddAction( new MetaTextArrayAction( rPosition, rText, pDX, 0, rText.getLength() ) ); if ( !pDXArry ) // this means we have created our own array @@ -1516,26 +1513,26 @@ void WinMtfOutput::ImplDrawBitmap( const Point& rPos, const Size& rSize, const B BitmapEx aBmpEx( rBitmap ); if ( mbComplexClip ) { - VirtualDevice aVDev; + VclPtrInstance< VirtualDevice > pVDev; MapMode aMapMode( MAP_100TH_MM ); aMapMode.SetOrigin( Point( -rPos.X(), -rPos.Y() ) ); - const Size aOutputSizePixel( aVDev.LogicToPixel( rSize, aMapMode ) ); + const Size aOutputSizePixel( pVDev->LogicToPixel( rSize, aMapMode ) ); const Size aSizePixel( rBitmap.GetSizePixel() ); if ( aOutputSizePixel.Width() && aOutputSizePixel.Height() ) { aMapMode.SetScaleX( Fraction( aSizePixel.Width(), aOutputSizePixel.Width() ) ); aMapMode.SetScaleY( Fraction( aSizePixel.Height(), aOutputSizePixel.Height() ) ); } - aVDev.SetMapMode( aMapMode ); - aVDev.SetOutputSizePixel( aSizePixel ); - aVDev.SetFillColor( Color( COL_BLACK ) ); + pVDev->SetMapMode( aMapMode ); + pVDev->SetOutputSizePixel( aSizePixel ); + pVDev->SetFillColor( Color( COL_BLACK ) ); const tools::PolyPolygon aClip( aClipPath.getClipPath() ); - aVDev.DrawPolyPolygon( aClip ); + pVDev->DrawPolyPolygon( aClip ); const Point aEmptyPoint; // #i50672# Extract whole VDev content (to match size of rBitmap) - aVDev.EnableMapMode( false ); - Bitmap aMask( aVDev.GetBitmap( aEmptyPoint, aSizePixel ).CreateMask( Color( COL_WHITE ) ) ); + pVDev->EnableMapMode( false ); + Bitmap aMask( pVDev->GetBitmap( aEmptyPoint, aSizePixel ).CreateMask( Color( COL_WHITE ) ) ); if ( aBmpEx.IsTransparent() ) { diff --git a/vcl/source/filter/wmf/wmfwr.cxx b/vcl/source/filter/wmf/wmfwr.cxx index 2b6e6a40ddcd..dc98e2eae9b6 100644 --- a/vcl/source/filter/wmf/wmfwr.cxx +++ b/vcl/source/filter/wmf/wmfwr.cxx @@ -1815,7 +1815,7 @@ bool WMFWriter::WriteWMF( const GDIMetaFile& rMTF, SvStream& rTargetStream, delete pAt; } - delete pVirDev; + pVirDev.disposeAndClear(); if ( xStatusIndicator.is() ) xStatusIndicator->end(); diff --git a/vcl/source/filter/wmf/wmfwr.hxx b/vcl/source/filter/wmf/wmfwr.hxx index c27a8eb3be7f..c017eb53aa61 100644 --- a/vcl/source/filter/wmf/wmfwr.hxx +++ b/vcl/source/filter/wmf/wmfwr.hxx @@ -58,7 +58,7 @@ private: com::sun::star::uno::Reference< com::sun::star::task::XStatusIndicator > xStatusIndicator; SvStream* pWMF; - VirtualDevice* pVirDev; + VclPtr<VirtualDevice> pVirDev; MapMode aTargetMapMode; Size aTargetSize; diff --git a/vcl/source/gdi/animate.cxx b/vcl/source/gdi/animate.cxx index f83581fd8bba..4ab246f0d713 100644 --- a/vcl/source/gdi/animate.cxx +++ b/vcl/source/gdi/animate.cxx @@ -802,4 +802,10 @@ SvStream& ReadAnimation( SvStream& rIStm, Animation& rAnimation ) return rIStm; } +AInfo::AInfo() : pOutDev( NULL ), + pViewData( NULL ), + nExtraData( 0L ), + bWithSize( false ), + bPause( false ) {} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index 79ae295b3f74..80cb6f832b29 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -706,16 +706,16 @@ BitmapEx BitmapEx:: AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize Size aStdSize( aStandardSize, aStandardSize ); Rectangle aRect(aEmptyPoint, aStdSize ); - VirtualDevice aVirDevice( *Application::GetDefaultDevice(), 0, 1 ); - aVirDevice.SetOutputSizePixel( aStdSize ); - aVirDevice.SetFillColor( COL_TRANSPARENT ); - aVirDevice.SetLineColor( COL_TRANSPARENT ); + ScopedVclPtrInstance< VirtualDevice > aVirDevice( *Application::GetDefaultDevice(), 0, 1 ); + aVirDevice->SetOutputSizePixel( aStdSize ); + aVirDevice->SetFillColor( COL_TRANSPARENT ); + aVirDevice->SetLineColor( COL_TRANSPARENT ); // Draw a rect into virDevice - aVirDevice.DrawRect( aRect ); + aVirDevice->DrawRect( aRect ); Point aPointPixel( (long)imgposX, (long)imgposY ); - aVirDevice.DrawBitmapEx( aPointPixel, aRet ); - aRet = aVirDevice.GetBitmapEx( aEmptyPoint, aStdSize ); + aVirDevice->DrawBitmapEx( aPointPixel, aRet ); + aRet = aVirDevice->GetBitmapEx( aEmptyPoint, aStdSize ); return aRet; } diff --git a/vcl/source/gdi/cvtsvm.cxx b/vcl/source/gdi/cvtsvm.cxx index 3ef048230e30..8509f66d8eaf 100644 --- a/vcl/source/gdi/cvtsvm.cxx +++ b/vcl/source/gdi/cvtsvm.cxx @@ -497,8 +497,8 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) } LineInfo aLineInfo( LINE_NONE, 0 ); - ::std::stack< LineInfo* > aLIStack; - VirtualDevice aFontVDev; + ::std::stack< LineInfo* > aLIStack; + ScopedVclPtrInstance< VirtualDevice > aFontVDev; rtl_TextEncoding eActualCharSet = osl_getThreadTextEncoding(); bool bFatLine = false; @@ -848,7 +848,7 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) rMtf.AddAction( new MetaTextFillColorAction( aFont.GetFillColor(), !aFont.IsTransparent() ) ); // #106172# Track font relevant data in shadow VDev - aFontVDev.SetFont( aFont ); + aFontVDev->SetFont( aFont ); } break; @@ -904,7 +904,7 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) { boost::scoped_array<long> pTmpAry(new long[nStrLen]); - aFontVDev.GetTextArray( aStr, pTmpAry.get(), nIndex, nLen ); + aFontVDev->GetTextArray( aStr, pTmpAry.get(), nIndex, nLen ); // now, the difference between the // last and the second last DX array @@ -1022,7 +1022,7 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) rMtf.AddAction( new MetaMapModeAction( aMapMode ) ); // #106172# Track font relevant data in shadow VDev - aFontVDev.SetMapMode( aMapMode ); + aFontVDev->SetMapMode( aMapMode ); } break; @@ -1132,7 +1132,7 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) rMtf.AddAction( new MetaPushAction( PushFlags::ALL ) ); // #106172# Track font relevant data in shadow VDev - aFontVDev.Push(); + aFontVDev->Push(); } break; @@ -1159,7 +1159,7 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) rMtf.AddAction( new MetaPopAction() ); // #106172# Track font relevant data in shadow VDev - aFontVDev.Pop(); + aFontVDev->Pop(); } break; @@ -1259,9 +1259,9 @@ void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf ) // #106172# Track font relevant data in shadow VDev if( bSet ) - aFontVDev.SetRefPoint( aRefPoint ); + aFontVDev->SetRefPoint( aRefPoint ); else - aFontVDev.SetRefPoint(); + aFontVDev->SetRefPoint(); } break; @@ -1374,7 +1374,7 @@ void SVMConverter::ImplConvertToSVM1( SvStream& rOStm, GDIMetaFile& rMtf ) rtl_TextEncoding eActualCharSet = osl_getThreadTextEncoding(); const Size aPrefSize( rMtf.GetPrefSize() ); bool bRop_0_1 = false; - VirtualDevice aSaveVDev; + ScopedVclPtrInstance< VirtualDevice > aSaveVDev; Color aLineCol( COL_BLACK ); ::std::stack< Color* > aLineColStack; @@ -1392,7 +1392,7 @@ void SVMConverter::ImplConvertToSVM1( SvStream& rOStm, GDIMetaFile& rMtf ) nCountPos = rOStm.Tell(); rOStm.SeekRel( 4L ); - const sal_Int32 nActCount = ImplWriteActions( rOStm, rMtf, aSaveVDev, bRop_0_1, aLineCol, aLineColStack, eActualCharSet ); + const sal_Int32 nActCount = ImplWriteActions( rOStm, rMtf, *aSaveVDev.get(), bRop_0_1, aLineCol, aLineColStack, eActualCharSet ); const sal_uLong nActPos = rOStm.Tell(); rOStm.Seek( nCountPos ); @@ -2311,10 +2311,10 @@ sal_uLong SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf, { // write actions for hatch - VirtualDevice aVDev; + ScopedVclPtrInstance< VirtualDevice > aVDev; GDIMetaFile aTmpMtf; - aVDev.AddHatchActions( rPolyPoly, rHatch, aTmpMtf ); + aVDev->AddHatchActions( rPolyPoly, rHatch, aTmpMtf ); nAddCount = ImplWriteActions( rOStm, aTmpMtf, rSaveVDev, rRop_0_1, rLineCol, rLineColStack, rActualCharSet ); nNewPos = rOStm.Tell(); rOStm.Seek( nOldPos ); diff --git a/vcl/source/gdi/gdimetafiletools.cxx b/vcl/source/gdi/gdimetafiletools.cxx index 3fa559a6abb8..1c19a11a4305 100644 --- a/vcl/source/gdi/gdimetafiletools.cxx +++ b/vcl/source/gdi/gdimetafiletools.cxx @@ -161,23 +161,23 @@ namespace // in pixel mode for alpha channel painting (black is transparent, // white to paint 100% opacity) const Size aSizePixel(rBitmapEx.GetSizePixel()); - VirtualDevice aVDev; + ScopedVclPtrInstance< VirtualDevice > aVDev; - aVDev.SetOutputSizePixel(aSizePixel); - aVDev.EnableMapMode(false); - aVDev.SetFillColor(COL_WHITE); - aVDev.SetLineColor(); + aVDev->SetOutputSizePixel(aSizePixel); + aVDev->EnableMapMode(false); + aVDev->SetFillColor(COL_WHITE); + aVDev->SetLineColor(); if(rBitmapEx.IsTransparent()) { // use given alpha channel - aVDev.DrawBitmap(Point(0, 0), rBitmapEx.GetAlpha().GetBitmap()); + aVDev->DrawBitmap(Point(0, 0), rBitmapEx.GetAlpha().GetBitmap()); } else { // reset alpha channel - aVDev.SetBackground(Wallpaper(Color(COL_BLACK))); - aVDev.Erase(); + aVDev->SetBackground(Wallpaper(Color(COL_BLACK))); + aVDev->Erase(); } // transform polygon from clipping to pixel coordinates @@ -203,11 +203,11 @@ namespace aInvertPixelPoly.append(aPixelPoly); // paint as alpha - aVDev.DrawPolyPolygon(aInvertPixelPoly); + aVDev->DrawPolyPolygon(aInvertPixelPoly); // get created alpha mask and set defaults AlphaMask aAlpha( - aVDev.GetBitmap( + aVDev->GetBitmap( Point(0, 0), aSizePixel)); diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx index a761a5d07516..0eafc4f67e38 100644 --- a/vcl/source/gdi/gdimtf.cxx +++ b/vcl/source/gdi/gdimtf.cxx @@ -723,10 +723,10 @@ void GDIMetaFile::Move( long nX, long nY ) { const Size aBaseOffset( nX, nY ); Size aOffset( aBaseOffset ); - VirtualDevice aMapVDev; + ScopedVclPtrInstance< VirtualDevice > aMapVDev; - aMapVDev.EnableOutput( false ); - aMapVDev.SetMapMode( GetPrefMapMode() ); + aMapVDev->EnableOutput( false ); + aMapVDev->SetMapMode( GetPrefMapMode() ); for( MetaAction* pAct = FirstAction(); pAct; pAct = NextAction() ) { @@ -745,8 +745,8 @@ void GDIMetaFile::Move( long nX, long nY ) ( META_PUSH_ACTION == nType ) || ( META_POP_ACTION == nType ) ) { - pModAct->Execute( &aMapVDev ); - aOffset = OutputDevice::LogicToLogic( aBaseOffset, GetPrefMapMode(), aMapVDev.GetMapMode() ); + pModAct->Execute( aMapVDev.get() ); + aOffset = OutputDevice::LogicToLogic( aBaseOffset, GetPrefMapMode(), aMapVDev->GetMapMode() ); } pModAct->Move( aOffset.Width(), aOffset.Height() ); @@ -757,11 +757,11 @@ void GDIMetaFile::Move( long nX, long nY, long nDPIX, long nDPIY ) { const Size aBaseOffset( nX, nY ); Size aOffset( aBaseOffset ); - VirtualDevice aMapVDev; + ScopedVclPtrInstance< VirtualDevice > aMapVDev; - aMapVDev.EnableOutput( false ); - aMapVDev.SetReferenceDevice( nDPIX, nDPIY ); - aMapVDev.SetMapMode( GetPrefMapMode() ); + aMapVDev->EnableOutput( false ); + aMapVDev->SetReferenceDevice( nDPIX, nDPIY ); + aMapVDev->SetMapMode( GetPrefMapMode() ); for( MetaAction* pAct = FirstAction(); pAct; pAct = NextAction() ) { @@ -780,16 +780,16 @@ void GDIMetaFile::Move( long nX, long nY, long nDPIX, long nDPIY ) ( META_PUSH_ACTION == nType ) || ( META_POP_ACTION == nType ) ) { - pModAct->Execute( &aMapVDev ); - if( aMapVDev.GetMapMode().GetMapUnit() == MAP_PIXEL ) + pModAct->Execute( aMapVDev.get() ); + if( aMapVDev->GetMapMode().GetMapUnit() == MAP_PIXEL ) { - aOffset = aMapVDev.LogicToPixel( aBaseOffset, GetPrefMapMode() ); - MapMode aMap( aMapVDev.GetMapMode() ); + aOffset = aMapVDev->LogicToPixel( aBaseOffset, GetPrefMapMode() ); + MapMode aMap( aMapVDev->GetMapMode() ); aOffset.Width() = static_cast<long>(aOffset.Width() * (double)aMap.GetScaleX()); aOffset.Height() = static_cast<long>(aOffset.Height() * (double)aMap.GetScaleY()); } else - aOffset = OutputDevice::LogicToLogic( aBaseOffset, GetPrefMapMode(), aMapVDev.GetMapMode() ); + aOffset = OutputDevice::LogicToLogic( aBaseOffset, GetPrefMapMode(), aMapVDev->GetMapMode() ); } pModAct->Move( aOffset.Width(), aOffset.Height() ); @@ -825,10 +825,10 @@ void GDIMetaFile::Scale( const Fraction& rScaleX, const Fraction& rScaleY ) void GDIMetaFile::Clip( const Rectangle& i_rClipRect ) { Rectangle aCurRect( i_rClipRect ); - VirtualDevice aMapVDev; + ScopedVclPtrInstance< VirtualDevice > aMapVDev; - aMapVDev.EnableOutput( false ); - aMapVDev.SetMapMode( GetPrefMapMode() ); + aMapVDev->EnableOutput( false ); + aMapVDev->SetMapMode( GetPrefMapMode() ); for( MetaAction* pAct = FirstAction(); pAct; pAct = NextAction() ) { @@ -838,8 +838,8 @@ void GDIMetaFile::Clip( const Rectangle& i_rClipRect ) ( META_PUSH_ACTION == nType ) || ( META_POP_ACTION == nType ) ) { - pAct->Execute( &aMapVDev ); - aCurRect = OutputDevice::LogicToLogic( i_rClipRect, GetPrefMapMode(), aMapVDev.GetMapMode() ); + pAct->Execute( aMapVDev.get() ); + aCurRect = OutputDevice::LogicToLogic( i_rClipRect, GetPrefMapMode(), aMapVDev->GetMapMode() ); } else if( nType == META_CLIPREGION_ACTION ) { @@ -892,12 +892,12 @@ void GDIMetaFile::ImplAddGradientEx( GDIMetaFile& rMtf, const Gradient& rGrad ) { // Generate comment, GradientEx and Gradient actions (within DrawGradient) - VirtualDevice aVDev( rMapDev, 0 ); - aVDev.EnableOutput( false ); + ScopedVclPtrInstance< VirtualDevice > aVDev( rMapDev, 0 ); + aVDev->EnableOutput( false ); GDIMetaFile aGradMtf; - aGradMtf.Record( &aVDev ); - aVDev.DrawGradient( rPolyPoly, rGrad ); + aGradMtf.Record( aVDev.get() ); + aVDev->DrawGradient( rPolyPoly, rGrad ); aGradMtf.Stop(); size_t i, nAct( aGradMtf.GetActionSize() ); @@ -917,7 +917,7 @@ void GDIMetaFile::Rotate( long nAngle10 ) if( nAngle10 ) { GDIMetaFile aMtf; - VirtualDevice aMapVDev; + ScopedVclPtrInstance< VirtualDevice > aMapVDev; const double fAngle = F_PI1800 * nAngle10; const double fSin = sin( fAngle ); const double fCos = cos( fAngle ); @@ -926,8 +926,8 @@ void GDIMetaFile::Rotate( long nAngle10 ) aPoly.Rotate( Point(), fSin, fCos ); - aMapVDev.EnableOutput( false ); - aMapVDev.SetMapMode( GetPrefMapMode() ); + aMapVDev->EnableOutput( false ); + aMapVDev->SetMapMode( GetPrefMapMode() ); const Rectangle aNewBound( aPoly.GetBoundRect() ); @@ -1130,7 +1130,7 @@ void GDIMetaFile::Rotate( long nAngle10 ) { MetaGradientAction* pAct = static_cast<MetaGradientAction*>(pAction); - ImplAddGradientEx( aMtf, aMapVDev, + ImplAddGradientEx( aMtf, *aMapVDev.get(), ImplGetRotatedPolygon( pAct->GetRect(), aRotAnchor, aRotOffset, fSin, fCos ), pAct->GetGradient() ); } @@ -1162,7 +1162,7 @@ void GDIMetaFile::Rotate( long nAngle10 ) { // Add rotated gradientex MetaGradientExAction* pAct = static_cast<MetaGradientExAction*>(pAction); - ImplAddGradientEx( aMtf, aMapVDev, + ImplAddGradientEx( aMtf, *aMapVDev.get(), ImplGetRotatedPolyPolygon( pAct->GetPolyPolygon(), aRotAnchor, aRotOffset, fSin, fCos ), pAct->GetGradient() ); } @@ -1225,7 +1225,7 @@ void GDIMetaFile::Rotate( long nAngle10 ) else if ( pCommentAct->GetComment() == "XPATHSTROKE_SEQ_END" || pCommentAct->GetComment() == "XPATHFILL_SEQ_END" ) { - pAction->Execute( &aMapVDev ); + pAction->Execute( aMapVDev.get() ); pAction->Duplicate(); aMtf.AddAction( pAction ); } @@ -1348,7 +1348,7 @@ void GDIMetaFile::Rotate( long nAngle10 ) default: { - pAction->Execute( &aMapVDev ); + pAction->Execute( aMapVDev.get() ); pAction->Duplicate(); aMtf.AddAction( pAction ); @@ -1357,8 +1357,8 @@ void GDIMetaFile::Rotate( long nAngle10 ) ( META_PUSH_ACTION == nActionType ) || ( META_POP_ACTION == nActionType ) ) { - aRotAnchor = OutputDevice::LogicToLogic( aOrigin, aPrefMapMode, aMapVDev.GetMapMode() ); - aRotOffset = OutputDevice::LogicToLogic( aOffset, aPrefMapMode, aMapVDev.GetMapMode() ); + aRotAnchor = OutputDevice::LogicToLogic( aOrigin, aPrefMapMode, aMapVDev->GetMapMode() ); + aRotOffset = OutputDevice::LogicToLogic( aOffset, aPrefMapMode, aMapVDev->GetMapMode() ); } } break; @@ -1400,10 +1400,10 @@ static void ImplActionBounds( Rectangle& o_rOutBounds, Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHairline ) const { GDIMetaFile aMtf; - VirtualDevice aMapVDev( i_rReference ); + ScopedVclPtrInstance< VirtualDevice > aMapVDev( i_rReference ); - aMapVDev.EnableOutput( false ); - aMapVDev.SetMapMode( GetPrefMapMode() ); + aMapVDev->EnableOutput( false ); + aMapVDev->SetMapMode( GetPrefMapMode() ); std::vector<Rectangle> aClipStack( 1, Rectangle() ); std::vector<PushFlags> aPushFlagStack; @@ -1419,7 +1419,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaAction* pAction = GetAction(a); const sal_uInt16 nActionType = pAction->GetType(); - Rectangle* pUseHairline = (pHairline && aMapVDev.IsLineColor()) ? pHairline : 0; + Rectangle* pUseHairline = (pHairline && aMapVDev->IsLineColor()) ? pHairline : 0; switch( nActionType ) { @@ -1427,8 +1427,8 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaPixelAction* pAct = static_cast<MetaPixelAction*>(pAction); ImplActionBounds( aBound, - Rectangle( OutputDevice::LogicToLogic( pAct->GetPoint(), aMapVDev.GetMapMode(), GetPrefMapMode() ), - aMapVDev.PixelToLogic( Size( 1, 1 ), GetPrefMapMode() ) ), + Rectangle( OutputDevice::LogicToLogic( pAct->GetPoint(), aMapVDev->GetMapMode(), GetPrefMapMode() ), + aMapVDev->PixelToLogic( Size( 1, 1 ), GetPrefMapMode() ) ), aClipStack, pUseHairline ); } break; @@ -1437,8 +1437,8 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaPointAction* pAct = static_cast<MetaPointAction*>(pAction); ImplActionBounds( aBound, - Rectangle( OutputDevice::LogicToLogic( pAct->GetPoint(), aMapVDev.GetMapMode(), GetPrefMapMode() ), - aMapVDev.PixelToLogic( Size( 1, 1 ), GetPrefMapMode() ) ), + Rectangle( OutputDevice::LogicToLogic( pAct->GetPoint(), aMapVDev->GetMapMode(), GetPrefMapMode() ), + aMapVDev->PixelToLogic( Size( 1, 1 ), GetPrefMapMode() ) ), aClipStack, pUseHairline ); } break; @@ -1458,28 +1458,28 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai pUseHairline = 0; } - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; case( META_RECT_ACTION ): { MetaRectAction* pAct = static_cast<MetaRectAction*>(pAction); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; case( META_ROUNDRECT_ACTION ): { MetaRoundRectAction* pAct = static_cast<MetaRoundRectAction*>(pAction); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; case( META_ELLIPSE_ACTION ): { MetaEllipseAction* pAct = static_cast<MetaEllipseAction*>(pAction); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1488,7 +1488,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai MetaArcAction* pAct = static_cast<MetaArcAction*>(pAction); // FIXME: this is imprecise // e.g. for small arcs the whole rectangle is WAY too large - ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1497,7 +1497,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai MetaPieAction* pAct = static_cast<MetaPieAction*>(pAction); // FIXME: this is imprecise // e.g. for small arcs the whole rectangle is WAY too large - ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1506,7 +1506,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai MetaChordAction* pAct = static_cast<MetaChordAction*>(pAction); // FIXME: this is imprecise // e.g. for small arcs the whole rectangle is WAY too large - ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1523,7 +1523,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai pUseHairline = 0; } - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1531,7 +1531,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaPolygonAction* pAct = static_cast<MetaPolygonAction*>(pAction); Rectangle aRect( pAct->GetPolygon().GetBoundRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1539,7 +1539,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaPolyPolygonAction* pAct = static_cast<MetaPolyPolygonAction*>(pAction); Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline ); } break; @@ -1548,10 +1548,10 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai MetaTextAction* pAct = static_cast<MetaTextAction*>(pAction); Rectangle aRect; // hdu said base = index - aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen() ); + aMapVDev->GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen() ); Point aPt( pAct->GetPoint() ); aRect.Move( aPt.X(), aPt.Y() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1560,11 +1560,11 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai MetaTextArrayAction* pAct = static_cast<MetaTextArrayAction*>(pAction); Rectangle aRect; // hdu said base = index - aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen(), + aMapVDev->GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen(), 0, pAct->GetDXArray() ); Point aPt( pAct->GetPoint() ); aRect.Move( aPt.X(), aPt.Y() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1573,11 +1573,11 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai MetaStretchTextAction* pAct = static_cast<MetaStretchTextAction*>(pAction); Rectangle aRect; // hdu said base = index - aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen(), + aMapVDev->GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen(), pAct->GetWidth(), NULL ); Point aPt( pAct->GetPoint() ); aRect.Move( aPt.X(), aPt.Y() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1589,11 +1589,11 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai OUString aStr( pStr ); Rectangle aRect; - aMapVDev.GetTextBoundRect( aRect, aStr, 0, 0, aStr.getLength(), 0, NULL ); + aMapVDev->GetTextBoundRect( aRect, aStr, 0, 0, aStr.getLength(), 0, NULL ); Point aPt( pAct->GetStartPoint() ); aRect.Move( aPt.X(), aPt.Y() ); aRect.Right() = aRect.Left() + pAct->GetWidth(); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1601,7 +1601,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaBmpScaleAction* pAct = static_cast<MetaBmpScaleAction*>(pAction); Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1609,7 +1609,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaBmpScalePartAction* pAct = static_cast<MetaBmpScalePartAction*>(pAction); Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1617,7 +1617,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaBmpExScaleAction* pAct = static_cast<MetaBmpExScaleAction*>(pAction); Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1625,7 +1625,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaBmpExScalePartAction* pAct = static_cast<MetaBmpExScalePartAction*>(pAction); Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1633,7 +1633,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaGradientAction* pAct = static_cast<MetaGradientAction*>(pAction); Rectangle aRect( pAct->GetRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1641,7 +1641,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaGradientExAction* pAct = static_cast<MetaGradientExAction*>(pAction); Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1655,7 +1655,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaHatchAction* pAct = static_cast<MetaHatchAction*>(pAction); Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1663,7 +1663,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaTransparentAction* pAct = static_cast<MetaTransparentAction*>(pAction); Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1673,7 +1673,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai // MetaFloatTransparentAction is defined limiting it's content Metafile // to it's geometry definition(Point, Size), so use these directly const Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1681,7 +1681,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaEPSAction* pAct = static_cast<MetaEPSAction*>(pAction); Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1689,7 +1689,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaClipRegionAction* pAct = static_cast<MetaClipRegionAction*>(pAction); if( pAct->IsClipping() ) - aClipStack.back() = OutputDevice::LogicToLogic( pAct->GetRegion().GetBoundRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ); + aClipStack.back() = OutputDevice::LogicToLogic( pAct->GetRegion().GetBoundRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ); else aClipStack.back() = Rectangle(); } @@ -1698,7 +1698,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai case( META_ISECTRECTCLIPREGION_ACTION ): { MetaISectRectClipRegionAction* pAct = static_cast<MetaISectRectClipRegionAction*>(pAction); - Rectangle aRect( OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ) ); + Rectangle aRect( OutputDevice::LogicToLogic( pAct->GetRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ) ); if( aClipStack.back().IsEmpty() ) aClipStack.back() = aRect; else @@ -1709,7 +1709,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai case( META_ISECTREGIONCLIPREGION_ACTION ): { MetaISectRegionClipRegionAction* pAct = static_cast<MetaISectRegionClipRegionAction*>(pAction); - Rectangle aRect( OutputDevice::LogicToLogic( pAct->GetRegion().GetBoundRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ) ); + Rectangle aRect( OutputDevice::LogicToLogic( pAct->GetRegion().GetBoundRect(), aMapVDev->GetMapMode(), GetPrefMapMode() ) ); if( aClipStack.back().IsEmpty() ) aClipStack.back() = aRect; else @@ -1720,24 +1720,24 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai case( META_BMP_ACTION ): { MetaBmpAction* pAct = static_cast<MetaBmpAction*>(pAction); - Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( pAct->GetBitmap().GetSizePixel() ) ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + Rectangle aRect( pAct->GetPoint(), aMapVDev->PixelToLogic( pAct->GetBitmap().GetSizePixel() ) ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; case( META_BMPEX_ACTION ): { MetaBmpExAction* pAct = static_cast<MetaBmpExAction*>(pAction); - Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( pAct->GetBitmapEx().GetSizePixel() ) ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + Rectangle aRect( pAct->GetPoint(), aMapVDev->PixelToLogic( pAct->GetBitmapEx().GetSizePixel() ) ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; case( META_MASK_ACTION ): { MetaMaskAction* pAct = static_cast<MetaMaskAction*>(pAction); - Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( pAct->GetBitmap().GetSizePixel() ) ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + Rectangle aRect( pAct->GetPoint(), aMapVDev->PixelToLogic( pAct->GetBitmap().GetSizePixel() ) ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1745,7 +1745,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaMaskScalePartAction* pAct = static_cast<MetaMaskScalePartAction*>(pAction); Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1753,7 +1753,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaMaskScalePartAction* pAct = static_cast<MetaMaskScalePartAction*>(pAction); Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1761,7 +1761,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaWallpaperAction* pAct = static_cast<MetaWallpaperAction*>(pAction); Rectangle aRect( pAct->GetRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1769,7 +1769,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai { MetaTextRectAction* pAct = static_cast<MetaTextRectAction*>(pAction); Rectangle aRect( pAct->GetRect() ); - ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); + ImplActionBounds( aBound, OutputDevice::LogicToLogic( aRect, aMapVDev->GetMapMode(), GetPrefMapMode() ), aClipStack, 0 ); } break; @@ -1779,7 +1779,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai if( ! aClipStack.back().IsEmpty() ) { Size aDelta( pAct->GetHorzMove(), pAct->GetVertMove() ); - aDelta = OutputDevice::LogicToLogic( aDelta, aMapVDev.GetMapMode(), GetPrefMapMode() ); + aDelta = OutputDevice::LogicToLogic( aDelta, aMapVDev->GetMapMode(), GetPrefMapMode() ); aClipStack.back().Move( aDelta.Width(), aDelta.Width() ); } } @@ -1787,7 +1787,7 @@ Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* pHai default: { - pAction->Execute( &aMapVDev ); + pAction->Execute( aMapVDev.get() ); if( nActionType == META_PUSH_ACTION ) { @@ -2890,11 +2890,11 @@ SvStream& GDIMetaFile::Write( SvStream& rOStm ) bool GDIMetaFile::CreateThumbnail(BitmapEx& rBitmapEx, sal_uInt32 nMaximumExtent, BmpConversion eColorConversion, long nScaleFlag) const { // initialization seems to be complicated but is used to avoid rounding errors - VirtualDevice aVDev; + ScopedVclPtrInstance< VirtualDevice > aVDev; const Point aNullPt; - const Point aTLPix( aVDev.LogicToPixel( aNullPt, GetPrefMapMode() ) ); - const Point aBRPix( aVDev.LogicToPixel( Point( GetPrefSize().Width() - 1, GetPrefSize().Height() - 1 ), GetPrefMapMode() ) ); - Size aDrawSize( aVDev.LogicToPixel( GetPrefSize(), GetPrefMapMode() ) ); + const Point aTLPix( aVDev->LogicToPixel( aNullPt, GetPrefMapMode() ) ); + const Point aBRPix( aVDev->LogicToPixel( Point( GetPrefSize().Width() - 1, GetPrefSize().Height() - 1 ), GetPrefMapMode() ) ); + Size aDrawSize( aVDev->LogicToPixel( GetPrefSize(), GetPrefMapMode() ) ); Size aSizePix( labs( aBRPix.X() - aTLPix.X() ) + 1, labs( aBRPix.Y() - aTLPix.Y() ) + 1 ); if (!rBitmapEx.IsEmpty()) @@ -2929,7 +2929,7 @@ bool GDIMetaFile::CreateThumbnail(BitmapEx& rBitmapEx, sal_uInt32 nMaximumExtent // draw image(s) into VDev and get resulting image // do it 4x larger to be able to scale it down & get beautiful antialias Size aAntialiasSize(aSizePix.Width() * 4, aSizePix.Height() * 4); - if (aVDev.SetOutputSizePixel(aAntialiasSize)) + if (aVDev->SetOutputSizePixel(aAntialiasSize)) { // antialias: provide 4x larger size, and then scale down the result Size aAntialias(aDrawSize.Width() * 4, aDrawSize.Height() * 4); @@ -2937,10 +2937,10 @@ bool GDIMetaFile::CreateThumbnail(BitmapEx& rBitmapEx, sal_uInt32 nMaximumExtent // draw metafile into VDev Point aBackPosPix; const_cast<GDIMetaFile *>(this)->WindStart(); - const_cast<GDIMetaFile *>(this)->Play(&aVDev, aBackPosPix, aAntialias); + const_cast<GDIMetaFile *>(this)->Play(aVDev.get(), aBackPosPix, aAntialias); // get paint bitmap - Bitmap aBitmap( aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() ) ); + Bitmap aBitmap( aVDev->GetBitmap( aNullPt, aVDev->GetOutputSizePixel() ) ); // scale down the image to the desired size - use the input scaler for the scaling operation aBitmap.Scale(aDrawSize, nScaleFlag); diff --git a/vcl/source/gdi/impanmvw.cxx b/vcl/source/gdi/impanmvw.cxx index c3e7b793580c..b225280a6102 100644 --- a/vcl/source/gdi/impanmvw.cxx +++ b/vcl/source/gdi/impanmvw.cxx @@ -77,7 +77,7 @@ ImplAnimView::ImplAnimView( Animation* pParent, OutputDevice* pOut, MapMode aTempMap( mpOut->GetMapMode() ); aTempMap.SetOrigin( Point() ); mpBackground->SetMapMode( aTempMap ); - static_cast<vcl::Window*>( mpOut )->SaveBackground( maDispPt, maDispSz, Point(), *mpBackground ); + static_cast<vcl::Window*>( mpOut.get() )->SaveBackground( maDispPt, maDispSz, Point(), *mpBackground ); mpBackground->SetMapMode( MapMode() ); } else @@ -93,8 +93,8 @@ ImplAnimView::ImplAnimView( Animation* pParent, OutputDevice* pOut, ImplAnimView::~ImplAnimView() { - delete mpBackground; - delete mpRestore; + mpBackground.disposeAndClear(); + mpRestore.disposeAndClear(); Animation::ImplDecAnimCount(); } @@ -153,19 +153,19 @@ void ImplAnimView::getPosSize( const AnimationBitmap& rAnm, Point& rPosPix, Size void ImplAnimView::drawToPos( sal_uLong nPos ) { - VirtualDevice aVDev; + ScopedVclPtrInstance<VirtualDevice> aVDev; std::unique_ptr<vcl::Region> xOldClip(!maClip.IsNull() ? new vcl::Region( mpOut->GetClipRegion() ) : NULL); - aVDev.SetOutputSizePixel( maSzPix, false ); + aVDev->SetOutputSizePixel( maSzPix, false ); nPos = std::min( nPos, (sal_uLong) mpParent->Count() - 1UL ); for( sal_uLong i = 0UL; i <= nPos; i++ ) - draw( i, &aVDev ); + draw( i, aVDev.get() ); if (xOldClip) mpOut->SetClipRegion( maClip ); - mpOut->DrawOutDev( maDispPt, maDispSz, Point(), maSzPix, aVDev ); + mpOut->DrawOutDev( maDispPt, maDispSz, Point(), maSzPix, *aVDev.get() ); if (xOldClip) mpOut->SetClipRegion(*xOldClip); @@ -180,7 +180,7 @@ void ImplAnimView::draw( sal_uLong nPos, VirtualDevice* pVDev ) setMarked( true ); else if( !mbPause ) { - VirtualDevice* pDev; + VclPtr<VirtualDevice> pDev; Point aPosPix; Point aBmpPosPix; Size aSizePix; @@ -273,10 +273,10 @@ void ImplAnimView::draw( sal_uLong nPos, VirtualDevice* pVDev ) xOldClip.reset(); } - delete pDev; + pDev.disposeAndClear(); if( mpOut->GetOutDevType() == OUTDEV_WINDOW ) - static_cast<vcl::Window*>( mpOut )->Sync(); + static_cast<vcl::Window*>( mpOut.get() )->Sync(); } } } @@ -290,7 +290,7 @@ void ImplAnimView::repaint() MapMode aTempMap( mpOut->GetMapMode() ); aTempMap.SetOrigin( Point() ); mpBackground->SetMapMode( aTempMap ); - static_cast<vcl::Window*>( mpOut )->SaveBackground( maDispPt, maDispSz, Point(), *mpBackground ); + static_cast<vcl::Window*>( mpOut.get() )->SaveBackground( maDispPt, maDispSz, Point(), *mpBackground ); mpBackground->SetMapMode( MapMode() ); } else diff --git a/vcl/source/gdi/impanmvw.hxx b/vcl/source/gdi/impanmvw.hxx index ce49476e0718..0955046d7f30 100644 --- a/vcl/source/gdi/impanmvw.hxx +++ b/vcl/source/gdi/impanmvw.hxx @@ -34,7 +34,7 @@ private: friend class Animation; Animation* mpParent; - OutputDevice* mpOut; + VclPtr<OutputDevice> mpOut; long mnExtraData; Point maPt; Point maDispPt; @@ -45,8 +45,8 @@ private: Size maRestSz; MapMode maMap; vcl::Region maClip; - VirtualDevice* mpBackground; - VirtualDevice* mpRestore; + VclPtr<VirtualDevice> mpBackground; + VclPtr<VirtualDevice> mpRestore; sal_uLong mnActPos; Disposal meLastDisposal; bool mbPause; diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx index 3f65281a7163..0aace4e88651 100644 --- a/vcl/source/gdi/impgraph.cxx +++ b/vcl/source/gdi/impgraph.cxx @@ -467,8 +467,8 @@ Bitmap ImpGraphic::ImplGetBitmap(const GraphicConversionParameters& rParameters) if(maEx.IsEmpty()) { // calculate size - VirtualDevice aVDev; - Size aDrawSize(aVDev.LogicToPixel(maMetaFile.GetPrefSize(), maMetaFile.GetPrefMapMode())); + ScopedVclPtrInstance< VirtualDevice > aVDev; + Size aDrawSize(aVDev->LogicToPixel(maMetaFile.GetPrefSize(), maMetaFile.GetPrefMapMode())); if(rParameters.getSizePixel().Width() && rParameters.getSizePixel().Height()) { @@ -502,7 +502,7 @@ Bitmap ImpGraphic::ImplGetBitmap(const GraphicConversionParameters& rParameters) { // get hairline and full bound rect Rectangle aHairlineRect; - const Rectangle aRect(maMetaFile.GetBoundRect(aVDev, &aHairlineRect)); + const Rectangle aRect(maMetaFile.GetBoundRect(*aVDev.get(), &aHairlineRect)); if(!aRect.IsEmpty() && !aHairlineRect.IsEmpty()) { @@ -519,22 +519,22 @@ Bitmap ImpGraphic::ImplGetBitmap(const GraphicConversionParameters& rParameters) } } - if(aVDev.SetOutputSizePixel(aPixelSize)) + if(aVDev->SetOutputSizePixel(aPixelSize)) { if(rParameters.getAntiAliase()) { - aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW); + aVDev->SetAntialiasing(aVDev->GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW); } if(rParameters.getSnapHorVerLines()) { - aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_PIXELSNAPHAIRLINE); + aVDev->SetAntialiasing(aVDev->GetAntialiasing() | ANTIALIASING_PIXELSNAPHAIRLINE); } - ImplDraw( &aVDev, Point(), aDrawSize ); + ImplDraw( aVDev.get(), Point(), aDrawSize ); // use maEx as local buffer for rendered metafile - const_cast< ImpGraphic* >(this)->maEx = aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() ); + const_cast< ImpGraphic* >(this)->maEx = aVDev->GetBitmap( Point(), aVDev->GetOutputSizePixel() ); } } diff --git a/vcl/source/gdi/impvect.cxx b/vcl/source/gdi/impvect.cxx index 9a71a241fd65..bdb5f3114eeb 100644 --- a/vcl/source/gdi/impvect.cxx +++ b/vcl/source/gdi/impvect.cxx @@ -717,8 +717,8 @@ bool ImplVectorize( const Bitmap& rColorBmp, GDIMetaFile& rMtf, if( rMtf.GetActionSize() ) { MapMode aMap( MAP_100TH_MM ); - VirtualDevice aVDev; - const Size aLogSize1( aVDev.PixelToLogic( Size( 1, 1 ), aMap ) ); + ScopedVclPtrInstance< VirtualDevice > aVDev; + const Size aLogSize1( aVDev->PixelToLogic( Size( 1, 1 ), aMap ) ); rMtf.SetPrefMapMode( aMap ); rMtf.SetPrefSize( Size( nWidth + 2, nHeight + 2 ) ); diff --git a/vcl/source/gdi/oldprintadaptor.cxx b/vcl/source/gdi/oldprintadaptor.cxx index b1485a945f00..b71d9dd15654 100644 --- a/vcl/source/gdi/oldprintadaptor.cxx +++ b/vcl/source/gdi/oldprintadaptor.cxx @@ -44,8 +44,8 @@ using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::beans; -OldStylePrintAdaptor::OldStylePrintAdaptor(const std::shared_ptr< Printer >& i_xPrinter) - : PrinterController(i_xPrinter) +OldStylePrintAdaptor::OldStylePrintAdaptor( const VclPtr< Printer >& i_xPrinter ) + : PrinterController( i_xPrinter ) , mpData( new ImplOldStyleAdaptorData() ) { } @@ -64,7 +64,7 @@ void OldStylePrintAdaptor::StartPage() getPrinter()->SetConnectMetaFile( &mpData->maPages.back().maPage ); // copy state into metafile - std::shared_ptr<Printer> xPrinter(getPrinter()); + VclPtr<Printer> xPrinter( getPrinter() ); xPrinter->SetMapMode(xPrinter->GetMapMode()); xPrinter->SetFont(xPrinter->GetFont()); xPrinter->SetDrawMode(xPrinter->GetDrawMode()); diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 2a4166f4b951..9ed2d19e1644 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -1874,7 +1874,7 @@ PDFWriterImpl::~PDFWriterImpl() { if( m_aDocDigest ) rtl_digest_destroyMD5( m_aDocDigest ); - delete static_cast<VirtualDevice*>(m_pReferenceDevice); + m_pReferenceDevice.disposeAndClear(); if( m_aCipher ) rtl_cipher_destroyARCFOUR( m_aCipher ); @@ -2220,7 +2220,7 @@ OutputDevice* PDFWriterImpl::getReferenceDevice() { if( ! m_pReferenceDevice ) { - VirtualDevice* pVDev = new VirtualDevice( 0 ); + VclPtrInstance<VirtualDevice> pVDev( 0 ); m_pReferenceDevice = pVDev; @@ -10938,16 +10938,16 @@ bool PDFWriterImpl::writeGradientFunction( GradientEmit& rObject ) sal_Int32 nFunctionObject = createObject(); CHECK_RETURN( updateObject( nFunctionObject ) ); - VirtualDevice aDev; - aDev.SetOutputSizePixel( rObject.m_aSize ); - aDev.SetMapMode( MapMode( MAP_PIXEL ) ); + ScopedVclPtrInstance< VirtualDevice > aDev; + aDev->SetOutputSizePixel( rObject.m_aSize ); + aDev->SetMapMode( MapMode( MAP_PIXEL ) ); if( m_aContext.ColorMode == PDFWriter::DrawGreyscale ) - aDev.SetDrawMode( aDev.GetDrawMode() | + aDev->SetDrawMode( aDev->GetDrawMode() | ( DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL | DRAWMODE_GRAYTEXT | DRAWMODE_GRAYBITMAP | DRAWMODE_GRAYGRADIENT ) ); - aDev.DrawGradient( Rectangle( Point( 0, 0 ), rObject.m_aSize ), rObject.m_aGradient ); + aDev->DrawGradient( Rectangle( Point( 0, 0 ), rObject.m_aSize ), rObject.m_aGradient ); - Bitmap aSample = aDev.GetBitmap( Point( 0, 0 ), rObject.m_aSize ); + Bitmap aSample = aDev->GetBitmap( Point( 0, 0 ), rObject.m_aSize ); BitmapReadAccess* pAccess = aSample.AcquireReadAccess(); AccessReleaser aReleaser( pAccess ); diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx index 1f2ac6b1558a..60e12f58786b 100644 --- a/vcl/source/gdi/pdfwriter_impl.hxx +++ b/vcl/source/gdi/pdfwriter_impl.hxx @@ -590,7 +590,7 @@ public: private: static const BuiltinFont m_aBuiltinFonts[14]; - OutputDevice* m_pReferenceDevice; + VclPtr<OutputDevice> m_pReferenceDevice; MapMode m_aMapMode; // PDFWriterImpl scaled units std::vector< PDFPage > m_aPages; diff --git a/vcl/source/gdi/pdfwriter_impl2.cxx b/vcl/source/gdi/pdfwriter_impl2.cxx index e6bd287f6393..09c8d1b27997 100644 --- a/vcl/source/gdi/pdfwriter_impl2.cxx +++ b/vcl/source/gdi/pdfwriter_impl2.cxx @@ -244,10 +244,10 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa { bool bAssertionFired( false ); - std::unique_ptr<VirtualDevice> xPrivateDevice; + ScopedVclPtr<VirtualDevice> xPrivateDevice; if( ! pDummyVDev ) { - xPrivateDevice.reset(new VirtualDevice()); + xPrivateDevice.reset(VclPtr<VirtualDevice>::Create()); pDummyVDev = xPrivateDevice.get(); pDummyVDev->EnableOutput( false ); pDummyVDev->SetMapMode( i_rMtf.GetPrefMapMode() ); @@ -431,7 +431,7 @@ void PDFWriterImpl::playMetafile( const GDIMetaFile& i_rMtf, vcl::PDFExtOutDevDa if ( nPixelX && nPixelY ) { Size aDstSizePixel( nPixelX, nPixelY ); - std::unique_ptr<VirtualDevice> xVDev(new VirtualDevice); + ScopedVclPtrInstance<VirtualDevice> xVDev; if( xVDev->SetOutputSizePixel( aDstSizePixel ) ) { Bitmap aPaint, aMask; diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx index e96e14bc9c68..10d27223d22e 100644 --- a/vcl/source/gdi/print.cxx +++ b/vcl/source/gdi/print.cxx @@ -792,9 +792,9 @@ void Printer::ImplInitDisplay( const vcl::Window* pWindow ) mpJobGraphics = NULL; if ( pWindow ) - mpDisplayDev = new VirtualDevice( *pWindow ); + mpDisplayDev = VclPtr<VirtualDevice>::Create( *pWindow ); else - mpDisplayDev = new VirtualDevice(); + mpDisplayDev = VclPtr<VirtualDevice>::Create(); mpFontCollection = pSVData->maGDIData.mpScreenFontList; mpFontCache = pSVData->maGDIData.mpScreenFontCache; mnDPIX = mpDisplayDev->mnDPIX; @@ -1015,16 +1015,22 @@ Printer::Printer( const OUString& rPrinterName ) Printer::~Printer() { + disposeOnce(); +} + +void Printer::dispose() +{ DBG_ASSERT( !IsPrinting(), "Printer::~Printer() - Job is printing" ); DBG_ASSERT( !IsJobActive(), "Printer::~Printer() - Job is active" ); delete mpPrinterOptions; + mpPrinterOptions = NULL; ReleaseGraphics(); if ( mpInfoPrinter ) ImplGetSVData()->mpDefInst->DestroyInfoPrinter( mpInfoPrinter ); if ( mpDisplayDev ) - delete mpDisplayDev; + mpDisplayDev.disposeAndClear(); else { // OutputDevice Dtor is tryig the same thing; that why we need to set @@ -1060,6 +1066,10 @@ Printer::~Printer() mpNext->mpPrev = mpPrev; else pSVData->maGDIData.mpLastPrinter = mpPrev; + + mpPrev.clear(); + mpNext.clear(); + OutputDevice::dispose(); } sal_uLong Printer::GetCapabilities( sal_uInt16 nType ) const @@ -1215,8 +1225,7 @@ bool Printer::SetPrinterProps( const Printer* pPrinter ) ReleaseGraphics(); if ( mpDisplayDev ) { - delete mpDisplayDev; - mpDisplayDev = NULL; + mpDisplayDev.disposeAndClear(); } else { diff --git a/vcl/source/gdi/print2.cxx b/vcl/source/gdi/print2.cxx index 4b5a2f1505b9..c8470ac55d09 100644 --- a/vcl/source/gdi/print2.cxx +++ b/vcl/source/gdi/print2.cxx @@ -728,10 +728,10 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, ConnectedComponents aBackgroundComponent; // create an OutputDevice to record mapmode changes and the like - VirtualDevice aMapModeVDev; - aMapModeVDev.mnDPIX = mnDPIX; - aMapModeVDev.mnDPIY = mnDPIY; - aMapModeVDev.EnableOutput(false); + ScopedVclPtrInstance< VirtualDevice > aMapModeVDev; + aMapModeVDev->mnDPIX = mnDPIX; + aMapModeVDev->mnDPIY = mnDPIY; + aMapModeVDev->EnableOutput(false); int nLastBgAction, nActionNum; @@ -766,7 +766,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, aBackgroundComponent.aBounds, aBackgroundComponent.aBgColor, static_cast<const MetaRectAction*>(pCurrAct)->GetRect(), - aMapModeVDev) ) + *aMapModeVDev.get()) ) bStillBackground=false; // incomplete occlusion of background else nLastBgAction=nActionNum; // this _is_ background @@ -782,7 +782,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, aBackgroundComponent.aBounds, aBackgroundComponent.aBgColor, aPoly.GetBoundRect(), - aMapModeVDev) ) + *aMapModeVDev.get()) ) bStillBackground=false; // incomplete occlusion of background else nLastBgAction=nActionNum; // this _is_ background @@ -799,7 +799,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, aBackgroundComponent.aBounds, aBackgroundComponent.aBgColor, aPoly.GetBoundRect(), - aMapModeVDev) ) + *aMapModeVDev.get()) ) bStillBackground=false; // incomplete occlusion of background else nLastBgAction=nActionNum; // this _is_ background @@ -811,7 +811,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, aBackgroundComponent.aBounds, aBackgroundComponent.aBgColor, static_cast<const MetaWallpaperAction*>(pCurrAct)->GetRect(), - aMapModeVDev) ) + *aMapModeVDev.get()) ) bStillBackground=false; // incomplete occlusion of background else nLastBgAction=nActionNum; // this _is_ background @@ -820,29 +820,29 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, default: { if( ImplIsNotTransparent( *pCurrAct, - aMapModeVDev ) ) + *aMapModeVDev.get() ) ) bStillBackground=false; // non-transparent action, possibly // not uniform else // extend current bounds (next uniform action // needs to fully cover this area) aBackgroundComponent.aBounds.Union( - ImplCalcActionBounds(*pCurrAct, aMapModeVDev) ); + ImplCalcActionBounds(*pCurrAct, *aMapModeVDev.get()) ); break; } } // execute action to get correct MapModes etc. - pCurrAct->Execute( &aMapModeVDev ); + pCurrAct->Execute( aMapModeVDev.get() ); pCurrAct=const_cast<GDIMetaFile&>(rInMtf).NextAction(); ++nActionNum; } // clean up aMapModeVDev - sal_uInt32 nCount = aMapModeVDev.GetGCStackDepth(); + sal_uInt32 nCount = aMapModeVDev->GetGCStackDepth(); while( nCount-- ) - aMapModeVDev.Pop(); + aMapModeVDev->Pop(); ConnectedComponentsList aCCList; // list containing distinct sets of connected components as elements. @@ -859,7 +859,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, pCurrAct, nActionNum) ); // execute action to get correct MapModes etc. - pCurrAct->Execute( &aMapModeVDev ); + pCurrAct->Execute( aMapModeVDev.get() ); pCurrAct=const_cast<GDIMetaFile&>(rInMtf).NextAction(); ++nActionNum; } @@ -873,10 +873,10 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, pCurrAct=const_cast<GDIMetaFile&>(rInMtf).NextAction(), ++nActionNum ) { // execute action to get correct MapModes etc. - pCurrAct->Execute( &aMapModeVDev ); + pCurrAct->Execute( aMapModeVDev.get() ); // cache bounds of current action - const Rectangle aBBCurrAct( ImplCalcActionBounds(*pCurrAct, aMapModeVDev) ); + const Rectangle aBBCurrAct( ImplCalcActionBounds(*pCurrAct, *aMapModeVDev.get()) ); // accumulate collected bounds here, initialize with current action Rectangle aTotalBounds( aBBCurrAct ); // thus, @@ -902,7 +902,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, // not be considered for connected components, // too. Just put each of them into a separate // component. - aTotalComponents.bIsFullyTransparent = !ImplIsNotTransparent(*pCurrAct, aMapModeVDev); + aTotalComponents.bIsFullyTransparent = !ImplIsNotTransparent(*pCurrAct, *aMapModeVDev.get()); if( !aBBCurrAct.IsEmpty() && !aTotalComponents.bIsFullyTransparent ) @@ -1155,16 +1155,16 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, Point aDstPtPix( aBoundRect.TopLeft() ); Size aDstSzPix; - VirtualDevice aMapVDev; // here, we record only mapmode information - aMapVDev.EnableOutput(false); + ScopedVclPtrInstance<VirtualDevice> aMapVDev; // here, we record only mapmode information + aMapVDev->EnableOutput(false); - VirtualDevice aPaintVDev; // into this one, we render. - aPaintVDev.SetBackground( aBackgroundComponent.aBgColor ); + ScopedVclPtrInstance<VirtualDevice> aPaintVDev; // into this one, we render. + aPaintVDev->SetBackground( aBackgroundComponent.aBgColor ); rOutMtf.AddAction( new MetaPushAction( PushFlags::MAPMODE ) ); rOutMtf.AddAction( new MetaMapModeAction() ); - aPaintVDev.SetDrawMode( GetDrawMode() ); + aPaintVDev->SetDrawMode( GetDrawMode() ); while( aDstPtPix.Y() <= aBoundRect.Bottom() ) { @@ -1180,15 +1180,15 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, aDstSzPix.Width() = aBoundRect.Right() - aDstPtPix.X() + 1L; if( !Rectangle( aDstPtPix, aDstSzPix ).Intersection( aBoundRect ).IsEmpty() && - aPaintVDev.SetOutputSizePixel( aDstSzPix ) ) + aPaintVDev->SetOutputSizePixel( aDstSzPix ) ) { - aPaintVDev.Push(); - aMapVDev.Push(); + aPaintVDev->Push(); + aMapVDev->Push(); - aMapVDev.mnDPIX = aPaintVDev.mnDPIX = mnDPIX; - aMapVDev.mnDPIY = aPaintVDev.mnDPIY = mnDPIY; + aMapVDev->mnDPIX = aPaintVDev->mnDPIX = mnDPIX; + aMapVDev->mnDPIY = aPaintVDev->mnDPIY = mnDPIY; - aPaintVDev.EnableOutput(false); + aPaintVDev->EnableOutput(false); // iterate over all actions for( pCurrAct=const_cast<GDIMetaFile&>(rInMtf).FirstAction(), nActionNum=0; @@ -1200,38 +1200,38 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, // the current aCCList element // (aCurr) if( aCCList_MemberMap[nActionNum] == &(*aCurr) ) - aPaintVDev.EnableOutput(true); + aPaintVDev->EnableOutput(true); // but process every action const sal_uInt16 nType( pCurrAct->GetType() ); if( META_MAPMODE_ACTION == nType ) { - pCurrAct->Execute( &aMapVDev ); + pCurrAct->Execute( aMapVDev.get() ); - MapMode aMtfMap( aMapVDev.GetMapMode() ); - const Point aNewOrg( aMapVDev.PixelToLogic( aDstPtPix ) ); + MapMode aMtfMap( aMapVDev->GetMapMode() ); + const Point aNewOrg( aMapVDev->PixelToLogic( aDstPtPix ) ); aMtfMap.SetOrigin( Point( -aNewOrg.X(), -aNewOrg.Y() ) ); - aPaintVDev.SetMapMode( aMtfMap ); + aPaintVDev->SetMapMode( aMtfMap ); } else if( ( META_PUSH_ACTION == nType ) || ( META_POP_ACTION ) == nType ) { - pCurrAct->Execute( &aMapVDev ); - pCurrAct->Execute( &aPaintVDev ); + pCurrAct->Execute( aMapVDev.get() ); + pCurrAct->Execute( aPaintVDev.get() ); } else if( META_GRADIENT_ACTION == nType ) { MetaGradientAction* pGradientAction = static_cast<MetaGradientAction*>(pCurrAct); Printer* pPrinter = dynamic_cast< Printer* >(this); if( pPrinter ) - pPrinter->DrawGradientEx( &aPaintVDev, pGradientAction->GetRect(), pGradientAction->GetGradient() ); + pPrinter->DrawGradientEx( aPaintVDev.get(), pGradientAction->GetRect(), pGradientAction->GetGradient() ); else DrawGradient( pGradientAction->GetRect(), pGradientAction->GetGradient() ); } else { - pCurrAct->Execute( &aPaintVDev ); + pCurrAct->Execute( aPaintVDev.get() ); } if( !( nActionNum % 8 ) ) @@ -1239,9 +1239,9 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, } const bool bOldMap = mbMap; - mbMap = aPaintVDev.mbMap = false; + mbMap = aPaintVDev->mbMap = false; - Bitmap aBandBmp( aPaintVDev.GetBitmap( Point(), aDstSzPix ) ); + Bitmap aBandBmp( aPaintVDev->GetBitmap( Point(), aDstSzPix ) ); // scale down bitmap, if requested if( bDownsampleBitmaps ) @@ -1255,10 +1255,10 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, rOutMtf.AddAction( new MetaBmpScaleAction( aDstPtPix, aDstSzPix, aBandBmp ) ); rOutMtf.AddAction( new MetaCommentAction( "PRNSPOOL_TRANSPARENTBITMAP_END" ) ); - aPaintVDev.mbMap = true; + aPaintVDev->mbMap = true; mbMap = bOldMap; - aMapVDev.Pop(); - aPaintVDev.Pop(); + aMapVDev->Pop(); + aPaintVDev->Pop(); } // overlapping bands to avoid missing lines (e.g. PostScript) @@ -1276,9 +1276,9 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, } // clean up aMapModeVDev - nCount = aMapModeVDev.GetGCStackDepth(); + nCount = aMapModeVDev->GetGCStackDepth(); while( nCount-- ) - aMapModeVDev.Pop(); + aMapModeVDev->Pop(); // STAGE 4: Copy actions to output metafile @@ -1309,7 +1309,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, // given background color ImplConvertTransparentAction(rOutMtf, *pCurrAct, - aMapModeVDev, + *aMapModeVDev.get(), aBackgroundComponent.aBgColor); } else @@ -1318,7 +1318,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, rOutMtf.AddAction( ( pCurrAct->Duplicate(), pCurrAct ) ); } - pCurrAct->Execute(&aMapModeVDev); + pCurrAct->Execute(aMapModeVDev.get()); } } @@ -1335,7 +1335,7 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf, else rOutMtf.AddAction( new MetaLineColorAction( COL_BLUE, true) ); - rOutMtf.AddAction( new MetaRectAction( aMapModeVDev.PixelToLogic( aCurr->aBounds ) ) ); + rOutMtf.AddAction( new MetaRectAction( aMapModeVDev->PixelToLogic( aCurr->aBounds ) ) ); } #endif } diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx index 543ab88ad245..bf5c5eef4ae8 100644 --- a/vcl/source/gdi/print3.cxx +++ b/vcl/source/gdi/print3.cxx @@ -140,7 +140,7 @@ public: typedef std::unordered_map< OUString, ControlDependency, OUStringHash > ControlDependencyMap; typedef std::unordered_map< OUString, Sequence< sal_Bool >, OUStringHash > ChoiceDisableMap; - std::shared_ptr<Printer> mxPrinter; + VclPtr< Printer > mxPrinter; Sequence< PropertyValue > maUIOptions; std::vector< PropertyValue > maUIProperties; std::vector< bool > maUIPropertyEnabled; @@ -156,7 +156,7 @@ public: vcl::PrinterController::MultiPageSetup maMultiPage; - vcl::PrintProgressDialog* mpProgress; + VclPtr<vcl::PrintProgressDialog> mpProgress; ImplPageCache maPageCache; @@ -191,7 +191,7 @@ public: mnDefaultPaperBin( -1 ), mnFixedPaperBin( -1 ) {} - ~ImplPrinterControllerData() { delete mpProgress; } + ~ImplPrinterControllerData() { mpProgress.disposeAndClear(); } Size getRealPaperSize( const Size& i_rPageSize, bool bNoNUP ) const { @@ -207,7 +207,7 @@ public: void resetPaperToLastConfigured(); }; -PrinterController::PrinterController(const std::shared_ptr<Printer>& i_xPrinter) +PrinterController::PrinterController( const VclPtr<Printer>& i_xPrinter ) : mpImplData( new ImplPrinterControllerData ) { mpImplData->mxPrinter = i_xPrinter; @@ -305,9 +305,10 @@ void Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController, { if (xController->isShowDialogs()) { - MessageDialog aBox(NULL, "ErrorNoPrinterDialog", + ScopedVclPtrInstance<MessageDialog> aBox( + nullptr, "ErrorNoPrinterDialog", "vcl/ui/errornoprinterdialog.ui"); - aBox.Execute(); + aBox->Execute(); } xController->setValue( OUString( "IsDirect" ), makeAny( false ) ); @@ -320,7 +321,7 @@ void Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController, if (!xController->getPrinter()) { OUString aPrinterName( i_rInitSetup.GetPrinterName() ); - std::shared_ptr<Printer> xPrinter(std::make_shared<Printer>(aPrinterName)); + VclPtrInstance<Printer> xPrinter( aPrinterName ); xPrinter->SetJobSetup(i_rInitSetup); xController->setPrinter(xPrinter); } @@ -454,9 +455,10 @@ void Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController, { if( xController->getFilteredPageCount() == 0 ) { - MessageDialog aBox(NULL, "ErrorNoContentDialog", + ScopedVclPtrInstance<MessageDialog> aBox( + nullptr, "ErrorNoContentDialog", "vcl/ui/errornocontentdialog.ui"); - aBox.Execute(); + aBox->Execute(); return; } } @@ -470,13 +472,13 @@ void Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController, { try { - PrintDialog aDlg( NULL, xController ); - if( ! aDlg.Execute() ) + ScopedVclPtrInstance< PrintDialog > aDlg( nullptr, xController ); + if( ! aDlg->Execute() ) { xController->abortJob(); return; } - if( aDlg.isPrintToFile() ) + if( aDlg->isPrintToFile() ) { OUString aFile = queryFile( xController->getPrinter().get() ); if( aFile.isEmpty() ) @@ -487,7 +489,7 @@ void Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController, xController->setValue( OUString( "LocalFileName" ), makeAny( aFile ) ); } - else if( aDlg.isSingleJobs() ) + else if( aDlg->isSingleJobs() ) { xController->setValue( OUString( "PrintCollateAsSingleJobs" ), makeAny( true ) ); @@ -771,12 +773,12 @@ void PrinterController::setJobState( view::PrintableState i_eState ) mpImplData->meJobState = i_eState; } -const std::shared_ptr<Printer>& PrinterController::getPrinter() const +const VclPtr<Printer>& PrinterController::getPrinter() const { return mpImplData->mxPrinter; } -void PrinterController::setPrinter(const std::shared_ptr<Printer>& i_rPrinter) +void PrinterController::setPrinter( const VclPtr<Printer>& i_rPrinter ) { mpImplData->mxPrinter = i_rPrinter; setValue( OUString( "Name" ), @@ -1332,8 +1334,7 @@ void PrinterController::abortJob() // applications (well, sw) depend on a page request with "IsLastPage" = true // to free resources, else they (well, sw) will crash eventually setLastPage( true ); - delete mpImplData->mpProgress; - mpImplData->mpProgress = NULL; + mpImplData->mpProgress.disposeAndClear(); GDIMetaFile aMtf; getPageFile( 0, aMtf, false ); } @@ -1660,7 +1661,7 @@ void PrinterController::createProgressDialog() if( bShow && ! Application::IsHeadlessModeEnabled() ) { - mpImplData->mpProgress = new PrintProgressDialog( NULL, getPageCountProtected() ); + mpImplData->mpProgress = VclPtr<PrintProgressDialog>::Create( nullptr, getPageCountProtected() ); mpImplData->mpProgress->Show(); } } diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx index b94b6c20e1d6..c453d91ef81d 100644 --- a/vcl/source/gdi/virdev.cxx +++ b/vcl/source/gdi/virdev.cxx @@ -255,6 +255,12 @@ VirtualDevice::VirtualDevice(const SystemGraphicsData *pData, const Size &rSize, VirtualDevice::~VirtualDevice() { SAL_INFO( "vcl.gdi", "VirtualDevice::~VirtualDevice()" ); + disposeOnce(); +} + +void VirtualDevice::dispose() +{ + SAL_INFO( "vcl.gdi", "VirtualDevice::dispose()" ); ImplSVData* pSVData = ImplGetSVData(); @@ -272,6 +278,8 @@ VirtualDevice::~VirtualDevice() mpNext->mpPrev = mpPrev; else pSVData->maGDIData.mpLastVirDev = mpPrev; + + OutputDevice::dispose(); } bool VirtualDevice::InnerImplSetOutputSizePixel( const Size& rNewSize, bool bErase, @@ -392,13 +400,12 @@ bool VirtualDevice::ImplSetOutputSizePixel( const Size& rNewSize, bool bErase, // #110958# Setup alpha bitmap if(mpAlphaVDev && mpAlphaVDev->GetOutputSizePixel() != rNewSize) { - delete mpAlphaVDev; - mpAlphaVDev = 0L; + mpAlphaVDev.disposeAndClear(); } if( !mpAlphaVDev ) { - mpAlphaVDev = new VirtualDevice( *this, mnAlphaDepth ); + mpAlphaVDev = VclPtr<VirtualDevice>::Create( *this, mnAlphaDepth ); mpAlphaVDev->InnerImplSetOutputSizePixel(rNewSize, bErase, basebmp::RawMemorySharedArray(), bTopDown ); diff --git a/vcl/source/helper/lazydelete.cxx b/vcl/source/helper/lazydelete.cxx index 45ea7e091820..2594ad47c22a 100644 --- a/vcl/source/helper/lazydelete.cxx +++ b/vcl/source/helper/lazydelete.cxx @@ -32,9 +32,8 @@ LazyDeletorBase::~LazyDeletorBase() { } -// instantiate instance pointers for LazyDeletor<Window,Menu> +// instantiate instance pointer for LazyDeletor<Window> template<> LazyDeletor<vcl::Window>* LazyDeletor<vcl::Window>::s_pOneInstance = NULL; -template<> LazyDeletor<Menu>* LazyDeletor<Menu>::s_pOneInstance = NULL; // a list for all LazyeDeletor<T> singletons static std::vector< LazyDeletorBase* > lcl_aDeletors; @@ -60,16 +59,6 @@ template<> bool LazyDeletor<vcl::Window>::is_less( vcl::Window* left, vcl::Windo return left != right && right->IsChild( left, true ); } -#ifndef LINUX -// specialized is_less function for Menu -template<> bool LazyDeletor<Menu>::is_less( Menu* left, Menu* right ) -{ - while( left && left != right ) - left = left->ImplGetStartedFrom(); - return left != NULL; -} -#endif - DeleteOnDeinitBase::~DeleteOnDeinitBase() { ImplSVData* pSVData = ImplGetSVData(); diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 70c263a01ed3..8d298a434978 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -102,6 +102,8 @@ OpenGLContext::~OpenGLContext() mpNextContext->mpPrevContext = mpPrevContext; else pSVData->maGDIData.mpLastContext = mpPrevContext; + + m_pChildWindow.disposeAndClear(); } #ifdef DBG_UTIL @@ -657,7 +659,7 @@ bool OpenGLContext::init( vcl::Window* pParent ) if(mbInitialized) return true; - m_xWindow.reset(pParent ? NULL : new vcl::Window(0, WB_NOBORDER|WB_NODIALOGCONTROL)); + m_xWindow.reset(pParent ? nullptr : VclPtr<vcl::Window>::Create(nullptr, WB_NOBORDER|WB_NODIALOGCONTROL)); mpWindow = pParent ? pParent : m_xWindow.get(); if(m_xWindow) m_xWindow->setPosSizePixel(0,0,0,0); @@ -1080,8 +1082,7 @@ bool OpenGLContext::initWindow() if( !m_pChildWindow ) { SystemWindowData winData = generateWinData(mpWindow, false); - m_pChildWindow = new SystemChildWindow(mpWindow, 0, &winData, false); - m_xChildWindowGC.reset(m_pChildWindow); + m_pChildWindow = VclPtr<SystemChildWindow>::Create(mpWindow, 0, &winData, false); } if( m_pChildWindow ) @@ -1108,8 +1109,7 @@ bool OpenGLContext::initWindow() if( !m_pChildWindow ) { SystemWindowData winData = generateWinData(mpWindow, mbRequestLegacyContext); - m_pChildWindow = new SystemChildWindow(mpWindow, 0, &winData, false); - m_xChildWindowGC.reset(m_pChildWindow); + m_pChildWindow = VclPtr<SystemChildWindow>::Create(mpWindow, 0, &winData, false); } if( m_pChildWindow ) @@ -1143,8 +1143,7 @@ bool OpenGLContext::initWindow() { if( !m_pChildWindow ) { - m_pChildWindow = new SystemChildWindow(mpWindow, 0, &winData, false); - m_xChildWindowGC.reset(m_pChildWindow); + m_pChildWindow = VclPtr<SystemChildWindow>::Create(mpWindow, 0, &winData, false); } pChildSysData = m_pChildWindow->GetSystemData(); } diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx index 9f13a24f1442..03938508643f 100644 --- a/vcl/source/outdev/bitmap.cxx +++ b/vcl/source/outdev/bitmap.cxx @@ -410,11 +410,11 @@ Bitmap OutputDevice::GetBitmap( const Point& rSrcPt, const Size& rSize ) const // If the visible part has been clipped, we have to create a // Bitmap with the correct size in which we copy the clipped // Bitmap to the correct position. - VirtualDevice aVDev( *this ); + ScopedVclPtrInstance< VirtualDevice > aVDev( *this ); - if ( aVDev.SetOutputSizePixel( aRect.GetSize() ) ) + if ( aVDev->SetOutputSizePixel( aRect.GetSize() ) ) { - if ( ((OutputDevice*)&aVDev)->mpGraphics || ((OutputDevice*)&aVDev)->AcquireGraphics() ) + if ( ((OutputDevice*)aVDev.get())->mpGraphics || ((OutputDevice*)aVDev.get())->AcquireGraphics() ) { if ( (nWidth > 0) && (nHeight > 0) ) { @@ -422,14 +422,14 @@ Bitmap OutputDevice::GetBitmap( const Point& rSrcPt, const Size& rSize ) const (aRect.Left() < mnOutOffX) ? (mnOutOffX - aRect.Left()) : 0L, (aRect.Top() < mnOutOffY) ? (mnOutOffY - aRect.Top()) : 0L, nWidth, nHeight); - (((OutputDevice*)&aVDev)->mpGraphics)->CopyBits( aPosAry, mpGraphics, this, this ); + (((OutputDevice*)aVDev.get())->mpGraphics)->CopyBits( aPosAry, mpGraphics, this, this ); } else { OSL_ENSURE(false, "CopyBits with negative width or height (!)"); } - aBmp = aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() ); + aBmp = aVDev->GetBitmap( Point(), aVDev->GetOutputSizePixel() ); } else bClipped = false; diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx index 1bf2df824ff6..27810d43ade9 100644 --- a/vcl/source/outdev/font.cxx +++ b/vcl/source/outdev/font.cxx @@ -91,7 +91,12 @@ vcl::FontInfo OutputDevice::GetDevFont( int nDevFontIndex ) const int OutputDevice::GetDevFontCount() const { if( !mpGetDevFontList ) + { + if (!mpFontCollection) + return 0; + mpGetDevFontList = mpFontCollection->GetDevFontList(); + } return mpGetDevFontList->Count(); } diff --git a/vcl/source/outdev/map.cxx b/vcl/source/outdev/map.cxx index b359e504d0a9..e7eed8872143 100644 --- a/vcl/source/outdev/map.cxx +++ b/vcl/source/outdev/map.cxx @@ -232,9 +232,8 @@ static void ImplCalcMapResolution( const MapMode& rMapMode, vcl::Window::ImplInitAppFontData( pSVData->maWinData.mpFirstFrame ); else { - WorkWindow* pWin = new WorkWindow( NULL, 0 ); + ScopedVclPtrInstance<WorkWindow> pWin( nullptr, 0 ); vcl::Window::ImplInitAppFontData( pWin ); - delete pWin; } } rMapRes.mnMapScNumX = pSVData->maGDIData.mnAppFontX; @@ -343,6 +342,9 @@ inline void ImplCalcMapResolution( const MapMode& rMapMode, // #i75163# void OutputDevice::ImplInvalidateViewTransform() { + if(!mpOutDevData) + return; + if(mpOutDevData->mpViewTransform) { delete mpOutDevData->mpViewTransform; diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx index 372eb23bc8f4..855a2d46a27f 100644 --- a/vcl/source/outdev/outdev.cxx +++ b/vcl/source/outdev/outdev.cxx @@ -82,12 +82,12 @@ namespace { // Begin initializer and accessor public functions OutputDevice::OutputDevice() : + mnRefCnt(1), // cf. VclPtrInstance and README.lifecycle maRegion(true), maFillColor( COL_WHITE ), maTextLineColor( COL_TRANSPARENT ), mxSettings( new AllSettings(Application::GetSettings()) ) { - mpGraphics = NULL; mpUnoGraphicsList = NULL; mpPrevGraphics = NULL; @@ -179,11 +179,32 @@ OutputDevice::OutputDevice() : // #i75163# mpOutDevData->mpViewTransform = NULL; mpOutDevData->mpInverseViewTransform = NULL; + + mbDisposed = false; } OutputDevice::~OutputDevice() { + disposeOnce(); +} + +void OutputDevice::disposeOnce() +{ + if ( mbDisposed ) + return; + mbDisposed = true; + + // catch badness where our OutputDevice sub-class was not + // wrapped safely in a VclPtr cosily. + // FIXME: as/when we make our destructors all protected, + // we should introduce this assert: + // assert( mnRefCnt > 0 ); + dispose(); +} + +void OutputDevice::dispose() +{ if ( GetUnoGraphicsList() ) { UnoWrapperBase* pWrapper = Application::GetUnoWrapper( false ); @@ -193,12 +214,13 @@ OutputDevice::~OutputDevice() mpUnoGraphicsList = NULL; } - delete mpOutDevData->mpRotateDev; + mpOutDevData->mpRotateDev.disposeAndClear(); // #i75163# ImplInvalidateViewTransform(); delete mpOutDevData; + mpOutDevData = NULL; // for some reason, we haven't removed state from the stack properly if ( !mpOutDevStateStack->empty() ) @@ -210,6 +232,7 @@ OutputDevice::~OutputDevice() } } delete mpOutDevStateStack; + mpOutDevStateStack = NULL; // release the active font instance if( mpFontEntry ) @@ -218,8 +241,10 @@ OutputDevice::~OutputDevice() // remove cached results of GetDevFontList/GetDevSizeList // TODO: use smart pointers for them delete mpGetDevFontList; + mpGetDevFontList = NULL; delete mpGetDevSizeList; + mpGetDevSizeList = NULL; // release ImplFontCache specific to this OutputDevice // TODO: refcount ImplFontCache @@ -242,7 +267,7 @@ OutputDevice::~OutputDevice() mpFontCollection = NULL; } - delete mpAlphaVDev; + mpAlphaVDev.disposeAndClear(); } SalGraphics* OutputDevice::GetGraphics() diff --git a/vcl/source/outdev/outdevstate.cxx b/vcl/source/outdev/outdevstate.cxx index a71c7d66cb92..bc6bd4a8b6c9 100644 --- a/vcl/source/outdev/outdevstate.cxx +++ b/vcl/source/outdev/outdevstate.cxx @@ -641,6 +641,7 @@ void OutputDevice::InitFillColor() void OutputDevice::ImplReleaseFonts() { mpGraphics->ReleaseFonts(); + mbNewFont = true; mbInitFont = true; diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx index eb7104d06215..1cc48a32223b 100644 --- a/vcl/source/outdev/text.cxx +++ b/vcl/source/outdev/text.cxx @@ -236,7 +236,7 @@ bool OutputDevice::ImplDrawRotateText( SalLayout& rSalLayout ) // cache virtual device for rotation if (!mpOutDevData->mpRotateDev) - mpOutDevData->mpRotateDev = new VirtualDevice( *this, 1 ); + mpOutDevData->mpRotateDev = VclPtr<VirtualDevice>::Create( *this, 1 ); VirtualDevice* pVDev = mpOutDevData->mpRotateDev; // size it accordingly @@ -2494,18 +2494,18 @@ bool OutputDevice::GetTextBoundRect( Rectangle& rRect, // fall back to bitmap method to get the bounding rectangle, // so we need a monochrome virtual device with matching font - VirtualDevice aVDev( 1 ); + ScopedVclPtrInstance< VirtualDevice > aVDev( 1 ); vcl::Font aFont( GetFont() ); aFont.SetShadow( false ); aFont.SetOutline( false ); aFont.SetRelief( RELIEF_NONE ); aFont.SetOrientation( 0 ); aFont.SetSize( Size( mpFontEntry->maFontSelData.mnWidth, mpFontEntry->maFontSelData.mnHeight ) ); - aVDev.SetFont( aFont ); - aVDev.SetTextAlign( ALIGN_TOP ); + aVDev->SetFont( aFont ); + aVDev->SetTextAlign( ALIGN_TOP ); // layout the text on the virtual device - pSalLayout = aVDev.ImplLayout( rStr, nIndex, nLen, aPoint, nLayoutWidth, pDXAry ); + pSalLayout = aVDev->ImplLayout( rStr, nIndex, nLen, aPoint, nLayoutWidth, pDXAry ); if( !pSalLayout ) return false; @@ -2515,7 +2515,7 @@ bool OutputDevice::GetTextBoundRect( Rectangle& rRect, long nHeight = mpFontEntry->mnLineHeight + mnEmphasisAscent + mnEmphasisDescent; Point aOffset( nWidth/2, 8 ); Size aOutSize( nWidth + 2*aOffset.X(), nHeight + 2*aOffset.Y() ); - if( !nWidth || !aVDev.SetOutputSizePixel( aOutSize ) ) + if( !nWidth || !aVDev->SetOutputSizePixel( aOutSize ) ) { pSalLayout->Release(); return false; @@ -2523,14 +2523,14 @@ bool OutputDevice::GetTextBoundRect( Rectangle& rRect, // draw text in black pSalLayout->DrawBase() = aOffset; - aVDev.SetTextColor( Color( COL_BLACK ) ); - aVDev.SetTextFillColor(); - aVDev.ImplInitTextColor(); - aVDev.ImplDrawText( *pSalLayout ); + aVDev->SetTextColor( Color( COL_BLACK ) ); + aVDev->SetTextFillColor(); + aVDev->ImplInitTextColor(); + aVDev->ImplDrawText( *pSalLayout ); pSalLayout->Release(); // find extents using the bitmap - Bitmap aBmp = aVDev.GetBitmap( Point(), aOutSize ); + Bitmap aBmp = aVDev->GetBitmap( Point(), aOutSize ); BitmapReadAccess* pAcc = aBmp.AcquireReadAccess(); if( !pAcc ) return false; @@ -2718,7 +2718,7 @@ bool OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, + mnEmphasisDescent; pSalLayout->Release(); - VirtualDevice aVDev(1); + ScopedVclPtrInstance< VirtualDevice > aVDev( 1 ); vcl::Font aFont(GetFont()); aFont.SetShadow(false); @@ -2728,19 +2728,19 @@ bool OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, if( bOptimize ) { aFont.SetSize( Size( 0, GLYPH_FONT_HEIGHT ) ); - aVDev.SetMapMode( MAP_PIXEL ); + aVDev->SetMapMode( MAP_PIXEL ); } - aVDev.SetFont( aFont ); - aVDev.SetTextAlign( ALIGN_TOP ); - aVDev.SetTextColor( Color(COL_BLACK) ); - aVDev.SetTextFillColor(); + aVDev->SetFont( aFont ); + aVDev->SetTextAlign( ALIGN_TOP ); + aVDev->SetTextColor( Color(COL_BLACK) ); + aVDev->SetTextFillColor(); - pSalLayout = aVDev.ImplLayout( rStr, nIndex, nLen, Point(0,0), nLayoutWidth, pDXArray ); + pSalLayout = aVDev->ImplLayout( rStr, nIndex, nLen, Point(0,0), nLayoutWidth, pDXArray ); if (pSalLayout == 0) return false; long nWidth = pSalLayout->GetTextWidth(); - long nHeight = ((OutputDevice*)&aVDev)->mpFontEntry->mnLineHeight + ((OutputDevice*)&aVDev)->mnEmphasisAscent - + ((OutputDevice*)&aVDev)->mnEmphasisDescent; + long nHeight = aVDev->mpFontEntry->mnLineHeight + aVDev->mnEmphasisAscent + + aVDev->mnEmphasisDescent; pSalLayout->Release(); if( !nWidth || !nHeight ) @@ -2755,7 +2755,7 @@ bool OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, { sal_Int32 nStart = ((nBase < nIndex) ? nBase : nIndex); sal_Int32 nLength = ((nBase > nIndex) ? nBase : nIndex) - nStart; - pSalLayout = aVDev.ImplLayout( rStr, nStart, nLength, Point(0,0), nLayoutWidth, pDXArray ); + pSalLayout = aVDev->ImplLayout( rStr, nStart, nLength, Point(0,0), nLayoutWidth, pDXArray ); if( pSalLayout ) { nXOffset = pSalLayout->GetTextWidth(); @@ -2776,25 +2776,25 @@ bool OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, bool bSuccess = false; // draw character into virtual device - pSalLayout = aVDev.ImplLayout( rStr, nCharPos, 1, Point(0,0), nLayoutWidth, pDXArray ); + pSalLayout = aVDev->ImplLayout( rStr, nCharPos, 1, Point(0,0), nLayoutWidth, pDXArray ); if (pSalLayout == 0) return false; long nCharWidth = pSalLayout->GetTextWidth(); Point aOffset(nCharWidth / 2, 8); Size aSize(nCharWidth + 2 * aOffset.X(), nHeight + 2 * aOffset.Y()); - bSuccess = (bool)aVDev.SetOutputSizePixel(aSize); + bSuccess = (bool)aVDev->SetOutputSizePixel(aSize); if( bSuccess ) { // draw glyph into virtual device - aVDev.Erase(); + aVDev->Erase(); pSalLayout->DrawBase() += aOffset; - pSalLayout->DrawBase() += Point( ((OutputDevice*)&aVDev)->mnTextOffX, ((OutputDevice*)&aVDev)->mnTextOffY ); - pSalLayout->DrawText( *((OutputDevice*)&aVDev)->mpGraphics ); + pSalLayout->DrawBase() += Point( aVDev->mnTextOffX, aVDev->mnTextOffY ); + pSalLayout->DrawText( *aVDev->mpGraphics ); pSalLayout->Release(); // convert character image into outline - Bitmap aBmp( aVDev.GetBitmap(Point(0, 0), aSize)); + Bitmap aBmp( aVDev->GetBitmap(Point(0, 0), aSize)); tools::PolyPolygon aPolyPoly; bool bVectorized = aBmp.Vectorize(aPolyPoly, BMP_VECTORIZE_OUTER | BMP_VECTORIZE_REDUCE_EDGES); @@ -2810,8 +2810,8 @@ bool OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, { Point& rPt = rPoly[k]; rPt -= aOffset; - int nPixelX = rPt.X() - ((OutputDevice&)aVDev).mnTextOffX + nXOffset; - int nPixelY = rPt.Y() - ((OutputDevice&)aVDev).mnTextOffY; + int nPixelX = rPt.X() - ((OutputDevice*)aVDev.get())->mnTextOffX + nXOffset; + int nPixelY = rPt.Y() - ((OutputDevice*)aVDev.get())->mnTextOffY; rPt.X() = ImplDevicePixelToLogicWidth( nPixelX ); rPt.Y() = ImplDevicePixelToLogicHeight( nPixelY ); } diff --git a/vcl/source/outdev/transparent.cxx b/vcl/source/outdev/transparent.cxx index 60f68c28e5dc..425a56ab7514 100644 --- a/vcl/source/outdev/transparent.cxx +++ b/vcl/source/outdev/transparent.cxx @@ -116,7 +116,7 @@ sal_uInt16 OutputDevice::GetAlphaBitCount() const bool OutputDevice::HasAlpha() { - return mpAlphaVDev != NULL; + return mpAlphaVDev != nullptr; } void OutputDevice::ImplPrintTransparent( const Bitmap& rBmp, const Bitmap& rMask, @@ -431,25 +431,25 @@ void OutputDevice::EmulateDrawTransparent ( const tools::PolyPolygon& rPolyPoly, if( !bDrawn ) { - VirtualDevice aVDev( *this, 1 ); + ScopedVclPtrInstance< VirtualDevice > aVDev( *this, 1 ); const Size aDstSz( aDstRect.GetSize() ); const sal_uInt8 cTrans = (sal_uInt8) MinMax( FRound( nTransparencePercent * 2.55 ), 0, 255 ); if( aDstRect.Left() || aDstRect.Top() ) aPolyPoly.Move( -aDstRect.Left(), -aDstRect.Top() ); - if( aVDev.SetOutputSizePixel( aDstSz ) ) + if( aVDev->SetOutputSizePixel( aDstSz ) ) { const bool bOldMap = mbMap; EnableMapMode( false ); - aVDev.SetLineColor( COL_BLACK ); - aVDev.SetFillColor( COL_BLACK ); - aVDev.DrawPolyPolygon( aPolyPoly ); + aVDev->SetLineColor( COL_BLACK ); + aVDev->SetFillColor( COL_BLACK ); + aVDev->DrawPolyPolygon( aPolyPoly ); Bitmap aPaint( GetBitmap( aDstRect.TopLeft(), aDstSz ) ); - Bitmap aPolyMask( aVDev.GetBitmap( Point(), aDstSz ) ); + Bitmap aPolyMask( aVDev->GetBitmap( Point(), aDstSz ) ); // #107766# check for non-empty bitmaps before accessing them if( !!aPaint && !!aPolyMask ) @@ -683,7 +683,7 @@ void OutputDevice::DrawTransparent( const GDIMetaFile& rMtf, const Point& rPos, if( !aDstRect.IsEmpty() ) { - std::unique_ptr<VirtualDevice> xVDev(new VirtualDevice); + ScopedVclPtrInstance< VirtualDevice > xVDev; ((OutputDevice*)xVDev.get())->mnDPIX = mnDPIX; ((OutputDevice*)xVDev.get())->mnDPIY = mnDPIY; diff --git a/vcl/source/outdev/wallpaper.cxx b/vcl/source/outdev/wallpaper.cxx index 8e4d86bc321f..ba7928b4f812 100644 --- a/vcl/source/outdev/wallpaper.cxx +++ b/vcl/source/outdev/wallpaper.cxx @@ -129,11 +129,11 @@ void OutputDevice::DrawBitmapWallpaper( long nX, long nY, { if( !pCached && !rWallpaper.GetColor().GetTransparency() ) { - VirtualDevice aVDev( *this ); - aVDev.SetBackground( rWallpaper.GetColor() ); - aVDev.SetOutputSizePixel( Size( nBmpWidth, nBmpHeight ) ); - aVDev.DrawBitmapEx( Point(), aBmpEx ); - aBmpEx = aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() ); + ScopedVclPtrInstance< VirtualDevice > aVDev( *this ); + aVDev->SetBackground( rWallpaper.GetColor() ); + aVDev->SetOutputSizePixel( Size( nBmpWidth, nBmpHeight ) ); + aVDev->DrawBitmapEx( Point(), aBmpEx ); + aBmpEx = aVDev->GetBitmap( Point(), aVDev->GetOutputSizePixel() ); } bDrawColorBackground = true; diff --git a/vcl/source/uipreviewer/previewer.cxx b/vcl/source/uipreviewer/previewer.cxx index e889e78f8644..bb93b1207dd8 100644 --- a/vcl/source/uipreviewer/previewer.cxx +++ b/vcl/source/uipreviewer/previewer.cxx @@ -68,8 +68,7 @@ int UIPreviewApp::Main() try { - Dialog *pDialog = new Dialog(DIALOG_NO_PARENT, WB_STDDIALOG | WB_SIZEABLE); - + VclPtrInstance<Dialog> pDialog(DIALOG_NO_PARENT, WB_STDDIALOG | WB_SIZEABLE); { VclBuilder aBuilder(pDialog, OUString(), uifiles[0]); vcl::Window *pRoot = aBuilder.get_widget_root(); @@ -90,7 +89,7 @@ int UIPreviewApp::Main() pRealDialog->Execute(); } - delete pDialog; + pDialog.disposeAndClear(); } catch (const uno::Exception &e) { diff --git a/vcl/source/window/accel.cxx b/vcl/source/window/accel.cxx index a3b7c0f8d061..99fea0983520 100644 --- a/vcl/source/window/accel.cxx +++ b/vcl/source/window/accel.cxx @@ -20,6 +20,7 @@ #include <tools/debug.hxx> #include <tools/rc.h> +#include <vcl/window.hxx> #include <vcl/svapp.hxx> #include <accel.h> #include <vcl/accel.hxx> diff --git a/vcl/source/window/accessibility.cxx b/vcl/source/window/accessibility.cxx index fc3dc74d009d..07abf759c92d 100644 --- a/vcl/source/window/accessibility.cxx +++ b/vcl/source/window/accessibility.cxx @@ -136,6 +136,8 @@ namespace vcl { return pChild->GetAccessible(); } */ + if ( !mpWindowImpl ) + return css::uno::Reference< css::accessibility::XAccessible >(); if ( !mpWindowImpl->mxAccessible.is() && bCreate ) mpWindowImpl->mxAccessible = CreateAccessible(); @@ -647,12 +649,11 @@ vcl::Window* Window::GetAccessibleRelationLabeledBy() const if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabeledByWindow) return mpWindowImpl->mpAccessibleInfos->pLabeledByWindow; - std::vector<FixedText*> aMnemonicLabels(list_mnemonic_labels()); + std::vector<VclPtr<FixedText> > aMnemonicLabels(list_mnemonic_labels()); if (!aMnemonicLabels.empty()) { //if we have multiple labels, then prefer the first that is visible - for (std::vector<FixedText*>::iterator - aI = aMnemonicLabels.begin(), aEnd = aMnemonicLabels.end(); aI != aEnd; ++aI) + for (auto aI = aMnemonicLabels.begin(), aEnd = aMnemonicLabels.end(); aI != aEnd; ++aI) { vcl::Window *pCandidate = *aI; if (pCandidate->IsVisible()) diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx index c472777cf101..88ef65a07391 100644 --- a/vcl/source/window/brdwin.cxx +++ b/vcl/source/window/brdwin.cxx @@ -1013,7 +1013,7 @@ void ImplSmallBorderWindowView::Init( OutputDevice* pDev, long nWidth, long nHei vcl::Window *pWin = NULL, *pCtrl = NULL; if (mpOutDev->GetOutDevType() == OUTDEV_WINDOW) - pWin = static_cast<vcl::Window*>(mpOutDev); + pWin = static_cast<vcl::Window*>(mpOutDev.get()); if (pWin) pCtrl = mpBorderWindow->GetWindow(WINDOW_CLIENT); @@ -1193,7 +1193,7 @@ void ImplSmallBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* // control this border belongs to vcl::Window *pWin = NULL, *pCtrl = NULL; if( mpOutDev->GetOutDevType() == OUTDEV_WINDOW ) - pWin = static_cast<vcl::Window*>(mpOutDev); + pWin = static_cast<vcl::Window*>(mpOutDev.get()); ControlType aCtrlType = 0; ControlPart aCtrlPart = PART_ENTIRE_CONTROL; @@ -1364,8 +1364,8 @@ ImplStdBorderWindowView::ImplStdBorderWindowView( ImplBorderWindow* pBorderWindo ImplStdBorderWindowView::~ImplStdBorderWindowView() { - delete mpATitleVirDev; - delete mpDTitleVirDev; + mpATitleVirDev.disposeAndClear(); + mpDTitleVirDev.disposeAndClear(); } bool ImplStdBorderWindowView::MouseMove( const MouseEvent& rMEvt ) @@ -1556,7 +1556,7 @@ long ImplStdBorderWindowView::CalcTitleWidth() const void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset ) { ImplBorderFrameData* pData = &maFrameData; - OutputDevice* pDev = pOutDev ? pOutDev : pData->mpOutDev; + OutputDevice* pDev = pOutDev ? pOutDev : pData->mpOutDev.get(); ImplBorderWindow* pBorderWindow = pData->mpBorderWindow; Point aTmpPoint = pOffset ? Point(*pOffset) : Point(); Rectangle aInRect( aTmpPoint, Size( pData->mnWidth, pData->mnHeight ) ); @@ -1851,7 +1851,15 @@ ImplBorderWindow::ImplBorderWindow( vcl::Window* pParent, WinBits nStyle , ImplBorderWindow::~ImplBorderWindow() { + disposeOnce(); +} + +void ImplBorderWindow::dispose() +{ delete mpBorderView; + mpBorderView = NULL; + mpMenuBarWindow.clear(); + vcl::Window::dispose(); } void ImplBorderWindow::MouseMove( const MouseEvent& rMEvt ) diff --git a/vcl/source/window/btndlg.cxx b/vcl/source/window/btndlg.cxx index 515d17a20cc6..2e8532cecba7 100644 --- a/vcl/source/window/btndlg.cxx +++ b/vcl/source/window/btndlg.cxx @@ -30,10 +30,10 @@ typedef boost::ptr_vector<ImplBtnDlgItem>::const_iterator btn_const_iterator; struct ImplBtnDlgItem { sal_uInt16 mnId; - bool mbOwnButton; - bool mbDummyAlign; - long mnSepSize; - PushButton* mpPushButton; + bool mbOwnButton; + bool mbDummyAlign; + long mnSepSize; + VclPtr<PushButton> mpPushButton; }; void ButtonDialog::ImplInitButtonDialogData() @@ -59,11 +59,18 @@ ButtonDialog::ButtonDialog( vcl::Window* pParent, WinBits nStyle ) : ButtonDialog::~ButtonDialog() { + disposeOnce(); +} + +void ButtonDialog::dispose() +{ for ( btn_iterator it = maItemList.begin(); it != maItemList.end(); ++it) { - if ( it->mpPushButton && it->mbOwnButton ) - delete it->mpPushButton; + if ( it->mbOwnButton ) + it->mpPushButton.disposeAndClear(); } + maItemList.clear(); + Dialog::dispose(); } PushButton* ButtonDialog::ImplCreatePushButton( sal_uInt16 nBtnFlags ) @@ -74,13 +81,13 @@ PushButton* ButtonDialog::ImplCreatePushButton( sal_uInt16 nBtnFlags ) if ( nBtnFlags & BUTTONDIALOG_DEFBUTTON ) nStyle |= WB_DEFBUTTON; if ( nBtnFlags & BUTTONDIALOG_CANCELBUTTON ) - pBtn = new CancelButton( this, nStyle ); + pBtn = VclPtr<CancelButton>::Create( this, nStyle ); else if ( nBtnFlags & BUTTONDIALOG_OKBUTTON ) - pBtn = new OKButton( this, nStyle ); + pBtn = VclPtr<OKButton>::Create( this, nStyle ); else if ( nBtnFlags & BUTTONDIALOG_HELPBUTTON ) - pBtn = new HelpButton( this, nStyle ); + pBtn = VclPtr<HelpButton>::Create( this, nStyle ); else - pBtn = new PushButton( this, nStyle ); + pBtn = VclPtr<PushButton>::Create( this, nStyle ); if ( !(nBtnFlags & BUTTONDIALOG_HELPBUTTON) ) pBtn->SetClickHdl( LINK( this, ButtonDialog, ImplClickHdl ) ); @@ -327,10 +334,10 @@ void ButtonDialog::RemoveButton( sal_uInt16 nId ) if (it->mnId == nId) { it->mpPushButton->Hide(); - - if (it->mbOwnButton ) - delete it->mpPushButton; - + if (it->mbOwnButton) + it->mpPushButton.disposeAndClear(); + else + it->mpPushButton.clear(); maItemList.erase(it); return; } @@ -344,9 +351,8 @@ void ButtonDialog::Clear() for (btn_iterator it = maItemList.begin(); it != maItemList.end(); ++it) { it->mpPushButton->Hide(); - - if (it->mbOwnButton ) - delete it->mpPushButton; + if (it->mbOwnButton) + it->mpPushButton.disposeAndClear(); } maItemList.clear(); diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index f7de2d12130a..dc06f34a003f 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -471,14 +471,14 @@ VclBuilder::VclBuilder(vcl::Window *pParent, const OUString& sUIDir, const OUStr //Remove ScrollWindow parent widgets whose children in vcl implement scrolling //internally. - for (std::map<vcl::Window*, vcl::Window*>::iterator aI = m_pParserState->m_aRedundantParentWidgets.begin(), + for (auto aI = m_pParserState->m_aRedundantParentWidgets.begin(), aEnd = m_pParserState->m_aRedundantParentWidgets.end(); aI != aEnd; ++aI) { delete_by_window(aI->first); } //fdo#67378 merge the label into the disclosure button - for (std::vector<VclExpander*>::iterator aI = m_pParserState->m_aExpanderWidgets.begin(), + for (auto aI = m_pParserState->m_aExpanderWidgets.begin(), aEnd = m_pParserState->m_aExpanderWidgets.end(); aI != aEnd; ++aI) { VclExpander *pOne = *aI; @@ -525,17 +525,24 @@ VclBuilder::VclBuilder(vcl::Window *pParent, const OUString& sUIDir, const OUStr VclBuilder::~VclBuilder() { + disposeBuilder(); +} + +void VclBuilder::disposeBuilder() +{ for (std::vector<WinAndId>::reverse_iterator aI = m_aChildren.rbegin(), aEnd = m_aChildren.rend(); aI != aEnd; ++aI) { - delete aI->m_pWindow; + aI->m_pWindow.disposeAndClear(); } + m_aChildren.clear(); for (std::vector<MenuAndId>::reverse_iterator aI = m_aMenus.rbegin(), aEnd = m_aMenus.rend(); aI != aEnd; ++aI) { delete aI->m_pMenu; } + m_aMenus.clear(); } void VclBuilder::handleTranslations(xmlreader::XmlReader &reader) @@ -1259,7 +1266,7 @@ void VclBuilder::cleanupWidgetOwnScrolling(vcl::Window *pScrollParent, vcl::Wind extern "C" { static void SAL_CALL thisModule() {} } #endif -vcl::Window *VclBuilder::makeObject(vcl::Window *pParent, const OString &name, const OString &id, +VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString &name, const OString &id, stringmap &rMap) { bool bIsPlaceHolder = name.isEmpty(); @@ -1301,7 +1308,7 @@ vcl::Window *VclBuilder::makeObject(vcl::Window *pParent, const OString &name, c } if (bIsPlaceHolder || name == "GtkTreeSelection") - return NULL; + return nullptr; extractButtonImage(id, rMap, name == "GtkRadioButton"); @@ -1696,7 +1703,7 @@ vcl::Window *VclBuilder::makeObject(vcl::Window *pParent, const OString &name, c m_pParserState->m_nLastToolbarId = nItemId; - return NULL; // no widget to be created + return nullptr; // no widget to be created } } else if (name == "GtkSeparatorToolItem") @@ -1705,7 +1712,7 @@ vcl::Window *VclBuilder::makeObject(vcl::Window *pParent, const OString &name, c if (pToolBox) { pToolBox->InsertSeparator(); - return NULL; // no widget to be created + return nullptr; // no widget to be created } } else if (name == "GtkWindow") @@ -1763,16 +1770,17 @@ vcl::Window *VclBuilder::makeObject(vcl::Window *pParent, const OString &name, c SAL_WARN_IF(!pWindow, "vcl.layout", "probably need to implement " << name.getStr() << " or add a make" << name.getStr() << " function"); if (pWindow) { + VclPtr< vcl::Window > xWindow( pWindow ); pWindow->SetHelpId(m_sHelpRoot + id); SAL_INFO("vcl.layout", "for " << name.getStr() << ", created " << pWindow << " child of " << - pParent << "(" << pWindow->mpWindowImpl->mpParent << "/" << - pWindow->mpWindowImpl->mpRealParent << "/" << - pWindow->mpWindowImpl->mpBorderWindow << ") with helpid " << + pParent << "(" << pWindow->mpWindowImpl->mpParent.get() << "/" << + pWindow->mpWindowImpl->mpRealParent.get() << "/" << + pWindow->mpWindowImpl->mpBorderWindow.get() << ") with helpid " << pWindow->GetHelpId().getStr()); - m_aChildren.push_back(WinAndId(id, pWindow, bVertical)); + m_aChildren.push_back(WinAndId(id, xWindow, bVertical)); } - return pWindow; + return VclPtr<vcl::Window>(pWindow, SAL_NO_ACQUIRE); } namespace @@ -1807,10 +1815,10 @@ void VclBuilder::set_properties(vcl::Window *pWindow, const stringmap &rProps) } } -vcl::Window *VclBuilder::insertObject(vcl::Window *pParent, const OString &rClass, +VclPtr<vcl::Window> VclBuilder::insertObject(vcl::Window *pParent, const OString &rClass, const OString &rID, stringmap &rProps, stringmap &rPango, stringmap &rAtk) { - vcl::Window *pCurrentChild = NULL; + VclPtr<vcl::Window> pCurrentChild; if (m_pParent && !isConsideredGtkPseudo(m_pParent) && !m_sID.isEmpty() && rID.equals(m_sID)) { @@ -1821,13 +1829,13 @@ vcl::Window *VclBuilder::insertObject(vcl::Window *pParent, const OString &rClas //initialize the dialog. if (pParent && pParent->IsSystemWindow()) { - SystemWindow *pSysWin = static_cast<SystemWindow*>(pCurrentChild); + SystemWindow *pSysWin = static_cast<SystemWindow*>(pCurrentChild.get()); pSysWin->doDeferredInit(extractDeferredBits(rProps)); m_bToplevelHasDeferredInit = false; } else if (pParent && pParent->IsDockingWindow()) { - DockingWindow *pDockWin = static_cast<DockingWindow*>(pCurrentChild); + DockingWindow *pDockWin = static_cast<DockingWindow*>(pCurrentChild.get()); pDockWin->doDeferredInit(extractDeferredBits(rProps)); m_bToplevelHasDeferredInit = false; } @@ -1846,14 +1854,14 @@ vcl::Window *VclBuilder::insertObject(vcl::Window *pParent, const OString &rClas //if we're being inserting under a toplevel dialog whose init is //deferred due to waiting to encounter it in this .ui, and it hasn't //been seen yet, then make unattached widgets parent-less toplevels - if (pParent == m_pParent && m_bToplevelHasDeferredInit) + if (pParent == m_pParent.get() && m_bToplevelHasDeferredInit) pParent = NULL; pCurrentChild = makeObject(pParent, rClass, rID, rProps); } if (pCurrentChild) { - if (pCurrentChild == m_pParent && m_bToplevelHasDeferredProperties) + if (pCurrentChild == m_pParent.get() && m_bToplevelHasDeferredProperties) m_aDeferredProperties = rProps; else set_properties(pCurrentChild, rProps); @@ -1865,7 +1873,7 @@ vcl::Window *VclBuilder::insertObject(vcl::Window *pParent, const OString &rClas pCurrentChild->set_font_attribute(rKey, rValue); } - m_pParserState->m_aAtkInfo[pCurrentChild] = rAtk; + m_pParserState->m_aAtkInfo[VclPtr<vcl::Window>(pCurrentChild)] = rAtk; } rProps.clear(); @@ -1873,7 +1881,7 @@ vcl::Window *VclBuilder::insertObject(vcl::Window *pParent, const OString &rClas rAtk.clear(); if (!pCurrentChild) - pCurrentChild = m_aChildren.empty() ? pParent : m_aChildren.back().m_pWindow; + pCurrentChild = m_aChildren.empty() ? pParent : m_aChildren.back().m_pWindow.get(); return pCurrentChild; } @@ -2093,14 +2101,14 @@ void VclBuilder::handleChild(vcl::Window *pParent, xmlreader::XmlReader &reader) if (sInternalChild.startsWith("vbox") || sInternalChild.startsWith("messagedialog-vbox")) { if (Dialog *pBoxParent = dynamic_cast<Dialog*>(pParent)) - pBoxParent->set_content_area(static_cast<VclBox*>(pCurrentChild)); + pBoxParent->set_content_area(static_cast<VclBox*>(pCurrentChild)); // FIXME-VCLPTR } else if (sInternalChild.startsWith("action_area") || sInternalChild.startsWith("messagedialog-action_area")) { vcl::Window *pContentArea = pCurrentChild->GetParent(); if (Dialog *pBoxParent = dynamic_cast<Dialog*>(pContentArea ? pContentArea->GetParent() : NULL)) { - pBoxParent->set_action_area(static_cast<VclButtonBox*>(pCurrentChild)); + pBoxParent->set_action_area(static_cast<VclButtonBox*>(pCurrentChild)); // FIXME-VCLPTR } } @@ -2835,7 +2843,7 @@ template<typename T> bool insertItems(vcl::Window *pWindow, VclBuilder::stringma return true; } -vcl::Window* VclBuilder::handleObject(vcl::Window *pParent, xmlreader::XmlReader &reader) +VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, xmlreader::XmlReader &reader) { OString sClass; OString sID; @@ -2867,22 +2875,22 @@ vcl::Window* VclBuilder::handleObject(vcl::Window *pParent, xmlreader::XmlReader if (sClass == "GtkListStore") { handleListStore(reader, sID); - return NULL; + return nullptr; } else if (sClass == "GtkMenu") { handleMenu(reader, sID); - return NULL; + return nullptr; } else if (sClass == "GtkSizeGroup") { handleSizeGroup(reader, sID); - return NULL; + return nullptr; } else if (sClass == "AtkObject") { handleAtkObject(reader, sID, pParent); - return NULL; + return nullptr; } int nLevel = 1; @@ -2893,7 +2901,7 @@ vcl::Window* VclBuilder::handleObject(vcl::Window *pParent, xmlreader::XmlReader if (!sCustomProperty.isEmpty()) aProperties[OString("customproperty")] = sCustomProperty; - vcl::Window *pCurrentChild = NULL; + VclPtr<vcl::Window> pCurrentChild; while(true) { xmlreader::XmlReader::Result res = reader.nextItem( @@ -3015,7 +3023,7 @@ void VclBuilder::applyPackingProperty(vcl::Window *pCurrent, if (pCurrent->GetType() == WINDOW_SCROLLWINDOW) { - std::map<vcl::Window*, vcl::Window*>::iterator aFind = m_pParserState->m_aRedundantParentWidgets.find(pCurrent); + auto aFind = m_pParserState->m_aRedundantParentWidgets.find(VclPtr<vcl::Window>(pCurrent)); if (aFind != m_pParserState->m_aRedundantParentWidgets.end()) { pCurrent = aFind->second; @@ -3213,7 +3221,7 @@ void VclBuilder::collectAccelerator(xmlreader::XmlReader &reader, stringmap &rMa vcl::Window *VclBuilder::get_widget_root() { - return m_aChildren.empty() ? NULL : m_aChildren[0].m_pWindow; + return m_aChildren.empty() ? NULL : m_aChildren[0].m_pWindow.get(); } vcl::Window *VclBuilder::get_by_name(const OString& sID) @@ -3279,17 +3287,17 @@ void VclBuilder::delete_by_name(const OString& sID) { if (aI->m_sID.equals(sID)) { - delete aI->m_pWindow; + aI->m_pWindow.disposeAndClear(); m_aChildren.erase(aI); break; } } } -void VclBuilder::delete_by_window(const vcl::Window *pWindow) +void VclBuilder::delete_by_window(vcl::Window *pWindow) { drop_ownership(pWindow); - delete pWindow; + pWindow->disposeOnce(); } void VclBuilder::drop_ownership(const vcl::Window *pWindow) @@ -3551,4 +3559,8 @@ void VclBuilder::mungeTextBuffer(VclMultiLineEdit &rTarget, const TextBuffer &rT } } +VclBuilder::ParserState::ParserState() + : m_nLastToolbarId(0) +{} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/clipping.cxx b/vcl/source/window/clipping.cxx index 0c24e3051832..38efc376c7ef 100644 --- a/vcl/source/window/clipping.cxx +++ b/vcl/source/window/clipping.cxx @@ -842,7 +842,7 @@ void Window::ImplSaveOverlapBackground() if ( nSaveBackSize+mpWindowImpl->mpFrameData->mnAllSaveBackSize <= IMPL_MAXALLSAVEBACKSIZE ) { Size aOutSize( mnOutWidth, mnOutHeight ); - mpWindowImpl->mpOverlapData->mpSaveBackDev = new VirtualDevice( *mpWindowImpl->mpFrameWindow ); + mpWindowImpl->mpOverlapData->mpSaveBackDev = VclPtr<VirtualDevice>::Create( *mpWindowImpl->mpFrameWindow ); if ( mpWindowImpl->mpOverlapData->mpSaveBackDev->SetOutputSizePixel( aOutSize ) ) { mpWindowImpl->mpFrameWindow->ImplUpdateAll(); @@ -863,8 +863,7 @@ void Window::ImplSaveOverlapBackground() } else { - delete mpWindowImpl->mpOverlapData->mpSaveBackDev; - mpWindowImpl->mpOverlapData->mpSaveBackDev = NULL; + mpWindowImpl->mpOverlapData->mpSaveBackDev.disposeAndClear(); } } } @@ -915,8 +914,7 @@ void Window::ImplDeleteOverlapBackground() if ( mpWindowImpl->mpOverlapData->mpSaveBackDev ) { mpWindowImpl->mpFrameData->mnAllSaveBackSize -= mpWindowImpl->mpOverlapData->mnSaveBackSize; - delete mpWindowImpl->mpOverlapData->mpSaveBackDev; - mpWindowImpl->mpOverlapData->mpSaveBackDev = NULL; + mpWindowImpl->mpOverlapData->mpSaveBackDev.disposeAndClear(); if ( mpWindowImpl->mpOverlapData->mpSaveBackRgn ) { delete mpWindowImpl->mpOverlapData->mpSaveBackRgn; @@ -929,7 +927,7 @@ void Window::ImplDeleteOverlapBackground() else { vcl::Window* pTemp = mpWindowImpl->mpFrameData->mpFirstBackWin; - while ( pTemp->mpWindowImpl->mpOverlapData->mpNextBackWin != this ) + while ( pTemp->mpWindowImpl->mpOverlapData->mpNextBackWin.get() != this ) pTemp = pTemp->mpWindowImpl->mpOverlapData->mpNextBackWin; pTemp->mpWindowImpl->mpOverlapData->mpNextBackWin = mpWindowImpl->mpOverlapData->mpNextBackWin; } diff --git a/vcl/source/window/cursor.cxx b/vcl/source/window/cursor.cxx index d0c9a7327e5d..e61d82b1b5d6 100644 --- a/vcl/source/window/cursor.cxx +++ b/vcl/source/window/cursor.cxx @@ -38,7 +38,7 @@ struct ImplCursorData unsigned char mnDirection; // indicates writing direction sal_uInt16 mnStyle; // Cursor-Style bool mbCurVisible; // Ist Cursor aktuell sichtbar - vcl::Window* mpWindow; // Zugeordnetes Windows + VclPtr<vcl::Window> mpWindow; // Zugeordnetes Windows }; static void ImplCursorInvert( ImplCursorData* pData ) @@ -319,7 +319,7 @@ void vcl::Cursor::Hide() void vcl::Cursor::SetWindow( vcl::Window* pWindow ) { - if ( mpWindow != pWindow ) + if ( mpWindow.get() != pWindow ) { mpWindow = pWindow; ImplNew(); diff --git a/vcl/source/window/decoview.cxx b/vcl/source/window/decoview.cxx index c04c430ceac3..5bb7b79cbb0e 100644 --- a/vcl/source/window/decoview.cxx +++ b/vcl/source/window/decoview.cxx @@ -1050,7 +1050,7 @@ void DecorationView::DrawSeparator( const Point& rStart, const Point& rStop, boo { Point aStart( rStart ), aStop( rStop ); const StyleSettings& rStyleSettings = mpOutDev->GetSettings().GetStyleSettings(); - vcl::Window *const pWin = (mpOutDev->GetOutDevType()==OUTDEV_WINDOW) ? static_cast<vcl::Window*>(mpOutDev) : NULL; + vcl::Window *const pWin = (mpOutDev->GetOutDevType()==OUTDEV_WINDOW) ? static_cast<vcl::Window*>(mpOutDev.get()) : NULL; if(pWin) { ControlPart nPart = ( bVertical ? PART_SEPARATOR_VERT : PART_SEPARATOR_HORZ ); diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 1e9f53a86df3..9e6d4bf12dae 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -347,8 +347,8 @@ void Dialog::ImplInitDialogData() mbOldSaveBack = false; mbInClose = false; mbModalMode = false; - mpContentArea = NULL; - mpActionArea = NULL; + mpContentArea.clear(); + mpActionArea.clear(); mnMousePositioned = 0; mpDialogImpl = new DialogImpl; } @@ -403,7 +403,7 @@ void Dialog::ImplInit( vcl::Window* pParent, WinBits nStyle ) // create window with a small border ? if ( (nStyle & (WB_BORDER | WB_NOBORDER | WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE)) == WB_BORDER ) { - ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle, BORDERWINDOW_STYLE_FRAME ); + VclPtrInstance<ImplBorderWindow> pBorderWin( pParent, nStyle, BORDERWINDOW_STYLE_FRAME ); SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL ); pBorderWin->mpWindowImpl->mpClientWindow = this; pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); @@ -421,7 +421,7 @@ void Dialog::ImplInit( vcl::Window* pParent, WinBits nStyle ) } else { - ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle, BORDERWINDOW_STYLE_OVERLAP | BORDERWINDOW_STYLE_BORDER ); + VclPtrInstance<ImplBorderWindow> pBorderWin( pParent, nStyle, BORDERWINDOW_STYLE_OVERLAP | BORDERWINDOW_STYLE_BORDER ); SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL ); pBorderWin->mpWindowImpl->mpClientWindow = this; pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); @@ -456,6 +456,12 @@ Dialog::Dialog( WindowType nType ) ImplInitDialogData(); } +void VclBuilderContainer::disposeBuilder() +{ + if (m_pUIBuilder) + m_pUIBuilder->disposeBuilder(); +} + OUString VclBuilderContainer::getUIRootDir() { /*to-do, check if user config has an override before using shared one, etc*/ @@ -482,7 +488,7 @@ OUString VclBuilderContainer::getUIRootDir() //do the init. Find the real parent stashed in mpDialogParent. void Dialog::doDeferredInit(WinBits nBits) { - vcl::Window *pParent = mpDialogParent; + VclPtr<vcl::Window> pParent = mpDialogParent; mpDialogParent = NULL; ImplInit(pParent, nBits); mbIsDefferedInit = false; @@ -509,14 +515,14 @@ Dialog::Dialog(vcl::Window* pParent, WinBits nStyle) ImplInit( pParent, nStyle ); } -void Dialog::set_action_area(VclButtonBox* pActionArea) +void Dialog::set_action_area(VclButtonBox* pBox) { - mpActionArea = pActionArea; + mpActionArea.set(pBox); } -void Dialog::set_content_area(VclBox* pContentArea) +void Dialog::set_content_area(VclBox* pBox) { - mpContentArea = pContentArea; + mpContentArea.set(pBox); } void Dialog::settingOptimalLayoutSize(Window *pBox) @@ -538,8 +544,17 @@ void Dialog::settingOptimalLayoutSize(Window *pBox) Dialog::~Dialog() { + disposeOnce(); +} + +void Dialog::dispose() +{ delete mpDialogImpl; mpDialogImpl = NULL; + mpPrevExecuteDlg.clear(); + mpActionArea.clear(); + mpContentArea.clear(); + SystemWindow::dispose(); } IMPL_LINK_NOARG(Dialog, ImplAsyncCloseHdl) @@ -991,7 +1006,7 @@ void Dialog::SetModalInputMode( bool bModal ) pPrevModalDlg = pPrevModalDlg->mpPrevExecuteDlg; if( pPrevModalDlg && - ( pPrevModalDlg == mpPrevExecuteDlg + ( pPrevModalDlg == mpPrevExecuteDlg.get() || !pPrevModalDlg->IsWindowOrChild( this, true ) ) ) { mpPrevExecuteDlg->SetModalInputMode( false ); @@ -1050,8 +1065,8 @@ void Dialog::GrabFocusToFirstControl() void Dialog::GetDrawWindowBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder, sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const { - ImplBorderWindow aImplWin( (vcl::Window*)this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP ); - aImplWin.GetBorder( rLeftBorder, rTopBorder, rRightBorder, rBottomBorder ); + ScopedVclPtrInstance<ImplBorderWindow> aImplWin( (vcl::Window*)this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP ); + aImplWin->GetBorder( rLeftBorder, rTopBorder, rRightBorder, rBottomBorder ); } void Dialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong ) @@ -1077,13 +1092,13 @@ void Dialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal if (!( GetStyle() & WB_NOBORDER )) { - ImplBorderWindow aImplWin( this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP ); - aImplWin.SetText( GetText() ); - aImplWin.setPosSizePixel( aPos.X(), aPos.Y(), aSize.Width(), aSize.Height() ); - aImplWin.SetDisplayActive( true ); - aImplWin.InitView(); + ScopedVclPtrInstance< ImplBorderWindow > aImplWin( this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP ); + aImplWin->SetText( GetText() ); + aImplWin->setPosSizePixel( aPos.X(), aPos.Y(), aSize.Width(), aSize.Height() ); + aImplWin->SetDisplayActive( true ); + aImplWin->InitView(); - aImplWin.Draw( Rectangle( aPos, aSize ), pDev, aPos ); + aImplWin->Draw( Rectangle( aPos, aSize ), pDev, aPos ); } pDev->Pop(); diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index 2b63b3f3920d..eb899fdb2831 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -530,9 +530,9 @@ namespace ); } - bool focusNextInGroup(std::vector<RadioButton*>::iterator aStart, std::vector<RadioButton*> &rGroup) + bool focusNextInGroup(const std::vector<VclPtr<RadioButton> >::iterator& aStart, std::vector<VclPtr<RadioButton> > &rGroup) { - std::vector<RadioButton*>::iterator aI(aStart); + std::vector<VclPtr<RadioButton> >::iterator aI(aStart); if (aStart != rGroup.end()) ++aI; @@ -564,7 +564,7 @@ namespace bool nextInGroup(RadioButton *pSourceWindow, bool bBackward) { - std::vector<RadioButton*> aGroup(pSourceWindow->GetRadioButtonGroup(true)); + std::vector<VclPtr<RadioButton> > aGroup(pSourceWindow->GetRadioButtonGroup(true)); if (aGroup.size() == 1) //only one button in group return false; @@ -572,7 +572,7 @@ namespace if (bBackward) std::reverse(aGroup.begin(), aGroup.end()); - std::vector<RadioButton*>::iterator aStart(std::find(aGroup.begin(), aGroup.end(), pSourceWindow)); + auto aStart(std::find(aGroup.begin(), aGroup.end(), VclPtr<RadioButton>(pSourceWindow))); assert(aStart != aGroup.end()); @@ -716,9 +716,9 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) if ( bKeyInput && mpWindowImpl->mpDlgCtrlDownWindow ) { - if ( mpWindowImpl->mpDlgCtrlDownWindow != pButtonWindow ) + if ( mpWindowImpl->mpDlgCtrlDownWindow.get() != pButtonWindow ) { - static_cast<PushButton*>(mpWindowImpl->mpDlgCtrlDownWindow)->SetPressed( false ); + static_cast<PushButton*>(mpWindowImpl->mpDlgCtrlDownWindow.get())->SetPressed( false ); mpWindowImpl->mpDlgCtrlDownWindow = NULL; return true; } @@ -928,16 +928,16 @@ bool Window::ImplDlgCtrl( const KeyEvent& rKEvt, bool bKeyInput ) { if ( bKeyInput ) { - if ( mpWindowImpl->mpDlgCtrlDownWindow && (mpWindowImpl->mpDlgCtrlDownWindow != pButtonWindow) ) + if ( mpWindowImpl->mpDlgCtrlDownWindow && (mpWindowImpl->mpDlgCtrlDownWindow.get() != pButtonWindow) ) { - static_cast<PushButton*>(mpWindowImpl->mpDlgCtrlDownWindow)->SetPressed( false ); + static_cast<PushButton*>(mpWindowImpl->mpDlgCtrlDownWindow.get())->SetPressed( false ); mpWindowImpl->mpDlgCtrlDownWindow = NULL; } static_cast<PushButton*>(pButtonWindow)->SetPressed( true ); mpWindowImpl->mpDlgCtrlDownWindow = pButtonWindow; } - else if ( mpWindowImpl->mpDlgCtrlDownWindow == pButtonWindow ) + else if ( mpWindowImpl->mpDlgCtrlDownWindow.get() == pButtonWindow ) { mpWindowImpl->mpDlgCtrlDownWindow = NULL; static_cast<PushButton*>(pButtonWindow)->SetPressed( false ); @@ -1060,7 +1060,7 @@ void Window::ImplDlgCtrlFocusChanged( vcl::Window* pWindow, bool bGetFocus ) { if ( mpWindowImpl->mpDlgCtrlDownWindow && !bGetFocus ) { - static_cast<PushButton*>(mpWindowImpl->mpDlgCtrlDownWindow)->SetPressed( false ); + static_cast<PushButton*>(mpWindowImpl->mpDlgCtrlDownWindow.get())->SetPressed( false ); mpWindowImpl->mpDlgCtrlDownWindow = NULL; } diff --git a/vcl/source/window/dndevdis.cxx b/vcl/source/window/dndevdis.cxx index dabfef79569e..94d6ae75b1dd 100644 --- a/vcl/source/window/dndevdis.cxx +++ b/vcl/source/window/dndevdis.cxx @@ -99,7 +99,7 @@ void SAL_CALL DNDEventDispatcher::drop( const DropTargetDropEvent& dtde ) vcl::Window* pChildWindow = findTopLevelWindow(location); // handle the case that drop is in an other vcl window than the last dragOver - if( pChildWindow != m_pCurrentWindow ) + if( pChildWindow != m_pCurrentWindow.get() ) { // fire dragExit on listeners of previous window fireDragExitEvent( m_pCurrentWindow ); @@ -177,7 +177,7 @@ void SAL_CALL DNDEventDispatcher::dragOver( const DropTargetDragEvent& dtde ) vcl::Window * pChildWindow = findTopLevelWindow(location); - if( pChildWindow != m_pCurrentWindow ) + if( pChildWindow != m_pCurrentWindow.get() ) { // fire dragExit on listeners of previous window fireDragExitEvent( m_pCurrentWindow ); @@ -215,7 +215,7 @@ void SAL_CALL DNDEventDispatcher::dropActionChanged( const DropTargetDragEvent& vcl::Window* pChildWindow = findTopLevelWindow(location); - if( pChildWindow != m_pCurrentWindow ) + if( pChildWindow != m_pCurrentWindow.get() ) { // fire dragExit on listeners of previous window fireDragExitEvent( m_pCurrentWindow ); diff --git a/vcl/source/window/dockingarea.cxx b/vcl/source/window/dockingarea.cxx index 623ea9635b37..43ce7bdb3c4d 100644 --- a/vcl/source/window/dockingarea.cxx +++ b/vcl/source/window/dockingarea.cxx @@ -92,7 +92,13 @@ DockingAreaWindow::DockingAreaWindow( vcl::Window* pParent ) : DockingAreaWindow::~DockingAreaWindow() { + disposeOnce(); +} + +void DockingAreaWindow::dispose() +{ delete mpImplData; + Window::dispose(); } void DockingAreaWindow::DataChanged( const DataChangedEvent& rDCEvt ) diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx index 66b01f9e1283..160e21074029 100644 --- a/vcl/source/window/dockmgr.cxx +++ b/vcl/source/window/dockmgr.cxx @@ -57,6 +57,7 @@ public: ImplDockFloatWin2( vcl::Window* pParent, WinBits nWinBits, ImplDockingWindowWrapper* pDockingWin ); virtual ~ImplDockFloatWin2(); + virtual void dispose() SAL_OVERRIDE; virtual void Move() SAL_OVERRIDE; virtual void Resize() SAL_OVERRIDE; @@ -97,8 +98,14 @@ ImplDockFloatWin2::ImplDockFloatWin2( vcl::Window* pParent, WinBits nWinBits, ImplDockFloatWin2::~ImplDockFloatWin2() { + disposeOnce(); +} + +void ImplDockFloatWin2::dispose() +{ if( mnLastUserEvent ) Application::RemoveUserEvent( mnLastUserEvent ); + FloatingWindow::dispose(); } IMPL_LINK_NOARG(ImplDockFloatWin2, DockTimerHdl) @@ -477,6 +484,7 @@ private: public: ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, bool bHasGrip ); virtual ~ImplPopupFloatWin(); + virtual void dispose() SAL_OVERRIDE; virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE; virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; @@ -513,7 +521,13 @@ ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWra ImplPopupFloatWin::~ImplPopupFloatWin() { + disposeOnce(); +} + +void ImplPopupFloatWin::dispose() +{ mpDockingWin = NULL; + FloatingWindow::dispose(); } ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > ImplPopupFloatWin::CreateAccessible() @@ -813,7 +827,7 @@ ImplDockingWindowWrapper::ImplDockingWindowWrapper( const vcl::Window *pWindow ) , mbStartDockingEnabled(false) , mbLocked(false) { - DockingWindow *pDockWin = dynamic_cast< DockingWindow* > ( mpDockingWindow ); + DockingWindow *pDockWin = dynamic_cast< DockingWindow* > ( mpDockingWindow.get() ); if( pDockWin ) mnFloatBits = pDockWin->GetFloatStyle(); } @@ -842,14 +856,14 @@ bool ImplDockingWindowWrapper::ImplStartDocking( const Point& rPos ) mbStartFloat = mbLastFloatMode; // calculate FloatingBorder - FloatingWindow* pWin; + VclPtr<FloatingWindow> pWin; if ( mpFloatWin ) pWin = mpFloatWin; else - pWin = new ImplDockFloatWin2( mpParent, mnFloatBits, NULL ); + pWin = VclPtr<ImplDockFloatWin2>::Create( mpParent, mnFloatBits, nullptr ); pWin->GetBorder( mnDockLeft, mnDockTop, mnDockRight, mnDockBottom ); if ( !mpFloatWin ) - delete pWin; + pWin.disposeAndClear(); Point aPos = GetWindow()->ImplOutputToFrame( Point() ); Size aSize = GetWindow()->GetOutputSizePixel(); @@ -1098,11 +1112,11 @@ void ImplDockingWindowWrapper::StartPopupMode( ToolBox *pParentToolBox, sal_uLon // prepare reparenting vcl::Window* pRealParent = GetWindow()->GetWindow( WINDOW_PARENT ); mpOldBorderWin = GetWindow()->GetWindow( WINDOW_BORDER ); - if( mpOldBorderWin == GetWindow() ) + if( mpOldBorderWin.get() == GetWindow() ) mpOldBorderWin = NULL; // no border window found // the new parent for popup mode - ImplPopupFloatWin* pWin = new ImplPopupFloatWin( mpParent, this, (nFlags & FLOATWIN_POPUPMODE_ALLOWTEAROFF) != 0 ); + VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, this, (nFlags & FLOATWIN_POPUPMODE_ALLOWTEAROFF) != 0 ); pWin->SetPopupModeEndHdl( LINK( this, ImplDockingWindowWrapper, PopupModeEnd ) ); pWin->SetText( GetWindow()->GetText() ); @@ -1153,7 +1167,7 @@ IMPL_LINK_NOARG(ImplDockingWindowWrapper, PopupModeEnd) GetWindow()->Show( false, SHOW_NOFOCUSCHANGE ); // set parameter for handler before destroying floating window - ImplPopupFloatWin *pPopupFloatWin = static_cast<ImplPopupFloatWin*>(mpFloatWin); + ImplPopupFloatWin *pPopupFloatWin = static_cast<ImplPopupFloatWin*>(mpFloatWin.get()); EndPopupModeData aData( pPopupFloatWin->GetTearOffPosition(), mpFloatWin->IsPopupModeTearOff() ); // before deleting change parent back, so we can delete the floating window alone @@ -1162,7 +1176,7 @@ IMPL_LINK_NOARG(ImplDockingWindowWrapper, PopupModeEnd) if ( mpOldBorderWin ) { GetWindow()->SetParent( mpOldBorderWin ); - static_cast<ImplBorderWindow*>(mpOldBorderWin)->GetBorder( + static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder( GetWindow()->mpWindowImpl->mnLeftBorder, GetWindow()->mpWindowImpl->mnTopBorder, GetWindow()->mpWindowImpl->mnRightBorder, GetWindow()->mpWindowImpl->mnBottomBorder ); mpOldBorderWin->Resize(); @@ -1171,8 +1185,7 @@ IMPL_LINK_NOARG(ImplDockingWindowWrapper, PopupModeEnd) GetWindow()->SetParent( pRealParent ); GetWindow()->mpWindowImpl->mpRealParent = pRealParent; - delete mpFloatWin; - mpFloatWin = NULL; + mpFloatWin.disposeAndClear(); // call handler - which will destroy the window and thus the wrapper as well ! GetWindow()->CallEventListeners( VCLEVENT_WINDOW_ENDPOPUPMODE, &aData ); @@ -1212,7 +1225,8 @@ void ImplDockingWindowWrapper::SetFloatingMode( bool bFloatMode ) mpOldBorderWin = NULL; // no border window found ImplDockFloatWin2* pWin = - new ImplDockFloatWin2( + VclPtr<ImplDockFloatWin2>::Create( + mpParent, mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ? mnFloatBits | WB_SYSTEMWINDOW @@ -1277,7 +1291,7 @@ void ImplDockingWindowWrapper::SetFloatingMode( bool bFloatMode ) if ( mpOldBorderWin ) { GetWindow()->SetParent( mpOldBorderWin ); - static_cast<ImplBorderWindow*>(mpOldBorderWin)->GetBorder( + static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder( GetWindow()->mpWindowImpl->mnLeftBorder, GetWindow()->mpWindowImpl->mnTopBorder, GetWindow()->mpWindowImpl->mnRightBorder, GetWindow()->mpWindowImpl->mnBottomBorder ); mpOldBorderWin->Resize(); @@ -1286,8 +1300,7 @@ void ImplDockingWindowWrapper::SetFloatingMode( bool bFloatMode ) GetWindow()->SetParent( pRealParent ); GetWindow()->mpWindowImpl->mpRealParent = pRealParent; - delete static_cast<ImplDockFloatWin2*>(mpFloatWin); - mpFloatWin = NULL; + mpFloatWin.disposeAndClear(); GetWindow()->SetPosPixel( maDockPos ); if ( bVisible ) @@ -1350,7 +1363,7 @@ void ImplDockingWindowWrapper::SetMaxOutputSizePixel( const Size& rSize ) bool ImplDockingWindowWrapper::IsFloatingMode() const { - return (mpFloatWin != NULL); + return (mpFloatWin != nullptr); } void ImplDockingWindowWrapper::SetDragArea( const Rectangle& rRect ) diff --git a/vcl/source/window/dockwin.cxx b/vcl/source/window/dockwin.cxx index a170e3f3d5ca..408cb328a132 100644 --- a/vcl/source/window/dockwin.cxx +++ b/vcl/source/window/dockwin.cxx @@ -42,8 +42,8 @@ public: ImplData(); ~ImplData(); - vcl::Window* mpParent; - Size maMaxOutSize; + VclPtr<vcl::Window> mpParent; + Size maMaxOutSize; }; DockingWindow::ImplData::ImplData() @@ -59,7 +59,7 @@ DockingWindow::ImplData::~ImplData() class ImplDockFloatWin : public FloatingWindow { private: - DockingWindow* mpDockWin; + VclPtr<DockingWindow> mpDockWin; sal_uInt64 mnLastTicks; Idle maDockIdle; Point maDockPos; @@ -73,6 +73,7 @@ public: ImplDockFloatWin( vcl::Window* pParent, WinBits nWinBits, DockingWindow* pDockingWin ); virtual ~ImplDockFloatWin(); + virtual void dispose() SAL_OVERRIDE; virtual void Move() SAL_OVERRIDE; virtual void Resize() SAL_OVERRIDE; @@ -111,8 +112,18 @@ ImplDockFloatWin::ImplDockFloatWin( vcl::Window* pParent, WinBits nWinBits, ImplDockFloatWin::~ImplDockFloatWin() { + disposeOnce(); +} + +void ImplDockFloatWin::dispose() +{ if( mnLastUserEvent ) Application::RemoveUserEvent( mnLastUserEvent ); + + disposeBuilder(); + + mpDockWin.clear(); + FloatingWindow::dispose(); } IMPL_LINK_NOARG(ImplDockFloatWin, DockTimerHdl) @@ -253,14 +264,14 @@ bool DockingWindow::ImplStartDocking( const Point& rPos ) mbStartFloat = mbLastFloatMode; // calculate FloatingBorder - FloatingWindow* pWin; + VclPtr<FloatingWindow> pWin; if ( mpFloatWin ) pWin = mpFloatWin; else - pWin = new ImplDockFloatWin( mpImplData->mpParent, mnFloatBits, NULL ); + pWin = VclPtr<ImplDockFloatWin>::Create( mpImplData->mpParent, mnFloatBits, nullptr ); pWin->GetBorder( mnDockLeft, mnDockTop, mnDockRight, mnDockBottom ); if ( !mpFloatWin ) - delete pWin; + pWin.disposeAndClear(); Point aPos = ImplOutputToFrame( Point() ); Size aSize = Window::GetOutputSizePixel(); @@ -460,6 +471,11 @@ DockingWindow::DockingWindow(vcl::Window* pParent, const OString& rID, DockingWindow::~DockingWindow() { + disposeOnce(); +} + +void DockingWindow::dispose() +{ if ( IsFloatingMode() ) { Show( false, SHOW_NOFOCUSCHANGE ); @@ -467,6 +483,11 @@ DockingWindow::~DockingWindow() } delete mpImplData; mpImplData = NULL; + mpFloatWin.clear(); + mpOldBorderWin.clear(); + mpDialogParent.clear(); + disposeBuilder(); + Window::dispose(); } void DockingWindow::Tracking( const TrackingEvent& rTEvt ) @@ -781,7 +802,8 @@ void DockingWindow::SetFloatingMode( bool bFloatMode ) mpOldBorderWin = mpWindowImpl->mpBorderWindow; ImplDockFloatWin* pWin = - new ImplDockFloatWin( + VclPtr<ImplDockFloatWin>::Create( + mpImplData->mpParent, mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ? mnFloatBits | WB_SYSTEMWINDOW : mnFloatBits, this ); @@ -851,14 +873,13 @@ void DockingWindow::SetFloatingMode( bool bFloatMode ) if ( mpOldBorderWin ) { SetParent( mpOldBorderWin ); - static_cast<ImplBorderWindow*>(mpOldBorderWin)->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); + static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); mpOldBorderWin->Resize(); } mpWindowImpl->mpBorderWindow = mpOldBorderWin; SetParent( pRealParent ); mpWindowImpl->mpRealParent = pRealParent; - delete static_cast<ImplDockFloatWin*>(mpFloatWin); - mpFloatWin = NULL; + mpFloatWin.disposeAndClear(); SetPosPixel( maDockPos ); ToggleFloatingMode(); @@ -1033,7 +1054,7 @@ bool DockingWindow::IsFloatingMode() const if( pWrapper ) return pWrapper->IsFloatingMode(); else - return (mpFloatWin != NULL); + return (mpFloatWin != nullptr); } void DockingWindow::SetMaxOutputSizePixel( const Size& rSize ) diff --git a/vcl/source/window/event.cxx b/vcl/source/window/event.cxx index da38fde26b36..9c954125779d 100644 --- a/vcl/source/window/event.cxx +++ b/vcl/source/window/event.cxx @@ -94,6 +94,9 @@ bool Window::Notify( NotifyEvent& rNEvt ) { bool nRet = false; + if (IsDisposed()) + return false; + // check for docking window // but do nothing if window is docked and locked ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); @@ -221,6 +224,9 @@ void Window::CallEventListeners( sal_uLong nEvent, void* pData ) { pWindow->ImplAddDel( &aDelData ); + if ( aDelData.IsDead() ) + return; + pWindow->mpWindowImpl->maChildEventListeners.Call( &aEvent ); if ( aDelData.IsDead() ) @@ -277,7 +283,7 @@ ImplSVEvent * Window::PostUserEvent( const Link& rLink, void* pCaller ) void Window::RemoveUserEvent( ImplSVEvent * nUserEvent ) { - DBG_ASSERT( nUserEvent->mpWindow == this, + DBG_ASSERT( nUserEvent->mpWindow.get() == this, "Window::RemoveUserEvent(): Event doesn't send to this window or is already removed" ); DBG_ASSERT( nUserEvent->mbCall, "Window::RemoveUserEvent(): Event is already removed" ); @@ -515,14 +521,14 @@ void Window::ImplCallFocusChangeActivate( vcl::Window* pNewOverlapWindow, { if ( pSVData->maWinData.mpLastDeacWin ) { - if ( pSVData->maWinData.mpLastDeacWin == pNewOverlapWindow ) + if ( pSVData->maWinData.mpLastDeacWin.get() == pNewOverlapWindow ) bCallActivate = false; else { vcl::Window* pLastRealWindow = pSVData->maWinData.mpLastDeacWin->ImplGetWindow(); pSVData->maWinData.mpLastDeacWin->mpWindowImpl->mbActive = false; pSVData->maWinData.mpLastDeacWin->Deactivate(); - if ( pLastRealWindow != pSVData->maWinData.mpLastDeacWin ) + if ( pLastRealWindow != pSVData->maWinData.mpLastDeacWin.get() ) { pLastRealWindow->mpWindowImpl->mbActive = true; pLastRealWindow->Activate(); @@ -568,5 +574,21 @@ void Window::ImplCallFocusChangeActivate( vcl::Window* pNewOverlapWindow, } /* namespace vcl */ +NotifyEvent::NotifyEvent() +{ + mpWindow = NULL; + mpData = NULL; + mnEventType = MouseNotifyEvent::NONE; + mnRetValue = 0; +} + +NotifyEvent::NotifyEvent( MouseNotifyEvent nEventType, vcl::Window* pWindow, + const void* pEvent, long nRet ) +{ + mpWindow = pWindow; + mpData = const_cast<void*>(pEvent); + mnEventType = nEventType; + mnRetValue = nRet; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx index 8ad024e1511f..65a5ef452458 100644 --- a/vcl/source/window/floatwin.cxx +++ b/vcl/source/window/floatwin.cxx @@ -39,7 +39,7 @@ public: ImplData(); ~ImplData(); - ToolBox* mpBox; + VclPtr<ToolBox> mpBox; Rectangle maItemEdgeClipRect; // used to clip the common edge between a toolbar item and the border of this window }; @@ -107,7 +107,7 @@ void FloatingWindow::ImplInit( vcl::Window* pParent, WinBits nStyle ) nBorderStyle |= BORDERWINDOW_STYLE_FRAME; nStyle |= WB_CLOSEABLE; // make undecorated floaters closeable } - pBorderWin = new ImplBorderWindow( pParent, nStyle, nBorderStyle ); + pBorderWin = VclPtr<ImplBorderWindow>::Create( pParent, nStyle, nBorderStyle ); SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL ); pBorderWin->mpWindowImpl->mpClientWindow = this; pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); @@ -185,18 +185,32 @@ void FloatingWindow::doDeferredInit(WinBits nBits) FloatingWindow::~FloatingWindow() { - if( mbPopupModeCanceled ) - // indicates that ESC key was pressed - // will be handled in Window::ImplGrabFocus() - SetDialogControlFlags( GetDialogControlFlags() | WINDOW_DLGCTRL_FLOATWIN_POPUPMODEEND_CANCEL ); + disposeOnce(); +} + +void FloatingWindow::dispose() +{ + if (mpImplData) + { + if( mbPopupModeCanceled ) + // indicates that ESC key was pressed + // will be handled in Window::ImplGrabFocus() + SetDialogControlFlags( GetDialogControlFlags() | WINDOW_DLGCTRL_FLOATWIN_POPUPMODEEND_CANCEL ); - if ( IsInPopupMode() ) - EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL | FLOATWIN_POPUPMODEEND_DONTCALLHDL ); + if ( IsInPopupMode() ) + EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL | FLOATWIN_POPUPMODEEND_DONTCALLHDL ); - if ( mnPostId ) - Application::RemoveUserEvent( mnPostId ); + if ( mnPostId ) + Application::RemoveUserEvent( mnPostId ); + mnPostId = 0; + } delete mpImplData; + mpImplData = NULL; + + mpNextFloat.clear(); + mpFirstPopupModeWin.clear(); + SystemWindow::dispose(); } Point FloatingWindow::CalcFloatingPosition( vcl::Window* pWindow, const Rectangle& rRect, sal_uLong nFlags, sal_uInt16& rArrangeIndex ) @@ -593,8 +607,8 @@ void FloatingWindow::SetTitleType( sal_uInt16 nTitle ) nTitleStyle = BORDERWINDOW_TITLE_POPUP; else // nTitle == FLOATWIN_TITLE_NONE nTitleStyle = BORDERWINDOW_TITLE_NONE; - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetTitleType( nTitleStyle, aOutSize ); - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetTitleType( nTitleStyle, aOutSize ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); } } @@ -734,7 +748,7 @@ void FloatingWindow::ImplEndPopupMode( sal_uInt16 nFlags, sal_uLong nFocusId ) mbInCleanUp = true; // prevent killing this window due to focus change while working with it // stop the PopupMode also for all following PopupMode windows - while ( pSVData->maWinData.mpFirstFloat && pSVData->maWinData.mpFirstFloat != this ) + while ( pSVData->maWinData.mpFirstFloat && pSVData->maWinData.mpFirstFloat.get() != this ) pSVData->maWinData.mpFirstFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL ); // delete window from the list diff --git a/vcl/source/window/introwin.cxx b/vcl/source/window/introwin.cxx index fa311d3129b5..d8b400135477 100644 --- a/vcl/source/window/introwin.cxx +++ b/vcl/source/window/introwin.cxx @@ -40,9 +40,16 @@ IntroWindow::IntroWindow( ) : IntroWindow::~IntroWindow() { + disposeOnce(); +} + +void IntroWindow::dispose() +{ ImplSVData* pSVData = ImplGetSVData(); - if ( pSVData->mpIntroWindow == this ) - pSVData->mpIntroWindow = NULL; + if ( pSVData->mpIntroWindow.get() == this ) + pSVData->mpIntroWindow = nullptr; + + WorkWindow::dispose(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/layout.cxx b/vcl/source/window/layout.cxx index 2cc0a675b5dc..c9a43087cdf7 100644 --- a/vcl/source/window/layout.cxx +++ b/vcl/source/window/layout.cxx @@ -1286,6 +1286,17 @@ void VclBin::setAllocation(const Size &rAllocation) setLayoutAllocation(*pChild, Point(0, 0), rAllocation); } +VclFrame::~VclFrame() +{ + disposeOnce(); +} + +void VclFrame::dispose() +{ + m_pLabel.clear(); + VclBin::dispose(); +} + //To-Do, hook a DecorationView into VclFrame ? Size VclFrame::calculateRequisition() const @@ -1467,11 +1478,17 @@ bool VclAlignment::set_property(const OString &rKey, const OString &rValue) return true; } +void VclExpander::dispose() +{ + m_pDisclosureButton.disposeAndClear(); + VclBin::dispose(); +} + const vcl::Window *VclExpander::get_child() const { const WindowImpl* pWindowImpl = ImplGetWindowImpl(); - assert(pWindowImpl->mpFirstChild == m_pDisclosureButton.get()); + assert(pWindowImpl->mpFirstChild == m_pDisclosureButton); return pWindowImpl->mpFirstChild->GetWindow(WINDOW_NEXT); } @@ -1488,12 +1505,12 @@ Size VclExpander::calculateRequisition() const WindowImpl* pWindowImpl = ImplGetWindowImpl(); const vcl::Window *pChild = get_child(); - const vcl::Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild : NULL; + const vcl::Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild.get() : NULL; if (pChild && pChild->IsVisible() && m_pDisclosureButton->IsChecked()) aRet = getLayoutRequisition(*pChild); - Size aExpanderSize = getLayoutRequisition(*m_pDisclosureButton.get()); + Size aExpanderSize = getLayoutRequisition(*m_pDisclosureButton); if (pLabel && pLabel->IsVisible()) { @@ -1525,9 +1542,9 @@ void VclExpander::setAllocation(const Size &rAllocation) //The label widget is the last (of two) children vcl::Window *pChild = get_child(); - vcl::Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild : NULL; + vcl::Window *pLabel = pChild != pWindowImpl->mpLastChild.get() ? pWindowImpl->mpLastChild.get() : NULL; - Size aButtonSize = getLayoutRequisition(*m_pDisclosureButton.get()); + Size aButtonSize = getLayoutRequisition(*m_pDisclosureButton); Size aLabelSize; Size aExpanderSize = aButtonSize; if (pLabel && pLabel->IsVisible()) @@ -1545,7 +1562,7 @@ void VclExpander::setAllocation(const Size &rAllocation) long nExtraExpanderHeight = aExpanderSize.Height() - aButtonSize.Height(); Point aButtonPos(aChildPos.X(), aChildPos.Y() + nExtraExpanderHeight/2); - setLayoutAllocation(*m_pDisclosureButton.get(), aButtonPos, aButtonSize); + setLayoutAllocation(*m_pDisclosureButton, aButtonPos, aButtonSize); if (pLabel && pLabel->IsVisible()) { @@ -1610,9 +1627,9 @@ IMPL_LINK( VclExpander, ClickHdl, DisclosureButton*, pBtn ) VclScrolledWindow::VclScrolledWindow(vcl::Window *pParent, WinBits nStyle) : VclBin(pParent, nStyle) , m_bUserManagedScrolling(false) - , m_pVScroll(new ScrollBar(this, WB_HIDE | WB_VERT)) - , m_pHScroll(new ScrollBar(this, WB_HIDE | WB_HORZ)) - , m_aScrollBarBox(this, WB_HIDE) + , m_pVScroll(VclPtr<ScrollBar>::Create(this, WB_HIDE | WB_VERT)) + , m_pHScroll(VclPtr<ScrollBar>::Create(this, WB_HIDE | WB_HORZ)) + , m_aScrollBarBox(VclPtr<ScrollBarBox>::Create(this, WB_HIDE)) { SetType(WINDOW_SCROLLWINDOW); @@ -1621,6 +1638,14 @@ VclScrolledWindow::VclScrolledWindow(vcl::Window *pParent, WinBits nStyle) m_pHScroll->SetScrollHdl(aLink); } +void VclScrolledWindow::dispose() +{ + m_pVScroll.disposeAndClear(); + m_pHScroll.disposeAndClear(); + m_aScrollBarBox.disposeAndClear(); + VclBin::dispose(); +} + IMPL_LINK_NOARG(VclScrolledWindow, ScrollBarHdl) { vcl::Window *pChild = get_child(); @@ -1672,10 +1697,10 @@ Size VclScrolledWindow::calculateRequisition() const aRet = getLayoutRequisition(*pChild); if (GetStyle() & WB_VSCROLL) - aRet.Width() += getLayoutRequisition(*m_pVScroll.get()).Width(); + aRet.Width() += getLayoutRequisition(*m_pVScroll).Width(); if (GetStyle() & WB_HSCROLL) - aRet.Height() += getLayoutRequisition(*m_pHScroll.get()).Height(); + aRet.Height() += getLayoutRequisition(*m_pHScroll).Height(); return aRet; } @@ -1721,7 +1746,7 @@ void VclScrolledWindow::setAllocation(const Size &rAllocation) } if (m_pVScroll->IsVisible()) - nAvailWidth -= getLayoutRequisition(*m_pVScroll.get()).Width(); + nAvailWidth -= getLayoutRequisition(*m_pVScroll).Width(); // horz. ScrollBar if (GetStyle() & WB_AUTOHSCROLL) @@ -1730,7 +1755,7 @@ void VclScrolledWindow::setAllocation(const Size &rAllocation) m_pHScroll->Show(bShowHScroll); if (bShowHScroll) - nAvailHeight -= getLayoutRequisition(*m_pHScroll.get()).Height(); + nAvailHeight -= getLayoutRequisition(*m_pHScroll).Height(); if (GetStyle() & WB_AUTOVSCROLL) m_pVScroll->Show(nAvailHeight < aChildReq.Height()); @@ -1741,10 +1766,10 @@ void VclScrolledWindow::setAllocation(const Size &rAllocation) if (m_pVScroll->IsVisible()) { - nScrollBarWidth = getLayoutRequisition(*m_pVScroll.get()).Width(); + nScrollBarWidth = getLayoutRequisition(*m_pVScroll).Width(); Point aScrollPos(rAllocation.Width() - nScrollBarWidth, 0); Size aScrollSize(nScrollBarWidth, rAllocation.Height()); - setLayoutAllocation(*m_pVScroll.get(), aScrollPos, aScrollSize); + setLayoutAllocation(*m_pVScroll, aScrollPos, aScrollSize); aChildAllocation.Width() -= nScrollBarWidth; aInnerSize.Width() -= nScrollBarWidth; aChildAllocation.Height() = aChildReq.Height(); @@ -1752,10 +1777,10 @@ void VclScrolledWindow::setAllocation(const Size &rAllocation) if (m_pHScroll->IsVisible()) { - nScrollBarHeight = getLayoutRequisition(*m_pHScroll.get()).Height(); + nScrollBarHeight = getLayoutRequisition(*m_pHScroll).Height(); Point aScrollPos(0, rAllocation.Height() - nScrollBarHeight); Size aScrollSize(rAllocation.Width(), nScrollBarHeight); - setLayoutAllocation(*m_pHScroll.get(), aScrollPos, aScrollSize); + setLayoutAllocation(*m_pHScroll, aScrollPos, aScrollSize); aChildAllocation.Height() -= nScrollBarHeight; aInnerSize.Height() -= nScrollBarHeight; aChildAllocation.Width() = aChildReq.Width(); @@ -1764,12 +1789,12 @@ void VclScrolledWindow::setAllocation(const Size &rAllocation) if (m_pVScroll->IsVisible() && m_pHScroll->IsVisible()) { Point aBoxPos(aInnerSize.Width(), aInnerSize.Height()); - m_aScrollBarBox.SetPosSizePixel(aBoxPos, Size(nScrollBarWidth, nScrollBarHeight)); - m_aScrollBarBox.Show(); + m_aScrollBarBox->SetPosSizePixel(aBoxPos, Size(nScrollBarWidth, nScrollBarHeight)); + m_aScrollBarBox->Show(); } else { - m_aScrollBarBox.Hide(); + m_aScrollBarBox->Hide(); } if (pChild && pChild->IsVisible()) @@ -1811,7 +1836,7 @@ bool VclScrolledWindow::Notify(NotifyEvent& rNEvt) const CommandWheelData* pData = rCEvt.GetWheelData(); if( !pData->GetModifier() && ( pData->GetMode() == CommandWheelMode::SCROLL ) ) { - nDone = HandleScrollCommand(rCEvt, m_pHScroll.get(), m_pVScroll.get()); + nDone = HandleScrollCommand(rCEvt, m_pHScroll, m_pVScroll); } } } @@ -1835,7 +1860,7 @@ const vcl::Window *VclEventBox::get_child() const { const WindowImpl* pWindowImpl = ImplGetWindowImpl(); - assert(pWindowImpl->mpFirstChild == &m_aEventBoxHelper); + assert(pWindowImpl->mpFirstChild.get() == m_aEventBoxHelper.get()); return pWindowImpl->mpFirstChild->GetWindow(WINDOW_NEXT); } @@ -1878,6 +1903,17 @@ void VclEventBox::Command(const CommandEvent&) //discard events by default to block them reaching children } +VclEventBox::~VclEventBox() +{ + disposeOnce(); +} + +void VclEventBox::dispose() +{ + m_aEventBoxHelper.disposeAndClear(); + VclBin::dispose(); +} + void VclSizeGroup::trigger_queue_resize() { //sufficient to trigger one widget to trigger all of them @@ -1939,10 +1975,10 @@ bool VclSizeGroup::set_property(const OString &rKey, const OString &rValue) void MessageDialog::create_owned_areas() { set_border_width(12); - m_pOwnedContentArea = new VclVBox(this, false, 24); + m_pOwnedContentArea.set(VclPtr<VclVBox>::Create(this, false, 24)); set_content_area(m_pOwnedContentArea); m_pOwnedContentArea->Show(); - m_pOwnedActionArea = new VclHButtonBox(m_pOwnedContentArea); + m_pOwnedActionArea.set( VclPtr<VclHButtonBox>::Create(m_pOwnedContentArea) ); set_action_area(m_pOwnedActionArea); m_pOwnedActionArea->Show(); } @@ -1992,16 +2028,24 @@ MessageDialog::MessageDialog(vcl::Window* pParent, const OString& rID, const OUS { } -MessageDialog::~MessageDialog() +void MessageDialog::dispose() { for (size_t i = 0; i < m_aOwnedButtons.size(); ++i) - delete m_aOwnedButtons[i]; - delete m_pSecondaryMessage; - delete m_pPrimaryMessage; - delete m_pImage; - delete m_pGrid; - delete m_pOwnedActionArea; - delete m_pOwnedContentArea; + m_aOwnedButtons[i].disposeAndClear(); + m_aOwnedButtons.clear(); + + m_pPrimaryMessage.disposeAndClear(); + m_pSecondaryMessage.disposeAndClear(); + m_pImage.disposeAndClear(); + m_pGrid.disposeAndClear(); + m_pOwnedActionArea.disposeAndClear(); + m_pOwnedContentArea.disposeAndClear(); + Dialog::dispose(); +} + +MessageDialog::~MessageDialog() +{ + disposeOnce(); } void MessageDialog::response(short nResponseId) @@ -2017,7 +2061,7 @@ IMPL_LINK(MessageDialog, ButtonHdl, Button *, pButton) short MessageDialog::get_response(const vcl::Window *pWindow) const { - std::map<const vcl::Window*, short>::const_iterator aFind = m_aResponses.find(pWindow); + auto aFind = m_aResponses.find(pWindow); if (aFind != m_aResponses.end()) return aFind->second; if (!m_pUIBuilder) @@ -2090,12 +2134,12 @@ short MessageDialog::Execute() VclContainer *pContainer = get_content_area(); assert(pContainer); - m_pGrid = new VclGrid(pContainer); + m_pGrid.set( VclPtr<VclGrid>::Create(pContainer) ); m_pGrid->reorderWithinParent(0); m_pGrid->set_column_spacing(12); m_pGrid->set_row_spacing(GetTextHeight()); - m_pImage = new FixedImage(m_pGrid, WB_CENTER | WB_VCENTER | WB_3DLOOK); + m_pImage = VclPtr<FixedImage>::Create(m_pGrid, WB_CENTER | WB_VCENTER | WB_3DLOOK); switch (m_eMessageType) { case VCL_MESSAGE_INFO: @@ -2120,7 +2164,7 @@ short MessageDialog::Execute() bool bHasSecondaryText = !m_sSecondaryString.isEmpty(); - m_pPrimaryMessage = new VclMultiLineEdit(m_pGrid, nWinStyle); + m_pPrimaryMessage = VclPtr<VclMultiLineEdit>::Create(m_pGrid, nWinStyle); m_pPrimaryMessage->SetPaintTransparent(true); m_pPrimaryMessage->EnableCursor(false); @@ -2130,7 +2174,7 @@ short MessageDialog::Execute() m_pPrimaryMessage->SetText(m_sPrimaryString); m_pPrimaryMessage->Show(!m_sPrimaryString.isEmpty()); - m_pSecondaryMessage = new VclMultiLineEdit(m_pGrid, nWinStyle); + m_pSecondaryMessage = VclPtr<VclMultiLineEdit>::Create(m_pGrid, nWinStyle); m_pSecondaryMessage->SetPaintTransparent(true); m_pSecondaryMessage->EnableCursor(false); m_pSecondaryMessage->set_grid_left_attach(1); @@ -2139,44 +2183,44 @@ short MessageDialog::Execute() m_pSecondaryMessage->SetText(m_sSecondaryString); m_pSecondaryMessage->Show(bHasSecondaryText); - MessageDialog::SetMessagesWidths(this, m_pPrimaryMessage, bHasSecondaryText ? m_pSecondaryMessage : NULL); + MessageDialog::SetMessagesWidths(this, m_pPrimaryMessage, bHasSecondaryText ? m_pSecondaryMessage.get() : NULL); VclButtonBox *pButtonBox = get_action_area(); assert(pButtonBox); - PushButton *pBtn; + VclPtr<PushButton> pBtn; switch (m_eButtonsType) { case VCL_BUTTONS_NONE: break; case VCL_BUTTONS_OK: - pBtn = new OKButton(pButtonBox); + pBtn.set( VclPtr<OKButton>::Create(pButtonBox) ); pBtn->SetStyle(pBtn->GetStyle() & WB_DEFBUTTON); pBtn->Show(); m_aOwnedButtons.push_back(pBtn); m_aResponses[pBtn] = RET_OK; break; case VCL_BUTTONS_CLOSE: - pBtn = new CloseButton(pButtonBox); + pBtn.set( VclPtr<CloseButton>::Create(pButtonBox) ); pBtn->SetStyle(pBtn->GetStyle() & WB_DEFBUTTON); pBtn->Show(); m_aOwnedButtons.push_back(pBtn); m_aResponses[pBtn] = RET_CLOSE; break; case VCL_BUTTONS_CANCEL: - pBtn = new CancelButton(pButtonBox); + pBtn.set( VclPtr<CancelButton>::Create(pButtonBox) ); pBtn->SetStyle(pBtn->GetStyle() & WB_DEFBUTTON); m_aOwnedButtons.push_back(pBtn); m_aResponses[pBtn] = RET_CANCEL; break; case VCL_BUTTONS_YES_NO: - pBtn = new PushButton(pButtonBox); + pBtn = VclPtr<PushButton>::Create(pButtonBox); pBtn->SetText(Button::GetStandardText(StandardButtonType::Yes)); pBtn->Show(); m_aOwnedButtons.push_back(pBtn); m_aResponses[pBtn] = RET_YES; - pBtn = new PushButton(pButtonBox); + pBtn.set( VclPtr<PushButton>::Create(pButtonBox) ); pBtn->SetStyle(pBtn->GetStyle() & WB_DEFBUTTON); pBtn->SetText(Button::GetStandardText(StandardButtonType::No)); pBtn->Show(); @@ -2184,12 +2228,12 @@ short MessageDialog::Execute() m_aResponses[pBtn] = RET_NO; break; case VCL_BUTTONS_OK_CANCEL: - pBtn = new OKButton(pButtonBox); + pBtn.set( VclPtr<OKButton>::Create(pButtonBox) ); pBtn->Show(); m_aOwnedButtons.push_back(pBtn); m_aResponses[pBtn] = RET_OK; - pBtn = new CancelButton(pButtonBox); + pBtn.set( VclPtr<CancelButton>::Create(pButtonBox) ); pBtn->SetStyle(pBtn->GetStyle() & WB_DEFBUTTON); pBtn->Show(); m_aOwnedButtons.push_back(pBtn); diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index 597e6627d1fb..e972321a7f53 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -133,16 +133,13 @@ Menu::Menu() Menu::~Menu() { - - vcl::LazyDeletor<Menu>::Undelete( this ); - ImplCallEventListeners( VCLEVENT_OBJECT_DYING, ITEMPOS_INVALID ); // at the window free the reference to the accessible component // and make sure the MenuFloatingWindow knows about our destruction if ( pWindow ) { - MenuFloatingWindow* pFloat = static_cast<MenuFloatingWindow*>(pWindow); + MenuFloatingWindow* pFloat = static_cast<MenuFloatingWindow*>(pWindow.get()); if( pFloat->pMenu == this ) pFloat->pMenu = NULL; pWindow->SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >() ); @@ -1704,7 +1701,7 @@ Size Menu::ImplCalcSize( const vcl::Window* pWin ) // account for the size of the close button, which actually is a toolbox // due to NWF this is variable - long nCloseButtonHeight = static_cast<MenuBarWindow*>(pWindow)->MinCloseButtonSize().Height(); + long nCloseButtonHeight = static_cast<MenuBarWindow*>(pWindow.get())->MinCloseButtonSize().Height(); if (aSz.Height() < nCloseButtonHeight) aSz.Height() = nCloseButtonHeight; } @@ -2269,7 +2266,7 @@ void Menu::ImplFillLayoutData() const } else { - MenuFloatingWindow* pFloat = static_cast<MenuFloatingWindow*>(pWindow); + MenuFloatingWindow* pFloat = static_cast<MenuFloatingWindow*>(pWindow.get()); ImplPaint( pWindow, pFloat->nScrollerHeight, pFloat->ImplGetStartY(), 0, false, true ); } } @@ -2381,9 +2378,9 @@ bool Menu::IsHighlighted( sal_uInt16 nItemPos ) const if( pWindow ) { if (IsMenuBar()) - bRet = ( nItemPos == static_cast< MenuBarWindow * > (pWindow)->GetHighlightedItem() ); + bRet = ( nItemPos == static_cast< MenuBarWindow * > (pWindow.get())->GetHighlightedItem() ); else - bRet = ( nItemPos == static_cast< MenuFloatingWindow * > (pWindow)->GetHighlightedItem() ); + bRet = ( nItemPos == static_cast< MenuFloatingWindow * > (pWindow.get())->GetHighlightedItem() ); } return bRet; @@ -2395,13 +2392,13 @@ void Menu::HighlightItem( sal_uInt16 nItemPos ) { if (IsMenuBar()) { - MenuBarWindow* pMenuWin = static_cast< MenuBarWindow* >( pWindow ); + MenuBarWindow* pMenuWin = static_cast< MenuBarWindow* >( pWindow.get() ); pMenuWin->SetAutoPopup( false ); pMenuWin->ChangeHighlightItem( nItemPos, false ); } else { - static_cast< MenuFloatingWindow* >( pWindow )->ChangeHighlightItem( nItemPos, false ); + static_cast< MenuFloatingWindow* >( pWindow.get() )->ChangeHighlightItem( nItemPos, false ); } } } @@ -2411,7 +2408,7 @@ IMenuBarWindow* MenuBar::getMenuBarWindow() { // so far just a dynamic_cast, hopefully to be turned into something saner // at some stage - IMenuBarWindow *pWin = dynamic_cast<IMenuBarWindow*>(pWindow); + IMenuBarWindow *pWin = dynamic_cast<IMenuBarWindow*>(pWindow.get()); //either there is no window (fdo#87663) or it is an IMenuBarWindow assert(!pWindow || pWin); return pWin; @@ -2505,7 +2502,7 @@ vcl::Window* MenuBar::ImplCreate(vcl::Window* pParent, vcl::Window* pWindow, Men MenuBarWindow *pMenuBarWindow = dynamic_cast<MenuBarWindow*>(pWindow); if (!pMenuBarWindow) { - pWindow = pMenuBarWindow = new MenuBarWindow( pParent ); + pWindow = pMenuBarWindow = VclPtr<MenuBarWindow>::Create( pParent ); } pMenu->pStartedFrom = 0; @@ -2532,7 +2529,7 @@ void MenuBar::ImplDestroy( MenuBar* pMenu, bool bDelete ) IMenuBarWindow* pMenuWin = pMenu->getMenuBarWindow(); if (pMenuWin) pMenuWin->KillActivePopup(); - delete pWindow; + pWindow->disposeOnce(); } pMenu->pWindow = NULL; } @@ -2929,7 +2926,7 @@ sal_uInt16 PopupMenu::ImplExecute( vcl::Window* pW, const Rectangle& rRect, sal_ CreateAutoMnemonics(); } - MenuFloatingWindow* pWin = new MenuFloatingWindow( this, pW, nStyle | WB_SYSTEMWINDOW ); + VclPtrInstance<MenuFloatingWindow> pWin( this, pW, nStyle | WB_SYSTEMWINDOW ); if( pSVData->maNWFData.mbFlatMenu ) pWin->SetBorderStyle( WindowBorderStyle::NOBORDER ); else @@ -3009,9 +3006,9 @@ sal_uInt16 PopupMenu::ImplExecute( vcl::Window* pW, const Rectangle& rRect, sal_ { sal_uInt16 aPos; if (pSFrom->IsMenuBar()) - aPos = static_cast<MenuBarWindow *>(pSFrom->pWindow)->GetHighlightedItem(); + aPos = static_cast<MenuBarWindow *>(pSFrom->pWindow.get())->GetHighlightedItem(); else - aPos = static_cast<MenuFloatingWindow *>(pSFrom->pWindow)->GetHighlightedItem(); + aPos = static_cast<MenuFloatingWindow *>(pSFrom->pWindow.get())->GetHighlightedItem(); pWin->SetPosInParent( aPos ); // store position to be sent in SUBMENUDEACTIVATE pSFrom->ImplCallEventListeners( VCLEVENT_MENU_SUBMENUACTIVATE, aPos ); diff --git a/vcl/source/window/menubarwindow.cxx b/vcl/source/window/menubarwindow.cxx index 553baa472ecb..47f61ad6829d 100644 --- a/vcl/source/window/menubarwindow.cxx +++ b/vcl/source/window/menubarwindow.cxx @@ -60,7 +60,7 @@ void DecoToolBox::DataChanged( const DataChangedEvent& rDCEvt ) void DecoToolBox::calcMinSize() { - ToolBox aTbx( GetParent() ); + ScopedVclPtrInstance<ToolBox> aTbx( GetParent() ); if( GetItemCount() == 0 ) { ResMgr* pResMgr = ImplGetResMgr(); @@ -68,7 +68,7 @@ void DecoToolBox::calcMinSize() Bitmap aBitmap; if( pResMgr ) aBitmap = Bitmap( ResId( SV_RESID_BITMAP_CLOSEDOC, *pResMgr ) ); - aTbx.InsertItem( IID_DOCUMENTCLOSE, Image( aBitmap ) ); + aTbx->InsertItem( IID_DOCUMENTCLOSE, Image( aBitmap ) ); } else { @@ -76,11 +76,13 @@ void DecoToolBox::calcMinSize() for( sal_uInt16 i = 0; i < nItems; i++ ) { sal_uInt16 nId = GetItemId( i ); - aTbx.InsertItem( nId, GetItemImage( nId ) ); + aTbx->InsertItem( nId, GetItemImage( nId ) ); } } - aTbx.SetOutStyle( TOOLBOX_STYLE_FLAT ); - maMinSize = aTbx.CalcWindowSizePixel(); + aTbx->SetOutStyle( TOOLBOX_STYLE_FLAT ); + maMinSize = aTbx->CalcWindowSizePixel(); + + aTbx.disposeAndClear(); } void DecoToolBox::SetImages( long nMaxHeight, bool bForce ) @@ -117,9 +119,9 @@ void DecoToolBox::SetImages( long nMaxHeight, bool bForce ) MenuBarWindow::MenuBarWindow( vcl::Window* pParent ) : Window( pParent, 0 ), - aCloseBtn(this), - aFloatBtn( this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE ), - aHideBtn( this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE ) + aCloseBtn(VclPtr<DecoToolBox>::Create(this)), + aFloatBtn(VclPtr<PushButton>::Create( this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE )), + aHideBtn(VclPtr<PushButton>::Create(this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE )) { SetType( WINDOW_MENUBARWINDOW ); pMenu = NULL; @@ -137,25 +139,25 @@ MenuBarWindow::MenuBarWindow( vcl::Window* pParent ) : if( pResMgr ) { BitmapEx aBitmap( ResId( SV_RESID_BITMAP_CLOSEDOC, *pResMgr ) ); - aCloseBtn.maImage = Image(aBitmap); + aCloseBtn->maImage = Image(aBitmap); - aCloseBtn.SetOutStyle(TOOLBOX_STYLE_FLAT); - aCloseBtn.SetBackground(); - aCloseBtn.SetPaintTransparent(true); - aCloseBtn.SetParentClipMode(PARENTCLIPMODE_NOCLIP); + aCloseBtn->SetOutStyle(TOOLBOX_STYLE_FLAT); + aCloseBtn->SetBackground(); + aCloseBtn->SetPaintTransparent(true); + aCloseBtn->SetParentClipMode(PARENTCLIPMODE_NOCLIP); - aCloseBtn.InsertItem(IID_DOCUMENTCLOSE, aCloseBtn.maImage, ToolBoxItemBits::NONE); - aCloseBtn.SetSelectHdl(LINK(this, MenuBarWindow, CloseHdl)); - aCloseBtn.AddEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl)); - aCloseBtn.SetQuickHelpText(IID_DOCUMENTCLOSE, ResId(SV_HELPTEXT_CLOSEDOCUMENT, *pResMgr).toString()); + aCloseBtn->InsertItem(IID_DOCUMENTCLOSE, aCloseBtn->maImage, ToolBoxItemBits::NONE); + aCloseBtn->SetSelectHdl(LINK(this, MenuBarWindow, CloseHdl)); + aCloseBtn->AddEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl)); + aCloseBtn->SetQuickHelpText(IID_DOCUMENTCLOSE, ResId(SV_HELPTEXT_CLOSEDOCUMENT, *pResMgr).toString()); - aFloatBtn.SetClickHdl( LINK( this, MenuBarWindow, FloatHdl ) ); - aFloatBtn.SetSymbol( SymbolType::FLOAT ); - aFloatBtn.SetQuickHelpText( ResId(SV_HELPTEXT_RESTORE, *pResMgr).toString() ); + aFloatBtn->SetClickHdl( LINK( this, MenuBarWindow, FloatHdl ) ); + aFloatBtn->SetSymbol( SymbolType::FLOAT ); + aFloatBtn->SetQuickHelpText( ResId(SV_HELPTEXT_RESTORE, *pResMgr).toString() ); - aHideBtn.SetClickHdl( LINK( this, MenuBarWindow, HideHdl ) ); - aHideBtn.SetSymbol( SymbolType::HIDE ); - aHideBtn.SetQuickHelpText( ResId(SV_HELPTEXT_MINIMIZE, *pResMgr).toString() ); + aHideBtn->SetClickHdl( LINK( this, MenuBarWindow, HideHdl ) ); + aHideBtn->SetSymbol( SymbolType::HIDE ); + aHideBtn->SetQuickHelpText( ResId(SV_HELPTEXT_MINIMIZE, *pResMgr).toString() ); } ImplInitStyleSettings(); @@ -165,8 +167,19 @@ MenuBarWindow::MenuBarWindow( vcl::Window* pParent ) : MenuBarWindow::~MenuBarWindow() { - aCloseBtn.RemoveEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl)); + disposeOnce(); +} + +void MenuBarWindow::dispose() +{ + aCloseBtn->RemoveEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl)); RemoveEventListener(LINK(this, MenuBarWindow, ShowHideListener)); + + aHideBtn.disposeAndClear(); + aFloatBtn.disposeAndClear(); + aCloseBtn.disposeAndClear(); + + Window::dispose(); } void MenuBarWindow::SetMenu( MenuBar* pMen ) @@ -177,10 +190,10 @@ void MenuBarWindow::SetMenu( MenuBar* pMen ) ImplInitMenuWindow( this, true, true ); if ( pMen ) { - aCloseBtn.ShowItem(IID_DOCUMENTCLOSE, pMen->HasCloseButton()); - aCloseBtn.Show(pMen->HasCloseButton() || !m_aAddButtons.empty()); - aFloatBtn.Show(pMen->HasFloatButton()); - aHideBtn.Show(pMen->HasHideButton()); + aCloseBtn->ShowItem(IID_DOCUMENTCLOSE, pMen->HasCloseButton()); + aCloseBtn->Show(pMen->HasCloseButton() || !m_aAddButtons.empty()); + aFloatBtn->Show(pMen->HasFloatButton()); + aHideBtn->Show(pMen->HasHideButton()); } Invalidate(); @@ -201,16 +214,16 @@ void MenuBarWindow::SetHeight(long nHeight) void MenuBarWindow::ShowButtons( bool bClose, bool bFloat, bool bHide ) { - aCloseBtn.ShowItem(IID_DOCUMENTCLOSE, bClose); - aCloseBtn.Show(bClose || !m_aAddButtons.empty()); - aFloatBtn.Show( bFloat ); - aHideBtn.Show( bHide ); + aCloseBtn->ShowItem(IID_DOCUMENTCLOSE, bClose); + aCloseBtn->Show(bClose || !m_aAddButtons.empty()); + aFloatBtn->Show( bFloat ); + aHideBtn->Show( bHide ); Resize(); } Size MenuBarWindow::MinCloseButtonSize() { - return aCloseBtn.getMinSize(); + return aCloseBtn->getMinSize(); } IMPL_LINK_NOARG(MenuBarWindow, CloseHdl) @@ -218,7 +231,7 @@ IMPL_LINK_NOARG(MenuBarWindow, CloseHdl) if( ! pMenu ) return 0; - if( aCloseBtn.GetCurItemId() == IID_DOCUMENTCLOSE ) + if( aCloseBtn->GetCurItemId() == IID_DOCUMENTCLOSE ) { // #i106052# call close hdl asynchronously to ease handler implementation // this avoids still being in the handler while the DecoToolBox already @@ -227,12 +240,12 @@ IMPL_LINK_NOARG(MenuBarWindow, CloseHdl) } else { - std::map<sal_uInt16,AddButtonEntry>::iterator it = m_aAddButtons.find(aCloseBtn.GetCurItemId()); + std::map<sal_uInt16,AddButtonEntry>::iterator it = m_aAddButtons.find(aCloseBtn->GetCurItemId()); if( it != m_aAddButtons.end() ) { MenuBar::MenuBarButtonCallbackArg aArg; aArg.nId = it->first; - aArg.bHighlight = (aCloseBtn.GetHighlightItemId() == it->first); + aArg.bHighlight = (aCloseBtn->GetHighlightItemId() == it->first); aArg.pMenuBar = dynamic_cast<MenuBar*>(pMenu); return it->second.m_aSelectLink.Call( &aArg ); } @@ -250,11 +263,11 @@ IMPL_LINK( MenuBarWindow, ToolboxEventHdl, VclWindowEvent*, pEvent ) aArg.bHighlight = (pEvent->GetId() == VCLEVENT_TOOLBOX_HIGHLIGHT); aArg.pMenuBar = dynamic_cast<MenuBar*>(pMenu); if( pEvent->GetId() == VCLEVENT_TOOLBOX_HIGHLIGHT ) - aArg.nId = aCloseBtn.GetHighlightItemId(); + aArg.nId = aCloseBtn->GetHighlightItemId(); else if( pEvent->GetId() == VCLEVENT_TOOLBOX_HIGHLIGHTOFF ) { sal_uInt16 nPos = static_cast< sal_uInt16 >(reinterpret_cast<sal_IntPtr>(pEvent->GetData())); - aArg.nId = aCloseBtn.GetItemId(nPos); + aArg.nId = aCloseBtn->GetItemId(nPos); } std::map< sal_uInt16, AddButtonEntry >::iterator it = m_aAddButtons.find( aArg.nId ); if( it != m_aAddButtons.end() ) @@ -338,8 +351,8 @@ void MenuBarWindow::KillActivePopup() { if ( pActivePopup ) { - if( pActivePopup->pWindow != NULL ) - if( static_cast<FloatingWindow *>(pActivePopup->pWindow)->IsInCleanUp() ) + if( pActivePopup->pWindow ) + if( static_cast<FloatingWindow *>(pActivePopup->pWindow.get())->IsInCleanUp() ) return; // kill it later if ( pActivePopup->bInCallback ) @@ -446,7 +459,7 @@ void MenuBarWindow::ChangeHighlightItem( sal_uInt16 n, bool bSelectEntry, bool b if( !bStayActive ) { // #105406# avoid saving the focus when we already have the focus - bool bNoSaveFocus = (this == ImplGetSVData()->maWinData.mpFocusWin ); + bool bNoSaveFocus = (this == ImplGetSVData()->maWinData.mpFocusWin.get() ); if( nSaveFocusId ) { @@ -913,30 +926,30 @@ void MenuBarWindow::Resize() long nX = aOutSz.Width()-3; long nY = 2; - if ( aCloseBtn.IsVisible() ) + if ( aCloseBtn->IsVisible() ) { - aCloseBtn.Hide(); - aCloseBtn.SetImages(n); - Size aTbxSize( aCloseBtn.CalcWindowSizePixel() ); + aCloseBtn->Hide(); + aCloseBtn->SetImages(n); + Size aTbxSize( aCloseBtn->CalcWindowSizePixel() ); nX -= aTbxSize.Width(); long nTbxY = (aOutSz.Height() - aTbxSize.Height())/2; - aCloseBtn.setPosSizePixel(nX, nTbxY, aTbxSize.Width(), aTbxSize.Height()); + aCloseBtn->setPosSizePixel(nX, nTbxY, aTbxSize.Width(), aTbxSize.Height()); nX -= 3; - aCloseBtn.Show(); + aCloseBtn->Show(); } - if ( aFloatBtn.IsVisible() ) + if ( aFloatBtn->IsVisible() ) { nX -= n; - aFloatBtn.setPosSizePixel( nX, nY, n, n ); + aFloatBtn->setPosSizePixel( nX, nY, n, n ); } - if ( aHideBtn.IsVisible() ) + if ( aHideBtn->IsVisible() ) { nX -= n; - aHideBtn.setPosSizePixel( nX, nY, n, n ); + aHideBtn->setPosSizePixel( nX, nY, n, n ); } - aFloatBtn.SetSymbol( SymbolType::FLOAT ); - aHideBtn.SetSymbol( SymbolType::HIDE ); + aFloatBtn->SetSymbol( SymbolType::FLOAT ); + aHideBtn->SetSymbol( SymbolType::HIDE ); Invalidate(); } @@ -1083,9 +1096,9 @@ sal_uInt16 MenuBarWindow::AddMenuBarButton( const Image& i_rImage, const Link& i AddButtonEntry& rNewEntry = m_aAddButtons[nId]; rNewEntry.m_nId = nId; rNewEntry.m_aSelectLink = i_rLink; - aCloseBtn.InsertItem(nId, i_rImage, ToolBoxItemBits::NONE, 0); - aCloseBtn.calcMinSize(); - ShowButtons(aCloseBtn.IsItemVisible(IID_DOCUMENTCLOSE), aFloatBtn.IsVisible(), aHideBtn.IsVisible()); + aCloseBtn->InsertItem(nId, i_rImage, ToolBoxItemBits::NONE, 0); + aCloseBtn->calcMinSize(); + ShowButtons(aCloseBtn->IsItemVisible(IID_DOCUMENTCLOSE), aFloatBtn->IsVisible(), aHideBtn->IsVisible()); LayoutChanged(); if( pMenu->mpSalMenu ) @@ -1118,8 +1131,8 @@ Rectangle MenuBarWindow::GetMenuBarButtonRectPixel( sal_uInt16 nId ) if( aRect.IsEmpty() ) { - aRect = aCloseBtn.GetItemRect(nId); - Point aOffset = aCloseBtn.OutputToScreenPixel(Point()); + aRect = aCloseBtn->GetItemRect(nId); + Point aOffset = aCloseBtn->OutputToScreenPixel(Point()); aRect.Move( aOffset.X(), aOffset.Y() ); } } @@ -1128,10 +1141,10 @@ Rectangle MenuBarWindow::GetMenuBarButtonRectPixel( sal_uInt16 nId ) void MenuBarWindow::RemoveMenuBarButton( sal_uInt16 nId ) { - sal_uInt16 nPos = aCloseBtn.GetItemPos(nId); - aCloseBtn.RemoveItem(nPos); + sal_uInt16 nPos = aCloseBtn->GetItemPos(nId); + aCloseBtn->RemoveItem(nPos); m_aAddButtons.erase( nId ); - aCloseBtn.calcMinSize(); + aCloseBtn->calcMinSize(); LayoutChanged(); if( pMenu->mpSalMenu ) diff --git a/vcl/source/window/menubarwindow.hxx b/vcl/source/window/menubarwindow.hxx index 46c79accc0f5..bb3c8be22073 100644 --- a/vcl/source/window/menubarwindow.hxx +++ b/vcl/source/window/menubarwindow.hxx @@ -39,7 +39,9 @@ class DecoToolBox : public ToolBox using Window::ImplInit; public: - DecoToolBox( vcl::Window* pParent, WinBits nStyle = 0 ); + DecoToolBox( vcl::Window* pParent, WinBits nStyle = 0 ); + virtual ~DecoToolBox() {} + void ImplInit(); void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE; @@ -52,6 +54,7 @@ public: Image maImage; }; + /** Class that implements the actual window of the menu bar. */ class MenuBarWindow : public vcl::Window, public IMenuBarWindow @@ -62,32 +65,32 @@ class MenuBarWindow : public vcl::Window, public IMenuBarWindow private: struct AddButtonEntry { - sal_uInt16 m_nId; - Link m_aSelectLink; - Link m_aHighlightLink; + sal_uInt16 m_nId; + Link m_aSelectLink; + Link m_aHighlightLink; AddButtonEntry() : m_nId( 0 ) {} }; Menu* pMenu; PopupMenu* pActivePopup; - sal_uInt16 nHighlightedItem; - sal_uInt16 nRolloveredItem; - sal_uLong nSaveFocusId; + sal_uInt16 nHighlightedItem; + sal_uInt16 nRolloveredItem; + sal_uLong nSaveFocusId; bool mbAutoPopup; bool bIgnoreFirstMove; bool bStayActive; - DecoToolBox aCloseBtn; - PushButton aFloatBtn; - PushButton aHideBtn; + VclPtr<DecoToolBox> aCloseBtn; + VclPtr<PushButton> aFloatBtn; + VclPtr<PushButton> aHideBtn; std::map< sal_uInt16, AddButtonEntry > m_aAddButtons; void HighlightItem( sal_uInt16 nPos, bool bHighlight ); virtual void ChangeHighlightItem(sal_uInt16 n, bool bSelectPopupEntry, bool bAllowRestoreFocus = true, bool bDefaultToDocument = true) SAL_OVERRIDE; - sal_uInt16 ImplFindEntry( const Point& rMousePos ) const; + sal_uInt16 ImplFindEntry( const Point& rMousePos ) const; void ImplCreatePopup( bool bPreSelectFirst ); virtual bool HandleKeyEvent(const KeyEvent& rKEvent, bool bFromMenu = true) SAL_OVERRIDE; Rectangle ImplGetItemRect( sal_uInt16 nPos ); @@ -107,7 +110,8 @@ private: public: MenuBarWindow( vcl::Window* pParent ); - virtual ~MenuBarWindow(); + virtual ~MenuBarWindow(); + virtual void dispose() SAL_OVERRIDE; virtual void ShowButtons(bool bClose, bool bFloat, bool bHide) SAL_OVERRIDE; diff --git a/vcl/source/window/menufloatingwindow.cxx b/vcl/source/window/menufloatingwindow.cxx index 19e709d43423..227cc8bb5932 100644 --- a/vcl/source/window/menufloatingwindow.cxx +++ b/vcl/source/window/menufloatingwindow.cxx @@ -104,7 +104,14 @@ void MenuFloatingWindow::doShutdown() MenuFloatingWindow::~MenuFloatingWindow() { + disposeOnce(); +} + +void MenuFloatingWindow::dispose() +{ doShutdown(); + + FloatingWindow::dispose(); } void MenuFloatingWindow::Resize() @@ -406,8 +413,8 @@ void MenuFloatingWindow::KillActivePopup( PopupMenu* pThisOnly ) { if ( pActivePopup && ( !pThisOnly || ( pThisOnly == pActivePopup ) ) ) { - if( pActivePopup->pWindow != NULL ) - if( static_cast<FloatingWindow *>(pActivePopup->pWindow)->IsInCleanUp() ) + if( pActivePopup->pWindow ) + if( static_cast<FloatingWindow *>(pActivePopup->pWindow.get())->IsInCleanUp() ) return; // kill it later if ( pActivePopup->bInCallback ) pActivePopup->bCanceled = true; diff --git a/vcl/source/window/menufloatingwindow.hxx b/vcl/source/window/menufloatingwindow.hxx index 5e1b3437584d..3157be8d493f 100644 --- a/vcl/source/window/menufloatingwindow.hxx +++ b/vcl/source/window/menufloatingwindow.hxx @@ -80,7 +80,8 @@ protected: public: MenuFloatingWindow( Menu* pMenu, vcl::Window* pParent, WinBits nStyle ); - virtual ~MenuFloatingWindow(); + virtual ~MenuFloatingWindow(); + virtual void dispose() SAL_OVERRIDE; void doShutdown(); diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx index bb7698a8428e..c4623a61fb72 100644 --- a/vcl/source/window/mouse.cxx +++ b/vcl/source/window/mouse.cxx @@ -198,7 +198,7 @@ static bool IsWindowFocused(const WindowImpl& rWinImpl) void Window::ImplGrabFocus( sal_uInt16 nFlags ) { // #143570# no focus for destructing windows - if( mpWindowImpl->mbInDtor ) + if( !mpWindowImpl || mpWindowImpl->mbInDispose ) return; // some event listeners do really bad stuff @@ -215,7 +215,7 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags ) // For a lack of design we need a little hack here to // ensure that dialogs on close pass the focus back to // the correct window - if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow != this) && + if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow.get() != this) && !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) && mpWindowImpl->mpLastFocusWindow->IsEnabled() && mpWindowImpl->mpLastFocusWindow->IsInputEnabled() && @@ -231,7 +231,7 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags ) // For a lack of design we need a little hack here to // ensure that dialogs on close pass the focus back to // the correct window - if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow != this) && + if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow.get() != this) && !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) && mpWindowImpl->mpLastFocusWindow->IsEnabled() && mpWindowImpl->mpLastFocusWindow->IsInputEnabled() && @@ -257,7 +257,7 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags ) vcl::Window *pFrame = pSVData->maWinData.mpFirstFrame; while( pFrame ) { - if( pFrame != mpWindowImpl->mpFrameWindow && pFrame->mpWindowImpl->mpFrameData->mnFocusId ) + if( pFrame != mpWindowImpl->mpFrameWindow.get() && pFrame->mpWindowImpl->mpFrameData->mnFocusId ) { bAsyncFocusWaiting = true; break; @@ -283,11 +283,13 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags ) pParent = pParent->mpWindowImpl->mpParent; } - if ( ( pSVData->maWinData.mpFocusWin != this && ! mpWindowImpl->mbInDtor ) || ( bAsyncFocusWaiting && !bHasFocus && !bMustNotGrabFocus ) ) + if ( ( pSVData->maWinData.mpFocusWin.get() != this && + mpWindowImpl && !mpWindowImpl->mbInDispose ) || + ( bAsyncFocusWaiting && !bHasFocus && !bMustNotGrabFocus ) ) { // EndExtTextInput if it is not the same window if ( pSVData->maWinData.mpExtTextInputWin && - (pSVData->maWinData.mpExtTextInputWin != this) ) + (pSVData->maWinData.mpExtTextInputWin.get() != this) ) pSVData->maWinData.mpExtTextInputWin->EndExtTextInput( EXTTEXTINPUT_END_COMPLETE ); // mark this windows as the last FocusWindow @@ -358,7 +360,7 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags ) pOldFocusWindow->ImplCallDeactivateListeners( this ); } - if ( pSVData->maWinData.mpFocusWin == this ) + if ( pSVData->maWinData.mpFocusWin.get() == this ) { if ( mpWindowImpl->mpSysObj ) { @@ -367,7 +369,7 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags ) mpWindowImpl->mpSysObj->GrabFocus(); } - if ( pSVData->maWinData.mpFocusWin == this ) + if ( pSVData->maWinData.mpFocusWin.get() == this ) { if ( mpWindowImpl->mpCursor ) mpWindowImpl->mpCursor->ImplShow(); @@ -450,13 +452,13 @@ void Window::CaptureMouse() ImplSVData* pSVData = ImplGetSVData(); // possibly stop tracking - if ( pSVData->maWinData.mpTrackWin != this ) + if ( pSVData->maWinData.mpTrackWin.get() != this ) { if ( pSVData->maWinData.mpTrackWin ) pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL ); } - if ( pSVData->maWinData.mpCaptureWin != this ) + if ( pSVData->maWinData.mpCaptureWin.get() != this ) { pSVData->maWinData.mpCaptureWin = this; mpWindowImpl->mpFrame->CaptureMouse( true ); @@ -468,10 +470,10 @@ void Window::ReleaseMouse() ImplSVData* pSVData = ImplGetSVData(); - DBG_ASSERTWARNING( pSVData->maWinData.mpCaptureWin == this, + DBG_ASSERTWARNING( pSVData->maWinData.mpCaptureWin.get() == this, "Window::ReleaseMouse(): window doesn't have the mouse capture" ); - if ( pSVData->maWinData.mpCaptureWin == this ) + if ( pSVData->maWinData.mpCaptureWin.get() == this ) { pSVData->maWinData.mpCaptureWin = NULL; mpWindowImpl->mpFrame->CaptureMouse( false ); @@ -657,6 +659,8 @@ void Window::ImplStartDnd() Reference< css::datatransfer::dnd::XDropTarget > Window::GetDropTarget() { + if( !mpWindowImpl ) + return Reference< css::datatransfer::dnd::XDropTarget >(); if( ! mpWindowImpl->mxDNDListenerContainer.is() ) { diff --git a/vcl/source/window/msgbox.cxx b/vcl/source/window/msgbox.cxx index 2c68157e759c..9f2fd75973c7 100644 --- a/vcl/source/window/msgbox.cxx +++ b/vcl/source/window/msgbox.cxx @@ -151,9 +151,15 @@ MessBox::MessBox( vcl::Window* pParent, WinBits nStyle, MessBox::~MessBox() { - delete mpVCLMultiLineEdit; - delete mpFixedImage; - delete mpCheckBox; + disposeOnce(); +} + +void MessBox::dispose() +{ + mpVCLMultiLineEdit.disposeAndClear(); + mpFixedImage.disposeAndClear(); + mpCheckBox.disposeAndClear(); + ButtonDialog::dispose(); } void MessBox::ImplPosControls() @@ -190,17 +196,12 @@ void MessBox::ImplPosControls() WinBits nWinStyle = WB_LEFT | WB_NOLABEL; sal_uInt16 nTextStyle = TEXT_DRAW_MULTILINE | TEXT_DRAW_TOP | TEXT_DRAW_LEFT; - delete mpVCLMultiLineEdit; - if ( mpFixedImage ) - { - delete mpFixedImage; - mpFixedImage = NULL; - } + mpVCLMultiLineEdit.disposeAndClear(); + mpFixedImage.disposeAndClear(); if ( mpCheckBox ) { mbCheck = mpCheckBox->IsChecked(); - delete mpCheckBox; - mpCheckBox = NULL; + mpCheckBox.disposeAndClear(); } // Clean up message text with tabs @@ -230,7 +231,7 @@ void MessBox::ImplPosControls() aImageSize.Width() += 4; aImageSize.Height() += 4; aTextPos.X() += aImageSize.Width()+IMPL_SEP_MSGBOX_IMAGE; - mpFixedImage = new FixedImage( this ); + mpFixedImage = VclPtr<FixedImage>::Create( this ); mpFixedImage->SetPosSizePixel( Point( IMPL_DIALOG_OFFSET-2+IMPL_MSGBOX_OFFSET_EXTRA_X, IMPL_DIALOG_OFFSET-2+IMPL_MSGBOX_OFFSET_EXTRA_Y ), aImageSize ); @@ -320,7 +321,7 @@ void MessBox::ImplPosControls() } } - mpCheckBox = new CheckBox( this ); + mpCheckBox = VclPtr<CheckBox>::Create( this ); mpCheckBox->Check( mbCheck ); mpCheckBox->SetText( aMnemonicString ); mpCheckBox->SetStyle( mpCheckBox->GetStyle() | WB_WORDBREAK ); @@ -342,7 +343,7 @@ void MessBox::ImplPosControls() mpCheckBox->Show(); } - mpVCLMultiLineEdit = new VclMultiLineEdit( this, nWinStyle ); + mpVCLMultiLineEdit = VclPtr<VclMultiLineEdit>::Create( this, nWinStyle ); mpVCLMultiLineEdit->SetText( aMessText ); mpVCLMultiLineEdit->SetPosSizePixel( aTextPos, aMEditSize ); mpVCLMultiLineEdit->Show(); diff --git a/vcl/source/window/openglwin.cxx b/vcl/source/window/openglwin.cxx index 741940f45e2d..21af6cc53598 100644 --- a/vcl/source/window/openglwin.cxx +++ b/vcl/source/window/openglwin.cxx @@ -16,22 +16,22 @@ class OpenGLWindowImpl { public: OpenGLWindowImpl(vcl::Window* pWindow); + ~OpenGLWindowImpl() { mxChildWindow.disposeAndClear(); } OpenGLContext& getContext() { return maContext;} private: OpenGLContext maContext; - std::unique_ptr<SystemChildWindow> mxChildWindow; + VclPtr<SystemChildWindow> mxChildWindow; }; OpenGLWindowImpl::OpenGLWindowImpl(vcl::Window* pWindow) { SystemWindowData aData = OpenGLContext::generateWinData(pWindow, false); - mxChildWindow.reset(new SystemChildWindow(pWindow, 0, &aData)); + mxChildWindow.reset(VclPtr<SystemChildWindow>::Create(pWindow, 0, &aData)); mxChildWindow->Show(); maContext.init(mxChildWindow.get()); pWindow->SetMouseTransparent(false); } - OpenGLWindow::OpenGLWindow(vcl::Window* pParent): Window(pParent, 0), mxImpl(new OpenGLWindowImpl(this)), @@ -41,8 +41,16 @@ OpenGLWindow::OpenGLWindow(vcl::Window* pParent): OpenGLWindow::~OpenGLWindow() { + disposeOnce(); +} + +void OpenGLWindow::dispose() +{ if(mpRenderer) mpRenderer->contextDestroyed(); + mpRenderer = NULL; + mxImpl.reset(); + Window::dispose(); } OpenGLContext& OpenGLWindow::getContext() diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx index 1384dfe3d8f2..1dd9b3a50e98 100644 --- a/vcl/source/window/paint.cxx +++ b/vcl/source/window/paint.cxx @@ -43,7 +43,7 @@ class PaintHelper { private: - vcl::Window* m_pWindow; + VclPtr<vcl::Window> m_pWindow; vcl::Region* m_pChildRegion; Rectangle m_aSelectionRect; Rectangle m_aPaintRect; @@ -1094,7 +1094,7 @@ void Window::ImplPaintToDevice( OutputDevice* i_pTargetOutDev, const Point& i_rP mpWindowImpl->mbReallyVisible = bRVisible; // paint metafile to VDev - VirtualDevice* pMaskedDevice = new VirtualDevice( *i_pTargetOutDev, 0, 0 ); + VclPtrInstance<VirtualDevice> pMaskedDevice( *i_pTargetOutDev, 0, 0 ); pMaskedDevice->SetOutputSizePixel( GetOutputSizePixel() ); pMaskedDevice->EnableRTL( IsRTLEnabled() ); aMtf.WindStart(); @@ -1102,7 +1102,7 @@ void Window::ImplPaintToDevice( OutputDevice* i_pTargetOutDev, const Point& i_rP BitmapEx aBmpEx( pMaskedDevice->GetBitmapEx( Point( 0, 0 ), pMaskedDevice->GetOutputSizePixel() ) ); i_pTargetOutDev->DrawBitmapEx( i_rPos, aBmpEx ); // get rid of virtual device now so they don't pile up during recursive calls - delete pMaskedDevice, pMaskedDevice = NULL; + pMaskedDevice.disposeAndClear(); for( vcl::Window* pChild = mpWindowImpl->mpFirstChild; pChild; pChild = pChild->mpWindowImpl->mpNext ) { diff --git a/vcl/source/window/popupmenuwindow.cxx b/vcl/source/window/popupmenuwindow.cxx index 1a33ff9037ca..2d9c52699054 100644 --- a/vcl/source/window/popupmenuwindow.cxx +++ b/vcl/source/window/popupmenuwindow.cxx @@ -46,7 +46,13 @@ PopupMenuFloatingWindow::PopupMenuFloatingWindow( vcl::Window* pParent, WinBits PopupMenuFloatingWindow::~PopupMenuFloatingWindow() { + disposeOnce(); +} + +void PopupMenuFloatingWindow::dispose() +{ delete mpImplData; + FloatingWindow::dispose(); } sal_uInt16 PopupMenuFloatingWindow::GetMenuStackLevel() const diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx index c4ea5c7aac3c..f24755d92904 100644 --- a/vcl/source/window/printdlg.cxx +++ b/vcl/source/window/printdlg.cxx @@ -64,24 +64,33 @@ extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeShowNupOrderWindow(vcl PrintDialog::PrintPreviewWindow::PrintPreviewWindow( vcl::Window* i_pParent ) : Window( i_pParent, 0 ) , maOrigSize( 10, 10 ) - , maPageVDev( *this ) + , maPageVDev( VclPtr<VirtualDevice>::Create(*this) ) , maToolTipString(VclResId( SV_PRINT_PRINTPREVIEW_TXT).toString()) , mbGreyscale( false ) - , maHorzDim( this, WB_HORZ | WB_CENTER ) - , maVertDim( this, WB_VERT | WB_VCENTER ) + , maHorzDim(VclPtr<FixedLine>::Create(this, WB_HORZ | WB_CENTER)) + , maVertDim(VclPtr<FixedLine>::Create(this, WB_VERT | WB_VCENTER)) { SetPaintTransparent( true ); SetBackground(); - maPageVDev.SetBackground( Color( COL_WHITE ) ); - maHorzDim.Show(); - maVertDim.Show(); + maPageVDev->SetBackground( Color( COL_WHITE ) ); + maHorzDim->Show(); + maVertDim->Show(); - maHorzDim.SetText( OUString( "2.0in" ) ); - maVertDim.SetText( OUString( "2.0in" ) ); + maHorzDim->SetText( OUString( "2.0in" ) ); + maVertDim->SetText( OUString( "2.0in" ) ); } PrintDialog::PrintPreviewWindow::~PrintPreviewWindow() { + disposeOnce(); +} + +void PrintDialog::PrintPreviewWindow::dispose() +{ + maHorzDim.disposeAndClear(); + maVertDim.disposeAndClear(); + maPageVDev.disposeAndClear(); + Window::dispose(); } const sal_Int32 PrintDialog::PrintPreviewWindow::PREVIEW_BITMAP_WIDTH = 1600; @@ -91,7 +100,7 @@ void PrintDialog::PrintPreviewWindow::DataChanged( const DataChangedEvent& i_rDC // react on settings changed if( i_rDCEvt.GetType() == DataChangedEventType::SETTINGS ) { - maPageVDev.SetBackground( Color( COL_WHITE ) ); + maPageVDev->SetBackground( Color( COL_WHITE ) ); } Window::DataChanged( i_rDCEvt ); } @@ -99,7 +108,7 @@ void PrintDialog::PrintPreviewWindow::DataChanged( const DataChangedEvent& i_rDC void PrintDialog::PrintPreviewWindow::Resize() { Size aNewSize( GetSizePixel() ); - long nTextHeight = maHorzDim.GetTextHeight(); + long nTextHeight = maHorzDim->GetTextHeight(); // leave small space for decoration aNewSize.Width() -= nTextHeight + 2; aNewSize.Height() -= nTextHeight + 2; @@ -140,21 +149,21 @@ void PrintDialog::PrintPreviewWindow::Resize() aScaledSize.Width() = PREVIEW_BITMAP_WIDTH; aScaledSize.Height() = PREVIEW_BITMAP_WIDTH * aAspectRatio; - maPageVDev.SetOutputSizePixel( aScaledSize, false ); + maPageVDev->SetOutputSizePixel( aScaledSize, false ); // position dimension lines Point aRef( nTextHeight + (aNewSize.Width() - maPreviewSize.Width())/2, nTextHeight + (aNewSize.Height() - maPreviewSize.Height())/2 ); - maHorzDim.SetPosSizePixel( Point( aRef.X(), aRef.Y() - nTextHeight ), + maHorzDim->SetPosSizePixel( Point( aRef.X(), aRef.Y() - nTextHeight ), Size( maPreviewSize.Width(), nTextHeight ) ); - maVertDim.SetPosSizePixel( Point( aRef.X() - nTextHeight, aRef.Y() ), + maVertDim->SetPosSizePixel( Point( aRef.X() - nTextHeight, aRef.Y() ), Size( nTextHeight, maPreviewSize.Height() ) ); } void PrintDialog::PrintPreviewWindow::Paint( const Rectangle& ) { - long nTextHeight = maHorzDim.GetTextHeight(); + long nTextHeight = maHorzDim->GetTextHeight(); Size aSize( GetSizePixel() ); Point aOffset( (aSize.Width() - maPreviewSize.Width() + nTextHeight) / 2 , (aSize.Height() - maPreviewSize.Height() + nTextHeight) / 2 ); @@ -218,8 +227,8 @@ void PrintDialog::PrintPreviewWindow::setPreview( const GDIMetaFile& i_rNewPrevi maOrigSize = i_rOrigSize; maReplacementString = i_rReplacement; mbGreyscale = i_bGreyscale; - maPageVDev.SetReferenceDevice( i_nDPIX, i_nDPIY ); - maPageVDev.EnableOutput( true ); + maPageVDev->SetReferenceDevice( i_nDPIX, i_nDPIY ); + maPageVDev->EnableOutput( true ); // use correct measurements const LocaleDataWrapper& rLocWrap( GetSettings().GetLocaleDataWrapper() ); @@ -241,13 +250,13 @@ void PrintDialog::PrintPreviewWindow::setPreview( const GDIMetaFile& i_rNewPrevi aBuf.append( i_rPaperName ); aBuf.append( ')' ); } - maHorzDim.SetText( aBuf.makeStringAndClear() ); + maHorzDim->SetText( aBuf.makeStringAndClear() ); aNumText = rLocWrap.getNum( aLogicPaperSize.Height(), nDigits ); aBuf.append( aNumText ) .append( sal_Unicode( ' ' ) ); aBuf.appendAscii( eUnit == MAP_MM ? "mm" : "in" ); - maVertDim.SetText( aBuf.makeStringAndClear() ); + maVertDim->SetText( aBuf.makeStringAndClear() ); Resize(); preparePreviewBitmap(); @@ -258,8 +267,8 @@ void PrintDialog::PrintPreviewWindow::preparePreviewBitmap() { GDIMetaFile aMtf( maMtf ); - Size aVDevSize( maPageVDev.GetOutputSizePixel() ); - const Size aLogicSize( maPageVDev.PixelToLogic( aVDevSize, MapMode( MAP_100TH_MM ) ) ); + Size aVDevSize( maPageVDev->GetOutputSizePixel() ); + const Size aLogicSize( maPageVDev->PixelToLogic( aVDevSize, MapMode( MAP_100TH_MM ) ) ); Size aOrigSize( maOrigSize ); if( aOrigSize.Width() < 1 ) aOrigSize.Width() = aLogicSize.Width(); @@ -267,31 +276,31 @@ void PrintDialog::PrintPreviewWindow::preparePreviewBitmap() aOrigSize.Height() = aLogicSize.Height(); double fScale = double(aLogicSize.Width())/double(aOrigSize.Width()); - maPageVDev.Erase(); - maPageVDev.Push(); - maPageVDev.SetMapMode( MAP_100TH_MM ); - sal_uLong nOldDrawMode = maPageVDev.GetDrawMode(); + maPageVDev->Erase(); + maPageVDev->Push(); + maPageVDev->SetMapMode( MAP_100TH_MM ); + sal_uLong nOldDrawMode = maPageVDev->GetDrawMode(); if( mbGreyscale ) - maPageVDev.SetDrawMode( maPageVDev.GetDrawMode() | + maPageVDev->SetDrawMode( maPageVDev->GetDrawMode() | ( DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL | DRAWMODE_GRAYTEXT | DRAWMODE_GRAYBITMAP | DRAWMODE_GRAYGRADIENT ) ); aMtf.WindStart(); aMtf.Scale( fScale, fScale ); aMtf.WindStart(); - const sal_uInt16 nOriginalAA(maPageVDev.GetAntialiasing()); - maPageVDev.SetAntialiasing(nOriginalAA | ANTIALIASING_ENABLE_B2DDRAW); - aMtf.Play( &maPageVDev, Point( 0, 0 ), aLogicSize ); - maPageVDev.SetAntialiasing(nOriginalAA); + const sal_uInt16 nOriginalAA(maPageVDev->GetAntialiasing()); + maPageVDev->SetAntialiasing(nOriginalAA | ANTIALIASING_ENABLE_B2DDRAW); + aMtf.Play( maPageVDev.get(), Point( 0, 0 ), aLogicSize ); + maPageVDev->SetAntialiasing(nOriginalAA); - maPageVDev.Pop(); + maPageVDev->Pop(); SetMapMode( MAP_PIXEL ); - maPageVDev.SetMapMode( MAP_PIXEL ); + maPageVDev->SetMapMode( MAP_PIXEL ); - maPreviewBitmap = Bitmap(maPageVDev.GetBitmap(Point(0, 0), aVDevSize)); + maPreviewBitmap = Bitmap(maPageVDev->GetBitmap(Point(0, 0), aVDevSize)); - maPageVDev.SetDrawMode( nOldDrawMode ); + maPageVDev->SetDrawMode( nOldDrawMode ); } PrintDialog::ShowNupOrderWindow::ShowNupOrderWindow( vcl::Window* i_pParent ) @@ -303,10 +312,6 @@ PrintDialog::ShowNupOrderWindow::ShowNupOrderWindow( vcl::Window* i_pParent ) ImplInitSettings(); } -PrintDialog::ShowNupOrderWindow::~ShowNupOrderWindow() -{ -} - void PrintDialog::ShowNupOrderWindow::ImplInitSettings() { SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFieldColor() ) ); @@ -619,13 +624,13 @@ PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterC if( maJobPage.mpPrinters->GetEntryPos( aValue ) != LISTBOX_ENTRY_NOTFOUND ) { maJobPage.mpPrinters->SelectEntry( aValue ); - maPController->setPrinter(std::make_shared<Printer>(aValue)); + maPController->setPrinter( VclPtrInstance<Printer>( aValue ) ); } else { // fall back to default printer maJobPage.mpPrinters->SelectEntry( Printer::GetDefaultPrinterName() ); - maPController->setPrinter(std::make_shared<Printer>(Printer::GetDefaultPrinterName())); + maPController->setPrinter( VclPtrInstance<Printer>( Printer::GetDefaultPrinterName() ) ); } } // not printing to file @@ -712,7 +717,22 @@ PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterC PrintDialog::~PrintDialog() { + disposeOnce(); +} + +void PrintDialog::dispose() +{ delete mpCustomOptionsUIBuilder; + mpTabCtrl.clear(); + mpPreviewWindow.clear(); + mpPageEdit.clear(); + mpNumPagesText.clear(); + mpBackwardBtn.clear(); + mpForwardBtn.clear(); + mpOKButton.clear(); + mpCancelButton.clear(); + mpHelpButton.clear(); + ModalDialog::dispose(); } void PrintDialog::readFromSettings() @@ -1207,7 +1227,7 @@ void PrintDialog::checkControlDependencies() void PrintDialog::checkOptionalControlDependencies() { - for( std::map< vcl::Window*, OUString >::iterator it = maControlToPropertyMap.begin(); + for( auto it = maControlToPropertyMap.begin(); it != maControlToPropertyMap.end(); ++it ) { bool bShouldbeEnabled = maPController->isUIOptionEnabled( it->second ); @@ -1229,9 +1249,9 @@ void PrintDialog::checkOptionalControlDependencies() } } - if( bShouldbeEnabled && dynamic_cast<RadioButton*>(it->first) ) + if( bShouldbeEnabled && dynamic_cast<RadioButton*>(it->first.get()) ) { - std::map< vcl::Window*, sal_Int32 >::const_iterator r_it = maControlToNumValMap.find( it->first ); + auto r_it = maControlToNumValMap.find( it->first ); if( r_it != maControlToNumValMap.end() ) { bShouldbeEnabled = maPController->isUIChoiceEnabled( it->second, r_it->second ); @@ -1308,7 +1328,7 @@ void PrintDialog::preparePreview( bool i_bNewPage, bool i_bMayUseCache ) { const MapMode aMapMode( MAP_100TH_MM ); GDIMetaFile aMtf; - std::shared_ptr<Printer> aPrt(maPController->getPrinter()); + VclPtr<Printer> aPrt( maPController->getPrinter() ); if( nPages > 0 ) { PrinterController::PageSize aPageSize = @@ -1501,7 +1521,7 @@ IMPL_LINK( PrintDialog, SelectHdl, ListBox*, pBox ) { OUString aNewPrinter( pBox->GetSelectEntry() ); // set new printer - maPController->setPrinter(std::make_shared<Printer>(aNewPrinter)); + maPController->setPrinter( VclPtrInstance<Printer>( aNewPrinter ) ); maPController->resetPrinterOptions( maOptionsPage.mpToFileBox->IsChecked() ); // update text fields updatePrinterText(); @@ -1650,7 +1670,7 @@ IMPL_LINK_NOARG(PrintDialog, UIOptionsChanged) PropertyValue* PrintDialog::getValueForWindow( vcl::Window* i_pWindow ) const { PropertyValue* pVal = NULL; - std::map< vcl::Window*, OUString >::const_iterator it = maControlToPropertyMap.find( i_pWindow ); + auto it = maControlToPropertyMap.find( i_pWindow ); if( it != maControlToPropertyMap.end() ) { pVal = maPController->getValue( it->second ); @@ -1666,10 +1686,10 @@ PropertyValue* PrintDialog::getValueForWindow( vcl::Window* i_pWindow ) const void PrintDialog::updateWindowFromProperty( const OUString& i_rProperty ) { beans::PropertyValue* pValue = maPController->getValue( i_rProperty ); - std::map< OUString, std::vector< vcl::Window* > >::const_iterator it = maPropertyToWindowMap.find( i_rProperty ); + auto it = maPropertyToWindowMap.find( i_rProperty ); if( pValue && it != maPropertyToWindowMap.end() ) { - const std::vector< vcl::Window* >& rWindows( it->second ); + const std::vector< VclPtr<vcl::Window> >& rWindows( it->second ); if( ! rWindows.empty() ) { bool bVal = false; @@ -1677,7 +1697,7 @@ void PrintDialog::updateWindowFromProperty( const OUString& i_rProperty ) if( pValue->Value >>= bVal ) { // we should have a CheckBox for this one - CheckBox* pBox = dynamic_cast< CheckBox* >( rWindows.front() ); + CheckBox* pBox = dynamic_cast< CheckBox* >( rWindows.front().get() ); if( pBox ) { pBox->Check( bVal ); @@ -1698,14 +1718,14 @@ void PrintDialog::updateWindowFromProperty( const OUString& i_rProperty ) else if( pValue->Value >>= nVal ) { // this could be a ListBox or a RadioButtonGroup - ListBox* pList = dynamic_cast< ListBox* >( rWindows.front() ); + ListBox* pList = dynamic_cast< ListBox* >( rWindows.front().get() ); if( pList ) { pList->SelectEntryPos( static_cast< sal_uInt16 >(nVal) ); } else if( nVal >= 0 && nVal < sal_Int32(rWindows.size() ) ) { - RadioButton* pBtn = dynamic_cast< RadioButton* >( rWindows[nVal] ); + RadioButton* pBtn = dynamic_cast< RadioButton* >( rWindows[nVal].get() ); DBG_ASSERT( pBtn, "unexpected control for property" ); if( pBtn ) pBtn->Check(); @@ -1717,7 +1737,7 @@ void PrintDialog::updateWindowFromProperty( const OUString& i_rProperty ) void PrintDialog::makeEnabled( vcl::Window* i_pWindow ) { - std::map< vcl::Window*, OUString >::const_iterator it = maControlToPropertyMap.find( i_pWindow ); + auto it = maControlToPropertyMap.find( i_pWindow ); if( it != maControlToPropertyMap.end() ) { OUString aDependency( maPController->makeEnabled( it->second ) ); @@ -1752,7 +1772,7 @@ IMPL_LINK( PrintDialog, UIOption_RadioHdl, RadioButton*, i_pBtn ) if( i_pBtn->IsChecked() ) { PropertyValue* pVal = getValueForWindow( i_pBtn ); - std::map< vcl::Window*, sal_Int32 >::const_iterator it = maControlToNumValMap.find( i_pBtn ); + auto it = maControlToNumValMap.find( i_pBtn ); if( pVal && it != maControlToNumValMap.end() ) { makeEnabled( i_pBtn ); @@ -1895,6 +1915,19 @@ PrintProgressDialog::PrintProgressDialog(vcl::Window* i_pParent, int i_nMax) } +PrintProgressDialog::~PrintProgressDialog() +{ + disposeOnce(); +} + +void PrintProgressDialog::dispose() +{ + mpText.clear(); + mpProgress.clear(); + mpButton.clear(); + ModelessDialog::dispose(); +} + IMPL_LINK( PrintProgressDialog, ClickHdl, Button*, pButton ) { if( pButton == mpButton ) diff --git a/vcl/source/window/scrwnd.cxx b/vcl/source/window/scrwnd.cxx index 7532ccf9cdc4..a40ef10dc592 100644 --- a/vcl/source/window/scrwnd.cxx +++ b/vcl/source/window/scrwnd.cxx @@ -84,8 +84,16 @@ ImplWheelWindow::ImplWheelWindow( vcl::Window* pParent ) : ImplWheelWindow::~ImplWheelWindow() { + disposeOnce(); +} + +void ImplWheelWindow::dispose() +{ ImplStop(); delete mpTimer; + mpTimer = NULL; + + FloatingWindow::dispose(); } void ImplWheelWindow::ImplStop() diff --git a/vcl/source/window/scrwnd.hxx b/vcl/source/window/scrwnd.hxx index ddd08f940cc9..6ec18c4e2b73 100644 --- a/vcl/source/window/scrwnd.hxx +++ b/vcl/source/window/scrwnd.hxx @@ -70,7 +70,8 @@ protected: public: ImplWheelWindow( vcl::Window* pParent ); - virtual ~ImplWheelWindow(); + virtual ~ImplWheelWindow(); + virtual void dispose() SAL_OVERRIDE; void ImplStop(); void ImplSetWheelMode( sal_uLong nWheelMode ); diff --git a/vcl/source/window/settings.cxx b/vcl/source/window/settings.cxx index 3e60bbd9bab0..63586e3ee70e 100644 --- a/vcl/source/window/settings.cxx +++ b/vcl/source/window/settings.cxx @@ -51,8 +51,8 @@ void Window::SetSettings( const AllSettings& rSettings, bool bChild ) { mpWindowImpl->mpBorderWindow->SetSettings( rSettings, false ); if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->SetSettings( rSettings, true ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow ) + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->SetSettings( rSettings, true ); } AllSettings aOldSettings(*mxSettings); @@ -86,8 +86,8 @@ void Window::UpdateSettings( const AllSettings& rSettings, bool bChild ) { mpWindowImpl->mpBorderWindow->UpdateSettings( rSettings, false ); if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->UpdateSettings( rSettings, true ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow ) + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->UpdateSettings( rSettings, true ); } AllSettings aOldSettings(*mxSettings); diff --git a/vcl/source/window/split.cxx b/vcl/source/window/split.cxx index 947dc986cf20..70482c02a039 100644 --- a/vcl/source/window/split.cxx +++ b/vcl/source/window/split.cxx @@ -151,8 +151,19 @@ Splitter::Splitter( vcl::Window* pParent, WinBits nStyle ) : Splitter::~Splitter() { - TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList(); - pTList->RemoveWindow( this ); + disposeOnce(); +} + +void Splitter::dispose() +{ + SystemWindow *pSysWin = GetSystemWindow(); + if(pSysWin) + { + TaskPaneList *pTList = pSysWin->GetTaskPaneList(); + pTList->RemoveWindow(this); + } + mpRefWin.clear(); + Window::dispose(); } void Splitter::SetHorizontal(bool bNew) diff --git a/vcl/source/window/splitwin.cxx b/vcl/source/window/splitwin.cxx index c18e1d06adca..293479151943 100644 --- a/vcl/source/window/splitwin.cxx +++ b/vcl/source/window/splitwin.cxx @@ -53,9 +53,9 @@ struct ImplSplitItem long mnOldWidth; long mnOldHeight; ImplSplitSet* mpSet; - vcl::Window* mpWindow; - vcl::Window* mpOrgParent; - sal_uInt16 mnId; + VclPtr<vcl::Window> mpWindow; + VclPtr<vcl::Window> mpOrgParent; + sal_uInt16 mnId; SplitWindowItemBits mnBits; bool mbFixed; bool mbSubSize; @@ -1347,9 +1347,16 @@ SplitWindow::SplitWindow( vcl::Window* pParent, WinBits nStyle ) : SplitWindow::~SplitWindow() { + disposeOnce(); +} + +void SplitWindow::dispose() +{ // delete Sets - ImplDeleteSet( mpMainSet ); + if (mpMainSet) + ImplDeleteSet( mpMainSet ); mpMainSet = NULL; //NULL for base-class callbacks during dtoring + DockingWindow::dispose(); } void SplitWindow::ImplSetWindowSize( long nDelta ) diff --git a/vcl/source/window/stacking.cxx b/vcl/source/window/stacking.cxx index f20c0ece86dd..ccf60ca60f5f 100644 --- a/vcl/source/window/stacking.cxx +++ b/vcl/source/window/stacking.cxx @@ -46,8 +46,8 @@ using ::com::sun::star::awt::XTopWindow; struct ImplCalcToTopData { - ImplCalcToTopData* mpNext; - vcl::Window* mpWindow; + ImplCalcToTopData* mpNext; + VclPtr<vcl::Window> mpWindow; vcl::Region* mpInvalidateRegion; }; @@ -117,12 +117,12 @@ void Window::ImplRemoveWindow( bool bRemoveFrameData ) { if ( ImplIsOverlapWindow() ) { - if ( mpWindowImpl->mpFrameData->mpFirstOverlap == this ) + if ( mpWindowImpl->mpFrameData->mpFirstOverlap.get() == this ) mpWindowImpl->mpFrameData->mpFirstOverlap = mpWindowImpl->mpNextOverlap; else { vcl::Window* pTempWin = mpWindowImpl->mpFrameData->mpFirstOverlap; - while ( pTempWin->mpWindowImpl->mpNextOverlap != this ) + while ( pTempWin->mpWindowImpl->mpNextOverlap.get() != this ) pTempWin = pTempWin->mpWindowImpl->mpNextOverlap; pTempWin->mpWindowImpl->mpNextOverlap = mpWindowImpl->mpNextOverlap; } @@ -194,7 +194,7 @@ void Window::reorderWithinParent(sal_uInt16 nNewPosition) void Window::ImplToBottomChild() { - if ( !ImplIsOverlapWindow() && !mpWindowImpl->mbReallyVisible && (mpWindowImpl->mpParent->mpWindowImpl->mpLastChild != this) ) + if ( !ImplIsOverlapWindow() && !mpWindowImpl->mbReallyVisible && (mpWindowImpl->mpParent->mpWindowImpl->mpLastChild.get() != this) ) { // put the window to the end of the list if ( mpWindowImpl->mpPrev ) @@ -265,7 +265,7 @@ void Window::ImplToTop( sal_uInt16 nFlags ) } else { - if ( mpWindowImpl->mpOverlapWindow->mpWindowImpl->mpFirstOverlap != this ) + if ( mpWindowImpl->mpOverlapWindow->mpWindowImpl->mpFirstOverlap.get() != this ) { // remove window from the list mpWindowImpl->mpPrev->mpWindowImpl->mpNext = mpWindowImpl->mpNext; @@ -477,7 +477,7 @@ void Window::SetZOrder( vcl::Window* pRefWindow, sal_uInt16 nFlags ) DBG_ASSERT( pRefWindow->mpWindowImpl->mpParent == mpWindowImpl->mpParent, "Window::SetZOrder() - pRefWindow has other parent" ); if ( nFlags & WINDOW_ZORDER_BEFOR ) { - if ( pRefWindow->mpWindowImpl->mpPrev == this ) + if ( pRefWindow->mpWindowImpl->mpPrev.get() == this ) return; if ( ImplIsOverlapWindow() ) @@ -515,7 +515,7 @@ void Window::SetZOrder( vcl::Window* pRefWindow, sal_uInt16 nFlags ) } else if ( nFlags & WINDOW_ZORDER_BEHIND ) { - if ( pRefWindow->mpWindowImpl->mpNext == this ) + if ( pRefWindow->mpWindowImpl->mpNext.get() == this ) return; if ( ImplIsOverlapWindow() ) @@ -632,7 +632,7 @@ void Window::EnableAlwaysOnTop( bool bEnable ) bool Window::IsTopWindow() const { - if ( mpWindowImpl->mbInDtor ) + if ( !mpWindowImpl || mpWindowImpl->mbInDispose ) return false; // topwindows must be frames or they must have a borderwindow which is a frame @@ -879,9 +879,8 @@ void Window::SetParent( vcl::Window* pNewParent ) // remove ownerdraw decorated windows from list in the top-most frame window if( (GetStyle() & WB_OWNERDRAWDECORATION) && mpWindowImpl->mbFrame ) { - ::std::vector< vcl::Window* >& rList = ImplGetOwnerDrawList(); - ::std::vector< vcl::Window* >::iterator p; - p = ::std::find( rList.begin(), rList.end(), this ); + ::std::vector< VclPtr<vcl::Window> >& rList = ImplGetOwnerDrawList(); + auto p = ::std::find( rList.begin(), rList.end(), VclPtr<vcl::Window>(this) ); if( p != rList.end() ) rList.erase( p ); } @@ -895,7 +894,7 @@ void Window::SetParent( vcl::Window* pNewParent ) return; } - if ( mpWindowImpl->mpParent == pNewParent ) + if ( mpWindowImpl->mpParent.get() == pNewParent ) return; if ( mpWindowImpl->mbFrame ) @@ -912,7 +911,7 @@ void Window::SetParent( vcl::Window* pNewParent ) else { pNewOverlapWindow = pNewParent->ImplGetFirstOverlapWindow(); - if ( mpWindowImpl->mpOverlapWindow != pNewOverlapWindow ) + if ( mpWindowImpl->mpOverlapWindow.get() != pNewOverlapWindow ) pOldOverlapWindow = mpWindowImpl->mpOverlapWindow; else pOldOverlapWindow = NULL; @@ -1023,6 +1022,8 @@ void Window::SetParent( vcl::Window* pNewParent ) sal_uInt16 Window::GetChildCount() const { + if (!mpWindowImpl) + return 0; sal_uInt16 nChildCount = 0; vcl::Window* pChild = mpWindowImpl->mpFirstChild; @@ -1037,6 +1038,8 @@ sal_uInt16 Window::GetChildCount() const vcl::Window* Window::GetChild( sal_uInt16 nChild ) const { + if (!mpWindowImpl) + return NULL; sal_uInt16 nChildCount = 0; vcl::Window* pChild = mpWindowImpl->mpFirstChild; @@ -1053,6 +1056,8 @@ vcl::Window* Window::GetChild( sal_uInt16 nChild ) const vcl::Window* Window::GetWindow( sal_uInt16 nType ) const { + if (!mpWindowImpl) + return 0; switch ( nType ) { @@ -1104,17 +1109,17 @@ vcl::Window* Window::GetWindow( sal_uInt16 nType ) const return const_cast<vcl::Window*>(this); case WINDOW_FIRSTTOPWINDOWCHILD: - return ImplGetWinData()->maTopWindowChildren.empty() ? NULL : *ImplGetWinData()->maTopWindowChildren.begin(); + return ImplGetWinData()->maTopWindowChildren.empty() ? NULL : (*ImplGetWinData()->maTopWindowChildren.begin()).get(); case WINDOW_LASTTOPWINDOWCHILD: - return ImplGetWinData()->maTopWindowChildren.empty() ? NULL : *ImplGetWinData()->maTopWindowChildren.rbegin(); + return ImplGetWinData()->maTopWindowChildren.empty() ? NULL : (*ImplGetWinData()->maTopWindowChildren.rbegin()).get(); case WINDOW_PREVTOPWINDOWSIBLING: { if ( !mpWindowImpl->mpRealParent ) return NULL; - const ::std::list< vcl::Window* >& rTopWindows( mpWindowImpl->mpRealParent->ImplGetWinData()->maTopWindowChildren ); - ::std::list< vcl::Window* >::const_iterator myPos = + const ::std::list< VclPtr<vcl::Window> >& rTopWindows( mpWindowImpl->mpRealParent->ImplGetWinData()->maTopWindowChildren ); + ::std::list< VclPtr<vcl::Window> >::const_iterator myPos = ::std::find( rTopWindows.begin(), rTopWindows.end(), this ); if ( myPos == rTopWindows.end() ) return NULL; @@ -1127,8 +1132,8 @@ vcl::Window* Window::GetWindow( sal_uInt16 nType ) const { if ( !mpWindowImpl->mpRealParent ) return NULL; - const ::std::list< vcl::Window* >& rTopWindows( mpWindowImpl->mpRealParent->ImplGetWinData()->maTopWindowChildren ); - ::std::list< vcl::Window* >::const_iterator myPos = + const ::std::list< VclPtr<vcl::Window> >& rTopWindows( mpWindowImpl->mpRealParent->ImplGetWinData()->maTopWindowChildren ); + ::std::list< VclPtr<vcl::Window> >::const_iterator myPos = ::std::find( rTopWindows.begin(), rTopWindows.end(), this ); if ( ( myPos == rTopWindows.end() ) || ( ++myPos == rTopWindows.end() ) ) return NULL; diff --git a/vcl/source/window/status.cxx b/vcl/source/window/status.cxx index bca642e23612..7f43c18e2b1a 100644 --- a/vcl/source/window/status.cxx +++ b/vcl/source/window/status.cxx @@ -45,7 +45,7 @@ public: ImplData(); ~ImplData(); - VirtualDevice* mpVirDev; + VclPtr<VirtualDevice> mpVirDev; long mnItemBorderWidth; bool mbDrawItemFrames:1; }; @@ -123,7 +123,7 @@ void StatusBar::ImplInit( vcl::Window* pParent, WinBits nStyle ) // remember WinBits mpItemList = new ImplStatusItemList; - mpImplData->mpVirDev = new VirtualDevice( *this ); + mpImplData->mpVirDev = VclPtr<VirtualDevice>::Create( *this ); mnCurItemId = 0; mbFormat = true; mbVisibleItems = true; @@ -151,6 +151,11 @@ StatusBar::StatusBar( vcl::Window* pParent, WinBits nStyle ) : StatusBar::~StatusBar() { + disposeOnce(); +} + +void StatusBar::dispose() +{ // delete all items for ( size_t i = 0, n = mpItemList->size(); i < n; ++i ) { delete (*mpItemList)[ i ]; @@ -158,8 +163,9 @@ StatusBar::~StatusBar() delete mpItemList; // delete VirtualDevice - delete mpImplData->mpVirDev; + mpImplData->mpVirDev.disposeAndClear(); delete mpImplData; + Window::dispose(); } void StatusBar::AdjustItemWidthsForHiDPI(bool bAdjustHiDPI) diff --git a/vcl/source/window/syschild.cxx b/vcl/source/window/syschild.cxx index f82e274d3c12..618170994105 100644 --- a/vcl/source/window/syschild.cxx +++ b/vcl/source/window/syschild.cxx @@ -133,12 +133,18 @@ SystemChildWindow::SystemChildWindow( vcl::Window* pParent, WinBits nStyle, Syst SystemChildWindow::~SystemChildWindow() { + disposeOnce(); +} + +void SystemChildWindow::dispose() +{ Hide(); - if ( mpWindowImpl->mpSysObj ) + if ( mpWindowImpl && mpWindowImpl->mpSysObj ) { ImplGetSVData()->mpDefInst->DestroyObject( mpWindowImpl->mpSysObj ); mpWindowImpl->mpSysObj = NULL; } + Window::dispose(); } const SystemEnvData* SystemChildWindow::GetSystemData() const diff --git a/vcl/source/window/syswin.cxx b/vcl/source/window/syswin.cxx index c5d0522dc0e1..99ac9bcb4fa4 100644 --- a/vcl/source/window/syswin.cxx +++ b/vcl/source/window/syswin.cxx @@ -106,12 +106,21 @@ void SystemWindow::loadUI(vcl::Window* pParent, const OString& rID, const OUStri SystemWindow::~SystemWindow() { + disposeOnce(); +} + +void SystemWindow::dispose() +{ maLayoutIdle.Stop(); delete mpImplData; mpImplData = NULL; + // Hack to make sure code called from base ~Window does not interpret this // as a SystemWindow (which it no longer is by then): mpWindowImpl->mbSysWin = false; + disposeBuilder(); + mpDialogParent.clear(); + Window::dispose(); } bool SystemWindow::Notify( NotifyEvent& rNEvt ) @@ -177,6 +186,8 @@ bool SystemWindow::PreNotify( NotifyEvent& rNEvt ) TaskPaneList* SystemWindow::GetTaskPaneList() { + if( !mpImplData ) + return NULL; if( mpImplData->mpTaskPaneList ) return mpImplData->mpTaskPaneList ; else @@ -306,7 +317,7 @@ void SystemWindow::ShowTitleButton( sal_uInt16 nButton, bool bVisible ) { mbDockBtn = bVisible; if ( mpWindowImpl->mpBorderWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetDockButton( bVisible ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetDockButton( bVisible ); } } else if ( nButton == TITLE_BUTTON_HIDE ) @@ -315,13 +326,13 @@ void SystemWindow::ShowTitleButton( sal_uInt16 nButton, bool bVisible ) { mbHideBtn = bVisible; if ( mpWindowImpl->mpBorderWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetHideButton( bVisible ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetHideButton( bVisible ); } } else if ( nButton == TITLE_BUTTON_MENU ) { if ( mpWindowImpl->mpBorderWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMenuButton( bVisible ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuButton( bVisible ); } else return; @@ -341,7 +352,7 @@ void SystemWindow::SetPin( bool bPin ) { mbPinned = bPin; if ( mpWindowImpl->mpBorderWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetPin( bPin ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetPin( bPin ); } } @@ -356,7 +367,7 @@ void SystemWindow::RollUp() aSize.Width() = GetOutputSizePixel().Width(); mbRollUp = true; if ( mpWindowImpl->mpBorderWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetRollUp( true, aSize ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetRollUp( true, aSize ); else SetOutputSizePixel( aSize ); mbRollFunc = false; @@ -369,7 +380,7 @@ void SystemWindow::RollDown() { mbRollUp = false; if ( mpWindowImpl->mpBorderWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetRollUp( false, maOrgSize ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetRollUp( false, maOrgSize ); else SetOutputSizePixel( maOrgSize ); } @@ -380,7 +391,7 @@ void SystemWindow::SetMinOutputSizePixel( const Size& rSize ) maMinOutSize = rSize; if ( mpWindowImpl->mpBorderWindow ) { - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMinOutputSize( rSize.Width(), rSize.Height() ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMinOutputSize( rSize.Width(), rSize.Height() ); if ( mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame ) mpWindowImpl->mpBorderWindow->mpWindowImpl->mpFrame->SetMinClientSize( rSize.Width(), rSize.Height() ); } @@ -399,7 +410,7 @@ void SystemWindow::SetMaxOutputSizePixel( const Size& rSize ) mpImplData->maMaxOutSize = aSize; if ( mpWindowImpl->mpBorderWindow ) { - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMaxOutputSize( aSize.Width(), aSize.Height() ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMaxOutputSize( aSize.Width(), aSize.Height() ); if ( mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame ) mpWindowImpl->mpBorderWindow->mpWindowImpl->mpFrame->SetMaxClientSize( aSize.Width(), aSize.Height() ); } @@ -905,11 +916,11 @@ void SystemWindow::SetMenuBar(MenuBar* pMenuBar, const css::uno::Reference<css:: if ( pMenuBar ) { DBG_ASSERT( !pMenuBar->pWindow, "SystemWindow::SetMenuBar() - MenuBars can only set in one SystemWindow at time" ); - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMenuBarWindow( pNewWindow = MenuBar::ImplCreate( mpWindowImpl->mpBorderWindow, pOldWindow, pMenuBar, rFrame)); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarWindow( pNewWindow = MenuBar::ImplCreate( mpWindowImpl->mpBorderWindow, pOldWindow, pMenuBar, rFrame)); CallEventListeners( VCLEVENT_WINDOW_MENUBARADDED, (void*) pMenuBar ); } else - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMenuBarWindow( NULL ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarWindow( NULL ); ImplToBottomChild(); if ( pOldMenuBar ) { @@ -952,9 +963,9 @@ void SystemWindow::SetMenuBarMode( sal_uInt16 nMode ) if ( mpWindowImpl->mpBorderWindow && (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) ) { if ( nMode == MENUBAR_MODE_HIDE ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMenuBarMode( true ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarMode( true ); else - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetMenuBarMode( false ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarMode( false ); } } } diff --git a/vcl/source/window/tabdlg.cxx b/vcl/source/window/tabdlg.cxx index f15a2a03be49..e5c9061389e3 100644 --- a/vcl/source/window/tabdlg.cxx +++ b/vcl/source/window/tabdlg.cxx @@ -197,7 +197,7 @@ void TabDialog::ImplPosControls() { Size aDlgSize = GetOutputSizePixel(); if ( !mpFixedLine ) - mpFixedLine = new FixedLine( this ); + mpFixedLine = VclPtr<FixedLine>::Create( this ); mpFixedLine->SetPosSizePixel( Point( 0, nOffY ), Size( aDlgSize.Width(), 2 ) ); mpFixedLine->Show(); @@ -221,7 +221,14 @@ TabDialog::TabDialog( vcl::Window* pParent, const OUString& rID, const OUString& TabDialog::~TabDialog() { - delete mpFixedLine; + disposeOnce(); +} + +void TabDialog::dispose() +{ + mpFixedLine.disposeAndClear(); + mpViewWindow.clear(); + Dialog::dispose(); } void TabDialog::StateChanged( StateChangedType nType ) diff --git a/vcl/source/window/tabpage.cxx b/vcl/source/window/tabpage.cxx index d55496412e2b..964f96043d78 100644 --- a/vcl/source/window/tabpage.cxx +++ b/vcl/source/window/tabpage.cxx @@ -85,6 +85,17 @@ TabPage::TabPage(vcl::Window *pParent, const OString& rID, const OUString& rUIXM set_expand(true); } +TabPage::~TabPage() +{ + disposeOnce(); +} + +void TabPage::dispose() +{ + disposeBuilder(); + vcl::Window::dispose(); +} + void TabPage::StateChanged( StateChangedType nType ) { Window::StateChanged( nType ); diff --git a/vcl/source/window/taskpanelist.cxx b/vcl/source/window/taskpanelist.cxx index 2089172df14d..af4f617205ae 100644 --- a/vcl/source/window/taskpanelist.cxx +++ b/vcl/source/window/taskpanelist.cxx @@ -95,11 +95,8 @@ void TaskPaneList::AddWindow( vcl::Window *pWindow ) { if( pWindow ) { - ::std::vector< vcl::Window* >::iterator insertionPos = mTaskPanes.end(); - for ( ::std::vector< vcl::Window* >::iterator p = mTaskPanes.begin(); - p != mTaskPanes.end(); - ++p - ) + auto insertionPos = mTaskPanes.end(); + for ( auto p = mTaskPanes.begin(); p != mTaskPanes.end(); ++p ) { if ( *p == pWindow ) // avoid duplicates @@ -131,8 +128,7 @@ void TaskPaneList::AddWindow( vcl::Window *pWindow ) void TaskPaneList::RemoveWindow( vcl::Window *pWindow ) { - ::std::vector< vcl::Window* >::iterator p; - p = ::std::find( mTaskPanes.begin(), mTaskPanes.end(), pWindow ); + auto p = ::std::find( mTaskPanes.begin(), mTaskPanes.end(), VclPtr<vcl::Window>(pWindow) ); if( p != mTaskPanes.end() ) { mTaskPanes.erase( p ); @@ -142,8 +138,7 @@ void TaskPaneList::RemoveWindow( vcl::Window *pWindow ) bool TaskPaneList::IsInList( vcl::Window *pWindow ) { - ::std::vector< vcl::Window* >::iterator p; - p = ::std::find( mTaskPanes.begin(), mTaskPanes.end(), pWindow ); + auto p = ::std::find( mTaskPanes.begin(), mTaskPanes.end(), VclPtr<vcl::Window>(pWindow) ); if( p != mTaskPanes.end() ) return true; else @@ -172,7 +167,7 @@ bool TaskPaneList::HandleKeyEvent(const KeyEvent& rKeyEvent) bSplitterOnly = aKeyCode.IsMod1() && aKeyCode.IsShift(); // is the focus in the list ? - ::std::vector< vcl::Window* >::iterator p = mTaskPanes.begin(); + auto p = mTaskPanes.begin(); while( p != mTaskPanes.end() ) { vcl::Window *pWin = *p; @@ -245,7 +240,7 @@ vcl::Window* TaskPaneList::FindNextSplitter( vcl::Window *pWindow, bool bForward else ::std::stable_sort( mTaskPanes.begin(), mTaskPanes.end(), LTRSortBackward() ); - ::std::vector< vcl::Window* >::iterator p = mTaskPanes.begin(); + auto p = mTaskPanes.begin(); while( p != mTaskPanes.end() ) { if( !pWindow || *p == pWindow ) @@ -282,7 +277,7 @@ vcl::Window* TaskPaneList::FindNextFloat( vcl::Window *pWindow, bool bForward ) else ::std::stable_sort( mTaskPanes.begin(), mTaskPanes.end(), LTRSortBackward() ); - ::std::vector< vcl::Window* >::iterator p = mTaskPanes.begin(); + auto p = mTaskPanes.begin(); while( p != mTaskPanes.end() ) { if( !pWindow || *p == pWindow ) diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx index 5b627939ef76..2369a7d25da5 100644 --- a/vcl/source/window/toolbox.cxx +++ b/vcl/source/window/toolbox.cxx @@ -84,13 +84,13 @@ static void ImplDrawButton( ToolBox* pThis, const Rectangle &rRect, sal_uInt16 highlight, bool bChecked, bool bEnabled, bool bIsWindow ); -typedef ::std::vector< ToolBox* > ImplTBList; +typedef ::std::vector< VclPtr<ToolBox> > ImplTBList; class ImplTBDragMgr { private: ImplTBList* mpBoxList; - ToolBox* mpDragBox; + VclPtr<ToolBox> mpDragBox; Point maMouseOff; Rectangle maRect; Rectangle maStartRect; @@ -1570,8 +1570,13 @@ ToolBox::ToolBox( vcl::Window* pParent, const ResId& rResId ) : ToolBox::~ToolBox() { + disposeOnce(); +} + +void ToolBox::dispose() +{ // custom menu event still running? - if( mpData->mnEventId ) + if( mpData && mpData->mnEventId ) Application::RemoveUserEvent( mpData->mnEventId ); // #103005# make sure our activate/deactivate balance is right @@ -1582,9 +1587,12 @@ ToolBox::~ToolBox() // still connected if ( mpFloatWin ) mpFloatWin->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL ); + mpFloatWin = NULL; // delete private data - delete mpData; + if (mpData) + delete mpData; + mpData = NULL; // remove the lists when there are no more toolbox references to // the lists @@ -1601,10 +1609,15 @@ ToolBox::~ToolBox() pSVData->maCtrlData.mpTBDragMgr = NULL; } } + mpFloatWin.clear(); + DockingWindow::dispose(); } ImplToolItem* ToolBox::ImplGetItem( sal_uInt16 nItemId ) const { + if (!mpData) + return NULL; + std::vector< ImplToolItem >::iterator it = mpData->m_aItems.begin(); while ( it != mpData->m_aItems.end() ) { @@ -2630,7 +2643,7 @@ IMPL_LINK_NOARG(ToolBox, ImplDropdownLongClickHdl) // do not reset data if the dropdown handler opened a floating window // see ImplFloatControl() - if( mpFloatWin == NULL ) + if( !mpFloatWin ) { // no floater was opened Deactivate(); @@ -2651,7 +2664,7 @@ IMPL_LINK_NOARG(ToolBox, ImplDropdownLongClickHdl) IMPL_LINK_NOARG(ToolBox, ImplUpdateHdl) { - if( mbFormat ) + if( mbFormat && mpData ) ImplFormat(); return 0; @@ -2952,7 +2965,7 @@ void ToolBox::ImplDrawItem( sal_uInt16 nPos, sal_uInt16 nHighlight, bool bPaint, const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); // no gradient background for items that have a popup open - bool bHasOpenPopup = (mpFloatWin != NULL) && (mnDownItemId==pItem->mnId); + bool bHasOpenPopup = mpFloatWin && (mnDownItemId==pItem->mnId); bool bHighContrastWhite = false; // check the face color as highcontrast indicator @@ -3864,7 +3877,7 @@ void ToolBox::MouseButtonDown( const MouseEvent& rMEvt ) // do not reset data if the dropdown handler opened a floating window // see ImplFloatControl() - if( mpFloatWin == NULL ) + if( !mpFloatWin ) { // no floater was opened Deactivate(); @@ -4823,7 +4836,7 @@ Size ToolBox::CalcMinimumWindowSizePixel() const else { // create dummy toolbox for measurements - ToolBox *pToolBox = new ToolBox( GetParent(), GetStyle() ); + VclPtrInstance< ToolBox > pToolBox( GetParent(), GetStyle() ); // copy until first useful item std::vector< ImplToolItem >::iterator it = mpData->m_aItems.begin(); @@ -4851,7 +4864,8 @@ Size ToolBox::CalcMinimumWindowSizePixel() const ImplGetDockingManager()->RemoveWindow( pToolBox ); pToolBox->Clear(); - delete pToolBox; + + pToolBox.disposeAndClear(); return aSize; } diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx index 80b2bf920075..481122834fc5 100644 --- a/vcl/source/window/toolbox2.cxx +++ b/vcl/source/window/toolbox2.cxx @@ -165,6 +165,7 @@ ImplToolItem::ImplToolItem( const ImplToolItem& rItem ) : ImplToolItem::~ImplToolItem() { + // don't dispose mpWindow - we get copied around. } ImplToolItem& ImplToolItem::operator=( const ImplToolItem& rItem ) @@ -866,7 +867,7 @@ void ToolBox::SetPageScroll( bool b ) sal_uInt16 ToolBox::GetItemCount() const { - return (sal_uInt16)mpData->m_aItems.size(); + return mpData ? (sal_uInt16)mpData->m_aItems.size() : 0; } ToolBoxItemType ToolBox::GetItemType( sal_uInt16 nPos ) const @@ -876,11 +877,13 @@ ToolBoxItemType ToolBox::GetItemType( sal_uInt16 nPos ) const sal_uInt16 ToolBox::GetItemPos( sal_uInt16 nItemId ) const { - int nCount = mpData->m_aItems.size(); - for( int nPos = 0; nPos < nCount; nPos++ ) - if( mpData->m_aItems[nPos].mnId == nItemId ) - return (sal_uInt16)nPos; - + if (mpData) + { + int nCount = mpData->m_aItems.size(); + for( int nPos = 0; nPos < nCount; nPos++ ) + if( mpData->m_aItems[nPos].mnId == nItemId ) + return (sal_uInt16)nPos; + } return TOOLBOX_ITEM_NOTFOUND; } @@ -934,6 +937,9 @@ sal_uInt16 ToolBox::GetItemId( const Point& rPos ) const sal_uInt16 ToolBox::GetItemId(const OUString &rCommand) const { + if (!mpData) + return TOOLBOX_ITEM_NOTFOUND; + for (std::vector<ImplToolItem>::const_iterator it = mpData->m_aItems.begin(); it != mpData->m_aItems.end(); ++it) { if (it->maCommandStr == rCommand) diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 4a898eeac6b9..f991b98b6fe5 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -33,6 +33,7 @@ #include <vcl/syschild.hxx> #include <vcl/dockwin.hxx> #include <vcl/wall.hxx> +#include <vcl/fixed.hxx> #include <vcl/gradient.hxx> #include <vcl/button.hxx> #include <vcl/taskpanelist.hxx> @@ -131,13 +132,18 @@ namespace } #endif -Window::~Window() +bool Window::IsDisposed() const { - vcl::LazyDeletor<vcl::Window>::Undelete( this ); - - DBG_ASSERT( !mpWindowImpl->mbInDtor, "~Window - already in DTOR!" ); + return !mpWindowImpl; +} - dispose(); +void Window::dispose() +{ + assert( mpWindowImpl ); + assert( !mpWindowImpl->mbInDispose ); // should only be called from disposeOnce() + assert( !mpWindowImpl->mpParent || + !mpWindowImpl->mpParent->IsDisposed() || + "vcl::Window child should have its parent disposed first" ); // remove Key and Mouse events issued by Application::PostKey/MouseEvent Application::RemoveMouseAndKeyEvents( this ); @@ -152,7 +158,7 @@ Window::~Window() xCanvasComponent->dispose(); } - mpWindowImpl->mbInDtor = true; + mpWindowImpl->mbInDispose = true; CallEventListeners( VCLEVENT_OBJECT_DYING ); @@ -167,9 +173,8 @@ Window::~Window() // remove ownerdraw decorated windows from list in the top-most frame window if( (GetStyle() & WB_OWNERDRAWDECORATION) && mpWindowImpl->mbFrame ) { - ::std::vector< vcl::Window* >& rList = ImplGetOwnerDrawList(); - ::std::vector< vcl::Window* >::iterator p; - p = ::std::find( rList.begin(), rList.end(), this ); + ::std::vector< VclPtr<vcl::Window> >& rList = ImplGetOwnerDrawList(); + auto p = ::std::find( rList.begin(), rList.end(), VclPtr<vcl::Window>(this) ); if( p != rList.end() ) rList.erase( p ); } @@ -232,9 +237,9 @@ Window::~Window() if ( pSVData->maHelpData.mpHelpWin && (pSVData->maHelpData.mpHelpWin->GetParent() == this) ) ImplDestroyHelpWindow( true ); - DBG_ASSERT( pSVData->maWinData.mpTrackWin != this, + DBG_ASSERT( pSVData->maWinData.mpTrackWin.get() != this, "Window::~Window(): Window is in TrackingMode" ); - DBG_ASSERT( pSVData->maWinData.mpCaptureWin != this, + DBG_ASSERT( pSVData->maWinData.mpCaptureWin.get() != this, "Window::~Window(): Window has the mouse captured" ); // due to old compatibility @@ -251,6 +256,22 @@ Window::~Window() OStringBuffer aErrorStr; bool bError = false; vcl::Window* pTempWin; + + if ( mpWindowImpl->mpFirstChild ) + { + OStringBuffer aTempStr("Window ("); + aTempStr.append(lcl_createWindowInfo(*this)); + aTempStr.append(") with live children destroyed: "); + pTempWin = mpWindowImpl->mpFirstChild; + while ( pTempWin ) + { + aTempStr.append(lcl_createWindowInfo(*pTempWin)); + pTempWin = pTempWin->mpWindowImpl->mpNext; + } + OSL_FAIL( aTempStr.getStr() ); + Application::Abort(OStringToOUString(aTempStr.makeStringAndClear(), RTL_TEXTENCODING_UTF8)); // abort in debug builds, this must be fixed! + } + if (mpWindowImpl->mpFrameData != 0) { pTempWin = mpWindowImpl->mpFrameData->mpFirstOverlap; @@ -267,8 +288,7 @@ Window::~Window() { OStringBuffer aTempStr; aTempStr.append("Window ("); - aTempStr.append(OUStringToOString(GetText(), - RTL_TEXTENCODING_UTF8)); + aTempStr.append(lcl_createWindowInfo(*this)); aTempStr.append(") with live SystemWindows destroyed: "); aTempStr.append(aErrorStr.toString()); OSL_FAIL(aTempStr.getStr()); @@ -292,32 +312,17 @@ Window::~Window() if ( bError ) { OStringBuffer aTempStr( "Window (" ); - aTempStr.append(OUStringToOString(GetText(), RTL_TEXTENCODING_UTF8)); + aTempStr.append(lcl_createWindowInfo(*this)); aTempStr.append(") with live SystemWindows destroyed: "); aTempStr.append(aErrorStr.toString()); OSL_FAIL( aTempStr.getStr() ); Application::Abort(OStringToOUString(aTempStr.makeStringAndClear(), RTL_TEXTENCODING_UTF8)); // abort in debug builds, this must be fixed! } - if ( mpWindowImpl->mpFirstChild ) - { - OStringBuffer aTempStr("Window ("); - aTempStr.append(OUStringToOString(GetText(), RTL_TEXTENCODING_UTF8)); - aTempStr.append(") with live children destroyed: "); - pTempWin = mpWindowImpl->mpFirstChild; - while ( pTempWin ) - { - aTempStr.append(lcl_createWindowInfo(*pTempWin)); - pTempWin = pTempWin->mpWindowImpl->mpNext; - } - OSL_FAIL( aTempStr.getStr() ); - Application::Abort(OStringToOUString(aTempStr.makeStringAndClear(), RTL_TEXTENCODING_UTF8)); // abort in debug builds, this must be fixed! - } - if ( mpWindowImpl->mpFirstOverlap ) { OStringBuffer aTempStr("Window ("); - aTempStr.append(OUStringToOString(GetText(), RTL_TEXTENCODING_UTF8)); + aTempStr.append(lcl_createWindowInfo(*this)); aTempStr.append(") with live SystemWindows destroyed: "); pTempWin = mpWindowImpl->mpFirstOverlap; while ( pTempWin ) @@ -343,7 +348,7 @@ Window::~Window() if ( pMySysWin && pMySysWin->ImplIsInTaskPaneList( this ) ) { OStringBuffer aTempStr("Window ("); - aTempStr.append(OUStringToOString(GetText(), RTL_TEXTENCODING_UTF8)); + aTempStr.append(lcl_createWindowInfo(*this)); aTempStr.append(") still in TaskPanelList!"); OSL_FAIL( aTempStr.getStr() ); Application::Abort(OStringToOUString(aTempStr.makeStringAndClear(), RTL_TEXTENCODING_UTF8)); // abort in debug builds, this must be fixed! @@ -381,9 +386,8 @@ Window::~Window() remove_from_all_size_groups(); // clear mnemonic labels - std::vector<FixedText*> aMnemonicLabels(list_mnemonic_labels()); - for (std::vector<FixedText*>::iterator aI = aMnemonicLabels.begin(); - aI != aMnemonicLabels.end(); ++aI) + std::vector<VclPtr<FixedText> > aMnemonicLabels(list_mnemonic_labels()); + for (auto aI = aMnemonicLabels.begin(); aI != aMnemonicLabels.end(); ++aI) { remove_mnemonic_label(*aI); } @@ -499,7 +503,7 @@ Window::~Window() while ( pDelData ) { pDelData->mbDel = true; - pDelData->mpWindow = NULL; // #112873# pDel is not associated with a Window anymore + pDelData->mpWindow.clear(); // #112873# pDel is not associated with a Window anymore pDelData = pDelData->mpNext; } @@ -514,8 +518,8 @@ Window::~Window() { ImplWinData* pParentWinData = mpWindowImpl->mpRealParent->ImplGetWinData(); - ::std::list< vcl::Window* >::iterator myPos = ::std::find( pParentWinData->maTopWindowChildren.begin(), - pParentWinData->maTopWindowChildren.end(), this ); + auto myPos = ::std::find( pParentWinData->maTopWindowChildren.begin(), + pParentWinData->maTopWindowChildren.end(), VclPtr<vcl::Window>(this) ); DBG_ASSERT( myPos != pParentWinData->maTopWindowChildren.end(), "Window::~Window: inconsistency in top window chain!" ); if ( myPos != pParentWinData->maTopWindowChildren.end() ) pParentWinData->maTopWindowChildren.erase( myPos ); @@ -546,17 +550,18 @@ Window::~Window() delete mpWindowImpl->mpOverlapData; // remove BorderWindow or Frame window data - if ( mpWindowImpl->mpBorderWindow ) - delete mpWindowImpl->mpBorderWindow; - else if ( mpWindowImpl->mbFrame ) + mpWindowImpl->mpBorderWindow.disposeAndClear(); + if ( mpWindowImpl->mbFrame ) { if ( pSVData->maWinData.mpFirstFrame == this ) pSVData->maWinData.mpFirstFrame = mpWindowImpl->mpFrameData->mpNextFrame; else { vcl::Window* pSysWin = pSVData->maWinData.mpFirstFrame; - while ( pSysWin->mpWindowImpl->mpFrameData->mpNextFrame != this ) + while ( pSysWin->mpWindowImpl->mpFrameData->mpNextFrame.get() != this ) pSysWin = pSysWin->mpWindowImpl->mpFrameData->mpNextFrame; + + assert (mpWindowImpl->mpFrameData->mpNextFrame.get() != pSysWin); pSysWin->mpWindowImpl->mpFrameData->mpNextFrame = mpWindowImpl->mpFrameData->mpNextFrame; } mpWindowImpl->mpFrame->SetCallback( NULL, NULL ); @@ -566,6 +571,31 @@ Window::~Window() // should be the last statements delete mpWindowImpl; mpWindowImpl = NULL; + + OutputDevice::dispose(); +} + +Window::~Window() +{ + // FIXME: we should kill all LazyDeletor usage. + vcl::LazyDeletor<vcl::Window>::Undelete( this ); + disposeOnce(); +} + +// We will eventually being removing the inheritance of OutputDevice +// from Window. It will be replaced with a transient relationship such +// that the OutputDevice is only live for the scope of the Paint method. +// In the meantime this can help move us towards a Window use an +// OutputDevice, not being one. + +::OutputDevice const* Window::GetOutDev() const +{ + return this; +} + +::OutputDevice* Window::GetOutDev() +{ + return this; } } /* namespace vcl */ @@ -584,8 +614,8 @@ WindowImpl::WindowImpl( WindowType nType ) mpOverlapWindow = NULL; // first overlap parent mpBorderWindow = NULL; // Border-Window mpClientWindow = NULL; // Client-Window of a FrameWindow - mpParent = NULL; // parent (inkl. BorderWindow) - mpRealParent = NULL; // real parent (exkl. BorderWindow) + mpParent = NULL; // parent (incl. BorderWindow) + mpRealParent = NULL; // real parent (excl. BorderWindow) mpFirstChild = NULL; // first child window mpLastChild = NULL; // last child window mpFirstOverlap = NULL; // first overlap window (only set in overlap windows) @@ -704,7 +734,7 @@ WindowImpl::WindowImpl( WindowType nType ) mbCompoundControlHasFocus = false; // true: Composite Control has focus somewhere mbPaintDisabled = false; // true: Paint should not be executed mbAllResize = false; // true: Also sent ResizeEvents with 0,0 - mbInDtor = false; // true: We're still in Window-Dtor + mbInDispose = false; // true: We're still in Window::dispose() mbExtTextInput = false; // true: ExtTextInput-Mode is active mbInFocusHdl = false; // true: Within GetFocus-Handler mbCreatedWithToolkit = false; @@ -876,7 +906,7 @@ void Window::ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* p nBorderTypeStyle |= BORDERWINDOW_STYLE_FRAME; nStyle |= WB_BORDER; } - ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle & (WB_BORDER | WB_DIALOGCONTROL | WB_NODIALOGCONTROL | WB_NEEDSFOCUS), nBorderTypeStyle ); + VclPtrInstance<ImplBorderWindow> pBorderWin( pParent, nStyle & (WB_BORDER | WB_DIALOGCONTROL | WB_NODIALOGCONTROL | WB_NEEDSFOCUS), nBorderTypeStyle ); ((vcl::Window*)pBorderWin)->mpWindowImpl->mpClientWindow = this; pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); mpWindowImpl->mpBorderWindow = pBorderWin; @@ -989,6 +1019,7 @@ void Window::ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* p mpWindowImpl->mpOverlapWindow = this; // set frame data + assert (pSVData->maWinData.mpFirstFrame.get() != this); mpWindowImpl->mpFrameData->mpNextFrame = pSVData->maWinData.mpFirstFrame; pSVData->maWinData.mpFirstFrame = this; mpWindowImpl->mpFrameData->mpFirstOverlap = NULL; @@ -1181,13 +1212,6 @@ void Window::ImplInitAppFontData( vcl::Window* pWindow ) void Window::ImplInitWindowData( WindowType nType ) { - // We will eventually being removing the inheritance of OutputDevice from Window. - // It will be replaced with a composition relationship. A Window will use an OutputDevice, - // it will not *be* an OutputDevice - mpOutputDevice = (OutputDevice*)this; - - mnRefCnt = 0; - mpWindowImpl = new WindowImpl( nType ); meOutDevType = OUTDEV_WINDOW; @@ -1352,6 +1376,12 @@ void Window::ImplSetReallyVisible() void Window::ImplAddDel( ImplDelData* pDel ) // TODO: make "const" when incompatibility ok { + if ( IsDisposed() ) + { + pDel->mbDel = true; + return; + } + DBG_ASSERT( !pDel->mpWindow, "Window::ImplAddDel(): cannot add ImplDelData twice !" ); if( !pDel->mpWindow ) { @@ -1364,6 +1394,10 @@ void Window::ImplAddDel( ImplDelData* pDel ) // TODO: make "const" when incompat void Window::ImplRemoveDel( ImplDelData* pDel ) // TODO: make "const" when incompatibility ok { pDel->mpWindow = NULL; // #112873# pDel is not associated with a Window anymore + + if ( IsDisposed() ) + return; + if ( mpWindowImpl->mpFirstDel == pDel ) mpWindowImpl->mpFirstDel = pDel->mpNext; else @@ -2074,7 +2108,7 @@ void Window::SetBorderStyle( WindowBorderStyle nBorderStyle ) // this is a little awkward: some controls (e.g. svtools ProgressBar) // cannot avoid getting constructed with WB_BORDER but want to disable // borders in case of NWF drawing. So they need a method to remove their border window - vcl::Window* pBorderWin = mpWindowImpl->mpBorderWindow; + VclPtr<vcl::Window> pBorderWin = mpWindowImpl->mpBorderWindow; // remove us as border window's client pBorderWin->mpWindowImpl->mpClientWindow = NULL; mpWindowImpl->mpBorderWindow = NULL; @@ -2086,7 +2120,7 @@ void Window::SetBorderStyle( WindowBorderStyle nBorderStyle ) Size aBorderSize( pBorderWin->GetSizePixel() ); setPosSizePixel( aBorderPos.X(), aBorderPos.Y(), aBorderSize.Width(), aBorderSize.Height() ); // release border window - delete pBorderWin; + pBorderWin.disposeAndClear(); // set new style bits SetStyle( GetStyle() & (~WB_BORDER) ); @@ -2094,7 +2128,7 @@ void Window::SetBorderStyle( WindowBorderStyle nBorderStyle ) else { if ( mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->SetBorderStyle( nBorderStyle ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetBorderStyle( nBorderStyle ); else mpWindowImpl->mpBorderWindow->SetBorderStyle( nBorderStyle ); } @@ -2107,7 +2141,7 @@ WindowBorderStyle Window::GetBorderStyle() const if ( mpWindowImpl->mpBorderWindow ) { if ( mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW ) - return static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->GetBorderStyle(); + return static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->GetBorderStyle(); else return mpWindowImpl->mpBorderWindow->GetBorderStyle(); } @@ -2121,7 +2155,7 @@ long Window::CalcTitleWidth() const if ( mpWindowImpl->mpBorderWindow ) { if ( mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW ) - return static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->CalcTitleWidth(); + return static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->CalcTitleWidth(); else return mpWindowImpl->mpBorderWindow->CalcTitleWidth(); } @@ -2241,8 +2275,7 @@ vcl::Font Window::GetPointFont() const void Window::Show( bool bVisible, sal_uInt16 nFlags ) { - - if ( mpWindowImpl->mbVisible == bVisible ) + if ( IsDisposed() || mpWindowImpl->mbVisible == bVisible ) return; ImplDelData aDogTag( this ); @@ -2482,7 +2515,7 @@ Size Window::GetSizePixel() const // #i43257# trigger pending resize handler to assure correct window sizes if( mpWindowImpl->mpFrameData->maResizeIdle.IsActive() ) { - ImplDelData aDogtag( this ); + ImplDelData aDogtag( const_cast<Window*>(this) ); mpWindowImpl->mpFrameData->maResizeIdle.Stop(); mpWindowImpl->mpFrameData->maResizeIdle.GetIdleHdl().Call( NULL ); if( aDogtag.IsDead() ) @@ -2504,6 +2537,8 @@ void Window::GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder, void Window::Enable( bool bEnable, bool bChild ) { + if ( IsDisposed() ) + return; if ( !bEnable ) { @@ -2525,15 +2560,15 @@ void Window::Enable( bool bEnable, bool bChild ) { mpWindowImpl->mpBorderWindow->Enable( bEnable, false ); if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->Enable( bEnable, true ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow ) + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->Enable( bEnable, true ); } // #i56102# restore app focus win in case the // window was disabled when the frame focus changed ImplSVData* pSVData = ImplGetSVData(); if( bEnable && - pSVData->maWinData.mpFocusWin == NULL && + pSVData->maWinData.mpFocusWin == nullptr && mpWindowImpl->mpFrameData->mbHasFocus && mpWindowImpl->mpFrameData->mpFocusWin == this ) pSVData->maWinData.mpFocusWin = this; @@ -2587,8 +2622,8 @@ void Window::EnableInput( bool bEnable, bool bChild ) { mpWindowImpl->mpBorderWindow->EnableInput( bEnable, false ); if ( (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) && - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow ) - static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow)->mpMenuBarWindow->EnableInput( bEnable, true ); + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow ) + static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->mpMenuBarWindow->EnableInput( bEnable, true ); } if ( (! bEnable && mpWindowImpl->meAlwaysInputMode != AlwaysInputEnabled) || @@ -2616,7 +2651,7 @@ void Window::EnableInput( bool bEnable, bool bChild ) // window was disabled when the frame focus changed ImplSVData* pSVData = ImplGetSVData(); if( bEnable && - pSVData->maWinData.mpFocusWin == NULL && + pSVData->maWinData.mpFocusWin == nullptr && mpWindowImpl->mpFrameData->mbHasFocus && mpWindowImpl->mpFrameData->mpFocusWin == this ) pSVData->maWinData.mpFocusWin = this; @@ -2688,8 +2723,8 @@ void Window::EnableInput( bool bEnable, bool bChild, bool bSysWin, // the same for ownerdraw floating windows if( mpWindowImpl->mbFrame ) { - ::std::vector< vcl::Window* >& rList = mpWindowImpl->mpFrameData->maOwnerDrawList; - ::std::vector< vcl::Window* >::iterator p = rList.begin(); + ::std::vector< VclPtr<vcl::Window> >& rList = mpWindowImpl->mpFrameData->maOwnerDrawList; + auto p = rList.begin(); while( p != rList.end() ) { // Is Window in the path from this window @@ -3055,7 +3090,7 @@ Rectangle Window::ImplGetWindowExtentsRelative( vcl::Window *pRelativeWindow, bo if( pRelativeWindow ) { // #106399# express coordinates relative to borderwindow - vcl::Window *pRelWin = (!bClientOnly && pRelativeWindow->mpWindowImpl->mpBorderWindow) ? pRelativeWindow->mpWindowImpl->mpBorderWindow : pRelativeWindow; + vcl::Window *pRelWin = (!bClientOnly && pRelativeWindow->mpWindowImpl->mpBorderWindow) ? pRelativeWindow->mpWindowImpl->mpBorderWindow.get() : pRelativeWindow; aPos = pRelWin->AbsoluteScreenToOutputPixel( aPos ); } return Rectangle( aPos, aSize ); @@ -3102,7 +3137,6 @@ void Window::SetUpdateMode( bool bUpdate ) void Window::GrabFocus() { - ImplGrabFocus( 0 ); } @@ -3608,7 +3642,7 @@ void Window::ImplIncModalCount() { pParent = pParent->GetParent(); } - pFrameWindow = pParent ? pParent->mpWindowImpl->mpFrameWindow : NULL; + pFrameWindow = pParent ? pParent->mpWindowImpl->mpFrameWindow.get() : NULL; } } void Window::ImplDecModalCount() @@ -3622,7 +3656,7 @@ void Window::ImplDecModalCount() { pParent = pParent->GetParent(); } - pFrameWindow = pParent ? pParent->mpWindowImpl->mpFrameWindow : NULL; + pFrameWindow = pParent ? pParent->mpWindowImpl->mpFrameWindow.get() : NULL; } } diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx index 68129c08561b..c43563e7db74 100644 --- a/vcl/source/window/window2.cxx +++ b/vcl/source/window/window2.cxx @@ -375,7 +375,7 @@ void Window::StartTracking( sal_uInt16 nFlags ) { ImplSVData* pSVData = ImplGetSVData(); - if ( pSVData->maWinData.mpTrackWin != this ) + if ( pSVData->maWinData.mpTrackWin.get() != this ) { if ( pSVData->maWinData.mpTrackWin ) pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL ); @@ -402,7 +402,7 @@ void Window::EndTracking( sal_uInt16 nFlags ) { ImplSVData* pSVData = ImplGetSVData(); - if ( pSVData->maWinData.mpTrackWin == this ) + if ( pSVData->maWinData.mpTrackWin.get() == this ) { // due to DbgChkThis in brackets, as the window could be destroyed // in the handler @@ -449,7 +449,7 @@ void Window::StartAutoScroll( sal_uInt16 nFlags ) { ImplSVData* pSVData = ImplGetSVData(); - if ( pSVData->maWinData.mpAutoScrollWin != this ) + if ( pSVData->maWinData.mpAutoScrollWin.get() != this ) { if ( pSVData->maWinData.mpAutoScrollWin ) pSVData->maWinData.mpAutoScrollWin->EndAutoScroll(); @@ -457,14 +457,14 @@ void Window::StartAutoScroll( sal_uInt16 nFlags ) pSVData->maWinData.mpAutoScrollWin = this; pSVData->maWinData.mnAutoScrollFlags = nFlags; - pSVData->maAppData.mpWheelWindow = new ImplWheelWindow( this ); + pSVData->maAppData.mpWheelWindow = VclPtr<ImplWheelWindow>::Create( this ); } void Window::EndAutoScroll() { ImplSVData* pSVData = ImplGetSVData(); - if ( pSVData->maWinData.mpAutoScrollWin == this ) + if ( pSVData->maWinData.mpAutoScrollWin.get() == this ) { pSVData->maWinData.mpAutoScrollWin = NULL; pSVData->maWinData.mnAutoScrollFlags = 0; @@ -938,7 +938,7 @@ void Window::EnableDocking( bool bEnable ) } // retrieves the list of owner draw decorated windows for this window hiearchy -::std::vector<vcl::Window *>& Window::ImplGetOwnerDrawList() +::std::vector<VclPtr<vcl::Window> >& Window::ImplGetOwnerDrawList() { return ImplGetTopmostFrameWindow()->mpWindowImpl->mpFrameData->maOwnerDrawList; } @@ -975,27 +975,27 @@ vcl::Window* Window::ImplGetWindow() ImplFrameData* Window::ImplGetFrameData() { - return mpWindowImpl->mpFrameData; + return mpWindowImpl ? mpWindowImpl->mpFrameData : NULL; } SalFrame* Window::ImplGetFrame() const { - return mpWindowImpl->mpFrame; + return mpWindowImpl ? mpWindowImpl->mpFrame : NULL; } vcl::Window* Window::ImplGetParent() const { - return mpWindowImpl->mpParent; + return mpWindowImpl ? mpWindowImpl->mpParent.get() : NULL; } vcl::Window* Window::ImplGetClientWindow() const { - return mpWindowImpl->mpClientWindow; + return mpWindowImpl ? mpWindowImpl->mpClientWindow.get() : NULL; } vcl::Window* Window::ImplGetBorderWindow() const { - return mpWindowImpl->mpBorderWindow; + return mpWindowImpl ? mpWindowImpl->mpBorderWindow.get() : NULL; } vcl::Window* Window::ImplGetFirstOverlapWindow() @@ -1016,37 +1016,38 @@ const vcl::Window* Window::ImplGetFirstOverlapWindow() const vcl::Window* Window::ImplGetFrameWindow() const { - return mpWindowImpl->mpFrameWindow; + return mpWindowImpl ? mpWindowImpl->mpFrameWindow.get() : NULL; } bool Window::IsDockingWindow() const { - return mpWindowImpl->mbDockWin; + return mpWindowImpl ? mpWindowImpl->mbDockWin : false; } bool Window::ImplIsFloatingWindow() const { - return mpWindowImpl->mbFloatWin; + return mpWindowImpl ? mpWindowImpl->mbFloatWin : false; } bool Window::ImplIsSplitter() const { - return mpWindowImpl->mbSplitter; + return mpWindowImpl ? mpWindowImpl->mbSplitter : false; } bool Window::ImplIsPushButton() const { - return mpWindowImpl->mbPushButton; + return mpWindowImpl ? mpWindowImpl->mbPushButton : false; } bool Window::ImplIsOverlapWindow() const { - return mpWindowImpl->mbOverlapWin; + return mpWindowImpl ? mpWindowImpl->mbOverlapWin : false; } void Window::ImplSetMouseTransparent( bool bTransparent ) { - mpWindowImpl->mbMouseTransparent = bTransparent; + if (mpWindowImpl) + mpWindowImpl->mbMouseTransparent = bTransparent; } Point Window::ImplOutputToFrame( const Point& rPos ) @@ -1061,7 +1062,8 @@ Point Window::ImplFrameToOutput( const Point& rPos ) void Window::SetCompoundControl( bool bCompound ) { - mpWindowImpl->mbCompoundControl = bCompound; + if (mpWindowImpl) + mpWindowImpl->mbCompoundControl = bCompound; } void Window::IncrementLockCount() @@ -1076,27 +1078,31 @@ void Window::DecrementLockCount() WinBits Window::GetStyle() const { - return mpWindowImpl->mnStyle; + return mpWindowImpl ? mpWindowImpl->mnStyle : 0; } WinBits Window::GetPrevStyle() const { - return mpWindowImpl->mnPrevStyle; + return mpWindowImpl ? mpWindowImpl->mnPrevStyle : 0; } WinBits Window::GetExtendedStyle() const { - return mpWindowImpl->mnExtendedStyle; + return mpWindowImpl ? mpWindowImpl->mnExtendedStyle : 0; } void Window::SetType( WindowType nType ) { - mpWindowImpl->mnType = nType; + if (mpWindowImpl) + mpWindowImpl->mnType = nType; } WindowType Window::GetType() const { - return mpWindowImpl->mnType; + if (mpWindowImpl) + return mpWindowImpl->mnType; + else + return WINDOW_PARENT; } Dialog* Window::GetParentDialog() const @@ -1116,22 +1122,22 @@ Dialog* Window::GetParentDialog() const bool Window::IsSystemWindow() const { - return mpWindowImpl->mbSysWin; + return mpWindowImpl ? mpWindowImpl->mbSysWin : false; } bool Window::IsDialog() const { - return mpWindowImpl->mbDialog; + return mpWindowImpl ? mpWindowImpl->mbDialog : false; } bool Window::IsMenuFloatingWindow() const { - return mpWindowImpl->mbMenuFloatingWindow; + return mpWindowImpl ? mpWindowImpl->mbMenuFloatingWindow : false; } bool Window::IsToolbarFloatingWindow() const { - return mpWindowImpl->mbToolbarFloatingWindow; + return mpWindowImpl ? mpWindowImpl->mbToolbarFloatingWindow : false; } void Window::EnableAllResize( bool bEnable ) @@ -1146,17 +1152,17 @@ void Window::EnableChildTransparentMode( bool bEnable ) bool Window::IsChildTransparentModeEnabled() const { - return mpWindowImpl->mbChildTransparent; + return mpWindowImpl ? mpWindowImpl->mbChildTransparent : false; } bool Window::IsMouseTransparent() const { - return mpWindowImpl->mbMouseTransparent; + return mpWindowImpl ? mpWindowImpl->mbMouseTransparent : false; } bool Window::IsPaintTransparent() const { - return mpWindowImpl->mbPaintTransparent; + return mpWindowImpl ? mpWindowImpl->mbPaintTransparent : false; } void Window::SetDialogControlStart( bool bStart ) @@ -1166,7 +1172,7 @@ void Window::SetDialogControlStart( bool bStart ) bool Window::IsDialogControlStart() const { - return mpWindowImpl->mbDlgCtrlStart; + return mpWindowImpl ? mpWindowImpl->mbDlgCtrlStart : false; } void Window::SetDialogControlFlags( sal_uInt16 nFlags ) @@ -1211,27 +1217,27 @@ bool Window::IsControlBackground() const bool Window::IsInPaint() const { - return mpWindowImpl->mbInPaint; + return mpWindowImpl ? mpWindowImpl->mbInPaint : false; } vcl::Window* Window::GetParent() const { - return mpWindowImpl->mpRealParent; + return mpWindowImpl ? mpWindowImpl->mpRealParent.get() : NULL; } bool Window::IsVisible() const { - return mpWindowImpl->mbVisible; + return mpWindowImpl ? mpWindowImpl->mbVisible : false; } bool Window::IsReallyVisible() const { - return mpWindowImpl->mbReallyVisible; + return mpWindowImpl ? mpWindowImpl->mbReallyVisible : false; } bool Window::IsReallyShown() const { - return mpWindowImpl->mbReallyShown; + return mpWindowImpl ? mpWindowImpl->mbReallyShown : false; } bool Window::IsInInitShow() const @@ -1241,12 +1247,12 @@ bool Window::IsInInitShow() const bool Window::IsEnabled() const { - return !mpWindowImpl->mbDisabled; + return mpWindowImpl ? !mpWindowImpl->mbDisabled : false; } bool Window::IsInputEnabled() const { - return !mpWindowImpl->mbInputDisabled; + return mpWindowImpl ? !mpWindowImpl->mbInputDisabled : false; } bool Window::IsAlwaysEnableInput() const @@ -1317,6 +1323,8 @@ bool Window::IsWait() const vcl::Cursor* Window::GetCursor() const { + if (!mpWindowImpl) + return NULL; return mpWindowImpl->mpCursor; } @@ -1338,7 +1346,8 @@ void Window::SetHelpText( const OUString& rHelpText ) void Window::SetQuickHelpText( const OUString& rHelpText ) { - mpWindowImpl->maQuickHelpText = rHelpText; + if (mpWindowImpl) + mpWindowImpl->maQuickHelpText = rHelpText; } const OUString& Window::GetQuickHelpText() const @@ -1364,8 +1373,8 @@ bool Window::IsCreatedWithToolkit() const void Window::SetCreatedWithToolkit( bool b ) { mpWindowImpl->mbCreatedWithToolkit = b; - } + const Pointer& Window::GetPointer() const { return mpWindowImpl->maPointer; @@ -1373,7 +1382,7 @@ const Pointer& Window::GetPointer() const VCLXWindow* Window::GetWindowPeer() const { - return mpWindowImpl->mpVCLXWindow; + return mpWindowImpl ? mpWindowImpl->mpVCLXWindow : NULL; } void Window::SetPosPixel( const Point& rNewPos ) @@ -1436,6 +1445,9 @@ void Window::InvalidateSizeCache() void Window::queue_resize(StateChangedType eReason) { + if (IsDisposed()) + return; + bool bSomeoneCares = queue_ungrouped_resize(this); if (eReason != StateChangedType::VISIBLE) @@ -1446,9 +1458,8 @@ void Window::queue_resize(StateChangedType eReason) WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl; if (pWindowImpl->m_xSizeGroup && pWindowImpl->m_xSizeGroup->get_mode() != VCL_SIZE_GROUP_NONE) { - std::set<vcl::Window*> &rWindows = pWindowImpl->m_xSizeGroup->get_widgets(); - for (std::set<vcl::Window*>::iterator aI = rWindows.begin(), - aEnd = rWindows.end(); aI != aEnd; ++aI) + std::set<VclPtr<vcl::Window> > &rWindows = pWindowImpl->m_xSizeGroup->get_widgets(); + for (auto aI = rWindows.begin(), aEnd = rWindows.end(); aI != aEnd; ++aI) { vcl::Window *pOther = *aI; if (pOther == this) @@ -1743,9 +1754,8 @@ Size Window::get_preferred_size() const if (eMode != VCL_SIZE_GROUP_NONE) { const bool bIgnoreInHidden = pWindowImpl->m_xSizeGroup->get_ignore_hidden(); - const std::set<vcl::Window*> &rWindows = pWindowImpl->m_xSizeGroup->get_widgets(); - for (std::set<vcl::Window*>::const_iterator aI = rWindows.begin(), - aEnd = rWindows.end(); aI != aEnd; ++aI) + const std::set<VclPtr<vcl::Window> > &rWindows = pWindowImpl->m_xSizeGroup->get_widgets(); + for (auto aI = rWindows.begin(), aEnd = rWindows.end(); aI != aEnd; ++aI) { const vcl::Window *pOther = *aI; if (pOther == this) @@ -2029,8 +2039,8 @@ void Window::remove_from_all_size_groups() void Window::add_mnemonic_label(FixedText *pLabel) { - std::vector<FixedText*>& v = mpWindowImpl->m_aMnemonicLabels; - if (std::find(v.begin(), v.end(), pLabel) != v.end()) + std::vector<VclPtr<FixedText> >& v = mpWindowImpl->m_aMnemonicLabels; + if (std::find(v.begin(), v.end(), VclPtr<FixedText>(pLabel)) != v.end()) return; v.push_back(pLabel); pLabel->set_mnemonic_widget(this); @@ -2038,15 +2048,15 @@ void Window::add_mnemonic_label(FixedText *pLabel) void Window::remove_mnemonic_label(FixedText *pLabel) { - std::vector<FixedText*>& v = mpWindowImpl->m_aMnemonicLabels; - std::vector<FixedText*>::iterator aFind = std::find(v.begin(), v.end(), pLabel); + std::vector<VclPtr<FixedText> >& v = mpWindowImpl->m_aMnemonicLabels; + auto aFind = std::find(v.begin(), v.end(), VclPtr<FixedText>(pLabel)); if (aFind == v.end()) return; v.erase(aFind); pLabel->set_mnemonic_widget(NULL); } -std::vector<FixedText*> Window::list_mnemonic_labels() const +std::vector<VclPtr<FixedText> > Window::list_mnemonic_labels() const { return mpWindowImpl->m_aMnemonicLabels; } diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index 139d77149e1e..ce4edf81670b 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -243,7 +243,7 @@ static bool ImplCallCommand( vcl::Window* pChild, sal_uInt16 nEvt, void* pData = struct ContextMenuEvent { - vcl::Window* pWindow; + VclPtr<vcl::Window> pWindow; ImplDelData aDelData; Point aChildPos; }; @@ -377,13 +377,13 @@ bool ImplHandleMouseEvent( vcl::Window* pWindow, MouseNotifyEvent nSVEvent, bool // no mouse messages to disabled windows // #106845# if the window was disabed during capturing we have to pass the mouse events to release capturing - if ( pSVData->maWinData.mpCaptureWin != pChild && (!pChild->IsEnabled() || !pChild->IsInputEnabled() || pChild->IsInModalNonRefMode() ) ) + if ( pSVData->maWinData.mpCaptureWin.get() != pChild && (!pChild->IsEnabled() || !pChild->IsInputEnabled() || pChild->IsInModalNonRefMode() ) ) { ImplHandleMouseFloatMode( pChild, aMousePos, nCode, nSVEvent, bMouseLeave ); if ( nSVEvent == MouseNotifyEvent::MOUSEMOVE ) { ImplHandleMouseHelpRequest( pChild, aMousePos ); - if( pWinFrameData->mpMouseMoveWin != pChild ) + if( pWinFrameData->mpMouseMoveWin.get() != pChild ) nMode |= MouseEventModifiers::ENTERWINDOW; } @@ -1371,11 +1371,10 @@ class HandleGestureEventBase { protected: ImplSVData* m_pSVData; - vcl::Window *m_pWindow; + VclPtr<vcl::Window> m_pWindow; Point m_aMousePos; public: - HandleGestureEventBase(vcl::Window *pWindow, const Point &rMousePos) : m_pSVData(ImplGetSVData()) , m_pWindow(pWindow) @@ -1692,7 +1691,7 @@ void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight ) { // #i42750# presentation wants to be informed about resize // as early as possible - WorkWindow* pWorkWindow = dynamic_cast<WorkWindow*>(pWindow->ImplGetWindowImpl()->mpClientWindow); + WorkWindow* pWorkWindow = dynamic_cast<WorkWindow*>(pWindow->ImplGetWindowImpl()->mpClientWindow.get()); if( ! pWorkWindow || pWorkWindow->IsPresentationMode() ) bStartTimer = false; } @@ -1938,7 +1937,7 @@ static void ImplHandleLoseFocus( vcl::Window* pWindow ) struct DelayedCloseEvent { - vcl::Window* pWindow; + VclPtr<vcl::Window> pWindow; ImplDelData aDelData; }; @@ -1951,9 +1950,9 @@ static sal_IntPtr DelayedCloseEventLink( void* pCEvent, void* ) pEv->pWindow->ImplRemoveDel( &pEv->aDelData ); // dispatch to correct window type if( pEv->pWindow->IsSystemWindow() ) - static_cast<SystemWindow*>(pEv->pWindow)->Close(); + static_cast<SystemWindow*>(pEv->pWindow.get())->Close(); else if( pEv->pWindow->IsDockingWindow() ) - static_cast<DockingWindow*>(pEv->pWindow)->Close(); + static_cast<DockingWindow*>(pEv->pWindow.get())->Close(); } delete pEv; diff --git a/vcl/source/window/wrkwin.cxx b/vcl/source/window/wrkwin.cxx index 1f75bd63a5ec..136adc859d84 100644 --- a/vcl/source/window/wrkwin.cxx +++ b/vcl/source/window/wrkwin.cxx @@ -49,7 +49,7 @@ void WorkWindow::ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentDat if ( nStyle & WB_APP ) nFrameStyle |= BORDERWINDOW_STYLE_APP; - ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, pSystemParentData, nStyle, nFrameStyle ); + VclPtrInstance<ImplBorderWindow> pBorderWin( pParent, pSystemParentData, nStyle, nFrameStyle ); Window::ImplInit( pBorderWin, nStyle & (WB_3DLOOK | WB_CLIPCHILDREN | WB_DIALOGCONTROL | WB_SYSTEMFLOATWIN), NULL ); pBorderWin->mpWindowImpl->mpClientWindow = this; pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); @@ -113,12 +113,18 @@ WorkWindow::WorkWindow( SystemParentData* pParent ) : WorkWindow::~WorkWindow() { + disposeOnce(); +} + +void WorkWindow::dispose() +{ ImplSVData* pSVData = ImplGetSVData(); if ( pSVData->maWinData.mpAppWin == this ) { pSVData->maWinData.mpAppWin = NULL; Application::Quit(); } + SystemWindow::dispose(); } void WorkWindow::ShowFullScreenMode( bool bFullScreenMode ) diff --git a/vcl/unx/generic/app/i18n_status.cxx b/vcl/unx/generic/app/i18n_status.cxx index e957671c8ce3..5df56b0d9362 100644 --- a/vcl/unx/generic/app/i18n_status.cxx +++ b/vcl/unx/generic/app/i18n_status.cxx @@ -52,7 +52,6 @@ class StatusWindow : public WorkWindow protected: StatusWindow( WinBits nWinBits ); public: - virtual ~StatusWindow(); virtual void setPosition( SalFrame* ); virtual void setText( const OUString & ) = 0; @@ -67,8 +66,6 @@ StatusWindow::StatusWindow( WinBits nWinBits ) : { } -StatusWindow::~StatusWindow() {} - void StatusWindow::setPosition( SalFrame* ) { } @@ -77,7 +74,7 @@ namespace vcl { class XIMStatusWindow : public StatusWindow { - FixedText m_aStatusText; + VclPtr<FixedText> m_aStatusText; SalFrame* m_pLastParent; Size m_aWindowSize; bool m_bAnchoredAtRight; @@ -104,6 +101,7 @@ public: virtual void setText( const OUString & ) SAL_OVERRIDE; virtual void show( bool bShow, I18NStatus::ShowReason eReason ) SAL_OVERRIDE; virtual void toggle( bool bOn ) SAL_OVERRIDE; + virtual void dispose() SAL_OVERRIDE; // override WorkWindow::DataChanged virtual void DataChanged( const DataChangedEvent& rEvt ) SAL_OVERRIDE; @@ -113,7 +111,7 @@ public: XIMStatusWindow::XIMStatusWindow( bool bOn ) : StatusWindow( WB_BORDER | WB_SYSTEMFLOATWIN | WB_TOOLTIPWIN ), - m_aStatusText( this, 0 ), + m_aStatusText(VclPtr<FixedText>::Create(this, 0)), m_pLastParent( NULL ), m_bAnchoredAtRight( false ), m_bDelayedShow( false ), @@ -126,8 +124,15 @@ XIMStatusWindow::XIMStatusWindow( bool bOn ) : XIMStatusWindow::~XIMStatusWindow() { + disposeOnce(); +} + +void XIMStatusWindow::dispose() +{ if( m_nDelayedEvent ) Application::RemoveUserEvent( m_nDelayedEvent ); + m_aStatusText.disposeAndClear(); + StatusWindow::dispose(); } void XIMStatusWindow::toggle( bool bOn ) @@ -138,8 +143,8 @@ void XIMStatusWindow::toggle( bool bOn ) void XIMStatusWindow::layout() { - m_aWindowSize.Width() = m_aStatusText.GetTextWidth( m_aStatusText.GetText() )+8; - Font aFont( m_aStatusText.GetFont() ); + m_aWindowSize.Width() = m_aStatusText->GetTextWidth( m_aStatusText->GetText() )+8; + Font aFont( m_aStatusText->GetFont() ); m_aWindowSize.Height() = aFont.GetHeight()+10; m_aWindowSize = LogicToPixel( m_aWindowSize ); @@ -147,9 +152,9 @@ void XIMStatusWindow::layout() aControlSize.Width() -= 4; aControlSize.Height() -= 4; - m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize ); - m_aStatusText.SetFont( aFont ); - m_aStatusText.Show( true ); + m_aStatusText->SetPosSizePixel( Point( 1, 1 ), aControlSize ); + m_aStatusText->SetFont( aFont ); + m_aStatusText->Show( true ); if (m_bAnchoredAtRight && IsVisible()) { @@ -181,7 +186,7 @@ bool XIMStatusWindow::checkLastParent() const void XIMStatusWindow::DataChanged( const DataChangedEvent& ) { - m_aStatusText.SetSettings( GetSettings() ); + m_aStatusText->SetSettings( GetSettings() ); layout(); } @@ -261,7 +266,7 @@ IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl) if( m_bDelayedShow ) { Size aControlSize( m_aWindowSize.Width()-4, m_aWindowSize.Height()-4 ); - m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize ); + m_aStatusText->SetPosSizePixel( Point( 1, 1 ), aControlSize ); Point aPoint = updatePosition(); pStatusFrame->SetPosSize( aPoint.X(), aPoint.Y(), m_aWindowSize.Width(), m_aWindowSize.Height(), SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y | SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT ); } @@ -276,7 +281,7 @@ IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl) void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason ) { - if( bShow && m_aStatusText.GetText().isEmpty() ) + if( bShow && m_aStatusText->GetText().isEmpty() ) bShow = false; m_bDelayedShow = bShow; @@ -287,15 +292,15 @@ void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason ) void XIMStatusWindow::setText( const OUString& rText ) { - m_aStatusText.SetText( rText ); - m_aWindowSize.Width() = m_aStatusText.GetTextWidth( rText )+8; + m_aStatusText->SetText( rText ); + m_aWindowSize.Width() = m_aStatusText->GetTextWidth( rText )+8; } namespace vcl { class IIIMPStatusWindow : public StatusWindow { - MenuButton m_aStatusBtn; + VclPtr<MenuButton> m_aStatusBtn; PopupMenu m_aMenu; SalFrame* m_pResetFocus; bool m_bShow; @@ -307,11 +312,12 @@ class IIIMPStatusWindow : public StatusWindow public: IIIMPStatusWindow( SalFrame* pParent, bool bOn ); // for initial position - virtual ~IIIMPStatusWindow(); virtual void setText( const OUString & ) SAL_OVERRIDE; virtual void show( bool bShow, I18NStatus::ShowReason eReason ) SAL_OVERRIDE; virtual void toggle( bool bOn ) SAL_OVERRIDE; + virtual ~IIIMPStatusWindow() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE; void layout(); // override Window focus handler @@ -324,7 +330,7 @@ public: IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) : StatusWindow( WB_MOVEABLE ), - m_aStatusBtn( this, WB_BORDER ), + m_aStatusBtn(VclPtr<MenuButton>::Create(this, WB_BORDER)), m_pResetFocus( pParent ), m_bShow( true ), m_bOn( bOn ) @@ -333,9 +339,9 @@ IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) : layout(); - m_aStatusBtn.SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) ); - m_aStatusBtn.SetPopupMenu( &m_aMenu ); - m_aStatusBtn.Show( true ); + m_aStatusBtn->SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) ); + m_aStatusBtn->SetPopupMenu( &m_aMenu ); + m_aStatusBtn->Show( true ); const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() ); int i = 1; @@ -363,17 +369,13 @@ IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) : EnableAlwaysOnTop( true ); } -IIIMPStatusWindow::~IIIMPStatusWindow() -{ -} - void IIIMPStatusWindow::layout() { - Font aFont( m_aStatusBtn.GetFont() ); + Font aFont( m_aStatusBtn->GetFont() ); Size aSize( 15*aFont.GetHeight(), aFont.GetHeight()+14 ); - aSize = m_aStatusBtn.LogicToPixel( aSize ); + aSize = m_aStatusBtn->LogicToPixel( aSize ); - m_aStatusBtn.SetPosSizePixel( Point( 0, 0 ), aSize ); + m_aStatusBtn->SetPosSizePixel( Point( 0, 0 ), aSize ); SetOutputSizePixel( aSize ); if( IsVisible() ) Invalidate(); @@ -381,13 +383,13 @@ void IIIMPStatusWindow::layout() void IIIMPStatusWindow::DataChanged( const DataChangedEvent& ) { - m_aStatusBtn.SetSettings( GetSettings() ); + m_aStatusBtn->SetSettings( GetSettings() ); layout(); } void IIIMPStatusWindow::setText( const OUString& rText ) { - m_aStatusBtn.SetText( rText ); + m_aStatusBtn->SetText( rText ); } void IIIMPStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason ) @@ -411,6 +413,12 @@ void IIIMPStatusWindow::toggle( bool bOn ) } } +void IIIMPStatusWindow::dispose() +{ + m_aStatusBtn.disposeAndClear(); + StatusWindow::dispose(); +} + void IIIMPStatusWindow::show() { if (m_bOn && m_bShow && !IsVisible()) @@ -454,10 +462,10 @@ void IIIMPStatusWindow::GetFocus() IMPL_LINK( IIIMPStatusWindow, SelectHdl, MenuButton*, pBtn ) { - if( pBtn == & m_aStatusBtn ) + if( pBtn == m_aStatusBtn ) { const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() ); - unsigned int nIndex = m_aStatusBtn.GetCurItemId()-1; + unsigned int nIndex = m_aStatusBtn->GetCurItemId()-1; if( nIndex < rChoices.size() ) { XSetICValues( static_cast<X11SalFrame*>(I18NStatus::get().getParent())->getInputContext()->GetContext(), @@ -515,8 +523,7 @@ I18NStatus::I18NStatus() : I18NStatus::~I18NStatus() { - if( m_pStatusWindow ) - delete m_pStatusWindow, m_pStatusWindow = NULL; + m_pStatusWindow.disposeAndClear(); if( pInstance == this ) pInstance = NULL; } @@ -528,10 +535,10 @@ void I18NStatus::setParent( SalFrame* pParent ) { bool bIIIMPmode = m_aChoices.begin() != m_aChoices.end(); if( bIIIMPmode ) - m_pStatusWindow = new IIIMPStatusWindow( pParent, + m_pStatusWindow = VclPtr<IIIMPStatusWindow>::Create( pParent, getStatusWindowMode() ); else - m_pStatusWindow = new XIMStatusWindow( getStatusWindowMode() ); + m_pStatusWindow = VclPtr<XIMStatusWindow>::Create( getStatusWindowMode() ); setStatusText( m_aCurrentIM ); } m_pStatusWindow->setPosition( m_pParent ); @@ -599,7 +606,7 @@ SalFrame* I18NStatus::getStatusFrame() const void I18NStatus::toggleStatusWindow() { - if (m_pStatusWindow != 0) + if (m_pStatusWindow != nullptr) m_pStatusWindow->toggle(getStatusWindowMode()); } diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx index bf58b95bf4bb..0bc8004c58b8 100644 --- a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx +++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx @@ -257,7 +257,7 @@ namespace cairo &cairo_surface_destroy ))); } - boost::shared_ptr<VirtualDevice> X11Surface::createVirtualDevice() const + VclPtr<VirtualDevice> X11Surface::createVirtualDevice() const { SystemGraphicsData aSystemGraphicsData; @@ -268,8 +268,8 @@ namespace cairo int width = cairo_xlib_surface_get_width(mpSurface.get()); int height = cairo_xlib_surface_get_height(mpSurface.get()); - return boost::shared_ptr<VirtualDevice>( - new VirtualDevice(&aSystemGraphicsData, + return VclPtr<VirtualDevice>( + VclPtr<VirtualDevice>::Create(&aSystemGraphicsData, Size(width, height), std::max(getDepth(), 0))); } diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx index 166ebaf0a882..5be944f87e42 100644 --- a/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx +++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx @@ -87,7 +87,7 @@ namespace cairo { virtual CairoSurfaceSharedPtr getCairoSurface() const SAL_OVERRIDE { return mpSurface; } virtual SurfaceSharedPtr getSimilar(int cairo_content_type, int width, int height) const SAL_OVERRIDE; - virtual boost::shared_ptr<VirtualDevice> createVirtualDevice() const SAL_OVERRIDE; + virtual VclPtr<VirtualDevice> createVirtualDevice() const SAL_OVERRIDE; virtual bool Resize( int width, int height ) SAL_OVERRIDE; diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx index 4611f377ac48..d51f752463df 100644 --- a/vcl/unx/generic/printer/cupsmgr.cxx +++ b/vcl/unx/generic/printer/cupsmgr.cxx @@ -913,13 +913,14 @@ namespace { class RTSPWDialog : public ModalDialog { - FixedText* m_pText; - Edit* m_pUserEdit; - Edit* m_pPassEdit; + VclPtr<FixedText> m_pText; + VclPtr<Edit> m_pUserEdit; + VclPtr<Edit> m_pPassEdit; public: RTSPWDialog(const OString& rServer, const OString& rUserName, vcl::Window* pParent); - + virtual ~RTSPWDialog(); + virtual void dispose() SAL_OVERRIDE; OString getUserName() const; OString getPassword() const; }; @@ -938,6 +939,19 @@ namespace m_pUserEdit->SetText( OStringToOUString(rUserName, osl_getThreadTextEncoding())); } + RTSPWDialog::~RTSPWDialog() + { + disposeOnce(); + } + + void RTSPWDialog::dispose() + { + m_pText.clear(); + m_pUserEdit.clear(); + m_pPassEdit.clear(); + ModalDialog::dispose(); + } + OString RTSPWDialog::getUserName() const { return OUStringToOString( m_pUserEdit->GetText(), osl_getThreadTextEncoding() ); @@ -952,11 +966,11 @@ namespace { bool bRet = false; - RTSPWDialog aDialog(rServer, rUserName, NULL); - if (aDialog.Execute()) + ScopedVclPtrInstance<RTSPWDialog> aDialog(rServer, rUserName, nullptr); + if (aDialog->Execute()) { - rUserName = aDialog.getUserName(); - rPassword = aDialog.getPassword(); + rUserName = aDialog->getUserName(); + rPassword = aDialog->getPassword(); bRet = true; } diff --git a/vcl/unx/gtk/a11y/atkutil.cxx b/vcl/unx/gtk/a11y/atkutil.cxx index c7a1221cd340..d95f700809c8 100644 --- a/vcl/unx/gtk/a11y/atkutil.cxx +++ b/vcl/unx/gtk/a11y/atkutil.cxx @@ -497,7 +497,7 @@ static void handle_toolbox_buttonchange(VclWindowEvent const *pEvent) /*****************************************************************************/ -static std::set< vcl::Window * > g_aWindowList; +static std::set< VclPtr<vcl::Window> > g_aWindowList; static void handle_get_focus(::VclWindowEvent const * pEvent) { diff --git a/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.cxx b/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.cxx index 6917596f473d..b9a2751fc4aa 100644 --- a/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.cxx +++ b/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.cxx @@ -107,9 +107,9 @@ namespace cairo mpGraphics->WidgetQueueDraw(); } - boost::shared_ptr<VirtualDevice> Gtk3Surface::createVirtualDevice() const + VclPtr<VirtualDevice> Gtk3Surface::createVirtualDevice() const { - return boost::shared_ptr<VirtualDevice>(new VirtualDevice(NULL, Size(1, 1), 0)); + return VclPtrInstance<VirtualDevice>(nullptr, Size(1, 1), 0); } } diff --git a/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.hxx b/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.hxx index dee313f526ee..5bb12eaf2eca 100644 --- a/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.hxx +++ b/vcl/unx/gtk3/gdi/cairo_gtk3_cairo.hxx @@ -37,7 +37,7 @@ namespace cairo { virtual CairoSurfaceSharedPtr getCairoSurface() const SAL_OVERRIDE { return mpSurface; } virtual SurfaceSharedPtr getSimilar(int nContentType, int width, int height) const SAL_OVERRIDE; - virtual boost::shared_ptr<VirtualDevice> createVirtualDevice() const SAL_OVERRIDE; + virtual VclPtr<VirtualDevice> createVirtualDevice() const SAL_OVERRIDE; virtual void flush() const SAL_OVERRIDE; diff --git a/vcl/unx/x11/x11sys.cxx b/vcl/unx/x11/x11sys.cxx index 5882fdb0589d..6723c63b8047 100644 --- a/vcl/unx/x11/x11sys.cxx +++ b/vcl/unx/x11/x11sys.cxx @@ -134,19 +134,19 @@ int X11SalSystem::ShowNativeDialog( const OUString& rTitle, const OUString& rMes if( pSVData->mpIntroWindow ) pSVData->mpIntroWindow->Hide(); - WarningBox aWarn( NULL, WB_STDWORK, rMessage ); - aWarn.SetText( rTitle ); - aWarn.Clear(); + ScopedVclPtrInstance<WarningBox> aWarn(nullptr, WB_STDWORK, rMessage); + aWarn->SetText( rTitle ); + aWarn->Clear(); sal_uInt16 nButton = 0; for( std::list< OUString >::const_iterator it = rButtons.begin(); it != rButtons.end(); ++it ) { - aWarn.AddButton( *it, nButton+1, nButton == (sal_uInt16)nDefButton ? BUTTONDIALOG_DEFBUTTON : 0 ); + aWarn->AddButton( *it, nButton+1, nButton == (sal_uInt16)nDefButton ? BUTTONDIALOG_DEFBUTTON : 0 ); nButton++; } - aWarn.SetFocusButton( (sal_uInt16)nDefButton+1 ); + aWarn->SetFocusButton( (sal_uInt16)nDefButton+1 ); - nRet = ((int)aWarn.Execute()) - 1; + nRet = ((int)aWarn->Execute()) - 1; // normalize behaviour, actually this should never happen if( nRet < -1 || nRet >= int(rButtons.size()) ) diff --git a/vcl/win/source/gdi/cairo_win32_cairo.cxx b/vcl/win/source/gdi/cairo_win32_cairo.cxx index 9cf81c7002de..65dd478bd1dc 100644 --- a/vcl/win/source/gdi/cairo_win32_cairo.cxx +++ b/vcl/win/source/gdi/cairo_win32_cairo.cxx @@ -170,14 +170,12 @@ namespace cairo * * @return The new virtual device **/ - boost::shared_ptr<VirtualDevice> Win32Surface::createVirtualDevice() const + VclPtr<VirtualDevice> Win32Surface::createVirtualDevice() const { SystemGraphicsData aSystemGraphicsData; - aSystemGraphicsData.nSize = sizeof(SystemGraphicsData); + aSystemGraphicsData.nSize = sizeof( SystemGraphicsData ); aSystemGraphicsData.hDC = cairo_win32_surface_get_dc( mpSurface.get() ); - - return boost::shared_ptr<VirtualDevice>( - new VirtualDevice( &aSystemGraphicsData, Size(1, 1), sal::static_int_cast<USHORT>(getDepth()) )); + return VclPtr<VirtualDevice>::Create( &aSystemGraphicsData, Size(1, 1), sal::static_int_cast<USHORT>( getDepth() ) ); } } // namespace cairo diff --git a/vcl/win/source/gdi/cairo_win32_cairo.hxx b/vcl/win/source/gdi/cairo_win32_cairo.hxx index dd1be37db7dd..5dee0eaa3dd8 100644 --- a/vcl/win/source/gdi/cairo_win32_cairo.hxx +++ b/vcl/win/source/gdi/cairo_win32_cairo.hxx @@ -43,7 +43,7 @@ namespace cairo { virtual CairoSurfaceSharedPtr getCairoSurface() const { return mpSurface; } virtual SurfaceSharedPtr getSimilar( int aContent, int width, int height ) const; - virtual boost::shared_ptr<VirtualDevice> createVirtualDevice() const; + virtual VclPtr<VirtualDevice> createVirtualDevice() const; virtual void flush() const; diff --git a/vcl/workben/icontest.cxx b/vcl/workben/icontest.cxx index 3710a16ce152..cef8ac6755c8 100644 --- a/vcl/workben/icontest.cxx +++ b/vcl/workben/icontest.cxx @@ -71,10 +71,11 @@ protected: public: Graphic maGraphic; Bitmap *mpBitmap; - FixedBitmap *mpFixedBitmap; + VclPtr<FixedBitmap> mpFixedBitmap; MyWorkWindow( vcl::Window* pParent, WinBits nWinStyle ); - + virtual ~MyWorkWindow() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE { mpFixedBitmap.clear(); WorkWindow::dispose(); } void LoadGraphic( const OUString& sImageFile ); virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; @@ -185,12 +186,12 @@ void IconTestApp::DoItWithVcl( const OUString& sImageFile) { try { - MyWorkWindow *pWindow = new MyWorkWindow( NULL, WB_APP | WB_STDWORK | WB_SIZEABLE | WB_CLOSEABLE | WB_CLIPCHILDREN ); + VclPtrInstance<MyWorkWindow> pWindow( nullptr, WB_APP | WB_STDWORK | WB_SIZEABLE | WB_CLOSEABLE | WB_CLIPCHILDREN ); pWindow->SetText(OUString("VCL Image Test")); pWindow->LoadGraphic( sImageFile ); - pWindow->mpFixedBitmap = new FixedBitmap( pWindow ); + pWindow->mpFixedBitmap = VclPtr<FixedBitmap>::Create( pWindow ); pWindow->mpFixedBitmap->SetPosPixel( Point( 0, 0 ) ); pWindow->mpFixedBitmap->Show(); diff --git a/vcl/workben/mtfdemo.cxx b/vcl/workben/mtfdemo.cxx index 4f65b0ff12ce..05ab64430972 100644 --- a/vcl/workben/mtfdemo.cxx +++ b/vcl/workben/mtfdemo.cxx @@ -67,7 +67,7 @@ void DemoMtfWin::Paint( const Rectangle& rRect ) class DemoMtfApp : public Application { - DemoMtfWin *mpWin; + VclPtr<DemoMtfWin> mpWin; OUString maFileName; void showHelp() @@ -88,7 +88,7 @@ public: { try { - mpWin = new DemoMtfWin(maFileName); + mpWin = VclPtr<DemoMtfWin>::Create(maFileName); mpWin->SetText(OUString("Display metafile")); mpWin->Show(); diff --git a/vcl/workben/outdevgrind.cxx b/vcl/workben/outdevgrind.cxx index 528eae381abb..da14e1aac673 100644 --- a/vcl/workben/outdevgrind.cxx +++ b/vcl/workben/outdevgrind.cxx @@ -72,7 +72,6 @@ class TestWindow : public Dialog Show(); } - virtual ~TestWindow() {} virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; }; @@ -899,8 +898,8 @@ sal_uInt16 GrindApp::Exception( sal_uInt16 nError ) int GrindApp::Main() { - TestWindow aWindow; - aWindow.Execute(); + ScopedVclPtrInstance<TestWindow> aWindow; + aWindow->Execute(); return 0; } diff --git a/vcl/workben/svdem.cxx b/vcl/workben/svdem.cxx index a06bf5cc13d7..e349934a5af1 100644 --- a/vcl/workben/svdem.cxx +++ b/vcl/workben/svdem.cxx @@ -81,9 +81,9 @@ public: void Main() { - MyWin aMainWin( NULL, WB_APP | WB_STDWORK ); - aMainWin.SetText(OUString("VCL - Workbench")); - aMainWin.Show(); + ScopedVclPtrInstance< MyWin > aMainWin( nullptr, WB_APP | WB_STDWORK ); + aMainWin->SetText(OUString("VCL - Workbench")); + aMainWin->Show(); Application::Execute(); } diff --git a/vcl/workben/svpclient.cxx b/vcl/workben/svpclient.cxx index 2ed9ac302368..01ad3e9d5f08 100644 --- a/vcl/workben/svpclient.cxx +++ b/vcl/workben/svpclient.cxx @@ -92,10 +92,10 @@ SAL_IMPLEMENT_MAIN() class MyWin : public WorkWindow { - PushButton m_aListButton; - ListBox m_aSvpBitmaps; - ImageControl m_aImage; - PushButton m_aQuitButton; + VclPtr<PushButton> m_aListButton; + VclPtr<ListBox> m_aSvpBitmaps; + VclPtr<ImageControl> m_aImage; + VclPtr<PushButton> m_aQuitButton; public: MyWin( vcl::Window* pParent, WinBits nWinStyle ); @@ -108,6 +108,8 @@ public: virtual void Resize() SAL_OVERRIDE; virtual bool Close() SAL_OVERRIDE; + virtual ~MyWin() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE; void parseList( const OString& rList ); OString processCommand( const OString& rCommand ); @@ -119,37 +121,37 @@ public: void Main() { - MyWin aMainWin( NULL, WB_STDWORK ); - aMainWin.SetText( OUString( "SvpClient" ) ); - aMainWin.Show(); + ScopedVclPtrInstance< MyWin > aMainWin( nullptr, WB_STDWORK ); + aMainWin->SetText( OUString( "SvpClient" ) ); + aMainWin->Show(); Application::Execute(); } MyWin::MyWin( vcl::Window* pParent, WinBits nWinStyle ) : WorkWindow( pParent, nWinStyle ), - m_aListButton( this, 0 ), - m_aSvpBitmaps( this, WB_BORDER ), - m_aImage( this, WB_BORDER ), - m_aQuitButton( this, 0 ) + m_aListButton(VclPtr<PushButton>::Create(this, 0)), + m_aSvpBitmaps(VclPtr<ListBox>::Create(this, WB_BORDER)), + m_aImage(VclPtr<ImageControl>::Create(this, WB_BORDER)), + m_aQuitButton(VclPtr<PushButton>::Create(this, 0)) { - m_aListButton.SetPosSizePixel( Point( 10, 10 ), Size( 120, 25 ) ); - m_aListButton.SetText( OUString( "List Elements" ) ); - m_aListButton.SetClickHdl( LINK( this, MyWin, ListHdl ) ); - m_aListButton.Show(); - - m_aSvpBitmaps.SetPosSizePixel( Point( 10, 40 ), Size( 150, 150 ) ); - m_aSvpBitmaps.SetSelectHdl( LINK( this, MyWin, SelectHdl ) ); - m_aSvpBitmaps.Show(); - - m_aImage.SetPosSizePixel( Point( 170, 10 ), Size( 400, 400 ) ); - m_aImage.SetScaleMode( com::sun::star::awt::ImageScaleMode::NONE ); - m_aImage.Show(); - - m_aQuitButton.SetPosSizePixel( Point( 10, 300 ), Size( 120,25 ) ); - m_aQuitButton.SetText( OUString( "Quit SVP server" ) ); - m_aQuitButton.SetClickHdl( LINK( this, MyWin, QuitHdl ) ); - m_aQuitButton.Show(); + m_aListButton->SetPosSizePixel( Point( 10, 10 ), Size( 120, 25 ) ); + m_aListButton->SetText( OUString( "List Elements" ) ); + m_aListButton->SetClickHdl( LINK( this, MyWin, ListHdl ) ); + m_aListButton->Show(); + + m_aSvpBitmaps->SetPosSizePixel( Point( 10, 40 ), Size( 150, 150 ) ); + m_aSvpBitmaps->SetSelectHdl( LINK( this, MyWin, SelectHdl ) ); + m_aSvpBitmaps->Show(); + + m_aImage->SetPosSizePixel( Point( 170, 10 ), Size( 400, 400 ) ); + m_aImage->SetScaleMode( com::sun::star::awt::ImageScaleMode::NONE ); + m_aImage->Show(); + + m_aQuitButton->SetPosSizePixel( Point( 10, 300 ), Size( 120,25 ) ); + m_aQuitButton->SetText( OUString( "Quit SVP server" ) ); + m_aQuitButton->SetClickHdl( LINK( this, MyWin, QuitHdl ) ); + m_aQuitButton->Show(); } bool MyWin::Close() @@ -160,11 +162,20 @@ bool MyWin::Close() return bRet; } +void MyWin::dispose() +{ + m_aListButton.disposeAndClear(); + m_aSvpBitmaps.disposeAndClear(); + m_aImage.disposeAndClear(); + m_aQuitButton.disposeAndClear(); + WorkWindow::dispose(); +} + void MyWin::parseList( const OString& rList ) { sal_Int32 nTokenPos = 0; OUString aElementType; - m_aSvpBitmaps.Clear(); + m_aSvpBitmaps->Clear(); while( nTokenPos >= 0 ) { OString aLine = rList.getToken( 0, '\n', nTokenPos ); @@ -179,7 +190,7 @@ void MyWin::parseList( const OString& rList ) aNewElement.append( aElementType ); aNewElement.appendAscii( ": " ); aNewElement.append( OStringToOUString( aLine, RTL_TEXTENCODING_ASCII_US ) ); - m_aSvpBitmaps.InsertEntry( aNewElement.makeStringAndClear() ); + m_aSvpBitmaps->InsertEntry( aNewElement.makeStringAndClear() ); } } } @@ -235,7 +246,7 @@ IMPL_LINK( MyWin, QuitHdl, Button*, ) IMPL_LINK( MyWin, SelectHdl, ListBox*, ) { - OUString aEntry = m_aSvpBitmaps.GetSelectEntry(); + OUString aEntry = m_aSvpBitmaps->GetSelectEntry(); sal_Int32 nPos = aEntry.indexOf( ": " ); if( nPos != -1 ) { @@ -259,8 +270,8 @@ IMPL_LINK( MyWin, SelectHdl, ListBox*, ) Size aFixedSize( aBitmap.GetSizePixel() ); aFixedSize.Width() += 10; aFixedSize.Height() += 10; - m_aImage.SetSizePixel( aFixedSize ); - m_aImage.SetImage( Image( BitmapEx( aBitmap ) ) ); + m_aImage->SetSizePixel( aFixedSize ); + m_aImage->SetImage( Image( BitmapEx( aBitmap ) ) ); } return 0; } diff --git a/vcl/workben/svptest.cxx b/vcl/workben/svptest.cxx index ebf716c3abd1..ac2c5527a8e0 100644 --- a/vcl/workben/svptest.cxx +++ b/vcl/workben/svptest.cxx @@ -34,6 +34,7 @@ #include <vcl/bitmap.hxx> #include <vcl/bmpacc.hxx> #include <vcl/metric.hxx> +#include <vcl/vclptr.hxx> #include <rtl/ustrbuf.hxx> @@ -90,9 +91,9 @@ public: void Main() { - MyWin aMainWin( NULL, WB_APP | WB_STDWORK ); - aMainWin.SetText( OUString( "VCL - Workbench" ) ); - aMainWin.Show(); + ScopedVclPtrInstance< MyWin > aMainWin( nullptr, WB_APP | WB_STDWORK ); + aMainWin->SetText( OUString( "VCL - Workbench" ) ); + aMainWin->Show(); Application::Execute(); } diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx index f272ccbb88c4..4f42f9353445 100644 --- a/vcl/workben/vcldemo.cxx +++ b/vcl/workben/vcldemo.cxx @@ -774,12 +774,12 @@ public: void SizeAndRender(OutputDevice &rDev, const Rectangle& r, RenderType eType, const RenderContext &rCtx) { - VirtualDevice *pNested; + ScopedVclPtr<VirtualDevice> pNested; if ((int)eType < RENDER_AS_BITMAPEX) - pNested = new VirtualDevice(rDev); + pNested = VclPtr<VirtualDevice>::Create(rDev).get(); else - pNested = new VirtualDevice(rDev,0,0); + pNested = VclPtr<VirtualDevice>::Create(rDev,0,0).get(); pNested->SetOutputSizePixel(r.GetSize()); Rectangle aWhole(Point(0,0), r.GetSize()); @@ -804,7 +804,6 @@ public: aWhole.TopLeft(), aWhole.GetSize(), *pNested); } - delete pNested; } virtual void RenderRegion(OutputDevice &rDev, Rectangle r, const RenderContext &rCtx) SAL_OVERRIDE @@ -945,19 +944,20 @@ public: BitmapEx AlphaRecovery(OutputDevice &rDev, Point aPt, BitmapEx &aSrc) { // Compositing onto 2x colors beyond our control - VirtualDevice aWhite, aBlack; - aWhite.SetOutputSizePixel(aSrc.GetSizePixel()); - aWhite.SetBackground(Wallpaper(COL_WHITE)); - aWhite.Erase(); - aBlack.SetOutputSizePixel(aSrc.GetSizePixel()); - aBlack.SetBackground(Wallpaper(COL_BLACK)); - aBlack.Erase(); - aWhite.DrawBitmapEx(Point(), aSrc); - aBlack.DrawBitmapEx(Point(), aSrc); + ScopedVclPtrInstance< VirtualDevice > aWhite; + ScopedVclPtrInstance< VirtualDevice > aBlack; + aWhite->SetOutputSizePixel(aSrc.GetSizePixel()); + aWhite->SetBackground(Wallpaper(COL_WHITE)); + aWhite->Erase(); + aBlack->SetOutputSizePixel(aSrc.GetSizePixel()); + aBlack->SetBackground(Wallpaper(COL_BLACK)); + aBlack->Erase(); + aWhite->DrawBitmapEx(Point(), aSrc); + aBlack->DrawBitmapEx(Point(), aSrc); // Now recover that alpha... - Bitmap aWhiteBmp = aWhite.GetBitmap(Point(),aSrc.GetSizePixel()); - Bitmap aBlackBmp = aBlack.GetBitmap(Point(),aSrc.GetSizePixel()); + Bitmap aWhiteBmp = aWhite->GetBitmap(Point(),aSrc.GetSizePixel()); + Bitmap aBlackBmp = aBlack->GetBitmap(Point(),aSrc.GetSizePixel()); AlphaMask aMask(aSrc.GetSizePixel()); Bitmap aRecovered(aSrc.GetSizePixel(), 24); { @@ -1133,12 +1133,11 @@ public: } } } - std::vector<vcl::Window *> maInvalidates; + std::vector<VclPtr<vcl::Window> > maInvalidates; void addInvalidate(vcl::Window *pWindow) { maInvalidates.push_back(pWindow); }; void removeInvalidate(vcl::Window *pWindow) { - std::vector<vcl::Window *>::iterator aIt; - for (aIt = maInvalidates.begin(); aIt != maInvalidates.end(); ++aIt) + for (auto aIt = maInvalidates.begin(); aIt != maInvalidates.end(); ++aIt) { if (*aIt == pWindow) { @@ -1231,8 +1230,8 @@ bool DemoRenderer::MouseButtonDown(const MouseEvent& rMEvt) // otherwise bounce floating windows if (!mpButton) { - mpButtonWin = new FloatingWindow(this); - mpButton = new PushButton(mpButtonWin); + mpButtonWin = VclPtr<FloatingWindow>::Create(this); + mpButton = VclPtr<PushButton>::Create(mpButtonWin); mpButton->SetSymbol(SymbolType::HELP); mpButton->SetText("PushButton demo"); mpButton->SetPosSizePixel(Point(0,0), mpButton->GetOptimalSize()); @@ -1385,8 +1384,13 @@ public: } virtual ~DemoWin() { + disposeOnce(); + } + virtual void dispose() SAL_OVERRIDE + { mxThread.clear(); mrRenderer.removeInvalidate(this); + WorkWindow::dispose(); } virtual void MouseButtonDown(const MouseEvent& rMEvt) SAL_OVERRIDE { @@ -1402,7 +1406,7 @@ public: } else { // spawn another window - DemoWin *pNewWin = new DemoWin(mrRenderer, testThreads); + VclPtrInstance<DemoWin> pNewWin(mrRenderer, testThreads); pNewWin->SetText("Another interactive VCL demo window"); pNewWin->Show(); } @@ -1445,16 +1449,16 @@ public: class DemoWidgets : public WorkWindow { - VclBox *mpBox; - ToolBox *mpToolbox; - PushButton *mpButton; + VclPtr<VclBox> mpBox; + VclPtr<ToolBox> mpToolbox; + VclPtr<PushButton> mpButton; public: DemoWidgets() : WorkWindow(NULL, WB_STDWORK), - mpBox(new VclVBox(this, false, 3)), - mpToolbox(new ToolBox(mpBox)), - mpButton(new PushButton(mpBox)) + mpBox(VclPtrInstance<VclVBox>(this, false, 3)), + mpToolbox(VclPtrInstance<ToolBox>(mpBox.get())), + mpButton(VclPtrInstance<PushButton>(mpBox.get())) { SetText("VCL widget demo"); @@ -1477,14 +1481,14 @@ public: Show(); } - - virtual ~DemoWidgets() + virtual ~DemoWidgets() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE { - delete mpButton; - delete mpToolbox; - delete mpBox; + mpBox.disposeAndClear(); + mpToolbox.disposeAndClear(); + mpButton.disposeAndClear(); + WorkWindow::dispose(); } - virtual void Paint(const Rectangle&) SAL_OVERRIDE { Rectangle aWholeSize(Point(0, 0),GetOutputSizePixel()); @@ -1499,16 +1503,16 @@ public: DrawWallpaper(aWholeSize, aWallpaper); Pop(); - VirtualDevice aDev(*this); - aDev.EnableRTL(IsRTLEnabled()); - aDev.SetOutputSizePixel(aExclude.GetSize()); + ScopedVclPtrInstance< VirtualDevice > pDev(*this); + pDev->EnableRTL(IsRTLEnabled()); + pDev->SetOutputSizePixel(aExclude.GetSize()); Rectangle aSubRect(aWholeSize); aSubRect.Move(-aExclude.Left(), -aExclude.Top()); - aDev.DrawWallpaper(aSubRect, aWallpaper ); + pDev->DrawWallpaper(aSubRect, aWallpaper ); DrawOutDev(aExclude.TopLeft(), aExclude.GetSize(), - Point( 0, 0 ), aExclude.GetSize(), aDev ); + Point( 0, 0 ), aExclude.GetSize(), *pDev.get() ); } }; @@ -1612,20 +1616,23 @@ public: } } - DemoWin aMainWin(aRenderer, bThreads); - std::unique_ptr<DemoWidgets> xWidgets; - std::unique_ptr<DemoPopup> xPopup; + ScopedVclPtrInstance<DemoWin> aMainWin(aRenderer, bThreads); + VclPtr<DemoWidgets> xWidgets; + VclPtr<DemoPopup> xPopup; - aMainWin.SetText("Interactive VCL demo #1"); + aMainWin->SetText("Interactive VCL demo #1"); if (bWidgets) - xWidgets.reset(new DemoWidgets()); + xWidgets = VclPtr< DemoWidgets >::Create (); else if (bPopup) - xPopup.reset(new DemoPopup()); + xPopup = VclPtrInstance< DemoPopup> (); else - aMainWin.Show(); + aMainWin->Show(); Application::Execute(); + + xWidgets.disposeAndClear(); + xPopup.disposeAndClear(); } catch (const css::uno::Exception& e) { |