xref: /AOO41X/main/sc/source/core/tool/userlist.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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