diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-05-07 14:37:18 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-05-07 16:07:57 +0100 |
commit | cfcfc5e9de192964bcd500743f58c8f1bacfec9c (patch) | |
tree | 75a3255c4e23e21bf29bc33893c114c83154d0be /vcl | |
parent | fc8c282e99450ae240ca3d16bb74e1d4ab541497 (diff) |
VclBuilder - use VclPtr more consistently internally.
Fixes a number of TabPage related leaks.
Change-Id: I7b904e9bbbce652d2dc645952e266cde102ed194
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/window/builder.cxx | 232 |
1 files changed, 112 insertions, 120 deletions
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index dc06f34a003f..d687b60a8940 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -901,7 +901,7 @@ namespace pButton->SetCommandHandler(aCommand); } - Button* extractStockAndBuildPushButton(vcl::Window *pParent, VclBuilder::stringmap &rMap) + VclPtr<Button> extractStockAndBuildPushButton(vcl::Window *pParent, VclBuilder::stringmap &rMap) { WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER; @@ -909,45 +909,45 @@ namespace bool bIsStock = extractStock(rMap); - Button *pWindow = NULL; + VclPtr<Button> xWindow; if (bIsStock) { OString sType = extractLabel(rMap); if (sType == "gtk-ok") - pWindow = new OKButton(pParent, nBits); + xWindow = VclPtr<OKButton>::Create(pParent, nBits); else if (sType == "gtk-cancel") - pWindow = new CancelButton(pParent, nBits); + xWindow = VclPtr<CancelButton>::Create(pParent, nBits); else if (sType == "gtk-close") - pWindow = new CloseButton(pParent, nBits); + xWindow = VclPtr<CloseButton>::Create(pParent, nBits); else if (sType == "gtk-help") - pWindow = new HelpButton(pParent, nBits); + xWindow = VclPtr<HelpButton>::Create(pParent, nBits); else { - pWindow = new PushButton(pParent, nBits); - pWindow->SetText(getStockText(sType)); + xWindow = VclPtr<PushButton>::Create(pParent, nBits); + xWindow->SetText(getStockText(sType)); } } - if (!pWindow) - pWindow = new PushButton(pParent, nBits); - return pWindow; + if (!xWindow) + xWindow = VclPtr<PushButton>::Create(pParent, nBits); + return xWindow; } - Button * extractStockAndBuildMenuButton(vcl::Window *pParent, VclBuilder::stringmap &rMap) + VclPtr<Button> extractStockAndBuildMenuButton(vcl::Window *pParent, VclBuilder::stringmap &rMap) { WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER|WB_3DLOOK; nBits |= extractRelief(rMap); - Button *pWindow = new MenuButton(pParent, nBits); + VclPtr<Button> xWindow = VclPtr<MenuButton>::Create(pParent, nBits); if (extractStock(rMap)) { - pWindow->SetText(getStockText(extractLabel(rMap))); + xWindow->SetText(getStockText(extractLabel(rMap))); } - return pWindow; + return xWindow; } OString extractUnit(const OString& sPattern) @@ -1285,7 +1285,7 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & if (!bIsPlaceHolder) { - TabPage* pPage = new TabPage(pTabControl); + VclPtrInstance<TabPage> pPage(pTabControl); pPage->Show(); //Make up a name for it @@ -1297,7 +1297,7 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & //And give the page one container as a child to make it a layout enabled //tab page - VclBin* pContainer = new VclBin(pPage); + VclPtrInstance<VclBin> pContainer(pPage); pContainer->Show(); m_aChildren.push_back(WinAndId(OString(), pContainer, false)); pContainer->SetHelpId(m_sHelpRoot + sTabPageId + OString("-bin")); @@ -1312,71 +1312,71 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & extractButtonImage(id, rMap, name == "GtkRadioButton"); - vcl::Window *pWindow = NULL; + VclPtr<vcl::Window> xWindow; if (name == "GtkDialog") { WinBits nBits = WB_CLIPCHILDREN|WB_MOVEABLE|WB_3DLOOK|WB_CLOSEABLE; if (extractResizable(rMap)) nBits |= WB_SIZEABLE; - pWindow = new Dialog(pParent, nBits); + xWindow = VclPtr<Dialog>::Create(pParent, nBits); } else if (name == "GtkMessageDialog") { WinBits nBits = WB_CLIPCHILDREN|WB_MOVEABLE|WB_3DLOOK|WB_CLOSEABLE; if (extractResizable(rMap)) nBits |= WB_SIZEABLE; - pWindow = new MessageDialog(pParent, nBits); + xWindow = VclPtr<MessageDialog>(new MessageDialog(pParent, nBits), SAL_NO_ACQUIRE); } else if (name == "GtkBox") { bVertical = extractOrientation(rMap); if (bVertical) - pWindow = new VclVBox(pParent); + xWindow = VclPtr<VclVBox>::Create(pParent); else - pWindow = new VclHBox(pParent); + xWindow = VclPtr<VclHBox>::Create(pParent); } else if (name == "GtkHBox") - pWindow = new VclHBox(pParent); + xWindow = VclPtr<VclHBox>::Create(pParent); else if (name == "GtkVBox") - pWindow = new VclVBox(pParent); + xWindow = VclPtr<VclVBox>::Create(pParent); else if (name == "GtkButtonBox") { bVertical = extractOrientation(rMap); if (bVertical) - pWindow = new VclVButtonBox(pParent); + xWindow = VclPtr<VclVButtonBox>::Create(pParent); else - pWindow = new VclHButtonBox(pParent); + xWindow = VclPtr<VclHButtonBox>::Create(pParent); } else if (name == "GtkHButtonBox") - pWindow = new VclHButtonBox(pParent); + xWindow = VclPtr<VclHButtonBox>::Create(pParent); else if (name == "GtkVButtonBox") - pWindow = new VclVButtonBox(pParent); + xWindow = VclPtr<VclVButtonBox>::Create(pParent); else if (name == "GtkGrid") - pWindow = new VclGrid(pParent); + xWindow = VclPtr<VclGrid>::Create(pParent); else if (name == "GtkFrame") - pWindow = new VclFrame(pParent); + xWindow = VclPtr<VclFrame>::Create(pParent); else if (name == "GtkExpander") { - VclExpander *pExpander = new VclExpander(pParent); + VclPtrInstance<VclExpander> pExpander(pParent); m_pParserState->m_aExpanderWidgets.push_back(pExpander); - pWindow = pExpander; + xWindow = pExpander; } else if (name == "GtkAlignment") - pWindow = new VclAlignment(pParent); + xWindow = VclPtr<VclAlignment>::Create(pParent); else if (name == "GtkButton") { - Button *pButton; + VclPtr<Button> xButton; OString sMenu = extractCustomProperty(rMap); if (sMenu.isEmpty()) - pButton = extractStockAndBuildPushButton(pParent, rMap); + xButton = extractStockAndBuildPushButton(pParent, rMap); else { - pButton = extractStockAndBuildMenuButton(pParent, rMap); + xButton = extractStockAndBuildMenuButton(pParent, rMap); m_pParserState->m_aButtonMenuMaps.push_back(ButtonMenuMap(id, sMenu)); } - pButton->SetImageAlign(IMAGEALIGN_LEFT); //default to left - setupFromActionName(pButton, rMap, m_xFrame); - pWindow = pButton; + xButton->SetImageAlign(IMAGEALIGN_LEFT); //default to left + setupFromActionName(xButton, rMap, m_xFrame); + xWindow = xButton; } else if (name == "GtkRadioButton") { @@ -1385,9 +1385,9 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & OString sWrap = extractCustomProperty(rMap); if (!sWrap.isEmpty()) nBits |= WB_WORDBREAK; - RadioButton *pButton = new RadioButton(pParent, nBits); - pButton->SetImageAlign(IMAGEALIGN_LEFT); //default to left - pWindow = pButton; + VclPtr<RadioButton> xButton = VclPtr<RadioButton>::Create(pParent, nBits); + xButton->SetImageAlign(IMAGEALIGN_LEFT); //default to left + xWindow = xButton; } else if (name == "GtkCheckButton") { @@ -1397,13 +1397,15 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & nBits |= WB_WORDBREAK; //maybe always import as TriStateBox and enable/disable tristate bool bIsTriState = extractInconsistent(rMap); - CheckBox *pCheckBox = bIsTriState ? - new TriStateBox(pParent, nBits) : - new CheckBox(pParent, nBits); + VclPtr<CheckBox> xCheckBox; if (bIsTriState) - pCheckBox->SetState(TRISTATE_INDET); - pCheckBox->SetImageAlign(IMAGEALIGN_LEFT); //default to left - pWindow = pCheckBox; + xCheckBox = VclPtr<TriStateBox>::Create(pParent, nBits); + else + xCheckBox = VclPtr<CheckBox>::Create(pParent, nBits); + if (bIsTriState) + xCheckBox->SetState(TRISTATE_INDET); + xCheckBox->SetImageAlign(IMAGEALIGN_LEFT); //default to left + xWindow = xCheckBox; } else if (name == "GtkSpinButton") { @@ -1419,7 +1421,7 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & { connectNumericFormatterAdjustment(id, sAdjustment); SAL_INFO("vcl.layout", "making numeric field for " << name.getStr() << " " << sUnit.getStr()); - pWindow = new NumericField(pParent, nBits); + xWindow = VclPtr<NumericField>::Create(pParent, nBits); } else { @@ -1427,31 +1429,29 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & { connectTimeFormatterAdjustment(id, sAdjustment); SAL_INFO("vcl.layout", "making time field for " << name.getStr() << " " << sUnit.getStr()); - TimeField *pField = new TimeField(pParent, nBits); - pWindow = pField; + xWindow = VclPtr<TimeField>::Create(pParent, nBits); } else if (sPattern == "yy:mm:dd") { connectDateFormatterAdjustment(id, sAdjustment); SAL_INFO("vcl.layout", "making date field for " << name.getStr() << " " << sUnit.getStr()); - DateField *pField = new DateField(pParent, nBits); - pWindow = pField; + xWindow = VclPtr<DateField>::Create(pParent, nBits); } else { connectNumericFormatterAdjustment(id, sAdjustment); FieldUnit eUnit = detectMetricUnit(sUnit); SAL_INFO("vcl.layout", "making metric field for " << name.getStr() << " " << sUnit.getStr()); - MetricField *pField = new MetricField(pParent, nBits); - pField->SetUnit(eUnit); + VclPtrInstance<MetricField> xField(pParent, nBits); + xField->SetUnit(eUnit); if (eUnit == FUNIT_CUSTOM) - pField->SetCustomUnitText(OStringToOUString(sUnit, RTL_TEXTENCODING_UTF8)); - pWindow = pField; + xField->SetCustomUnitText(OStringToOUString(sUnit, RTL_TEXTENCODING_UTF8)); + xWindow = xField; } } } else if (name == "GtkLinkButton") - pWindow = new FixedHyperlink(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK|WB_NOLABEL); + xWindow = VclPtr<FixedHyperlink>::Create(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK|WB_NOLABEL); else if ((name == "GtkComboBox") || (name == "GtkComboBoxText") || (name == "VclComboBoxText")) { OString sPattern = extractCustomProperty(rMap); @@ -1474,25 +1474,25 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & << " unit: " << sUnit.getStr() << " name: " << id.getStr() << " use a VclComboBoxNumeric instead"); - MetricBox *pBox = new MetricBox(pParent, nBits); - pBox->EnableAutoSize(true); - pBox->SetUnit(eUnit); - pBox->SetDecimalDigits(extractDecimalDigits(sPattern)); + VclPtrInstance<MetricBox> xBox(pParent, nBits); + xBox->EnableAutoSize(true); + xBox->SetUnit(eUnit); + xBox->SetDecimalDigits(extractDecimalDigits(sPattern)); if (eUnit == FUNIT_CUSTOM) - pBox->SetCustomUnitText(OStringToOUString(sUnit, RTL_TEXTENCODING_UTF8)); - pWindow = pBox; + xBox->SetCustomUnitText(OStringToOUString(sUnit, RTL_TEXTENCODING_UTF8)); + xWindow = xBox; } else if (extractEntry(rMap)) { - ComboBox* pComboBox = new ComboBox(pParent, nBits); - pComboBox->EnableAutoSize(true); - pWindow = pComboBox; + VclPtrInstance<ComboBox> xComboBox(pParent, nBits); + xComboBox->EnableAutoSize(true); + xWindow = xComboBox; } else { - ListBox *pListBox = new ListBox(pParent, nBits|WB_SIMPLEMODE); - pListBox->EnableAutoSize(true); - pWindow = pListBox; + VclPtrInstance<ListBox> xListBox(pParent, nBits|WB_SIMPLEMODE); + xListBox->EnableAutoSize(true); + xWindow = xListBox; } } else if (name == "VclComboBoxNumeric") @@ -1514,22 +1514,22 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & OString sUnit = extractUnit(sPattern); FieldUnit eUnit = detectMetricUnit(sUnit); SAL_INFO("vcl.layout", "making metric box for " << name.getStr() << " " << sUnit.getStr()); - MetricBox *pBox = new MetricBox(pParent, nBits); - pBox->EnableAutoSize(true); - pBox->SetUnit(eUnit); - pBox->SetDecimalDigits(extractDecimalDigits(sPattern)); + VclPtrInstance<MetricBox> xBox(pParent, nBits); + xBox->EnableAutoSize(true); + xBox->SetUnit(eUnit); + xBox->SetDecimalDigits(extractDecimalDigits(sPattern)); if (eUnit == FUNIT_CUSTOM) - pBox->SetCustomUnitText(OStringToOUString(sUnit, RTL_TEXTENCODING_UTF8)); - pWindow = pBox; + xBox->SetCustomUnitText(OStringToOUString(sUnit, RTL_TEXTENCODING_UTF8)); + xWindow = xBox; } else { SAL_INFO("vcl.layout", "making numeric box for " << name.getStr()); connectNumericFormatterAdjustment(id, sAdjustment); - NumericBox* pBox = new NumericBox(pParent, nBits); + VclPtrInstance<NumericBox> xBox(pParent, nBits); if (bDropdown) - pBox->EnableAutoSize(true); - pWindow = pBox; + xBox->EnableAutoSize(true); + xWindow = xBox; } } else if (name == "GtkTreeView") @@ -1547,9 +1547,9 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & nWinStyle |= WB_BORDER; //ListBox manages its own scrolling, vcl::Window *pRealParent = prepareWidgetOwnScrolling(pParent, nWinStyle); - pWindow = new ListBox(pRealParent, nWinStyle); + xWindow = VclPtr<ListBox>::Create(pRealParent, nWinStyle); if (pRealParent != pParent) - cleanupWidgetOwnScrolling(pParent, pWindow, rMap); + cleanupWidgetOwnScrolling(pParent, xWindow, rMap); } else if (name == "GtkLabel") { @@ -1559,14 +1559,14 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & nWinStyle |= WB_BORDER; extractMnemonicWidget(id, rMap); if (extractSelectable(rMap)) - pWindow = new SelectableFixedText(pParent, nWinStyle); + xWindow = VclPtr<SelectableFixedText>::Create(pParent, nWinStyle); else - pWindow = new FixedText(pParent, nWinStyle); + xWindow = VclPtr<FixedText>::Create(pParent, nWinStyle); } else if (name == "GtkImage") { extractStock(id, rMap); - pWindow = new FixedImage(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK|WB_SCALE); + xWindow = VclPtr<FixedImage>::Create(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK|WB_SCALE); //such parentless GtkImages are temps used to set icons on buttons //default them to hidden to stop e.g. insert->index entry flicking temp //full screen windows @@ -1579,52 +1579,45 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & else if (name == "GtkSeparator") { bVertical = extractOrientation(rMap); - if (bVertical) - pWindow = new FixedLine(pParent, WB_VERT); - else - pWindow = new FixedLine(pParent, WB_HORZ); + xWindow = VclPtr<FixedLine>::Create(pParent, bVertical ? WB_VERT : WB_HORZ); } else if (name == "GtkScrollbar") { extractAdjustmentToMap(id, rMap, m_pParserState->m_aScrollAdjustmentMaps); bVertical = extractOrientation(rMap); - if (bVertical) - pWindow = new ScrollBar(pParent, WB_VERT); - else - pWindow = new ScrollBar(pParent, WB_HORZ); + xWindow = VclPtr<ScrollBar>::Create(pParent, bVertical ? WB_VERT : WB_HORZ); } else if (name == "GtkProgressBar") { extractAdjustmentToMap(id, rMap, m_pParserState->m_aScrollAdjustmentMaps); bVertical = extractOrientation(rMap); - if (bVertical) - pWindow = new ProgressBar(pParent, WB_VERT); - else - pWindow = new ProgressBar(pParent, WB_HORZ); + xWindow = VclPtr<ProgressBar>::Create(pParent, bVertical ? WB_VERT : WB_HORZ); } else if (name == "GtkScrolledWindow") { - pWindow = new VclScrolledWindow(pParent); + xWindow = VclPtr<VclScrolledWindow>::Create(pParent); } else if (name == "GtkViewport") { - pWindow = new VclViewport(pParent); + xWindow = VclPtr<VclViewport>::Create(pParent); } else if (name == "GtkEventBox") { - pWindow = new VclEventBox(pParent); + xWindow = VclPtr<VclEventBox>::Create(pParent); } else if (name == "GtkEntry") { - pWindow = new Edit(pParent, WB_LEFT|WB_VCENTER|WB_BORDER|WB_3DLOOK); + xWindow = VclPtr<Edit>::Create(pParent, WB_LEFT|WB_VCENTER|WB_BORDER|WB_3DLOOK); ensureDefaultWidthChars(rMap); } else if (name == "GtkNotebook") - pWindow = new TabControl(pParent, WB_STDTABCONTROL|WB_3DLOOK); + { + xWindow = VclPtr<TabControl>::Create(pParent, WB_STDTABCONTROL|WB_3DLOOK); + } else if (name == "GtkDrawingArea") { OString sBorder = extractCustomProperty(rMap); - pWindow = new vcl::Window(pParent, sBorder.isEmpty() ? 0 : WB_BORDER); + xWindow = VclPtr<vcl::Window>::Create(pParent, sBorder.isEmpty() ? 0 : WB_BORDER); } else if (name == "GtkTextView") { @@ -1636,13 +1629,13 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & nWinStyle |= WB_BORDER; //VclMultiLineEdit manages its own scrolling, vcl::Window *pRealParent = prepareWidgetOwnScrolling(pParent, nWinStyle); - pWindow = new VclMultiLineEdit(pRealParent, nWinStyle); + xWindow = VclPtr<VclMultiLineEdit>::Create(pRealParent, nWinStyle); if (pRealParent != pParent) - cleanupWidgetOwnScrolling(pParent, pWindow, rMap); + cleanupWidgetOwnScrolling(pParent, xWindow, rMap); } else if (name == "GtkSpinner") { - pWindow = new Throbber(pParent, WB_3DLOOK); + xWindow = VclPtr<Throbber>::Create(pParent, WB_3DLOOK); } else if (name == "GtkScale") { @@ -1657,11 +1650,11 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & WinBits nWinStyle = bVertical ? WB_VERT : WB_HORZ; - pWindow = new Slider(pParent, nWinStyle); + xWindow = VclPtr<Slider>::Create(pParent, nWinStyle); } else if (name == "GtkToolbar") { - pWindow = new ToolBox(pParent, WB_3DLOOK | WB_TABSTOP); + xWindow = VclPtr<ToolBox>::Create(pParent, WB_3DLOOK | WB_TABSTOP); } else if (name == "GtkToolButton" || name == "GtkMenuToolButton") { @@ -1719,9 +1712,9 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & { WinBits nBits = extractDeferredBits(rMap); if (nBits & WB_DOCKABLE) - pWindow = new DockingWindow(pParent, nBits|WB_MOVEABLE); + xWindow = VclPtr<DockingWindow>::Create(pParent, nBits|WB_MOVEABLE); else - pWindow = new FloatingWindow(pParent, nBits|WB_MOVEABLE); + xWindow = VclPtr<FloatingWindow>::Create(pParent, nBits|WB_MOVEABLE); } else { @@ -1764,23 +1757,22 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString & customMakeWidget pFunction = reinterpret_cast<customMakeWidget>(osl_getFunctionSymbol((oslModule) RTLD_DEFAULT, sFunction.pData)); #endif if (pFunction) - pWindow = (*pFunction)(pParent, rMap); + xWindow = VclPtr<vcl::Window>(pFunction(pParent, rMap), SAL_NO_ACQUIRE); } } - SAL_WARN_IF(!pWindow, "vcl.layout", "probably need to implement " << name.getStr() << " or add a make" << name.getStr() << " function"); - if (pWindow) + SAL_WARN_IF(!xWindow, "vcl.layout", "probably need to implement " << name.getStr() << " or add a make" << name.getStr() << " function"); + if (xWindow) { - VclPtr< vcl::Window > xWindow( pWindow ); - pWindow->SetHelpId(m_sHelpRoot + id); + xWindow->SetHelpId(m_sHelpRoot + id); SAL_INFO("vcl.layout", "for " << name.getStr() << - ", created " << pWindow << " child of " << - pParent << "(" << pWindow->mpWindowImpl->mpParent.get() << "/" << - pWindow->mpWindowImpl->mpRealParent.get() << "/" << - pWindow->mpWindowImpl->mpBorderWindow.get() << ") with helpid " << - pWindow->GetHelpId().getStr()); + ", created " << xWindow.get() << " child of " << + pParent << "(" << xWindow->mpWindowImpl->mpParent.get() << "/" << + xWindow->mpWindowImpl->mpRealParent.get() << "/" << + xWindow->mpWindowImpl->mpBorderWindow.get() << ") with helpid " << + xWindow->GetHelpId().getStr()); m_aChildren.push_back(WinAndId(id, xWindow, bVertical)); } - return VclPtr<vcl::Window>(pWindow, SAL_NO_ACQUIRE); + return xWindow; } namespace |