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 :
21 : #include <svl/slstitm.hxx>
22 : #include <svl/poolitem.hxx>
23 : #include <com/sun/star/uno/Any.hxx>
24 : #include <com/sun/star/uno/Sequence.hxx>
25 : #include <tools/stream.hxx>
26 : #include <stringio.hxx>
27 :
28 1669 : TYPEINIT1_AUTOFACTORY(SfxStringListItem, SfxPoolItem);
29 :
30 : class SfxImpStringList
31 : {
32 : public:
33 : sal_uInt16 nRefCount;
34 : std::vector<OUString> aList;
35 :
36 199 : SfxImpStringList() { nRefCount = 1; }
37 : ~SfxImpStringList();
38 : };
39 :
40 :
41 398 : SfxImpStringList::~SfxImpStringList()
42 : {
43 : DBG_ASSERT(nRefCount!=0xffff,"ImpList already deleted");
44 199 : nRefCount = 0xffff;
45 199 : }
46 :
47 0 : SfxStringListItem::SfxStringListItem() :
48 0 : pImp(NULL)
49 : {
50 0 : }
51 :
52 :
53 199 : SfxStringListItem::SfxStringListItem( sal_uInt16 which, const std::vector<OUString>* pList ) :
54 : SfxPoolItem( which ),
55 199 : pImp(NULL)
56 : {
57 : // FIXME: Putting an empty list does not work
58 : // Therefore the query after the count is commented out
59 199 : if( pList /*!!! && pList->Count() */ )
60 : {
61 0 : pImp = new SfxImpStringList;
62 :
63 0 : if (pImp)
64 0 : pImp->aList = *pList;
65 : }
66 199 : }
67 :
68 :
69 0 : SfxStringListItem::SfxStringListItem( sal_uInt16 which, SvStream& rStream ) :
70 : SfxPoolItem( which ),
71 0 : pImp(NULL)
72 : {
73 : sal_Int32 nEntryCount;
74 0 : rStream.ReadInt32( nEntryCount );
75 :
76 0 : if( nEntryCount )
77 0 : pImp = new SfxImpStringList;
78 :
79 0 : if (pImp)
80 : {
81 0 : for( sal_Int32 i=0; i < nEntryCount; i++ )
82 : {
83 0 : pImp->aList.push_back( readByteString(rStream) );
84 : }
85 : }
86 0 : }
87 :
88 :
89 595 : SfxStringListItem::SfxStringListItem( const SfxStringListItem& rItem ) :
90 : SfxPoolItem( rItem ),
91 595 : pImp(rItem.pImp)
92 : {
93 595 : if( pImp )
94 : {
95 : DBG_ASSERT(pImp->nRefCount!=0xffff,"ImpList not valid");
96 595 : pImp->nRefCount++;
97 : }
98 595 : }
99 :
100 :
101 2183 : SfxStringListItem::~SfxStringListItem()
102 : {
103 794 : if( pImp )
104 : {
105 : DBG_ASSERT(pImp->nRefCount!=0xffff,"ImpList not valid");
106 794 : if( pImp->nRefCount > 1 )
107 595 : pImp->nRefCount--;
108 : else
109 199 : delete pImp;
110 : }
111 1389 : }
112 :
113 :
114 0 : std::vector<OUString>& SfxStringListItem::GetList()
115 : {
116 0 : if( !pImp )
117 0 : pImp = new SfxImpStringList;
118 : DBG_ASSERT(pImp->nRefCount!=0xffff,"ImpList not valid");
119 0 : return pImp->aList;
120 : }
121 :
122 0 : const std::vector<OUString>& SfxStringListItem::GetList () const
123 : {
124 0 : return (const_cast< SfxStringListItem * >(this))->GetList();
125 : }
126 :
127 :
128 28 : bool SfxStringListItem::operator==( const SfxPoolItem& rItem ) const
129 : {
130 : DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" );
131 :
132 28 : const SfxStringListItem& rSSLItem = static_cast<const SfxStringListItem&>(rItem);
133 :
134 28 : return pImp == rSSLItem.pImp;
135 : }
136 :
137 :
138 0 : bool SfxStringListItem::GetPresentation
139 : (
140 : SfxItemPresentation /*ePresentation*/,
141 : SfxMapUnit /*eCoreMetric*/,
142 : SfxMapUnit /*ePresentationMetric*/,
143 : OUString& rText,
144 : const IntlWrapper *
145 : ) const
146 : {
147 0 : rText = "(List)";
148 0 : return false;
149 : }
150 :
151 :
152 595 : SfxPoolItem* SfxStringListItem::Clone( SfxItemPool *) const
153 : {
154 595 : return new SfxStringListItem( *this );
155 : /*
156 : if( pImp )
157 : return new SfxStringListItem( Which(), &(pImp->aList) );
158 : else
159 : return new SfxStringListItem( Which(), NULL );
160 : */
161 :
162 : }
163 :
164 :
165 0 : SfxPoolItem* SfxStringListItem::Create( SvStream & rStream, sal_uInt16 ) const
166 : {
167 0 : return new SfxStringListItem( Which(), rStream );
168 : }
169 :
170 :
171 0 : SvStream& SfxStringListItem::Store( SvStream & rStream, sal_uInt16 ) const
172 : {
173 0 : if( !pImp )
174 : {
175 0 : rStream.WriteInt32( 0 );
176 0 : return rStream;
177 : }
178 :
179 : DBG_ASSERT(pImp->nRefCount!=0xffff,"ImpList not valid");
180 :
181 0 : sal_uInt32 nCount = pImp->aList.size();
182 0 : rStream.WriteUInt32( nCount );
183 :
184 0 : for( sal_uInt32 i=0; i < nCount; i++ )
185 0 : writeByteString(rStream, pImp->aList[i]);
186 :
187 0 : return rStream;
188 : }
189 :
190 :
191 0 : void SfxStringListItem::SetString( const OUString& rStr )
192 : {
193 : DBG_ASSERT(GetRefCount()==0,"SetString:RefCount!=0");
194 :
195 0 : if ( pImp && (pImp->nRefCount == 1) )
196 0 : delete pImp;
197 0 : else if( pImp )
198 0 : pImp->nRefCount--;
199 0 : pImp = new SfxImpStringList;
200 :
201 0 : sal_Int32 nStart = 0;
202 0 : OUString aStr(convertLineEnd(rStr, LINEEND_CR));
203 : for (;;)
204 : {
205 0 : const sal_Int32 nDelimPos = aStr.indexOf( '\r', nStart );
206 0 : if ( nDelimPos < 0 )
207 : {
208 0 : if (nStart<aStr.getLength())
209 : {
210 : // put last string only if not empty
211 0 : pImp->aList.push_back(aStr.copy(nStart));
212 : }
213 0 : break;
214 : }
215 :
216 0 : pImp->aList.push_back(aStr.copy(nStart, nDelimPos-nStart));
217 :
218 : // skip both inserted string and delimiter
219 0 : nStart = nDelimPos + 1 ;
220 0 : }
221 0 : }
222 :
223 :
224 0 : OUString SfxStringListItem::GetString()
225 : {
226 0 : OUString aStr;
227 0 : if ( pImp )
228 : {
229 : DBG_ASSERT(pImp->nRefCount!=0xffff,"ImpList not valid");
230 :
231 0 : std::vector<OUString>::iterator iter = pImp->aList.begin();
232 : for (;;)
233 : {
234 0 : aStr += *iter;
235 0 : ++iter;
236 :
237 0 : if (iter == pImp->aList.end())
238 0 : break;
239 :
240 0 : aStr += "\r";
241 0 : }
242 : }
243 0 : return convertLineEnd(aStr, GetSystemLineEnd());
244 : }
245 :
246 :
247 199 : void SfxStringListItem::SetStringList( const com::sun::star::uno::Sequence< OUString >& rList )
248 : {
249 : DBG_ASSERT(GetRefCount()==0,"SetString:RefCount!=0");
250 :
251 199 : if ( pImp && (pImp->nRefCount == 1) )
252 0 : delete pImp;
253 199 : else if( pImp )
254 0 : pImp->nRefCount--;
255 199 : pImp = new SfxImpStringList;
256 :
257 199 : if (pImp)
258 : {
259 : // String belongs to the list
260 995 : for ( sal_Int32 n = 0; n < rList.getLength(); n++ )
261 796 : pImp->aList.push_back(rList[n]);
262 : }
263 199 : }
264 :
265 199 : void SfxStringListItem::GetStringList( com::sun::star::uno::Sequence< OUString >& rList ) const
266 : {
267 199 : long nCount = pImp->aList.size();
268 :
269 199 : rList.realloc( nCount );
270 995 : for( long i=0; i < nCount; i++ )
271 796 : rList[i] = pImp->aList[i];
272 199 : }
273 :
274 : // virtual
275 0 : bool SfxStringListItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 )
276 : {
277 0 : com::sun::star::uno::Sequence< OUString > aValue;
278 0 : if ( rVal >>= aValue )
279 : {
280 0 : SetStringList( aValue );
281 0 : return true;
282 : }
283 :
284 : OSL_FAIL( "SfxStringListItem::PutValue - Wrong type!" );
285 0 : return false;
286 : }
287 :
288 : // virtual
289 199 : bool SfxStringListItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const
290 : {
291 : // GetString() is not const!!!
292 199 : SfxStringListItem* pThis = const_cast< SfxStringListItem * >( this );
293 :
294 199 : com::sun::star::uno::Sequence< OUString > aStringList;
295 199 : pThis->GetStringList( aStringList );
296 199 : rVal = ::com::sun::star::uno::makeAny( aStringList );
297 199 : return true;
298 : }
299 :
300 :
301 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|