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