xref: /AOO41X/main/sw/source/core/fields/fldlst.cxx (revision 8e8ee8fefdac26d905672cc573c35fd0ae1f9356)
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_sw.hxx"
26 
27 #include "switerator.hxx"
28 #include "editsh.hxx"
29 #include "doc.hxx"
30 #include <docary.hxx>
31 #include <fmtfld.hxx>
32 #include <txtfld.hxx>
33 #include "edimp.hxx"
34 #include "expfld.hxx"
35 #include "pam.hxx"
36 #include "docfld.hxx"
37 #include "ndtxt.hxx"
38 
39 
40 /*--------------------------------------------------------------------
41     Beschreibung: Sortieren der Input-Eintraege
42  --------------------------------------------------------------------*/
43 
SwInputFieldList(SwEditShell * pShell,sal_Bool bBuildTmpLst)44 SwInputFieldList::SwInputFieldList( SwEditShell* pShell, sal_Bool bBuildTmpLst )
45     : pSh(pShell)
46 {
47     // Hier die Liste aller Eingabefelder sortiert erstellen
48     pSrtLst = new _SetGetExpFlds();
49 
50     const SwFldTypes& rFldTypes = *pSh->GetDoc()->GetFldTypes();
51     const sal_uInt16 nSize = rFldTypes.Count();
52 
53     // Alle Typen abklappern
54 
55     for(sal_uInt16 i=0; i < nSize; ++i)
56     {
57         SwFieldType* pFldType = (SwFieldType*)rFldTypes[ i ];
58         sal_uInt16 nType = pFldType->Which();
59 
60         if( RES_SETEXPFLD == nType || RES_INPUTFLD == nType || RES_DROPDOWN == nType )
61         {
62             SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
63             for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
64             {
65                 const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
66 
67                 //  nur InputFields und interaktive SetExpFlds bearbeiten
68                 //  and DropDown fields
69                 if( !pTxtFld || ( RES_SETEXPFLD == nType &&
70                     !((SwSetExpField*)pFmtFld->GetField())->GetInputFlag()))
71                     continue;
72 
73                 const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
74                 if( rTxtNode.GetNodes().IsDocNodes() )
75                 {
76                     if( bBuildTmpLst )
77                     {
78                         VoidPtr pTmp = (VoidPtr)pTxtFld;
79                         aTmpLst.Insert( pTmp, aTmpLst.Count() );
80                     }
81                     else
82                     {
83                         SwNodeIndex aIdx( rTxtNode );
84                         _SetGetExpFld* pNew = new _SetGetExpFld(aIdx, pTxtFld );
85                         pSrtLst->Insert( pNew );
86                     }
87                 }
88             }
89         }
90     }
91 }
92 
~SwInputFieldList()93 SwInputFieldList::~SwInputFieldList()
94 {
95     delete pSrtLst;
96 }
97 
98 /*--------------------------------------------------------------------
99     Beschreibung: Felder aus der Liste in sortierter Reihenfolge
100  --------------------------------------------------------------------*/
101 
Count() const102 sal_uInt16 SwInputFieldList::Count() const
103 {
104     return pSrtLst->Count();
105 }
106 
107 
GetField(sal_uInt16 nId)108 SwField* SwInputFieldList::GetField(sal_uInt16 nId)
109 {
110     const SwTxtFld* pTxtFld = (*pSrtLst)[ nId ]->GetTxtFld();
111     ASSERT( pTxtFld, "kein TextFld" );
112     return (SwField*)pTxtFld->GetFmtFld().GetField();
113 }
114 
115 /*--------------------------------------------------------------------
116     Beschreibung: Cursor sichern
117  --------------------------------------------------------------------*/
118 
PushCrsr()119 void SwInputFieldList::PushCrsr()
120 {
121     pSh->Push();
122     pSh->ClearMark();
123 }
124 
PopCrsr()125 void SwInputFieldList::PopCrsr()
126 {
127     pSh->Pop(sal_False);
128 }
129 
130 /*--------------------------------------------------------------------
131     Beschreibung: Position eines Feldes ansteuern
132  --------------------------------------------------------------------*/
133 
GotoFieldPos(sal_uInt16 nId)134 void SwInputFieldList::GotoFieldPos(sal_uInt16 nId)
135 {
136     pSh->StartAllAction();
137     (*pSrtLst)[ nId ]->GetPosOfContent( *pSh->GetCrsr()->GetPoint() );
138     pSh->EndAllAction();
139 }
140 
141     // vergleiche TmpLst mit akt Feldern. Alle neue kommen in die SortLst
142     // damit sie geupdatet werden koennen. Returnt die Anzahl.
143     // (Fuer Textbausteine: nur seine Input-Felder aktualisieren)
BuildSortLst()144 sal_uInt16 SwInputFieldList::BuildSortLst()
145 {
146     const SwFldTypes& rFldTypes = *pSh->GetDoc()->GetFldTypes();
147     sal_uInt16 nSize = rFldTypes.Count();
148 
149     // Alle Typen abklappern
150 
151     for( sal_uInt16 i = 0; i < nSize; ++i )
152     {
153         SwFieldType* pFldType = (SwFieldType*)rFldTypes[ i ];
154         sal_uInt16 nType = pFldType->Which();
155 
156         if( RES_SETEXPFLD == nType || RES_INPUTFLD == nType )
157         {
158             SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
159             for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
160             {
161                 const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
162 
163                 //  nur InputFields und interaktive SetExpFlds bearbeiten
164                 if( !pTxtFld || ( RES_SETEXPFLD == nType &&
165                     !((SwSetExpField*)pFmtFld->GetField())->GetInputFlag()))
166                     continue;
167 
168                 const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
169                 if( rTxtNode.GetNodes().IsDocNodes() )
170                 {
171                     VoidPtr pTmp = (VoidPtr)pTxtFld;
172                     // nicht in der TempListe vorhanden, also in die SortListe
173                     // aufnehemen
174                     sal_uInt16 nFndPos = aTmpLst.GetPos( pTmp );
175                     if( USHRT_MAX == nFndPos )
176                     {
177                         SwNodeIndex aIdx( rTxtNode );
178                         _SetGetExpFld* pNew = new _SetGetExpFld(aIdx, pTxtFld );
179                         pSrtLst->Insert( pNew );
180                     }
181                     else
182                         aTmpLst.Remove( nFndPos );
183                 }
184             }
185         }
186     }
187 
188     // die Pointer werden nicht mehr gebraucht
189     aTmpLst.Remove( 0, aTmpLst.Count() );
190     return pSrtLst->Count();
191 }
192 
193 /*--------------------------------------------------------------------
194     Beschreibung: Alle Felder au�erhalb von Selektionen aus Liste entfernen
195  --------------------------------------------------------------------*/
196 
RemoveUnselectedFlds()197 void SwInputFieldList::RemoveUnselectedFlds()
198 {
199     _SetGetExpFlds* pNewLst = new _SetGetExpFlds();
200 
201     FOREACHPAM_START(pSh)
202     {
203         for (sal_uInt16 i = 0; i < Count();)
204         {
205             _SetGetExpFld* pFld = (*pSrtLst)[i];
206             SwPosition aPos(*PCURCRSR->GetPoint());
207 
208             pFld->GetPos( aPos );
209 
210             if (aPos >= *PCURCRSR->Start() && aPos < *PCURCRSR->End())
211             {
212                 // Feld innerhalb der Selektion
213                 pNewLst->Insert( (*pSrtLst)[i] );
214                 pSrtLst->Remove(i, 1);
215             }
216             else
217                 i++;
218         }
219     }
220     FOREACHPAM_END()
221 
222     delete pSrtLst;
223     pSrtLst = pNewLst;
224 }
225 
226 
227