blob: d777296c84f12619c6eb7889d14c63deec6528b5 [file] [log] [blame]
/**************************************************************
*
* 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;
}