include/sfx2/ctrlitem.hxx | 1 include/sfx2/sidebar/ControllerItem.hxx | 3 ++ sc/source/ui/sidebar/AlignmentPropertyPanel.cxx | 8 ++++++ sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx | 8 ++++++ sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx | 4 +++ sfx2/source/control/ctrlitem.cxx | 9 +++++-- sfx2/source/sidebar/ControllerItem.cxx | 8 ++++++ sfx2/source/sidebar/Deck.cxx | 15 ++++++++++++ sfx2/source/sidebar/Deck.hxx | 2 - sfx2/source/sidebar/SidebarController.cxx | 22 +++++++------------ svx/source/sidebar/area/AreaPropertyPanel.cxx | 12 ++++++++++ svx/source/sidebar/graphic/GraphicPropertyPanel.cxx | 10 ++++++++ svx/source/sidebar/line/LinePropertyPanel.cxx | 12 ++++++++++ svx/source/sidebar/paragraph/ParaPropertyPanel.cxx | 9 +++++++ svx/source/sidebar/possize/PosSizePropertyPanel.cxx | 15 ++++++++++++ svx/source/sidebar/text/TextPropertyPanel.cxx | 5 ++++ sw/source/uibase/sidebar/PagePropertyPanel.cxx | 11 +++++++++ sw/source/uibase/sidebar/WrapPropertyPanel.cxx | 8 ++++++ 18 files changed, 144 insertions(+), 18 deletions(-)
New commits: commit d3d2453432a59fbba3a8f8c44260982bf67ec939 Author: Michael Meeks <michael.me...@collabora.com> Date: Wed Apr 15 21:56:23 2015 +0100 Unregister sidebar ControllerItems at the right time. Otherwise they linger post-dispose, wreaking havoc. Change-Id: I6d0981ee15e82111bc825c75d28b703e5a5d266b diff --git a/include/sfx2/ctrlitem.hxx b/include/sfx2/ctrlitem.hxx index aa38dc0..24f64d9 100644 --- a/include/sfx2/ctrlitem.hxx +++ b/include/sfx2/ctrlitem.hxx @@ -56,6 +56,7 @@ public: SfxControllerItem(); // for arrays SfxControllerItem( sal_uInt16 nId, SfxBindings & ); virtual ~SfxControllerItem(); + virtual void dispose(); void Bind( sal_uInt16 nNewId, SfxBindings * = 0); // Register in SfxBindings void UnBind(); diff --git a/include/sfx2/sidebar/ControllerItem.hxx b/include/sfx2/sidebar/ControllerItem.hxx index f06ae5e..025106e 100644 --- a/include/sfx2/sidebar/ControllerItem.hxx +++ b/include/sfx2/sidebar/ControllerItem.hxx @@ -80,6 +80,9 @@ public: SfxBindings &rBindings, ItemUpdateReceiverInterface& rItemUpdateReceiver); + /// releases our action listener + virtual void dispose() SAL_OVERRIDE; + virtual ~ControllerItem(); /** Returns </TRUE> when the slot/command has not been disabled. diff --git a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx index 75d054c..c9d7d4af 100644 --- a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx +++ b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx @@ -81,6 +81,14 @@ void AlignmentPropertyPanel::dispose() mpCtrlDial.clear(); mpMtrAngle.clear(); mpCbStacked.clear(); + + maAlignHorControl.dispose(); + maLeftIndentControl.dispose(); + maMergeCellControl.dispose(); + maWrapTextControl.dispose(); + maAngleControl.dispose(); + maStackControl.dispose(); + PanelLayout::dispose(); } diff --git a/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx b/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx index 4410c79..5dae73b 100644 --- a/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx +++ b/sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx @@ -151,6 +151,14 @@ void CellAppearancePropertyPanel::dispose() mpTBLineStyle.clear(); mpTBLineColor.clear(); mpCBXShowGrid.clear(); + + maLineStyleControl.dispose(); + maBorderOuterControl.dispose(); + maBorderInnerControl.dispose(); + maGridShowControl.dispose(); + maBorderTLBRControl.dispose(); + maBorderBLTRControl.dispose(); + PanelLayout::dispose(); } diff --git a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx index 6efc79d..035b65b 100644 --- a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx +++ b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx @@ -81,6 +81,10 @@ void NumberFormatPropertyPanel::dispose() mpEdLeadZeroes.clear(); mpBtnNegRed.clear(); mpBtnThousand.clear(); + + maNumFormatControl.dispose(); + maFormatControl.dispose(); + PanelLayout::dispose(); } diff --git a/sfx2/source/control/ctrlitem.cxx b/sfx2/source/control/ctrlitem.cxx index c1fa162..0be5e36 100644 --- a/sfx2/source/control/ctrlitem.cxx +++ b/sfx2/source/control/ctrlitem.cxx @@ -218,16 +218,19 @@ SfxControllerItem::SfxControllerItem( sal_uInt16 nID, SfxBindings &rBindings ): } -// unregisteres the item in the bindings +// unregisters the item in the bindings SfxControllerItem::~SfxControllerItem() { + dispose(); +} + +void SfxControllerItem::dispose() +{ if ( IsBound() ) pBindings->Release(*this); } - - void SfxControllerItem::StateChanged ( sal_uInt16, // <SID> of the triggering slot diff --git a/sfx2/source/sidebar/ControllerItem.cxx b/sfx2/source/sidebar/ControllerItem.cxx index db7f155..b91c383 100644 --- a/sfx2/source/sidebar/ControllerItem.cxx +++ b/sfx2/source/sidebar/ControllerItem.cxx @@ -117,8 +117,16 @@ ControllerItem::ControllerItem ( ControllerItem::~ControllerItem (void) { + dispose(); +} + +void ControllerItem::dispose() +{ if (mxFrameActionListener.is()) mxFrameActionListener->dispose(); + mxFrameActionListener.clear(); + + SfxControllerItem::dispose(); } void ControllerItem::StateChanged ( diff --git a/svx/source/sidebar/area/AreaPropertyPanel.cxx b/svx/source/sidebar/area/AreaPropertyPanel.cxx index bc731f9..2232e5f2 100644 --- a/svx/source/sidebar/area/AreaPropertyPanel.cxx +++ b/svx/source/sidebar/area/AreaPropertyPanel.cxx @@ -128,6 +128,18 @@ void AreaPropertyPanel::dispose() mpLBTransType.clear(); mpMTRTransparent.clear(); mpBTNGradient.clear(); + + maStyleControl.dispose(); + maColorControl.dispose(); + maGradientControl.dispose(); + maHatchControl.dispose(); + maBitmapControl.dispose(); + maGradientListControl.dispose(); + maHatchListControl.dispose(); + maBitmapListControl.dispose(); + maFillTransparenceController.dispose(); + maFillFloatTransparenceController.dispose(); + PanelLayout::dispose(); } diff --git a/svx/source/sidebar/graphic/GraphicPropertyPanel.cxx b/svx/source/sidebar/graphic/GraphicPropertyPanel.cxx index 933b5f3..d048416 100644 --- a/svx/source/sidebar/graphic/GraphicPropertyPanel.cxx +++ b/svx/source/sidebar/graphic/GraphicPropertyPanel.cxx @@ -81,6 +81,16 @@ void GraphicPropertyPanel::dispose() mpMtrGreen.clear(); mpMtrBlue.clear(); mpMtrGamma.clear(); + + maBrightControl.dispose(); + maContrastControl.dispose(); + maTransparenceControl.dispose(); + maRedControl.dispose(); + maGreenControl.dispose(); + maBlueControl.dispose(); + maGammaControl.dispose(); + maModeControl.dispose(); + PanelLayout::dispose(); } diff --git a/svx/source/sidebar/line/LinePropertyPanel.cxx b/svx/source/sidebar/line/LinePropertyPanel.cxx index 12b0f33..f05c92a 100644 --- a/svx/source/sidebar/line/LinePropertyPanel.cxx +++ b/svx/source/sidebar/line/LinePropertyPanel.cxx @@ -212,6 +212,18 @@ void LinePropertyPanel::dispose() mpLBEdgeStyle.clear(); mpFTCapStyle.clear(); mpLBCapStyle.clear(); + + maStyleControl.dispose(); + maDashControl.dispose(); + maWidthControl.dispose(); + maStartControl.dispose(); + maEndControl.dispose(); + maLineEndListControl.dispose(); + maLineStyleListControl.dispose(); + maTransControl.dispose(); + maEdgeStyle.dispose(); + maCapStyle.dispose(); + PanelLayout::dispose(); } diff --git a/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx b/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx index 8ba3f99..7dfb3f6 100644 --- a/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx +++ b/svx/source/sidebar/paragraph/ParaPropertyPanel.cxx @@ -765,6 +765,15 @@ void ParaPropertyPanel::dispose() mpLeftIndent.clear(); mpRightIndent.clear(); mpFLineIndent.clear(); + + maLRSpaceControl.dispose(); + maULSpaceControl.dispose(); + maOutLineLeftControl.dispose(); + maOutLineRightControl.dispose(); + maDecIndentControl.dispose(); + maIncIndentControl.dispose(); + m_aMetricCtl.dispose(); + PanelLayout::dispose(); } diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx index b352332..c9684c6 100644 --- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx +++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx @@ -136,6 +136,21 @@ void PosSizePropertyPanel::dispose() mpDial.clear(); mpFtFlip.clear(); mpFlipTbx.clear(); + + maTransfPosXControl.dispose(); + maTransfPosYControl.dispose(); + maTransfWidthControl.dispose(); + maTransfHeightControl.dispose(); + + maSvxAngleControl.dispose(); + maRotXControl.dispose(); + maRotYControl.dispose(); + maProPosControl.dispose(); + maProSizeControl.dispose(); + maAutoWidthControl.dispose(); + maAutoHeightControl.dispose(); + m_aMetricCtl.dispose(); + PanelLayout::dispose(); } diff --git a/svx/source/sidebar/text/TextPropertyPanel.cxx b/svx/source/sidebar/text/TextPropertyPanel.cxx index 57ebb7d..af7c2b6 100644 --- a/svx/source/sidebar/text/TextPropertyPanel.cxx +++ b/svx/source/sidebar/text/TextPropertyPanel.cxx @@ -128,6 +128,11 @@ void TextPropertyPanel::dispose() mpToolBoxSpacing.clear(); mpToolBoxFontColorSw.clear(); mpToolBoxFontColor.clear(); + + maFontSizeControl.dispose(); + maUnderlineControl.dispose(); + maSpacingControl.dispose(); + PanelLayout::dispose(); } diff --git a/sw/source/uibase/sidebar/PagePropertyPanel.cxx b/sw/source/uibase/sidebar/PagePropertyPanel.cxx index 53fd3af..d35ac67 100644 --- a/sw/source/uibase/sidebar/PagePropertyPanel.cxx +++ b/sw/source/uibase/sidebar/PagePropertyPanel.cxx @@ -221,6 +221,14 @@ void PagePropertyPanel::dispose() mpToolBoxMargin.clear(); mpToolBoxSize.clear(); mpToolBoxColumn.clear(); + + m_aSwPagePgULControl.dispose(); + m_aSwPagePgLRControl.dispose(); + m_aSwPagePgSizeControl.dispose(); + m_aSwPagePgControl.dispose(); + m_aSwPageColControl.dispose(); + m_aSwPagePgMetricControl.dispose(); + PanelLayout::dispose(); } @@ -482,6 +490,9 @@ void PagePropertyPanel::NotifyItemUpdate( { (void)bIsEnabled; + if (IsDisposed()) + return; + switch( nSId ) { case SID_ATTR_PAGE_COLUMN: diff --git a/sw/source/uibase/sidebar/WrapPropertyPanel.cxx b/sw/source/uibase/sidebar/WrapPropertyPanel.cxx index 39f68c3..a388d42 100644 --- a/sw/source/uibase/sidebar/WrapPropertyPanel.cxx +++ b/sw/source/uibase/sidebar/WrapPropertyPanel.cxx @@ -102,6 +102,14 @@ void WrapPropertyPanel::dispose() mpRBWrapParallel.clear(); mpRBWrapThrough.clear(); mpRBIdealWrap.clear(); + + maSwNoWrapControl.dispose(); + maSwWrapLeftControl.dispose(); + maSwWrapRightControl.dispose(); + maSwWrapParallelControl.dispose(); + maSwWrapThroughControl.dispose(); + maSwWrapIdealControl.dispose(); + PanelLayout::dispose(); } commit 389d3e6f01264b8d94b0f40cd8faecc4c954a838 Author: Michael Meeks <michael.me...@collabora.com> Date: Wed Apr 15 21:41:43 2015 +0100 Properly dispose old sidebar Panels when we switch panel. Introduced in: "vclwidget: convert lots more sites to use VclPtr" Change-Id: I1a3741b8a0369a90d71885e9cbfa4a2b1408c410 diff --git a/sfx2/source/sidebar/Deck.cxx b/sfx2/source/sidebar/Deck.cxx index bbdac3e..ec1a127 100644 --- a/sfx2/source/sidebar/Deck.cxx +++ b/sfx2/source/sidebar/Deck.cxx @@ -202,8 +202,21 @@ bool Deck::ProcessWheelEvent(CommandEvent* pCommandEvent) return true; } -void Deck::SetPanels (const SharedPanelContainer& rPanels) +/** + * This container may contain existing panels that are + * being re-used, and new ones too. + */ +void Deck::ResetPanels (const SharedPanelContainer& rPanels) { + // First dispose old panels we no longer need. + for (size_t i = 0; i < maPanels.size(); i++) + { + bool bFound = false; + for (size_t j = 0; j < rPanels.size(); j++) + bFound = bFound || (maPanels[i].get() == rPanels[j].get()); + if (!bFound) // this one didn't survive. + maPanels[i].disposeAndClear(); + } maPanels = rPanels; RequestLayout(); diff --git a/sfx2/source/sidebar/Deck.hxx b/sfx2/source/sidebar/Deck.hxx index d4416ab..b2f35af 100644 --- a/sfx2/source/sidebar/Deck.hxx +++ b/sfx2/source/sidebar/Deck.hxx @@ -52,7 +52,7 @@ public: const ::rtl::OUString& GetId (void) const { return msId;} DeckTitleBar* GetTitleBar (void) const; Rectangle GetContentArea (void) const; - void SetPanels (const SharedPanelContainer& rPanels); + void ResetPanels (const SharedPanelContainer& rPanels); const SharedPanelContainer& GetPanels (void) const { return maPanels;} void RequestLayout (void); vcl::Window* GetPanelParentWindow (void); diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 35cf2a9..569ef73 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -527,7 +527,6 @@ void SidebarController::SwitchToDeck ( const bool bForceNewDeck ((mnRequestedForceFlags&SwitchFlag_ForceNewDeck)!=0); const bool bForceNewPanels ((mnRequestedForceFlags&SwitchFlag_ForceNewPanels)!=0); - mnRequestedForceFlags = SwitchFlag_NoForce; if ( ! msCurrentDeckId.equals(rDeckDescriptor.msId) || bForceNewDeck) @@ -593,7 +592,7 @@ void SidebarController::SwitchToDeck ( const sal_Int32 nNewPanelCount (aPanelContextDescriptors.size()); SharedPanelContainer aNewPanels; const SharedPanelContainer& rCurrentPanels (mpCurrentDeck->GetPanels()); - // FIXME: concerns wrt. dispose / lifecycle when we re-use panels here... + aNewPanels.resize(nNewPanelCount); sal_Int32 nWriteIndex (0); bool bHasPanelSetChanged (false); @@ -609,21 +608,18 @@ void SidebarController::SwitchToDeck ( // Find the corresponding panel among the currently active // panels. - SharedPanelContainer::const_iterator iPanel; - if (bForceNewPanels) - { - // All panels have to be created in any case. There is no - // point in searching already existing panels. - iPanel = rCurrentPanels.end(); - } - else + SharedPanelContainer::const_iterator iPanel = rCurrentPanels.end(); + + if (!bForceNewPanels) { iPanel = rCurrentPanels.end(); for (auto a = rCurrentPanels.begin(); a != rCurrentPanels.end(); ++a) { - iPanel = a; - if ((*iPanel)->HasIdPredicate(rPanelContexDescriptor.msId)) + if ((*a)->HasIdPredicate(rPanelContexDescriptor.msId)) + { + iPanel = a; break; + } } } if (iPanel != rCurrentPanels.end()) @@ -669,7 +665,7 @@ void SidebarController::SwitchToDeck ( mpParentWindow->GetSizePixel().Width()-TabBar::GetDefaultWidth() * mpTabBar->GetDPIScaleFactor(), mpParentWindow->GetSizePixel().Height()); - mpCurrentDeck->SetPanels(aNewPanels); + mpCurrentDeck->ResetPanels(aNewPanels); mpCurrentDeck->Show(); mpParentWindow->SetText(rDeckDescriptor.msTitle); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits