office-gobmx/include/svx/sdrpagewindow.hxx
Noel Grandin 445cf49966 tdf#132940 Crash in mergedlo!vcl::Region::operator=
We had a SdrPageWindow accessing a SdPaintWindow that had already been
freed.
Turns that SdrPageWindow can be "patched" more than once given enough
stuff going on in writer, so make the call sites restore the previous
state as the stack unwinds.

Change-Id: Ia1ef5c9b2f818b7873e8e739c9cdf257554e403a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101044
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2020-08-20 16:37:51 +02:00

97 lines
3.5 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_SVX_SDRPAGEWINDOW_HXX
#define INCLUDED_SVX_SDRPAGEWINDOW_HXX
#include <basegfx/range/b2irectangle.hxx>
#include <svx/svdtypes.hxx>
#include <svx/svxdllapi.h>
#include <memory>
namespace com::sun::star::awt { class XControlContainer; }
namespace com::sun::star::uno { template <class interface_type> class Reference; }
namespace rtl { template <class reference_type> class Reference; }
namespace sdr::overlay { class OverlayManager; }
namespace vcl { class Region; }
namespace sdr::contact
{
class ObjectContact;
class ViewObjectContactRedirector;
}
namespace basegfx { class B2DRange; }
class SdrPaintWindow;
class SdrPageView;
class SVXCORE_DLLPUBLIC SdrPageWindow
{
struct Impl;
std::unique_ptr<Impl> mpImpl;
SdrPageWindow( const SdrPageWindow& ) = delete;
SdrPageWindow& operator= ( const SdrPageWindow& ) = delete;
public:
SdrPageWindow(SdrPageView& rNewPageView, SdrPaintWindow& rPaintWindow);
~SdrPageWindow();
// data read accesses
SdrPageView& GetPageView() const;
SdrPaintWindow& GetPaintWindow() const;
const SdrPaintWindow* GetOriginalPaintWindow() const;
css::uno::Reference<css::awt::XControlContainer> const & GetControlContainer( bool _bCreateIfNecessary = true ) const;
// OVERLAYMANAGER
rtl::Reference< sdr::overlay::OverlayManager > const & GetOverlayManager() const;
// #i72752# allow patcing SdrPaintWindow from SdrPageView::DrawLayer if needed
[[nodiscard]] SdrPaintWindow* patchPaintWindow(SdrPaintWindow& rPaintWindow);
void unpatchPaintWindow(SdrPaintWindow* pPreviousPaintWindow);
// the repaint method. For migration from pPaintProc, use one more parameter
void PrePaint();
void PrepareRedraw(const vcl::Region& rReg);
void RedrawAll( sdr::contact::ViewObjectContactRedirector* pRedirector );
void RedrawLayer( const SdrLayerID* pId, sdr::contact::ViewObjectContactRedirector* pRedirector, basegfx::B2IRectangle const*);
// Invalidate call, used from ObjectContact(OfPageView) in InvalidatePartOfView(...)
void InvalidatePageWindow(const basegfx::B2DRange& rRange);
// #110094# ObjectContact section
const sdr::contact::ObjectContact& GetObjectContact() const;
sdr::contact::ObjectContact& GetObjectContact();
/// determines whether there already exists an ObjectContact
bool HasObjectContact() const;
// #i26631#
void ResetObjectContact();
/** sets all elements in the view which support a design and an alive mode into the given mode
*/
void SetDesignMode( bool _bDesignMode ) const;
};
#endif // INCLUDED_SVX_SDRPAGEWINDOW_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */