Bug Summary

File:home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx
Warning:line 1722, column 37
Use of memory after it is freed

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name builder.cxx -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib64/clang/11.0.0 -isystem /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/glm -isystem /usr/include/glib-2.0 -isystem /usr/lib64/glib-2.0/include -isystem /usr/include/libmount -isystem /usr/include/blkid -isystem /usr/include/cairo -isystem /usr/include/glib-2.0 -isystem /usr/lib64/glib-2.0/include -isystem /usr/include/pixman-1 -isystem /usr/include/freetype2 -isystem /usr/include/libpng16 -isystem /usr/include/libxml2 -isystem /usr/include/freetype2 -isystem /usr/include/libpng16 -isystem /usr/include/dbus-1.0 -isystem /usr/lib64/dbus-1.0/include -isystem /usr/include/freetype2 -isystem /usr/include/libpng16 -D BOOST_ERROR_CODE_HEADER_ONLY -D BOOST_SYSTEM_NO_DEPRECATED -D CPPU_ENV=gcc3 -D LINUX -D OSL_DEBUG_LEVEL=1 -D SAL_LOG_INFO -D SAL_LOG_WARN -D UNIX -D UNX -D X86_64 -D _PTHREADS -D _REENTRANT -D VCL_DLLIMPLEMENTATION -D DLLIMPLEMENTATION_UITEST -D CUI_DLL_NAME="libcuilo.so" -D DESKTOP_DETECTOR_DLL_NAME="libdesktop_detectorlo.so" -D TK_DLL_NAME="libtklo.so" -D SYSTEM_ZLIB -D GLM_FORCE_CTOR_INIT -D SK_USER_CONFIG_HEADER=</home/maarten/src/libreoffice/core/config_host/config_skia.h> -D SKIA_DLL -D ENABLE_CUPS -D HAVE_VALGRIND_HEADERS -D EXCEPTIONS_ON -D LIBO_INTERNAL_ONLY -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/epoxy/include -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/include/core -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/include/effects -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/include/gpu -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/include/config -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/include/ports -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/include/third_party/vulkan -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia/tools/gpu -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/skia -I /home/maarten/src/libreoffice/core/external/skia/inc/ -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/mdds/include -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/lcms2/include -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/icu/source -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/icu/source/i18n -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/icu/source/common -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/harfbuzz/src -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/graphite/include -I /home/maarten/src/libreoffice/core/external/boost/include -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/boost -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/pdfium -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/pdfium/public -D COMPONENT_BUILD -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/libpng -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/libjpeg-turbo -I /home/maarten/src/libreoffice/core/include -I /usr/lib/jvm/java-11-openjdk-11.0.9.10-0.0.ea.fc33.x86_64/include -I /usr/lib/jvm/java-11-openjdk-11.0.9.10-0.0.ea.fc33.x86_64/include/linux -I /home/maarten/src/libreoffice/core/config_host -I /home/maarten/src/libreoffice/core/vcl/inc -I /home/maarten/src/libreoffice/core/workdir/UnoApiHeadersTarget/udkapi/normal -I /home/maarten/src/libreoffice/core/workdir/UnoApiHeadersTarget/offapi/normal -I /home/maarten/src/libreoffice/core/workdir/CustomTarget/officecfg/registry -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libxml2 -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10 -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/x86_64-redhat-linux -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib64/clang/11.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O0 -Wno-missing-braces -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/maarten/src/libreoffice/core -ferror-limit 19 -fvisibility hidden -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -debug-info-kind=constructor -analyzer-output=html -faddrsig -o /home/maarten/tmp/wis/scan-build-libreoffice/output/report/2020-10-07-141433-9725-1 -x c++ /home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx

/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#include <config_feature_desktop.h>
11#include <config_options.h>
12
13#include <memory>
14#include <unordered_map>
15#include <com/sun/star/accessibility/AccessibleRole.hpp>
16
17#include <comphelper/lok.hxx>
18#include <i18nutil/unicode.hxx>
19#include <officecfg/Office/Common.hxx>
20#include <osl/module.hxx>
21#include <sal/log.hxx>
22#include <unotools/localedatawrapper.hxx>
23#include <unotools/resmgr.hxx>
24#include <vcl/builder.hxx>
25#include <vcl/toolkit/button.hxx>
26#include <vcl/toolkit/dialog.hxx>
27#include <vcl/toolkit/edit.hxx>
28#include <vcl/toolkit/field.hxx>
29#include <vcl/fieldvalues.hxx>
30#include <vcl/toolkit/fmtfield.hxx>
31#include <vcl/toolkit/fixed.hxx>
32#include <vcl/toolkit/fixedhyper.hxx>
33#include <vcl/headbar.hxx>
34#include <vcl/IPrioritable.hxx>
35#include <vcl/toolkit/ivctrl.hxx>
36#include <vcl/layout.hxx>
37#include <vcl/toolkit/lstbox.hxx>
38#include <vcl/menubtn.hxx>
39#include <vcl/mnemonic.hxx>
40#include <vcl/toolkit/prgsbar.hxx>
41#include <vcl/scrbar.hxx>
42#include <vcl/split.hxx>
43#include <vcl/svapp.hxx>
44#include <vcl/toolkit/svtabbx.hxx>
45#include <vcl/tabctrl.hxx>
46#include <vcl/tabpage.hxx>
47#include <vcl/toolkit/throbber.hxx>
48#include <vcl/toolbox.hxx>
49#include <vcl/toolkit/treelistentry.hxx>
50#include <vcl/toolkit/vclmedit.hxx>
51#include <vcl/settings.hxx>
52#include <slider.hxx>
53#include <vcl/weld.hxx>
54#include <vcl/weldutils.hxx>
55#include <vcl/commandinfoprovider.hxx>
56#include <iconview.hxx>
57#include <svdata.hxx>
58#include <bitmaps.hlst>
59#include <messagedialog.hxx>
60#include <OptionalBox.hxx>
61#include <window.h>
62#include <xmlreader/xmlreader.hxx>
63#include <desktop/crashreport.hxx>
64#include <calendar.hxx>
65#include <salinst.hxx>
66#include <strings.hrc>
67#include <treeglue.hxx>
68#include <tools/diagnose_ex.h>
69#include <verticaltabctrl.hxx>
70#include <wizdlg.hxx>
71#include <tools/svlibrary.h>
72#include <jsdialog/jsdialogbuilder.hxx>
73
74#if defined(DISABLE_DYNLOADING) || defined(LINUX1)
75#include <dlfcn.h>
76#endif
77
78static bool toBool(const OString &rValue)
79{
80 return (!rValue.isEmpty() && (rValue[0] == 't' || rValue[0] == 'T' || rValue[0] == '1'));
81}
82
83namespace
84{
85 OUString mapStockToImageResource(const OUString& sType)
86 {
87 if (sType == "gtk-index")
88 return SV_RESID_BITMAP_INDEX"vcl/res/index.png";
89 else if (sType == "gtk-refresh")
90 return SV_RESID_BITMAP_REFRESH"res/reload.png";
91 else if (sType == "gtk-apply")
92 return IMG_APPLY"sw/res/sc20558.png";
93 else if (sType == "gtk-dialog-error")
94 return IMG_ERROR"dbaccess/res/exerror.png";
95 else if (sType == "gtk-add")
96 return IMG_ADD"extensions/res/scanner/plus.png";
97 else if (sType == "gtk-remove")
98 return IMG_REMOVE"extensions/res/scanner/minus.png";
99 else if (sType == "gtk-copy")
100 return IMG_COPY"cmd/sc_copy.png";
101 else if (sType == "gtk-paste")
102 return IMG_PASTE"cmd/sc_paste.png";
103 return OUString();
104 }
105
106 SymbolType mapStockToSymbol(const OUString& sType)
107 {
108 SymbolType eRet = SymbolType::DONTKNOW;
109 if (sType == "gtk-media-next")
110 eRet = SymbolType::NEXT;
111 else if (sType == "gtk-media-previous")
112 eRet = SymbolType::PREV;
113 else if (sType == "gtk-media-play")
114 eRet = SymbolType::PLAY;
115 else if (sType == "gtk-media-stop")
116 eRet = SymbolType::STOP;
117 else if (sType == "gtk-goto-first")
118 eRet = SymbolType::FIRST;
119 else if (sType == "gtk-goto-last")
120 eRet = SymbolType::LAST;
121 else if (sType == "gtk-go-back")
122 eRet = SymbolType::ARROW_LEFT;
123 else if (sType == "gtk-go-forward")
124 eRet = SymbolType::ARROW_RIGHT;
125 else if (sType == "gtk-go-up")
126 eRet = SymbolType::ARROW_UP;
127 else if (sType == "gtk-go-down")
128 eRet = SymbolType::ARROW_DOWN;
129 else if (sType == "gtk-missing-image")
130 eRet = SymbolType::IMAGE;
131 else if (sType == "gtk-help")
132 eRet = SymbolType::HELP;
133 else if (sType == "gtk-close")
134 eRet = SymbolType::CLOSE;
135 else if (sType == "gtk-new")
136 eRet = SymbolType::PLUS;
137 else if (!mapStockToImageResource(sType).isEmpty())
138 eRet = SymbolType::IMAGE;
139 return eRet;
140 }
141
142 void setupFromActionName(Button *pButton, VclBuilder::stringmap &rMap, const css::uno::Reference<css::frame::XFrame>& rFrame);
143}
144
145#if defined SAL_LOG_WARN1
146namespace
147{
148 bool isButtonType(WindowType nType)
149 {
150 return nType == WindowType::PUSHBUTTON ||
151 nType == WindowType::OKBUTTON ||
152 nType == WindowType::CANCELBUTTON ||
153 nType == WindowType::HELPBUTTON ||
154 nType == WindowType::IMAGEBUTTON ||
155 nType == WindowType::MENUBUTTON ||
156 nType == WindowType::MOREBUTTON ||
157 nType == WindowType::SPINBUTTON;
158 }
159}
160#endif
161
162weld::Builder* Application::CreateBuilder(weld::Widget* pParent, const OUString &rUIFile, bool bMobile)
163{
164 bool bUseJSBuilder = false;
165
166 if (bMobile)
167 {
168 if (rUIFile == "modules/swriter/ui/wordcount-mobile.ui" ||
169 rUIFile == "svx/ui/findreplacedialog-mobile.ui" ||
170 rUIFile == "modules/swriter/ui/watermarkdialog.ui" ||
171 rUIFile == "modules/scalc/ui/validationdialog.ui" ||
172 rUIFile == "modules/scalc/ui/validationcriteriapage.ui" ||
173 rUIFile == "modules/scalc/ui/validationhelptabpage-mobile.ui" ||
174 rUIFile == "modules/scalc/ui/erroralerttabpage-mobile.ui" ||
175 rUIFile == "modules/scalc/ui/validationdialog.ui")
176 bUseJSBuilder = true;
177 }
178
179 if (bUseJSBuilder)
180 return new JSInstanceBuilder(pParent, AllSettings::GetUIRootDir(), rUIFile);
181 else
182 return ImplGetSVData()->mpDefInst->CreateBuilder(pParent, AllSettings::GetUIRootDir(), rUIFile);
183}
184
185weld::Builder* Application::CreateInterimBuilder(vcl::Window* pParent, const OUString &rUIFile, bool bAllowCycleFocusOut, sal_uInt64 nLOKWindowId)
186{
187 if (comphelper::LibreOfficeKit::isActive()
188 && (rUIFile == "svx/ui/stylespreview.ui"
189 || rUIFile == "modules/scalc/ui/numberbox.ui"))
190 {
191 return new JSInstanceBuilder(pParent, AllSettings::GetUIRootDir(), rUIFile, css::uno::Reference<css::frame::XFrame>(), nLOKWindowId);
192 }
193
194 return ImplGetSVData()->mpDefInst->CreateInterimBuilder(pParent, AllSettings::GetUIRootDir(), rUIFile, bAllowCycleFocusOut, nLOKWindowId);
195}
196
197weld::MessageDialog* Application::CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType,
198 VclButtonsType eButtonType, const OUString& rPrimaryMessage,
199 bool bMobile)
200{
201 if (bMobile)
202 return JSInstanceBuilder::CreateMessageDialog(pParent, eMessageType, eButtonType, rPrimaryMessage);
203 else
204 return ImplGetSVData()->mpDefInst->CreateMessageDialog(pParent, eMessageType, eButtonType, rPrimaryMessage);
205}
206
207weld::Window* Application::GetFrameWeld(const css::uno::Reference<css::awt::XWindow>& rWindow)
208{
209 return ImplGetSVData()->mpDefInst->GetFrameWeld(rWindow);
210}
211
212namespace weld
213{
214 OUString MetricSpinButton::MetricToString(FieldUnit rUnit)
215 {
216 const FieldUnitStringList& rList = ImplGetFieldUnits();
217 // return unit's default string (ie, the first one )
218 auto it = std::find_if(
219 rList.begin(), rList.end(),
220 [&rUnit](const std::pair<OUString, FieldUnit>& rItem) { return rItem.second == rUnit; });
221 if (it != rList.end())
222 return it->first;
223
224 return OUString();
225 }
226
227 IMPL_LINK_NOARG(MetricSpinButton, spin_button_value_changed, SpinButton&, void)void MetricSpinButton::LinkStubspin_button_value_changed(void
* instance, SpinButton& data) { return static_cast<MetricSpinButton
*>(instance)->spin_button_value_changed(data); } void MetricSpinButton
::spin_button_value_changed(__attribute__ ((unused)) SpinButton
&)
228 {
229 signal_value_changed();
230 }
231
232 IMPL_LINK(MetricSpinButton, spin_button_output, SpinButton&, rSpinButton, void)void MetricSpinButton::LinkStubspin_button_output(void * instance
, SpinButton& data) { return static_cast<MetricSpinButton
*>(instance)->spin_button_output(data); } void MetricSpinButton
::spin_button_output(SpinButton& rSpinButton)
233 {
234 OUString sNewText(format_number(rSpinButton.get_value()));
235 if (sNewText != rSpinButton.get_text())
236 rSpinButton.set_text(sNewText);
237 }
238
239 void MetricSpinButton::update_width_chars()
240 {
241 int min, max;
242 m_xSpinButton->get_range(min, max);
243 auto width = std::max(m_xSpinButton->get_pixel_size(format_number(min)).Width(),
244 m_xSpinButton->get_pixel_size(format_number(max)).Width());
245 int chars = ceil(width / m_xSpinButton->get_approximate_digit_width());
246 m_xSpinButton->set_width_chars(chars);
247 }
248
249 unsigned int SpinButton::Power10(unsigned int n)
250 {
251 unsigned int nValue = 1;
252 for (unsigned int i = 0; i < n; ++i)
253 nValue *= 10;
254 return nValue;
255 }
256
257 int SpinButton::denormalize(int nValue) const
258 {
259 const int nFactor = Power10(get_digits());
260
261 if ((nValue < (SAL_MIN_INT32((sal_Int32) (-0x7FFFFFFF - 1)) + nFactor)) || (nValue > (SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF) - nFactor)))
262 {
263 return nValue / nFactor;
264 }
265
266 const int nHalf = nFactor / 2;
267
268 if (nValue < 0)
269 return (nValue - nHalf) / nFactor;
270 return (nValue + nHalf) / nFactor;
271 }
272
273 OUString MetricSpinButton::format_number(int nValue) const
274 {
275 OUString aStr;
276
277 const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetLocaleDataWrapper();
278
279 unsigned int nDecimalDigits = m_xSpinButton->get_digits();
280 //pawn percent off to icu to decide whether percent is separated from its number for this locale
281 if (m_eSrcUnit == FieldUnit::PERCENT)
282 {
283 double fValue = nValue;
284 fValue /= SpinButton::Power10(nDecimalDigits);
285 aStr = unicode::formatPercent(fValue, rLocaleData.getLanguageTag());
286 }
287 else
288 {
289 aStr = rLocaleData.getNum(nValue, nDecimalDigits, true, true);
290 OUString aSuffix = MetricToString(m_eSrcUnit);
291 if (m_eSrcUnit != FieldUnit::NONE && m_eSrcUnit != FieldUnit::DEGREE && m_eSrcUnit != FieldUnit::INCH && m_eSrcUnit != FieldUnit::FOOT)
292 aStr += " ";
293 if (m_eSrcUnit == FieldUnit::INCH)
294 {
295 OUString sDoublePrime = u"\u2033";
296 if (aSuffix != "\"" && aSuffix != sDoublePrime)
297 aStr += " ";
298 else
299 aSuffix = sDoublePrime;
300 }
301 else if (m_eSrcUnit == FieldUnit::FOOT)
302 {
303 OUString sPrime = u"\u2032";
304 if (aSuffix != "'" && aSuffix != sPrime)
305 aStr += " ";
306 else
307 aSuffix = sPrime;
308 }
309
310 assert(m_eSrcUnit != FieldUnit::PERCENT)(static_cast <bool> (m_eSrcUnit != FieldUnit::PERCENT) ?
void (0) : __assert_fail ("m_eSrcUnit != FieldUnit::PERCENT"
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 310, __extension__ __PRETTY_FUNCTION__))
;
311 aStr += aSuffix;
312 }
313
314 return aStr;
315 }
316
317 void MetricSpinButton::set_digits(unsigned int digits)
318 {
319 int step, page;
320 get_increments(step, page, m_eSrcUnit);
321 int value = get_value(m_eSrcUnit);
322 m_xSpinButton->set_digits(digits);
323 set_increments(step, page, m_eSrcUnit);
324 set_value(value, m_eSrcUnit);
325 update_width_chars();
326 }
327
328 void MetricSpinButton::set_unit(FieldUnit eUnit)
329 {
330 if (eUnit != m_eSrcUnit)
331 {
332 int step, page;
333 get_increments(step, page, m_eSrcUnit);
334 int value = get_value(m_eSrcUnit);
335 m_eSrcUnit = eUnit;
336 set_increments(step, page, m_eSrcUnit);
337 set_value(value, m_eSrcUnit);
338 spin_button_output(*m_xSpinButton);
339 update_width_chars();
340 }
341 }
342
343 int MetricSpinButton::ConvertValue(int nValue, FieldUnit eInUnit, FieldUnit eOutUnit) const
344 {
345 auto nRet = vcl::ConvertValue(nValue, 0, m_xSpinButton->get_digits(), eInUnit, eOutUnit);
346 if (nRet > SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF))
347 nRet = SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF);
348 else if (nRet < SAL_MIN_INT32((sal_Int32) (-0x7FFFFFFF - 1)))
349 nRet = SAL_MIN_INT32((sal_Int32) (-0x7FFFFFFF - 1));
350 return nRet;
351 }
352
353 IMPL_LINK(MetricSpinButton, spin_button_input, int*, result, bool)bool MetricSpinButton::LinkStubspin_button_input(void * instance
, int* data) { return static_cast<MetricSpinButton *>(instance
)->spin_button_input(data); } bool MetricSpinButton::spin_button_input
(int* result)
354 {
355 const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetLocaleDataWrapper();
356 double fResult(0.0);
357 bool bRet = vcl::TextToValue(get_text(), fResult, 0, m_xSpinButton->get_digits(), rLocaleData, m_eSrcUnit);
358 if (bRet)
359 {
360 if (fResult > SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF))
361 fResult = SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF);
362 else if (fResult < SAL_MIN_INT32((sal_Int32) (-0x7FFFFFFF - 1)))
363 fResult = SAL_MIN_INT32((sal_Int32) (-0x7FFFFFFF - 1));
364 *result = fResult;
365 }
366 return bRet;
367 }
368
369 EntryTreeView::EntryTreeView(std::unique_ptr<Entry> xEntry, std::unique_ptr<TreeView> xTreeView)
370 : m_xEntry(std::move(xEntry))
371 , m_xTreeView(std::move(xTreeView))
372 {
373 m_xTreeView->connect_changed(LINK(this, EntryTreeView, ClickHdl)::tools::detail::makeLink( ::tools::detail::castTo<EntryTreeView
*>(this), &EntryTreeView::LinkStubClickHdl)
);
374 m_xEntry->connect_changed(LINK(this, EntryTreeView, ModifyHdl)::tools::detail::makeLink( ::tools::detail::castTo<EntryTreeView
*>(this), &EntryTreeView::LinkStubModifyHdl)
);
375 }
376
377 IMPL_LINK(EntryTreeView, ClickHdl, weld::TreeView&, rView, void)void EntryTreeView::LinkStubClickHdl(void * instance, weld::TreeView
& data) { return static_cast<EntryTreeView *>(instance
)->ClickHdl(data); } void EntryTreeView::ClickHdl(weld::TreeView
& rView)
378 {
379 m_xEntry->set_text(rView.get_selected_text());
380 m_aChangeHdl.Call(*this);
381 }
382
383 IMPL_LINK_NOARG(EntryTreeView, ModifyHdl, weld::Entry&, void)void EntryTreeView::LinkStubModifyHdl(void * instance, weld::
Entry& data) { return static_cast<EntryTreeView *>(
instance)->ModifyHdl(data); } void EntryTreeView::ModifyHdl
(__attribute__ ((unused)) weld::Entry&)
384 {
385 m_aChangeHdl.Call(*this);
386 }
387
388 void EntryTreeView::set_height_request_by_rows(int nRows)
389 {
390 int nHeight = nRows == -1 ? -1 : m_xTreeView->get_height_rows(nRows);
391 m_xTreeView->set_size_request(m_xTreeView->get_size_request().Width(), nHeight);
392 }
393
394 size_t GetAbsPos(const weld::TreeView& rTreeView, const weld::TreeIter& rIter)
395 {
396 size_t nAbsPos = 0;
397
398 std::unique_ptr<weld::TreeIter> xEntry(rTreeView.make_iterator(&rIter));
399 if (!rTreeView.get_iter_first(*xEntry))
400 xEntry.reset();
401
402 while (xEntry && rTreeView.iter_compare(*xEntry, rIter) != 0)
403 {
404 if (!rTreeView.iter_next(*xEntry))
405 xEntry.reset();
406 nAbsPos++;
407 }
408
409 return nAbsPos;
410 }
411
412 bool IsEntryVisible(const weld::TreeView& rTreeView, const weld::TreeIter& rIter)
413 {
414 // short circuit for the common case
415 if (rTreeView.get_iter_depth(rIter) == 0)
416 return true;
417
418 std::unique_ptr<weld::TreeIter> xEntry(rTreeView.make_iterator(&rIter));
419 bool bRetVal = false;
420 do
421 {
422 if (rTreeView.get_iter_depth(*xEntry) == 0)
423 {
424 bRetVal = true;
425 break;
426 }
427 } while (rTreeView.iter_parent(*xEntry) && rTreeView.get_row_expanded(*xEntry));
428 return bRetVal;
429 }
430}
431
432VclBuilder::VclBuilder(vcl::Window* pParent, const OUString& sUIDir, const OUString& sUIFile,
433 const OString& sID, const css::uno::Reference<css::frame::XFrame>& rFrame,
434 bool bLegacy, const NotebookBarAddonsItem* pNotebookBarAddonsItem)
435 : m_pNotebookBarAddonsItem(pNotebookBarAddonsItem
436 ? new NotebookBarAddonsItem(*pNotebookBarAddonsItem)
437 : new NotebookBarAddonsItem{})
438 , m_sID(sID)
439 , m_sHelpRoot(OUStringToOString(sUIFile, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))))
440 , m_pStringReplace(Translate::GetReadStringHook())
441 , m_pParent(pParent)
442 , m_bToplevelParentFound(false)
443 , m_bLegacy(bLegacy)
444 , m_pParserState(new ParserState)
445 , m_xFrame(rFrame)
446{
447 m_bToplevelHasDeferredInit = pParent &&
448 ((pParent->IsSystemWindow() && static_cast<SystemWindow*>(pParent)->isDeferredInit()) ||
449 (pParent->IsDockingWindow() && static_cast<DockingWindow*>(pParent)->isDeferredInit()));
450 m_bToplevelHasDeferredProperties = m_bToplevelHasDeferredInit;
451
452 sal_Int32 nIdx = m_sHelpRoot.lastIndexOf('.');
453 if (nIdx != -1)
454 m_sHelpRoot = m_sHelpRoot.copy(0, nIdx);
455 m_sHelpRoot += OString('/');
456
457 OUString sUri = sUIDir + sUIFile;
458
459 try
460 {
461 xmlreader::XmlReader reader(sUri);
462
463 handleChild(pParent, nullptr, reader);
464 }
465 catch (const css::uno::Exception &rExcept)
466 {
467 DBG_UNHANDLED_EXCEPTION("vcl.builder", "Unable to read .ui file")DbgUnhandledException( DbgGetCaughtException(), __func__, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "467" ": ", "vcl.builder", "Unable to read .ui file" );
;
468 CrashReporter::addKeyValue("VclBuilderException", "Unable to read .ui file: " + rExcept.Message, CrashReporter::Write);
469 throw;
470 }
471
472 //Set Mnemonic widgets when everything has been imported
473 for (auto const& mnemonicWidget : m_pParserState->m_aMnemonicWidgetMaps)
474 {
475 FixedText *pOne = get<FixedText>(mnemonicWidget.m_sID);
476 vcl::Window *pOther = get(mnemonicWidget.m_sValue.toUtf8());
477 SAL_WARN_IF(!pOne || !pOther, "vcl", "missing either source " << mnemonicWidget.m_sIDdo { if (true && (!pOne || !pOther)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing either source "
<< mnemonicWidget.m_sID << " or target " <<
mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing either source " << mnemonicWidget
.m_sID << " or target " << mnemonicWidget.m_sValue
<< " member of Mnemonic Widget Mapping"), 0); } else {
::std::ostringstream sal_detail_stream; sal_detail_stream <<
"missing either source " << mnemonicWidget.m_sID <<
" or target " << mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing either source " << mnemonicWidget.
m_sID << " or target " << mnemonicWidget.m_sValue
<< " member of Mnemonic Widget Mapping") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing either source " << mnemonicWidget
.m_sID << " or target " << mnemonicWidget.m_sValue
<< " member of Mnemonic Widget Mapping"), 0); } else {
::std::ostringstream sal_detail_stream; sal_detail_stream <<
"missing either source " << mnemonicWidget.m_sID <<
" or target " << mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
478 << " or target " << mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping")do { if (true && (!pOne || !pOther)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing either source "
<< mnemonicWidget.m_sID << " or target " <<
mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing either source " << mnemonicWidget
.m_sID << " or target " << mnemonicWidget.m_sValue
<< " member of Mnemonic Widget Mapping"), 0); } else {
::std::ostringstream sal_detail_stream; sal_detail_stream <<
"missing either source " << mnemonicWidget.m_sID <<
" or target " << mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing either source " << mnemonicWidget.
m_sID << " or target " << mnemonicWidget.m_sValue
<< " member of Mnemonic Widget Mapping") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing either source " << mnemonicWidget
.m_sID << " or target " << mnemonicWidget.m_sValue
<< " member of Mnemonic Widget Mapping"), 0); } else {
::std::ostringstream sal_detail_stream; sal_detail_stream <<
"missing either source " << mnemonicWidget.m_sID <<
" or target " << mnemonicWidget.m_sValue << " member of Mnemonic Widget Mapping"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "478" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
479 if (pOne && pOther)
480 pOne->set_mnemonic_widget(pOther);
481 }
482
483 //Set a11y relations and role when everything has been imported
484 for (auto const& elemAtk : m_pParserState->m_aAtkInfo)
485 {
486 vcl::Window *pSource = elemAtk.first;
487 const stringmap &rMap = elemAtk.second;
488
489 for (auto const& elemMap : rMap)
490 {
491 const OString &rType = elemMap.first;
492 const OUString &rParam = elemMap.second;
493 if (rType == "role")
494 {
495 sal_Int16 role = BuilderUtils::getRoleFromName(rParam.toUtf8());
496 if (role != com::sun::star::accessibility::AccessibleRole::UNKNOWN)
497 pSource->SetAccessibleRole(role);
498 }
499 else
500 {
501 vcl::Window *pTarget = get(rParam.toUtf8());
502 SAL_WARN_IF(!pTarget, "vcl", "missing parameter of a11y relation: " << rParam)do { if (true && (!pTarget)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing parameter of a11y relation: "
<< rParam) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "502" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing parameter of a11y relation: "
<< rParam), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "missing parameter of a11y relation: "
<< rParam; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "502" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing parameter of a11y relation: " << rParam
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "502" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing parameter of a11y relation: "
<< rParam), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "missing parameter of a11y relation: "
<< rParam; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "502" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
503 if (!pTarget)
504 continue;
505 if (rType == "labelled-by")
506 pSource->SetAccessibleRelationLabeledBy(pTarget);
507 else if (rType == "label-for")
508 pSource->SetAccessibleRelationLabelFor(pTarget);
509 else if (rType == "member-of")
510 pSource->SetAccessibleRelationMemberOf(pTarget);
511 else
512 {
513 SAL_WARN("vcl.builder", "unhandled a11y relation :" << rType)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled a11y relation :"
<< rType) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "513" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unhandled a11y relation :" << rType
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled a11y relation :" << rType; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), (
"/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "513" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled a11y relation :" << rType) == 1)
{ ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "513" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unhandled a11y relation :" << rType
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled a11y relation :" << rType; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), (
"/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "513" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
514 }
515 }
516 }
517 }
518
519 //Set radiobutton groups when everything has been imported
520 for (auto const& elem : m_pParserState->m_aGroupMaps)
521 {
522 RadioButton *pOne = get<RadioButton>(elem.m_sID);
523 RadioButton *pOther = get<RadioButton>(elem.m_sValue);
524 SAL_WARN_IF(!pOne || !pOther, "vcl", "missing member of radiobutton group")do { if (true && (!pOne || !pOther)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing member of radiobutton group"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "524" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing member of radiobutton group")
, 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing member of radiobutton group"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "524" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing member of radiobutton group") == 1) { ::
sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "524" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing member of radiobutton group")
, 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing member of radiobutton group"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "524" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
525 if (pOne && pOther)
526 {
527 if (m_bLegacy)
528 pOne->group(*pOther);
529 else
530 {
531 pOther->group(*pOne);
532 std::stable_sort(pOther->m_xGroup->begin(), pOther->m_xGroup->end(), sortIntoBestTabTraversalOrder(this));
533 }
534 }
535 }
536
537 //Set ComboBox models when everything has been imported
538 for (auto const& elem : m_pParserState->m_aModelMaps)
539 {
540 vcl::Window* pTarget = get(elem.m_sID);
541 ListBox *pListBoxTarget = dynamic_cast<ListBox*>(pTarget);
542 ComboBox *pComboBoxTarget = dynamic_cast<ComboBox*>(pTarget);
543 SvTabListBox *pTreeBoxTarget = dynamic_cast<SvTabListBox*>(pTarget);
544 // pStore may be empty
545 const ListStore *pStore = get_model_by_name(elem.m_sValue.toUtf8());
546 SAL_WARN_IF(!pListBoxTarget && !pComboBoxTarget && !pTreeBoxTarget, "vcl", "missing elements of combobox")do { if (true && (!pListBoxTarget && !pComboBoxTarget
&& !pTreeBoxTarget)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of combobox"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "546" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of combobox"), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of combobox"; ::sal::detail::log(
(::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "546" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of combobox") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "546" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of combobox"), 0); }
else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of combobox"; ::sal::detail::log(
(::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "546" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
547 if (pListBoxTarget && pStore)
548 mungeModel(*pListBoxTarget, *pStore, elem.m_nActiveId);
549 else if (pComboBoxTarget && pStore)
550 mungeModel(*pComboBoxTarget, *pStore, elem.m_nActiveId);
551 else if (pTreeBoxTarget && pStore)
552 mungeModel(*pTreeBoxTarget, *pStore, elem.m_nActiveId);
553 }
554
555 //Set TextView buffers when everything has been imported
556 for (auto const& elem : m_pParserState->m_aTextBufferMaps)
557 {
558 VclMultiLineEdit *pTarget = get<VclMultiLineEdit>(elem.m_sID);
559 const TextBuffer *pBuffer = get_buffer_by_name(elem.m_sValue.toUtf8());
560 SAL_WARN_IF(!pTarget || !pBuffer, "vcl", "missing elements of textview/textbuffer")do { if (true && (!pTarget || !pBuffer)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of textview/textbuffer"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "560" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of textview/textbuffer"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of textview/textbuffer"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "560" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of textview/textbuffer") == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "560" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of textview/textbuffer"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of textview/textbuffer"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "560" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
561 if (pTarget && pBuffer)
562 mungeTextBuffer(*pTarget, *pBuffer);
563 }
564
565 //Set SpinButton adjustments when everything has been imported
566 for (auto const& elem : m_pParserState->m_aNumericFormatterAdjustmentMaps)
567 {
568 NumericFormatter *pTarget = dynamic_cast<NumericFormatter*>(get(elem.m_sID));
569 const Adjustment *pAdjustment = get_adjustment_by_name(elem.m_sValue.toUtf8());
570 SAL_WARN_IF(!pTarget, "vcl", "missing NumericFormatter element of spinbutton/adjustment")do { if (true && (!pTarget)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing NumericFormatter element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "570" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing NumericFormatter element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing NumericFormatter element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "570" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing NumericFormatter element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "570" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing NumericFormatter element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing NumericFormatter element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "570" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
571 SAL_WARN_IF(!pAdjustment, "vcl", "missing Adjustment element of spinbutton/adjustment")do { if (true && (!pAdjustment)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing Adjustment element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "571" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing Adjustment element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing Adjustment element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "571" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing Adjustment element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "571" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing Adjustment element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing Adjustment element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "571" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
572 if (pTarget && pAdjustment)
573 mungeAdjustment(*pTarget, *pAdjustment);
574 }
575
576 for (auto const& elem : m_pParserState->m_aFormattedFormatterAdjustmentMaps)
577 {
578 FormattedField *pTarget = dynamic_cast<FormattedField*>(get(elem.m_sID));
579 const Adjustment *pAdjustment = get_adjustment_by_name(elem.m_sValue.toUtf8());
580 SAL_WARN_IF(!pTarget, "vcl", "missing FormattedField element of spinbutton/adjustment")do { if (true && (!pTarget)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing FormattedField element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "580" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing FormattedField element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing FormattedField element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "580" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing FormattedField element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "580" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing FormattedField element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing FormattedField element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "580" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
581 SAL_WARN_IF(!pAdjustment, "vcl", "missing Adjustment element of spinbutton/adjustment")do { if (true && (!pAdjustment)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing Adjustment element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "581" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing Adjustment element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing Adjustment element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "581" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing Adjustment element of spinbutton/adjustment"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "581" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing Adjustment element of spinbutton/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing Adjustment element of spinbutton/adjustment"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"),
("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "581" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
582 if (pTarget && pAdjustment)
583 mungeAdjustment(*pTarget, *pAdjustment);
584 }
585
586 //Set ScrollBar adjustments when everything has been imported
587 for (auto const& elem : m_pParserState->m_aScrollAdjustmentMaps)
588 {
589 ScrollBar *pTarget = get<ScrollBar>(elem.m_sID);
590 const Adjustment *pAdjustment = get_adjustment_by_name(elem.m_sValue.toUtf8());
591 SAL_WARN_IF(!pTarget || !pAdjustment, "vcl", "missing elements of scrollbar/adjustment")do { if (true && (!pTarget || !pAdjustment)) { switch
(sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) {
case SAL_DETAIL_LOG_ACTION_IGNORE: break; case SAL_DETAIL_LOG_ACTION_LOG
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of scrollbar/adjustment") == 1)
{ ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), (
"/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "591" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of scrollbar/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of scrollbar/adjustment"; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "591" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of scrollbar/adjustment") == 1)
{ ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), (
"/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "591" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of scrollbar/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of scrollbar/adjustment"; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "591" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
592 if (pTarget && pAdjustment)
593 mungeAdjustment(*pTarget, *pAdjustment);
594 }
595
596 //Set Scale(Slider) adjustments
597 for (auto const& elem : m_pParserState->m_aSliderAdjustmentMaps)
598 {
599 Slider* pTarget = dynamic_cast<Slider*>(get(elem.m_sID));
600 const Adjustment* pAdjustment = get_adjustment_by_name(elem.m_sValue.toUtf8());
601 SAL_WARN_IF(!pTarget || !pAdjustment, "vcl", "missing elements of scale(slider)/adjustment")do { if (true && (!pTarget || !pAdjustment)) { switch
(sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) {
case SAL_DETAIL_LOG_ACTION_IGNORE: break; case SAL_DETAIL_LOG_ACTION_LOG
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of scale(slider)/adjustment") ==
1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "601" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of scale(slider)/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of scale(slider)/adjustment"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "601" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of scale(slider)/adjustment") ==
1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "601" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of scale(slider)/adjustment"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of scale(slider)/adjustment"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "601" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
602 if (pTarget && pAdjustment)
603 {
604 mungeAdjustment(*pTarget, *pAdjustment);
605 }
606 }
607
608 //Set size-groups when all widgets have been imported
609 for (auto const& sizeGroup : m_pParserState->m_aSizeGroups)
610 {
611 std::shared_ptr<VclSizeGroup> xGroup(std::make_shared<VclSizeGroup>());
612
613 for (auto const& elem : sizeGroup.m_aProperties)
614 {
615 const OString &rKey = elem.first;
616 const OUString &rValue = elem.second;
617 xGroup->set_property(rKey, rValue);
618 }
619
620 for (auto const& elem : sizeGroup.m_aWidgets)
621 {
622 vcl::Window* pWindow = get(elem.getStr());
623 pWindow->add_to_size_group(xGroup);
624 }
625 }
626
627 //Set button images when everything has been imported
628 std::set<OUString> aImagesToBeRemoved;
629 for (auto const& elem : m_pParserState->m_aButtonImageWidgetMaps)
630 {
631 PushButton *pTargetButton = nullptr;
632 RadioButton *pTargetRadio = nullptr;
633 Button *pTarget = nullptr;
634
635 if (!elem.m_bRadio)
636 {
637 pTargetButton = get<PushButton>(elem.m_sID);
638 pTarget = pTargetButton;
639 }
640 else
641 {
642 pTargetRadio = get<RadioButton>(elem.m_sID);
643 pTarget = pTargetRadio;
644 }
645
646 FixedImage *pImage = get<FixedImage>(elem.m_sValue.toUtf8());
647 SAL_WARN_IF(!pTarget || !pImage,do { if (true && (!pTarget || !pImage)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of button/image/stock"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/image/stock"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/image/stock"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of button/image/stock") == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/image/stock"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/image/stock"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
648 "vcl", "missing elements of button/image/stock")do { if (true && (!pTarget || !pImage)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of button/image/stock"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/image/stock"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/image/stock"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of button/image/stock") == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/image/stock"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/image/stock"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "648" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
649 if (!pTarget || !pImage)
650 continue;
651 aImagesToBeRemoved.insert(elem.m_sValue);
652
653 VclBuilder::StockMap::iterator aFind = m_pParserState->m_aStockMap.find(elem.m_sValue.toUtf8());
654 if (aFind == m_pParserState->m_aStockMap.end())
655 {
656 if (!elem.m_bRadio)
657 {
658 pTargetButton->SetModeImage(pImage->GetImage());
659 if (pImage->GetStyle() & WB_SMALLSTYLE)
660 {
661 pTargetButton->SetStyle(pTargetButton->GetStyle() | WB_SMALLSTYLE);
662 Size aSz(pTargetButton->GetModeImage().GetSizePixel());
663 aSz.AdjustWidth(6);
664 aSz.AdjustHeight(6);
665 if (pTargetButton->get_width_request() == -1)
666 pTargetButton->set_width_request(aSz.Width());
667 if (pTargetButton->get_height_request() == -1)
668 pTargetButton->set_height_request(aSz.Height());
669 }
670 }
671 else
672 pTargetRadio->SetModeRadioImage(pImage->GetImage());
673 }
674 else
675 {
676 const stockinfo &rImageInfo = aFind->second;
677 SymbolType eType = mapStockToSymbol(rImageInfo.m_sStock);
678 SAL_WARN_IF(eType == SymbolType::DONTKNOW, "vcl", "missing stock image element for button")do { if (true && (eType == SymbolType::DONTKNOW)) { switch
(sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) {
case SAL_DETAIL_LOG_ACTION_IGNORE: break; case SAL_DETAIL_LOG_ACTION_LOG
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing stock image element for button") == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "678" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing stock image element for button"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing stock image element for button"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "678" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing stock image element for button") == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "678" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing stock image element for button"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing stock image element for button"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "678" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
679 if (eType == SymbolType::DONTKNOW)
680 continue;
681 if (!elem.m_bRadio)
682 {
683 pTargetButton->SetSymbol(eType);
684 //fdo#76457 keep symbol images small e.g. tools->customize->menu
685 //but images the right size. Really the PushButton::CalcMinimumSize
686 //and PushButton::ImplDrawPushButton are the better place to handle
687 //this, but its such a train-wreck
688 if (eType != SymbolType::IMAGE)
689 pTargetButton->SetStyle(pTargetButton->GetStyle() | WB_SMALLSTYLE);
690 }
691 else
692 SAL_WARN_IF(eType != SymbolType::IMAGE, "vcl.builder", "unimplemented symbol type for radiobuttons")do { if (true && (eType != SymbolType::IMAGE)) { switch
(sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl.builder"
)) { case SAL_DETAIL_LOG_ACTION_IGNORE: break; case SAL_DETAIL_LOG_ACTION_LOG
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unimplemented symbol type for radiobuttons") == 1
) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "692" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unimplemented symbol type for radiobuttons"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unimplemented symbol type for radiobuttons"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder")
, ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "692" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unimplemented symbol type for radiobuttons") == 1
) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "692" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unimplemented symbol type for radiobuttons"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unimplemented symbol type for radiobuttons"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder")
, ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "692" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
693 if (eType == SymbolType::IMAGE)
694 {
695 Image const aImage(StockImage::Yes,
696 mapStockToImageResource(rImageInfo.m_sStock));
697 if (!elem.m_bRadio)
698 pTargetButton->SetModeImage(aImage);
699 else
700 pTargetRadio->SetModeRadioImage(aImage);
701 }
702 switch (rImageInfo.m_nSize)
703 {
704 case 1:
705 pTarget->SetSmallSymbol();
706 break;
707 case 3:
708 // large toolbar, make bigger than normal (4)
709 pTarget->set_width_request(pTarget->GetOptimalSize().Width() * 1.5);
710 pTarget->set_height_request(pTarget->GetOptimalSize().Height() * 1.5);
711 break;
712 case 4:
713 break;
714 default:
715 SAL_WARN("vcl.builder", "unsupported image size " << rImageInfo.m_nSize)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unsupported image size "
<< rImageInfo.m_nSize) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "715" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unsupported image size " << rImageInfo
.m_nSize), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "unsupported image size " <<
rImageInfo.m_nSize; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "715" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unsupported image size " << rImageInfo.m_nSize
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "715" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unsupported image size " << rImageInfo
.m_nSize), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "unsupported image size " <<
rImageInfo.m_nSize; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "715" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
716 break;
717 }
718 }
719 }
720
721 //There may be duplicate use of an Image, so we used a set to collect and
722 //now we can remove them from the tree after their final munge
723 for (auto const& elem : aImagesToBeRemoved)
724 {
725 delete_by_name(elem.toUtf8());
726 }
727
728 //fill in any stock icons in surviving images
729 for (auto const& elem : m_pParserState->m_aStockMap)
730 {
731 FixedImage *pImage = get<FixedImage>(elem.first);
732 SAL_WARN_IF(!pImage, "vcl", "missing elements of image/stock: " << elem.first)do { if (true && (!pImage)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of image/stock: "
<< elem.first) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "732" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of image/stock: " <<
elem.first), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "missing elements of image/stock: "
<< elem.first; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "732" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of image/stock: " << elem
.first) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "732" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of image/stock: " <<
elem.first), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "missing elements of image/stock: "
<< elem.first; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "732" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
733 if (!pImage)
734 continue;
735
736 const stockinfo &rImageInfo = elem.second;
737 if (rImageInfo.m_sStock == "gtk-missing-image")
738 continue;
739
740 SymbolType eType = mapStockToSymbol(rImageInfo.m_sStock);
741 SAL_WARN_IF(eType != SymbolType::IMAGE, "vcl", "unimplemented symbol type for images")do { if (true && (eType != SymbolType::IMAGE)) { switch
(sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) {
case SAL_DETAIL_LOG_ACTION_IGNORE: break; case SAL_DETAIL_LOG_ACTION_LOG
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unimplemented symbol type for images") == 1) { ::
sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "741" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unimplemented symbol type for images"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unimplemented symbol type for images"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "741" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unimplemented symbol type for images") == 1) { ::
sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "741" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "unimplemented symbol type for images"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unimplemented symbol type for images"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "741" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
742 if (eType != SymbolType::IMAGE)
743 continue;
744
745 Image const aImage(StockImage::Yes,
746 mapStockToImageResource(rImageInfo.m_sStock));
747 pImage->SetImage(aImage);
748 }
749
750 //Set button menus when everything has been imported
751 for (auto const& elem : m_pParserState->m_aButtonMenuMaps)
752 {
753 MenuButton *pTarget = get<MenuButton>(elem.m_sID);
754 PopupMenu *pMenu = get_menu(elem.m_sValue.toUtf8());
755 SAL_WARN_IF(!pTarget || !pMenu,do { if (true && (!pTarget || !pMenu)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of button/menu"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/menu"), 0)
; } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/menu"; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of button/menu") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/menu"), 0)
; } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/menu"; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
756 "vcl", "missing elements of button/menu")do { if (true && (!pTarget || !pMenu)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "missing elements of button/menu"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/menu"), 0)
; } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/menu"; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "missing elements of button/menu") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "missing elements of button/menu"), 0)
; } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "missing elements of button/menu"; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "756" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
757 if (!pTarget || !pMenu)
758 continue;
759 pTarget->SetPopupMenu(pMenu);
760 }
761
762 //Remove ScrollWindow parent widgets whose children in vcl implement scrolling
763 //internally.
764 for (auto const& elem : m_pParserState->m_aRedundantParentWidgets)
765 {
766 delete_by_window(elem.first);
767 }
768
769 //fdo#67378 merge the label into the disclosure button
770 for (auto const& elem : m_pParserState->m_aExpanderWidgets)
771 {
772 vcl::Window *pChild = elem->get_child();
773 vcl::Window* pLabel = elem->GetWindow(GetWindowType::LastChild);
774 if (pLabel && pLabel != pChild && pLabel->GetType() == WindowType::FIXEDTEXT)
775 {
776 FixedText *pLabelWidget = static_cast<FixedText*>(pLabel);
777 elem->set_label(pLabelWidget->GetText());
778 delete_by_window(pLabel);
779 }
780 }
781
782 // create message dialog message area now
783 for (auto const& elem : m_pParserState->m_aMessageDialogs)
784 elem->create_message_area();
785
786 //drop maps, etc. that we don't need again
787 m_pParserState.reset();
788
789 SAL_WARN_IF(!m_sID.isEmpty() && (!m_bToplevelParentFound && !get_by_name(m_sID)), "vcl.builder",do { if (true && (!m_sID.isEmpty() && (!m_bToplevelParentFound
&& !get_by_name(m_sID)))) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "Requested top level widget \""
<< m_sID << "\" not found in " << sUIFile)
== 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Requested top level widget \"" <<
m_sID << "\" not found in " << sUIFile), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"Requested top level widget \"" << m_sID << "\" not found in "
<< sUIFile; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Requested top level widget \"" << m_sID <<
"\" not found in " << sUIFile) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Requested top level widget \"" <<
m_sID << "\" not found in " << sUIFile), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"Requested top level widget \"" << m_sID << "\" not found in "
<< sUIFile; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
790 "Requested top level widget \"" << m_sID << "\" not found in " << sUIFile)do { if (true && (!m_sID.isEmpty() && (!m_bToplevelParentFound
&& !get_by_name(m_sID)))) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "Requested top level widget \""
<< m_sID << "\" not found in " << sUIFile)
== 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Requested top level widget \"" <<
m_sID << "\" not found in " << sUIFile), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"Requested top level widget \"" << m_sID << "\" not found in "
<< sUIFile; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Requested top level widget \"" << m_sID <<
"\" not found in " << sUIFile) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Requested top level widget \"" <<
m_sID << "\" not found in " << sUIFile), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"Requested top level widget \"" << m_sID << "\" not found in "
<< sUIFile; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "790" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
791
792#if defined SAL_LOG_WARN1
793 if (m_bToplevelParentFound && m_pParent->IsDialog())
794 {
795 int nButtons = 0;
796 bool bHasDefButton = false;
797 for (auto const& child : m_aChildren)
798 {
799 if (isButtonType(child.m_pWindow->GetType()))
800 {
801 ++nButtons;
802 if (child.m_pWindow->GetStyle() & WB_DEFBUTTON)
803 {
804 bHasDefButton = true;
805 break;
806 }
807 }
808 }
809 SAL_WARN_IF(nButtons && !bHasDefButton, "vcl.builder", "No default button defined in " << sUIFile)do { if (true && (nButtons && !bHasDefButton)
) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "No default button defined in "
<< sUIFile) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "809" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "No default button defined in " <<
sUIFile), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "No default button defined in " <<
sUIFile; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), (
"vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "809" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "No default button defined in " << sUIFile)
== 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "809" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "No default button defined in " <<
sUIFile), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "No default button defined in " <<
sUIFile; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), (
"vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "809" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
810 }
811#endif
812
813 const bool bHideHelp = comphelper::LibreOfficeKit::isActive() &&
814 officecfg::Office::Common::Help::HelpRootURL::get().isEmpty();
815 if (bHideHelp)
816 {
817 if (vcl::Window *pHelpButton = get("help"))
818 pHelpButton->Hide();
819 }
820}
821
822VclBuilder::~VclBuilder()
823{
824 disposeBuilder();
825}
826
827void VclBuilder::disposeBuilder()
828{
829 for (std::vector<WinAndId>::reverse_iterator aI = m_aChildren.rbegin(),
830 aEnd = m_aChildren.rend(); aI != aEnd; ++aI)
831 {
832 aI->m_pWindow.disposeAndClear();
833 }
834 m_aChildren.clear();
835
836 for (std::vector<MenuAndId>::reverse_iterator aI = m_aMenus.rbegin(),
837 aEnd = m_aMenus.rend(); aI != aEnd; ++aI)
838 {
839 aI->m_pMenu.disposeAndClear();
840 }
841 m_aMenus.clear();
842 m_pParent.clear();
843}
844
845namespace
846{
847 bool extractHasFrame(VclBuilder::stringmap& rMap)
848 {
849 bool bHasFrame = true;
850 VclBuilder::stringmap::iterator aFind = rMap.find("has-frame");
851 if (aFind != rMap.end())
852 {
853 bHasFrame = toBool(aFind->second);
854 rMap.erase(aFind);
855 }
856 return bHasFrame;
857 }
858
859 bool extractDrawValue(VclBuilder::stringmap& rMap)
860 {
861 bool bDrawValue = true;
862 VclBuilder::stringmap::iterator aFind = rMap.find("draw-value");
863 if (aFind != rMap.end())
864 {
865 bDrawValue = toBool(aFind->second);
866 rMap.erase(aFind);
867 }
868 return bDrawValue;
869 }
870
871 OUString extractPopupMenu(VclBuilder::stringmap& rMap)
872 {
873 OUString sRet;
874 VclBuilder::stringmap::iterator aFind = rMap.find("popup");
875 if (aFind != rMap.end())
876 {
877 sRet = aFind->second;
878 rMap.erase(aFind);
879 }
880 return sRet;
881 }
882
883 OUString extractValuePos(VclBuilder::stringmap& rMap)
884 {
885 OUString sRet("top");
886 VclBuilder::stringmap::iterator aFind = rMap.find("value-pos");
887 if (aFind != rMap.end())
888 {
889 sRet = aFind->second;
890 rMap.erase(aFind);
891 }
892 return sRet;
893 }
894
895 OUString extractTypeHint(VclBuilder::stringmap &rMap)
896 {
897 OUString sRet("normal");
898 VclBuilder::stringmap::iterator aFind = rMap.find("type-hint");
899 if (aFind != rMap.end())
900 {
901 sRet = aFind->second;
902 rMap.erase(aFind);
903 }
904 return sRet;
905 }
906
907 bool extractResizable(VclBuilder::stringmap &rMap)
908 {
909 bool bResizable = true;
910 VclBuilder::stringmap::iterator aFind = rMap.find("resizable");
911 if (aFind != rMap.end())
912 {
913 bResizable = toBool(aFind->second);
914 rMap.erase(aFind);
915 }
916 return bResizable;
917 }
918
919#if HAVE_FEATURE_DESKTOP1
920 bool extractModal(VclBuilder::stringmap &rMap)
921 {
922 bool bModal = false;
923 VclBuilder::stringmap::iterator aFind = rMap.find("modal");
924 if (aFind != rMap.end())
925 {
926 bModal = toBool(aFind->second);
927 rMap.erase(aFind);
928 }
929 return bModal;
930 }
931#endif
932
933 bool extractDecorated(VclBuilder::stringmap &rMap)
934 {
935 bool bDecorated = true;
936 VclBuilder::stringmap::iterator aFind = rMap.find("decorated");
937 if (aFind != rMap.end())
938 {
939 bDecorated = toBool(aFind->second);
940 rMap.erase(aFind);
941 }
942 return bDecorated;
943 }
944
945 bool extractCloseable(VclBuilder::stringmap &rMap)
946 {
947 bool bCloseable = true;
948 VclBuilder::stringmap::iterator aFind = rMap.find("deletable");
949 if (aFind != rMap.end())
950 {
951 bCloseable = toBool(aFind->second);
952 rMap.erase(aFind);
953 }
954 return bCloseable;
955 }
956
957 bool extractEntry(VclBuilder::stringmap &rMap)
958 {
959 bool bHasEntry = false;
960 VclBuilder::stringmap::iterator aFind = rMap.find("has-entry");
961 if (aFind != rMap.end())
962 {
963 bHasEntry = toBool(aFind->second);
964 rMap.erase(aFind);
965 }
966 return bHasEntry;
967 }
968
969 bool extractOrientation(VclBuilder::stringmap &rMap)
970 {
971 bool bVertical = false;
972 VclBuilder::stringmap::iterator aFind = rMap.find("orientation");
973 if (aFind != rMap.end())
974 {
975 bVertical = aFind->second.equalsIgnoreAsciiCase("vertical");
976 rMap.erase(aFind);
977 }
978 return bVertical;
979 }
980
981 bool extractVerticalTabPos(VclBuilder::stringmap &rMap)
982 {
983 bool bVertical = false;
984 VclBuilder::stringmap::iterator aFind = rMap.find("tab-pos");
985 if (aFind != rMap.end())
986 {
987 bVertical = aFind->second.equalsIgnoreAsciiCase("left") ||
988 aFind->second.equalsIgnoreAsciiCase("right");
989 rMap.erase(aFind);
990 }
991 return bVertical;
992 }
993
994 bool extractInconsistent(VclBuilder::stringmap &rMap)
995 {
996 bool bInconsistent = false;
997 VclBuilder::stringmap::iterator aFind = rMap.find("inconsistent");
998 if (aFind != rMap.end())
999 {
1000 bInconsistent = toBool(aFind->second);
1001 rMap.erase(aFind);
1002 }
1003 return bInconsistent;
1004 }
1005
1006 OUString extractIconName(VclBuilder::stringmap &rMap)
1007 {
1008 OUString sIconName;
1009 VclBuilder::stringmap::iterator aFind = rMap.find(OString("icon-name"));
1010 if (aFind != rMap.end())
1011 {
1012 sIconName = aFind->second;
1013 rMap.erase(aFind);
1014 }
1015 return sIconName;
1016 }
1017
1018 OUString extractStockId(VclBuilder::stringmap &rMap)
1019 {
1020 OUString sIconName;
1021 VclBuilder::stringmap::iterator aFind = rMap.find(OString("stock-id"));
1022 if (aFind != rMap.end())
1023 {
1024 sIconName = aFind->second;
1025 rMap.erase(aFind);
1026 }
1027 return sIconName;
1028 }
1029
1030 OUString getStockText(const OUString &rType)
1031 {
1032 if (rType == "gtk-ok")
1033 return VclResId(SV_BUTTONTEXT_OKreinterpret_cast<char const *>("SV_BUTTONTEXT_OK" "\004"
u8"~OK")
);
1034 else if (rType == "gtk-cancel")
1035 return VclResId(SV_BUTTONTEXT_CANCELreinterpret_cast<char const *>("SV_BUTTONTEXT_CANCEL" "\004"
u8"~Cancel")
);
1036 else if (rType == "gtk-help")
1037 return VclResId(SV_BUTTONTEXT_HELPreinterpret_cast<char const *>("SV_BUTTONTEXT_HELP" "\004"
u8"~Help")
);
1038 else if (rType == "gtk-close")
1039 return VclResId(SV_BUTTONTEXT_CLOSEreinterpret_cast<char const *>("SV_BUTTONTEXT_CLOSE" "\004"
u8"~Close")
);
1040 else if (rType == "gtk-revert-to-saved")
1041 return VclResId(SV_BUTTONTEXT_RESETreinterpret_cast<char const *>("SV_BUTTONTEXT_RESET" "\004"
u8"R~eset")
);
1042 else if (rType == "gtk-add")
1043 return VclResId(SV_BUTTONTEXT_ADDreinterpret_cast<char const *>("SV_BUTTONTEXT_ADD" "\004"
u8"~Add")
);
1044 else if (rType == "gtk-delete")
1045 return VclResId(SV_BUTTONTEXT_DELETEreinterpret_cast<char const *>("SV_BUTTONTEXT_DELETE" "\004"
u8"~Delete")
);
1046 else if (rType == "gtk-remove")
1047 return VclResId(SV_BUTTONTEXT_REMOVEreinterpret_cast<char const *>("SV_BUTTONTEXT_REMOVE" "\004"
u8"~Remove")
);
1048 else if (rType == "gtk-new")
1049 return VclResId(SV_BUTTONTEXT_NEWreinterpret_cast<char const *>("SV_BUTTONTEXT_NEW" "\004"
u8"~New")
);
1050 else if (rType == "gtk-edit")
1051 return VclResId(SV_BUTTONTEXT_EDITreinterpret_cast<char const *>("SV_BUTTONTEXT_EDIT" "\004"
u8"~Edit")
);
1052 else if (rType == "gtk-apply")
1053 return VclResId(SV_BUTTONTEXT_APPLYreinterpret_cast<char const *>("SV_BUTTONTEXT_APPLY" "\004"
u8"~Apply")
);
1054 else if (rType == "gtk-save")
1055 return VclResId(SV_BUTTONTEXT_SAVEreinterpret_cast<char const *>("SV_BUTTONTEXT_SAVE" "\004"
u8"~Save")
);
1056 else if (rType == "gtk-open")
1057 return VclResId(SV_BUTTONTEXT_OPENreinterpret_cast<char const *>("SV_BUTTONTEXT_OPEN" "\004"
u8"~Open")
);
1058 else if (rType == "gtk-undo")
1059 return VclResId(SV_BUTTONTEXT_UNDOreinterpret_cast<char const *>("SV_BUTTONTEXT_UNDO" "\004"
u8"~Undo")
);
1060 else if (rType == "gtk-paste")
1061 return VclResId(SV_BUTTONTEXT_PASTEreinterpret_cast<char const *>("SV_BUTTONTEXT_PASTE" "\004"
u8"~Paste")
);
1062 else if (rType == "gtk-media-next")
1063 return VclResId(SV_BUTTONTEXT_NEXTreinterpret_cast<char const *>("SV_BUTTONTEXT_NEXT" "\004"
u8"~Next")
);
1064 else if (rType == "gtk-media-previous")
1065 return VclResId(SV_BUTTONTEXT_PREVreinterpret_cast<char const *>("SV_BUTTONTEXT_PREV" "\004"
u8"~Previous")
);
1066 else if (rType == "gtk-go-up")
1067 return VclResId(SV_BUTTONTEXT_GO_UPreinterpret_cast<char const *>("SV_BUTTONTEXT_GO_UP" "\004"
u8"~Up")
);
1068 else if (rType == "gtk-go-down")
1069 return VclResId(SV_BUTTONTEXT_GO_DOWNreinterpret_cast<char const *>("SV_BUTTONTEXT_GO_DOWN" "\004"
u8"Do~wn")
);
1070 else if (rType == "gtk-clear")
1071 return VclResId(SV_BUTTONTEXT_CLEARreinterpret_cast<char const *>("SV_BUTTONTEXT_CLEAR" "\004"
u8"~Clear")
);
1072 else if (rType == "gtk-media-play")
1073 return VclResId(SV_BUTTONTEXT_PLAYreinterpret_cast<char const *>("SV_BUTTONTEXT_PLAY" "\004"
u8"~Play")
);
1074 else if (rType == "gtk-find")
1075 return VclResId(SV_BUTTONTEXT_FINDreinterpret_cast<char const *>("SV_BUTTONTEXT_FIND" "\004"
u8"~Find")
);
1076 else if (rType == "gtk-stop")
1077 return VclResId(SV_BUTTONTEXT_STOPreinterpret_cast<char const *>("SV_BUTTONTEXT_STOP" "\004"
u8"~Stop")
);
1078 else if (rType == "gtk-connect")
1079 return VclResId(SV_BUTTONTEXT_CONNECTreinterpret_cast<char const *>("SV_BUTTONTEXT_CONNECT" "\004"
u8"C~onnect")
);
1080 else if (rType == "gtk-yes")
1081 return VclResId(SV_BUTTONTEXT_YESreinterpret_cast<char const *>("SV_BUTTONTEXT_YES" "\004"
u8"~Yes")
);
1082 else if (rType == "gtk-no")
1083 return VclResId(SV_BUTTONTEXT_NOreinterpret_cast<char const *>("SV_BUTTONTEXT_NO" "\004"
u8"~No")
);
1084 SAL_WARN("vcl.builder", "unknown stock type: " << rType)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unknown stock type: "
<< rType) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1084" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unknown stock type: " << rType
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unknown stock type: " << rType; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1084" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unknown stock type: " << rType) == 1) { ::
sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1084" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unknown stock type: " << rType
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unknown stock type: " << rType; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1084" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
1085 return OUString();
1086 }
1087
1088 bool extractStock(VclBuilder::stringmap &rMap)
1089 {
1090 bool bIsStock = false;
1091 VclBuilder::stringmap::iterator aFind = rMap.find(OString("use-stock"));
1092 if (aFind != rMap.end())
1093 {
1094 bIsStock = toBool(aFind->second);
1095 rMap.erase(aFind);
1096 }
1097 return bIsStock;
1098 }
1099
1100 WinBits extractRelief(VclBuilder::stringmap &rMap)
1101 {
1102 WinBits nBits = WB_3DLOOK;
1103 VclBuilder::stringmap::iterator aFind = rMap.find(OString("relief"));
1104 if (aFind != rMap.end())
1105 {
1106 if (aFind->second == "half")
1107 nBits = WB_FLATBUTTON | WB_BEVELBUTTON;
1108 else if (aFind->second == "none")
1109 nBits = WB_FLATBUTTON;
1110 rMap.erase(aFind);
1111 }
1112 return nBits;
1113 }
1114
1115 OUString extractLabel(VclBuilder::stringmap &rMap)
1116 {
1117 OUString sType;
1118 VclBuilder::stringmap::iterator aFind = rMap.find(OString("label"));
1119 if (aFind != rMap.end())
1120 {
1121 sType = aFind->second;
1122 rMap.erase(aFind);
1123 }
1124 return sType;
1125 }
1126
1127 OUString extractActionName(VclBuilder::stringmap &rMap)
1128 {
1129 OUString sActionName;
1130 VclBuilder::stringmap::iterator aFind = rMap.find(OString("action-name"));
1131 if (aFind != rMap.end())
1132 {
1133 sActionName = aFind->second;
1134 rMap.erase(aFind);
1135 }
1136 return sActionName;
1137 }
1138
1139 bool extractVisible(VclBuilder::stringmap &rMap)
1140 {
1141 bool bRet = false;
1142 VclBuilder::stringmap::iterator aFind = rMap.find(OString("visible"));
1143 if (aFind != rMap.end())
1144 {
1145 bRet = toBool(aFind->second);
1146 rMap.erase(aFind);
1147 }
1148 return bRet;
1149 }
1150
1151 Size extractSizeRequest(VclBuilder::stringmap &rMap)
1152 {
1153 OUString sWidthRequest("0");
1154 OUString sHeightRequest("0");
1155 VclBuilder::stringmap::iterator aFind = rMap.find(OString("width-request"));
1156 if (aFind != rMap.end())
1157 {
1158 sWidthRequest = aFind->second;
1159 rMap.erase(aFind);
1160 }
1161 aFind = rMap.find("height-request");
1162 if (aFind != rMap.end())
1163 {
1164 sHeightRequest = aFind->second;
1165 rMap.erase(aFind);
1166 }
1167 return Size(sWidthRequest.toInt32(), sHeightRequest.toInt32());
1168 }
1169
1170 OUString extractTooltipText(VclBuilder::stringmap &rMap)
1171 {
1172 OUString sTooltipText;
1173 VclBuilder::stringmap::iterator aFind = rMap.find(OString("tooltip-text"));
1174 if (aFind == rMap.end())
1175 aFind = rMap.find(OString("tooltip-markup"));
1176 if (aFind != rMap.end())
1177 {
1178 sTooltipText = aFind->second;
1179 rMap.erase(aFind);
1180 }
1181 return sTooltipText;
1182 }
1183
1184 float extractAlignment(VclBuilder::stringmap &rMap)
1185 {
1186 float f = 0.0;
1187 VclBuilder::stringmap::iterator aFind = rMap.find(OString("alignment"));
1188 if (aFind != rMap.end())
1189 {
1190 f = aFind->second.toFloat();
1191 rMap.erase(aFind);
1192 }
1193 return f;
1194 }
1195
1196 OUString extractTitle(VclBuilder::stringmap &rMap)
1197 {
1198 OUString sTitle;
1199 VclBuilder::stringmap::iterator aFind = rMap.find(OString("title"));
1200 if (aFind != rMap.end())
1201 {
1202 sTitle = aFind->second;
1203 rMap.erase(aFind);
1204 }
1205 return sTitle;
1206 }
1207
1208 bool extractHeadersVisible(VclBuilder::stringmap &rMap)
1209 {
1210 bool bHeadersVisible = true;
1211 VclBuilder::stringmap::iterator aFind = rMap.find(OString("headers-visible"));
1212 if (aFind != rMap.end())
1213 {
1214 bHeadersVisible = toBool(aFind->second);
1215 rMap.erase(aFind);
1216 }
1217 return bHeadersVisible;
1218 }
1219
1220 bool extractSortIndicator(VclBuilder::stringmap &rMap)
1221 {
1222 bool bSortIndicator = false;
1223 VclBuilder::stringmap::iterator aFind = rMap.find(OString("sort-indicator"));
1224 if (aFind != rMap.end())
1225 {
1226 bSortIndicator = toBool(aFind->second);
1227 rMap.erase(aFind);
1228 }
1229 return bSortIndicator;
1230 }
1231
1232 bool extractClickable(VclBuilder::stringmap &rMap)
1233 {
1234 bool bClickable = false;
1235 VclBuilder::stringmap::iterator aFind = rMap.find(OString("clickable"));
1236 if (aFind != rMap.end())
1237 {
1238 bClickable = toBool(aFind->second);
1239 rMap.erase(aFind);
1240 }
1241 return bClickable;
1242 }
1243
1244 void setupFromActionName(Button *pButton, VclBuilder::stringmap &rMap, const css::uno::Reference<css::frame::XFrame>& rFrame)
1245 {
1246 if (!rFrame.is())
1247 return;
1248
1249 OUString aCommand(extractActionName(rMap));
1250 if (aCommand.isEmpty())
1251 return;
1252
1253 OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(rFrame));
1254 auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(aCommand, aModuleName);
1255 OUString aLabel(vcl::CommandInfoProvider::GetLabelForCommand(aProperties));
1256 if (!aLabel.isEmpty())
1257 pButton->SetText(aLabel);
1258
1259 OUString aTooltip(vcl::CommandInfoProvider::GetTooltipForCommand(aCommand, aProperties, rFrame));
1260 if (!aTooltip.isEmpty())
1261 pButton->SetQuickHelpText(aTooltip);
1262
1263 Image aImage(vcl::CommandInfoProvider::GetImageForCommand(aCommand, rFrame));
1264 pButton->SetModeImage(aImage);
1265
1266 pButton->SetCommandHandler(aCommand);
1267 }
1268
1269 VclPtr<Button> extractStockAndBuildPushButton(vcl::Window *pParent, VclBuilder::stringmap &rMap, bool bToggle, bool bLegacy)
1270 {
1271 WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER;
1272 if (bToggle)
1273 nBits |= WB_TOGGLE;
1274
1275 nBits |= extractRelief(rMap);
1276
1277 VclPtr<Button> xWindow;
1278
1279 if (extractStock(rMap))
1280 {
1281 OUString sType = extractLabel(rMap);
1282 if (bLegacy)
1283 {
1284 if (sType == "gtk-ok")
1285 xWindow = VclPtr<OKButton>::Create(pParent, nBits);
1286 else if (sType == "gtk-cancel")
1287 xWindow = VclPtr<CancelButton>::Create(pParent, nBits);
1288 else if (sType == "gtk-close")
1289 xWindow = VclPtr<CloseButton>::Create(pParent, nBits);
1290 else if (sType == "gtk-help")
1291 xWindow = VclPtr<HelpButton>::Create(pParent, nBits);
1292 }
1293 if (!xWindow)
1294 {
1295 xWindow = VclPtr<PushButton>::Create(pParent, nBits);
1296 xWindow->SetText(getStockText(sType));
1297 }
1298 }
1299
1300 if (!xWindow)
1301 xWindow = VclPtr<PushButton>::Create(pParent, nBits);
1302 return xWindow;
1303 }
1304
1305 VclPtr<MenuButton> extractStockAndBuildMenuButton(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1306 {
1307 WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER|WB_3DLOOK;
1308
1309 nBits |= extractRelief(rMap);
1310
1311 VclPtr<MenuButton> xWindow = VclPtr<MenuButton>::Create(pParent, nBits);
1312
1313 if (extractStock(rMap))
1314 {
1315 xWindow->SetText(getStockText(extractLabel(rMap)));
1316 }
1317
1318 return xWindow;
1319 }
1320
1321 VclPtr<Button> extractStockAndBuildMenuToggleButton(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1322 {
1323 WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER|WB_3DLOOK;
1324
1325 nBits |= extractRelief(rMap);
1326
1327 VclPtr<Button> xWindow = VclPtr<MenuToggleButton>::Create(pParent, nBits);
1328
1329 if (extractStock(rMap))
1330 {
1331 xWindow->SetText(getStockText(extractLabel(rMap)));
1332 }
1333
1334 return xWindow;
1335 }
1336
1337 WinBits extractDeferredBits(VclBuilder::stringmap &rMap)
1338 {
1339 WinBits nBits = WB_3DLOOK|WB_HIDE;
1340 if (extractResizable(rMap))
1341 nBits |= WB_SIZEABLE;
1342 if (extractCloseable(rMap))
1343 nBits |= WB_CLOSEABLE;
1344 if (!extractDecorated(rMap))
1345 nBits |= WB_OWNERDRAWDECORATION;
1346 OUString sType(extractTypeHint(rMap));
1347 if (sType == "utility")
1348 nBits |= WB_SYSTEMWINDOW | WB_DIALOGCONTROL | WB_MOVEABLE;
1349 else if (sType == "popup-menu")
1350 nBits |= WB_SYSTEMWINDOW | WB_DIALOGCONTROL | WB_POPUP;
1351 else if (sType == "dock")
1352 nBits |= WB_DOCKABLE | WB_MOVEABLE;
1353 else
1354 nBits |= WB_MOVEABLE;
1355 return nBits;
1356 }
1357}
1358
1359void VclBuilder::extractGroup(const OString &id, stringmap &rMap)
1360{
1361 VclBuilder::stringmap::iterator aFind = rMap.find(OString("group"));
1362 if (aFind != rMap.end())
1363 {
1364 OUString sID = aFind->second;
1365 sal_Int32 nDelim = sID.indexOf(':');
1366 if (nDelim != -1)
1367 sID = sID.copy(0, nDelim);
1368 m_pParserState->m_aGroupMaps.emplace_back(id, sID.toUtf8());
1369 rMap.erase(aFind);
1370 }
1371}
1372
1373void VclBuilder::connectNumericFormatterAdjustment(const OString &id, const OUString &rAdjustment)
1374{
1375 if (!rAdjustment.isEmpty())
1376 m_pParserState->m_aNumericFormatterAdjustmentMaps.emplace_back(id, rAdjustment);
1377}
1378
1379void VclBuilder::connectFormattedFormatterAdjustment(const OString &id, const OUString &rAdjustment)
1380{
1381 if (!rAdjustment.isEmpty())
1382 m_pParserState->m_aFormattedFormatterAdjustmentMaps.emplace_back(id, rAdjustment);
1383}
1384
1385bool VclBuilder::extractAdjustmentToMap(const OString& id, VclBuilder::stringmap& rMap, std::vector<WidgetAdjustmentMap>& rAdjustmentMap)
1386{
1387 VclBuilder::stringmap::iterator aFind = rMap.find(OString("adjustment"));
1388 if (aFind != rMap.end())
1389 {
1390 rAdjustmentMap.emplace_back(id, aFind->second);
1391 rMap.erase(aFind);
1392 return true;
1393 }
1394 return false;
1395}
1396
1397namespace
1398{
1399 sal_Int32 extractActive(VclBuilder::stringmap &rMap)
1400 {
1401 sal_Int32 nActiveId = 0;
1402 VclBuilder::stringmap::iterator aFind = rMap.find(OString("active"));
1403 if (aFind != rMap.end())
1404 {
1405 nActiveId = aFind->second.toInt32();
1406 rMap.erase(aFind);
1407 }
1408 return nActiveId;
1409 }
1410
1411 bool extractSelectable(VclBuilder::stringmap &rMap)
1412 {
1413 bool bSelectable = false;
1414 VclBuilder::stringmap::iterator aFind = rMap.find(OString("selectable"));
1415 if (aFind != rMap.end())
1416 {
1417 bSelectable = toBool(aFind->second);
1418 rMap.erase(aFind);
1419 }
1420 return bSelectable;
1421 }
1422
1423 OUString extractAdjustment(VclBuilder::stringmap &rMap)
1424 {
1425 OUString sAdjustment;
1426 VclBuilder::stringmap::iterator aFind = rMap.find(OString("adjustment"));
1427 if (aFind != rMap.end())
1428 {
1429 sAdjustment= aFind->second;
1430 rMap.erase(aFind);
1431 return sAdjustment;
1432 }
1433 return sAdjustment;
1434 }
1435
1436 bool extractDrawIndicator(VclBuilder::stringmap &rMap)
1437 {
1438 bool bDrawIndicator = false;
1439 VclBuilder::stringmap::iterator aFind = rMap.find(OString("draw-indicator"));
1440 if (aFind != rMap.end())
1441 {
1442 bDrawIndicator = toBool(aFind->second);
1443 rMap.erase(aFind);
1444 }
1445 return bDrawIndicator;
1446 }
1447}
1448
1449void VclBuilder::extractModel(const OString &id, stringmap &rMap)
1450{
1451 VclBuilder::stringmap::iterator aFind = rMap.find(OString("model"));
1452 if (aFind != rMap.end())
1453 {
1454 m_pParserState->m_aModelMaps.emplace_back(id, aFind->second,
1455 extractActive(rMap));
1456 rMap.erase(aFind);
1457 }
1458}
1459
1460void VclBuilder::extractBuffer(const OString &id, stringmap &rMap)
1461{
1462 VclBuilder::stringmap::iterator aFind = rMap.find(OString("buffer"));
1463 if (aFind != rMap.end())
1464 {
1465 m_pParserState->m_aTextBufferMaps.emplace_back(id, aFind->second);
1466 rMap.erase(aFind);
1467 }
1468}
1469
1470void VclBuilder::extractStock(const OString &id, stringmap &rMap)
1471{
1472 VclBuilder::stringmap::iterator aFind = rMap.find(OString("stock"));
1473 if (aFind == rMap.end())
1474 return;
1475
1476 stockinfo aInfo;
1477 aInfo.m_sStock = aFind->second;
1478 rMap.erase(aFind);
1479 aFind = rMap.find(OString("icon-size"));
1480 if (aFind != rMap.end())
1481 {
1482 aInfo.m_nSize = aFind->second.toInt32();
1483 rMap.erase(aFind);
1484 }
1485 m_pParserState->m_aStockMap[id] = aInfo;
1486}
1487
1488void VclBuilder::extractButtonImage(const OString &id, stringmap &rMap, bool bRadio)
1489{
1490 VclBuilder::stringmap::iterator aFind = rMap.find(OString("image"));
1491 if (aFind != rMap.end())
1492 {
1493 m_pParserState->m_aButtonImageWidgetMaps.emplace_back(id, aFind->second, bRadio);
1494 rMap.erase(aFind);
1495 }
1496}
1497
1498void VclBuilder::extractMnemonicWidget(const OString &rLabelID, stringmap &rMap)
1499{
1500 VclBuilder::stringmap::iterator aFind = rMap.find(OString("mnemonic-widget"));
1501 if (aFind != rMap.end())
1502 {
1503 OUString sID = aFind->second;
1504 sal_Int32 nDelim = sID.indexOf(':');
1505 if (nDelim != -1)
1506 sID = sID.copy(0, nDelim);
1507 m_pParserState->m_aMnemonicWidgetMaps.emplace_back(rLabelID, sID);
1508 rMap.erase(aFind);
1509 }
1510}
1511
1512vcl::Window* VclBuilder::prepareWidgetOwnScrolling(vcl::Window *pParent, WinBits &rWinStyle)
1513{
1514 //For Widgets that manage their own scrolling, if one appears as a child of
1515 //a scrolling window shoehorn that scrolling settings to this widget and
1516 //return the real parent to use
1517 if (pParent && pParent->GetType() == WindowType::SCROLLWINDOW)
1518 {
1519 WinBits nScrollBits = pParent->GetStyle();
1520 nScrollBits &= (WB_AUTOHSCROLL|WB_HSCROLL|WB_AUTOVSCROLL|WB_VSCROLL);
1521 rWinStyle |= nScrollBits;
1522 if (static_cast<VclScrolledWindow*>(pParent)->HasVisibleBorder())
1523 rWinStyle |= WB_BORDER;
1524 pParent = pParent->GetParent();
1525 }
1526
1527 return pParent;
1528}
1529
1530void VclBuilder::cleanupWidgetOwnScrolling(vcl::Window *pScrollParent, vcl::Window *pWindow, stringmap &rMap)
1531{
1532 //remove the redundant scrolling parent
1533 sal_Int32 nWidthReq = pScrollParent->get_width_request();
1534 rMap[OString("width-request")] = OUString::number(nWidthReq);
1535 sal_Int32 nHeightReq = pScrollParent->get_height_request();
1536 rMap[OString("height-request")] = OUString::number(nHeightReq);
1537
1538 m_pParserState->m_aRedundantParentWidgets[pScrollParent] = pWindow;
1539}
1540
1541#ifndef DISABLE_DYNLOADING
1542
1543extern "C" { static void thisModule() {} }
1544
1545namespace {
1546
1547// Don't unload the module on destruction
1548class NoAutoUnloadModule : public osl::Module
1549{
1550public:
1551 ~NoAutoUnloadModule() { release(); }
1552};
1553
1554}
1555
1556typedef std::map<OUString, std::shared_ptr<NoAutoUnloadModule>> ModuleMap;
1557static ModuleMap g_aModuleMap;
1558
1559#if ENABLE_MERGELIBS0
1560static std::shared_ptr<NoAutoUnloadModule> g_pMergedLib = std::make_shared<NoAutoUnloadModule>();
1561#endif
1562
1563#ifndef SAL_DLLPREFIX"lib"
1564# define SAL_DLLPREFIX"lib" ""
1565#endif
1566
1567#endif
1568
1569void VclBuilder::preload()
1570{
1571#ifndef DISABLE_DYNLOADING
1572
1573#if ENABLE_MERGELIBS0
1574 g_pMergedLib->loadRelative(&thisModule, SVLIBRARY("merged")"lib" "merged" "lo" ".so");
1575#else
1576// find -name '*ui*' | xargs grep 'class=".*lo-' |
1577// sed 's/.*class="//' | sed 's/-.*$//' | sort | uniq
1578 static const char *aWidgetLibs[] = {
1579 "sfxlo", "svtlo", "svxcorelo", "foruilo",
1580 "vcllo", "svxlo", "cuilo", "swlo",
1581 "swuilo", "sclo", "sdlo", "chartcontrollerlo",
1582 "smlo", "scuilo", "basctllo", "sduilo",
1583 "scnlo", "xsltdlglo", "pcrlo" // "dbulo"
1584 };
1585 for (const auto & lib : aWidgetLibs)
1586 {
1587 std::unique_ptr<NoAutoUnloadModule> pModule(new NoAutoUnloadModule);
1588 OUString sModule = SAL_DLLPREFIX"lib" + OUString::createFromAscii(lib) + SAL_DLLEXTENSION".so";
1589 if (pModule->loadRelative(&thisModule, sModule))
1590 g_aModuleMap.insert(std::make_pair(sModule, std::move(pModule)));
1591 }
1592#endif // ENABLE_MERGELIBS
1593#endif // DISABLE_DYNLOADING
1594}
1595
1596#if defined DISABLE_DYNLOADING && !HAVE_FEATURE_DESKTOP1
1597extern "C" VclBuilder::customMakeWidget lo_get_custom_widget_func(const char* name);
1598#endif
1599
1600namespace
1601{
1602// Takes a string like "sfxlo-SidebarToolBox"
1603VclBuilder::customMakeWidget GetCustomMakeWidget(const OString& name)
1604{
1605 VclBuilder::customMakeWidget pFunction = nullptr;
1606 if (sal_Int32 nDelim = name.indexOf('-'); nDelim != -1)
1607 {
1608 const OString aFunction("make" + name.copy(nDelim + 1));
1609 const OUString sFunction(OStringToOUString(aFunction, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
1610
1611#ifndef DISABLE_DYNLOADING
1612 const OUString sModule = SAL_DLLPREFIX"lib"
1613 + OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)))
1614 + SAL_DLLEXTENSION".so";
1615 ModuleMap::iterator aI = g_aModuleMap.find(sModule);
1616 if (aI == g_aModuleMap.end())
1617 {
1618 std::shared_ptr<NoAutoUnloadModule> pModule;
1619#if ENABLE_MERGELIBS0
1620 if (!g_pMergedLib->is())
1621 g_pMergedLib->loadRelative(&thisModule, SVLIBRARY("merged")"lib" "merged" "lo" ".so");
1622 if ((pFunction = reinterpret_cast<VclBuilder::customMakeWidget>(
1623 g_pMergedLib->getFunctionSymbol(sFunction))))
1624 pModule = g_pMergedLib;
1625#endif
1626 if (!pFunction)
1627 {
1628 pModule = std::make_shared<NoAutoUnloadModule>();
1629 bool ok = pModule->loadRelative(&thisModule, sModule);
1630 if (!ok)
1631 {
1632#ifdef LINUX1
1633 // in the case of preloading, we don't have eg. the
1634 // libcuilo.so, but still need to dlsym the symbols -
1635 // which are already in-process
1636 if (comphelper::LibreOfficeKit::isActive())
1637 {
1638 pFunction = reinterpret_cast<VclBuilder::customMakeWidget>(dlsym(RTLD_DEFAULT((void *) 0), aFunction.getStr()));
1639 ok = !!pFunction;
1640 assert(ok && "couldn't even directly dlsym the sFunction (available via preload)")(static_cast <bool> (ok && "couldn't even directly dlsym the sFunction (available via preload)"
) ? void (0) : __assert_fail ("ok && \"couldn't even directly dlsym the sFunction (available via preload)\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1640, __extension__ __PRETTY_FUNCTION__))
;
1641 }
1642#endif
1643 assert(ok && "bad module name in .ui")(static_cast <bool> (ok && "bad module name in .ui"
) ? void (0) : __assert_fail ("ok && \"bad module name in .ui\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1643, __extension__ __PRETTY_FUNCTION__))
;
1644 }
1645 else
1646 {
1647 pFunction = reinterpret_cast<VclBuilder::customMakeWidget>(
1648 pModule->getFunctionSymbol(sFunction));
1649 }
1650 }
1651 g_aModuleMap.insert(std::make_pair(sModule, pModule));
1652 }
1653 else
1654 pFunction = reinterpret_cast<VclBuilder::customMakeWidget>(
1655 aI->second->getFunctionSymbol(sFunction));
1656#elif !HAVE_FEATURE_DESKTOP1
1657 pFunction = lo_get_custom_widget_func(sFunction.toUtf8().getStr());
1658 SAL_WARN_IF(!pFunction, "vcl.builder", "Could not find " << sFunction)do { if (true && (!pFunction)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "Could not find "
<< sFunction) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1658" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "Could not find " << sFunction
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Could not find " << sFunction; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1658" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Could not find " << sFunction) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1658" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "Could not find " << sFunction
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Could not find " << sFunction; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1658" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
1659 assert(pFunction)(static_cast <bool> (pFunction) ? void (0) : __assert_fail
("pFunction", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1659, __extension__ __PRETTY_FUNCTION__))
;
1660#else
1661 pFunction = reinterpret_cast<VclBuilder::customMakeWidget>(
1662 osl_getFunctionSymbol((oslModule)RTLD_DEFAULT((void *) 0), sFunction.pData));
1663#endif
1664 }
1665 return pFunction;
1666}
1667}
1668
1669VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString &name, const OString &id,
1670 stringmap &rMap)
1671{
1672 bool bIsPlaceHolder = name.isEmpty();
1673 bool bVertical = false;
1674
1675 if (pParent && (pParent->GetType() == WindowType::TABCONTROL ||
1
Assuming 'pParent' is non-null
2
Assuming the condition is false
4
Taking true branch
1676 pParent->GetType() == WindowType::VERTICALTABCONTROL))
3
Assuming the condition is true
1677 {
1678 bool bTopLevel(name == "GtkDialog" || name == "GtkMessageDialog" ||
1679 name == "GtkWindow" || name == "GtkPopover" || name == "GtkAssistant");
1680 if (!bTopLevel
4.1
'bTopLevel' is false
4.1
'bTopLevel' is false
4.1
'bTopLevel' is false
)
5
Taking true branch
1681 {
1682 if (pParent->GetType() == WindowType::TABCONTROL)
6
Assuming the condition is true
7
Taking true branch
1683 {
1684 //We have to add a page
1685 //make default pageid == position
1686 TabControl *pTabControl = static_cast<TabControl*>(pParent);
1687 sal_uInt16 nNewPageCount = pTabControl->GetPageCount()+1;
1688 sal_uInt16 nNewPageId = nNewPageCount;
1689 pTabControl->InsertPage(nNewPageId, OUString());
1690 pTabControl->SetCurPageId(nNewPageId);
1691 SAL_WARN_IF(bIsPlaceHolder, "vcl.builder", "we should have no placeholders for tabpages")do { if (true && (bIsPlaceHolder)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "we should have no placeholders for tabpages"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1691" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "we should have no placeholders for tabpages"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "we should have no placeholders for tabpages"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder")
, ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1691" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "we should have no placeholders for tabpages") ==
1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1691" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "we should have no placeholders for tabpages"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "we should have no placeholders for tabpages"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder")
, ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1691" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
8
Taking false branch
9
Loop condition is false. Exiting loop
1692 if (!bIsPlaceHolder
9.1
'bIsPlaceHolder' is false
9.1
'bIsPlaceHolder' is false
9.1
'bIsPlaceHolder' is false
)
10
Taking true branch
1693 {
1694 VclPtrInstance<TabPage> pPage(pTabControl);
1695 pPage->Show();
1696
1697 //Make up a name for it
1698 OString sTabPageId = get_by_window(pParent) +
1699 "-page" +
1700 OString::number(nNewPageCount);
1701 m_aChildren.emplace_back(sTabPageId, pPage, false);
1702 pPage->SetHelpId(m_sHelpRoot + sTabPageId);
1703
1704 pParent = pPage;
1705
1706 pTabControl->SetTabPage(nNewPageId, pPage);
1707 }
11
Calling implicit destructor for 'VclPtrInstance<TabPage>'
12
Calling implicit destructor for 'VclPtr<TabPage>'
13
Calling '~Reference'
20
Returning from '~Reference'
21
Returning from destructor for 'VclPtr<TabPage>'
22
Returning from destructor for 'VclPtrInstance<TabPage>'
1708 }
1709 else
1710 {
1711 VerticalTabControl *pTabControl = static_cast<VerticalTabControl*>(pParent);
1712 SAL_WARN_IF(bIsPlaceHolder, "vcl.builder", "we should have no placeholders for tabpages")do { if (true && (bIsPlaceHolder)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "we should have no placeholders for tabpages"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1712" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "we should have no placeholders for tabpages"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "we should have no placeholders for tabpages"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder")
, ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1712" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "we should have no placeholders for tabpages") ==
1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1712" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "we should have no placeholders for tabpages"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "we should have no placeholders for tabpages"; ::sal
::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder")
, ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "1712" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
1713 if (!bIsPlaceHolder)
1714 pParent = pTabControl->GetPageParent();
1715 }
1716 }
1717 }
1718
1719 if (bIsPlaceHolder
22.1
'bIsPlaceHolder' is false
22.1
'bIsPlaceHolder' is false
22.1
'bIsPlaceHolder' is false
|| name == "GtkTreeSelection")
23
Taking false branch
1720 return nullptr;
1721
1722 ToolBox *pToolBox = (pParent
23.1
'pParent' is non-null
23.1
'pParent' is non-null
23.1
'pParent' is non-null
&& pParent->GetType() == WindowType::TOOLBOX) ? static_cast<ToolBox*>(pParent) : nullptr;
24
Use of memory after it is freed
1723
1724 extractButtonImage(id, rMap, name == "GtkRadioButton");
1725
1726 VclPtr<vcl::Window> xWindow;
1727 if (name == "GtkDialog" || name == "GtkAssistant")
1728 {
1729 // WB_ALLOWMENUBAR because we don't know in advance if we will encounter
1730 // a menubar, and menubars need a BorderWindow in the toplevel, and
1731 // such border windows need to be in created during the dialog ctor
1732 WinBits nBits = WB_MOVEABLE|WB_3DLOOK|WB_ALLOWMENUBAR;
1733 if (extractResizable(rMap))
1734 nBits |= WB_SIZEABLE;
1735 if (extractCloseable(rMap))
1736 nBits |= WB_CLOSEABLE;
1737 Dialog::InitFlag eInit = !pParent ? Dialog::InitFlag::NoParent : Dialog::InitFlag::Default;
1738 if (name == "GtkAssistant")
1739 xWindow = VclPtr<vcl::RoadmapWizard>::Create(pParent, nBits, eInit);
1740 else
1741 xWindow = VclPtr<Dialog>::Create(pParent, nBits, eInit);
1742#if HAVE_FEATURE_DESKTOP1
1743 if (!extractModal(rMap))
1744 xWindow->SetType(WindowType::MODELESSDIALOG);
1745#endif
1746 }
1747 else if (name == "GtkMessageDialog")
1748 {
1749 WinBits nBits = WB_MOVEABLE|WB_3DLOOK|WB_CLOSEABLE;
1750 if (extractResizable(rMap))
1751 nBits |= WB_SIZEABLE;
1752 VclPtr<MessageDialog> xDialog(VclPtr<MessageDialog>::Create(pParent, nBits));
1753 m_pParserState->m_aMessageDialogs.push_back(xDialog);
1754 xWindow = xDialog;
1755#if defined _WIN32
1756 xWindow->set_border_width(3);
1757#else
1758 xWindow->set_border_width(12);
1759#endif
1760 }
1761 else if (name == "GtkBox" || name == "GtkStatusbar")
1762 {
1763 bVertical = extractOrientation(rMap);
1764 if (bVertical)
1765 xWindow = VclPtr<VclVBox>::Create(pParent);
1766 else
1767 xWindow = VclPtr<VclHBox>::Create(pParent);
1768 }
1769 else if (name == "GtkPaned")
1770 {
1771 bVertical = extractOrientation(rMap);
1772 if (bVertical)
1773 xWindow = VclPtr<VclVPaned>::Create(pParent);
1774 else
1775 xWindow = VclPtr<VclHPaned>::Create(pParent);
1776 }
1777 else if (name == "GtkHBox")
1778 xWindow = VclPtr<VclHBox>::Create(pParent);
1779 else if (name == "GtkVBox")
1780 xWindow = VclPtr<VclVBox>::Create(pParent);
1781 else if (name == "GtkButtonBox")
1782 {
1783 bVertical = extractOrientation(rMap);
1784 if (bVertical)
1785 xWindow = VclPtr<VclVButtonBox>::Create(pParent);
1786 else
1787 xWindow = VclPtr<VclHButtonBox>::Create(pParent);
1788 }
1789 else if (name == "GtkHButtonBox")
1790 xWindow = VclPtr<VclHButtonBox>::Create(pParent);
1791 else if (name == "GtkVButtonBox")
1792 xWindow = VclPtr<VclVButtonBox>::Create(pParent);
1793 else if (name == "GtkGrid")
1794 xWindow = VclPtr<VclGrid>::Create(pParent);
1795 else if (name == "GtkFrame")
1796 xWindow = VclPtr<VclFrame>::Create(pParent);
1797 else if (name == "GtkExpander")
1798 {
1799 VclPtrInstance<VclExpander> pExpander(pParent);
1800 m_pParserState->m_aExpanderWidgets.push_back(pExpander);
1801 xWindow = pExpander;
1802 }
1803 else if (name == "GtkAlignment")
1804 xWindow = VclPtr<VclAlignment>::Create(pParent);
1805 else if (name == "GtkButton" || (!m_bLegacy && name == "GtkToggleButton"))
1806 {
1807 VclPtr<Button> xButton;
1808 OUString sMenu = BuilderUtils::extractCustomProperty(rMap);
1809 if (sMenu.isEmpty())
1810 xButton = extractStockAndBuildPushButton(pParent, rMap, name == "GtkToggleButton", m_bLegacy);
1811 else
1812 {
1813 assert(m_bLegacy && "use GtkMenuButton")(static_cast <bool> (m_bLegacy && "use GtkMenuButton"
) ? void (0) : __assert_fail ("m_bLegacy && \"use GtkMenuButton\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1813, __extension__ __PRETTY_FUNCTION__))
;
1814 xButton = extractStockAndBuildMenuButton(pParent, rMap);
1815 m_pParserState->m_aButtonMenuMaps.emplace_back(id, sMenu);
1816 }
1817 xButton->SetImageAlign(ImageAlign::Left); //default to left
1818 setupFromActionName(xButton, rMap, m_xFrame);
1819 xWindow = xButton;
1820 }
1821 else if (name == "GtkMenuButton")
1822 {
1823 VclPtr<MenuButton> xButton = extractStockAndBuildMenuButton(pParent, rMap);
1824 OUString sMenu = extractPopupMenu(rMap);
1825 if (!sMenu.isEmpty())
1826 m_pParserState->m_aButtonMenuMaps.emplace_back(id, sMenu);
1827 xButton->SetImageAlign(ImageAlign::Left); //default to left
1828 xButton->SetAccessibleRole(css::accessibility::AccessibleRole::BUTTON_MENU);
1829
1830 if (!extractDrawIndicator(rMap))
1831 xButton->SetDropDown(PushButtonDropdownStyle::NONE);
1832
1833 setupFromActionName(xButton, rMap, m_xFrame);
1834 xWindow = xButton;
1835 }
1836 else if (name == "GtkToggleButton" && m_bLegacy)
1837 {
1838 VclPtr<Button> xButton;
1839 OUString sMenu = BuilderUtils::extractCustomProperty(rMap);
1840 assert(sMenu.getLength() && "not implemented yet")(static_cast <bool> (sMenu.getLength() && "not implemented yet"
) ? void (0) : __assert_fail ("sMenu.getLength() && \"not implemented yet\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1840, __extension__ __PRETTY_FUNCTION__))
;
1841 xButton = extractStockAndBuildMenuToggleButton(pParent, rMap);
1842 m_pParserState->m_aButtonMenuMaps.emplace_back(id, sMenu);
1843 xButton->SetImageAlign(ImageAlign::Left); //default to left
1844 setupFromActionName(xButton, rMap, m_xFrame);
1845 xWindow = xButton;
1846 }
1847 else if (name == "GtkRadioButton")
1848 {
1849 extractGroup(id, rMap);
1850 WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER|WB_3DLOOK;
1851 VclPtr<RadioButton> xButton = VclPtr<RadioButton>::Create(pParent, nBits);
1852 xButton->SetImageAlign(ImageAlign::Left); //default to left
1853 xWindow = xButton;
1854
1855 if (::extractStock(rMap))
1856 {
1857 xWindow->SetText(getStockText(extractLabel(rMap)));
1858 }
1859 }
1860 else if (name == "GtkCheckButton")
1861 {
1862 WinBits nBits = WB_CLIPCHILDREN|WB_CENTER|WB_VCENTER|WB_3DLOOK;
1863 bool bIsTriState = extractInconsistent(rMap);
1864 VclPtr<CheckBox> xCheckBox = VclPtr<CheckBox>::Create(pParent, nBits);
1865 if (bIsTriState)
1866 {
1867 xCheckBox->EnableTriState(true);
1868 xCheckBox->SetState(TRISTATE_INDET);
1869 }
1870 xCheckBox->SetImageAlign(ImageAlign::Left); //default to left
1871
1872 xWindow = xCheckBox;
1873
1874 if (::extractStock(rMap))
1875 {
1876 xWindow->SetText(getStockText(extractLabel(rMap)));
1877 }
1878 }
1879 else if (name == "GtkSpinButton")
1880 {
1881 OUString sAdjustment = extractAdjustment(rMap);
1882
1883 WinBits nBits = WB_CLIPCHILDREN|WB_LEFT|WB_3DLOOK|WB_SPIN|WB_REPEAT;
1884 if (extractHasFrame(rMap))
1885 nBits |= WB_BORDER;
1886
1887 connectFormattedFormatterAdjustment(id, sAdjustment);
1888 VclPtrInstance<FormattedField> xField(pParent, nBits);
1889 xField->GetFormatter().SetMinValue(0);
1890 xWindow = xField;
1891 }
1892 else if (name == "GtkLinkButton")
1893 xWindow = VclPtr<FixedHyperlink>::Create(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK|WB_NOLABEL);
1894 else if (name == "GtkComboBox" || name == "GtkComboBoxText")
1895 {
1896 extractModel(id, rMap);
1897
1898 WinBits nBits = WB_CLIPCHILDREN|WB_LEFT|WB_VCENTER|WB_3DLOOK;
1899
1900 bool bDropdown = BuilderUtils::extractDropdown(rMap);
1901
1902 if (bDropdown)
1903 nBits |= WB_DROPDOWN;
1904
1905 if (extractEntry(rMap))
1906 {
1907 VclPtrInstance<ComboBox> xComboBox(pParent, nBits);
1908 xComboBox->EnableAutoSize(true);
1909 xWindow = xComboBox;
1910 }
1911 else
1912 {
1913 VclPtrInstance<ListBox> xListBox(pParent, nBits|WB_SIMPLEMODE);
1914 xListBox->EnableAutoSize(true);
1915 xWindow = xListBox;
1916 }
1917 }
1918 else if (name == "VclOptionalBox" || name == "sfxlo-OptionalBox")
1919 {
1920 // tdf#135495 fallback sfxlo-OptionalBox to VclOptionalBox as a stopgap
1921 xWindow = VclPtr<OptionalBox>::Create(pParent);
1922 }
1923 else if (name == "GtkIconView")
1924 {
1925 assert(rMap.find(OString("model")) != rMap.end() && "GtkIconView must have a model")(static_cast <bool> (rMap.find(OString("model")) != rMap
.end() && "GtkIconView must have a model") ? void (0)
: __assert_fail ("rMap.find(OString(\"model\")) != rMap.end() && \"GtkIconView must have a model\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1925, __extension__ __PRETTY_FUNCTION__))
;
1926
1927 //window we want to apply the packing props for this GtkIconView to
1928 VclPtr<vcl::Window> xWindowForPackingProps;
1929 extractModel(id, rMap);
1930 WinBits nWinStyle = WB_CLIPCHILDREN|WB_LEFT|WB_VCENTER|WB_3DLOOK;
1931 //IconView manages its own scrolling,
1932 vcl::Window *pRealParent = prepareWidgetOwnScrolling(pParent, nWinStyle);
1933
1934 VclPtr<IconView> xBox = VclPtr<IconView>::Create(pRealParent, nWinStyle);
1935 xWindowForPackingProps = xBox;
1936
1937 xWindow = xBox;
1938 xBox->SetNoAutoCurEntry(true);
1939 xBox->SetQuickSearch(true);
1940
1941 if (pRealParent != pParent)
1942 cleanupWidgetOwnScrolling(pParent, xWindowForPackingProps, rMap);
1943 }
1944 else if (name == "GtkTreeView")
1945 {
1946 if (!m_bLegacy)
1947 {
1948 assert(rMap.find(OString("model")) != rMap.end() && "GtkTreeView must have a model")(static_cast <bool> (rMap.find(OString("model")) != rMap
.end() && "GtkTreeView must have a model") ? void (0)
: __assert_fail ("rMap.find(OString(\"model\")) != rMap.end() && \"GtkTreeView must have a model\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 1948, __extension__ __PRETTY_FUNCTION__))
;
1949 }
1950
1951 //window we want to apply the packing props for this GtkTreeView to
1952 VclPtr<vcl::Window> xWindowForPackingProps;
1953 //To-Do
1954 //a) make SvHeaderTabListBox/SvTabListBox the default target for GtkTreeView
1955 //b) remove the non-drop down mode of ListBox and convert
1956 // everything over to SvHeaderTabListBox/SvTabListBox
1957 //c) remove the users of makeSvTabListBox and makeSvTreeListBox
1958 extractModel(id, rMap);
1959 WinBits nWinStyle = WB_CLIPCHILDREN|WB_LEFT|WB_VCENTER|WB_3DLOOK;
1960 if (m_bLegacy)
1961 {
1962 OUString sBorder = BuilderUtils::extractCustomProperty(rMap);
1963 if (!sBorder.isEmpty())
1964 nWinStyle |= WB_BORDER;
1965 }
1966 else
1967 {
1968 nWinStyle |= WB_HASBUTTONS | WB_HASBUTTONSATROOT;
1969 }
1970 //ListBox/SvHeaderTabListBox manages its own scrolling,
1971 vcl::Window *pRealParent = prepareWidgetOwnScrolling(pParent, nWinStyle);
1972 if (m_bLegacy)
1973 {
1974 xWindow = VclPtr<ListBox>::Create(pRealParent, nWinStyle | WB_SIMPLEMODE);
1975 xWindowForPackingProps = xWindow;
1976 }
1977 else
1978 {
1979 VclPtr<SvTabListBox> xBox;
1980 bool bHeadersVisible = extractHeadersVisible(rMap);
1981 if (bHeadersVisible)
1982 {
1983 VclPtr<VclVBox> xContainer = VclPtr<VclVBox>::Create(pRealParent);
1984 OString containerid(id + "-container");
1985 xContainer->SetHelpId(m_sHelpRoot + containerid);
1986 m_aChildren.emplace_back(containerid, xContainer, true);
1987
1988 VclPtrInstance<HeaderBar> xHeader(xContainer, WB_BUTTONSTYLE(WinBits(0x0800)) | WB_BORDER | WB_TABSTOP | WB_3DLOOK);
1989 xHeader->set_width_request(0); // let the headerbar width not affect the size request
1990 OString headerid(id + "-header");
1991 xHeader->SetHelpId(m_sHelpRoot + headerid);
1992 m_aChildren.emplace_back(headerid, xHeader, true);
1993
1994 VclPtr<LclHeaderTabListBox> xHeaderBox = VclPtr<LclHeaderTabListBox>::Create(xContainer, nWinStyle);
1995 xHeaderBox->InitHeaderBar(xHeader);
1996 xContainer->set_expand(true);
1997 xHeader->Show();
1998 xContainer->Show();
1999 xBox = xHeaderBox;
2000 xWindowForPackingProps = xContainer;
2001 }
2002 else
2003 {
2004 xBox = VclPtr<LclTabListBox>::Create(pRealParent, nWinStyle);
2005 xWindowForPackingProps = xBox;
2006 }
2007 xWindow = xBox;
2008 xBox->SetNoAutoCurEntry(true);
2009 xBox->SetQuickSearch(true);
2010 xBox->SetSpaceBetweenEntries(3);
2011 xBox->SetEntryHeight(16);
2012 xBox->SetHighlightRange(); // select over the whole width
2013 }
2014 if (pRealParent != pParent)
2015 cleanupWidgetOwnScrolling(pParent, xWindowForPackingProps, rMap);
2016 }
2017 else if (name == "GtkTreeViewColumn")
2018 {
2019 if (!m_bLegacy)
2020 {
2021 SvHeaderTabListBox* pTreeView = dynamic_cast<SvHeaderTabListBox*>(pParent);
2022 if (HeaderBar* pHeaderBar = pTreeView ? pTreeView->GetHeaderBar() : nullptr)
2023 {
2024 HeaderBarItemBits nBits = HeaderBarItemBits::LEFTIMAGE;
2025 if (extractClickable(rMap))
2026 nBits |= HeaderBarItemBits::CLICKABLE;
2027 if (extractSortIndicator(rMap))
2028 nBits |= HeaderBarItemBits::DOWNARROW;
2029 float fAlign = extractAlignment(rMap);
2030 if (fAlign == 0.0)
2031 nBits |= HeaderBarItemBits::LEFT;
2032 else if (fAlign == 1.0)
2033 nBits |= HeaderBarItemBits::RIGHT;
2034 else if (fAlign == 0.5)
2035 nBits |= HeaderBarItemBits::CENTER;
2036 auto nItemId = pHeaderBar->GetItemCount() + 1;
2037 OUString sTitle(extractTitle(rMap));
2038 pHeaderBar->InsertItem(nItemId, sTitle, 100, nBits);
2039 }
2040 }
2041 }
2042 else if (name == "GtkLabel")
2043 {
2044 WinBits nWinStyle = WB_CENTER|WB_VCENTER|WB_3DLOOK;
2045 extractMnemonicWidget(id, rMap);
2046 if (extractSelectable(rMap))
2047 xWindow = VclPtr<SelectableFixedText>::Create(pParent, nWinStyle);
2048 else
2049 xWindow = VclPtr<FixedText>::Create(pParent, nWinStyle);
2050 }
2051 else if (name == "GtkImage")
2052 {
2053 extractStock(id, rMap);
2054 xWindow = VclPtr<FixedImage>::Create(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK|WB_SCALE);
2055 //such parentless GtkImages are temps used to set icons on buttons
2056 //default them to hidden to stop e.g. insert->index entry flicking temp
2057 //full screen windows
2058 if (!pParent)
2059 {
2060 rMap["visible"] = "false";
2061 }
2062 }
2063 else if (name == "GtkSeparator")
2064 {
2065 bVertical = extractOrientation(rMap);
2066 xWindow = VclPtr<FixedLine>::Create(pParent, bVertical ? WB_VERT : WB_HORZ);
2067 }
2068 else if (name == "GtkScrollbar")
2069 {
2070 extractAdjustmentToMap(id, rMap, m_pParserState->m_aScrollAdjustmentMaps);
2071 bVertical = extractOrientation(rMap);
2072 xWindow = VclPtr<ScrollBar>::Create(pParent, bVertical ? WB_VERT : WB_HORZ);
2073 }
2074 else if (name == "GtkProgressBar")
2075 {
2076 extractAdjustmentToMap(id, rMap, m_pParserState->m_aScrollAdjustmentMaps);
2077 bVertical = extractOrientation(rMap);
2078 xWindow = VclPtr<ProgressBar>::Create(pParent, bVertical ? WB_VERT : WB_HORZ);
2079 }
2080 else if (name == "GtkScrolledWindow")
2081 {
2082 xWindow = VclPtr<VclScrolledWindow>::Create(pParent);
2083 }
2084 else if (name == "GtkViewport")
2085 {
2086 xWindow = VclPtr<VclViewport>::Create(pParent);
2087 }
2088 else if (name == "GtkEventBox")
2089 {
2090 xWindow = VclPtr<VclEventBox>::Create(pParent);
2091 }
2092 else if (name == "GtkEntry")
2093 {
2094 WinBits nWinStyle = WB_LEFT|WB_VCENTER|WB_3DLOOK;
2095 if (extractHasFrame(rMap))
2096 nWinStyle |= WB_BORDER;
2097 xWindow = VclPtr<Edit>::Create(pParent, nWinStyle);
2098 BuilderUtils::ensureDefaultWidthChars(rMap);
2099 }
2100 else if (name == "GtkNotebook")
2101 {
2102 if (!extractVerticalTabPos(rMap))
2103 xWindow = VclPtr<TabControl>::Create(pParent, WB_STDTABCONTROL|WB_3DLOOK);
2104 else
2105 xWindow = VclPtr<VerticalTabControl>::Create(pParent);
2106 }
2107 else if (name == "GtkDrawingArea")
2108 {
2109 xWindow = VclPtr<VclDrawingArea>::Create(pParent, WB_TABSTOP);
2110 }
2111 else if (name == "GtkTextView")
2112 {
2113 extractBuffer(id, rMap);
2114
2115 WinBits nWinStyle = WB_CLIPCHILDREN|WB_LEFT;
2116 //VclMultiLineEdit manages its own scrolling,
2117 vcl::Window *pRealParent = prepareWidgetOwnScrolling(pParent, nWinStyle);
2118 xWindow = VclPtr<VclMultiLineEdit>::Create(pRealParent, nWinStyle);
2119 if (pRealParent != pParent)
2120 cleanupWidgetOwnScrolling(pParent, xWindow, rMap);
2121 }
2122 else if (name == "GtkSpinner")
2123 {
2124 xWindow = VclPtr<Throbber>::Create(pParent, WB_3DLOOK);
2125 }
2126 else if (name == "GtkScale")
2127 {
2128 extractAdjustmentToMap(id, rMap, m_pParserState->m_aSliderAdjustmentMaps);
2129 bool bDrawValue = extractDrawValue(rMap);
2130 if (bDrawValue)
2131 {
2132 OUString sValuePos = extractValuePos(rMap);
2133 (void)sValuePos;
2134 }
2135 bVertical = extractOrientation(rMap);
2136
2137 WinBits nWinStyle = bVertical ? WB_VERT : WB_HORZ;
2138
2139 xWindow = VclPtr<Slider>::Create(pParent, nWinStyle);
2140 }
2141 else if (name == "GtkToolbar")
2142 {
2143 xWindow = VclPtr<ToolBox>::Create(pParent, WB_3DLOOK | WB_TABSTOP);
2144 }
2145 else if(name == "NotebookBarAddonsToolMergePoint")
2146 {
2147 customMakeWidget pFunction = GetCustomMakeWidget("sfxlo-NotebookbarToolBox");
2148 if(pFunction != nullptr)
2149 NotebookBarAddonsMerger::MergeNotebookBarAddons(pParent, pFunction, m_xFrame, *m_pNotebookBarAddonsItem, rMap);
2150 return nullptr;
2151 }
2152 else if (name == "GtkToolButton" || name == "GtkMenuToolButton" ||
2153 name == "GtkToggleToolButton" || name == "GtkRadioToolButton" || name == "GtkToolItem")
2154 {
2155 if (pToolBox)
2156 {
2157 OUString aCommand(extractActionName(rMap));
2158
2159 sal_uInt16 nItemId = 0;
2160 ToolBoxItemBits nBits = ToolBoxItemBits::NONE;
2161 if (name == "GtkMenuToolButton")
2162 nBits |= ToolBoxItemBits::DROPDOWN;
2163 else if (name == "GtkToggleToolButton")
2164 nBits |= ToolBoxItemBits::AUTOCHECK | ToolBoxItemBits::CHECKABLE;
2165 else if (name == "GtkRadioToolButton")
2166 nBits |= ToolBoxItemBits::AUTOCHECK | ToolBoxItemBits::RADIOCHECK;
2167
2168 if (!aCommand.isEmpty() && m_xFrame.is())
2169 {
2170 pToolBox->InsertItem(aCommand, m_xFrame, nBits, extractSizeRequest(rMap));
2171 nItemId = pToolBox->GetItemId(aCommand);
2172 }
2173 else
2174 {
2175 nItemId = pToolBox->GetItemCount() + 1;
2176 //TODO: ImplToolItems::size_type -> sal_uInt16!
2177 pToolBox->InsertItem(nItemId, extractLabel(rMap), nBits);
2178 if (aCommand.isEmpty() && !m_bLegacy)
2179 aCommand = OUString::fromUtf8(id);
2180 pToolBox->SetItemCommand(nItemId, aCommand);
2181 }
2182
2183 pToolBox->SetHelpId(nItemId, m_sHelpRoot + id);
2184 OUString sTooltip(extractTooltipText(rMap));
2185 if (!sTooltip.isEmpty())
2186 pToolBox->SetQuickHelpText(nItemId, sTooltip);
2187
2188 OUString sIconName(extractIconName(rMap));
2189 if (sIconName.isEmpty())
2190 sIconName = mapStockToImageResource(extractStockId(rMap));
2191 if (!sIconName.isEmpty())
2192 pToolBox->SetItemImage(nItemId, FixedImage::loadThemeImage(sIconName));
2193
2194 if (!extractVisible(rMap))
2195 pToolBox->HideItem(nItemId);
2196
2197 m_pParserState->m_nLastToolbarId = nItemId;
2198
2199 return nullptr; // no widget to be created
2200 }
2201 }
2202 else if (name == "GtkSeparatorToolItem")
2203 {
2204 if (pToolBox)
2205 {
2206 pToolBox->InsertSeparator();
2207 return nullptr; // no widget to be created
2208 }
2209 }
2210 else if (name == "GtkWindow")
2211 {
2212 WinBits nBits = extractDeferredBits(rMap);
2213 if (nBits & WB_DOCKABLE)
2214 xWindow = VclPtr<DockingWindow>::Create(pParent, nBits|WB_MOVEABLE);
2215 else
2216 xWindow = VclPtr<FloatingWindow>::Create(pParent, nBits|WB_MOVEABLE);
2217 }
2218 else if (name == "GtkPopover")
2219 {
2220 WinBits nBits = extractDeferredBits(rMap);
2221 xWindow = VclPtr<DockingWindow>::Create(pParent, nBits|WB_DOCKABLE|WB_MOVEABLE);
2222 }
2223 else if (name == "GtkCalendar")
2224 {
2225 WinBits nBits = extractDeferredBits(rMap);
2226 xWindow = VclPtr<Calendar>::Create(pParent, nBits);
2227 }
2228 else
2229 {
2230 if (customMakeWidget pFunction = GetCustomMakeWidget(name))
2231 {
2232 pFunction(xWindow, pParent, rMap);
2233 if (xWindow->GetType() == WindowType::PUSHBUTTON)
2234 setupFromActionName(static_cast<Button*>(xWindow.get()), rMap, m_xFrame);
2235 else if (xWindow->GetType() == WindowType::MENUBUTTON)
2236 {
2237 OUString sMenu = BuilderUtils::extractCustomProperty(rMap);
2238 if (!sMenu.isEmpty())
2239 m_pParserState->m_aButtonMenuMaps.emplace_back(id, sMenu);
2240 setupFromActionName(static_cast<Button*>(xWindow.get()), rMap, m_xFrame);
2241 }
2242 }
2243 }
2244
2245 SAL_INFO_IF(!xWindow, "vcl.builder", "probably need to implement " << name << " or add a make" << name << " function")do { if (true && (!xWindow)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_INFO, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "probably need to implement "
<< name << " or add a make" << name <<
" function") == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2245" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "probably need to implement " <<
name << " or add a make" << name << " function"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "probably need to implement " << name <<
" or add a make" << name << " function"; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), (
"/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2245" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "probably need to implement " << name <<
" or add a make" << name << " function") == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2245" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "probably need to implement " <<
name << " or add a make" << name << " function"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "probably need to implement " << name <<
" or add a make" << name << " function"; ::sal::
detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), (
"/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2245" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
2246 if (xWindow)
2247 {
2248 // child windows of disabled windows are made disabled by vcl by default, we don't want that
2249 WindowImpl *pWindowImpl = xWindow->ImplGetWindowImpl();
2250 pWindowImpl->mbDisabled = false;
2251
2252 xWindow->SetHelpId(m_sHelpRoot + id);
2253 SAL_INFO("vcl.builder", "for name '" << name << "' and id '" << id <<do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for name '" <<
name << "' and id '" << id << "', created "
<< xWindow.get() << " child of " << pParent
<< "(" << xWindow->ImplGetWindowImpl()->mpParent
.get() << "/" << xWindow->ImplGetWindowImpl()->
mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for name '" << name << "' and id '" <<
id << "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
2254 "', created " << xWindow.get() << " child of " <<do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for name '" <<
name << "' and id '" << id << "', created "
<< xWindow.get() << " child of " << pParent
<< "(" << xWindow->ImplGetWindowImpl()->mpParent
.get() << "/" << xWindow->ImplGetWindowImpl()->
mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for name '" << name << "' and id '" <<
id << "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
2255 pParent << "(" << xWindow->ImplGetWindowImpl()->mpParent.get() << "/" <<do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for name '" <<
name << "' and id '" << id << "', created "
<< xWindow.get() << " child of " << pParent
<< "(" << xWindow->ImplGetWindowImpl()->mpParent
.get() << "/" << xWindow->ImplGetWindowImpl()->
mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for name '" << name << "' and id '" <<
id << "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
2256 xWindow->ImplGetWindowImpl()->mpRealParent.get() << "/" <<do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for name '" <<
name << "' and id '" << id << "', created "
<< xWindow.get() << " child of " << pParent
<< "(" << xWindow->ImplGetWindowImpl()->mpParent
.get() << "/" << xWindow->ImplGetWindowImpl()->
mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for name '" << name << "' and id '" <<
id << "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
2257 xWindow->ImplGetWindowImpl()->mpBorderWindow.get() << ") with helpid " <<do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for name '" <<
name << "' and id '" << id << "', created "
<< xWindow.get() << " child of " << pParent
<< "(" << xWindow->ImplGetWindowImpl()->mpParent
.get() << "/" << xWindow->ImplGetWindowImpl()->
mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for name '" << name << "' and id '" <<
id << "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
2258 xWindow->GetHelpId())do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for name '" <<
name << "' and id '" << id << "', created "
<< xWindow.get() << " child of " << pParent
<< "(" << xWindow->ImplGetWindowImpl()->mpParent
.get() << "/" << xWindow->ImplGetWindowImpl()->
mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for name '" << name << "' and id '" <<
id << "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for name '" << name << "' and id '"
<< id << "', created " << xWindow.get() <<
" child of " << pParent << "(" << xWindow->
ImplGetWindowImpl()->mpParent.get() << "/" << xWindow
->ImplGetWindowImpl()->mpRealParent.get() << "/" <<
xWindow->ImplGetWindowImpl()->mpBorderWindow.get() <<
") with helpid " << xWindow->GetHelpId()), 0); } else
{ ::std::ostringstream sal_detail_stream; sal_detail_stream <<
"for name '" << name << "' and id '" << id
<< "', created " << xWindow.get() << " child of "
<< pParent << "(" << xWindow->ImplGetWindowImpl
()->mpParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpRealParent.get() << "/" << xWindow->ImplGetWindowImpl
()->mpBorderWindow.get() << ") with helpid " <<
xWindow->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2258" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
2259 m_aChildren.emplace_back(id, xWindow, bVertical);
2260
2261 // if the parent was a toolbox set it as an itemwindow for the latest itemid
2262 if (pToolBox)
2263 {
2264 Size aSize(xWindow->GetSizePixel());
2265 aSize.setHeight(xWindow->get_preferred_size().Height());
2266 xWindow->SetSizePixel(aSize);
2267 pToolBox->SetItemWindow(m_pParserState->m_nLastToolbarId, xWindow);
2268 pToolBox->SetItemExpand(m_pParserState->m_nLastToolbarId, true);
2269 }
2270 }
2271 return xWindow;
2272}
2273
2274namespace
2275{
2276 //return true for window types which exist in vcl but are not themselves
2277 //represented in the .ui format, i.e. only their children exist.
2278 bool isConsideredGtkPseudo(vcl::Window const *pWindow)
2279 {
2280 return pWindow->GetType() == WindowType::TABPAGE;
2281 }
2282}
2283
2284//Any properties from .ui load we couldn't set because of potential virtual methods
2285//during ctor are applied here
2286void VclBuilder::setDeferredProperties()
2287{
2288 if (!m_bToplevelHasDeferredProperties)
2289 return;
2290 stringmap aDeferredProperties;
2291 aDeferredProperties.swap(m_aDeferredProperties);
2292 m_bToplevelHasDeferredProperties = false;
2293 BuilderUtils::set_properties(m_pParent, aDeferredProperties);
2294}
2295
2296namespace BuilderUtils
2297{
2298 void set_properties(vcl::Window *pWindow, const VclBuilder::stringmap &rProps)
2299 {
2300 for (auto const& prop : rProps)
2301 {
2302 const OString &rKey = prop.first;
2303 const OUString &rValue = prop.second;
2304 pWindow->set_property(rKey, rValue);
2305 }
2306 }
2307
2308 OUString convertMnemonicMarkup(const OUString &rIn)
2309 {
2310 OUStringBuffer aRet(rIn);
2311 for (sal_Int32 nI = 0; nI < aRet.getLength(); ++nI)
2312 {
2313 if (aRet[nI] == '_' && nI+1 < aRet.getLength())
2314 {
2315 if (aRet[nI+1] != '_')
2316 aRet[nI] = MNEMONIC_CHARu'~';
2317 else
2318 aRet.remove(nI, 1);
2319 ++nI;
2320 }
2321 }
2322 return aRet.makeStringAndClear();
2323 }
2324
2325 OUString extractCustomProperty(VclBuilder::stringmap &rMap)
2326 {
2327 OUString sCustomProperty;
2328 VclBuilder::stringmap::iterator aFind = rMap.find(OString("customproperty"));
2329 if (aFind != rMap.end())
2330 {
2331 sCustomProperty = aFind->second;
2332 rMap.erase(aFind);
2333 }
2334 return sCustomProperty;
2335 }
2336
2337 void ensureDefaultWidthChars(VclBuilder::stringmap &rMap)
2338 {
2339 OString sWidthChars("width-chars");
2340 VclBuilder::stringmap::iterator aFind = rMap.find(sWidthChars);
2341 if (aFind == rMap.end())
2342 rMap[sWidthChars] = "25";
2343 }
2344
2345 bool extractDropdown(VclBuilder::stringmap &rMap)
2346 {
2347 bool bDropdown = true;
2348 VclBuilder::stringmap::iterator aFind = rMap.find(OString("dropdown"));
2349 if (aFind != rMap.end())
2350 {
2351 bDropdown = toBool(aFind->second);
2352 rMap.erase(aFind);
2353 }
2354 return bDropdown;
2355 }
2356
2357 void reorderWithinParent(vcl::Window &rWindow, sal_uInt16 nNewPosition)
2358 {
2359 WindowImpl *pWindowImpl = rWindow.ImplGetWindowImpl();
2360 if (pWindowImpl->mpParent != pWindowImpl->mpRealParent)
2361 {
2362 assert(pWindowImpl->mpBorderWindow == pWindowImpl->mpParent)(static_cast <bool> (pWindowImpl->mpBorderWindow == pWindowImpl
->mpParent) ? void (0) : __assert_fail ("pWindowImpl->mpBorderWindow == pWindowImpl->mpParent"
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 2362, __extension__ __PRETTY_FUNCTION__))
;
2363 assert(pWindowImpl->mpBorderWindow->ImplGetWindowImpl()->mpParent == pWindowImpl->mpRealParent)(static_cast <bool> (pWindowImpl->mpBorderWindow->
ImplGetWindowImpl()->mpParent == pWindowImpl->mpRealParent
) ? void (0) : __assert_fail ("pWindowImpl->mpBorderWindow->ImplGetWindowImpl()->mpParent == pWindowImpl->mpRealParent"
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 2363, __extension__ __PRETTY_FUNCTION__))
;
2364 reorderWithinParent(*pWindowImpl->mpBorderWindow, nNewPosition);
2365 return;
2366 }
2367 rWindow.reorderWithinParent(nNewPosition);
2368 }
2369
2370 void reorderWithinParent(std::vector<vcl::Window*>& rChilds, bool bIsButtonBox)
2371 {
2372 for (size_t i = 0; i < rChilds.size(); ++i)
2373 {
2374 reorderWithinParent(*rChilds[i], i);
2375
2376 if (!bIsButtonBox)
2377 continue;
2378
2379 //The first member of the group for legacy code needs WB_GROUP set and the
2380 //others not
2381 WinBits nBits = rChilds[i]->GetStyle();
2382 nBits &= ~WB_GROUP;
2383 if (i == 0)
2384 nBits |= WB_GROUP;
2385 rChilds[i]->SetStyle(nBits);
2386 }
2387 }
2388
2389 sal_Int16 getRoleFromName(const OString& roleName)
2390 {
2391 using namespace com::sun::star::accessibility;
2392
2393 static const std::unordered_map<OString, sal_Int16> aAtkRoleToAccessibleRole = {
2394 /* This is in atkobject.h's AtkRole order */
2395 { "invalid", AccessibleRole::UNKNOWN },
2396 { "accelerator label", AccessibleRole::UNKNOWN },
2397 { "alert", AccessibleRole::ALERT },
2398 { "animation", AccessibleRole::UNKNOWN },
2399 { "arrow", AccessibleRole::UNKNOWN },
2400 { "calendar", AccessibleRole::UNKNOWN },
2401 { "canvas", AccessibleRole::CANVAS },
2402 { "check box", AccessibleRole::CHECK_BOX },
2403 { "check menu item", AccessibleRole::CHECK_MENU_ITEM },
2404 { "color chooser", AccessibleRole::COLOR_CHOOSER },
2405 { "column header", AccessibleRole::COLUMN_HEADER },
2406 { "combo box", AccessibleRole::COMBO_BOX },
2407 { "date editor", AccessibleRole::DATE_EDITOR },
2408 { "desktop icon", AccessibleRole::DESKTOP_ICON },
2409 { "desktop frame", AccessibleRole::DESKTOP_PANE }, // ?
2410 { "dial", AccessibleRole::UNKNOWN },
2411 { "dialog", AccessibleRole::DIALOG },
2412 { "directory pane", AccessibleRole::DIRECTORY_PANE },
2413 { "drawing area", AccessibleRole::UNKNOWN },
2414 { "file chooser", AccessibleRole::FILE_CHOOSER },
2415 { "filler", AccessibleRole::FILLER },
2416 { "font chooser", AccessibleRole::FONT_CHOOSER },
2417 { "frame", AccessibleRole::FRAME },
2418 { "glass pane", AccessibleRole::GLASS_PANE },
2419 { "html container", AccessibleRole::UNKNOWN },
2420 { "icon", AccessibleRole::ICON },
2421 { "image", AccessibleRole::GRAPHIC },
2422 { "internal frame", AccessibleRole::INTERNAL_FRAME },
2423 { "label", AccessibleRole::LABEL },
2424 { "layered pane", AccessibleRole::LAYERED_PANE },
2425 { "list", AccessibleRole::LIST },
2426 { "list item", AccessibleRole::LIST_ITEM },
2427 { "menu", AccessibleRole::MENU },
2428 { "menu bar", AccessibleRole::MENU_BAR },
2429 { "menu item", AccessibleRole::MENU_ITEM },
2430 { "option pane", AccessibleRole::OPTION_PANE },
2431 { "page tab", AccessibleRole::PAGE_TAB },
2432 { "page tab list", AccessibleRole::PAGE_TAB_LIST },
2433 { "panel", AccessibleRole::PANEL }, // or SHAPE or TEXT_FRAME ?
2434 { "password text", AccessibleRole::PASSWORD_TEXT },
2435 { "popup menu", AccessibleRole::POPUP_MENU },
2436 { "progress bar", AccessibleRole::PROGRESS_BAR },
2437 { "push button", AccessibleRole::PUSH_BUTTON }, // or BUTTON_DROPDOWN or BUTTON_MENU
2438 { "radio button", AccessibleRole::RADIO_BUTTON },
2439 { "radio menu item", AccessibleRole::RADIO_MENU_ITEM },
2440 { "root pane", AccessibleRole::ROOT_PANE },
2441 { "row header", AccessibleRole::ROW_HEADER },
2442 { "scroll bar", AccessibleRole::SCROLL_BAR },
2443 { "scroll pane", AccessibleRole::SCROLL_PANE },
2444 { "separator", AccessibleRole::SEPARATOR },
2445 { "slider", AccessibleRole::SLIDER },
2446 { "split pane", AccessibleRole::SPLIT_PANE },
2447 { "spin button", AccessibleRole::SPIN_BOX }, // ?
2448 { "statusbar", AccessibleRole::STATUS_BAR },
2449 { "table", AccessibleRole::TABLE },
2450 { "table cell", AccessibleRole::TABLE_CELL },
2451 { "table column header", AccessibleRole::COLUMN_HEADER }, // approximate
2452 { "table row header", AccessibleRole::ROW_HEADER }, // approximate
2453 { "tear off menu item", AccessibleRole::UNKNOWN },
2454 { "terminal", AccessibleRole::UNKNOWN },
2455 { "text", AccessibleRole::TEXT },
2456 { "toggle button", AccessibleRole::TOGGLE_BUTTON },
2457 { "tool bar", AccessibleRole::TOOL_BAR },
2458 { "tool tip", AccessibleRole::TOOL_TIP },
2459 { "tree", AccessibleRole::TREE },
2460 { "tree table", AccessibleRole::TREE_TABLE },
2461 { "unknown", AccessibleRole::UNKNOWN },
2462 { "viewport", AccessibleRole::VIEW_PORT },
2463 { "window", AccessibleRole::WINDOW },
2464 { "header", AccessibleRole::HEADER },
2465 { "footer", AccessibleRole::FOOTER },
2466 { "paragraph", AccessibleRole::PARAGRAPH },
2467 { "ruler", AccessibleRole::RULER },
2468 { "application", AccessibleRole::UNKNOWN },
2469 { "autocomplete", AccessibleRole::UNKNOWN },
2470 { "edit bar", AccessibleRole::EDIT_BAR },
2471 { "embedded", AccessibleRole::EMBEDDED_OBJECT },
2472 { "entry", AccessibleRole::UNKNOWN },
2473 { "chart", AccessibleRole::CHART },
2474 { "caption", AccessibleRole::CAPTION },
2475 { "document frame", AccessibleRole::DOCUMENT },
2476 { "heading", AccessibleRole::HEADING },
2477 { "page", AccessibleRole::PAGE },
2478 { "section", AccessibleRole::SECTION },
2479 { "redundant object", AccessibleRole::UNKNOWN },
2480 { "form", AccessibleRole::FORM },
2481 { "link", AccessibleRole::HYPER_LINK },
2482 { "input method window", AccessibleRole::UNKNOWN },
2483 { "table row", AccessibleRole::UNKNOWN },
2484 { "tree item", AccessibleRole::TREE_ITEM },
2485 { "document spreadsheet", AccessibleRole::DOCUMENT_SPREADSHEET },
2486 { "document presentation", AccessibleRole::DOCUMENT_PRESENTATION },
2487 { "document text", AccessibleRole::DOCUMENT_TEXT },
2488 { "document web", AccessibleRole::DOCUMENT }, // approximate
2489 { "document email", AccessibleRole::DOCUMENT }, // approximate
2490 { "comment", AccessibleRole::COMMENT }, // or NOTE or END_NOTE or FOOTNOTE or SCROLL_PANE
2491 { "list box", AccessibleRole::UNKNOWN },
2492 { "grouping", AccessibleRole::GROUP_BOX },
2493 { "image map", AccessibleRole::IMAGE_MAP },
2494 { "notification", AccessibleRole::UNKNOWN },
2495 { "info bar", AccessibleRole::UNKNOWN },
2496 { "level bar", AccessibleRole::UNKNOWN },
2497 { "title bar", AccessibleRole::UNKNOWN },
2498 { "block quote", AccessibleRole::UNKNOWN },
2499 { "audio", AccessibleRole::UNKNOWN },
2500 { "video", AccessibleRole::UNKNOWN },
2501 { "definition", AccessibleRole::UNKNOWN },
2502 { "article", AccessibleRole::UNKNOWN },
2503 { "landmark", AccessibleRole::UNKNOWN },
2504 { "log", AccessibleRole::UNKNOWN },
2505 { "marquee", AccessibleRole::UNKNOWN },
2506 { "math", AccessibleRole::UNKNOWN },
2507 { "rating", AccessibleRole::UNKNOWN },
2508 { "timer", AccessibleRole::UNKNOWN },
2509 { "description list", AccessibleRole::UNKNOWN },
2510 { "description term", AccessibleRole::UNKNOWN },
2511 { "description value", AccessibleRole::UNKNOWN },
2512 { "static", AccessibleRole::STATIC },
2513 { "math fraction", AccessibleRole::UNKNOWN },
2514 { "math root", AccessibleRole::UNKNOWN },
2515 { "subscript", AccessibleRole::UNKNOWN },
2516 { "superscript", AccessibleRole::UNKNOWN },
2517 { "footnote", AccessibleRole::FOOTNOTE },
2518 };
2519
2520 auto it = aAtkRoleToAccessibleRole.find(roleName);
2521 if (it == aAtkRoleToAccessibleRole.end())
2522 return AccessibleRole::UNKNOWN;
2523 return it->second;
2524 }
2525}
2526
2527VclPtr<vcl::Window> VclBuilder::insertObject(vcl::Window *pParent, const OString &rClass,
2528 const OString &rID, stringmap &rProps, stringmap &rPango, stringmap &rAtk)
2529{
2530 VclPtr<vcl::Window> pCurrentChild;
2531
2532 if (m_pParent && !isConsideredGtkPseudo(m_pParent) && !m_sID.isEmpty() && rID == m_sID)
2533 {
2534 pCurrentChild = m_pParent;
2535
2536 //toplevels default to resizable and apparently you can't change them
2537 //afterwards, so we need to wait until now before we can truly
2538 //initialize the dialog.
2539 if (pParent && pParent->IsSystemWindow())
2540 {
2541 SystemWindow *pSysWin = static_cast<SystemWindow*>(pCurrentChild.get());
2542 pSysWin->doDeferredInit(extractDeferredBits(rProps));
2543 m_bToplevelHasDeferredInit = false;
2544 }
2545 else if (pParent && pParent->IsDockingWindow())
2546 {
2547 DockingWindow *pDockWin = static_cast<DockingWindow*>(pCurrentChild.get());
2548 pDockWin->doDeferredInit(extractDeferredBits(rProps));
2549 m_bToplevelHasDeferredInit = false;
2550 }
2551
2552 if (pCurrentChild->GetHelpId().isEmpty())
2553 {
2554 pCurrentChild->SetHelpId(m_sHelpRoot + m_sID);
2555 SAL_INFO("vcl.builder", "for toplevel dialog " << this << " " <<do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for toplevel dialog "
<< this << " " << rID << ", set helpid "
<< pCurrentChild->GetHelpId()) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId()), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for toplevel dialog " << this << " "
<< rID << ", set helpid " << pCurrentChild
->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId()), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
2556 rID << ", set helpid " << pCurrentChild->GetHelpId())do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "for toplevel dialog "
<< this << " " << rID << ", set helpid "
<< pCurrentChild->GetHelpId()) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId()), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "for toplevel dialog " << this << " "
<< rID << ", set helpid " << pCurrentChild
->GetHelpId()) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId()), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "for toplevel dialog " << this
<< " " << rID << ", set helpid " << pCurrentChild
->GetHelpId(); ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2556" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
2557 }
2558 m_bToplevelParentFound = true;
2559 }
2560 else
2561 {
2562 //if we're being inserting under a toplevel dialog whose init is
2563 //deferred due to waiting to encounter it in this .ui, and it hasn't
2564 //been seen yet, then make unattached widgets parent-less toplevels
2565 if (pParent == m_pParent.get() && m_bToplevelHasDeferredInit)
2566 pParent = nullptr;
2567 pCurrentChild = makeObject(pParent, rClass, rID, rProps);
2568 }
2569
2570 if (pCurrentChild)
2571 {
2572 pCurrentChild->set_id(OStringToOUString(rID, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
2573 if (pCurrentChild == m_pParent.get() && m_bToplevelHasDeferredProperties)
2574 m_aDeferredProperties = rProps;
2575 else
2576 BuilderUtils::set_properties(pCurrentChild, rProps);
2577
2578 for (auto const& elem : rPango)
2579 {
2580 const OString &rKey = elem.first;
2581 const OUString &rValue = elem.second;
2582 pCurrentChild->set_font_attribute(rKey, rValue);
2583 }
2584
2585 m_pParserState->m_aAtkInfo[pCurrentChild] = rAtk;
2586 }
2587
2588 rProps.clear();
2589 rPango.clear();
2590 rAtk.clear();
2591
2592 if (!pCurrentChild)
2593 {
2594 bool bToolbarParent = (pParent && pParent->GetType() == WindowType::TOOLBOX);
2595 pCurrentChild = (m_aChildren.empty() || bToolbarParent) ? pParent : m_aChildren.back().m_pWindow.get();
2596 }
2597 return pCurrentChild;
2598}
2599
2600void VclBuilder::handleTabChild(vcl::Window *pParent, xmlreader::XmlReader &reader)
2601{
2602 TabControl *pTabControl = pParent && pParent->GetType() == WindowType::TABCONTROL ?
2603 static_cast<TabControl*>(pParent) : nullptr;
2604
2605 std::vector<OString> sIDs;
2606
2607 int nLevel = 1;
2608 stringmap aProperties;
2609 stringmap aAtkProperties;
2610 std::vector<vcl::EnumContext::Context> context;
2611
2612 while(true)
2613 {
2614 xmlreader::Span name;
2615 int nsId;
2616
2617 xmlreader::XmlReader::Result res = reader.nextItem(
2618 xmlreader::XmlReader::Text::NONE, &name, &nsId);
2619
2620 if (res == xmlreader::XmlReader::Result::Begin)
2621 {
2622 ++nLevel;
2623 if (name == "object")
2624 {
2625 while (reader.nextAttribute(&nsId, &name))
2626 {
2627 if (name == "id")
2628 {
2629 name = reader.getAttributeValue(false);
2630 OString sID(name.begin, name.length);
2631 sal_Int32 nDelim = sID.indexOf(':');
2632 if (nDelim != -1)
2633 {
2634 OString sPattern = sID.copy(nDelim+1);
2635 aProperties[OString("customproperty")] = OUString::fromUtf8(sPattern);
2636 sID = sID.copy(0, nDelim);
2637 }
2638 sIDs.push_back(sID);
2639 }
2640 }
2641 }
2642 else if (name == "style")
2643 {
2644 int nPriority = 0;
2645 context = handleStyle(reader, nPriority);
2646 --nLevel;
2647 }
2648 else if (name == "property")
2649 collectProperty(reader, aProperties);
2650 else if (pTabControl && name == "child")
2651 {
2652 // just to collect the atk properties (if any) for the label
2653 handleChild(nullptr, &aAtkProperties, reader);
2654 --nLevel;
2655 }
2656 }
2657
2658 if (res == xmlreader::XmlReader::Result::End)
2659 --nLevel;
2660
2661 if (!nLevel)
2662 break;
2663
2664 if (res == xmlreader::XmlReader::Result::Done)
2665 break;
2666 }
2667
2668 if (!pParent)
2669 return;
2670
2671 VerticalTabControl *pVerticalTabControl = pParent->GetType() == WindowType::VERTICALTABCONTROL ?
2672 static_cast<VerticalTabControl*>(pParent) : nullptr;
2673 assert(pTabControl || pVerticalTabControl)(static_cast <bool> (pTabControl || pVerticalTabControl
) ? void (0) : __assert_fail ("pTabControl || pVerticalTabControl"
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 2673, __extension__ __PRETTY_FUNCTION__))
;
2674 VclBuilder::stringmap::iterator aFind = aProperties.find(OString("label"));
2675 if (aFind != aProperties.end())
2676 {
2677 if (pTabControl)
2678 {
2679 sal_uInt16 nPageId = pTabControl->GetCurPageId();
2680 pTabControl->SetPageText(nPageId, aFind->second);
2681 pTabControl->SetPageName(nPageId, sIDs.back());
2682 if (!context.empty())
2683 {
2684 TabPage* pPage = pTabControl->GetTabPage(nPageId);
2685 pPage->SetContext(context);
2686 }
2687
2688 for (auto const& prop : aAtkProperties)
2689 {
2690 const OString &rKey = prop.first;
2691 const OUString &rValue = prop.second;
2692
2693 if (rKey == "AtkObject::accessible-name")
2694 pTabControl->SetAccessibleName(nPageId, rValue);
2695 else if (rKey == "AtkObject::accessible-description")
2696 pTabControl->SetAccessibleDescription(nPageId, rValue);
2697 else
2698 SAL_INFO("vcl.builder", "unhandled atk property: " << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled atk property: "
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2698" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled atk property: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled atk property: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2698" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled atk property: " << rKey) == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2698" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled atk property: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled atk property: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "2698" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
2699 }
2700
2701 }
2702 else
2703 {
2704 OUString sLabel(aFind->second);
2705 OUString sIconName(extractIconName(aProperties));
2706 OUString sTooltip(extractTooltipText(aProperties));
2707 pVerticalTabControl->InsertPage(sIDs.front(), sLabel, FixedImage::loadThemeImage(sIconName), sTooltip,
2708 pVerticalTabControl->GetPageParent()->GetWindow(GetWindowType::LastChild));
2709 }
2710 }
2711 else
2712 {
2713 if (pTabControl)
2714 pTabControl->RemovePage(pTabControl->GetCurPageId());
2715 }
2716}
2717
2718//so that tabbing between controls goes in a visually sensible sequence
2719//we sort these into a best-tab-order sequence
2720bool VclBuilder::sortIntoBestTabTraversalOrder::operator()(const vcl::Window *pA, const vcl::Window *pB) const
2721{
2722 //sort child order within parent list by grid position
2723 sal_Int32 nTopA = pA->get_grid_top_attach();
2724 sal_Int32 nTopB = pB->get_grid_top_attach();
2725 if (nTopA < nTopB)
2726 return true;
2727 if (nTopA > nTopB)
2728 return false;
2729 sal_Int32 nLeftA = pA->get_grid_left_attach();
2730 sal_Int32 nLeftB = pB->get_grid_left_attach();
2731 if (nLeftA < nLeftB)
2732 return true;
2733 if (nLeftA > nLeftB)
2734 return false;
2735 //sort into two groups of pack start and pack end
2736 VclPackType ePackA = pA->get_pack_type();
2737 VclPackType ePackB = pB->get_pack_type();
2738 if (ePackA < ePackB)
2739 return true;
2740 if (ePackA > ePackB)
2741 return false;
2742 bool bVerticalContainer = m_pBuilder->get_window_packing_data(pA->GetParent()).m_bVerticalOrient;
2743 bool bPackA = pA->get_secondary();
2744 bool bPackB = pB->get_secondary();
2745 if (!bVerticalContainer)
2746 {
2747 //for horizontal boxes group secondaries before primaries
2748 if (bPackA > bPackB)
2749 return true;
2750 if (bPackA < bPackB)
2751 return false;
2752 }
2753 else
2754 {
2755 //for vertical boxes group secondaries after primaries
2756 if (bPackA < bPackB)
2757 return true;
2758 if (bPackA > bPackB)
2759 return false;
2760 }
2761 //honour relative box positions with pack group, (numerical order is reversed
2762 //for VclPackType::End, they are packed from the end back, but here we need
2763 //them in visual layout order so that tabbing works as expected)
2764 sal_Int32 nPackA = m_pBuilder->get_window_packing_data(pA).m_nPosition;
2765 sal_Int32 nPackB = m_pBuilder->get_window_packing_data(pB).m_nPosition;
2766 if (nPackA < nPackB)
2767 return ePackA == VclPackType::Start;
2768 if (nPackA > nPackB)
2769 return ePackA != VclPackType::Start;
2770 //sort labels of Frames before body
2771 if (pA->GetParent() == pB->GetParent())
2772 {
2773 const VclFrame *pFrameParent = dynamic_cast<const VclFrame*>(pA->GetParent());
2774 if (pFrameParent)
2775 {
2776 const vcl::Window *pLabel = pFrameParent->get_label_widget();
2777 int nFramePosA = (pA == pLabel) ? 0 : 1;
2778 int nFramePosB = (pB == pLabel) ? 0 : 1;
2779 return nFramePosA < nFramePosB;
2780 }
2781 }
2782 return false;
2783}
2784
2785void VclBuilder::handleChild(vcl::Window *pParent, stringmap* pAtkProps, xmlreader::XmlReader &reader)
2786{
2787 vcl::Window *pCurrentChild = nullptr;
2788
2789 xmlreader::Span name;
2790 int nsId;
2791 OString sType, sInternalChild;
2792
2793 while (reader.nextAttribute(&nsId, &name))
2794 {
2795 if (name == "type")
2796 {
2797 name = reader.getAttributeValue(false);
2798 sType = OString(name.begin, name.length);
2799 }
2800 else if (name == "internal-child")
2801 {
2802 name = reader.getAttributeValue(false);
2803 sInternalChild = OString(name.begin, name.length);
2804 }
2805 }
2806
2807 if (sType == "tab")
2808 {
2809 handleTabChild(pParent, reader);
2810 return;
2811 }
2812
2813 int nLevel = 1;
2814 while(true)
2815 {
2816 xmlreader::XmlReader::Result res = reader.nextItem(
2817 xmlreader::XmlReader::Text::NONE, &name, &nsId);
2818
2819 if (res == xmlreader::XmlReader::Result::Begin)
2820 {
2821 if (name == "object" || name == "placeholder")
2822 {
2823 pCurrentChild = handleObject(pParent, pAtkProps, reader).get();
2824
2825 bool bObjectInserted = pCurrentChild && pParent != pCurrentChild;
2826
2827 if (bObjectInserted)
2828 {
2829 //Internal-children default in glade to not having their visible bits set
2830 //even though they are visible (generally anyway)
2831 if (!sInternalChild.isEmpty())
2832 pCurrentChild->Show();
2833
2834 //Select the first page if it's a notebook
2835 if (pCurrentChild->GetType() == WindowType::TABCONTROL)
2836 {
2837 TabControl *pTabControl = static_cast<TabControl*>(pCurrentChild);
2838 pTabControl->SetCurPageId(pTabControl->GetPageId(0));
2839
2840 //To-Do add reorder capability to the TabControl
2841 }
2842 else
2843 {
2844 // We want to sort labels before contents of frames
2845 // for keyboard traversal, especially if there
2846 // are multiple widgets using the same mnemonic
2847 if (sType == "label")
2848 {
2849 if (VclFrame *pFrameParent = dynamic_cast<VclFrame*>(pParent))
2850 pFrameParent->designate_label(pCurrentChild);
2851 }
2852 if (sInternalChild.startsWith("vbox") || sInternalChild.startsWith("messagedialog-vbox"))
2853 {
2854 if (Dialog *pBoxParent = dynamic_cast<Dialog*>(pParent))
2855 pBoxParent->set_content_area(static_cast<VclBox*>(pCurrentChild)); // FIXME-VCLPTR
2856 }
2857 else if (sInternalChild.startsWith("action_area") || sInternalChild.startsWith("messagedialog-action_area"))
2858 {
2859 vcl::Window *pContentArea = pCurrentChild->GetParent();
2860 if (Dialog *pBoxParent = dynamic_cast<Dialog*>(pContentArea ? pContentArea->GetParent() : nullptr))
2861 {
2862 pBoxParent->set_action_area(static_cast<VclButtonBox*>(pCurrentChild)); // FIXME-VCLPTR
2863 }
2864 }
2865
2866 bool bIsButtonBox = dynamic_cast<VclButtonBox*>(pCurrentChild) != nullptr;
2867
2868 //To-Do make reorder a virtual in Window, move this foo
2869 //there and see above
2870 std::vector<vcl::Window*> aChilds;
2871 for (vcl::Window* pChild = pCurrentChild->GetWindow(GetWindowType::FirstChild); pChild;
2872 pChild = pChild->GetWindow(GetWindowType::Next))
2873 {
2874 if (bIsButtonBox)
2875 {
2876 if (PushButton* pPushButton = dynamic_cast<PushButton*>(pChild))
2877 pPushButton->setAction(true);
2878 }
2879
2880 aChilds.push_back(pChild);
2881 }
2882
2883 //sort child order within parent so that tabbing
2884 //between controls goes in a visually sensible sequence
2885 std::stable_sort(aChilds.begin(), aChilds.end(), sortIntoBestTabTraversalOrder(this));
2886 BuilderUtils::reorderWithinParent(aChilds, bIsButtonBox);
2887 }
2888 }
2889 }
2890 else if (name == "packing")
2891 {
2892 handlePacking(pCurrentChild, pParent, reader);
2893 }
2894 else if (name == "interface")
2895 {
2896 while (reader.nextAttribute(&nsId, &name))
2897 {
2898 if (name == "domain")
2899 {
2900 name = reader.getAttributeValue(false);
2901 sType = OString(name.begin, name.length);
2902 m_pParserState->m_aResLocale = Translate::Create(sType.getStr());
2903 }
2904 }
2905 ++nLevel;
2906 }
2907 else
2908 ++nLevel;
2909 }
2910
2911 if (res == xmlreader::XmlReader::Result::End)
2912 --nLevel;
2913
2914 if (!nLevel)
2915 break;
2916
2917 if (res == xmlreader::XmlReader::Result::Done)
2918 break;
2919 }
2920}
2921
2922void VclBuilder::collectPangoAttribute(xmlreader::XmlReader &reader, stringmap &rMap)
2923{
2924 xmlreader::Span span;
2925 int nsId;
2926
2927 OString sProperty;
2928 OString sValue;
2929
2930 while (reader.nextAttribute(&nsId, &span))
2931 {
2932 if (span == "name")
2933 {
2934 span = reader.getAttributeValue(false);
2935 sProperty = OString(span.begin, span.length);
2936 }
2937 else if (span == "value")
2938 {
2939 span = reader.getAttributeValue(false);
2940 sValue = OString(span.begin, span.length);
2941 }
2942 }
2943
2944 if (!sProperty.isEmpty())
2945 rMap[sProperty] = OUString::fromUtf8(sValue);
2946}
2947
2948void VclBuilder::collectAtkRelationAttribute(xmlreader::XmlReader &reader, stringmap &rMap)
2949{
2950 xmlreader::Span span;
2951 int nsId;
2952
2953 OString sProperty;
2954 OString sValue;
2955
2956 while (reader.nextAttribute(&nsId, &span))
2957 {
2958 if (span == "type")
2959 {
2960 span = reader.getAttributeValue(false);
2961 sProperty = OString(span.begin, span.length);
2962 }
2963 else if (span == "target")
2964 {
2965 span = reader.getAttributeValue(false);
2966 sValue = OString(span.begin, span.length);
2967 sal_Int32 nDelim = sValue.indexOf(':');
2968 if (nDelim != -1)
2969 sValue = sValue.copy(0, nDelim);
2970 }
2971 }
2972
2973 if (!sProperty.isEmpty())
2974 rMap[sProperty] = OUString::fromUtf8(sValue);
2975}
2976
2977void VclBuilder::collectAtkRoleAttribute(xmlreader::XmlReader &reader, stringmap &rMap)
2978{
2979 xmlreader::Span span;
2980 int nsId;
2981
2982 OString sProperty;
2983
2984 while (reader.nextAttribute(&nsId, &span))
2985 {
2986 if (span == "type")
2987 {
2988 span = reader.getAttributeValue(false);
2989 sProperty = OString(span.begin, span.length);
2990 }
2991 }
2992
2993 if (!sProperty.isEmpty())
2994 rMap["role"] = OUString::fromUtf8(sProperty);
2995}
2996
2997void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OString &rID)
2998{
2999 int nLevel = 1;
3000
3001 ListStore::row aRow;
3002
3003 while(true)
3004 {
3005 xmlreader::Span name;
3006 int nsId;
3007
3008 xmlreader::XmlReader::Result res = reader.nextItem(
3009 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3010
3011 if (res == xmlreader::XmlReader::Result::Done)
3012 break;
3013
3014 if (res == xmlreader::XmlReader::Result::Begin)
3015 {
3016 ++nLevel;
3017 if (name == "col")
3018 {
3019 bool bTranslated = false;
3020 sal_uInt32 nId = 0;
3021 OString sContext;
3022
3023 while (reader.nextAttribute(&nsId, &name))
3024 {
3025 if (name == "id")
3026 {
3027 name = reader.getAttributeValue(false);
3028 nId = OString(name.begin, name.length).toInt32();
3029 }
3030 else if (nId == 0 && name == "translatable" && reader.getAttributeValue(false) == "yes")
3031 {
3032 bTranslated = true;
3033 }
3034 else if (name == "context")
3035 {
3036 name = reader.getAttributeValue(false);
3037 sContext = OString(name.begin, name.length);
3038 }
3039 }
3040
3041 (void)reader.nextItem(
3042 xmlreader::XmlReader::Text::Raw, &name, &nsId);
3043
3044 OString sValue(name.begin, name.length);
3045 OUString sFinalValue;
3046 if (bTranslated)
3047 {
3048 if (!sContext.isEmpty())
3049 sValue = sContext + "\004" + sValue;
3050 sFinalValue = Translate::get(sValue.getStr(), m_pParserState->m_aResLocale);
3051 }
3052 else
3053 sFinalValue = OUString::fromUtf8(sValue);
3054
3055
3056 if (aRow.size() < nId+1)
3057 aRow.resize(nId+1);
3058 aRow[nId] = sFinalValue;
3059 }
3060 }
3061
3062 if (res == xmlreader::XmlReader::Result::End)
3063 {
3064 --nLevel;
3065 }
3066
3067 if (!nLevel)
3068 break;
3069 }
3070
3071 m_pParserState->m_aModels[rID].m_aEntries.push_back(aRow);
3072}
3073
3074void VclBuilder::handleListStore(xmlreader::XmlReader &reader, const OString &rID, const OString &rClass)
3075{
3076 int nLevel = 1;
3077
3078 while(true)
3079 {
3080 xmlreader::Span name;
3081 int nsId;
3082
3083 xmlreader::XmlReader::Result res = reader.nextItem(
3084 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3085
3086 if (res == xmlreader::XmlReader::Result::Done)
3087 break;
3088
3089 if (res == xmlreader::XmlReader::Result::Begin)
3090 {
3091 if (name == "row")
3092 {
3093 bool bNotTreeStore = rClass != "GtkTreeStore";
3094 if (bNotTreeStore)
3095 handleRow(reader, rID);
3096 assert(bNotTreeStore && "gtk, as the time of writing, doesn't support data in GtkTreeStore serialization")(static_cast <bool> (bNotTreeStore && "gtk, as the time of writing, doesn't support data in GtkTreeStore serialization"
) ? void (0) : __assert_fail ("bNotTreeStore && \"gtk, as the time of writing, doesn't support data in GtkTreeStore serialization\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 3096, __extension__ __PRETTY_FUNCTION__))
;
3097 }
3098 else
3099 ++nLevel;
3100 }
3101
3102 if (res == xmlreader::XmlReader::Result::End)
3103 {
3104 --nLevel;
3105 }
3106
3107 if (!nLevel)
3108 break;
3109 }
3110}
3111
3112VclBuilder::stringmap VclBuilder::handleAtkObject(xmlreader::XmlReader &reader)
3113{
3114 int nLevel = 1;
3115
3116 stringmap aProperties;
3117
3118 while (true)
3119 {
3120 xmlreader::Span name;
3121 int nsId;
3122
3123 xmlreader::XmlReader::Result res = reader.nextItem(
3124 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3125
3126 if (res == xmlreader::XmlReader::Result::Done)
3127 break;
3128
3129 if (res == xmlreader::XmlReader::Result::Begin)
3130 {
3131 ++nLevel;
3132 if (name == "property")
3133 collectProperty(reader, aProperties);
3134 }
3135
3136 if (res == xmlreader::XmlReader::Result::End)
3137 {
3138 --nLevel;
3139 }
3140
3141 if (!nLevel)
3142 break;
3143 }
3144
3145 return aProperties;
3146}
3147
3148void VclBuilder::applyAtkProperties(vcl::Window *pWindow, const stringmap& rProperties)
3149{
3150 assert(pWindow)(static_cast <bool> (pWindow) ? void (0) : __assert_fail
("pWindow", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 3150, __extension__ __PRETTY_FUNCTION__))
;
3151 for (auto const& prop : rProperties)
3152 {
3153 const OString &rKey = prop.first;
3154 const OUString &rValue = prop.second;
3155
3156 if (pWindow && rKey.match("AtkObject::"))
3157 pWindow->set_property(rKey.copy(RTL_CONSTASCII_LENGTH("AtkObject::")((sal_Int32)((sizeof(sal_n_array_size("AtkObject::")))-1))), rValue);
3158 else
3159 SAL_WARN("vcl.builder", "unhandled atk prop: " << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled atk prop: "
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3159" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled atk prop: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled atk prop: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3159" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled atk prop: " << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3159" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled atk prop: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled atk prop: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3159" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3160 }
3161}
3162
3163std::vector<ComboBoxTextItem> VclBuilder::handleItems(xmlreader::XmlReader &reader) const
3164{
3165 int nLevel = 1;
3166
3167 std::vector<ComboBoxTextItem> aItems;
3168
3169 while(true)
3170 {
3171 xmlreader::Span name;
3172 int nsId;
3173
3174 xmlreader::XmlReader::Result res = reader.nextItem(
3175 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3176
3177 if (res == xmlreader::XmlReader::Result::Done)
3178 break;
3179
3180 if (res == xmlreader::XmlReader::Result::Begin)
3181 {
3182 ++nLevel;
3183 if (name == "item")
3184 {
3185 bool bTranslated = false;
3186 OString sContext, sId;
3187
3188 while (reader.nextAttribute(&nsId, &name))
3189 {
3190 if (name == "translatable" && reader.getAttributeValue(false) == "yes")
3191 {
3192 bTranslated = true;
3193 }
3194 else if (name == "context")
3195 {
3196 name = reader.getAttributeValue(false);
3197 sContext = OString(name.begin, name.length);
3198 }
3199 else if (name == "id")
3200 {
3201 name = reader.getAttributeValue(false);
3202 sId = OString(name.begin, name.length);
3203 }
3204 }
3205
3206 (void)reader.nextItem(
3207 xmlreader::XmlReader::Text::Raw, &name, &nsId);
3208
3209 OString sValue(name.begin, name.length);
3210 OUString sFinalValue;
3211 if (bTranslated)
3212 {
3213 if (!sContext.isEmpty())
3214 sValue = sContext + "\004" + sValue;
3215 sFinalValue = Translate::get(sValue.getStr(), m_pParserState->m_aResLocale);
3216 }
3217 else
3218 sFinalValue = OUString::fromUtf8(sValue);
3219
3220 if (m_pStringReplace)
3221 sFinalValue = (*m_pStringReplace)(sFinalValue);
3222
3223 aItems.emplace_back(sFinalValue, sId);
3224 }
3225 }
3226
3227 if (res == xmlreader::XmlReader::Result::End)
3228 {
3229 --nLevel;
3230 }
3231
3232 if (!nLevel)
3233 break;
3234 }
3235
3236 return aItems;
3237}
3238
3239VclPtr<Menu> VclBuilder::handleMenu(xmlreader::XmlReader &reader, const OString &rID, bool bMenuBar)
3240{
3241 VclPtr<Menu> pCurrentMenu;
3242 if (bMenuBar)
3243 pCurrentMenu = VclPtr<MenuBar>::Create();
3244 else
3245 pCurrentMenu = VclPtr<PopupMenu>::Create();
3246
3247 int nLevel = 1;
3248
3249 stringmap aProperties;
3250
3251 while(true)
3252 {
3253 xmlreader::Span name;
3254 int nsId;
3255
3256 xmlreader::XmlReader::Result res = reader.nextItem(
3257 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3258
3259 if (res == xmlreader::XmlReader::Result::Done)
3260 break;
3261
3262 if (res == xmlreader::XmlReader::Result::Begin)
3263 {
3264 if (name == "child")
3265 {
3266 handleMenuChild(pCurrentMenu, reader);
3267 }
3268 else
3269 {
3270 ++nLevel;
3271 if (name == "property")
3272 collectProperty(reader, aProperties);
3273 }
3274 }
3275
3276 if (res == xmlreader::XmlReader::Result::End)
3277 {
3278 --nLevel;
3279 }
3280
3281 if (!nLevel)
3282 break;
3283 }
3284
3285 m_aMenus.emplace_back(rID, pCurrentMenu);
3286
3287 return pCurrentMenu;
3288}
3289
3290void VclBuilder::handleMenuChild(Menu *pParent, xmlreader::XmlReader &reader)
3291{
3292 xmlreader::Span name;
3293 int nsId;
3294
3295 int nLevel = 1;
3296 while(true)
3297 {
3298 xmlreader::XmlReader::Result res = reader.nextItem(
3299 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3300
3301 if (res == xmlreader::XmlReader::Result::Begin)
3302 {
3303 if (name == "object" || name == "placeholder")
3304 {
3305 handleMenuObject(pParent, reader);
3306 }
3307 else
3308 ++nLevel;
3309 }
3310
3311 if (res == xmlreader::XmlReader::Result::End)
3312 --nLevel;
3313
3314 if (!nLevel)
3315 break;
3316
3317 if (res == xmlreader::XmlReader::Result::Done)
3318 break;
3319 }
3320}
3321
3322void VclBuilder::handleMenuObject(Menu *pParent, xmlreader::XmlReader &reader)
3323{
3324 OString sClass;
3325 OString sID;
3326 OUString sCustomProperty;
3327 PopupMenu *pSubMenu = nullptr;
3328
3329 xmlreader::Span name;
3330 int nsId;
3331
3332 while (reader.nextAttribute(&nsId, &name))
3333 {
3334 if (name == "class")
3335 {
3336 name = reader.getAttributeValue(false);
3337 sClass = OString(name.begin, name.length);
3338 }
3339 else if (name == "id")
3340 {
3341 name = reader.getAttributeValue(false);
3342 sID = OString(name.begin, name.length);
3343 sal_Int32 nDelim = sID.indexOf(':');
3344 if (nDelim != -1)
3345 {
3346 sCustomProperty = OUString::fromUtf8(sID.copy(nDelim+1));
3347 sID = sID.copy(0, nDelim);
3348 }
3349 }
3350 }
3351
3352 int nLevel = 1;
3353
3354 stringmap aProperties;
3355 stringmap aAtkProperties;
3356 accelmap aAccelerators;
3357
3358 if (!sCustomProperty.isEmpty())
3359 aProperties[OString("customproperty")] = sCustomProperty;
3360
3361 while(true)
3362 {
3363 xmlreader::XmlReader::Result res = reader.nextItem(
3364 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3365
3366 if (res == xmlreader::XmlReader::Result::Done)
3367 break;
3368
3369 if (res == xmlreader::XmlReader::Result::Begin)
3370 {
3371 if (name == "child")
3372 {
3373 size_t nChildMenuIdx = m_aMenus.size();
3374 handleChild(nullptr, &aAtkProperties, reader);
3375 bool bSubMenuInserted = m_aMenus.size() > nChildMenuIdx;
3376 if (bSubMenuInserted)
3377 pSubMenu = dynamic_cast<PopupMenu*>(m_aMenus[nChildMenuIdx].m_pMenu.get());
3378 }
3379 else
3380 {
3381 ++nLevel;
3382 if (name == "property")
3383 collectProperty(reader, aProperties);
3384 else if (name == "accelerator")
3385 collectAccelerator(reader, aAccelerators);
3386 }
3387 }
3388
3389 if (res == xmlreader::XmlReader::Result::End)
3390 {
3391 --nLevel;
3392 }
3393
3394 if (!nLevel)
3395 break;
3396 }
3397
3398 insertMenuObject(pParent, pSubMenu, sClass, sID, aProperties, aAtkProperties, aAccelerators);
3399}
3400
3401void VclBuilder::handleSizeGroup(xmlreader::XmlReader &reader)
3402{
3403 m_pParserState->m_aSizeGroups.emplace_back();
3404 SizeGroup &rSizeGroup = m_pParserState->m_aSizeGroups.back();
3405
3406 int nLevel = 1;
3407
3408 while(true)
3409 {
3410 xmlreader::Span name;
3411 int nsId;
3412
3413 xmlreader::XmlReader::Result res = reader.nextItem(
3414 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3415
3416 if (res == xmlreader::XmlReader::Result::Done)
3417 break;
3418
3419 if (res == xmlreader::XmlReader::Result::Begin)
3420 {
3421 ++nLevel;
3422 if (name == "widget")
3423 {
3424 while (reader.nextAttribute(&nsId, &name))
3425 {
3426 if (name == "name")
3427 {
3428 name = reader.getAttributeValue(false);
3429 OString sWidget(name.begin, name.length);
3430 sal_Int32 nDelim = sWidget.indexOf(':');
3431 if (nDelim != -1)
3432 sWidget = sWidget.copy(0, nDelim);
3433 rSizeGroup.m_aWidgets.push_back(sWidget);
3434 }
3435 }
3436 }
3437 else
3438 {
3439 if (name == "property")
3440 collectProperty(reader, rSizeGroup.m_aProperties);
3441 }
3442 }
3443
3444 if (res == xmlreader::XmlReader::Result::End)
3445 {
3446 --nLevel;
3447 }
3448
3449 if (!nLevel)
3450 break;
3451 }
3452}
3453
3454namespace
3455{
3456 vcl::KeyCode makeKeyCode(const std::pair<OString,OString> &rKey)
3457 {
3458 bool bShift = rKey.second.indexOf("GDK_SHIFT_MASK") != -1;
3459 bool bMod1 = rKey.second.indexOf("GDK_CONTROL_MASK") != -1;
3460 bool bMod2 = rKey.second.indexOf("GDK_MOD1_MASK") != -1;
3461 bool bMod3 = rKey.second.indexOf("GDK_MOD2_MASK") != -1;
3462
3463 if (rKey.first == "Insert")
3464 return vcl::KeyCode(KEY_INSERT, bShift, bMod1, bMod2, bMod3);
3465 else if (rKey.first == "Delete")
3466 return vcl::KeyCode(KEY_DELETE, bShift, bMod1, bMod2, bMod3);
3467 else if (rKey.first == "Return")
3468 return vcl::KeyCode(KEY_RETURN, bShift, bMod1, bMod2, bMod3);
3469 else if (rKey.first == "Up")
3470 return vcl::KeyCode(KEY_UP, bShift, bMod1, bMod2, bMod3);
3471 else if (rKey.first == "Down")
3472 return vcl::KeyCode(KEY_DOWN, bShift, bMod1, bMod2, bMod3);
3473 else if (rKey.first == "Left")
3474 return vcl::KeyCode(KEY_LEFT, bShift, bMod1, bMod2, bMod3);
3475 else if (rKey.first == "Right")
3476 return vcl::KeyCode(KEY_RIGHT, bShift, bMod1, bMod2, bMod3);
3477 else if (rKey.first == "asterisk")
3478 return vcl::KeyCode(KEY_MULTIPLY, bShift, bMod1, bMod2, bMod3);
3479
3480 assert (rKey.first.getLength() == 1)(static_cast <bool> (rKey.first.getLength() == 1) ? void
(0) : __assert_fail ("rKey.first.getLength() == 1", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 3480, __extension__ __PRETTY_FUNCTION__))
;
3481 char cChar = rKey.first.toChar();
3482
3483 if (cChar >= 'a' && cChar <= 'z')
3484 return vcl::KeyCode(KEY_A + (cChar - 'a'), bShift, bMod1, bMod2, bMod3);
3485 else if (cChar >= 'A' && cChar <= 'Z')
3486 return vcl::KeyCode(KEY_A + (cChar - 'A'), bShift, bMod1, bMod2, bMod3);
3487 else if (cChar >= '0' && cChar <= '9')
3488 return vcl::KeyCode(KEY_0 + (cChar - 'A'), bShift, bMod1, bMod2, bMod3);
3489
3490 return vcl::KeyCode(cChar, bShift, bMod1, bMod2, bMod3);
3491 }
3492}
3493
3494void VclBuilder::insertMenuObject(Menu *pParent, PopupMenu *pSubMenu, const OString &rClass, const OString &rID,
3495 stringmap &rProps, stringmap &rAtkProps, accelmap &rAccels)
3496{
3497 sal_uInt16 nOldCount = pParent->GetItemCount();
3498 sal_uInt16 nNewId = ++m_pParserState->m_nLastMenuItemId;
3499
3500 if(rClass == "NotebookBarAddonsMenuMergePoint")
3501 {
3502 NotebookBarAddonsMerger::MergeNotebookBarMenuAddons(pParent, nNewId, rID, *m_pNotebookBarAddonsItem);
3503 m_pParserState->m_nLastMenuItemId = pParent->GetItemCount();
3504 }
3505 else if (rClass == "GtkMenuItem")
3506 {
3507 OUString sLabel(BuilderUtils::convertMnemonicMarkup(extractLabel(rProps)));
3508 OUString aCommand(extractActionName(rProps));
3509 pParent->InsertItem(nNewId, sLabel, MenuItemBits::NONE , rID);
3510 pParent->SetItemCommand(nNewId, aCommand);
3511 if (pSubMenu)
3512 pParent->SetPopupMenu(nNewId, pSubMenu);
3513 }
3514 else if (rClass == "GtkCheckMenuItem")
3515 {
3516 OUString sLabel(BuilderUtils::convertMnemonicMarkup(extractLabel(rProps)));
3517 OUString aCommand(extractActionName(rProps));
3518 pParent->InsertItem(nNewId, sLabel, MenuItemBits::CHECKABLE, rID);
3519 pParent->SetItemCommand(nNewId, aCommand);
3520 }
3521 else if (rClass == "GtkRadioMenuItem")
3522 {
3523 OUString sLabel(BuilderUtils::convertMnemonicMarkup(extractLabel(rProps)));
3524 OUString aCommand(extractActionName(rProps));
3525 pParent->InsertItem(nNewId, sLabel, MenuItemBits::AUTOCHECK | MenuItemBits::RADIOCHECK, rID);
3526 pParent->SetItemCommand(nNewId, aCommand);
3527 }
3528 else if (rClass == "GtkSeparatorMenuItem")
3529 {
3530 pParent->InsertSeparator(rID);
3531 }
3532
3533 SAL_WARN_IF(nOldCount == pParent->GetItemCount(), "vcl.builder", "probably need to implement " << rClass)do { if (true && (nOldCount == pParent->GetItemCount
())) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "probably need to implement "
<< rClass) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3533" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "probably need to implement " <<
rClass), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "probably need to implement " <<
rClass; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), (
"vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3533" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "probably need to implement " << rClass) ==
1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3533" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "probably need to implement " <<
rClass), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "probably need to implement " <<
rClass; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), (
"vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3533" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3534
3535 if (nOldCount != pParent->GetItemCount())
3536 {
3537 pParent->SetHelpId(nNewId, m_sHelpRoot + rID);
3538 if (!extractVisible(rProps))
3539 pParent->HideItem(nNewId);
3540
3541 for (auto const& prop : rProps)
3542 {
3543 const OString &rKey = prop.first;
3544 const OUString &rValue = prop.second;
3545
3546 if (rKey == "tooltip-markup")
3547 pParent->SetTipHelpText(nNewId, rValue);
3548 else if (rKey == "tooltip-text")
3549 pParent->SetTipHelpText(nNewId, rValue);
3550 else
3551 SAL_INFO("vcl.builder", "unhandled property: " << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled property: "
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3551" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3551" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled property: " << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3551" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3551" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3552 }
3553
3554 for (auto const& prop : rAtkProps)
3555 {
3556 const OString &rKey = prop.first;
3557 const OUString &rValue = prop.second;
3558
3559 if (rKey == "AtkObject::accessible-name")
3560 pParent->SetAccessibleName(nNewId, rValue);
3561 else if (rKey == "AtkObject::accessible-description")
3562 pParent->SetAccessibleDescription(nNewId, rValue);
3563 else
3564 SAL_INFO("vcl.builder", "unhandled atk property: " << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled atk property: "
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3564" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled atk property: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled atk property: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3564" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled atk property: " << rKey) == 1) {
::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3564" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled atk property: " << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled atk property: " << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3564" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3565 }
3566
3567 for (auto const& accel : rAccels)
3568 {
3569 const OString &rSignal = accel.first;
3570 const auto &rValue = accel.second;
3571
3572 if (rSignal == "activate")
3573 pParent->SetAccelKey(nNewId, makeKeyCode(rValue));
3574 else
3575 SAL_INFO("vcl.builder", "unhandled accelerator for: " << rSignal)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled accelerator for: "
<< rSignal) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3575" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled accelerator for: " <<
rSignal), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "unhandled accelerator for: " <<
rSignal; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO), (
"vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3575" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled accelerator for: " << rSignal) ==
1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3575" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled accelerator for: " <<
rSignal), 0); } else { ::std::ostringstream sal_detail_stream
; sal_detail_stream << "unhandled accelerator for: " <<
rSignal; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_INFO), (
"vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3575" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3576 }
3577 }
3578
3579 rProps.clear();
3580}
3581
3582/// Insert items to a ComboBox or a ListBox.
3583/// They have no common ancestor that would have 'InsertEntry()', so use a template.
3584template<typename T> static bool insertItems(vcl::Window *pWindow, VclBuilder::stringmap &rMap,
3585 std::vector<std::unique_ptr<OUString>>& rUserData,
3586 const std::vector<ComboBoxTextItem> &rItems)
3587{
3588 T *pContainer = dynamic_cast<T*>(pWindow);
3589 if (!pContainer)
3590 return false;
3591
3592 sal_uInt16 nActiveId = extractActive(rMap);
3593 for (auto const& item : rItems)
3594 {
3595 sal_Int32 nPos = pContainer->InsertEntry(item.m_sItem);
3596 if (!item.m_sId.isEmpty())
3597 {
3598 rUserData.emplace_back(std::make_unique<OUString>(OUString::fromUtf8(item.m_sId)));
3599 pContainer->SetEntryData(nPos, rUserData.back().get());
3600 }
3601 }
3602 if (nActiveId < rItems.size())
3603 pContainer->SelectEntryPos(nActiveId);
3604
3605 return true;
3606}
3607
3608VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, stringmap *pAtkProps, xmlreader::XmlReader &reader)
3609{
3610 OString sClass;
3611 OString sID;
3612 OUString sCustomProperty;
3613
3614 xmlreader::Span name;
3615 int nsId;
3616
3617 while (reader.nextAttribute(&nsId, &name))
3618 {
3619 if (name == "class")
3620 {
3621 name = reader.getAttributeValue(false);
3622 sClass = OString(name.begin, name.length);
3623 }
3624 else if (name == "id")
3625 {
3626 name = reader.getAttributeValue(false);
3627 sID = OString(name.begin, name.length);
3628 if (m_bLegacy)
3629 {
3630 sal_Int32 nDelim = sID.indexOf(':');
3631 if (nDelim != -1)
3632 {
3633 sCustomProperty = OUString::fromUtf8(sID.copy(nDelim+1));
3634 sID = sID.copy(0, nDelim);
3635 }
3636 }
3637 }
3638 }
3639
3640 if (sClass == "GtkListStore" || sClass == "GtkTreeStore")
3641 {
3642 handleListStore(reader, sID, sClass);
3643 return nullptr;
3644 }
3645 else if (sClass == "GtkMenu")
3646 {
3647 handleMenu(reader, sID, false);
3648 return nullptr;
3649 }
3650 else if (sClass == "GtkMenuBar")
3651 {
3652 VclPtr<Menu> xMenu = handleMenu(reader, sID, true);
3653 if (SystemWindow* pTopLevel = pParent ? pParent->GetSystemWindow() : nullptr)
3654 pTopLevel->SetMenuBar(dynamic_cast<MenuBar*>(xMenu.get()));
3655 return nullptr;
3656 }
3657 else if (sClass == "GtkSizeGroup")
3658 {
3659 handleSizeGroup(reader);
3660 return nullptr;
3661 }
3662 else if (sClass == "AtkObject")
3663 {
3664 assert((pParent || pAtkProps) && "must have one set")(static_cast <bool> ((pParent || pAtkProps) && "must have one set"
) ? void (0) : __assert_fail ("(pParent || pAtkProps) && \"must have one set\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 3664, __extension__ __PRETTY_FUNCTION__))
;
3665 assert(!(pParent && pAtkProps) && "must not have both")(static_cast <bool> (!(pParent && pAtkProps) &&
"must not have both") ? void (0) : __assert_fail ("!(pParent && pAtkProps) && \"must not have both\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 3665, __extension__ __PRETTY_FUNCTION__))
;
3666 auto aAtkProperties = handleAtkObject(reader);
3667 if (pParent)
3668 applyAtkProperties(pParent, aAtkProperties);
3669 if (pAtkProps)
3670 *pAtkProps = aAtkProperties;
3671 return nullptr;
3672 }
3673
3674 int nLevel = 1;
3675
3676 stringmap aProperties, aPangoAttributes;
3677 stringmap aAtkAttributes;
3678 std::vector<ComboBoxTextItem> aItems;
3679
3680 if (!sCustomProperty.isEmpty())
3681 aProperties[OString("customproperty")] = sCustomProperty;
3682
3683 VclPtr<vcl::Window> pCurrentChild;
3684 while(true)
3685 {
3686 xmlreader::XmlReader::Result res = reader.nextItem(
3687 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3688
3689 if (res == xmlreader::XmlReader::Result::Done)
3690 break;
3691
3692 if (res == xmlreader::XmlReader::Result::Begin)
3693 {
3694 if (name == "child")
3695 {
3696 if (!pCurrentChild)
3697 {
3698 pCurrentChild = insertObject(pParent, sClass, sID,
3699 aProperties, aPangoAttributes, aAtkAttributes);
3700 }
3701 handleChild(pCurrentChild, nullptr, reader);
3702 }
3703 else if (name == "items")
3704 aItems = handleItems(reader);
3705 else if (name == "style")
3706 {
3707 int nPriority = 0;
3708 std::vector<vcl::EnumContext::Context> aContext = handleStyle(reader, nPriority);
3709 if (nPriority != 0)
3710 {
3711 vcl::IPrioritable* pPrioritable = dynamic_cast<vcl::IPrioritable*>(pCurrentChild.get());
3712 SAL_WARN_IF(!pPrioritable, "vcl", "priority set for not supported item")do { if (true && (!pPrioritable)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "priority set for not supported item"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3712" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "priority set for not supported item"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "priority set for not supported item"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3712" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "priority set for not supported item") == 1) { ::
sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3712" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "priority set for not supported item"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "priority set for not supported item"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3712" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3713 if (pPrioritable)
3714 pPrioritable->SetPriority(nPriority);
3715 }
3716 if (!aContext.empty())
3717 {
3718 vcl::IContext* pContextControl = dynamic_cast<vcl::IContext*>(pCurrentChild.get());
3719 SAL_WARN_IF(!pContextControl, "vcl", "context set for not supported item")do { if (true && (!pContextControl)) { switch (sal_detail_log_report
(::SAL_DETAIL_LOG_LEVEL_WARN, "vcl")) { case SAL_DETAIL_LOG_ACTION_IGNORE
: break; case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail
::getResult( ::sal::detail::StreamStart() << "context set for not supported item"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3719" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "context set for not supported item"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "context set for not supported item"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3719" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "context set for not supported item") == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3719" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "context set for not supported item"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "context set for not supported item"; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3719" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3720 if (pContextControl)
3721 pContextControl->SetContext(aContext);
3722 }
3723 }
3724 else
3725 {
3726 ++nLevel;
3727 if (name == "property")
3728 collectProperty(reader, aProperties);
3729 else if (name == "attribute")
3730 collectPangoAttribute(reader, aPangoAttributes);
3731 else if (name == "relation")
3732 collectAtkRelationAttribute(reader, aAtkAttributes);
3733 else if (name == "role")
3734 collectAtkRoleAttribute(reader, aAtkAttributes);
3735 else if (name == "action-widget")
3736 handleActionWidget(reader);
3737 }
3738 }
3739
3740 if (res == xmlreader::XmlReader::Result::End)
3741 {
3742 --nLevel;
3743 }
3744
3745 if (!nLevel)
3746 break;
3747 }
3748
3749 if (sClass == "GtkAdjustment")
3750 {
3751 m_pParserState->m_aAdjustments[sID] = aProperties;
3752 return nullptr;
3753 }
3754 else if (sClass == "GtkTextBuffer")
3755 {
3756 m_pParserState->m_aTextBuffers[sID] = aProperties;
3757 return nullptr;
3758 }
3759
3760 if (!pCurrentChild)
3761 {
3762 pCurrentChild = insertObject(pParent, sClass, sID, aProperties,
3763 aPangoAttributes, aAtkAttributes);
3764 }
3765
3766 if (!aItems.empty())
3767 {
3768 // try to fill-in the items
3769 if (!insertItems<ComboBox>(pCurrentChild, aProperties, m_aUserData, aItems))
3770 insertItems<ListBox>(pCurrentChild, aProperties, m_aUserData, aItems);
3771 }
3772
3773 return pCurrentChild;
3774}
3775
3776void VclBuilder::handlePacking(vcl::Window *pCurrent, vcl::Window *pParent, xmlreader::XmlReader &reader)
3777{
3778 xmlreader::Span name;
3779 int nsId;
3780
3781 int nLevel = 1;
3782
3783 while(true)
3784 {
3785 xmlreader::XmlReader::Result res = reader.nextItem(
3786 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3787
3788 if (res == xmlreader::XmlReader::Result::Done)
3789 break;
3790
3791 if (res == xmlreader::XmlReader::Result::Begin)
3792 {
3793 ++nLevel;
3794 if (name == "property")
3795 applyPackingProperty(pCurrent, pParent, reader);
3796 }
3797
3798 if (res == xmlreader::XmlReader::Result::End)
3799 {
3800 --nLevel;
3801 }
3802
3803 if (!nLevel)
3804 break;
3805 }
3806}
3807
3808void VclBuilder::applyPackingProperty(vcl::Window *pCurrent,
3809 vcl::Window *pParent,
3810 xmlreader::XmlReader &reader)
3811{
3812 if (!pCurrent)
3813 return;
3814
3815 //ToolBoxItems are not true widgets just elements
3816 //of the ToolBox itself
3817 ToolBox *pToolBoxParent = nullptr;
3818 if (pCurrent == pParent)
3819 pToolBoxParent = dynamic_cast<ToolBox*>(pParent);
3820
3821 xmlreader::Span name;
3822 int nsId;
3823
3824 if (pCurrent->GetType() == WindowType::SCROLLWINDOW)
3825 {
3826 auto aFind = m_pParserState->m_aRedundantParentWidgets.find(VclPtr<vcl::Window>(pCurrent));
3827 if (aFind != m_pParserState->m_aRedundantParentWidgets.end())
3828 {
3829 pCurrent = aFind->second;
3830 assert(pCurrent)(static_cast <bool> (pCurrent) ? void (0) : __assert_fail
("pCurrent", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 3830, __extension__ __PRETTY_FUNCTION__))
;
3831 }
3832 }
3833
3834 while (reader.nextAttribute(&nsId, &name))
3835 {
3836 if (name == "name")
3837 {
3838 name = reader.getAttributeValue(false);
3839 OString sKey(name.begin, name.length);
3840 sKey = sKey.replace('_', '-');
3841 (void)reader.nextItem(
3842 xmlreader::XmlReader::Text::Raw, &name, &nsId);
3843 OString sValue(name.begin, name.length);
3844
3845 if (sKey == "expand" || sKey == "resize")
3846 {
3847 bool bTrue = (!sValue.isEmpty() && (sValue[0] == 't' || sValue[0] == 'T' || sValue[0] == '1'));
3848 if (pToolBoxParent)
3849 pToolBoxParent->SetItemExpand(m_pParserState->m_nLastToolbarId, bTrue);
3850 else
3851 pCurrent->set_expand(bTrue);
3852 continue;
3853 }
3854
3855 if (pToolBoxParent)
3856 continue;
3857
3858 if (sKey == "fill")
3859 {
3860 bool bTrue = (!sValue.isEmpty() && (sValue[0] == 't' || sValue[0] == 'T' || sValue[0] == '1'));
3861 pCurrent->set_fill(bTrue);
3862 }
3863 else if (sKey == "pack-type")
3864 {
3865 VclPackType ePackType = (!sValue.isEmpty() && (sValue[0] == 'e' || sValue[0] == 'E')) ? VclPackType::End : VclPackType::Start;
3866 pCurrent->set_pack_type(ePackType);
3867 }
3868 else if (sKey == "left-attach")
3869 {
3870 pCurrent->set_grid_left_attach(sValue.toInt32());
3871 }
3872 else if (sKey == "top-attach")
3873 {
3874 pCurrent->set_grid_top_attach(sValue.toInt32());
3875 }
3876 else if (sKey == "width")
3877 {
3878 pCurrent->set_grid_width(sValue.toInt32());
3879 }
3880 else if (sKey == "height")
3881 {
3882 pCurrent->set_grid_height(sValue.toInt32());
3883 }
3884 else if (sKey == "padding")
3885 {
3886 pCurrent->set_padding(sValue.toInt32());
3887 }
3888 else if (sKey == "position")
3889 {
3890 set_window_packing_position(pCurrent, sValue.toInt32());
3891 }
3892 else if (sKey == "secondary")
3893 {
3894 pCurrent->set_secondary(toBool(sValue));
3895 }
3896 else if (sKey == "non-homogeneous")
3897 {
3898 pCurrent->set_non_homogeneous(toBool(sValue));
3899 }
3900 else if (sKey == "homogeneous")
3901 {
3902 pCurrent->set_non_homogeneous(!toBool(sValue));
3903 }
3904 else
3905 {
3906 SAL_WARN("vcl.builder", "unknown packing: " << sKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unknown packing: " <<
sKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3906" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unknown packing: " << sKey), 0
); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unknown packing: " << sKey; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3906" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unknown packing: " << sKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3906" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unknown packing: " << sKey), 0
); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unknown packing: " << sKey; ::sal::detail::log
( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3906" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3907 }
3908 }
3909 }
3910}
3911
3912std::vector<vcl::EnumContext::Context> VclBuilder::handleStyle(xmlreader::XmlReader &reader, int &nPriority)
3913{
3914 std::vector<vcl::EnumContext::Context> aContext;
3915
3916 xmlreader::Span name;
3917 int nsId;
3918
3919 int nLevel = 1;
3920
3921 while(true)
3922 {
3923 xmlreader::XmlReader::Result res = reader.nextItem(
3924 xmlreader::XmlReader::Text::NONE, &name, &nsId);
3925
3926 if (res == xmlreader::XmlReader::Result::Done)
3927 break;
3928
3929 if (res == xmlreader::XmlReader::Result::Begin)
3930 {
3931 ++nLevel;
3932 if (name == "class")
3933 {
3934 OString classStyle = getStyleClass(reader);
3935
3936 if (classStyle.startsWith("context-"))
3937 {
3938 OString sContext = classStyle.copy(classStyle.indexOf('-') + 1);
3939 OUString sContext2(sContext.getStr(), sContext.getLength(), RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)));
3940 aContext.push_back(vcl::EnumContext::GetContextEnum(sContext2));
3941 }
3942 else if (classStyle.startsWith("priority-"))
3943 {
3944 OString aPriority = classStyle.copy(classStyle.indexOf('-') + 1);
3945 OUString aPriority2(aPriority.getStr(), aPriority.getLength(), RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)));
3946 nPriority = aPriority2.toInt32();
3947 }
3948 else if (classStyle != "small-button")
3949 {
3950 SAL_WARN("vcl.builder", "unknown class: " << classStyle)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unknown class: " <<
classStyle) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3950" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unknown class: " << classStyle
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unknown class: " << classStyle; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3950" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unknown class: " << classStyle) == 1) { ::
sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"
), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3950" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unknown class: " << classStyle
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unknown class: " << classStyle; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "3950" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
3951 }
3952 }
3953 }
3954
3955 if (res == xmlreader::XmlReader::Result::End)
3956 {
3957 --nLevel;
3958 }
3959
3960 if (!nLevel)
3961 break;
3962 }
3963
3964 return aContext;
3965}
3966
3967OString VclBuilder::getStyleClass(xmlreader::XmlReader &reader)
3968{
3969 xmlreader::Span name;
3970 int nsId;
3971 OString aRet;
3972
3973 while (reader.nextAttribute(&nsId, &name))
3974 {
3975 if (name == "name")
3976 {
3977 name = reader.getAttributeValue(false);
3978 aRet = OString (name.begin, name.length);
3979 }
3980 }
3981
3982 return aRet;
3983}
3984
3985void VclBuilder::collectProperty(xmlreader::XmlReader &reader, stringmap &rMap) const
3986{
3987 xmlreader::Span name;
3988 int nsId;
3989
3990 OString sProperty, sContext;
3991
3992 bool bTranslated = false;
3993
3994 while (reader.nextAttribute(&nsId, &name))
3995 {
3996 if (name == "name")
3997 {
3998 name = reader.getAttributeValue(false);
3999 sProperty = OString(name.begin, name.length);
4000 }
4001 else if (name == "context")
4002 {
4003 name = reader.getAttributeValue(false);
4004 sContext = OString(name.begin, name.length);
4005 }
4006 else if (name == "translatable" && reader.getAttributeValue(false) == "yes")
4007 {
4008 bTranslated = true;
4009 }
4010 }
4011
4012 (void)reader.nextItem(xmlreader::XmlReader::Text::Raw, &name, &nsId);
4013 OString sValue(name.begin, name.length);
4014 OUString sFinalValue;
4015 if (bTranslated)
4016 {
4017 if (!sContext.isEmpty())
4018 sValue = sContext + "\004" + sValue;
4019 sFinalValue = Translate::get(sValue.getStr(), m_pParserState->m_aResLocale);
4020 }
4021 else
4022 sFinalValue = OUString::fromUtf8(sValue);
4023
4024 if (!sProperty.isEmpty())
4025 {
4026 sProperty = sProperty.replace('_', '-');
4027 if (m_pStringReplace)
4028 sFinalValue = (*m_pStringReplace)(sFinalValue);
4029 rMap[sProperty] = sFinalValue;
4030 }
4031}
4032
4033void VclBuilder::handleActionWidget(xmlreader::XmlReader &reader)
4034{
4035 xmlreader::Span name;
4036 int nsId;
4037
4038 OString sResponse;
4039
4040 while (reader.nextAttribute(&nsId, &name))
4041 {
4042 if (name == "response")
4043 {
4044 name = reader.getAttributeValue(false);
4045 sResponse = OString(name.begin, name.length);
4046 }
4047 }
4048
4049 (void)reader.nextItem(xmlreader::XmlReader::Text::Raw, &name, &nsId);
4050 OString sID(name.begin, name.length);
4051 sal_Int32 nDelim = sID.indexOf(':');
4052 if (nDelim != -1)
4053 sID = sID.copy(0, nDelim);
4054 set_response(sID, sResponse.toInt32());
4055}
4056
4057void VclBuilder::collectAccelerator(xmlreader::XmlReader &reader, accelmap &rMap)
4058{
4059 xmlreader::Span name;
4060 int nsId;
4061
4062 OString sProperty;
4063 OString sValue;
4064 OString sModifiers;
4065
4066 while (reader.nextAttribute(&nsId, &name))
4067 {
4068 if (name == "key")
4069 {
4070 name = reader.getAttributeValue(false);
4071 sValue = OString(name.begin, name.length);
4072 }
4073 else if (name == "signal")
4074 {
4075 name = reader.getAttributeValue(false);
4076 sProperty = OString(name.begin, name.length);
4077 }
4078 else if (name == "modifiers")
4079 {
4080 name = reader.getAttributeValue(false);
4081 sModifiers = OString(name.begin, name.length);
4082 }
4083 }
4084
4085 if (!sProperty.isEmpty() && !sValue.isEmpty())
4086 {
4087 rMap[sProperty] = std::make_pair(sValue, sModifiers);
4088 }
4089}
4090
4091vcl::Window *VclBuilder::get_widget_root()
4092{
4093 return m_aChildren.empty() ? nullptr : m_aChildren[0].m_pWindow.get();
4094}
4095
4096vcl::Window *VclBuilder::get_by_name(const OString& sID)
4097{
4098 for (auto const& child : m_aChildren)
4099 {
4100 if (child.m_sID == sID)
4101 return child.m_pWindow;
4102 }
4103
4104 return nullptr;
4105}
4106
4107PopupMenu *VclBuilder::get_menu(const OString& sID)
4108{
4109 for (auto const& menu : m_aMenus)
4110 {
4111 if (menu.m_sID == sID)
4112 return dynamic_cast<PopupMenu*>(menu.m_pMenu.get());
4113 }
4114
4115 return nullptr;
4116}
4117
4118void VclBuilder::set_response(const OString& sID, short nResponse)
4119{
4120 switch (nResponse)
4121 {
4122 case -5:
4123 nResponse = RET_OK;
4124 break;
4125 case -6:
4126 nResponse = RET_CANCEL;
4127 break;
4128 case -7:
4129 nResponse = RET_CLOSE;
4130 break;
4131 case -8:
4132 nResponse = RET_YES;
4133 break;
4134 case -9:
4135 nResponse = RET_NO;
4136 break;
4137 case -11:
4138 nResponse = RET_HELP;
4139 break;
4140 default:
4141 assert(nResponse >= 100 && "keep non-canned responses in range 100+ to avoid collision with vcl RET_*")(static_cast <bool> (nResponse >= 100 && "keep non-canned responses in range 100+ to avoid collision with vcl RET_*"
) ? void (0) : __assert_fail ("nResponse >= 100 && \"keep non-canned responses in range 100+ to avoid collision with vcl RET_*\""
, "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 4141, __extension__ __PRETTY_FUNCTION__))
;
4142 break;
4143 }
4144
4145 for (const auto & child : m_aChildren)
4146 {
4147 if (child.m_sID == sID)
4148 {
4149 PushButton* pPushButton = dynamic_cast<PushButton*>(child.m_pWindow.get());
4150 assert(pPushButton)(static_cast <bool> (pPushButton) ? void (0) : __assert_fail
("pPushButton", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 4150, __extension__ __PRETTY_FUNCTION__))
;
4151 Dialog* pDialog = pPushButton->GetParentDialog();
4152 assert(pDialog)(static_cast <bool> (pDialog) ? void (0) : __assert_fail
("pDialog", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 4152, __extension__ __PRETTY_FUNCTION__))
;
4153 pDialog->add_button(pPushButton, nResponse, false);
4154 return;
4155 }
4156 }
4157
4158 assert(false)(static_cast <bool> (false) ? void (0) : __assert_fail (
"false", "/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
, 4158, __extension__ __PRETTY_FUNCTION__))
;
4159}
4160
4161void VclBuilder::delete_by_name(const OString& sID)
4162{
4163 auto aI = std::find_if(m_aChildren.begin(), m_aChildren.end(),
4164 [&sID](WinAndId& rItem) { return rItem.m_sID == sID; });
4165 if (aI != m_aChildren.end())
4166 {
4167 aI->m_pWindow.disposeAndClear();
4168 m_aChildren.erase(aI);
4169 }
4170}
4171
4172void VclBuilder::delete_by_window(vcl::Window *pWindow)
4173{
4174 drop_ownership(pWindow);
4175 pWindow->disposeOnce();
4176}
4177
4178void VclBuilder::drop_ownership(const vcl::Window *pWindow)
4179{
4180 auto aI = std::find_if(m_aChildren.begin(), m_aChildren.end(),
4181 [&pWindow](WinAndId& rItem) { return rItem.m_pWindow == pWindow; });
4182 if (aI != m_aChildren.end())
4183 m_aChildren.erase(aI);
4184}
4185
4186OString VclBuilder::get_by_window(const vcl::Window *pWindow) const
4187{
4188 for (auto const& child : m_aChildren)
4189 {
4190 if (child.m_pWindow == pWindow)
4191 return child.m_sID;
4192 }
4193
4194 return OString();
4195}
4196
4197VclBuilder::PackingData VclBuilder::get_window_packing_data(const vcl::Window *pWindow) const
4198{
4199 //We've stored the return of new Control, some of these get
4200 //border windows placed around them which are what you get
4201 //from GetChild, so scoot up a level if necessary to get the
4202 //window whose position value we have
4203 const vcl::Window *pPropHolder = pWindow->ImplGetWindow();
4204
4205 for (auto const& child : m_aChildren)
4206 {
4207 if (child.m_pWindow == pPropHolder)
4208 return child.m_aPackingData;
4209 }
4210
4211 return PackingData();
4212}
4213
4214void VclBuilder::set_window_packing_position(const vcl::Window *pWindow, sal_Int32 nPosition)
4215{
4216 for (auto & child : m_aChildren)
4217 {
4218 if (child.m_pWindow == pWindow)
4219 child.m_aPackingData.m_nPosition = nPosition;
4220 }
4221}
4222
4223const VclBuilder::ListStore *VclBuilder::get_model_by_name(const OString& sID) const
4224{
4225 std::map<OString, ListStore>::const_iterator aI = m_pParserState->m_aModels.find(sID);
4226 if (aI != m_pParserState->m_aModels.end())
4227 return &(aI->second);
4228 return nullptr;
4229}
4230
4231const VclBuilder::TextBuffer *VclBuilder::get_buffer_by_name(const OString& sID) const
4232{
4233 std::map<OString, TextBuffer>::const_iterator aI = m_pParserState->m_aTextBuffers.find(sID);
4234 if (aI != m_pParserState->m_aTextBuffers.end())
4235 return &(aI->second);
4236 return nullptr;
4237}
4238
4239const VclBuilder::Adjustment *VclBuilder::get_adjustment_by_name(const OString& sID) const
4240{
4241 std::map<OString, Adjustment>::const_iterator aI = m_pParserState->m_aAdjustments.find(sID);
4242 if (aI != m_pParserState->m_aAdjustments.end())
4243 return &(aI->second);
4244 return nullptr;
4245}
4246
4247void VclBuilder::mungeModel(ComboBox &rTarget, const ListStore &rStore, sal_uInt16 nActiveId)
4248{
4249 for (auto const& entry : rStore.m_aEntries)
4250 {
4251 const ListStore::row &rRow = entry;
4252 sal_uInt16 nEntry = rTarget.InsertEntry(rRow[0]);
4253 if (rRow.size() > 1)
4254 {
4255 if (m_bLegacy)
4256 {
4257 sal_IntPtr nValue = rRow[1].toInt32();
4258 rTarget.SetEntryData(nEntry, reinterpret_cast<void*>(nValue));
4259 }
4260 else
4261 {
4262 if (!rRow[1].isEmpty())
4263 {
4264 m_aUserData.emplace_back(std::make_unique<OUString>(rRow[1]));
4265 rTarget.SetEntryData(nEntry, m_aUserData.back().get());
4266 }
4267 }
4268 }
4269 }
4270 if (nActiveId < rStore.m_aEntries.size())
4271 rTarget.SelectEntryPos(nActiveId);
4272}
4273
4274void VclBuilder::mungeModel(ListBox &rTarget, const ListStore &rStore, sal_uInt16 nActiveId)
4275{
4276 for (auto const& entry : rStore.m_aEntries)
4277 {
4278 const ListStore::row &rRow = entry;
4279 sal_uInt16 nEntry = rTarget.InsertEntry(rRow[0]);
4280 if (rRow.size() > 1)
4281 {
4282 if (m_bLegacy)
4283 {
4284 sal_IntPtr nValue = rRow[1].toInt32();
4285 rTarget.SetEntryData(nEntry, reinterpret_cast<void*>(nValue));
4286 }
4287 else
4288 {
4289 if (!rRow[1].isEmpty())
4290 {
4291 m_aUserData.emplace_back(std::make_unique<OUString>(rRow[1]));
4292 rTarget.SetEntryData(nEntry, m_aUserData.back().get());
4293 }
4294 }
4295 }
4296 }
4297 if (nActiveId < rStore.m_aEntries.size())
4298 rTarget.SelectEntryPos(nActiveId);
4299}
4300
4301void VclBuilder::mungeModel(SvTabListBox& rTarget, const ListStore &rStore, sal_uInt16 nActiveId)
4302{
4303 for (auto const& entry : rStore.m_aEntries)
4304 {
4305 const ListStore::row &rRow = entry;
4306 auto pEntry = rTarget.InsertEntry(rRow[0]);
4307 if (rRow.size() > 1)
4308 {
4309 if (m_bLegacy)
4310 {
4311 sal_IntPtr nValue = rRow[1].toInt32();
4312 pEntry->SetUserData(reinterpret_cast<void*>(nValue));
4313 }
4314 else
4315 {
4316 if (!rRow[1].isEmpty())
4317 {
4318 m_aUserData.emplace_back(std::make_unique<OUString>(rRow[1]));
4319 pEntry->SetUserData(m_aUserData.back().get());
4320 }
4321 }
4322 }
4323 }
4324 if (nActiveId < rStore.m_aEntries.size())
4325 {
4326 SvTreeListEntry* pEntry = rTarget.GetEntry(nullptr, nActiveId);
4327 rTarget.Select(pEntry);
4328 }
4329}
4330
4331void VclBuilder::mungeAdjustment(NumericFormatter &rTarget, const Adjustment &rAdjustment)
4332{
4333 int nMul = rtl_math_pow10Exp(1, rTarget.GetDecimalDigits());
4334
4335 for (auto const& elem : rAdjustment)
4336 {
4337 const OString &rKey = elem.first;
4338 const OUString &rValue = elem.second;
4339
4340 if (rKey == "upper")
4341 {
4342 sal_Int64 nUpper = rValue.toDouble() * nMul;
4343 rTarget.SetMax(nUpper);
4344 rTarget.SetLast(nUpper);
4345 }
4346 else if (rKey == "lower")
4347 {
4348 sal_Int64 nLower = rValue.toDouble() * nMul;
4349 rTarget.SetMin(nLower);
4350 rTarget.SetFirst(nLower);
4351 }
4352 else if (rKey == "value")
4353 {
4354 sal_Int64 nValue = rValue.toDouble() * nMul;
4355 rTarget.SetValue(nValue);
4356 }
4357 else if (rKey == "step-increment")
4358 {
4359 sal_Int64 nSpinSize = rValue.toDouble() * nMul;
4360 rTarget.SetSpinSize(nSpinSize);
4361 }
4362 else
4363 {
4364 SAL_INFO("vcl.builder", "unhandled property :" << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled property :"
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4364" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4364" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled property :" << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4364" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4364" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
4365 }
4366 }
4367}
4368
4369void VclBuilder::mungeAdjustment(FormattedField &rTarget, const Adjustment &rAdjustment)
4370{
4371 double nMaxValue = 0, nMinValue = 0, nValue = 0, nSpinSize = 0;
4372
4373 for (auto const& elem : rAdjustment)
4374 {
4375 const OString &rKey = elem.first;
4376 const OUString &rValue = elem.second;
4377
4378 if (rKey == "upper")
4379 nMaxValue = rValue.toDouble();
4380 else if (rKey == "lower")
4381 nMinValue = rValue.toDouble();
4382 else if (rKey == "value")
4383 nValue = rValue.toDouble();
4384 else if (rKey == "step-increment")
4385 nSpinSize = rValue.toDouble();
4386 else
4387 SAL_INFO("vcl.builder", "unhandled property :" << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled property :"
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4387" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4387" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled property :" << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4387" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4387" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
4388 }
4389
4390 Formatter& rFormatter = rTarget.GetFormatter();
4391 rFormatter.SetMinValue(nMinValue);
4392 rFormatter.SetMaxValue(nMaxValue);
4393 rFormatter.SetValue(nValue);
4394 rFormatter.SetSpinSize(nSpinSize);
4395}
4396
4397void VclBuilder::mungeAdjustment(ScrollBar &rTarget, const Adjustment &rAdjustment)
4398{
4399 for (auto const& elem : rAdjustment)
4400 {
4401 const OString &rKey = elem.first;
4402 const OUString &rValue = elem.second;
4403
4404 if (rKey == "upper")
4405 rTarget.SetRangeMax(rValue.toInt32());
4406 else if (rKey == "lower")
4407 rTarget.SetRangeMin(rValue.toInt32());
4408 else if (rKey == "value")
4409 rTarget.SetThumbPos(rValue.toInt32());
4410 else if (rKey == "step-increment")
4411 rTarget.SetLineSize(rValue.toInt32());
4412 else if (rKey == "page-increment")
4413 rTarget.SetPageSize(rValue.toInt32());
4414 else
4415 {
4416 SAL_INFO("vcl.builder", "unhandled property :" << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled property :"
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4416" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4416" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled property :" << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4416" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4416" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
4417 }
4418 }
4419}
4420
4421void VclBuilder::mungeAdjustment(Slider& rTarget, const Adjustment& rAdjustment)
4422{
4423 for (auto const& elem : rAdjustment)
4424 {
4425 const OString &rKey = elem.first;
4426 const OUString &rValue = elem.second;
4427
4428 if (rKey == "upper")
4429 rTarget.SetRangeMax(rValue.toInt32());
4430 else if (rKey == "lower")
4431 rTarget.SetRangeMin(rValue.toInt32());
4432 else if (rKey == "value")
4433 rTarget.SetThumbPos(rValue.toInt32());
4434 else if (rKey == "step-increment")
4435 rTarget.SetLineSize(rValue.toInt32());
4436 else if (rKey == "page-increment")
4437 rTarget.SetPageSize(rValue.toInt32());
4438 else
4439 {
4440 SAL_INFO("vcl.builder", "unhandled property :" << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled property :"
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4440" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4440" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled property :" << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4440" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4440" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
4441 }
4442 }
4443}
4444
4445void VclBuilder::mungeTextBuffer(VclMultiLineEdit &rTarget, const TextBuffer &rTextBuffer)
4446{
4447 for (auto const& elem : rTextBuffer)
4448 {
4449 const OString &rKey = elem.first;
4450 const OUString &rValue = elem.second;
4451
4452 if (rKey == "text")
4453 rTarget.SetText(rValue);
4454 else
4455 {
4456 SAL_INFO("vcl.builder", "unhandled property :" << rKey)do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_INFO
, "vcl.builder")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break;
case SAL_DETAIL_LOG_ACTION_LOG: if (sizeof ::sal::detail::getResult
( ::sal::detail::StreamStart() << "unhandled property :"
<< rKey) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_INFO
), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4456" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4456" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "unhandled property :" << rKey) == 1) { ::sal_detail_log
( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4456" ": "), ::sal::detail::unwrapStream( ::sal::detail
::StreamStart() << "unhandled property :" << rKey
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "unhandled property :" << rKey; ::sal::detail
::log( (::SAL_DETAIL_LOG_LEVEL_INFO), ("vcl.builder"), ("/home/maarten/src/libreoffice/core/vcl/source/window/builder.cxx"
":" "4456" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
4457 }
4458 }
4459}
4460
4461VclBuilder::ParserState::ParserState()
4462 : m_nLastToolbarId(0)
4463 , m_nLastMenuItemId(0)
4464{}
4465
4466VclBuilder::MenuAndId::MenuAndId(const OString &rId, Menu *pMenu)
4467 : m_sID(rId)
4468 , m_pMenu(pMenu)
4469{}
4470
4471/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

/home/maarten/src/libreoffice/core/include/rtl/ref.hxx

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#ifndef INCLUDED_RTL_REF_HXX
21#define INCLUDED_RTL_REF_HXX
22
23#include "sal/config.h"
24
25#include <cassert>
26#include <cstddef>
27#include <functional>
28#ifdef LIBO_INTERNAL_ONLY1
29#include <type_traits>
30#endif
31
32#include "sal/types.h"
33
34namespace rtl
35{
36
37/** Template reference class for reference type.
38*/
39template <class reference_type>
40class Reference
41{
42 /** The <b>reference_type</b> body pointer.
43 */
44 reference_type * m_pBody;
45
46
47public:
48 /** Constructor...
49 */
50 Reference()
51 : m_pBody (NULL__null)
52 {}
53
54
55 /** Constructor...
56 */
57 Reference (reference_type * pBody, __sal_NoAcquire)
58 : m_pBody (pBody)
59 {
60 }
61
62 /** Constructor...
63 */
64 Reference (reference_type * pBody)
65 : m_pBody (pBody)
66 {
67 if (m_pBody)
68 m_pBody->acquire();
69 }
70
71 /** Copy constructor...
72 */
73 Reference (const Reference<reference_type> & handle)
74 : m_pBody (handle.m_pBody)
75 {
76 if (m_pBody)
77 m_pBody->acquire();
78 }
79
80#ifdef LIBO_INTERNAL_ONLY1
81 /** Move constructor...
82 */
83 Reference (Reference<reference_type> && handle) noexcept
84 : m_pBody (handle.m_pBody)
85 {
86 handle.m_pBody = nullptr;
87 }
88#endif
89
90#if defined LIBO_INTERNAL_ONLY1
91 /** Up-casting conversion constructor: Copies interface reference.
92
93 Does not work for up-casts to ambiguous bases.
94
95 @param rRef another reference
96 */
97 template< class derived_type >
98 inline Reference(
99 const Reference< derived_type > & rRef,
100 std::enable_if_t<std::is_base_of_v<reference_type, derived_type>, int> = 0 )
101 : m_pBody (rRef.get())
102 {
103 if (m_pBody)
104 m_pBody->acquire();
105 }
106#endif
107
108 /** Destructor...
109 */
110 ~Reference() COVERITY_NOEXCEPT_FALSE
111 {
112 if (m_pBody
13.1
Field 'm_pBody' is non-null
13.1
Field 'm_pBody' is non-null
13.1
Field 'm_pBody' is non-null
)
14
Taking true branch
113 m_pBody->release();
15
Calling 'VclReferenceBase::release'
19
Returning; memory was released
114 }
115
116 /** Set...
117 Similar to assignment.
118 */
119 Reference<reference_type> &
120 SAL_CALL set (reference_type * pBody)
121 {
122 if (pBody)
123 pBody->acquire();
124 reference_type * const pOld = m_pBody;
125 m_pBody = pBody;
126 if (pOld)
127 pOld->release();
128 return *this;
129 }
130
131 /** Assignment.
132 Unbinds this instance from its body (if bound) and
133 bind it to the body represented by the handle.
134 */
135 Reference<reference_type> &
136 SAL_CALL operator= (const Reference<reference_type> & handle)
137 {
138 return set( handle.m_pBody );
139 }
140
141#ifdef LIBO_INTERNAL_ONLY1
142 /** Assignment.
143 * Unbinds this instance from its body (if bound),
144 * bind it to the body represented by the handle, and
145 * set the body represented by the handle to nullptr.
146 */
147 Reference<reference_type> &
148 operator= (Reference<reference_type> && handle)
149 {
150 // self-movement guts ourself
151 if (m_pBody)
152 m_pBody->release();
153 m_pBody = handle.m_pBody;
154 handle.m_pBody = nullptr;
155 return *this;
156 }
157#endif
158
159 /** Assignment...
160 */
161 Reference<reference_type> &
162 SAL_CALL operator= (reference_type * pBody)
163 {
164 return set( pBody );
165 }
166
167 /** Unbind the body from this handle.
168 Note that for a handle representing a large body,
169 "handle.clear().set(new body());" _might_
170 perform a little bit better than "handle.set(new body());",
171 since in the second case two large objects exist in memory
172 (the old body and the new body).
173 */
174 Reference<reference_type> & SAL_CALL clear()
175 {
176 if (m_pBody)
177 {
178 reference_type * const pOld = m_pBody;
179 m_pBody = NULL__null;
180 pOld->release();
181 }
182 return *this;
183 }
184
185
186 /** Get the body. Can be used instead of operator->().
187 I.e. handle->someBodyOp() and handle.get()->someBodyOp()
188 are the same.
189 */
190 reference_type * SAL_CALL get() const
191 {
192 return m_pBody;
193 }
194
195
196 /** Probably most common used: handle->someBodyOp().
197 */
198 reference_type * SAL_CALL operator->() const
199 {
200 assert(m_pBody != NULL)(static_cast <bool> (m_pBody != __null) ? void (0) : __assert_fail
("m_pBody != NULL", "/home/maarten/src/libreoffice/core/include/rtl/ref.hxx"
, 200, __extension__ __PRETTY_FUNCTION__))
;
201 return m_pBody;
202 }
203
204
205 /** Allows (*handle).someBodyOp().
206 */
207 reference_type & SAL_CALL operator*() const
208 {
209 assert(m_pBody != NULL)(static_cast <bool> (m_pBody != __null) ? void (0) : __assert_fail
("m_pBody != NULL", "/home/maarten/src/libreoffice/core/include/rtl/ref.hxx"
, 209, __extension__ __PRETTY_FUNCTION__))
;
210 return *m_pBody;
211 }
212
213
214 /** Returns True if the handle does point to a valid body.
215 */
216 bool SAL_CALL is() const
217 {
218 return (m_pBody != NULL__null);
219 }
220
221#if defined LIBO_INTERNAL_ONLY1
222 /** Returns True if the handle does point to a valid body.
223 */
224 explicit operator bool() const
225 {
226 return is();
227 }
228#endif
229
230 /** Returns True if this points to pBody.
231 */
232 bool SAL_CALL operator== (const reference_type * pBody) const
233 {
234 return (m_pBody == pBody);
235 }
236
237
238 /** Returns True if handle points to the same body.
239 */
240 bool
241 SAL_CALL operator== (const Reference<reference_type> & handle) const
242 {
243 return (m_pBody == handle.m_pBody);
244 }
245
246
247 /** Needed to place References into STL collection.
248 */
249 bool
250 SAL_CALL operator!= (const Reference<reference_type> & handle) const
251 {
252 return (m_pBody != handle.m_pBody);
253 }
254
255
256 /** Needed to place References into STL collection.
257 */
258 bool
259 SAL_CALL operator< (const Reference<reference_type> & handle) const
260 {
261 return (m_pBody < handle.m_pBody);
262 }
263
264
265 /** Needed to place References into STL collection.
266 */
267 bool
268 SAL_CALL operator> (const Reference<reference_type> & handle) const
269 {
270 return (m_pBody > handle.m_pBody);
271 }
272};
273
274} // namespace rtl
275
276#if defined LIBO_INTERNAL_ONLY1
277namespace std
278{
279
280/// @cond INTERNAL
281/**
282 Make rtl::Reference hashable by default for use in STL containers.
283
284 @since LibreOffice 6.3
285*/
286template<typename T>
287struct hash<::rtl::Reference<T>>
288{
289 std::size_t operator()(::rtl::Reference<T> const & s) const
290 { return std::size_t(s.get()); }
291};
292/// @endcond
293
294}
295
296#endif
297
298#endif /* ! INCLUDED_RTL_REF_HXX */
299
300/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

/home/maarten/src/libreoffice/core/include/vcl/vclreferencebase.hxx

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19#ifndef INCLUDED_VCL_Reference_HXX
20#define INCLUDED_VCL_Reference_HXX
21
22#include <vcl/dllapi.h>
23#include <osl/interlck.h>
24
25class VCL_DLLPUBLIC__attribute__ ((visibility("default"))) VclReferenceBase
26{
27 mutable oslInterlockedCount mnRefCnt;
28
29 template<typename T> friend class VclPtr;
30
31public:
32 void acquire() const
33 {
34 osl_atomic_increment(&mnRefCnt)__sync_add_and_fetch((&mnRefCnt), 1);
35 }
36
37 void release() const
38 {
39 if (osl_atomic_decrement(&mnRefCnt)__sync_sub_and_fetch((&mnRefCnt), 1) == 0)
16
Assuming the condition is true
17
Taking true branch
40 delete this;
18
Memory is released
41 }
42#ifdef DBG_UTIL
43#ifndef _WIN32
44 sal_Int32 getRefCount() const { return mnRefCnt; }
45#endif
46#endif
47
48
49private:
50 VclReferenceBase(const VclReferenceBase&) = delete;
51 VclReferenceBase& operator=(const VclReferenceBase&) = delete;
52
53 bool mbDisposed : 1;
54
55protected:
56 VclReferenceBase();
57protected:
58 virtual ~VclReferenceBase();
59
60protected:
61 virtual void dispose();
62
63public:
64 void disposeOnce();
65 bool isDisposed() const { return mbDisposed; }
66
67};
68#endif