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