blob: 521a21f36c6de870ed0f28a715ca9b967a5bcaea [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_sw.hxx"
#include "switerator.hxx"
#include "editsh.hxx"
#include "doc.hxx"
#include <docary.hxx>
#include <fmtfld.hxx>
#include <txtfld.hxx>
#include "edimp.hxx"
#include "expfld.hxx"
#include "pam.hxx"
#include "docfld.hxx"
#include "ndtxt.hxx"
/*--------------------------------------------------------------------
Beschreibung: Sortieren der Input-Eintraege
--------------------------------------------------------------------*/
SwInputFieldList::SwInputFieldList( SwEditShell* pShell, sal_Bool bBuildTmpLst )
: pSh(pShell)
{
// Hier die Liste aller Eingabefelder sortiert erstellen
pSrtLst = new _SetGetExpFlds();
const SwFldTypes& rFldTypes = *pSh->GetDoc()->GetFldTypes();
const sal_uInt16 nSize = rFldTypes.Count();
// Alle Typen abklappern
for(sal_uInt16 i=0; i < nSize; ++i)
{
SwFieldType* pFldType = (SwFieldType*)rFldTypes[ i ];
sal_uInt16 nType = pFldType->Which();
if( RES_SETEXPFLD == nType || RES_INPUTFLD == nType || RES_DROPDOWN == nType )
{
SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
{
const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
// nur InputFields und interaktive SetExpFlds bearbeiten
// and DropDown fields
if( !pTxtFld || ( RES_SETEXPFLD == nType &&
!((SwSetExpField*)pFmtFld->GetField())->GetInputFlag()))
continue;
const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
if( rTxtNode.GetNodes().IsDocNodes() )
{
if( bBuildTmpLst )
{
VoidPtr pTmp = (VoidPtr)pTxtFld;
aTmpLst.Insert( pTmp, aTmpLst.Count() );
}
else
{
SwNodeIndex aIdx( rTxtNode );
_SetGetExpFld* pNew = new _SetGetExpFld(aIdx, pTxtFld );
pSrtLst->Insert( pNew );
}
}
}
}
}
}
SwInputFieldList::~SwInputFieldList()
{
delete pSrtLst;
}
/*--------------------------------------------------------------------
Beschreibung: Felder aus der Liste in sortierter Reihenfolge
--------------------------------------------------------------------*/
sal_uInt16 SwInputFieldList::Count() const
{
return pSrtLst->Count();
}
SwField* SwInputFieldList::GetField(sal_uInt16 nId)
{
const SwTxtFld* pTxtFld = (*pSrtLst)[ nId ]->GetTxtFld();
ASSERT( pTxtFld, "kein TextFld" );
return (SwField*)pTxtFld->GetFmtFld().GetField();
}
/*--------------------------------------------------------------------
Beschreibung: Cursor sichern
--------------------------------------------------------------------*/
void SwInputFieldList::PushCrsr()
{
pSh->Push();
pSh->ClearMark();
}
void SwInputFieldList::PopCrsr()
{
pSh->Pop(sal_False);
}
/*--------------------------------------------------------------------
Beschreibung: Position eines Feldes ansteuern
--------------------------------------------------------------------*/
void SwInputFieldList::GotoFieldPos(sal_uInt16 nId)
{
pSh->StartAllAction();
(*pSrtLst)[ nId ]->GetPosOfContent( *pSh->GetCrsr()->GetPoint() );
pSh->EndAllAction();
}
// vergleiche TmpLst mit akt Feldern. Alle neue kommen in die SortLst
// damit sie geupdatet werden koennen. Returnt die Anzahl.
// (Fuer Textbausteine: nur seine Input-Felder aktualisieren)
sal_uInt16 SwInputFieldList::BuildSortLst()
{
const SwFldTypes& rFldTypes = *pSh->GetDoc()->GetFldTypes();
sal_uInt16 nSize = rFldTypes.Count();
// Alle Typen abklappern
for( sal_uInt16 i = 0; i < nSize; ++i )
{
SwFieldType* pFldType = (SwFieldType*)rFldTypes[ i ];
sal_uInt16 nType = pFldType->Which();
if( RES_SETEXPFLD == nType || RES_INPUTFLD == nType )
{
SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
{
const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
// nur InputFields und interaktive SetExpFlds bearbeiten
if( !pTxtFld || ( RES_SETEXPFLD == nType &&
!((SwSetExpField*)pFmtFld->GetField())->GetInputFlag()))
continue;
const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
if( rTxtNode.GetNodes().IsDocNodes() )
{
VoidPtr pTmp = (VoidPtr)pTxtFld;
// nicht in der TempListe vorhanden, also in die SortListe
// aufnehemen
sal_uInt16 nFndPos = aTmpLst.GetPos( pTmp );
if( USHRT_MAX == nFndPos )
{
SwNodeIndex aIdx( rTxtNode );
_SetGetExpFld* pNew = new _SetGetExpFld(aIdx, pTxtFld );
pSrtLst->Insert( pNew );
}
else
aTmpLst.Remove( nFndPos );
}
}
}
}
// die Pointer werden nicht mehr gebraucht
aTmpLst.Remove( 0, aTmpLst.Count() );
return pSrtLst->Count();
}
/*--------------------------------------------------------------------
Beschreibung: Alle Felder auáerhalb von Selektionen aus Liste entfernen
--------------------------------------------------------------------*/
void SwInputFieldList::RemoveUnselectedFlds()
{
_SetGetExpFlds* pNewLst = new _SetGetExpFlds();
FOREACHPAM_START(pSh)
{
for (sal_uInt16 i = 0; i < Count();)
{
_SetGetExpFld* pFld = (*pSrtLst)[i];
SwPosition aPos(*PCURCRSR->GetPoint());
pFld->GetPos( aPos );
if (aPos >= *PCURCRSR->Start() && aPos < *PCURCRSR->End())
{
// Feld innerhalb der Selektion
pNewLst->Insert( (*pSrtLst)[i] );
pSrtLst->Remove(i, 1);
}
else
i++;
}
}
FOREACHPAM_END()
delete pSrtLst;
pSrtLst = pNewLst;
}