| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_svtools.hxx" |
| #include <tools/debug.hxx> |
| #include <vcl/svapp.hxx> |
| #include <svtools/svxbox.hxx> |
| #include <unotools/charclass.hxx> |
| |
| // ----------------------------------------------------------------------- |
| |
| SV_IMPL_PTRARR(SvxEntryLst, SvxBoxEntry*) |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Ein ListboxElement |
| --------------------------------------------------------------------*/ |
| |
| SvxBoxEntry::SvxBoxEntry() : |
| nId(LISTBOX_ENTRY_NOTFOUND), |
| bModified(sal_False), |
| bNew(sal_False) |
| { |
| } |
| |
| |
| SvxBoxEntry::SvxBoxEntry(const String& aNam, sal_uInt16 nIdx) : |
| aName(aNam), |
| nId(nIdx), |
| bModified(sal_False), |
| bNew(sal_False) |
| { |
| } |
| |
| |
| SvxBoxEntry::SvxBoxEntry(const SvxBoxEntry& rOld) : |
| aName(rOld.aName), |
| nId(rOld.nId), |
| bModified(rOld.bModified), |
| bNew(rOld.bNew) |
| { |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| SvxListBox::SvxListBox(Window* pParent, WinBits nBits) : |
| ListBox(pParent, nBits) |
| { |
| InitListBox(); |
| } |
| |
| |
| SvxListBox::SvxListBox(Window* pParent, const ResId& rId): |
| ListBox(pParent, rId) |
| { |
| InitListBox(); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Basisklasse Dtor |
| --------------------------------------------------------------------*/ |
| |
| __EXPORT SvxListBox::~SvxListBox() |
| { |
| aEntryLst.DeleteAndDestroy(0, aEntryLst.Count()); |
| aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count()); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Evtl. Liste aus der Ressource beachten |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::InitListBox() |
| { |
| // Verwaltung fuer die Stringlist aus der Resource aufbauen |
| sal_uInt16 nSize = GetEntryCount(); |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { const SvxBoxEntry* pTmp = new SvxBoxEntry(ListBox::GetEntry(i), i); |
| const SvxBoxEntry* &rpTmp = pTmp; |
| aEntryLst.Insert(rpTmp, aEntryLst.Count()); |
| } |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: neue Eintraege verwalten |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::InsertNewEntry(const SvxBoxEntry& rEntry) |
| { |
| SvxBoxEntry* pNew = new SvxBoxEntry(rEntry); |
| pNew->bNew = sal_True; |
| InsertSorted(pNew); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Eintrag in die ListBox aufnehmen |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::InsertEntry(const SvxBoxEntry& rEntry, sal_uInt16 nPos) |
| { |
| if(nPos != LISTBOX_ENTRY_NOTFOUND) |
| { |
| SvxBoxEntry* pEntry = new SvxBoxEntry(rEntry); |
| ListBox::InsertEntry(pEntry->aName, nPos); |
| //const SvxBoxEntry* &rpEntry = pEntry; |
| aEntryLst.C40_INSERT(SvxBoxEntry, pEntry, nPos); |
| } |
| else |
| InsertSorted(new SvxBoxEntry(rEntry)); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Eintrag aus der Liste loeschen |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::RemoveEntry(sal_uInt16 nPos) |
| { |
| if(nPos >= aEntryLst.Count()) |
| return; |
| |
| // Altes Element austragen |
| SvxBoxEntry* pEntry = aEntryLst[nPos]; |
| aEntryLst.Remove(nPos, 1); |
| ListBox::RemoveEntry(nPos); |
| |
| // keine neuen Eintraege in die Liste mit aufnehmen |
| if(pEntry->bNew) |
| return; |
| |
| // in DeleteListe eintragen |
| aDelEntryLst.C40_INSERT(SvxBoxEntry, pEntry, aDelEntryLst.Count()); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Eintrag ueber konkretes Obkjekt loeschen |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::RemoveEntry(const SvxBoxEntry& rEntry) |
| { |
| sal_uInt16 nPos = ListBox::GetEntryPos(rEntry.aName); |
| RemoveEntry(nPos); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Listen loeschen und Anzeige loeschen |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::Clear() |
| { |
| ListBox::Clear(); |
| aEntryLst.DeleteAndDestroy(0, aEntryLst.Count()); |
| aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count()); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Position by Name |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxListBox::GetEntryPos(const SvxBoxEntry& rEntry) const |
| { |
| return ListBox::GetEntryPos(rEntry.aName); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Rund um die Entries |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxListBox::GetSvxBoxEntry(sal_uInt16 nPos) const |
| { |
| if(nPos < aEntryLst.Count()) |
| return *aEntryLst[nPos]; |
| else |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: aktullen Eintrag zurueckgeben |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxListBox::GetSelectSvxBoxEntry(sal_uInt16 nSelId) const |
| { |
| String aName(ListBox::GetSelectEntry(nSelId)); |
| |
| if(aName.Len() > 0) |
| { |
| for (sal_uInt16 i=0; i < aEntryLst.Count(); i++) |
| { |
| if(aEntryLst[i]->aName == aName ) |
| return *aEntryLst[i]; |
| } |
| } |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: modifizierte Eintraege |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxListBox::GetModifiedCount() const |
| { |
| sal_uInt16 nMod = 0; |
| sal_uInt16 nSize = aEntryLst.Count(); |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bModified) |
| nMod++; |
| } |
| return nMod; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Modifizierte Eintraege behandeln |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::ModifyEntry(sal_uInt16 nPos, const String& rName) |
| { |
| if(nPos >= aEntryLst.Count()) |
| return; |
| |
| SvxBoxEntry* pEntry = aEntryLst[nPos]; |
| aEntryLst.Remove(nPos, 1); |
| aEntryLst[nPos]->aName = rName; |
| aEntryLst[nPos]->bModified = sal_True; |
| ListBox::RemoveEntry(nPos); |
| |
| InsertSorted(pEntry); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: alle modifizierten Eintraege bahandeln |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxListBox::GetModifiedEntry(sal_uInt16 nPos) const |
| { |
| sal_uInt16 nSize = aEntryLst.Count(); |
| sal_uInt16 nMod = 0; |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bModified) |
| { if(nMod == nPos) |
| return *aEntryLst[i]; |
| nMod++; |
| } |
| } |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: geloeschte Eintraege |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxListBox::GetRemovedCount() const |
| { |
| return aDelEntryLst.Count(); |
| } |
| |
| |
| const SvxBoxEntry& SvxListBox::GetRemovedEntry(sal_uInt16 nPos) const |
| { |
| if(nPos < aDelEntryLst.Count()) |
| return *aDelEntryLst[nPos]; |
| |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Neue Entries begutachten |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxListBox::GetNewCount() const |
| { |
| sal_uInt16 nNew = 0; |
| sal_uInt16 nSize = aEntryLst.Count(); |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bNew) |
| nNew++; |
| } |
| return nNew; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Alle neuen Eintraege ueberpruefen |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxListBox::GetNewEntry(sal_uInt16 nPos) const |
| { |
| sal_uInt16 nSize = aEntryLst.Count(); |
| sal_uInt16 nNew = 0; |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bNew) |
| { if(nNew == nPos) |
| return *aEntryLst[i]; |
| nNew++; |
| } |
| } |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Sortiert einfuegen |
| --------------------------------------------------------------------*/ |
| |
| void SvxListBox::InsertSorted(SvxBoxEntry* pEntry) |
| { |
| ListBox::InsertEntry(pEntry->aName); |
| sal_uInt16 nPos = ListBox::GetEntryPos(pEntry->aName); |
| aEntryLst.C40_INSERT(SvxBoxEntry, pEntry, nPos); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: ComboBoxen mit Verwaltungseinheit |
| --------------------------------------------------------------------*/ |
| |
| SvxComboBox::SvxComboBox(Window* pParent, WinBits nBits, sal_uInt16 nStyleBits) : |
| ComboBox(pParent, nBits), |
| nStyle(nStyleBits) |
| { |
| InitComboBox(); |
| } |
| |
| |
| SvxComboBox::SvxComboBox(Window* pParent, const ResId& rId, sal_uInt16 nStyleBits ): |
| ComboBox(pParent, rId), |
| nStyle(nStyleBits) |
| { |
| InitComboBox(); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Basisklasse Dtor |
| --------------------------------------------------------------------*/ |
| |
| __EXPORT SvxComboBox::~SvxComboBox() |
| { |
| aEntryLst.DeleteAndDestroy(0, aEntryLst.Count()); |
| aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count()); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Evtl. Liste aus der Ressource beachten |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::InitComboBox() |
| { |
| // Verwaltung fuer die Stringlist aus der Resource aufbauen |
| sal_uInt16 nSize = GetEntryCount(); |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { const SvxBoxEntry* pTmp = new SvxBoxEntry(ComboBox::GetEntry(i), i); |
| const SvxBoxEntry* &rpTmp = pTmp; |
| aEntryLst.Insert(rpTmp, aEntryLst.Count()); |
| } |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: neue Eintraege verwalten |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::InsertNewEntry(const SvxBoxEntry& rEntry) |
| { |
| SvxBoxEntry* pNew = new SvxBoxEntry(rEntry); |
| pNew->bNew = sal_True; |
| InsertSorted(pNew); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Eintrag in die ComboBox aufnehmen |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::InsertEntry(const SvxBoxEntry& rEntry) |
| { |
| InsertSorted(new SvxBoxEntry(rEntry)); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Eintrag aus der Liste loeschen |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::RemoveEntry(sal_uInt16 nPos) |
| { |
| if(nPos >= aEntryLst.Count()) |
| return; |
| |
| // Altes Element austragen |
| SvxBoxEntry* pEntry = aEntryLst[nPos]; |
| aEntryLst.Remove(nPos, 1); |
| ComboBox::RemoveEntry(nPos); |
| |
| // keine neuen Eintraege in die Liste mit aufnehmen |
| if(pEntry->bNew) |
| return; |
| |
| // in DeleteListe eintragen |
| aDelEntryLst.C40_INSERT(SvxBoxEntry, pEntry, aDelEntryLst.Count()); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Eintrag ueber konkretes Obkjekt loeschen |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::RemoveEntry(const SvxBoxEntry& rEntry) |
| { |
| sal_uInt16 nPos = ComboBox::GetEntryPos(rEntry.aName); |
| RemoveEntry(nPos); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Listen loeschen und Anzeige loeschen |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::Clear() |
| { |
| ComboBox::Clear(); |
| aEntryLst.DeleteAndDestroy(0, aEntryLst.Count()); |
| aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count()); |
| } |
| |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Position by Name |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxComboBox::GetEntryPos(const SvxBoxEntry& rEntry) const |
| { |
| return ComboBox::GetEntryPos(rEntry.aName); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Rund um die Entries |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxComboBox::GetEntry(sal_uInt16 nPos) const |
| { |
| if(nPos < aEntryLst.Count()) |
| return *aEntryLst[nPos]; |
| else |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: modifizierte Eintraege |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxComboBox::GetModifiedCount() const |
| { |
| sal_uInt16 nMod = 0; |
| sal_uInt16 nSize = aEntryLst.Count(); |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bModified) |
| nMod++; |
| } |
| return nMod; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Modifizierte Eintraege behandeln |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::ModifyEntry(sal_uInt16 nPos, const String& rName) |
| { |
| if(nPos >= aEntryLst.Count()) |
| return; |
| |
| SvxBoxEntry* pEntry = aEntryLst[nPos]; |
| aEntryLst.Remove(nPos, 1); |
| aEntryLst[nPos]->aName = rName; |
| aEntryLst[nPos]->bModified = sal_True; |
| ComboBox::RemoveEntry(nPos); |
| |
| InsertSorted(pEntry); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: alle modifizierten Eintraege bahandeln |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxComboBox::GetModifiedEntry(sal_uInt16 nPos) const |
| { |
| sal_uInt16 nSize = aEntryLst.Count(); |
| sal_uInt16 nMod = 0; |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bModified) |
| { if(nMod == nPos) |
| return *aEntryLst[i]; |
| nMod++; |
| } |
| } |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: geloeschte Eintraege |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxComboBox::GetRemovedCount() const |
| { |
| return aDelEntryLst.Count(); |
| } |
| |
| |
| const SvxBoxEntry& SvxComboBox::GetRemovedEntry(sal_uInt16 nPos) const |
| { |
| if(nPos < aDelEntryLst.Count()) |
| return *aDelEntryLst[nPos]; |
| |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Neue Entries begutachten |
| --------------------------------------------------------------------*/ |
| |
| sal_uInt16 SvxComboBox::GetNewCount() const |
| { |
| sal_uInt16 nNew = 0; |
| sal_uInt16 nSize = aEntryLst.Count(); |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bNew) |
| nNew++; |
| } |
| return nNew; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Alle neuen Eintraege ueberpruefen |
| --------------------------------------------------------------------*/ |
| |
| const SvxBoxEntry& SvxComboBox::GetNewEntry(sal_uInt16 nPos) const |
| { |
| sal_uInt16 nSize = aEntryLst.Count(); |
| sal_uInt16 nNew = 0; |
| for(sal_uInt16 i=0; i < nSize; ++i) |
| { if(aEntryLst[i]->bNew) |
| { if(nNew == nPos) |
| return *aEntryLst[i]; |
| nNew++; |
| } |
| } |
| return aDefault; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Sortiert einfuegen |
| --------------------------------------------------------------------*/ |
| |
| void SvxComboBox::InsertSorted(SvxBoxEntry* pEntry) |
| { |
| ComboBox::InsertEntry(pEntry->aName); |
| sal_uInt16 nPos = ComboBox::GetEntryPos(pEntry->aName); |
| aEntryLst.C40_INSERT(SvxBoxEntry, pEntry, nPos); |
| } |
| |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Je nach Option bestimmte Zeichen ausblenden |
| --------------------------------------------------------------------*/ |
| |
| void __EXPORT SvxComboBox::KeyInput( const KeyEvent& rKEvt ) |
| { |
| sal_Unicode cChar = rKEvt.GetCharCode(); |
| |
| if(nStyle & SVX_CBS_FILENAME) |
| { |
| #if defined UNX |
| if( cChar == sal_Unicode( '/' ) || cChar == sal_Unicode( ' ' ) ) |
| return; |
| #else |
| if( cChar == sal_Unicode( ':' ) || cChar == sal_Unicode( '\\' ) || |
| cChar == sal_Unicode( '.' ) || cChar == sal_Unicode( ' ' ) ) |
| return; |
| #endif |
| } |
| ComboBox::KeyInput(rKEvt); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Text nach Option konvertieren |
| --------------------------------------------------------------------*/ |
| |
| String SvxComboBox::GetText() const |
| { |
| String aTxt(ComboBox::GetText()); |
| CharClass aCharClass( Application::GetSettings().GetLocale() ); |
| |
| if(nStyle & SVX_CBS_LOWER) |
| return aCharClass.lower(aTxt); |
| |
| if(nStyle & SVX_CBS_UPPER) |
| return aCharClass.upper(aTxt); |
| |
| return aTxt; |
| } |
| |
| |