diff options
Diffstat (limited to 'sw/source/core/fields/macrofld.cxx')
-rw-r--r-- | sw/source/core/fields/macrofld.cxx | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/sw/source/core/fields/macrofld.cxx b/sw/source/core/fields/macrofld.cxx new file mode 100644 index 000000000000..70a0d2dcf689 --- /dev/null +++ b/sw/source/core/fields/macrofld.cxx @@ -0,0 +1,266 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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" + + +#include <hintids.hxx> +#include <doc.hxx> +#include <docufld.hxx> +#ifndef _UNOFLDMID_H +#include <unofldmid.h> +#endif +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/uri/XUriReferenceFactory.hpp> +#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> +#include <comphelper/processfactory.hxx> + +using namespace ::com::sun::star; +using ::rtl::OUString; +/*-------------------------------------------------------------------- + Beschreibung: MacroFeldtypen + --------------------------------------------------------------------*/ + +SwMacroFieldType::SwMacroFieldType(SwDoc* pDocument) + : SwFieldType( RES_MACROFLD ), + pDoc(pDocument) +{ +} + +SwFieldType* SwMacroFieldType::Copy() const +{ + SwMacroFieldType* pType = new SwMacroFieldType(pDoc); + return pType; +} + +/*-------------------------------------------------------------------- + Beschreibung: Das Macrofeld selbst + --------------------------------------------------------------------*/ + +SwMacroField::SwMacroField(SwMacroFieldType* pInitType, + const String& rLibAndName, const String& rTxt) : + SwField(pInitType), aMacro(rLibAndName), aText(rTxt), bIsScriptURL(FALSE) +{ + bIsScriptURL = isScriptURL(aMacro); +} + +String SwMacroField::Expand() const +{ // Button malen anstatt von + return aText ; +} + +SwField* SwMacroField::Copy() const +{ + return new SwMacroField((SwMacroFieldType*)GetTyp(), aMacro, aText); +} + +String SwMacroField::GetCntnt(BOOL bName) const +{ + if(bName) + { + String aStr(GetTyp()->GetName()); + aStr += ' '; + aStr += aMacro; + return aStr; + } + return Expand(); +} + +String SwMacroField::GetLibName() const +{ + // if it is a Scripting Framework macro return an empty string + if (bIsScriptURL) + { + return String(); + } + + if (aMacro.Len()) + { + USHORT nPos = aMacro.Len(); + + for (USHORT i = 0; i < 3 && nPos > 0; i++) + while (aMacro.GetChar(--nPos) != '.' && nPos > 0) ; + + return aMacro.Copy(0, nPos ); + } + + DBG_ASSERT(0, "Kein Macroname vorhanden"); + return aEmptyStr; +} + +String SwMacroField::GetMacroName() const +{ + if (aMacro.Len()) + { + if (bIsScriptURL) + { + return aMacro.Copy( 0 ); + } + else + { + USHORT nPos = aMacro.Len(); + + for (USHORT i = 0; i < 3 && nPos > 0; i++) + while (aMacro.GetChar(--nPos) != '.' && nPos > 0) ; + + return aMacro.Copy( ++nPos ); + } + } + + DBG_ASSERT(0, "Kein Macroname vorhanden"); + return aEmptyStr; +} + +SvxMacro SwMacroField::GetSvxMacro() const +{ + if (bIsScriptURL) + { + return SvxMacro(aMacro, String(), EXTENDED_STYPE); + } + else + { + return SvxMacro(GetMacroName(), GetLibName(), STARBASIC); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: LibName und MacroName + --------------------------------------------------------------------*/ + +void SwMacroField::SetPar1(const String& rStr) +{ + aMacro = rStr; + bIsScriptURL = isScriptURL(aMacro); +} + +const String& SwMacroField::GetPar1() const +{ + return aMacro; +} + +/*-------------------------------------------------------------------- + Beschreibung: Macrotext + --------------------------------------------------------------------*/ + +void SwMacroField::SetPar2(const String& rStr) +{ + aText = rStr; +} + +String SwMacroField::GetPar2() const +{ + return aText; +} + +/*-----------------05.03.98 13:38------------------- + +--------------------------------------------------*/ +BOOL SwMacroField::QueryValue( uno::Any& rAny, USHORT nWhichId ) const +{ + switch( nWhichId ) + { + case FIELD_PROP_PAR1: + rAny <<= OUString(GetMacroName()); + break; + case FIELD_PROP_PAR2: + rAny <<= OUString(aText); + break; + case FIELD_PROP_PAR3: + rAny <<= OUString(GetLibName()); + break; + case FIELD_PROP_PAR4: + rAny <<= bIsScriptURL ? OUString(GetMacroName()): OUString(); + break; + default: + DBG_ERROR("illegal property"); + } + return TRUE; +} +/*-----------------05.03.98 13:38------------------- + +--------------------------------------------------*/ +BOOL SwMacroField::PutValue( const uno::Any& rAny, USHORT nWhichId ) +{ + String sTmp; + switch( nWhichId ) + { + case FIELD_PROP_PAR1: + CreateMacroString( aMacro, ::GetString(rAny, sTmp), GetLibName()); + break; + case FIELD_PROP_PAR2: + ::GetString( rAny, aText ); + break; + case FIELD_PROP_PAR3: + CreateMacroString(aMacro, GetMacroName(), ::GetString(rAny, sTmp) ); + break; + case FIELD_PROP_PAR4: + ::GetString(rAny, aMacro); + bIsScriptURL = isScriptURL(aMacro); + break; + default: + DBG_ERROR("illegal property"); + } + + return TRUE; +} + +// create an internally used macro name from the library and macro name parts +void SwMacroField::CreateMacroString( + String& rMacro, + const String& rMacroName, + const String& rLibraryName ) +{ + // concatenate library and name; use dot only if both strings have content + rMacro = rLibraryName; + if ( rLibraryName.Len() > 0 && rMacroName.Len() > 0 ) + rMacro += '.'; + rMacro += rMacroName; +} + +BOOL SwMacroField::isScriptURL( const String& str ) +{ + uno::Reference< lang::XMultiServiceFactory > xSMgr = + ::comphelper::getProcessServiceFactory(); + + uno::Reference< uri::XUriReferenceFactory > + xFactory( xSMgr->createInstance( + OUString::createFromAscii( + "com.sun.star.uri.UriReferenceFactory" ) ), uno::UNO_QUERY ); + + if ( xFactory.is() ) + { + uno::Reference< uri::XVndSunStarScriptUrl > + xUrl( xFactory->parse( str ), uno::UNO_QUERY ); + + if ( xUrl.is() ) + { + return TRUE; + } + } + return FALSE; +} |