xref: /trunk/main/svtools/source/control/svxbox.cxx (revision 79aad27f)
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_svtools.hxx"
26 #include <tools/debug.hxx>
27 #include <vcl/svapp.hxx>
28 #include <svtools/svxbox.hxx>
29 #include <unotools/charclass.hxx>
30 
31 // -----------------------------------------------------------------------
32 
SV_IMPL_PTRARR(SvxEntryLst,SvxBoxEntry *)33 SV_IMPL_PTRARR(SvxEntryLst, SvxBoxEntry*)
34 
35 /*--------------------------------------------------------------------
36 	 Beschreibung: Ein ListboxElement
37  --------------------------------------------------------------------*/
38 
39 SvxBoxEntry::SvxBoxEntry() :
40     nId(LISTBOX_ENTRY_NOTFOUND),
41     bModified(sal_False),
42     bNew(sal_False)
43 {
44 }
45 
46 
SvxBoxEntry(const String & aNam,sal_uInt16 nIdx)47 SvxBoxEntry::SvxBoxEntry(const String& aNam, sal_uInt16 nIdx) :
48     aName(aNam),
49     nId(nIdx),
50     bModified(sal_False),
51     bNew(sal_False)
52 {
53 }
54 
55 
SvxBoxEntry(const SvxBoxEntry & rOld)56 SvxBoxEntry::SvxBoxEntry(const SvxBoxEntry& rOld) :
57 	aName(rOld.aName),
58 	nId(rOld.nId),
59     bModified(rOld.bModified),
60     bNew(rOld.bNew)
61 {
62 }
63 
64 /*--------------------------------------------------------------------
65 	 Beschreibung:
66  --------------------------------------------------------------------*/
67 
SvxListBox(Window * pParent,WinBits nBits)68 SvxListBox::SvxListBox(Window* pParent, WinBits nBits) :
69 	ListBox(pParent, nBits)
70 {
71 	InitListBox();
72 }
73 
74 
SvxListBox(Window * pParent,const ResId & rId)75 SvxListBox::SvxListBox(Window* pParent, const ResId& rId):
76 	ListBox(pParent, rId)
77 {
78 	InitListBox();
79 }
80 
81 /*--------------------------------------------------------------------
82 	 Beschreibung: Basisklasse Dtor
83  --------------------------------------------------------------------*/
84 
~SvxListBox()85 __EXPORT SvxListBox::~SvxListBox()
86 {
87 	aEntryLst.DeleteAndDestroy(0,	aEntryLst.Count());
88 	aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count());
89 }
90 
91 /*--------------------------------------------------------------------
92 	 Beschreibung: Evtl. Liste aus der Ressource beachten
93  --------------------------------------------------------------------*/
94 
InitListBox()95 void SvxListBox::InitListBox()
96 {
97 	// Verwaltung fuer die Stringlist aus der Resource aufbauen
98 	sal_uInt16 nSize = GetEntryCount();
99 	for(sal_uInt16 i=0; i < nSize; ++i)
100 	{	const SvxBoxEntry* pTmp = new SvxBoxEntry(ListBox::GetEntry(i), i);
101 		const SvxBoxEntry* &rpTmp = pTmp;
102 		aEntryLst.Insert(rpTmp, aEntryLst.Count());
103 	}
104 }
105 
106 /*--------------------------------------------------------------------
107 	 Beschreibung: neue Eintraege verwalten
108  --------------------------------------------------------------------*/
109 
InsertNewEntry(const SvxBoxEntry & rEntry)110 void SvxListBox::InsertNewEntry(const SvxBoxEntry& rEntry)
111 {
112 	SvxBoxEntry* pNew = new SvxBoxEntry(rEntry);
113 	pNew->bNew = sal_True;
114 	InsertSorted(pNew);
115 }
116 
117 /*--------------------------------------------------------------------
118 	 Beschreibung: Eintrag in die ListBox aufnehmen
119  --------------------------------------------------------------------*/
120 
InsertEntry(const SvxBoxEntry & rEntry,sal_uInt16 nPos)121 void SvxListBox::InsertEntry(const SvxBoxEntry& rEntry, sal_uInt16 nPos)
122 {
123 	if(nPos != LISTBOX_ENTRY_NOTFOUND)
124 	{
125 		SvxBoxEntry* pEntry = new SvxBoxEntry(rEntry);
126 		ListBox::InsertEntry(pEntry->aName, nPos);
127 		//const SvxBoxEntry* &rpEntry = pEntry;
128 		aEntryLst.C40_INSERT(SvxBoxEntry, pEntry, nPos);
129 	}
130 	else
131 		InsertSorted(new SvxBoxEntry(rEntry));
132 }
133 
134 /*--------------------------------------------------------------------
135 	 Beschreibung: Eintrag aus der Liste loeschen
136  --------------------------------------------------------------------*/
137 
RemoveEntry(sal_uInt16 nPos)138 void SvxListBox::RemoveEntry(sal_uInt16 nPos)
139 {
140 	if(nPos >= aEntryLst.Count())
141 		return;
142 
143 	// Altes Element austragen
144 	SvxBoxEntry* pEntry = aEntryLst[nPos];
145 	aEntryLst.Remove(nPos, 1);
146 	ListBox::RemoveEntry(nPos);
147 
148 	// keine neuen Eintraege in die Liste mit aufnehmen
149 	if(pEntry->bNew)
150 		return;
151 
152 	// in DeleteListe eintragen
153 	aDelEntryLst.C40_INSERT(SvxBoxEntry, pEntry, aDelEntryLst.Count());
154 }
155 
156 /*--------------------------------------------------------------------
157 	 Beschreibung: Eintrag ueber konkretes Obkjekt loeschen
158  --------------------------------------------------------------------*/
159 
RemoveEntry(const SvxBoxEntry & rEntry)160 void SvxListBox::RemoveEntry(const SvxBoxEntry& rEntry)
161 {
162 	sal_uInt16 nPos = ListBox::GetEntryPos(rEntry.aName);
163 	RemoveEntry(nPos);
164 }
165 
166 /*--------------------------------------------------------------------
167 	 Beschreibung: Listen loeschen und Anzeige loeschen
168  --------------------------------------------------------------------*/
169 
Clear()170 void SvxListBox::Clear()
171 {
172 	ListBox::Clear();
173 	aEntryLst.DeleteAndDestroy(0, aEntryLst.Count());
174 	aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count());
175 }
176 
177 /*--------------------------------------------------------------------
178 	 Beschreibung: Position by Name
179  --------------------------------------------------------------------*/
180 
GetEntryPos(const SvxBoxEntry & rEntry) const181 sal_uInt16 SvxListBox::GetEntryPos(const SvxBoxEntry& rEntry) const
182 {
183 	return ListBox::GetEntryPos(rEntry.aName);
184 }
185 
186 /*--------------------------------------------------------------------
187 	 Beschreibung: Rund um die Entries
188  --------------------------------------------------------------------*/
189 
GetSvxBoxEntry(sal_uInt16 nPos) const190 const SvxBoxEntry& SvxListBox::GetSvxBoxEntry(sal_uInt16 nPos) const
191 {
192 	if(nPos < aEntryLst.Count())
193 		return *aEntryLst[nPos];
194 	else
195 		return aDefault;
196 }
197 
198 /*--------------------------------------------------------------------
199 	 Beschreibung: aktullen Eintrag zurueckgeben
200  --------------------------------------------------------------------*/
201 
GetSelectSvxBoxEntry(sal_uInt16 nSelId) const202 const SvxBoxEntry& SvxListBox::GetSelectSvxBoxEntry(sal_uInt16 nSelId) const
203 {
204 	String aName(ListBox::GetSelectEntry(nSelId));
205 
206 	if(aName.Len() > 0)
207 	{
208 		for (sal_uInt16 i=0; i < aEntryLst.Count(); i++)
209 		{
210 			if(aEntryLst[i]->aName == aName )
211 				return *aEntryLst[i];
212 		}
213 	}
214 	return aDefault;
215 }
216 
217 /*--------------------------------------------------------------------
218 	 Beschreibung: modifizierte Eintraege
219  --------------------------------------------------------------------*/
220 
GetModifiedCount() const221 sal_uInt16 SvxListBox::GetModifiedCount() const
222 {
223 	sal_uInt16 nMod  = 0;
224 	sal_uInt16 nSize = aEntryLst.Count();
225 	for(sal_uInt16 i=0; i < nSize; ++i)
226 	{	if(aEntryLst[i]->bModified)
227 			nMod++;
228 	}
229 	return nMod;
230 }
231 
232 /*--------------------------------------------------------------------
233 	 Beschreibung: Modifizierte Eintraege behandeln
234  --------------------------------------------------------------------*/
235 
ModifyEntry(sal_uInt16 nPos,const String & rName)236 void SvxListBox::ModifyEntry(sal_uInt16 nPos, const String& rName)
237 {
238 	if(nPos >= aEntryLst.Count())
239 		return;
240 
241 	SvxBoxEntry* pEntry = aEntryLst[nPos];
242 	aEntryLst.Remove(nPos, 1);
243 	aEntryLst[nPos]->aName 		= rName;
244 	aEntryLst[nPos]->bModified 	= sal_True;
245 	ListBox::RemoveEntry(nPos);
246 
247 	InsertSorted(pEntry);
248 }
249 
250 /*--------------------------------------------------------------------
251 	 Beschreibung: alle modifizierten Eintraege bahandeln
252  --------------------------------------------------------------------*/
253 
GetModifiedEntry(sal_uInt16 nPos) const254 const SvxBoxEntry& SvxListBox::GetModifiedEntry(sal_uInt16 nPos) const
255 {
256 	sal_uInt16 nSize = aEntryLst.Count();
257 	sal_uInt16 nMod  = 0;
258 	for(sal_uInt16 i=0; i < nSize; ++i)
259 	{	if(aEntryLst[i]->bModified)
260 		{	if(nMod == nPos)
261 				return *aEntryLst[i];
262 			nMod++;
263 		}
264 	}
265 	return aDefault;
266 }
267 
268 /*--------------------------------------------------------------------
269 	 Beschreibung: geloeschte Eintraege
270  --------------------------------------------------------------------*/
271 
GetRemovedCount() const272 sal_uInt16 SvxListBox::GetRemovedCount() const
273 {
274 	return aDelEntryLst.Count();
275 }
276 
277 
GetRemovedEntry(sal_uInt16 nPos) const278 const SvxBoxEntry& SvxListBox::GetRemovedEntry(sal_uInt16 nPos) const
279 {
280 	if(nPos < aDelEntryLst.Count())
281 		return *aDelEntryLst[nPos];
282 
283 	return aDefault;
284 }
285 
286 /*--------------------------------------------------------------------
287 	 Beschreibung: Neue Entries begutachten
288  --------------------------------------------------------------------*/
289 
GetNewCount() const290 sal_uInt16 SvxListBox::GetNewCount() const
291 {
292 	sal_uInt16 nNew = 0;
293 	sal_uInt16 nSize = aEntryLst.Count();
294 	for(sal_uInt16 i=0; i < nSize; ++i)
295 	{	if(aEntryLst[i]->bNew)
296 			nNew++;
297 	}
298 	return nNew;
299 }
300 
301 /*--------------------------------------------------------------------
302 	 Beschreibung:	Alle neuen Eintraege ueberpruefen
303  --------------------------------------------------------------------*/
304 
GetNewEntry(sal_uInt16 nPos) const305 const SvxBoxEntry& SvxListBox::GetNewEntry(sal_uInt16 nPos) const
306 {
307 	sal_uInt16 nSize = aEntryLst.Count();
308 	sal_uInt16 nNew  = 0;
309 	for(sal_uInt16 i=0; i < nSize; ++i)
310 	{	if(aEntryLst[i]->bNew)
311 		{	if(nNew == nPos)
312 				return *aEntryLst[i];
313 			nNew++;
314 		}
315 	}
316 	return aDefault;
317 }
318 
319 /*--------------------------------------------------------------------
320 	 Beschreibung: Sortiert einfuegen
321  --------------------------------------------------------------------*/
322 
InsertSorted(SvxBoxEntry * pEntry)323 void SvxListBox::InsertSorted(SvxBoxEntry* pEntry)
324 {
325 	ListBox::InsertEntry(pEntry->aName);
326 	sal_uInt16 nPos = ListBox::GetEntryPos(pEntry->aName);
327 	aEntryLst.C40_INSERT(SvxBoxEntry, pEntry, nPos);
328 }
329 
330 /*--------------------------------------------------------------------
331 	 Beschreibung: ComboBoxen mit Verwaltungseinheit
332  --------------------------------------------------------------------*/
333 
SvxComboBox(Window * pParent,WinBits nBits,sal_uInt16 nStyleBits)334 SvxComboBox::SvxComboBox(Window* pParent, WinBits nBits, sal_uInt16 nStyleBits) :
335 	ComboBox(pParent, nBits),
336 	nStyle(nStyleBits)
337 {
338 	InitComboBox();
339 }
340 
341 
SvxComboBox(Window * pParent,const ResId & rId,sal_uInt16 nStyleBits)342 SvxComboBox::SvxComboBox(Window* pParent, const ResId& rId, sal_uInt16 nStyleBits ):
343 	ComboBox(pParent, rId),
344 	nStyle(nStyleBits)
345 {
346 	InitComboBox();
347 }
348 
349 /*--------------------------------------------------------------------
350 	 Beschreibung: Basisklasse Dtor
351  --------------------------------------------------------------------*/
352 
~SvxComboBox()353 __EXPORT SvxComboBox::~SvxComboBox()
354 {
355 	aEntryLst.DeleteAndDestroy(0,	aEntryLst.Count());
356 	aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count());
357 }
358 
359 /*--------------------------------------------------------------------
360 	 Beschreibung: Evtl. Liste aus der Ressource beachten
361  --------------------------------------------------------------------*/
362 
InitComboBox()363 void SvxComboBox::InitComboBox()
364 {
365 	// Verwaltung fuer die Stringlist aus der Resource aufbauen
366 	sal_uInt16 nSize = GetEntryCount();
367 	for(sal_uInt16 i=0; i < nSize; ++i)
368 	{	const SvxBoxEntry* pTmp = new SvxBoxEntry(ComboBox::GetEntry(i), i);
369 		const SvxBoxEntry* &rpTmp = pTmp;
370 		aEntryLst.Insert(rpTmp, aEntryLst.Count());
371 	}
372 }
373 
374 /*--------------------------------------------------------------------
375 	 Beschreibung: neue Eintraege verwalten
376  --------------------------------------------------------------------*/
377 
InsertNewEntry(const SvxBoxEntry & rEntry)378 void SvxComboBox::InsertNewEntry(const SvxBoxEntry& rEntry)
379 {
380 	SvxBoxEntry* pNew = new SvxBoxEntry(rEntry);
381 	pNew->bNew = sal_True;
382 	InsertSorted(pNew);
383 }
384 
385 /*--------------------------------------------------------------------
386 	 Beschreibung: Eintrag in die ComboBox aufnehmen
387  --------------------------------------------------------------------*/
388 
InsertEntry(const SvxBoxEntry & rEntry)389 void SvxComboBox::InsertEntry(const SvxBoxEntry& rEntry)
390 {
391 	InsertSorted(new SvxBoxEntry(rEntry));
392 }
393 
394 /*--------------------------------------------------------------------
395 	 Beschreibung: Eintrag aus der Liste loeschen
396  --------------------------------------------------------------------*/
397 
RemoveEntry(sal_uInt16 nPos)398 void SvxComboBox::RemoveEntry(sal_uInt16 nPos)
399 {
400 	if(nPos >= aEntryLst.Count())
401 		return;
402 
403 	// Altes Element austragen
404 	SvxBoxEntry* pEntry = aEntryLst[nPos];
405 	aEntryLst.Remove(nPos, 1);
406 	ComboBox::RemoveEntry(nPos);
407 
408 	// keine neuen Eintraege in die Liste mit aufnehmen
409 	if(pEntry->bNew)
410 		return;
411 
412 	// in DeleteListe eintragen
413 	aDelEntryLst.C40_INSERT(SvxBoxEntry, pEntry, aDelEntryLst.Count());
414 }
415 
416 /*--------------------------------------------------------------------
417 	 Beschreibung: Eintrag ueber konkretes Obkjekt loeschen
418  --------------------------------------------------------------------*/
419 
RemoveEntry(const SvxBoxEntry & rEntry)420 void SvxComboBox::RemoveEntry(const SvxBoxEntry& rEntry)
421 {
422 	sal_uInt16 nPos = ComboBox::GetEntryPos(rEntry.aName);
423 	RemoveEntry(nPos);
424 }
425 
426 /*--------------------------------------------------------------------
427 	 Beschreibung: Listen loeschen und Anzeige loeschen
428  --------------------------------------------------------------------*/
429 
Clear()430 void SvxComboBox::Clear()
431 {
432 	ComboBox::Clear();
433 	aEntryLst.DeleteAndDestroy(0, aEntryLst.Count());
434 	aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count());
435 }
436 
437 
438 /*--------------------------------------------------------------------
439 	 Beschreibung: Position by Name
440  --------------------------------------------------------------------*/
441 
GetEntryPos(const SvxBoxEntry & rEntry) const442 sal_uInt16 SvxComboBox::GetEntryPos(const SvxBoxEntry& rEntry) const
443 {
444 	return ComboBox::GetEntryPos(rEntry.aName);
445 }
446 
447 /*--------------------------------------------------------------------
448 	 Beschreibung: Rund um die Entries
449  --------------------------------------------------------------------*/
450 
GetEntry(sal_uInt16 nPos) const451 const SvxBoxEntry& SvxComboBox::GetEntry(sal_uInt16 nPos) const
452 {
453 	if(nPos < aEntryLst.Count())
454 		return *aEntryLst[nPos];
455 	else
456 		return aDefault;
457 }
458 
459 /*--------------------------------------------------------------------
460 	 Beschreibung: modifizierte Eintraege
461  --------------------------------------------------------------------*/
462 
GetModifiedCount() const463 sal_uInt16 SvxComboBox::GetModifiedCount() const
464 {
465 	sal_uInt16 nMod  = 0;
466 	sal_uInt16 nSize = aEntryLst.Count();
467 	for(sal_uInt16 i=0; i < nSize; ++i)
468 	{	if(aEntryLst[i]->bModified)
469 			nMod++;
470 	}
471 	return nMod;
472 }
473 
474 /*--------------------------------------------------------------------
475 	 Beschreibung: Modifizierte Eintraege behandeln
476  --------------------------------------------------------------------*/
477 
ModifyEntry(sal_uInt16 nPos,const String & rName)478 void SvxComboBox::ModifyEntry(sal_uInt16 nPos, const String& rName)
479 {
480 	if(nPos >= aEntryLst.Count())
481 		return;
482 
483 	SvxBoxEntry* pEntry = aEntryLst[nPos];
484 	aEntryLst.Remove(nPos, 1);
485 	aEntryLst[nPos]->aName 		= rName;
486 	aEntryLst[nPos]->bModified 	= sal_True;
487 	ComboBox::RemoveEntry(nPos);
488 
489 	InsertSorted(pEntry);
490 }
491 
492 /*--------------------------------------------------------------------
493 	 Beschreibung: alle modifizierten Eintraege bahandeln
494  --------------------------------------------------------------------*/
495 
GetModifiedEntry(sal_uInt16 nPos) const496 const SvxBoxEntry& SvxComboBox::GetModifiedEntry(sal_uInt16 nPos) const
497 {
498 	sal_uInt16 nSize = aEntryLst.Count();
499 	sal_uInt16 nMod  = 0;
500 	for(sal_uInt16 i=0; i < nSize; ++i)
501 	{	if(aEntryLst[i]->bModified)
502 		{	if(nMod == nPos)
503 				return *aEntryLst[i];
504 			nMod++;
505 		}
506 	}
507 	return aDefault;
508 }
509 
510 /*--------------------------------------------------------------------
511 	 Beschreibung: geloeschte Eintraege
512  --------------------------------------------------------------------*/
513 
GetRemovedCount() const514 sal_uInt16 SvxComboBox::GetRemovedCount() const
515 {
516 	return aDelEntryLst.Count();
517 }
518 
519 
GetRemovedEntry(sal_uInt16 nPos) const520 const SvxBoxEntry& SvxComboBox::GetRemovedEntry(sal_uInt16 nPos) const
521 {
522 	if(nPos < aDelEntryLst.Count())
523 		return *aDelEntryLst[nPos];
524 
525 	return aDefault;
526 }
527 
528 /*--------------------------------------------------------------------
529 	 Beschreibung: Neue Entries begutachten
530  --------------------------------------------------------------------*/
531 
GetNewCount() const532 sal_uInt16 SvxComboBox::GetNewCount() const
533 {
534 	sal_uInt16 nNew = 0;
535 	sal_uInt16 nSize = aEntryLst.Count();
536 	for(sal_uInt16 i=0; i < nSize; ++i)
537 	{	if(aEntryLst[i]->bNew)
538 			nNew++;
539 	}
540 	return nNew;
541 }
542 
543 /*--------------------------------------------------------------------
544 	 Beschreibung:	Alle neuen Eintraege ueberpruefen
545  --------------------------------------------------------------------*/
546 
GetNewEntry(sal_uInt16 nPos) const547 const SvxBoxEntry& SvxComboBox::GetNewEntry(sal_uInt16 nPos) const
548 {
549 	sal_uInt16 nSize = aEntryLst.Count();
550 	sal_uInt16 nNew  = 0;
551 	for(sal_uInt16 i=0; i < nSize; ++i)
552 	{	if(aEntryLst[i]->bNew)
553 		{	if(nNew == nPos)
554 				return *aEntryLst[i];
555 			nNew++;
556 		}
557 	}
558 	return aDefault;
559 }
560 
561 /*--------------------------------------------------------------------
562 	 Beschreibung: Sortiert einfuegen
563  --------------------------------------------------------------------*/
564 
InsertSorted(SvxBoxEntry * pEntry)565 void SvxComboBox::InsertSorted(SvxBoxEntry* pEntry)
566 {
567 	ComboBox::InsertEntry(pEntry->aName);
568 	sal_uInt16 nPos = ComboBox::GetEntryPos(pEntry->aName);
569 	aEntryLst.C40_INSERT(SvxBoxEntry, pEntry, nPos);
570 }
571 
572 
573 /*--------------------------------------------------------------------
574 	Beschreibung: Je nach Option bestimmte Zeichen ausblenden
575  --------------------------------------------------------------------*/
576 
KeyInput(const KeyEvent & rKEvt)577 void __EXPORT SvxComboBox::KeyInput( const KeyEvent& rKEvt )
578 {
579 	sal_Unicode cChar = rKEvt.GetCharCode();
580 
581 	if(nStyle & SVX_CBS_FILENAME)
582 	{
583 #if defined UNX
584 		if( cChar == sal_Unicode( '/' ) || cChar == sal_Unicode( ' ' ) )
585 			return;
586 #else
587 		if( cChar == sal_Unicode( ':' ) || cChar == sal_Unicode( '\\' ) ||
588 			cChar == sal_Unicode( '.' ) || cChar == sal_Unicode( ' ' ) )
589 			return;
590 #endif
591 	}
592 	ComboBox::KeyInput(rKEvt);
593 }
594 
595 /*--------------------------------------------------------------------
596 	Beschreibung: Text nach Option konvertieren
597  --------------------------------------------------------------------*/
598 
GetText() const599 String SvxComboBox::GetText() const
600 {
601 	String aTxt(ComboBox::GetText());
602 	CharClass aCharClass( Application::GetSettings().GetLocale() );
603 
604 	if(nStyle & SVX_CBS_LOWER)
605 		return aCharClass.lower(aTxt);
606 
607 	if(nStyle & SVX_CBS_UPPER)
608 		return aCharClass.upper(aTxt);
609 
610 	return aTxt;
611 }
612 
613 
614