Bug Summary

File:home/maarten/src/libreoffice/core/include/rtl/ref.hxx
Warning:line 192, column 9
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 prevwsh.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 /usr/include/libxml2 -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 SC_DLLIMPLEMENTATION -D SC_INFO_OSVERSION="LINUX" -D SYSTEM_LIBXML -D EXCEPTIONS_ON -D LIBO_INTERNAL_ONLY -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/liborcus/include -I /home/maarten/src/libreoffice/core/workdir/UnpackedTarball/mdds/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/external/clew/source/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/sc/source/core/inc -I /home/maarten/src/libreoffice/core/sc/source/filter/inc -I /home/maarten/src/libreoffice/core/sc/source/ui/inc -I /home/maarten/src/libreoffice/core/sc/inc -I /home/maarten/src/libreoffice/core/workdir/SdiTarget/sc/sdi -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/workdir/CustomTarget/officecfg/registry -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/UnoApiHeadersTarget/oovbaapi/normal -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/sc/source/ui/view/prevwsh.cxx

/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.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 * 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#include <sal/config.h>
21
22#include <scitems.hxx>
23
24#include <comphelper/SetFlagContextHelper.hxx>
25#include <sfx2/app.hxx>
26#include <editeng/sizeitem.hxx>
27#include <svx/zoomslideritem.hxx>
28#include <svx/svdview.hxx>
29#include <sfx2/dispatch.hxx>
30#include <sfx2/objface.hxx>
31#include <sfx2/request.hxx>
32#include <svl/stritem.hxx>
33#include <svl/whiter.hxx>
34#include <vcl/commandevent.hxx>
35#include <vcl/help.hxx>
36#include <vcl/settings.hxx>
37#include <vcl/svapp.hxx>
38#include <tools/urlobj.hxx>
39#include <sfx2/docfile.hxx>
40#include <sfx2/printer.hxx>
41#include <sfx2/viewfrm.hxx>
42#include <sfx2/viewfac.hxx>
43
44#include <drwlayer.hxx>
45#include <prevwsh.hxx>
46#include <preview.hxx>
47#include <printfun.hxx>
48#include <scmod.hxx>
49#include <inputhdl.hxx>
50#include <docsh.hxx>
51#include <tabvwsh.hxx>
52#include <stlpool.hxx>
53#include <editutil.hxx>
54#include <globstr.hrc>
55#include <scresid.hxx>
56#include <sc.hrc>
57#include <ViewSettingsSequenceDefines.hxx>
58#include <viewuno.hxx>
59
60#include <svx/svxdlg.hxx>
61#include <svx/dialogs.hrc>
62
63#include <basegfx/utils/zoomtools.hxx>
64#include <svx/zoom_def.hxx>
65#include <com/sun/star/document/XDocumentProperties.hpp>
66
67#include <scabstdlg.hxx>
68#include <vcl/EnumContext.hxx>
69#include <vcl/notebookbar.hxx>
70
71// for mouse wheel
72#define MINZOOM_SLIDER10 10
73#define MAXZOOM_SLIDER400 400
74
75#define SC_USERDATA_SEP';' ';'
76
77using namespace com::sun::star;
78
79#define ShellClass_ScPreviewShell
80#include <scslots.hxx>
81
82#include <memory>
83
84
85SFX_IMPL_INTERFACE(ScPreviewShell, SfxViewShell)SfxInterface* ScPreviewShell::pInterface = nullptr; SfxInterface
* ScPreviewShell::GetStaticInterface() { if ( !pInterface ) {
pInterface = new SfxInterface( "ScPreviewShell", false, GetInterfaceId
(), SfxViewShell::GetStaticInterface(), aScPreviewShellSlots_Impl
[0], sal_uInt16(sizeof(aScPreviewShellSlots_Impl) / sizeof(SfxSlot
) ) ); InitInterface_Impl(); } return pInterface; } SfxInterface
* ScPreviewShell::GetInterface() const { return GetStaticInterface
(); } void ScPreviewShell::RegisterInterface(const SfxModule*
pMod) { GetStaticInterface()->Register(pMod); }
86
87void ScPreviewShell::InitInterface_Impl()
88{
89 GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT1,
90 SfxVisibilityFlags::Standard|SfxVisibilityFlags::Server|SfxVisibilityFlags::ReadonlyDoc,
91 ToolbarId::Objectbar_Preview);
92
93 GetStaticInterface()->RegisterPopupMenu("preview");
94}
95
96SFX_IMPL_NAMED_VIEWFACTORY( ScPreviewShell, "PrintPreview" )SfxViewFactory* ScPreviewShell::pFactory; SfxViewShell* ScPreviewShell
::CreateInstance(SfxViewFrame *pFrame, SfxViewShell *pOldView
) { return new ScPreviewShell(pFrame, pOldView); } void ScPreviewShell
::RegisterFactory( SfxInterfaceId nPrio ) { pFactory = new SfxViewFactory
(&CreateInstance,nPrio,"PrintPreview"); InitFactory(); } void
ScPreviewShell::InitFactory()
97{
98 SFX_VIEW_REGISTRATION(ScDocShell)ScDocShell::Factory().RegisterViewFactory( *Factory() );
99}
100
101void ScPreviewShell::Construct( vcl::Window* pParent )
102{
103 // Find the top-most window, and set the close window handler to intercept
104 // the window close event.
105 vcl::Window* pWin = pParent;
106 while (!pWin->IsSystemWindow())
107 {
108 if (pWin->GetParent())
109 pWin = pWin->GetParent();
110 else
111 break;
112 }
113
114 mpFrameWindow = dynamic_cast<SystemWindow*>(pWin);
115 if (mpFrameWindow)
116 mpFrameWindow->SetCloseHdl(LINK(this, ScPreviewShell, CloseHdl)::tools::detail::makeLink( ::tools::detail::castTo<ScPreviewShell
*>(this), &ScPreviewShell::LinkStubCloseHdl)
);
117
118 eZoom = SvxZoomType::WHOLEPAGE;
119
120 pCorner = VclPtr<ScrollBarBox>::Create( pParent, WB_SIZEABLE );
121
122 pHorScroll = VclPtr<ScrollBar>::Create(pParent, WB_HSCROLL );
123 pVerScroll = VclPtr<ScrollBar>::Create(pParent, WB_VSCROLL);
124
125 // RTL: no mirroring for horizontal scrollbars
126 pHorScroll->EnableRTL( false );
127
128 pHorScroll->SetEndScrollHdl( LINK( this, ScPreviewShell, ScrollHandler )::tools::detail::makeLink( ::tools::detail::castTo<ScPreviewShell
*>(this), &ScPreviewShell::LinkStubScrollHandler)
);
129 pVerScroll->SetEndScrollHdl( LINK( this, ScPreviewShell, ScrollHandler )::tools::detail::makeLink( ::tools::detail::castTo<ScPreviewShell
*>(this), &ScPreviewShell::LinkStubScrollHandler)
);
130
131 pPreview = VclPtr<ScPreview>::Create( pParent, pDocShell, this );
132
133 SetPool( &SC_MOD()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule
::Calc)) )
->GetPool() );
134 SetWindow( pPreview );
135 StartListening(*pDocShell, DuplicateHandling::Prevent);
136 StartListening(*SfxGetpApp(), DuplicateHandling::Prevent); // #i62045# #i62046# application is needed for Calc's own hints
137 SfxBroadcaster* pDrawBC = pDocShell->GetDocument().GetDrawBroadcaster();
138 if (pDrawBC)
139 StartListening(*pDrawBC);
140
141 pHorScroll->Show( false );
142 pVerScroll->Show( false );
143 pCorner->Show();
144 SetName("Preview");
145}
146
147ScPreviewShell::ScPreviewShell( SfxViewFrame* pViewFrame,
148 SfxViewShell* pOldSh ) :
149 SfxViewShell( pViewFrame, SfxViewShellFlags::HAS_PRINTOPTIONS ),
150 pDocShell( static_cast<ScDocShell*>(pViewFrame->GetObjectShell()) ),
151 mpFrameWindow(nullptr),
152 nSourceDesignMode( TRISTATE_INDET ),
153 nMaxVertPos(0)
154{
155 Construct( &pViewFrame->GetWindow() );
156
157 try
158 {
159 SfxShell::SetContextBroadcasterEnabled(true);
160 SfxShell::SetContextName(
161 vcl::EnumContext::GetContextName(vcl::EnumContext::Context::Printpreview));
162 SfxShell::BroadcastContextForActivation(true);
163 }
164 catch (const css::uno::RuntimeException& e)
165 {
166 // tdf#130559: allow BackingComp to fail adding listener when opening document
167 css::uno::Reference<css::lang::XServiceInfo> xServiceInfo(e.Context, css::uno::UNO_QUERY);
168 if (!xServiceInfo || !xServiceInfo->supportsService("com.sun.star.frame.StartModule"))
169 throw;
170 SAL_WARN("sc.ui", "Opening file from StartModule straight into print preview")do { if (true) { switch (sal_detail_log_report(::SAL_DETAIL_LOG_LEVEL_WARN
, "sc.ui")) { case SAL_DETAIL_LOG_ACTION_IGNORE: break; case SAL_DETAIL_LOG_ACTION_LOG
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Opening file from StartModule straight into print preview"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("sc.ui"
), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "170" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Opening file from StartModule straight into print preview"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Opening file from StartModule straight into print preview"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("sc.ui"
), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "170" ": "), sal_detail_stream, 0); }; break; case SAL_DETAIL_LOG_ACTION_FATAL
: if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart
() << "Opening file from StartModule straight into print preview"
) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("sc.ui"
), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "170" ": "), ::sal::detail::unwrapStream( ::sal::detail::
StreamStart() << "Opening file from StartModule straight into print preview"
), 0); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream
<< "Opening file from StartModule straight into print preview"
; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("sc.ui"
), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "170" ": "), sal_detail_stream, 0); }; std::abort(); break
; } } } while (false)
;
171 }
172
173 auto& pNotebookBar = pViewFrame->GetWindow().GetSystemWindow()->GetNotebookBar();
174 if (pNotebookBar)
175 pNotebookBar->ControlListenerForCurrentController(false); // stop listening
176
177 if ( auto pTabViewShell = dynamic_cast<ScTabViewShell*>( pOldSh) )
178 {
179 // store view settings, show table from TabView
180 //! store live ScViewData instead, and update on ScTablesHint?
181 //! or completely forget aSourceData on ScTablesHint?
182
183 const ScViewData& rData = pTabViewShell->GetViewData();
184 pPreview->SetSelectedTabs(rData.GetMarkData());
185 InitStartTable( rData.GetTabNo() );
186
187 // also have to store the TabView's DesignMode state
188 // (only if draw view exists)
189 SdrView* pDrawView = pTabViewShell->GetScDrawView();
190 if ( pDrawView )
191 nSourceDesignMode
192 = pDrawView->IsDesignMode() ? TRISTATE_TRUE : TRISTATE_FALSE;
193 }
194
195 new ScPreviewObj(this);
196}
197
198ScPreviewShell::~ScPreviewShell()
199{
200 if (mpFrameWindow)
201 mpFrameWindow->SetCloseHdl(Link<SystemWindow&,void>()); // Remove close handler.
202
203 if (auto& pBar = GetViewFrame()->GetWindow().GetSystemWindow()->GetNotebookBar())
204 pBar->ControlListenerForCurrentController(true); // let it start listening now
205
206 // #108333#; notify Accessibility that Shell is dying and before destroy all
207 BroadcastAccessibility( SfxHint( SfxHintId::Dying ) );
208 pAccessibilityBroadcaster.reset();
209
210 SfxBroadcaster* pDrawBC = pDocShell->GetDocument().GetDrawBroadcaster();
211 if (pDrawBC)
212 EndListening(*pDrawBC);
213 EndListening(*SfxGetpApp());
214 EndListening(*pDocShell);
215
216 SetWindow(nullptr);
217 pPreview.disposeAndClear();
218 pHorScroll.disposeAndClear();
219 pVerScroll.disposeAndClear();
220 pCorner.disposeAndClear();
221
222 // normal mode of operation is switching back to default view in the same frame,
223 // so there's no need to activate any other window here anymore
224}
225
226void ScPreviewShell::InitStartTable(SCTAB nTab)
227{
228 pPreview->SetPageNo( pPreview->GetFirstPage(nTab) );
229}
230
231void ScPreviewShell::AdjustPosSizePixel( const Point &rPos, const Size &rSize )
232{
233 Size aOutSize( rSize );
234 pPreview->SetPosSizePixel( rPos, aOutSize );
235
236 if ( SvxZoomType::WHOLEPAGE == eZoom )
237 pPreview->SetZoom( pPreview->GetOptimalZoom(false) );
238 else if ( SvxZoomType::PAGEWIDTH == eZoom )
239 pPreview->SetZoom( pPreview->GetOptimalZoom(true) );
240
241 UpdateNeededScrollBars(false);
242}
243
244void ScPreviewShell::InnerResizePixel( const Point &rOfs, const Size &rSize, bool )
245{
246 AdjustPosSizePixel( rOfs,rSize );
247}
248
249void ScPreviewShell::OuterResizePixel( const Point &rOfs, const Size &rSize )
250{
251 AdjustPosSizePixel( rOfs,rSize );
252}
253
254bool ScPreviewShell::GetPageSize( Size& aPageSize )
255{
256 ScDocument& rDoc = pDocShell->GetDocument();
257 SCTAB nTab = pPreview->GetTab();
258
259 ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
260 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( rDoc.GetPageStyle( nTab ),
261 SfxStyleFamily::Page );
262 OSL_ENSURE(pStyleSheet,"No style sheet")do { if (true && (!(pStyleSheet))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "262" ": "), "%s", "No style sheet"); } } while (false)
;
263 if (!pStyleSheet) return false;
264 const SfxItemSet* pParamSet = &pStyleSheet->GetItemSet();
265
266 aPageSize = pParamSet->Get(ATTR_PAGE_SIZE).GetSize();
267 aPageSize.setWidth( static_cast<long>(aPageSize.Width() * HMM_PER_TWIPS((2.54 / (20.0 * 72.0)) * 1000.0) ) );
268 aPageSize.setHeight( static_cast<long>(aPageSize.Height() * HMM_PER_TWIPS((2.54 / (20.0 * 72.0)) * 1000.0) ) );
269 return true;
270}
271
272void ScPreviewShell::UpdateNeededScrollBars( bool bFromZoom )
273{
274 Size aPageSize;
275 OutputDevice* pDevice = Application::GetDefaultDevice();
276
277 long nBarW = GetViewFrame()->GetWindow().GetSettings().GetStyleSettings().GetScrollBarSize();
278 long nBarH = nBarW;
279
280 long aHeightOffSet = pDevice ? pDevice->PixelToLogic( Size( nBarW, nBarH ), pPreview->GetMapMode() ).Height() : 0;
281 long aWidthOffSet = aHeightOffSet;
282
283 if (!GetPageSize( aPageSize ))
284 return;
285
286 // for centering, page size without the shadow is used
287 bool bVert = pVerScroll->IsVisible();
288 bool bHori = pHorScroll->IsVisible();
289 Size aWindowSize = pPreview->GetOutputSize();
290 Point aPos = pPreview->GetPosPixel();
291 Size aWindowPixelSize = pPreview->GetOutputSizePixel();
292
293 // if we are called from Zoom then we need to compensate for whatever
294 // scrollbars were displayed before the zoom was called
295 if ( bFromZoom )
296 {
297 if ( bVert )
298 {
299 aWindowPixelSize.AdjustWidth(nBarH );
300 aWindowSize.AdjustWidth(aHeightOffSet );
301 }
302 if ( bHori )
303 {
304 aWindowPixelSize.AdjustHeight(nBarW );
305 aWindowSize.AdjustHeight(aWidthOffSet );
306 }
307 }
308
309 // recalculate any needed scrollbars
310 long nMaxWidthPos = aPageSize.Width() - aWindowSize.Width();
311 bHori = nMaxWidthPos >= 0;
312 long nMaxHeightPos = aPageSize.Height() - aWindowSize.Height();
313 bVert = nMaxHeightPos >= 0;
314
315 // see if having a scroll bar requires the other
316 if ( bVert != bHori && ( bVert || bHori ) )
317 {
318 if ( bVert && ( (nMaxWidthPos + aWidthOffSet ) > 0 ) )
319 bHori = true;
320 else if ( (nMaxHeightPos + aHeightOffSet ) > 0 )
321 bVert = true;
322 }
323 pHorScroll->Show( bHori );
324 pVerScroll->Show( bVert );
325
326 // make room for needed scrollbars ( and reduce the size
327 // of the preview appropriately )
328 if ( bHori )
329 aWindowPixelSize.AdjustHeight( -nBarW );
330 if ( bVert )
331 aWindowPixelSize.AdjustWidth( -nBarH );
332
333 pPreview->SetSizePixel( aWindowPixelSize );
334 pHorScroll->SetPosSizePixel( Point( aPos.X(), aPos.Y() + aWindowPixelSize.Height() ),
335 Size( aWindowPixelSize.Width(), nBarH ) );
336 pVerScroll->SetPosSizePixel( Point( aPos.X() + aWindowPixelSize.Width(), aPos.Y() ),
337 Size( nBarW, aWindowPixelSize.Height() ) );
338 pCorner->SetPosSizePixel( Point( aPos.X() + aWindowPixelSize.Width(), aPos.Y() + aWindowPixelSize.Height() ),
339 Size( nBarW, nBarH ) );
340 UpdateScrollBars();
341}
342
343void ScPreviewShell::UpdateScrollBars()
344{
345 Size aPageSize;
346 if ( !GetPageSize( aPageSize ) )
347 return;
348
349 // for centering, page size without the shadow is used
350
351 Size aWindowSize = pPreview->GetOutputSize();
352
353 Point aOfs = pPreview->GetOffset();
354
355 if( pHorScroll )
356 {
357 pHorScroll->SetRange( Range( 0, aPageSize.Width() ) );
358 pHorScroll->SetLineSize( aWindowSize.Width() / 16 );
359 pHorScroll->SetPageSize( aWindowSize.Width() );
360 pHorScroll->SetVisibleSize( aWindowSize.Width() );
361 long nMaxPos = aPageSize.Width() - aWindowSize.Width();
362 if ( nMaxPos<0 )
363 {
364 // page smaller than window -> center (but put scrollbar to 0)
365 aOfs.setX( 0 );
366 pPreview->SetXOffset( nMaxPos / 2 );
367 }
368 else if (aOfs.X() < 0)
369 {
370 // page larger than window -> never use negative offset
371 aOfs.setX( 0 );
372 pPreview->SetXOffset( 0 );
373 }
374 else if (aOfs.X() > nMaxPos)
375 {
376 // limit offset to align with right edge of window
377 aOfs.setX( nMaxPos );
378 pPreview->SetXOffset(nMaxPos);
379 }
380 pHorScroll->SetThumbPos( aOfs.X() );
381 }
382
383 if( !pVerScroll )
384 return;
385
386 long nPageNo = pPreview->GetPageNo();
387 long nTotalPages = pPreview->GetTotalPages();
388
389 nMaxVertPos = aPageSize.Height() - aWindowSize.Height();
390 pVerScroll->SetLineSize( aWindowSize.Height() / 16 );
391 pVerScroll->SetPageSize( aWindowSize.Height() );
392 pVerScroll->SetVisibleSize( aWindowSize.Height() );
393 if ( nMaxVertPos < 0 )
394 {
395 // page smaller than window -> center (but put scrollbar to 0)
396 aOfs.setY( 0 );
397 pPreview->SetYOffset( nMaxVertPos / 2 );
398 pVerScroll->SetThumbPos( nPageNo * aWindowSize.Height() );
399 pVerScroll->SetRange( Range( 0, aWindowSize.Height() * nTotalPages ));
400 }
401 else if (aOfs.Y() < 0)
402 {
403 // page larger than window -> never use negative offset
404 pVerScroll->SetRange( Range( 0, aPageSize.Height() ) );
405 aOfs.setY( 0 );
406 pPreview->SetYOffset( 0 );
407 pVerScroll->SetThumbPos( aOfs.Y() );
408 }
409 else if (aOfs.Y() > nMaxVertPos )
410 {
411 // limit offset to align with window bottom
412 pVerScroll->SetRange( Range( 0, aPageSize.Height() ) );
413 aOfs.setY( nMaxVertPos );
414 pPreview->SetYOffset( nMaxVertPos );
415 pVerScroll->SetThumbPos( aOfs.Y() );
416 }
417}
418
419IMPL_LINK( ScPreviewShell, ScrollHandler, ScrollBar*, pScroll, void )void ScPreviewShell::LinkStubScrollHandler(void * instance, ScrollBar
* data) { return static_cast<ScPreviewShell *>(instance
)->ScrollHandler(data); } void ScPreviewShell::ScrollHandler
(ScrollBar* pScroll)
420{
421 long nPos = pScroll->GetThumbPos();
422 long nDelta = pScroll->GetDelta();
423 long nMaxRange = pScroll->GetRangeMax();
424 long nTotalPages = pPreview->GetTotalPages();
425 long nPageNo = 0;
426 long nPerPageLength = 0;
427 bool bIsDivide = true;
428
429 if( nTotalPages )
430 nPerPageLength = nMaxRange / nTotalPages;
431
432 if( nPerPageLength )
433 {
434 nPageNo = nPos / nPerPageLength;
435 if( nPos % nPerPageLength )
436 {
437 bIsDivide = false;
438 nPageNo ++;
439 }
440 }
441
442 bool bHoriz = ( pScroll == pHorScroll );
443
444 if( bHoriz )
445 pPreview->SetXOffset( nPos );
446 else
447 {
448 if( nMaxVertPos > 0 )
449 pPreview->SetYOffset( nPos );
450 else
451 {
452 Point aMousePos = pScroll->OutputToNormalizedScreenPixel( pScroll->GetPointerPosPixel() );
453 Point aPos = pScroll->GetParent()->OutputToNormalizedScreenPixel( pScroll->GetPosPixel() );
454 OUString aHelpStr;
455 tools::Rectangle aRect;
456 QuickHelpFlags nAlign;
457
458 if( nDelta < 0 )
459 {
460 if ( nTotalPages && nPageNo > 0 && !bIsDivide )
461 pPreview->SetPageNo( nPageNo-1 );
462 if( bIsDivide )
463 pPreview->SetPageNo( nPageNo );
464
465 aHelpStr = ScResId( STR_PAGEreinterpret_cast<char const *>("STR_PAGE" "\004" u8"Page"
)
) +
466 " " + OUString::number( nPageNo ) +
467 " / " + OUString::number( nTotalPages );
468 }
469 else if( nDelta > 0 )
470 {
471 bool bAllTested = pPreview->AllTested();
472 if ( nTotalPages && ( nPageNo < nTotalPages || !bAllTested ) )
473 pPreview->SetPageNo( nPageNo );
474
475 aHelpStr = ScResId( STR_PAGEreinterpret_cast<char const *>("STR_PAGE" "\004" u8"Page"
)
) +
476 " " + OUString::number( nPageNo+1 ) +
477 " / " + OUString::number( nTotalPages );
478 }
479
480 aRect.SetLeft( aPos.X() - 8 );
481 aRect.SetTop( aMousePos.Y() );
482 aRect.SetRight( aRect.Left() );
483 aRect.SetBottom( aRect.Top() );
484 nAlign = QuickHelpFlags::Bottom|QuickHelpFlags::Center;
485 Help::ShowQuickHelp( pScroll->GetParent(), aRect, aHelpStr, nAlign );
486 }
487 }
488}
489
490IMPL_LINK_NOARG(ScPreviewShell, CloseHdl, SystemWindow&, void)void ScPreviewShell::LinkStubCloseHdl(void * instance, SystemWindow
& data) { return static_cast<ScPreviewShell *>(instance
)->CloseHdl(data); } void ScPreviewShell::CloseHdl(__attribute__
((unused)) SystemWindow&)
491{
492 ExitPreview();
493}
494
495bool ScPreviewShell::ScrollCommand( const CommandEvent& rCEvt )
496{
497 bool bDone = false;
498 const CommandWheelData* pData = rCEvt.GetWheelData();
499 if ( pData && pData->GetMode() == CommandWheelMode::ZOOM )
500 {
501 long nOld = pPreview->GetZoom();
502 long nNew;
503 if ( pData->GetDelta() < 0 )
504 nNew = std::max( long(MINZOOM20), basegfx::zoomtools::zoomOut( nOld ));
505 else
506 nNew = std::min( long(MAXZOOM400), basegfx::zoomtools::zoomIn( nOld ));
507
508 if ( nNew != nOld )
509 {
510 eZoom = SvxZoomType::PERCENT;
511 pPreview->SetZoom( static_cast<sal_uInt16>(nNew) );
512 }
513
514 bDone = true;
515 }
516 else
517 {
518 bDone = pPreview->HandleScrollCommand( rCEvt, pHorScroll, pVerScroll );
519 }
520
521 return bDone;
522}
523
524SfxPrinter* ScPreviewShell::GetPrinter( bool bCreate )
525{
526 return pDocShell->GetPrinter(bCreate);
527}
528
529sal_uInt16 ScPreviewShell::SetPrinter( SfxPrinter *pNewPrinter, SfxPrinterChangeFlags nDiffFlags )
530{
531 return pDocShell->SetPrinter( pNewPrinter, nDiffFlags );
532}
533
534bool ScPreviewShell::HasPrintOptionsPage() const
535{
536 return true;
537}
538
539std::unique_ptr<SfxTabPage> ScPreviewShell::CreatePrintOptionsPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet &rOptions)
540{
541 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
542 ::CreateTabPage ScTpPrintOptionsCreate = pFact->GetTabPageCreatorFunc(RID_SC_TP_PRINT((10000 +6900) + 248));
543 if ( ScTpPrintOptionsCreate )
544 return ScTpPrintOptionsCreate(pPage, pController, &rOptions);
545 return nullptr;
546}
547
548void ScPreviewShell::Activate(bool bMDI)
549{
550 SfxViewShell::Activate(bMDI);
551
552 //! Basic etc. -> outsource to its own file (see tabvwsh4)
553
554 if (bMDI)
555 {
556 // InputHdl is now mostly Null, no more assertion!
557 ScInputHandler* pInputHdl = SC_MOD()( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule
::Calc)) )
->GetInputHdl();
558 if ( pInputHdl )
559 pInputHdl->NotifyChange( nullptr );
560 }
561}
562
563void ScPreviewShell::Execute( SfxRequest& rReq )
564{
565 sal_uInt16 nSlot = rReq.GetSlot();
566 const SfxItemSet* pReqArgs = rReq.GetArgs();
567
568 switch ( nSlot )
1
Control jumps to 'case 26244:' at line 620
569 {
570 case SID_FORMATPAGE((((((((((26000 + 200) + 20)) + 20)) + 20)) + 25)) + 17):
571 case SID_STATUS_PAGESTYLE((26000 + 100) + 15):
572 case SID_HFEDIT((((26000 + 200) + 20)) + 15):
573 pDocShell->ExecutePageStyle( *this, rReq, pPreview->GetTab() );
574 break;
575 case SID_REPAINT(26000 + 12):
576 pPreview->Invalidate();
577 rReq.Done();
578 break;
579 case SID_PREV_TABLE((26000 + 521) + 23): // Accelerator
580 case SID_PREVIEW_PREVIOUS(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+1)
:
581 {
582 long nPage = pPreview->GetPageNo();
583 long nTotal = pPreview->GetTotalPages();
584 if (nTotal && nPage > 0)
585 pPreview->SetPageNo( nPage-1 );
586 }
587 break;
588 case SID_NEXT_TABLE((26000 + 521) + 22): // Accelerator
589 case SID_PREVIEW_NEXT(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20))
:
590 {
591 bool bAllTested = pPreview->AllTested();
592 long nPage = pPreview->GetPageNo();
593 long nTotal = pPreview->GetTotalPages();
594 if (nTotal && (nPage+1 < nTotal || !bAllTested))
595 pPreview->SetPageNo( nPage+1 );
596 }
597 break;
598 case SID_CURSORTOPOFFILE(5000 + 742): // Accelerator
599 case SID_PREVIEW_FIRST(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+2)
:
600 {
601 long nPage = pPreview->GetPageNo();
602 long nTotal = pPreview->GetTotalPages();
603 if (nTotal && nPage != 0)
604 pPreview->SetPageNo( 0 );
605 }
606 break;
607 case SID_CURSORENDOFFILE(5000 + 741): // Accelerator
608 case SID_PREVIEW_LAST(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+3)
:
609 {
610 if (!pPreview->AllTested())
611 pPreview->CalcAll();
612
613 long nPage = pPreview->GetPageNo();
614 long nTotal = pPreview->GetTotalPages();
615 if (nTotal && nPage+1 != nTotal)
616 pPreview->SetPageNo( nTotal-1 );
617 }
618 break;
619 case SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0):
620 case FID_SCALE((((((26000 + 200) + 20)) + 20)) + 4):
621 {
622 sal_uInt16 nZoom = 100;
623 bool bCancel = false;
624
625 eZoom = SvxZoomType::PERCENT;
626
627 if ( pReqArgs )
2
Assuming 'pReqArgs' is null
3
Taking false branch
628 {
629
630 const SvxZoomItem& rZoomItem = pReqArgs->Get(SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0));
631
632 eZoom = rZoomItem.GetType();
633 nZoom = rZoomItem.GetValue();
634 }
635 else
636 {
637 SfxItemSet aSet ( GetPool(), svl::Items<SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0), SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0)>{} );
638 SvxZoomItem aZoomItem( SvxZoomType::PERCENT, pPreview->GetZoom(), SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0) );
639
640 aSet.Put( aZoomItem );
641 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
642 ScopedVclPtr<AbstractSvxZoomDialog> pDlg(pFact->CreateSvxZoomDialog(nullptr, aSet));
4
Calling constructor for 'ScopedVclPtr<AbstractSvxZoomDialog>'
11
Returning from constructor for 'ScopedVclPtr<AbstractSvxZoomDialog>'
12
Calling implicit destructor for 'VclPtr<AbstractSvxZoomDialog>'
13
Calling '~Reference'
20
Returning from '~Reference'
21
Returning from destructor for 'VclPtr<AbstractSvxZoomDialog>'
643 pDlg->SetLimits( 20, 400 );
22
Calling 'VclPtr::operator->'
644 pDlg->HideButton( ZoomButtonId::OPTIMAL );
645 bCancel = ( RET_CANCEL == pDlg->Execute() );
646
647 if ( !bCancel )
648 {
649 const SvxZoomItem& rZoomItem = pDlg->GetOutputItemSet()->
650 Get( SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0) );
651
652 eZoom = rZoomItem.GetType();
653 nZoom = rZoomItem.GetValue();
654 }
655 }
656
657 if ( !bCancel )
658 {
659 switch ( eZoom )
660 {
661 case SvxZoomType::OPTIMAL:
662 case SvxZoomType::WHOLEPAGE:
663 nZoom = pPreview->GetOptimalZoom(false);
664 break;
665 case SvxZoomType::PAGEWIDTH:
666 nZoom = pPreview->GetOptimalZoom(true);
667 break;
668 default:
669 {
670 // added to avoid warnings
671 }
672 }
673
674 pPreview->SetZoom( nZoom );
675 rReq.Done();
676 }
677 }
678 break;
679 case SID_PREVIEW_ZOOMIN(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+5)
:
680 {
681 sal_uInt16 nNew = pPreview->GetZoom() + 20 ;
682 nNew -= nNew % 20;
683 pPreview->SetZoom( nNew );
684 eZoom = SvxZoomType::PERCENT;
685 rReq.Done();
686 }
687 break;
688 case SID_PREVIEW_ZOOMOUT(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+6)
:
689 {
690 sal_uInt16 nNew = pPreview->GetZoom() - 1;
691 nNew -= nNew % 20;
692 pPreview->SetZoom( nNew );
693 eZoom = SvxZoomType::PERCENT;
694 rReq.Done();
695 }
696 break;
697 case SID_PREVIEW_MARGIN(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+8)
:
698 {
699 bool bMargin = pPreview->GetPageMargins();
700 pPreview->SetPageMargins( !bMargin );
701 pPreview->Invalidate();
702 rReq.Done();
703 }
704 break;
705 case SID_ATTR_ZOOMSLIDER( 10000 + 1065 ):
706 {
707 const SfxPoolItem* pItem;
708 eZoom = SvxZoomType::PERCENT;
709 if( pReqArgs && SfxItemState::SET == pReqArgs->GetItemState( SID_ATTR_ZOOMSLIDER( 10000 + 1065 ), true, &pItem ) )
710 {
711 const sal_uInt16 nCurrentZoom = static_cast<const SvxZoomSliderItem*>(pItem)->GetValue();
712 if( nCurrentZoom )
713 {
714 pPreview->SetZoom( nCurrentZoom );
715 rReq.Done();
716 }
717 }
718 }
719 break;
720 case SID_PREVIEW_SCALINGFACTOR(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+9)
:
721 {
722 const SfxPoolItem* pItem;
723 SCTAB nTab = pPreview->GetTab();
724 OUString aOldName = pDocShell->GetDocument().GetPageStyle( pPreview->GetTab() );
725 ScStyleSheetPool* pStylePool = pDocShell->GetDocument().GetStyleSheetPool();
726 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SfxStyleFamily::Page );
727 OSL_ENSURE( pStyleSheet, "PageStyle not found! :-/" )do { if (true && (!(pStyleSheet))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "727" ": "), "%s", "PageStyle not found! :-/"); } } while
(false)
;
728
729 if ( pReqArgs && pStyleSheet && SfxItemState::SET == pReqArgs->GetItemState( SID_PREVIEW_SCALINGFACTOR(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+9)
, true, &pItem ) )
730 {
731 const sal_uInt16 nCurrentZoom = static_cast<const SvxZoomSliderItem *>(pItem)->GetValue();
732 SfxItemSet& rSet = pStyleSheet->GetItemSet();
733 rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nCurrentZoom ) );
734 ScPrintFunc aPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab );
735 aPrintFunc.UpdatePages();
736 rReq.Done();
737 }
738 GetViewFrame()->GetBindings().Invalidate( nSlot );
739 }
740 break;
741 case SID_PRINTPREVIEW(5000 + 325):
742 case SID_PREVIEW_CLOSE(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+7)
:
743 // print preview is now always in the same frame as the tab view
744 // -> always switch this frame back to normal view
745 // (ScTabViewShell ctor reads stored view data)
746
747 ExitPreview();
748 break;
749 case SID_CURSORPAGEUP(5000 + 736):
750 case SID_CURSORPAGEDOWN(5000 + 735):
751 case SID_CURSORHOME(5000 + 745):
752 case SID_CURSOREND(5000 + 746):
753 case SID_CURSORUP(5000 + 732):
754 case SID_CURSORDOWN(5000 + 731):
755 case SID_CURSORLEFT(5000 + 733):
756 case SID_CURSORRIGHT(5000 + 734):
757 DoScroll( nSlot );
758 break;
759 case SID_CANCEL((26000 + 521) + 36):
760 if( ScViewUtil::IsFullScreen( *this ) )
761 ScViewUtil::SetFullScreen( *this, false );
762 break;
763
764 default:
765 break;
766 }
767}
768
769void ScPreviewShell::GetState( SfxItemSet& rSet )
770{
771 pPreview->SetInGetState(true);
772
773 SCTAB nTab = pPreview->GetTab();
774 long nPage = pPreview->GetPageNo();
775 long nTotal = pPreview->GetTotalPages();
776 sal_uInt16 nZoom = pPreview->GetZoom();
777 bool bAllTested = pPreview->AllTested();
778
779 SfxWhichIter aIter(rSet);
780 sal_uInt16 nWhich = aIter.FirstWhich();
781 while ( nWhich )
782 {
783 switch (nWhich)
784 {
785 case SID_STATUS_PAGESTYLE((26000 + 100) + 15):
786 case SID_HFEDIT((((26000 + 200) + 20)) + 15):
787 pDocShell->GetStatePageStyle( rSet, nTab );
788 break;
789 case SID_UNDO(5000 + 701):
790 case SID_REDO(5000 + 700):
791 case SID_REPEAT(5000 + 702):
792 case SID_SAVEDOC(5000 + 505):
793 case SID_SAVEASDOC(5000 + 502):
794 case SID_MAIL_SENDDOC(5000 + 331):
795 case SID_VIEW_DATA_SOURCE_BROWSER(5000 + 1660):
796 case SID_QUITAPP(5000 + 300):
797 rSet.DisableItem(nWhich);
798 break;
799 case SID_PREVIEW_PREVIOUS(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+1)
:
800 case SID_PREVIEW_FIRST(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+2)
:
801 if (!nTotal || nPage==0)
802 rSet.DisableItem(nWhich);
803 break;
804 case SID_PREVIEW_NEXT(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20))
:
805 case SID_PREVIEW_LAST(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+3)
:
806 if (bAllTested)
807 if (!nTotal || nPage==nTotal-1)
808 rSet.DisableItem(nWhich);
809 break;
810 case SID_PREVIEW_ZOOMIN(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+5)
:
811 if (nZoom >= 400)
812 rSet.DisableItem(nWhich);
813 break;
814 case SID_PREVIEW_ZOOMOUT(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+6)
:
815 if (nZoom <= 20)
816 rSet.DisableItem(nWhich);
817 break;
818 case SID_ATTR_ZOOMTypedWhichId<SvxZoomItem>(10000 + 0):
819 {
820 SvxZoomItem aZoom( eZoom, nZoom, nWhich );
821 aZoom.SetValueSet( SvxZoomEnableFlags::ALL & ~SvxZoomEnableFlags::OPTIMAL );
822 rSet.Put( aZoom );
823 }
824 break;
825 case SID_ATTR_ZOOMSLIDER( 10000 + 1065 ):
826 {
827 SvxZoomSliderItem aZoomSliderItem( nZoom, MINZOOM20, MAXZOOM400, SID_ATTR_ZOOMSLIDER( 10000 + 1065 ) );
828 aZoomSliderItem.AddSnappingPoint( 100 );
829 rSet.Put( aZoomSliderItem );
830 }
831 break;
832 case SID_PREVIEW_SCALINGFACTOR(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+9)
:
833 {
834 if( pDocShell->IsReadOnly() )
835 rSet.DisableItem( nWhich );
836 else
837 {
838 OUString aOldName = pDocShell->GetDocument().GetPageStyle( pPreview->GetTab() );
839 ScStyleSheetPool* pStylePool = pDocShell->GetDocument().GetStyleSheetPool();
840 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SfxStyleFamily::Page );
841 OSL_ENSURE( pStyleSheet, "PageStyle not found! :-/" )do { if (true && (!(pStyleSheet))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "841" ": "), "%s", "PageStyle not found! :-/"); } } while
(false)
;
842
843 if ( pStyleSheet )
844 {
845 SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
846 sal_uInt16 nCurrentZoom = rStyleSet.Get(ATTR_PAGE_SCALE).GetValue();
847 if( nCurrentZoom )
848 {
849 SvxZoomSliderItem aZoomSliderItem( nCurrentZoom, MINZOOM_SLIDER10, MAXZOOM_SLIDER400, SID_PREVIEW_SCALINGFACTOR(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+9)
);
850 aZoomSliderItem.AddSnappingPoint( 100 );
851 rSet.Put( aZoomSliderItem );
852 }
853 else
854 rSet.DisableItem( nWhich );
855 }
856 }
857 }
858 break;
859 case SID_STATUS_DOCPOS((26000 + 100) + 14):
860 rSet.Put( SfxStringItem( nWhich, pPreview->GetPosString() ) );
861 break;
862 case SID_PRINTPREVIEW(5000 + 325):
863 rSet.Put( SfxBoolItem( nWhich, true ) );
864 break;
865 case SID_FORMATPAGE((((((((((26000 + 200) + 20)) + 20)) + 20)) + 25)) + 17):
866 case SID_PREVIEW_MARGIN(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+8)
:
867 if( pDocShell->IsReadOnly() )
868 rSet.DisableItem( nWhich );
869 break;
870 }
871
872 nWhich = aIter.NextWhich();
873 }
874
875 pPreview->SetInGetState(false);
876}
877
878void ScPreviewShell::FillFieldData( ScHeaderFieldData& rData )
879{
880 ScDocument& rDoc = pDocShell->GetDocument();
881 SCTAB nTab = pPreview->GetTab();
882 OUString aTmp;
883 rDoc.GetName(nTab, aTmp);
884 rData.aTabName = aTmp;
885
886 if( pDocShell->getDocProperties()->getTitle().getLength() != 0 )
887 rData.aTitle = pDocShell->getDocProperties()->getTitle();
888 else
889 rData.aTitle = pDocShell->GetTitle();
890
891 const INetURLObject& rURLObj = pDocShell->GetMedium()->GetURLObject();
892 rData.aLongDocName = rURLObj.GetMainURL( INetURLObject::DecodeMechanism::Unambiguous );
893 if ( !rData.aLongDocName.isEmpty() )
894 rData.aShortDocName = rURLObj.GetLastName(INetURLObject::DecodeMechanism::Unambiguous);
895 else
896 rData.aShortDocName = rData.aLongDocName = rData.aTitle;
897 rData.nPageNo = pPreview->GetPageNo() + 1;
898
899 bool bAllTested = pPreview->AllTested();
900 if (bAllTested)
901 rData.nTotalPages = pPreview->GetTotalPages();
902 else
903 rData.nTotalPages = 99;
904
905 // the dialog knows eNumType
906}
907
908void ScPreviewShell::WriteUserData(OUString& rData, bool /* bBrowse */)
909{
910 // nZoom
911 // nPageNo
912
913 rData = OUString::number(pPreview->GetZoom())
914 + OUStringChar(SC_USERDATA_SEP';')
915 + OUString::number(pPreview->GetPageNo());
916}
917
918void ScPreviewShell::ReadUserData(const OUString& rData, bool /* bBrowse */)
919{
920 if (!rData.isEmpty())
921 {
922 sal_Int32 nIndex = 0;
923 pPreview->SetZoom(static_cast<sal_uInt16>(rData.getToken(0, SC_USERDATA_SEP';', nIndex).toInt32()));
924 pPreview->SetPageNo(rData.getToken(0, SC_USERDATA_SEP';', nIndex).toInt32());
925 eZoom = SvxZoomType::PERCENT;
926 }
927}
928
929void ScPreviewShell::WriteUserDataSequence(uno::Sequence < beans::PropertyValue >& rSeq)
930{
931 // tdf#130559: don't export preview view data if active
932 if (comphelper::IsContextFlagActive("NoPreviewData"))
933 return;
934
935 rSeq.realloc(3);
936 beans::PropertyValue* pSeq = rSeq.getArray();
937 sal_uInt16 nViewID(GetViewFrame()->GetCurViewId());
938 pSeq[0].Name = SC_VIEWID"ViewId";
939 pSeq[0].Value <<= SC_VIEW"view" + OUString::number(nViewID);
940 pSeq[1].Name = SC_ZOOMVALUE"ZoomValue";
941 pSeq[1].Value <<= sal_Int32 (pPreview->GetZoom());
942 pSeq[2].Name = "PageNumber";
943 pSeq[2].Value <<= pPreview->GetPageNo();
944
945 // Common SdrModel processing
946 if (ScDrawLayer* pDrawLayer = GetDocument().GetDrawLayer())
947 pDrawLayer->WriteUserDataSequence(rSeq);
948}
949
950void ScPreviewShell::ReadUserDataSequence(const uno::Sequence < beans::PropertyValue >& rSeq)
951{
952 for (const auto& propval : rSeq)
953 {
954 if (propval.Name == SC_ZOOMVALUE"ZoomValue")
955 {
956 sal_Int32 nTemp = 0;
957 if (propval.Value >>= nTemp)
958 pPreview->SetZoom(sal_uInt16(nTemp));
959 }
960 else if (propval.Name == "PageNumber")
961 {
962 sal_Int32 nTemp = 0;
963 if (propval.Value >>= nTemp)
964 pPreview->SetPageNo(nTemp);
965 }
966 // Fallback to common SdrModel processing
967 else
968 pDocShell->MakeDrawLayer()->ReadUserDataSequenceValue(&propval);
969 }
970}
971
972void ScPreviewShell::DoScroll( sal_uInt16 nMode )
973{
974 Point aCurPos, aPrevPos;
975
976 long nHRange = pHorScroll->GetRange().Max();
977 long nHLine = pHorScroll->GetLineSize();
978 long nHPage = pHorScroll->GetPageSize();
979 long nVRange = pVerScroll->GetRange().Max();
980 long nVLine = pVerScroll->GetLineSize();
981 long nVPage = pVerScroll->GetPageSize();
982
983 aCurPos.setX( pHorScroll->GetThumbPos() );
984 aCurPos.setY( pVerScroll->GetThumbPos() );
985 aPrevPos = aCurPos;
986
987 long nThumbPos = pVerScroll->GetThumbPos();
988 long nRangeMax = pVerScroll->GetRangeMax();
989
990 switch( nMode )
991 {
992 case SID_CURSORUP(5000 + 732):
993 if( nMaxVertPos<0 )
994 {
995 long nPage = pPreview->GetPageNo();
996
997 if( nPage>0 )
998 {
999 SfxViewFrame* pSfxViewFrame = GetViewFrame();
1000 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_PREVIOUS(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+1)
);
1001 Execute( aSfxRequest );
1002 }
1003 }
1004 else
1005 aCurPos.AdjustY( -nVLine );
1006 break;
1007 case SID_CURSORDOWN(5000 + 731):
1008 if( nMaxVertPos<0 )
1009 {
1010 long nPage = pPreview->GetPageNo();
1011 long nTotal = pPreview->GetTotalPages();
1012
1013 // before testing for last page, make sure all page counts are calculated
1014 if ( nPage+1 == nTotal && !pPreview->AllTested() )
1015 {
1016 pPreview->CalcAll();
1017 nTotal = pPreview->GetTotalPages();
1018 }
1019
1020 if( nPage<nTotal-1 )
1021 {
1022 SfxViewFrame* pSfxViewFrame = GetViewFrame();
1023 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_NEXT(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20))
);
1024 Execute( aSfxRequest );
1025 }
1026 }
1027 else
1028 aCurPos.AdjustY(nVLine );
1029 break;
1030 case SID_CURSORLEFT(5000 + 733):
1031 aCurPos.AdjustX( -nHLine );
1032 break;
1033 case SID_CURSORRIGHT(5000 + 734):
1034 aCurPos.AdjustX(nHLine );
1035 break;
1036 case SID_CURSORPAGEUP(5000 + 736):
1037 if( nThumbPos==0 || nMaxVertPos<0 )
1038 {
1039 long nPage = pPreview->GetPageNo();
1040
1041 if( nPage>0 )
1042 {
1043 SfxViewFrame* pSfxViewFrame = GetViewFrame();
1044 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_PREVIOUS(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+1)
);
1045 Execute( aSfxRequest );
1046 aCurPos.setY( nVRange );
1047 }
1048 }
1049 else
1050 aCurPos.AdjustY( -nVPage );
1051 break;
1052 case SID_CURSORPAGEDOWN(5000 + 735):
1053 if( (std::abs(nVPage+nThumbPos-nRangeMax)<10) || nMaxVertPos<0 )
1054 {
1055 long nPage = pPreview->GetPageNo();
1056 long nTotal = pPreview->GetTotalPages();
1057
1058 // before testing for last page, make sure all page counts are calculated
1059 if ( nPage+1 == nTotal && !pPreview->AllTested() )
1060 {
1061 pPreview->CalcAll();
1062 nTotal = pPreview->GetTotalPages();
1063 }
1064 if( nPage<nTotal-1 )
1065 {
1066 SfxViewFrame* pSfxViewFrame = GetViewFrame();
1067 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_NEXT(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20))
);
1068 Execute( aSfxRequest );
1069 aCurPos.setY( 0 );
1070 }
1071 }
1072 else
1073 aCurPos.AdjustY(nVPage );
1074 break;
1075 case SID_CURSORHOME(5000 + 745):
1076 if( nMaxVertPos<0 )
1077 {
1078 long nPage = pPreview->GetPageNo();
1079 long nTotal = pPreview->GetTotalPages();
1080 if( nTotal && nPage != 0 )
1081 {
1082 SfxViewFrame* pSfxViewFrame = GetViewFrame();
1083 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_FIRST(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+2)
);
1084 Execute( aSfxRequest );
1085 }
1086 }
1087 else
1088 {
1089 aCurPos.setY( 0 );
1090 aCurPos.setX( 0 );
1091 }
1092 break;
1093 case SID_CURSOREND(5000 + 746):
1094 if( nMaxVertPos<0 )
1095 {
1096 if( !pPreview->AllTested() )
1097 pPreview->CalcAll();
1098 long nPage = pPreview->GetPageNo();
1099 long nTotal = pPreview->GetTotalPages();
1100 if( nTotal && nPage+1 != nTotal )
1101 {
1102 SfxViewFrame* pSfxViewFrame = GetViewFrame();
1103 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_LAST(((((((((((((((((((((((((((((26000 + 200) + 20)) + 20)) + 20)
) + 25)) + 22)) + 20)) + 29)) + 20))+20))+1))+50))+20))+20))+
20)+3)
);
1104 Execute( aSfxRequest );
1105 }
1106 }
1107 else
1108 {
1109 aCurPos.setY( nVRange );
1110 aCurPos.setX( nHRange );
1111 }
1112 break;
1113 }
1114
1115 // nHRange-nHPage might be negative, that's why we check for < 0 afterwards
1116
1117 if( aCurPos.Y() > (nVRange-nVPage) )
1118 aCurPos.setY( nVRange-nVPage );
1119 if( aCurPos.Y() < 0 )
1120 aCurPos.setY( 0 );
1121 if( aCurPos.X() > (nHRange-nHPage) )
1122 aCurPos.setX( nHRange-nHPage );
1123 if( aCurPos.X() < 0 )
1124 aCurPos.setX( 0 );
1125
1126 if( nMaxVertPos>=0 )
1127 {
1128 if( aCurPos.Y() != aPrevPos.Y() )
1129 {
1130 pVerScroll->SetThumbPos( aCurPos.Y() );
1131 pPreview->SetYOffset( aCurPos.Y() );
1132 }
1133 }
1134
1135 if( aCurPos.X() != aPrevPos.X() )
1136 {
1137 pHorScroll->SetThumbPos( aCurPos.X() );
1138 pPreview->SetXOffset( aCurPos.X() );
1139 }
1140
1141}
1142
1143void ScPreviewShell::ExitPreview()
1144{
1145 GetViewFrame()->GetDispatcher()->Execute(SID_VIEWSHELL0(5000 + 630), SfxCallMode::ASYNCHRON);
1146}
1147
1148void ScPreviewShell::AddAccessibilityObject( SfxListener& rObject )
1149{
1150 if (!pAccessibilityBroadcaster)
1151 pAccessibilityBroadcaster.reset( new SfxBroadcaster );
1152
1153 rObject.StartListening( *pAccessibilityBroadcaster );
1154}
1155
1156void ScPreviewShell::RemoveAccessibilityObject( SfxListener& rObject )
1157{
1158 if (pAccessibilityBroadcaster)
1159 rObject.EndListening( *pAccessibilityBroadcaster );
1160 else
1161 {
1162 OSL_FAIL("no accessibility broadcaster?")do { if (true && (((sal_Bool)1))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/home/maarten/src/libreoffice/core/sc/source/ui/view/prevwsh.cxx"
":" "1162" ": "), "%s", "no accessibility broadcaster?"); } }
while (false)
;
1163 }
1164}
1165
1166void ScPreviewShell::BroadcastAccessibility( const SfxHint &rHint )
1167{
1168 if (pAccessibilityBroadcaster)
1169 pAccessibilityBroadcaster->Broadcast( rHint );
1170}
1171
1172bool ScPreviewShell::HasAccessibilityObjects() const
1173{
1174 return pAccessibilityBroadcaster && pAccessibilityBroadcaster->HasListeners();
1175}
1176
1177const ScPreviewLocationData& ScPreviewShell::GetLocationData()
1178{
1179 return pPreview->GetLocationData();
1180}
1181
1182ScDocument& ScPreviewShell::GetDocument()
1183{
1184 return pDocShell->GetDocument();
1185}
1186
1187/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

/home/maarten/src/libreoffice/core/include/vcl/vclptr.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_VCL_PTR_HXX
21#define INCLUDED_VCL_PTR_HXX
22
23#include <sal/config.h>
24
25#include <rtl/ref.hxx>
26
27#include <utility>
28#include <type_traits>
29
30#ifdef DBG_UTIL
31#ifndef _WIN32
32#include <vcl/vclmain.hxx>
33#endif
34#endif
35
36class VclReferenceBase;
37
38namespace vcl::detail {
39
40template<typename>
41constexpr bool isIncompleteOrDerivedFromVclReferenceBase(...) { return true; }
42
43template<typename T> constexpr bool isIncompleteOrDerivedFromVclReferenceBase(
44 int (*)[sizeof(T)])
45{ return std::is_base_of<VclReferenceBase, T>::value; }
46
47} // namespace vcl::detail
48
49/**
50 * A thin wrapper around rtl::Reference to implement the acquire and dispose semantics we want for references to vcl::Window subclasses.
51 *
52 * For more details on the design please see vcl/README.lifecycle
53 *
54 * @param reference_type must be a subclass of vcl::Window
55 */
56template <class reference_type>
57class VclPtr
58{
59 static_assert(
60 vcl::detail::isIncompleteOrDerivedFromVclReferenceBase<reference_type>(
61 nullptr),
62 "template argument type must be derived from VclReferenceBase");
63
64 ::rtl::Reference<reference_type> m_rInnerRef;
65
66public:
67 /** Constructor...
68 */
69 VclPtr()
70 : m_rInnerRef()
71 {}
72
73 /** Constructor...
74 */
75 VclPtr (reference_type * pBody)
76 : m_rInnerRef(pBody)
77 {}
78
79 /** Constructor... that doesn't take a ref.
80 */
81 VclPtr (reference_type * pBody, __sal_NoAcquire)
82 : m_rInnerRef(pBody, SAL_NO_ACQUIRE)
83 {}
84
85 /** Up-casting conversion constructor: Copies interface reference.
86
87 Does not work for up-casts to ambiguous bases. For the special case of
88 up-casting to Reference< XInterface >, see the corresponding conversion
89 operator.
90
91 @param rRef another reference
92 */
93 template< class derived_type >
94 VclPtr(
95 const VclPtr< derived_type > & rRef,
96 typename std::enable_if<
97 std::is_base_of<reference_type, derived_type>::value, int>::type
98 = 0 )
99 : m_rInnerRef( static_cast<reference_type*>(rRef) )
100 {
101 }
102
103#if defined(DBG_UTIL) && !defined(_WIN32)
104 virtual ~VclPtr()
105 {
106 assert(m_rInnerRef.get() == nullptr || vclmain::isAlive())(static_cast <bool> (m_rInnerRef.get() == nullptr || vclmain
::isAlive()) ? void (0) : __assert_fail ("m_rInnerRef.get() == nullptr || vclmain::isAlive()"
, "/home/maarten/src/libreoffice/core/include/vcl/vclptr.hxx"
, 106, __extension__ __PRETTY_FUNCTION__))
;
107 // We can be one of the intermediate counts, but if we are the last
108 // VclPtr keeping this object alive, then something forgot to call dispose().
109 assert((!m_rInnerRef.get() || m_rInnerRef->isDisposed() || m_rInnerRef->getRefCount() > 1)(static_cast <bool> ((!m_rInnerRef.get() || m_rInnerRef
->isDisposed() || m_rInnerRef->getRefCount() > 1) &&
"someone forgot to call dispose()") ? void (0) : __assert_fail
("(!m_rInnerRef.get() || m_rInnerRef->isDisposed() || m_rInnerRef->getRefCount() > 1) && \"someone forgot to call dispose()\""
, "/home/maarten/src/libreoffice/core/include/vcl/vclptr.hxx"
, 110, __extension__ __PRETTY_FUNCTION__))
110 && "someone forgot to call dispose()")(static_cast <bool> ((!m_rInnerRef.get() || m_rInnerRef
->isDisposed() || m_rInnerRef->getRefCount() > 1) &&
"someone forgot to call dispose()") ? void (0) : __assert_fail
("(!m_rInnerRef.get() || m_rInnerRef->isDisposed() || m_rInnerRef->getRefCount() > 1) && \"someone forgot to call dispose()\""
, "/home/maarten/src/libreoffice/core/include/vcl/vclptr.hxx"
, 110, __extension__ __PRETTY_FUNCTION__))
;
111 }
112 VclPtr(VclPtr const &) = default;
113 VclPtr(VclPtr &&) = default;
114 VclPtr & operator =(VclPtr const &) = default;
115 VclPtr & operator =(VclPtr &&) = default;
116#endif
117
118 /**
119 * A construction helper for VclPtr. Since VclPtr types are created
120 * with a reference-count of one - to help fit into the existing
121 * code-flow; this helps us to construct them easily.
122 *
123 * For more details on the design please see vcl/README.lifecycle
124 *
125 * @tparam reference_type must be a subclass of vcl::Window
126 */
127 template<typename... Arg> [[nodiscard]] static VclPtr< reference_type > Create(Arg &&... arg)
128 {
129 return VclPtr< reference_type >( new reference_type(std::forward<Arg>(arg)...), SAL_NO_ACQUIRE );
130 }
131
132 /** Probably most common used: handle->someBodyOp().
133 */
134 reference_type * operator->() const
135 {
136 return m_rInnerRef.get();
23
Calling 'Reference::get'
137 }
138
139 /** Get the body. Can be used instead of operator->().
140 I.e. handle->someBodyOp() and handle.get()->someBodyOp()
141 are the same.
142 */
143 reference_type * get() const
144 {
145 return m_rInnerRef.get();
146 }
147
148 void set(reference_type *pBody)
149 {
150 m_rInnerRef.set(pBody);
151 }
152
153 void reset(reference_type *pBody)
154 {
155 m_rInnerRef.set(pBody);
156 }
157
158 /** Up-casting copy assignment operator.
159
160 Does not work for up-casts to ambiguous bases.
161
162 @param rRef another reference
163 */
164 template<typename derived_type>
165 typename std::enable_if<
166 std::is_base_of<reference_type, derived_type>::value,
167 VclPtr &>::type
168 operator =(VclPtr<derived_type> const & rRef)
169 {
170 m_rInnerRef.set(rRef.get());
171 return *this;
172 }
173
174 VclPtr & operator =(reference_type * pBody)
175 {
176 m_rInnerRef.set(pBody);
177 return *this;
178 }
179
180 operator reference_type * () const
181 {
182 return m_rInnerRef.get();
183 }
184
185 explicit operator bool () const
186 {
187 return m_rInnerRef.get() != nullptr;
188 }
189
190 void clear()
191 {
192 m_rInnerRef.clear();
193 }
194
195 void reset()
196 {
197 m_rInnerRef.clear();
198 }
199
200 void disposeAndClear()
201 {
202 // hold it alive for the lifetime of this method
203 ::rtl::Reference<reference_type> aTmp(m_rInnerRef);
204 m_rInnerRef.clear(); // we should use some 'swap' method ideally ;-)
205 if (aTmp.get()) {
206 aTmp->disposeOnce();
207 }
208 }
209
210 /** Needed to place VclPtr's into STL collection.
211 */
212 bool operator< (const VclPtr<reference_type> & handle) const
213 {
214 return (m_rInnerRef < handle.m_rInnerRef);
215 }
216}; // class VclPtr
217
218template<typename T1, typename T2>
219inline bool operator ==(VclPtr<T1> const & p1, VclPtr<T2> const & p2) {
220 return p1.get() == p2.get();
221}
222
223template<typename T> inline bool operator ==(VclPtr<T> const & p1, T const * p2)
224{
225 return p1.get() == p2;
226}
227
228template<typename T> inline bool operator ==(VclPtr<T> const & p1, T * p2) {
229 return p1.get() == p2;
230}
231
232template<typename T> inline bool operator ==(T const * p1, VclPtr<T> const & p2)
233{
234 return p1 == p2.get();
235}
236
237template<typename T> inline bool operator ==(T * p1, VclPtr<T> const & p2) {
238 return p1 == p2.get();
239}
240
241template<typename T1, typename T2>
242inline bool operator !=(VclPtr<T1> const & p1, VclPtr<T2> const & p2) {
243 return !(p1 == p2);
244}
245
246template<typename T> inline bool operator !=(VclPtr<T> const & p1, T const * p2)
247{
248 return !(p1 == p2);
249}
250
251template<typename T> inline bool operator !=(VclPtr<T> const & p1, T * p2) {
252 return !(p1 == p2);
253}
254
255template<typename T> inline bool operator !=(T const * p1, VclPtr<T> const & p2)
256{
257 return !(p1 == p2);
258}
259
260template<typename T> inline bool operator !=(T * p1, VclPtr<T> const & p2) {
261 return !(p1 == p2);
262}
263
264/**
265 * A construction helper for a temporary VclPtr. Since VclPtr types
266 * are created with a reference-count of one - to help fit into
267 * the existing code-flow; this helps us to construct them easily.
268 * see also VclPtr::Create and ScopedVclPtr
269 *
270 * For more details on the design please see vcl/README.lifecycle
271 *
272 * @param reference_type must be a subclass of vcl::Window
273 */
274template <class reference_type>
275class SAL_WARN_UNUSED__attribute__((warn_unused)) VclPtrInstance final : public VclPtr<reference_type>
276{
277public:
278 template<typename... Arg> VclPtrInstance(Arg &&... arg)
279 : VclPtr<reference_type>( new reference_type(std::forward<Arg>(arg)...), SAL_NO_ACQUIRE )
280 {
281 }
282
283 /**
284 * Override and disallow this, to prevent people accidentally calling it and actually
285 * getting VclPtr::Create and getting a naked VclPtr<> instance
286 */
287 template<typename... Arg> static VclPtrInstance< reference_type > Create(Arg &&... ) = delete;
288};
289
290template <class reference_type>
291class ScopedVclPtr : public VclPtr<reference_type>
292{
293public:
294 /** Constructor...
295 */
296 ScopedVclPtr()
297 : VclPtr<reference_type>()
298 {}
299
300 /** Constructor
301 */
302 ScopedVclPtr (reference_type * pBody)
303 : VclPtr<reference_type>(pBody)
304 {}
305
306 /** Copy constructor...
307 */
308 ScopedVclPtr (const VclPtr<reference_type> & handle)
309 : VclPtr<reference_type>(handle)
5
Calling implicit copy constructor for 'VclPtr<AbstractSvxZoomDialog>'
6
Calling copy constructor for 'Reference<AbstractSvxZoomDialog>'
9
Returning from copy constructor for 'Reference<AbstractSvxZoomDialog>'
10
Returning from copy constructor for 'VclPtr<AbstractSvxZoomDialog>'
310 {}
311
312 /**
313 Assignment that releases the last reference.
314 */
315 void disposeAndReset(reference_type *pBody)
316 {
317 if (pBody != this->get()) {
318 VclPtr<reference_type>::disposeAndClear();
319 VclPtr<reference_type>::set(pBody);
320 }
321 }
322
323 /**
324 Assignment that releases the last reference.
325 */
326 ScopedVclPtr<reference_type>& operator = (reference_type * pBody)
327 {
328 disposeAndReset(pBody);
329 return *this;
330 }
331
332 /** Up-casting conversion constructor: Copies interface reference.
333
334 Does not work for up-casts to ambiguous bases. For the special case of
335 up-casting to Reference< XInterface >, see the corresponding conversion
336 operator.
337
338 @param rRef another reference
339 */
340 template< class derived_type >
341 ScopedVclPtr(
342 const VclPtr< derived_type > & rRef,
343 typename std::enable_if<
344 std::is_base_of<reference_type, derived_type>::value, int>::type
345 = 0 )
346 : VclPtr<reference_type>( rRef )
347 {
348 }
349
350 /** Up-casting assignment operator.
351
352 Does not work for up-casts to ambiguous bases.
353
354 @param rRef another VclPtr
355 */
356 template<typename derived_type>
357 typename std::enable_if<
358 std::is_base_of<reference_type, derived_type>::value,
359 ScopedVclPtr &>::type
360 operator =(VclPtr<derived_type> const & rRef)
361 {
362 disposeAndReset(rRef.get());
363 return *this;
364 }
365
366 /**
367 * Override and disallow this, to prevent people accidentally calling it and actually
368 * getting VclPtr::Create and getting a naked VclPtr<> instance
369 */
370 template<typename... Arg> static ScopedVclPtr< reference_type > Create(Arg &&... ) = delete;
371
372 ~ScopedVclPtr()
373 {
374 VclPtr<reference_type>::disposeAndClear();
375 assert(VclPtr<reference_type>::get() == nullptr)(static_cast <bool> (VclPtr<reference_type>::get(
) == nullptr) ? void (0) : __assert_fail ("VclPtr<reference_type>::get() == nullptr"
, "/home/maarten/src/libreoffice/core/include/vcl/vclptr.hxx"
, 375, __extension__ __PRETTY_FUNCTION__))
; // make sure there are no lingering references
376 }
377
378private:
379 // Most likely we don't want this default copy-constructor.
380 ScopedVclPtr (const ScopedVclPtr<reference_type> &) = delete;
381 // And certainly we don't want a default assignment operator.
382 ScopedVclPtr<reference_type>& operator = (const ScopedVclPtr<reference_type> &) = delete;
383 // And disallow reset as that doesn't call disposeAndClear on the original reference
384 void reset() = delete;
385 void reset(reference_type *pBody) = delete;
386
387protected:
388 ScopedVclPtr (reference_type * pBody, __sal_NoAcquire)
389 : VclPtr<reference_type>(pBody, SAL_NO_ACQUIRE)
390 {}
391};
392
393/**
394 * A construction helper for ScopedVclPtr. Since VclPtr types are created
395 * with a reference-count of one - to help fit into the existing
396 * code-flow; this helps us to construct them easily.
397 *
398 * For more details on the design please see vcl/README.lifecycle
399 *
400 * @param reference_type must be a subclass of vcl::Window
401 */
402#if defined _MSC_VER
403#pragma warning(push)
404#pragma warning(disable: 4521) // " multiple copy constructors specified"
405#endif
406template <class reference_type>
407class SAL_WARN_UNUSED__attribute__((warn_unused)) ScopedVclPtrInstance final : public ScopedVclPtr<reference_type>
408{
409public:
410 template<typename... Arg> ScopedVclPtrInstance(Arg &&... arg)
411 : ScopedVclPtr<reference_type>( new reference_type(std::forward<Arg>(arg)...), SAL_NO_ACQUIRE )
412 {
413 }
414
415 /**
416 * Override and disallow this, to prevent people accidentally calling it and actually
417 * getting VclPtr::Create and getting a naked VclPtr<> instance
418 */
419 template<typename... Arg> static ScopedVclPtrInstance< reference_type > Create(Arg &&...) = delete;
420
421private:
422 // Prevent the above perfect forwarding ctor from hijacking (accidental)
423 // attempts at ScopedVclPtrInstance copy construction (where the hijacking
424 // would typically lead to somewhat obscure error messages); both non-const
425 // and const variants are needed here, as the ScopedVclPtr base class has a
426 // const--variant copy ctor, so the implicitly declared copy ctor for
427 // ScopedVclPtrInstance would also be the const variant, so non-const copy
428 // construction attempts would be hijacked by the perfect forwarding ctor;
429 // but if we only declared a non-const variant here, the const variant would
430 // no longer be implicitly declared (as there would already be an explicitly
431 // declared copy ctor), so const copy construction attempts would then be
432 // hijacked by the perfect forwarding ctor:
433 ScopedVclPtrInstance(ScopedVclPtrInstance &) = delete;
434 ScopedVclPtrInstance(ScopedVclPtrInstance const &) = delete;
435};
436#if defined _MSC_VER
437#pragma warning(pop)
438#endif
439
440#endif // INCLUDED_VCL_PTR_HXX
441
442/* 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)
7
Assuming field 'm_pBody' is non-null
8
Taking true branch
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
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;
24
Use of memory after it is freed
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