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