1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
/* -*- 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_SOURCE_INC_FMUNDO_HXX
#define INCLUDED_SVX_SOURCE_INC_FMUNDO_HXX
#include <svx/svdundo.hxx>
#include <svx/svdouno.hxx>
#include "fmscriptingenv.hxx"
#include <com/sun/star/util/XModifyListener.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XPropertyChangeListener.hpp>
#include <com/sun/star/beans/PropertyChangeEvent.hpp>
#include <com/sun/star/script/ScriptEvent.hpp>
#include <com/sun/star/script/ScriptEventDescriptor.hpp>
#include <com/sun/star/container/XIndexContainer.hpp>
#include <com/sun/star/container/XContainerListener.hpp>
#include <com/sun/star/container/ContainerEvent.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <cppuhelper/implbase.hxx>
#include <svl/lstner.hxx>
class FmFormModel;
class FmFormObj;
class SdrObject;
class FmUndoPropertyAction: public SdrUndoAction
{
css::uno::Reference< css::beans::XPropertySet> xObj;
OUString aPropertyName;
css::uno::Any aNewValue;
css::uno::Any aOldValue;
public:
FmUndoPropertyAction(FmFormModel& rMod, const css::beans::PropertyChangeEvent& evt);
virtual void Undo() override;
virtual void Redo() override;
virtual OUString GetComment() const override;
};
class FmUndoContainerAction final : public SdrUndoAction
{
public:
enum Action
{
Inserted = 1,
Removed = 2
};
FmUndoContainerAction(FmFormModel& rMod,
Action _eAction,
const css::uno::Reference< css::container::XIndexContainer >& xCont,
const css::uno::Reference< css::uno::XInterface >& xElem,
sal_Int32 nIdx);
virtual ~FmUndoContainerAction() override;
virtual void Undo() override;
virtual void Redo() override;
static void DisposeElement( const css::uno::Reference< css::uno::XInterface >& xElem );
private:
void implReInsert( );
void implReRemove( );
css::uno::Reference< css::container::XIndexContainer >
m_xContainer; // container which the action applies to
css::uno::Reference< css::uno::XInterface >
m_xElement; // object not owned by the action
css::uno::Reference< css::uno::XInterface >
m_xOwnElement; // object owned by the action
sal_Int32 m_nIndex; // index of the object within it's container
css::uno::Sequence< css::script::ScriptEventDescriptor >
m_aEvents; // events of the object
Action m_eAction;
};
class FmUndoModelReplaceAction : public SdrUndoAction
{
css::uno::Reference< css::awt::XControlModel> m_xReplaced;
SdrUnoObj* m_pObject;
public:
FmUndoModelReplaceAction(FmFormModel& rMod, SdrUnoObj* pObject, const css::uno::Reference< css::awt::XControlModel>& xReplaced);
virtual ~FmUndoModelReplaceAction() override;
virtual void Undo() override;
virtual void Redo() override { Undo(); }
virtual OUString GetComment() const override;
static void DisposeElement( const css::uno::Reference< css::awt::XControlModel>& xReplaced );
};
class FmXUndoEnvironment final
: public ::cppu::WeakImplHelper< css::beans::XPropertyChangeListener
, css::container::XContainerListener
, css::util::XModifyListener
>
, public SfxListener
{
public:
FmXUndoEnvironment(FmFormModel& _rModel);
virtual ~FmXUndoEnvironment() override;
// UNO binding
// SMART_UNO_DECLARATION(FmXUndoEnvironment, ::cppu::OWeakObject);
// virtual sal_Bool queryInterface(UsrUik, css::uno::Reference< css::uno::XInterface>&);
// virtual css::uno::Sequence< css::uno::Reference< css::reflection::XIdlClass>> getIdlClasses();
void Lock() { osl_atomic_increment( &m_Locks ); }
void UnLock() { osl_atomic_decrement( &m_Locks ); }
bool IsLocked() const { return m_Locks != 0; }
// access control
struct Accessor { friend class FmFormModel; private: Accessor() { } };
// addition and removal of form collections
void AddForms( const css::uno::Reference< css::container::XNameContainer>& rForms );
void RemoveForms( const css::uno::Reference< css::container::XNameContainer>& rForms );
// readonly-ness
void SetReadOnly( bool bRead, const Accessor& ) { bReadOnly = bRead; }
bool IsReadOnly() const {return bReadOnly;}
// Methods for assigning controls to forms,
// used by the page and the undo environment
void Inserted(SdrObject* pObj);
void Removed(SdrObject* pObj);
static void Inserted(FmFormObj* pObj);
static void Removed(FmFormObj* pObj);
private:
// XEventListener
virtual void SAL_CALL disposing(const css::lang::EventObject& Source) override;
// XPropertyChangeListener
virtual void SAL_CALL propertyChange(const css::beans::PropertyChangeEvent& evt) override;
// XContainerListener
virtual void SAL_CALL elementInserted(const css::container::ContainerEvent& rEvent) override;
virtual void SAL_CALL elementReplaced(const css::container::ContainerEvent& rEvent) override;
virtual void SAL_CALL elementRemoved(const css::container::ContainerEvent& rEvent) override;
// XModifyListener
virtual void SAL_CALL modified( const css::lang::EventObject& aEvent ) override;
void ModeChanged();
void dispose();
virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
void AddElement(const css::uno::Reference< css::uno::XInterface>& Element);
void RemoveElement(const css::uno::Reference< css::uno::XInterface>& Element);
void TogglePropertyListening(const css::uno::Reference< css::uno::XInterface>& Element);
void implSetModified();
void switchListening( const css::uno::Reference< css::container::XIndexContainer >& _rxContainer, bool _bStartListening );
void switchListening( const css::uno::Reference< css::uno::XInterface >& _rxObject, bool _bStartListening );
FmFormModel& rModel;
void* m_pPropertySetCache;
::svxform::PFormScriptingEnvironment m_pScriptingEnv;
oslInterlockedCount m_Locks;
::osl::Mutex m_aMutex;
bool bReadOnly;
bool m_bDisposed;
css::uno::Reference< css::script::XScriptListener > m_vbaListener;
};
#endif // INCLUDED_SVX_SOURCE_INC_FMUNDO_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|