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 <rtl/ustring.hxx>
21 : #include <svl/aeitem.hxx>
22 : #include <boost/noncopyable.hpp>
23 : #include <boost/ptr_container/ptr_vector.hpp>
24 :
25 21540 : TYPEINIT1_AUTOFACTORY(SfxAllEnumItem, SfxEnumItem)
26 :
27 :
28 :
29 7192 : struct SfxAllEnumValue_Impl
30 : {
31 : sal_uInt16 nValue;
32 : OUString aText;
33 : };
34 :
35 7192 : class SfxAllEnumValueArr : boost::noncopyable
36 : {
37 : public:
38 4912 : const SfxAllEnumValue_Impl &operator[](size_t i) const {
39 4912 : return mValues[i];
40 : }
41 :
42 0 : bool empty() const {
43 0 : return mValues.empty();
44 : }
45 :
46 3596 : void Insert(sal_uInt16 n, SfxAllEnumValue_Impl *value) {
47 3596 : mValues.insert(mValues.begin() + n, value);
48 3596 : }
49 :
50 0 : void Erase(sal_uInt16 n) {
51 0 : mValues.erase(mValues.begin() + n);
52 0 : }
53 :
54 6052 : size_t size() const {
55 6052 : return mValues.size();
56 : }
57 :
58 : private:
59 : boost::ptr_vector<SfxAllEnumValue_Impl> mValues;
60 : };
61 :
62 :
63 :
64 1130 : SfxAllEnumItem::SfxAllEnumItem() :
65 : SfxEnumItem(),
66 : pValues( 0 ),
67 1130 : pDisabledValues( 0 )
68 : {
69 1130 : }
70 :
71 :
72 :
73 1140 : SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which, sal_uInt16 nVal):
74 : SfxEnumItem(which, nVal),
75 : pValues( 0 ),
76 1140 : pDisabledValues( 0 )
77 : {
78 1140 : InsertValue( nVal );
79 1140 : }
80 :
81 :
82 :
83 0 : SfxAllEnumItem::SfxAllEnumItem( sal_uInt16 which, SvStream &rStream ):
84 : SfxEnumItem(which, rStream),
85 : pValues( 0 ),
86 0 : pDisabledValues( 0 )
87 : {
88 0 : InsertValue( GetValue() );
89 0 : }
90 :
91 :
92 :
93 :
94 2336 : SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which):
95 : SfxEnumItem(which, 0),
96 : pValues( 0 ),
97 2336 : pDisabledValues( 0 )
98 : {
99 2336 : }
100 :
101 :
102 :
103 :
104 2456 : SfxAllEnumItem::SfxAllEnumItem(const SfxAllEnumItem &rCopy):
105 : SfxEnumItem(rCopy),
106 : pValues(0),
107 2456 : pDisabledValues( 0 )
108 : {
109 2456 : if ( !rCopy.pValues )
110 2456 : return;
111 :
112 2456 : pValues = new SfxAllEnumValueArr;
113 :
114 4912 : for ( sal_uInt16 nPos = 0; nPos < rCopy.pValues->size(); ++nPos )
115 : {
116 2456 : SfxAllEnumValue_Impl *pVal = new SfxAllEnumValue_Impl;
117 2456 : pVal->nValue = (*rCopy.pValues)[nPos].nValue;
118 2456 : pVal->aText = (*rCopy.pValues)[nPos].aText;
119 2456 : pValues->Insert( nPos, pVal );
120 : }
121 :
122 2456 : if( rCopy.pDisabledValues )
123 : {
124 0 : pDisabledValues = new std::vector<sal_uInt16>( *(rCopy.pDisabledValues) );
125 : }
126 : }
127 :
128 :
129 :
130 19728 : SfxAllEnumItem::~SfxAllEnumItem()
131 : {
132 6956 : delete pValues;
133 6956 : delete pDisabledValues;
134 12772 : }
135 :
136 :
137 :
138 0 : sal_uInt16 SfxAllEnumItem::GetValueCount() const
139 : {
140 0 : return pValues ? pValues->size() : 0;
141 : }
142 :
143 :
144 :
145 0 : OUString SfxAllEnumItem::GetValueTextByPos( sal_uInt16 nPos ) const
146 : {
147 : DBG_ASSERT( pValues && nPos < pValues->size(), "enum overflow" );
148 0 : return (*pValues)[nPos].aText;
149 : }
150 :
151 :
152 :
153 0 : sal_uInt16 SfxAllEnumItem::GetValueByPos( sal_uInt16 nPos ) const
154 : {
155 : DBG_ASSERT( pValues && nPos < pValues->size(), "enum overflow" );
156 0 : return (*pValues)[nPos].nValue;
157 : }
158 :
159 :
160 :
161 2456 : SfxPoolItem* SfxAllEnumItem::Clone( SfxItemPool * ) const
162 : {
163 2456 : return new SfxAllEnumItem(*this);
164 : }
165 :
166 :
167 :
168 0 : SfxPoolItem* SfxAllEnumItem::Create( SvStream & rStream, sal_uInt16 ) const
169 : {
170 0 : return new SfxAllEnumItem( Which(), rStream );
171 : }
172 :
173 :
174 :
175 : /**
176 : * In contrast to @see SfxEnumItemInterface::GetPosByValue(sal_uInt16) const
177 : * this internal method returns the position the value would be for non-present values.
178 : */
179 1140 : sal_uInt16 SfxAllEnumItem::_GetPosByValue( sal_uInt16 nVal ) const
180 : {
181 1140 : if ( !pValues )
182 0 : return 0;
183 :
184 : //FIXME: Optimisation: use binary search or SortArray
185 : sal_uInt16 nPos;
186 1140 : for ( nPos = 0; nPos < pValues->size(); ++nPos )
187 0 : if ( (*pValues)[nPos].nValue >= nVal )
188 0 : return nPos;
189 1140 : return nPos;
190 : }
191 :
192 :
193 : /**
194 : * In contrast to @see SfxEnumItemInterface::GetPosByValue(sal_uInt16) const
195 : * this method always returns nValue, as long as not at least one value has
196 : * been inserted using the SfxAllEnumItem::InsertValue() methods
197 : */
198 :
199 0 : sal_uInt16 SfxAllEnumItem::GetPosByValue( sal_uInt16 nValue ) const
200 : {
201 0 : if ( !pValues || pValues->empty() )
202 0 : return nValue;
203 :
204 0 : return SfxEnumItem::GetPosByValue( nValue );
205 : }
206 :
207 :
208 :
209 0 : void SfxAllEnumItem::InsertValue( sal_uInt16 nValue, const OUString &rValue )
210 : {
211 0 : SfxAllEnumValue_Impl *pVal = new SfxAllEnumValue_Impl;
212 0 : pVal->nValue = nValue;
213 0 : pVal->aText = rValue;
214 0 : if ( !pValues )
215 0 : pValues = new SfxAllEnumValueArr;
216 0 : else if ( GetPosByValue( nValue ) != USHRT_MAX )
217 : // remove when exists
218 0 : RemoveValue( nValue );
219 : // then insert
220 0 : pValues->Insert( _GetPosByValue(nValue), pVal ); // FIXME: Duplicates?
221 0 : }
222 :
223 :
224 :
225 1140 : void SfxAllEnumItem::InsertValue( sal_uInt16 nValue )
226 : {
227 1140 : SfxAllEnumValue_Impl *pVal = new SfxAllEnumValue_Impl;
228 1140 : pVal->nValue = nValue;
229 1140 : pVal->aText = OUString::number(nValue);
230 1140 : if ( !pValues )
231 1140 : pValues = new SfxAllEnumValueArr;
232 :
233 1140 : pValues->Insert( _GetPosByValue(nValue), pVal ); // FIXME: Duplicates?
234 1140 : }
235 :
236 0 : void SfxAllEnumItem::DisableValue( sal_uInt16 nValue )
237 : {
238 0 : if ( !pDisabledValues )
239 0 : pDisabledValues = new std::vector<sal_uInt16>;
240 :
241 0 : pDisabledValues->push_back( nValue );
242 0 : }
243 :
244 0 : bool SfxAllEnumItem::IsEnabled( sal_uInt16 nValue ) const
245 : {
246 0 : if ( pDisabledValues )
247 : {
248 0 : for ( size_t i=0; i<pDisabledValues->size(); i++ )
249 0 : if ( (*pDisabledValues)[i] == nValue )
250 0 : return false;
251 : }
252 :
253 0 : return true;
254 : }
255 :
256 :
257 :
258 0 : void SfxAllEnumItem::RemoveValue( sal_uInt16 nValue )
259 : {
260 0 : sal_uInt16 nPos = GetPosByValue(nValue);
261 : DBG_ASSERT( nPos != USHRT_MAX, "removing value not in enum" );
262 0 : pValues->Erase( nPos );
263 0 : }
264 :
265 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|