Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <svx/svxids.hrc>
21 : #include <tools/stream.hxx>
22 : #include <svl/memberid.hrc>
23 : #include <basic/sbxvar.hxx>
24 :
25 : #include "svx/hlnkitem.hxx"
26 :
27 :
28 :
29 202 : TYPEINIT1_FACTORY(SvxHyperlinkItem, SfxPoolItem, new SvxHyperlinkItem(0));
30 :
31 : #define HYPERLINKFF_MARKER 0x599401FE
32 :
33 0 : SvStream& SvxHyperlinkItem::Store( SvStream& rStrm, sal_uInt16 /*nItemVersion*/ ) const
34 : {
35 : // store 'simple' data
36 : // UNICODE: rStrm << sName;
37 0 : rStrm.WriteUniOrByteString(sName, rStrm.GetStreamCharSet());
38 :
39 : // UNICODE: rStrm << sURL;
40 0 : rStrm.WriteUniOrByteString(sURL, rStrm.GetStreamCharSet());
41 :
42 : // UNICODE: rStrm << sTarget;
43 0 : rStrm.WriteUniOrByteString(sTarget, rStrm.GetStreamCharSet());
44 :
45 0 : rStrm.WriteUInt32( eType );
46 :
47 : // marker for versioninfo
48 0 : rStrm.WriteUInt32( HYPERLINKFF_MARKER );
49 :
50 : // new data
51 : // UNICODE: rStrm << sIntName;
52 0 : rStrm.WriteUniOrByteString(sIntName, rStrm.GetStreamCharSet());
53 :
54 : // macro-events
55 0 : rStrm.WriteUInt16( nMacroEvents );
56 :
57 : // store macros
58 0 : sal_uInt16 nCnt = pMacroTable ? (sal_uInt16)pMacroTable->size() : 0;
59 0 : sal_uInt16 nMax = nCnt;
60 0 : if( nCnt )
61 : {
62 0 : for ( SvxMacroTable::const_iterator it = pMacroTable->begin();
63 0 : it != pMacroTable->end(); ++it)
64 0 : if( STARBASIC != it->second.GetScriptType() )
65 0 : --nCnt;
66 : }
67 :
68 0 : rStrm.WriteUInt16( nCnt );
69 :
70 0 : if( nCnt )
71 : {
72 : // 1. StarBasic-Macros
73 0 : for ( SvxMacroTable::const_iterator it = pMacroTable->begin();
74 0 : it != pMacroTable->end(); ++it)
75 : {
76 0 : const SvxMacro& rMac = it->second;
77 0 : if( STARBASIC == rMac.GetScriptType() )
78 : {
79 0 : rStrm.WriteUInt16( it->first );
80 :
81 : // UNICODE: rStrm << pMac->GetLibName();
82 0 : rStrm.WriteUniOrByteString(rMac.GetLibName(), rStrm.GetStreamCharSet());
83 :
84 : // UNICODE: rStrm << pMac->GetMacName();
85 0 : rStrm.WriteUniOrByteString(rMac.GetMacName(), rStrm.GetStreamCharSet());
86 : }
87 : }
88 : }
89 :
90 0 : nCnt = nMax - nCnt;
91 0 : rStrm.WriteUInt16( nCnt );
92 0 : if( nCnt )
93 : {
94 : // 2. ::com::sun::star::script::JavaScript-Macros
95 0 : for ( SvxMacroTable::const_iterator it = pMacroTable->begin();
96 0 : it != pMacroTable->end(); ++it)
97 : {
98 0 : const SvxMacro& rMac = it->second;
99 0 : if( STARBASIC != rMac.GetScriptType() )
100 : {
101 0 : rStrm.WriteUInt16( it->first );
102 :
103 : // UNICODE: rStrm << pMac->GetLibName();
104 0 : rStrm.WriteUniOrByteString(rMac.GetLibName(), rStrm.GetStreamCharSet());
105 :
106 : // UNICODE: rStrm << pMac->GetMacName();
107 0 : rStrm.WriteUniOrByteString(rMac.GetMacName(), rStrm.GetStreamCharSet());
108 :
109 0 : rStrm.WriteUInt16( rMac.GetScriptType() );
110 : }
111 : }
112 : }
113 :
114 0 : return rStrm;
115 : }
116 :
117 0 : SfxPoolItem* SvxHyperlinkItem::Create( SvStream &rStrm, sal_uInt16 /*nItemVersion*/ ) const
118 : {
119 0 : SvxHyperlinkItem* pNew = new SvxHyperlinkItem( Which() );
120 : sal_uInt32 nType;
121 :
122 : // simple data-types
123 : // UNICODE: rStrm >> pNew->sName;
124 0 : pNew->sName = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
125 :
126 : // UNICODE: rStrm >> pNew->sURL;
127 0 : pNew->sURL = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
128 :
129 : // UNICODE: rStrm >> pNew->sTarget;
130 0 : pNew->sTarget = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
131 :
132 0 : rStrm.ReadUInt32( nType );
133 0 : pNew->eType = (SvxLinkInsertMode) nType;
134 :
135 0 : sal_uInt32 nPos = rStrm.Tell();
136 : sal_uInt32 nMarker;
137 0 : rStrm.ReadUInt32( nMarker );
138 0 : if ( nMarker == HYPERLINKFF_MARKER )
139 : {
140 : // new data
141 : // UNICODE: rStrm >> pNew->sIntName;
142 0 : pNew->sIntName = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
143 :
144 : // macro-events
145 0 : rStrm.ReadUInt16( pNew->nMacroEvents );
146 :
147 : // macros
148 : sal_uInt16 nCnt;
149 0 : rStrm.ReadUInt16( nCnt );
150 0 : while( nCnt-- )
151 : {
152 : sal_uInt16 nCurKey;
153 0 : OUString aLibName, aMacName;
154 :
155 0 : rStrm.ReadUInt16( nCurKey );
156 : // UNICODE: rStrm >> aLibName;
157 0 : aLibName = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
158 :
159 : // UNICODE: rStrm >> aMacName;
160 0 : aMacName = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
161 :
162 0 : pNew->SetMacro( nCurKey, SvxMacro( aMacName, aLibName, STARBASIC ) );
163 0 : }
164 :
165 0 : rStrm.ReadUInt16( nCnt );
166 0 : while( nCnt-- )
167 : {
168 : sal_uInt16 nCurKey, nScriptType;
169 0 : OUString aLibName, aMacName;
170 :
171 0 : rStrm.ReadUInt16( nCurKey );
172 :
173 : // UNICODE: rStrm >> aLibName;
174 0 : aLibName = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
175 :
176 : // UNICODE: rStrm >> aMacName;
177 0 : aMacName = rStrm.ReadUniOrByteString(rStrm.GetStreamCharSet());
178 :
179 0 : rStrm.ReadUInt16( nScriptType );
180 :
181 : pNew->SetMacro( nCurKey, SvxMacro( aMacName, aLibName,
182 0 : (ScriptType)nScriptType ) );
183 0 : }
184 : }
185 : else
186 0 : rStrm.Seek( nPos );
187 :
188 0 : return pNew;
189 : }
190 :
191 0 : SvxHyperlinkItem::SvxHyperlinkItem( const SvxHyperlinkItem& rHyperlinkItem ):
192 0 : SfxPoolItem(rHyperlinkItem)
193 : {
194 0 : sName = rHyperlinkItem.sName;
195 0 : sURL = rHyperlinkItem.sURL;
196 0 : sTarget = rHyperlinkItem.sTarget;
197 0 : eType = rHyperlinkItem.eType;
198 0 : sIntName = rHyperlinkItem.sIntName;
199 0 : nMacroEvents = rHyperlinkItem.nMacroEvents;
200 :
201 0 : if( rHyperlinkItem.GetMacroTbl() )
202 0 : pMacroTable = new SvxMacroTableDtor( *rHyperlinkItem.GetMacroTbl() );
203 : else
204 0 : pMacroTable=NULL;
205 :
206 0 : };
207 :
208 0 : SvxHyperlinkItem::SvxHyperlinkItem( sal_uInt16 _nWhich, const OUString& rName, const OUString& rURL,
209 : const OUString& rTarget, const OUString& rIntName, SvxLinkInsertMode eTyp,
210 : sal_uInt16 nEvents, SvxMacroTableDtor *pMacroTbl ):
211 : SfxPoolItem (_nWhich),
212 : sName (rName),
213 : sURL (rURL),
214 : sTarget (rTarget),
215 : eType (eTyp),
216 : sIntName (rIntName),
217 0 : nMacroEvents (nEvents)
218 : {
219 0 : if (pMacroTbl)
220 0 : pMacroTable = new SvxMacroTableDtor ( *pMacroTbl );
221 : else
222 0 : pMacroTable=NULL;
223 0 : }
224 :
225 0 : SfxPoolItem* SvxHyperlinkItem::Clone( SfxItemPool* ) const
226 : {
227 0 : return new SvxHyperlinkItem( *this );
228 : }
229 :
230 0 : bool SvxHyperlinkItem::operator==( const SfxPoolItem& rAttr ) const
231 : {
232 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" );
233 :
234 0 : const SvxHyperlinkItem& rItem = static_cast<const SvxHyperlinkItem&>(rAttr);
235 :
236 0 : bool bRet = ( sName == rItem.sName &&
237 0 : sURL == rItem.sURL &&
238 0 : sTarget == rItem.sTarget &&
239 0 : eType == rItem.eType &&
240 0 : sIntName == rItem.sIntName &&
241 0 : nMacroEvents == rItem.nMacroEvents);
242 0 : if (!bRet)
243 0 : return false;
244 :
245 0 : const SvxMacroTableDtor* pOther = static_cast<const SvxHyperlinkItem&>(rAttr).pMacroTable;
246 0 : if( !pMacroTable )
247 0 : return ( !pOther || pOther->empty() );
248 0 : if( !pOther )
249 0 : return pMacroTable->empty();
250 :
251 0 : const SvxMacroTableDtor& rOwn = *pMacroTable;
252 0 : const SvxMacroTableDtor& rOther = *pOther;
253 :
254 0 : return rOwn == rOther;
255 : }
256 :
257 0 : void SvxHyperlinkItem::SetMacro( sal_uInt16 nEvent, const SvxMacro& rMacro )
258 : {
259 0 : if( nEvent < EVENT_SFX_START )
260 : {
261 0 : switch( nEvent )
262 : {
263 : case HYPERDLG_EVENT_MOUSEOVER_OBJECT:
264 0 : nEvent = SFX_EVENT_MOUSEOVER_OBJECT;
265 0 : break;
266 : case HYPERDLG_EVENT_MOUSECLICK_OBJECT:
267 0 : nEvent = SFX_EVENT_MOUSECLICK_OBJECT;
268 0 : break;
269 : case HYPERDLG_EVENT_MOUSEOUT_OBJECT:
270 0 : nEvent = SFX_EVENT_MOUSEOUT_OBJECT;
271 0 : break;
272 : }
273 : }
274 :
275 0 : if( !pMacroTable )
276 0 : pMacroTable = new SvxMacroTableDtor;
277 :
278 0 : pMacroTable->Insert( nEvent, rMacro);
279 0 : }
280 :
281 0 : void SvxHyperlinkItem::SetMacroTable( const SvxMacroTableDtor& rTbl )
282 : {
283 0 : delete pMacroTable;
284 :
285 0 : pMacroTable = new SvxMacroTableDtor ( rTbl );
286 0 : }
287 :
288 0 : bool SvxHyperlinkItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
289 : {
290 : // sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
291 0 : nMemberId &= ~CONVERT_TWIPS;
292 0 : switch(nMemberId)
293 : {
294 : case MID_HLINK_NAME :
295 0 : rVal <<= sIntName;
296 0 : break;
297 : case MID_HLINK_TEXT :
298 0 : rVal <<= sName;
299 0 : break;
300 : case MID_HLINK_URL:
301 0 : rVal <<= sURL;
302 0 : break;
303 : case MID_HLINK_TARGET:
304 0 : rVal <<= sTarget;
305 0 : break;
306 : case MID_HLINK_TYPE:
307 0 : rVal <<= (sal_Int32) eType;
308 0 : break;
309 : default:
310 0 : return false;
311 : }
312 :
313 0 : return true;
314 : }
315 :
316 0 : bool SvxHyperlinkItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
317 : {
318 0 : nMemberId &= ~CONVERT_TWIPS;
319 0 : OUString aStr;
320 0 : sal_Int32 nVal = 0;
321 0 : switch(nMemberId)
322 : {
323 : case MID_HLINK_NAME :
324 0 : if(!(rVal >>= aStr))
325 0 : return false;
326 0 : sIntName = aStr;
327 0 : break;
328 : case MID_HLINK_TEXT :
329 0 : if(!(rVal >>= aStr))
330 0 : return false;
331 0 : sName = aStr;
332 0 : break;
333 : case MID_HLINK_URL:
334 0 : if(!(rVal >>= aStr))
335 0 : return false;
336 0 : sURL = aStr.getStr();
337 0 : break;
338 : case MID_HLINK_TARGET:
339 0 : if(!(rVal >>= aStr))
340 0 : return false;
341 0 : sTarget = aStr;
342 0 : break;
343 : case MID_HLINK_TYPE:
344 0 : if(!(rVal >>= nVal))
345 0 : return false;
346 0 : eType = (SvxLinkInsertMode) (sal_uInt16) nVal;
347 0 : break;
348 : default:
349 0 : return false;
350 : }
351 :
352 0 : return true;
353 : }
354 :
355 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|