diff options
Diffstat (limited to 'sw/source/core/unocore/unoevent.cxx')
-rw-r--r-- | sw/source/core/unocore/unoevent.cxx | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/sw/source/core/unocore/unoevent.cxx b/sw/source/core/unocore/unoevent.cxx new file mode 100644 index 000000000000..c721f6f0cad5 --- /dev/null +++ b/sw/source/core/unocore/unoevent.cxx @@ -0,0 +1,336 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: unoevent.cxx,v $ + * $Revision: 1.19 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + +// HINTIDs must be on top; it is required for the macitem.hxx header +#include "hintids.hxx" +#include "unoevent.hxx" +#include "unoframe.hxx" +#include "unostyle.hxx" +#include "swevent.hxx" +#include "docstyle.hxx" +#ifndef _SVX_SVXIDS_HRC +#include <svx/svxids.hrc> +#endif +#include "fmtinfmt.hxx" +#include <svl/macitem.hxx> +#include <rtl/ustrbuf.hxx> +#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP +#include <com/sun/star/beans/PropertyValue.hpp> +#endif + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +using ::com::sun::star::container::NoSuchElementException; +using ::com::sun::star::container::XNameReplace; +using ::com::sun::star::lang::IllegalArgumentException; +using ::com::sun::star::lang::WrappedTargetException; +using ::com::sun::star::lang::XServiceInfo; +using ::com::sun::star::beans::PropertyValue; +using ::cppu::WeakImplHelper2; +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + + +const sal_Char sAPI_ServiceName[] = "com.sun.star.container.XNameReplace"; +const sal_Char sAPI_SwFrameEventDescriptor[] = "SwFrameEventDescriptor"; +const sal_Char sAPI_SwFrameStyleEventDescriptor[] = + "SwFrameStyleEventDescriptor"; +const sal_Char sAPI_SwDetachedEventDescriptor[] = "SwDetachedEventDescriptor"; +const sal_Char sAPI_SwHyperlinkEventDescriptor[] = + "SwHyperlinkEventDescriptor"; +const sal_Char sAPI_SwAutoTextEventDescriptor[] = + "SwAutoTextEventDescriptor"; + +// +// tables of allowed events for specific objects +// + +const struct SvEventDescription aGraphicEvents[] = +{ + { SW_EVENT_OBJECT_SELECT, "OnSelect" }, + { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" }, + { SFX_EVENT_MOUSECLICK_OBJECT, "OnClick" }, + { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" }, + { SVX_EVENT_IMAGE_LOAD, "OnLoadDone" }, + { SVX_EVENT_IMAGE_ABORT, "OnLoadCancel" }, + { SVX_EVENT_IMAGE_ERROR, "OnLoadError" }, + { 0, NULL } +}; + +const struct SvEventDescription aFrameEvents[] = +{ + { SW_EVENT_OBJECT_SELECT, "OnSelect" }, + { SW_EVENT_FRM_KEYINPUT_ALPHA, "OnAlphaCharInput" }, + { SW_EVENT_FRM_KEYINPUT_NOALPHA, "OnNonAlphaCharInput" }, + { SW_EVENT_FRM_RESIZE, "OnResize" }, + { SW_EVENT_FRM_MOVE, "OnMove" }, + { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" }, + { SFX_EVENT_MOUSECLICK_OBJECT, "OnClick" }, + { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" }, + { 0, NULL } +}; + +const struct SvEventDescription aOLEEvents[] = +{ + { SW_EVENT_OBJECT_SELECT, "OnSelect" }, + { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" }, + { SFX_EVENT_MOUSECLICK_OBJECT, "OnClick" }, + { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" }, + { 0, NULL } +}; + +const struct SvEventDescription aHyperlinkEvents[] = +{ + { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" }, + { SFX_EVENT_MOUSECLICK_OBJECT, "OnClick" }, + { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" }, + { 0, NULL } +}; + +const struct SvEventDescription aAutotextEvents[] = +{ + { SW_EVENT_START_INS_GLOSSARY, "OnInsertStart" }, + { SW_EVENT_END_INS_GLOSSARY, "OnInsertDone" }, + { 0, NULL } +}; + +const struct SvEventDescription aFrameStyleEvents[] = +{ + { SW_EVENT_OBJECT_SELECT, "OnSelect" }, + { SW_EVENT_FRM_KEYINPUT_ALPHA, "OnAlphaCharInput" }, + { SW_EVENT_FRM_KEYINPUT_NOALPHA, "OnNonAlphaCharInput" }, + { SW_EVENT_FRM_RESIZE, "OnResize" }, + { SW_EVENT_FRM_MOVE, "OnMove" }, + { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" }, + { SFX_EVENT_MOUSECLICK_OBJECT, "OnClick" }, + { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" }, + { SVX_EVENT_IMAGE_LOAD, "OnLoadDone" }, + { SVX_EVENT_IMAGE_ABORT, "OnLoadCancel" }, + { SVX_EVENT_IMAGE_ERROR, "OnLoadError" }, + { 0, NULL } +}; + +// +// SwHyperlinkEventDescriptor +// + +SwHyperlinkEventDescriptor::SwHyperlinkEventDescriptor() : + SvDetachedEventDescriptor(aHyperlinkEvents), + sImplName(RTL_CONSTASCII_USTRINGPARAM(sAPI_SwHyperlinkEventDescriptor)) +{ +} + +SwHyperlinkEventDescriptor::~SwHyperlinkEventDescriptor() +{ +} + +OUString SwHyperlinkEventDescriptor::getImplementationName(void) + throw( RuntimeException ) +{ + return sImplName; +} + +void SwHyperlinkEventDescriptor::copyMacrosFromINetFmt( + const SwFmtINetFmt& aFmt) +{ + for(sal_Int16 i = 0; mpSupportedMacroItems[i].mnEvent != 0; i++) + { + USHORT nEvent = mpSupportedMacroItems[i].mnEvent; + const SvxMacro* aMacro = aFmt.GetMacro(nEvent); + if (NULL != aMacro) + replaceByName(nEvent, *aMacro); + } +} + +void SwHyperlinkEventDescriptor::copyMacrosIntoINetFmt( + SwFmtINetFmt& aFmt) +{ + for(sal_Int16 i = 0; mpSupportedMacroItems[i].mnEvent != 0; i++) + { + USHORT nEvent = mpSupportedMacroItems[i].mnEvent; + if (hasByName(nEvent)) + { + SvxMacro aMacro(sEmpty, sEmpty); + getByName(aMacro, nEvent); + aFmt.SetMacro(nEvent, aMacro); + } + } +} + + +void SwHyperlinkEventDescriptor::copyMacrosFromNameReplace( + uno::Reference< + container::XNameReplace> & xReplace) +{ + // iterate over all names (all names that *we* support) + Sequence<OUString> aNames = getElementNames(); + sal_Int32 nCount = aNames.getLength(); + for(sal_Int32 i = 0; i < nCount; i++) + { + // copy element for that name + const OUString& rName = aNames[i]; + if (xReplace->hasByName(rName)) + { + SvBaseEventDescriptor::replaceByName(rName, + xReplace->getByName(rName)); + } + } +} + + +// +// SwFrameEventDescriptor +// + +// use double cast in superclass constructor to avoid ambigous cast +SwFrameEventDescriptor::SwFrameEventDescriptor( + SwXTextFrame& rFrameRef ) : + SvEventDescriptor((text::XTextFrame&)rFrameRef, aFrameEvents), + sSwFrameEventDescriptor(RTL_CONSTASCII_USTRINGPARAM( + sAPI_SwFrameEventDescriptor)), + rFrame(rFrameRef) +{ +} + +SwFrameEventDescriptor::SwFrameEventDescriptor( + SwXTextGraphicObject& rGraphicRef ) : + SvEventDescriptor((text::XTextContent&)rGraphicRef, aGraphicEvents), + rFrame((SwXFrame&)rGraphicRef) +{ +} + +SwFrameEventDescriptor::SwFrameEventDescriptor( + SwXTextEmbeddedObject& rObjectRef ) : + SvEventDescriptor((text::XTextContent&)rObjectRef, aOLEEvents), + rFrame((SwXFrame&)rObjectRef) +{ +} + +SwFrameEventDescriptor::~SwFrameEventDescriptor() +{ +} + +void SwFrameEventDescriptor::setMacroItem(const SvxMacroItem& rItem) +{ + rFrame.GetFrmFmt()->SetFmtAttr(rItem); +} + +const SvxMacroItem& SwFrameEventDescriptor::getMacroItem() +{ + return (const SvxMacroItem&)rFrame.GetFrmFmt()->GetFmtAttr(RES_FRMMACRO); +} + +sal_uInt16 SwFrameEventDescriptor::getMacroItemWhich() const +{ + return RES_FRMMACRO; +} + +OUString SwFrameEventDescriptor::getImplementationName() + throw( RuntimeException ) +{ + return sSwFrameEventDescriptor; +} + + +// +// SwFrameStyleEventDescriptor +// + +SwFrameStyleEventDescriptor::SwFrameStyleEventDescriptor( + SwXFrameStyle& rStyleRef ) : + SvEventDescriptor((document::XEventsSupplier&)rStyleRef, + aFrameStyleEvents), + sSwFrameStyleEventDescriptor(RTL_CONSTASCII_USTRINGPARAM( + sAPI_SwFrameStyleEventDescriptor)), + rStyle(rStyleRef) +{ +} + +SwFrameStyleEventDescriptor::~SwFrameStyleEventDescriptor() +{ +} + +void SwFrameStyleEventDescriptor::setMacroItem(const SvxMacroItem& rItem) +{ + // As I was told, for some entirely unobvious reason getting an + // item from a style has to look as follows: + SfxStyleSheetBasePool* pBasePool = rStyle.GetBasePool(); + if (pBasePool) + { + SfxStyleSheetBase* pBase = pBasePool->Find(rStyle.GetStyleName()); + if (pBase) + { + rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) ); + SfxItemSet& rStyleSet = xStyle->GetItemSet(); + SfxItemSet aSet(*rStyleSet.GetPool(), RES_FRMMACRO, RES_FRMMACRO); + aSet.Put(rItem); + xStyle->SetItemSet(aSet); + } + } +} + +static const SvxMacroItem aEmptyMacroItem(RES_FRMMACRO); + +const SvxMacroItem& SwFrameStyleEventDescriptor::getMacroItem() +{ + // As I was told, for some entirely unobvious reason getting an + // item from a style has to look as follows: + SfxStyleSheetBasePool* pBasePool = rStyle.GetBasePool(); + if (pBasePool) + { + SfxStyleSheetBase* pBase = pBasePool->Find(rStyle.GetStyleName()); + if (pBase) + { + rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase) ); + return (const SvxMacroItem&)xStyle->GetItemSet().Get(RES_FRMMACRO); + } + else + return aEmptyMacroItem; + } + else + return aEmptyMacroItem; +} + +OUString SwFrameStyleEventDescriptor::getImplementationName() + throw( RuntimeException ) +{ + return sSwFrameStyleEventDescriptor; +} + +sal_uInt16 SwFrameStyleEventDescriptor::getMacroItemWhich() const +{ + return RES_FRMMACRO; +} + |