1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27
28
29 //------------------------------------------------------------------------
30
31 #include <unotools/charclass.hxx>
32 #include <string.h>
33
34 #include "global.hxx"
35 #include "userlist.hxx"
36 #include <unotools/localedatawrapper.hxx>
37 #include <unotools/calendarwrapper.hxx>
38 #include <unotools/transliterationwrapper.hxx>
39
40 // STATIC DATA -----------------------------------------------------------
41
42
43 //------------------------------------------------------------------------
44
InitTokens()45 void ScUserListData::InitTokens()
46 {
47 sal_Unicode cSep = ScGlobal::cListDelimiter;
48 nTokenCount = (sal_uInt16) aStr.GetTokenCount(cSep);
49 if (nTokenCount)
50 {
51 pSubStrings = new String[nTokenCount];
52 pUpperSub = new String[nTokenCount];
53 for (sal_uInt16 i=0; i<nTokenCount; i++)
54 {
55 pUpperSub[i] = pSubStrings[i] = aStr.GetToken((xub_StrLen)i,cSep);
56 ScGlobal::pCharClass->toUpper(pUpperSub[i]);
57 }
58 }
59 else
60 pSubStrings = pUpperSub = NULL;
61 }
62
ScUserListData(const String & rStr)63 ScUserListData::ScUserListData(const String& rStr) :
64 aStr(rStr)
65 {
66 InitTokens();
67 }
68
ScUserListData(const ScUserListData & rData)69 ScUserListData::ScUserListData(const ScUserListData& rData) :
70 ScDataObject(),
71 aStr(rData.aStr)
72 {
73 InitTokens();
74 }
75
~ScUserListData()76 __EXPORT ScUserListData::~ScUserListData()
77 {
78 delete[] pSubStrings;
79 delete[] pUpperSub;
80 }
81
SetString(const String & rStr)82 void ScUserListData::SetString( const String& rStr )
83 {
84 delete[] pSubStrings;
85 delete[] pUpperSub;
86
87 aStr = rStr;
88 InitTokens();
89 }
90
GetSubCount() const91 sal_uInt16 ScUserListData::GetSubCount() const
92 {
93 return nTokenCount;
94 }
95
GetSubIndex(const String & rSubStr,sal_uInt16 & rIndex) const96 sal_Bool ScUserListData::GetSubIndex(const String& rSubStr, sal_uInt16& rIndex) const
97 {
98 sal_uInt16 i;
99 for (i=0; i<nTokenCount; i++)
100 if (rSubStr == pSubStrings[i])
101 {
102 rIndex = i;
103 return sal_True;
104 }
105
106 String aUpStr = rSubStr;
107 ScGlobal::pCharClass->toUpper(aUpStr);
108 for (i=0; i<nTokenCount; i++)
109 if (aUpStr == pUpperSub[i])
110 {
111 rIndex = i;
112 return sal_True;
113 }
114
115 return sal_False;
116 }
117
GetSubStr(sal_uInt16 nIndex) const118 String ScUserListData::GetSubStr(sal_uInt16 nIndex) const
119 {
120 if (nIndex < nTokenCount)
121 return pSubStrings[nIndex];
122 else
123 return EMPTY_STRING;
124 }
125
Compare(const String & rSubStr1,const String & rSubStr2) const126 StringCompare ScUserListData::Compare(const String& rSubStr1, const String& rSubStr2) const
127 {
128 sal_uInt16 nIndex1;
129 sal_uInt16 nIndex2;
130 sal_Bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
131 sal_Bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
132 if (bFound1)
133 {
134 if (bFound2)
135 {
136 if (nIndex1 < nIndex2)
137 return COMPARE_LESS;
138 else if (nIndex1 > nIndex2)
139 return COMPARE_GREATER;
140 else
141 return COMPARE_EQUAL;
142 }
143 else
144 return COMPARE_LESS;
145 }
146 else if (bFound2)
147 return COMPARE_GREATER;
148 else
149 return (StringCompare) ScGlobal::GetCaseTransliteration()->compareString( rSubStr1, rSubStr2 );
150 }
151
ICompare(const String & rSubStr1,const String & rSubStr2) const152 StringCompare ScUserListData::ICompare(const String& rSubStr1, const String& rSubStr2) const
153 {
154 sal_uInt16 nIndex1;
155 sal_uInt16 nIndex2;
156 sal_Bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
157 sal_Bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
158 if (bFound1)
159 {
160 if (bFound2)
161 {
162 if (nIndex1 < nIndex2)
163 return COMPARE_LESS;
164 else if (nIndex1 > nIndex2)
165 return COMPARE_GREATER;
166 else
167 return COMPARE_EQUAL;
168 }
169 else
170 return COMPARE_LESS;
171 }
172 else if (bFound2)
173 return COMPARE_GREATER;
174 else
175 return (StringCompare) ScGlobal::GetpTransliteration()->compareString( rSubStr1, rSubStr2 );
176 }
177
ScUserList(sal_uInt16 nLim,sal_uInt16 nDel)178 ScUserList::ScUserList(sal_uInt16 nLim, sal_uInt16 nDel) :
179 ScCollection ( nLim, nDel )
180 {
181 using namespace ::com::sun::star;
182
183 sal_Unicode cDelimiter = ScGlobal::cListDelimiter;
184 uno::Sequence< i18n::CalendarItem > xCal;
185
186 uno::Sequence< i18n::Calendar > xCalendars(
187 ScGlobal::pLocaleData->getAllCalendars() );
188
189 for ( sal_Int32 j = 0; j < xCalendars.getLength(); ++j )
190 {
191 xCal = xCalendars[j].Days;
192 if ( xCal.getLength() )
193 {
194 String sDayShort, sDayLong;
195 sal_Int32 i;
196 sal_Int32 nLen = xCal.getLength();
197 rtl::OUString sStart = xCalendars[j].StartOfWeek;
198 sal_Int16 nStart = sal::static_int_cast<sal_Int16>(nLen);
199 while (nStart > 0)
200 {
201 if (xCal[--nStart].ID == sStart)
202 break;
203 }
204 sal_Int16 nLast = sal::static_int_cast<sal_Int16>( (nStart + nLen - 1) % nLen );
205 for (i = nStart; i != nLast; i = (i+1) % nLen)
206 {
207 sDayShort += String( xCal[i].AbbrevName );
208 sDayShort += cDelimiter;
209 sDayLong += String( xCal[i].FullName );
210 sDayLong += cDelimiter;
211 }
212 sDayShort += String( xCal[i].AbbrevName );
213 sDayLong += String( xCal[i].FullName );
214
215 if ( !HasEntry( sDayShort ) )
216 Insert( new ScUserListData( sDayShort ));
217 if ( !HasEntry( sDayLong ) )
218 Insert( new ScUserListData( sDayLong ));
219 }
220
221 xCal = xCalendars[j].Months;
222 if ( xCal.getLength() )
223 {
224 String sMonthShort, sMonthLong;
225 sal_Int32 i;
226 sal_Int32 nLen = xCal.getLength() - 1;
227 for (i = 0; i < nLen; i++)
228 {
229 sMonthShort += String( xCal[i].AbbrevName );
230 sMonthShort += cDelimiter;
231 sMonthLong += String( xCal[i].FullName );
232 sMonthLong += cDelimiter;
233 }
234 sMonthShort += String( xCal[i].AbbrevName );
235 sMonthLong += String( xCal[i].FullName );
236
237 if ( !HasEntry( sMonthShort ) )
238 Insert( new ScUserListData( sMonthShort ));
239 if ( !HasEntry( sMonthLong ) )
240 Insert( new ScUserListData( sMonthLong ));
241 }
242 }
243 }
244
Clone() const245 ScDataObject* ScUserList::Clone() const
246 {
247 return ( new ScUserList( *this ) );
248 }
249
GetData(const String & rSubStr) const250 ScUserListData* ScUserList::GetData(const String& rSubStr) const
251 {
252 sal_uInt16 nIndex;
253 sal_uInt16 i = 0;
254 for (i=0; i < nCount; i++)
255 if (((ScUserListData*)pItems[i])->GetSubIndex(rSubStr, nIndex))
256 return (ScUserListData*)pItems[i];
257 return NULL;
258 }
259
operator ==(const ScUserList & r) const260 sal_Bool ScUserList::operator==( const ScUserList& r ) const
261 {
262 sal_Bool bEqual = (nCount == r.nCount);
263
264 if ( bEqual )
265 {
266 ScUserListData* pMyData = NULL;
267 ScUserListData* pOtherData = NULL;
268
269 for ( sal_uInt16 i=0; i<nCount && bEqual; i++)
270 {
271 pMyData = (ScUserListData*)At(i);
272 pOtherData = (ScUserListData*)r.At(i);
273
274 bEqual =( (pMyData->nTokenCount == pOtherData->nTokenCount)
275 && (pMyData->aStr == pOtherData->aStr) );
276 }
277 }
278
279 return bEqual;
280 }
281
282
HasEntry(const String & rStr) const283 sal_Bool ScUserList::HasEntry( const String& rStr ) const
284 {
285 for ( sal_uInt16 i=0; i<nCount; i++)
286 {
287 const ScUserListData* pMyData = (ScUserListData*) At(i);
288 if ( pMyData->aStr == rStr )
289 return sal_True;
290 }
291 return sal_False;
292 }
293
294