summaryrefslogtreecommitdiff
path: root/svx/source/items/hlnkitem.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/items/hlnkitem.cxx')
-rw-r--r--svx/source/items/hlnkitem.cxx430
1 files changed, 430 insertions, 0 deletions
diff --git a/svx/source/items/hlnkitem.cxx b/svx/source/items/hlnkitem.cxx
new file mode 100644
index 000000000000..a67a87021d31
--- /dev/null
+++ b/svx/source/items/hlnkitem.cxx
@@ -0,0 +1,430 @@
+/*************************************************************************
+ *
+ * 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_svx.hxx"
+
+// include ---------------------------------------------------------------
+#define _SVX_HLNKITEM_CXX
+
+#ifndef _SVX_SVXIDS_HRC
+#include <svx/svxids.hrc>
+#endif
+#include <tools/stream.hxx>
+
+#ifndef _MEMBERID_HRC
+#include <svx/memberid.hrc>
+#endif
+
+#ifndef __SBX_SBXVARIABLE_HXX
+#include <basic/sbxvar.hxx>
+#endif
+
+#include "hlnkitem.hxx"
+
+// -----------------------------------------------------------------------
+
+TYPEINIT1_FACTORY(SvxHyperlinkItem, SfxPoolItem, new SvxHyperlinkItem(0));
+
+// class SvxHyperlinkItem ------------------------------------------------
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+#define HYPERLINKFF_MARKER 0x599401FE
+
+SvStream& SvxHyperlinkItem::Store( SvStream& rStrm, sal_uInt16 /*nItemVersion*/ ) const
+{
+ // store 'simple' data
+ // UNICODE: rStrm << sName;
+ rStrm.WriteByteString(sName);
+
+ // UNICODE: rStrm << sURL;
+ rStrm.WriteByteString(sURL);
+
+ // UNICODE: rStrm << sTarget;
+ rStrm.WriteByteString(sTarget);
+
+ rStrm << (sal_uInt32) eType;
+
+ // marker for versioninfo
+ rStrm << (sal_uInt32) HYPERLINKFF_MARKER;
+
+ // new data
+ // UNICODE: rStrm << sIntName;
+ rStrm.WriteByteString(sIntName);
+
+ // macro-events
+ rStrm << nMacroEvents;
+
+ // store macros
+ sal_uInt16 nCnt = pMacroTable ? (sal_uInt16)pMacroTable->Count() : 0;
+ sal_uInt16 nMax = nCnt;
+ if( nCnt )
+ {
+ for( SvxMacro* pMac = pMacroTable->First(); pMac; pMac = pMacroTable->Next() )
+ if( STARBASIC != pMac->GetScriptType() )
+ --nCnt;
+ }
+
+ rStrm << nCnt;
+
+ if( nCnt )
+ {
+ // 1. StarBasic-Macros
+ for( SvxMacro* pMac = pMacroTable->First(); pMac; pMac = pMacroTable->Next() )
+ {
+ if( STARBASIC == pMac->GetScriptType() )
+ {
+ rStrm << (sal_uInt16)pMacroTable->GetCurKey();
+
+ // UNICODE: rStrm << pMac->GetLibName();
+ rStrm.WriteByteString(pMac->GetLibName());
+
+ // UNICODE: rStrm << pMac->GetMacName();
+ rStrm.WriteByteString(pMac->GetMacName());
+ }
+ }
+ }
+
+ nCnt = nMax - nCnt;
+ rStrm << nCnt;
+ if( nCnt )
+ {
+ // 2. ::com::sun::star::script::JavaScript-Macros
+ for( SvxMacro* pMac = pMacroTable->First(); pMac; pMac = pMacroTable->Next() )
+ {
+ if( STARBASIC != pMac->GetScriptType() )
+ {
+ rStrm << (sal_uInt16)pMacroTable->GetCurKey();
+
+ // UNICODE: rStrm << pMac->GetLibName();
+ rStrm.WriteByteString(pMac->GetLibName());
+
+ // UNICODE: rStrm << pMac->GetMacName();
+ rStrm.WriteByteString(pMac->GetMacName());
+
+ rStrm << (sal_uInt16)pMac->GetScriptType();
+ }
+ }
+ }
+
+ return rStrm;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SfxPoolItem* SvxHyperlinkItem::Create( SvStream &rStrm, sal_uInt16 /*nItemVersion*/ ) const
+{
+ SvxHyperlinkItem* pNew = new SvxHyperlinkItem( Which() );
+ sal_uInt32 nType;
+
+ // simple data-types
+ // UNICODE: rStrm >> pNew->sName;
+ rStrm.ReadByteString(pNew->sName);
+
+ // UNICODE: rStrm >> pNew->sURL;
+ rStrm.ReadByteString(pNew->sURL);
+
+ // UNICODE: rStrm >> pNew->sTarget;
+ rStrm.ReadByteString(pNew->sTarget);
+
+ rStrm >> nType;
+ pNew->eType = (SvxLinkInsertMode) nType;
+
+ sal_uInt32 nPos = rStrm.Tell();
+ sal_uInt32 nMarker;
+ rStrm >> nMarker;
+ if ( nMarker == HYPERLINKFF_MARKER )
+ {
+ // new data
+ // UNICODE: rStrm >> pNew->sIntName;
+ rStrm.ReadByteString(pNew->sIntName);
+
+ // macro-events
+ rStrm >> pNew->nMacroEvents;
+
+ // macros
+ sal_uInt16 nCnt;
+ rStrm >> nCnt;
+ while( nCnt-- )
+ {
+ sal_uInt16 nCurKey;
+ String aLibName, aMacName;
+
+ rStrm >> nCurKey;
+ // UNICODE: rStrm >> aLibName;
+ rStrm.ReadByteString(aLibName);
+
+ // UNICODE: rStrm >> aMacName;
+ rStrm.ReadByteString(aMacName);
+
+ pNew->SetMacro( nCurKey, SvxMacro( aMacName, aLibName, STARBASIC ) );
+ }
+
+ rStrm >> nCnt;
+ while( nCnt-- )
+ {
+ sal_uInt16 nCurKey, nScriptType;
+ String aLibName, aMacName;
+
+ rStrm >> nCurKey;
+
+ // UNICODE: rStrm >> aLibName;
+ rStrm.ReadByteString(aLibName);
+
+ // UNICODE: rStrm >> aMacName;
+ rStrm.ReadByteString(aMacName);
+
+ rStrm >> nScriptType;
+
+ pNew->SetMacro( nCurKey, SvxMacro( aMacName, aLibName,
+ (ScriptType)nScriptType ) );
+ }
+ }
+ else
+ rStrm.Seek( nPos );
+
+ return pNew;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SvxHyperlinkItem::SvxHyperlinkItem( const SvxHyperlinkItem& rHyperlinkItem ):
+ SfxPoolItem(rHyperlinkItem)
+{
+ sName = rHyperlinkItem.sName;
+ sURL = rHyperlinkItem.sURL;
+ sTarget = rHyperlinkItem.sTarget;
+ eType = rHyperlinkItem.eType;
+ sIntName = rHyperlinkItem.sIntName;
+ nMacroEvents = rHyperlinkItem.nMacroEvents;
+
+ if( rHyperlinkItem.GetMacroTbl() )
+ pMacroTable = new SvxMacroTableDtor( *rHyperlinkItem.GetMacroTbl() );
+ else
+ pMacroTable=NULL;
+
+};
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SvxHyperlinkItem::SvxHyperlinkItem( sal_uInt16 _nWhich, String& rName, String& rURL,
+ String& rTarget, String& rIntName, SvxLinkInsertMode eTyp,
+ sal_uInt16 nEvents, SvxMacroTableDtor *pMacroTbl ):
+ SfxPoolItem (_nWhich),
+ sName (rName),
+ sURL (rURL),
+ sTarget (rTarget),
+ eType (eTyp),
+ sIntName (rIntName),
+ nMacroEvents (nEvents)
+{
+ if (pMacroTbl)
+ pMacroTable = new SvxMacroTableDtor ( *pMacroTbl );
+ else
+ pMacroTable=NULL;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SfxPoolItem* SvxHyperlinkItem::Clone( SfxItemPool* ) const
+{
+ return new SvxHyperlinkItem( *this );
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+int SvxHyperlinkItem::operator==( const SfxPoolItem& rAttr ) const
+{
+ DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" );
+
+ const SvxHyperlinkItem& rItem = (const SvxHyperlinkItem&) rAttr;
+
+ sal_Bool bRet = ( sName == rItem.sName &&
+ sURL == rItem.sURL &&
+ sTarget == rItem.sTarget &&
+ eType == rItem.eType &&
+ sIntName == rItem.sIntName &&
+ nMacroEvents == rItem.nMacroEvents);
+ if (!bRet)
+ return sal_False;
+
+ const SvxMacroTableDtor* pOther = ((SvxHyperlinkItem&)rAttr).pMacroTable;
+ if( !pMacroTable )
+ return ( !pOther || !pOther->Count() );
+ if( !pOther )
+ return 0 == pMacroTable->Count();
+
+ const SvxMacroTableDtor& rOwn = *pMacroTable;
+ const SvxMacroTableDtor& rOther = *pOther;
+
+ // Anzahl unterschiedlich => auf jeden Fall ungleich
+ if( rOwn.Count() != rOther.Count() )
+ return sal_False;
+
+ // einzeln vergleichen; wegen Performance ist die Reihenfolge wichtig
+ for( sal_uInt16 nNo = 0; nNo < rOwn.Count(); ++nNo )
+ {
+ const SvxMacro *pOwnMac = rOwn.GetObject(nNo);
+ const SvxMacro *pOtherMac = rOther.GetObject(nNo);
+ if ( rOwn.GetKey(pOwnMac) != rOther.GetKey(pOtherMac) ||
+ pOwnMac->GetLibName() != pOtherMac->GetLibName() ||
+ pOwnMac->GetMacName() != pOtherMac->GetMacName() )
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+void SvxHyperlinkItem::SetMacro( sal_uInt16 nEvent, const SvxMacro& rMacro )
+{
+ if( nEvent < EVENT_SFX_START )
+ {
+ switch( nEvent )
+ {
+ case HYPERDLG_EVENT_MOUSEOVER_OBJECT:
+ nEvent = SFX_EVENT_MOUSEOVER_OBJECT;
+ break;
+ case HYPERDLG_EVENT_MOUSECLICK_OBJECT:
+ nEvent = SFX_EVENT_MOUSECLICK_OBJECT;
+ break;
+ case HYPERDLG_EVENT_MOUSEOUT_OBJECT:
+ nEvent = SFX_EVENT_MOUSEOUT_OBJECT;
+ break;
+ }
+ }
+
+ if( !pMacroTable )
+ pMacroTable = new SvxMacroTableDtor;
+
+ SvxMacro *pOldMacro;
+ if( 0 != ( pOldMacro = pMacroTable->Get( nEvent )) )
+ {
+ delete pOldMacro;
+ pMacroTable->Replace( nEvent, new SvxMacro( rMacro ) );
+ }
+ else
+ pMacroTable->Insert( nEvent, new SvxMacro( rMacro ) );
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+void SvxHyperlinkItem::SetMacroTable( const SvxMacroTableDtor& rTbl )
+{
+ if ( pMacroTable )
+ delete pMacroTable;
+
+ pMacroTable = new SvxMacroTableDtor ( rTbl );
+}
+
+BOOL SvxHyperlinkItem::QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId ) const
+{
+// sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
+ nMemberId &= ~CONVERT_TWIPS;
+ switch(nMemberId)
+ {
+ case MID_HLINK_NAME :
+ rVal <<= ::rtl::OUString(sIntName.GetBuffer());
+ break;
+ case MID_HLINK_TEXT :
+ rVal <<= ::rtl::OUString(sName.GetBuffer());
+ break;
+ case MID_HLINK_URL:
+ rVal <<= ::rtl::OUString(sURL.GetBuffer());
+ break;
+ case MID_HLINK_TARGET:
+ rVal <<= ::rtl::OUString(sTarget.GetBuffer());
+ break;
+ case MID_HLINK_TYPE:
+ rVal <<= (sal_Int32) eType;
+ break;
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+BOOL SvxHyperlinkItem::PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId )
+{
+// sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
+ nMemberId &= ~CONVERT_TWIPS;
+ ::rtl::OUString aStr;
+ sal_Int32 nVal = 0;
+ switch(nMemberId)
+ {
+ case MID_HLINK_NAME :
+ if(!(rVal >>= aStr))
+ return sal_False;
+ sIntName = aStr.getStr();
+ break;
+ case MID_HLINK_TEXT :
+ if(!(rVal >>= aStr))
+ return sal_False;
+ sName = aStr.getStr();
+ break;
+ case MID_HLINK_URL:
+ if(!(rVal >>= aStr))
+ return sal_False;
+ sURL = aStr.getStr();
+ break;
+ case MID_HLINK_TARGET:
+ if(!(rVal >>= aStr))
+ return sal_False;
+ sTarget = aStr.getStr();
+ break;
+ case MID_HLINK_TYPE:
+ if(!(rVal >>= nVal))
+ return sal_False;
+ eType = (SvxLinkInsertMode) (sal_uInt16) nVal;
+ break;
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+