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