1*1ecadb57SMathias Bauer<?xml version="1.0" encoding="UTF-8"?>
2*1ecadb57SMathias Bauer<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
3*1ecadb57SMathias Bauer<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Validate" script:language="StarBasic">
4*1ecadb57SMathias Bauer&apos;############################################
5*1ecadb57SMathias Bauer&apos;  VALIDATION ROUTINES
6*1ecadb57SMathias Bauer&apos;
7*1ecadb57SMathias Bauer&apos;  May, 19 2004 - fpe
8*1ecadb57SMathias Bauer&apos;############################################
9*1ecadb57SMathias Bauer
10*1ecadb57SMathias BauerDim sSwitchType As String
11*1ecadb57SMathias BauerDim sCellSwitchType As String
12*1ecadb57SMathias BauerDim sCaseType As String
13*1ecadb57SMathias BauerDim sCellCaseType As String
14*1ecadb57SMathias BauerDim sDefaultType As String
15*1ecadb57SMathias BauerDim sCellDefaultType As String
16*1ecadb57SMathias BauerDim bDefaultSet As Boolean
17*1ecadb57SMathias BauerDim bCellDefaultSet As Boolean
18*1ecadb57SMathias BauerDim bCaseSet As Boolean
19*1ecadb57SMathias BauerDim bCellCaseSet As Boolean
20*1ecadb57SMathias BauerDim aTagsOpen(0) As String
21*1ecadb57SMathias BauerDim aCellTagsOpen(0) As String
22*1ecadb57SMathias BauerDim bWarn As Boolean
23*1ecadb57SMathias BauerDim bWarnEmptyPara As Boolean
24*1ecadb57SMathias BauerDim bWarnParaNoID As Boolean
25*1ecadb57SMathias Bauer
26*1ecadb57SMathias Bauer
27*1ecadb57SMathias BauerSub ValidateXHP
28*1ecadb57SMathias Bauer	Validate
29*1ecadb57SMathias BauerEnd Sub
30*1ecadb57SMathias Bauer
31*1ecadb57SMathias BauerSub Validate
32*1ecadb57SMathias Bauer
33*1ecadb57SMathias Bauer	If not IsHelpFile Then
34*1ecadb57SMathias Bauer		msgbox(strErr_NoHelpFile)
35*1ecadb57SMathias Bauer		Exit Sub
36*1ecadb57SMathias Bauer	End If
37*1ecadb57SMathias Bauer
38*1ecadb57SMathias Bauer	oDoc = StarDesktop.CurrentComponent
39*1ecadb57SMathias Bauer	sSwitchType = &quot;&quot;
40*1ecadb57SMathias Bauer	sCaseType = &quot;&quot;
41*1ecadb57SMathias Bauer	sDefaultType = &quot;&quot;
42*1ecadb57SMathias Bauer	bWarn = TRUE
43*1ecadb57SMathias Bauer	bWarnEmptyPara = TRUE
44*1ecadb57SMathias Bauer	bWarnParaNoID = TRUE
45*1ecadb57SMathias Bauer
46*1ecadb57SMathias Bauer	CheckMetaData(oDoc)
47*1ecadb57SMathias Bauer	CheckHeading(oDoc)
48*1ecadb57SMathias Bauer
49*1ecadb57SMathias Bauer	Enum = oDoc.Text.createEnumeration
50*1ecadb57SMathias Bauer	Do While Enum.hasMoreElements
51*1ecadb57SMathias Bauer
52*1ecadb57SMathias Bauer		TextElement = Enum.nextElement
53*1ecadb57SMathias Bauer		If TextElement.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then		&apos; we are a paragraph
54*1ecadb57SMathias Bauer
55*1ecadb57SMathias Bauer			CheckSwitches(TextElement)
56*1ecadb57SMathias Bauer			CheckParaID(TextElement)
57*1ecadb57SMathias Bauer			CheckParaFormat(TextElement)
58*1ecadb57SMathias Bauer			CheckTags(TextElement)
59*1ecadb57SMathias Bauer			CheckInlineTags(TextElement)
60*1ecadb57SMathias Bauer
61*1ecadb57SMathias Bauer		ElseIf	TextElement.supportsService(&quot;com.sun.star.text.TextTable&quot;) Then
62*1ecadb57SMathias Bauer
63*1ecadb57SMathias Bauer			If sSwitchType &lt;&gt; &quot;&quot; AND (sCaseType = &quot;&quot; AND sDefaultType = &quot;&quot;) Then &apos;&lt;------
64*1ecadb57SMathias Bauer				Terminate(&quot;Switch must be closed or case/default must be opened before a table starts.&quot;,tmpCellElement)
65*1ecadb57SMathias Bauer			End If
66*1ecadb57SMathias Bauer
67*1ecadb57SMathias Bauer			CheckCell(TextElement)
68*1ecadb57SMathias Bauer		End If
69*1ecadb57SMathias Bauer	Loop
70*1ecadb57SMathias Bauer
71*1ecadb57SMathias Bauer	If sCaseType &lt;&gt; &quot;&quot; Then
72*1ecadb57SMathias Bauer		Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TextElement)
73*1ecadb57SMathias Bauer	End If
74*1ecadb57SMathias Bauer
75*1ecadb57SMathias Bauer	If sDefaultType &lt;&gt; &quot;&quot; Then
76*1ecadb57SMathias Bauer		Terminate(&quot;Previous default not closed!&quot;,TextElement)
77*1ecadb57SMathias Bauer	End If
78*1ecadb57SMathias Bauer
79*1ecadb57SMathias Bauer	If sSwitchType &lt;&gt; &quot;&quot; Then
80*1ecadb57SMathias Bauer		Terminate(&quot;Previous switch (&quot;+sSwitchType+&quot;) not closed!&quot;,TextElement)
81*1ecadb57SMathias Bauer	End If
82*1ecadb57SMathias Bauer
83*1ecadb57SMathias Bauer	If ubound(aTagsOpen()) &gt; 0 Then
84*1ecadb57SMathias Bauer		Terminate(&quot;Element &quot;+aTagsOpen(ubound(aTagsOpen()))+&quot; not closed&quot;,TextElement)
85*1ecadb57SMathias Bauer	End If
86*1ecadb57SMathias Bauer
87*1ecadb57SMathias Bauer	msgbox(&quot;Validation finished.&quot;)
88*1ecadb57SMathias Bauer
89*1ecadb57SMathias BauerEnd Sub
90*1ecadb57SMathias Bauer
91*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
92*1ecadb57SMathias Bauer&apos; CHECKCELL
93*1ecadb57SMathias Bauer&apos; checks a table cell contents
94*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
95*1ecadb57SMathias Bauer
96*1ecadb57SMathias BauerSub CheckCell(TE As Object)
97*1ecadb57SMathias Bauer	On Local Error Goto ERRHANDLE:
98*1ecadb57SMathias Bauer
99*1ecadb57SMathias Bauer	CellName = &quot;A1&quot;
100*1ecadb57SMathias Bauer	Cell = TE.getCellByName(CellName)
101*1ecadb57SMathias Bauer	tmpCellEnum = Cell.createEnumeration
102*1ecadb57SMathias Bauer	tmpCellElement = tmpCellEnum.nextElement
103*1ecadb57SMathias Bauer
104*1ecadb57SMathias Bauer	Rows = TE.getRows
105*1ecadb57SMathias Bauer	Cols = TE.getColumns
106*1ecadb57SMathias Bauer
107*1ecadb57SMathias Bauer	ReDim aCellTagsOpen(0)
108*1ecadb57SMathias Bauer
109*1ecadb57SMathias Bauer	For RowIndex = 1 to Rows.getCount()
110*1ecadb57SMathias Bauer
111*1ecadb57SMathias Bauer		For ColIndex = 1 to Cols.getCount()
112*1ecadb57SMathias Bauer
113*1ecadb57SMathias Bauer			CellName = Chr(64 + ColIndex) &amp; RowIndex
114*1ecadb57SMathias Bauer			Cell = TE.getCellByName(CellName)
115*1ecadb57SMathias Bauer			CellEnum = Cell.createEnumeration
116*1ecadb57SMathias Bauer
117*1ecadb57SMathias Bauer			Do While CellEnum.hasMoreElements
118*1ecadb57SMathias Bauer
119*1ecadb57SMathias Bauer				CellElement = CellEnum.nextElement		&apos; &lt;-- MODIFY, check closed switches within cells
120*1ecadb57SMathias Bauer
121*1ecadb57SMathias Bauer				If CellElement.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then
122*1ecadb57SMathias Bauer					CheckSwitchesInCell(CellElement)
123*1ecadb57SMathias Bauer					CheckParaID(CellElement)
124*1ecadb57SMathias Bauer					CheckParaFormat(CellElement)
125*1ecadb57SMathias Bauer					CheckTagsInCell(CellElement)
126*1ecadb57SMathias Bauer					CheckInlineTags(CellElement)
127*1ecadb57SMathias Bauer				EndIf
128*1ecadb57SMathias Bauer
129*1ecadb57SMathias Bauer			Loop
130*1ecadb57SMathias Bauer
131*1ecadb57SMathias Bauer			If sCellCaseType &lt;&gt; &quot;&quot; Then
132*1ecadb57SMathias Bauer				Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CellElement)
133*1ecadb57SMathias Bauer			End If
134*1ecadb57SMathias Bauer
135*1ecadb57SMathias Bauer			If sCellSwitchType &lt;&gt; &quot;&quot; Then
136*1ecadb57SMathias Bauer				Terminate(&quot;Previous switch (&quot;+sCellSwitchType+&quot;) not closed!&quot;,CellElement)
137*1ecadb57SMathias Bauer			End If
138*1ecadb57SMathias Bauer
139*1ecadb57SMathias Bauer			If ubound(aCellTagsOpen()) &gt; 0 Then
140*1ecadb57SMathias Bauer				Terminate(&quot;Element &quot;+aCellTagsOpen(ubound(aCellTagsOpen()))+&quot; not closed&quot;,CellElement)
141*1ecadb57SMathias Bauer			End If
142*1ecadb57SMathias Bauer
143*1ecadb57SMathias Bauer		Next
144*1ecadb57SMathias Bauer	Next
145*1ecadb57SMathias Bauer
146*1ecadb57SMathias Bauer	ERRHANDLE:
147*1ecadb57SMathias Bauer		If Err &lt;&gt; 0 Then
148*1ecadb57SMathias Bauer			msgbox &quot;Error: &quot;+chr(13)+ Error$,48,&quot;D&apos;oh!&quot;
149*1ecadb57SMathias Bauer		End If
150*1ecadb57SMathias BauerEnd Sub
151*1ecadb57SMathias Bauer
152*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
153*1ecadb57SMathias Bauer&apos; CHECK PARA ID
154*1ecadb57SMathias Bauer&apos; checks a paragraph for an ID
155*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
156*1ecadb57SMathias Bauer
157*1ecadb57SMathias BauerSub CheckParaID(TE As Object)
158*1ecadb57SMathias Bauer
159*1ecadb57SMathias Bauer	If Left(TE.ParaStyleName,4) = &quot;hlp_&quot; AND Not(Left(TE.ParaStyleName,8) = &quot;hlp_aux_&quot;) Then
160*1ecadb57SMathias Bauer
161*1ecadb57SMathias Bauer		sText = TE.GetString
162*1ecadb57SMathias Bauer
163*1ecadb57SMathias Bauer		If sText = &quot;&quot; Then
164*1ecadb57SMathias Bauer			If bWarnEmptyPara Then
165*1ecadb57SMathias Bauer				Warn(&quot;Empty Paragraph&quot;,&quot;Empty paragraphs should be avoided. Do not use empty paragraphs for formatting purpose.&quot;,TE)
166*1ecadb57SMathias Bauer				bWarnEmptyPara = FALSE
167*1ecadb57SMathias Bauer			End If
168*1ecadb57SMathias Bauer		Else
169*1ecadb57SMathias Bauer
170*1ecadb57SMathias Bauer			TP = TE.createEnumeration
171*1ecadb57SMathias Bauer			Ct = 0
172*1ecadb57SMathias Bauer			posID = 0
173*1ecadb57SMathias Bauer
174*1ecadb57SMathias Bauer			While TP.hasmoreElements
175*1ecadb57SMathias Bauer				Ct = Ct+1
176*1ecadb57SMathias Bauer				TPE = TP.nextElement
177*1ecadb57SMathias Bauer				If TPE.TextPortionType=&quot;TextField&quot; Then
178*1ecadb57SMathias Bauer					If TPE.TextField.TextFieldMaster.Name=&quot;ID&quot; Then
179*1ecadb57SMathias Bauer						posID = Ct
180*1ecadb57SMathias Bauer					End If
181*1ecadb57SMathias Bauer				End If
182*1ecadb57SMathias Bauer				&apos; Lets cheat and allow empty strings before the ID -- otherwise we&apos;ll get
183*1ecadb57SMathias Bauer				&apos; a validation error if a paragraph starts at the top of a page after
184*1ecadb57SMathias Bauer				&apos; a page break (for whatever reason)
185*1ecadb57SMathias Bauer				If TPE.String = &quot;&quot; Then
186*1ecadb57SMathias Bauer					Ct = Ct-1
187*1ecadb57SMathias Bauer				End If
188*1ecadb57SMathias Bauer			Wend
189*1ecadb57SMathias Bauer
190*1ecadb57SMathias Bauer			If posID = 0 Then
191*1ecadb57SMathias Bauer				If bWarnParaNoID Then
192*1ecadb57SMathias Bauer	 				Warn(&quot;Paragraph has no id.&quot;,&quot;IDs will be assigned on safe. You can also assign an ID using the Assign Paragraph ID menu item&quot;,TPE)
193*1ecadb57SMathias Bauer	 				bWarnParaNoID = FALSE
194*1ecadb57SMathias Bauer					InsertNewParaData
195*1ecadb57SMathias Bauer	 			Else
196*1ecadb57SMathias Bauer	 				oCur = TE.getText.createTextCursorByRange(TE)
197*1ecadb57SMathias Bauer					thiscomponent.getcurrentcontroller.select(oCur)
198*1ecadb57SMathias Bauer					InsertNewParaData
199*1ecadb57SMathias Bauer	 			End If
200*1ecadb57SMathias Bauer			ElseIf posID &gt; 1 Then
201*1ecadb57SMathias Bauer				Terminate(&quot;Paragraph ID not at the start of the paragraph. The paragraph ID must be the first element of a paragraph. Move the ID to the beginning of the paragraph&quot;,TPE)
202*1ecadb57SMathias Bauer			End If
203*1ecadb57SMathias Bauer
204*1ecadb57SMathias Bauer		End If
205*1ecadb57SMathias Bauer
206*1ecadb57SMathias Bauer	End If
207*1ecadb57SMathias BauerEnd Sub
208*1ecadb57SMathias Bauer
209*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
210*1ecadb57SMathias Bauer&apos; CHECK PARA FORMAT
211*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
212*1ecadb57SMathias BauerSub CheckParaFormat(TE As Object)
213*1ecadb57SMathias Bauer
214*1ecadb57SMathias Bauer	sText = TE.GetString
215*1ecadb57SMathias Bauer	If Left(TE.ParaStyleName,4) &lt;&gt; &quot;hlp_&quot; AND sText &lt;&gt; &quot;&quot; Then    &apos; just disregard empty paras in wrong formats
216*1ecadb57SMathias Bauer		Warn(&quot;Invalid paragraph format. Contents will be lost.&quot;,_
217*1ecadb57SMathias Bauer		     &quot;Use only the paragraph styles starting with &quot;&quot;hlp_&quot;&quot;.&quot;+_
218*1ecadb57SMathias Bauer		     &quot; Paragraphs in other formats will be lost on export&quot;,TE)
219*1ecadb57SMathias Bauer	End If
220*1ecadb57SMathias Bauer
221*1ecadb57SMathias BauerEnd Sub
222*1ecadb57SMathias Bauer
223*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
224*1ecadb57SMathias Bauer&apos; CHECK SWITCHES
225*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
226*1ecadb57SMathias BauerSub CheckSwitches(TE As Object)
227*1ecadb57SMathias Bauer
228*1ecadb57SMathias Bauer	If TE.ParaStyleName=&quot;hlp_aux_switch&quot; Then					&apos; we are a switch or case or default
229*1ecadb57SMathias Bauer		sText = TE.GetString									&apos; get the switch contents
230*1ecadb57SMathias Bauer
231*1ecadb57SMathias Bauer		If Left(sText,8) = &quot;&lt;SWITCH &quot; Then								&apos; an opening switch tag
232*1ecadb57SMathias Bauer
233*1ecadb57SMathias Bauer			If sSwitchType = &quot;&quot; Then									&apos; no other switch is open
234*1ecadb57SMathias Bauer				sSwitchType = Right(sText,Len(sText)-16)
235*1ecadb57SMathias Bauer				sSwitchType = Left(sSwitchType,InStr(sSwitchType,&quot;&quot;&quot;&quot;)-1)
236*1ecadb57SMathias Bauer
237*1ecadb57SMathias Bauer				If (sSwitchType &lt;&gt; &quot;sys&quot; AND sSwitchType &lt;&gt; &quot;appl&quot; AND sSwitchType &lt;&gt; &quot;distrib&quot;) Then
238*1ecadb57SMathias Bauer					Terminate(&quot;Unknown switch type &quot;&quot;&quot;+sSwitchType+&quot;&quot;&quot;&quot;,TE)
239*1ecadb57SMathias Bauer				End If
240*1ecadb57SMathias Bauer
241*1ecadb57SMathias Bauer			Else
242*1ecadb57SMathias Bauer				Terminate(&quot;Previous switch (&quot;+sSwitchType+&quot;) not closed!&quot;,TE)
243*1ecadb57SMathias Bauer			End If
244*1ecadb57SMathias Bauer
245*1ecadb57SMathias Bauer		End If	&apos; OPENING SWITCH
246*1ecadb57SMathias Bauer
247*1ecadb57SMathias Bauer		If Left(sText,8) = &quot;&lt;/SWITCH&quot; Then								&apos; a closing switch tag
248*1ecadb57SMathias Bauer
249*1ecadb57SMathias Bauer			If sSwitchType = &quot;&quot; Then									&apos; there was no switch open
250*1ecadb57SMathias Bauer				Terminate(&quot;No switch open!&quot;,TE)
251*1ecadb57SMathias Bauer			Else
252*1ecadb57SMathias Bauer				If not(bCaseSet OR bDefaultSet) Then
253*1ecadb57SMathias Bauer					Terminate(&quot;Empty switch&quot;,TE)
254*1ecadb57SMathias Bauer				End If
255*1ecadb57SMathias Bauer
256*1ecadb57SMathias Bauer				If sCaseType &lt;&gt; &quot;&quot; Then									&apos; there is still a case open
257*1ecadb57SMathias Bauer					Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TE)
258*1ecadb57SMathias Bauer				End If
259*1ecadb57SMathias Bauer				sSwitchType = &quot;&quot;
260*1ecadb57SMathias Bauer				bDefaultSet = FALSE
261*1ecadb57SMathias Bauer				bCaseSet = FALSE
262*1ecadb57SMathias Bauer			End If
263*1ecadb57SMathias Bauer
264*1ecadb57SMathias Bauer		End If  &apos; CLOSING SWITCH
265*1ecadb57SMathias Bauer
266*1ecadb57SMathias Bauer		If Left(sText,6) = &quot;&lt;CASE &quot; Then								&apos; an opening case tag
267*1ecadb57SMathias Bauer
268*1ecadb57SMathias Bauer			If bDefaultSet Then
269*1ecadb57SMathias Bauer				Terminate(&quot;No case after default allowed.&quot;,TE)
270*1ecadb57SMathias Bauer			End If
271*1ecadb57SMathias Bauer
272*1ecadb57SMathias Bauer			If sCaseType = &quot;&quot; Then
273*1ecadb57SMathias Bauer				sCaseType = Right(sText,Len(sText)-14)
274*1ecadb57SMathias Bauer				sCaseType = Left(sCaseType,InStr(sCaseType,&quot;&quot;&quot;&quot;)-1)
275*1ecadb57SMathias Bauer				bCaseSet = TRUE
276*1ecadb57SMathias Bauer				If sSwitchType = &quot;&quot; Then
277*1ecadb57SMathias Bauer					Terminate(&quot;Case without switch&quot;,TE)
278*1ecadb57SMathias Bauer				End If
279*1ecadb57SMathias Bauer			Else
280*1ecadb57SMathias Bauer				Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TE)
281*1ecadb57SMathias Bauer			End If
282*1ecadb57SMathias Bauer
283*1ecadb57SMathias Bauer		End If  &apos; OPENING CASE
284*1ecadb57SMathias Bauer
285*1ecadb57SMathias Bauer		If Left(sText,6) = &quot;&lt;/CASE&quot; Then								&apos; a closing case tag
286*1ecadb57SMathias Bauer
287*1ecadb57SMathias Bauer			If sCaseType = &quot;&quot; Then
288*1ecadb57SMathias Bauer				Terminate(&quot;No case open!&quot;,TE)
289*1ecadb57SMathias Bauer			Else
290*1ecadb57SMathias Bauer				sCaseType = &quot;&quot;
291*1ecadb57SMathias Bauer			End If
292*1ecadb57SMathias Bauer
293*1ecadb57SMathias Bauer		End If  &apos; CLOSING  CASE
294*1ecadb57SMathias Bauer
295*1ecadb57SMathias Bauer		If Left(sText,8) = &quot;&lt;DEFAULT&quot; Then								&apos; an opening default tag
296*1ecadb57SMathias Bauer
297*1ecadb57SMathias Bauer			If sCaseType = &quot;&quot; Then
298*1ecadb57SMathias Bauer				If (sDefaultType &lt;&gt; &quot;&quot; OR bDefaultSet) Then
299*1ecadb57SMathias Bauer					Terminate(&quot;Multiple default not allowed.&quot;,TE)
300*1ecadb57SMathias Bauer				Else
301*1ecadb57SMathias Bauer					sDefaultType = &quot;DEFAULT&quot;
302*1ecadb57SMathias Bauer
303*1ecadb57SMathias Bauer					If sSwitchType = &quot;&quot; Then
304*1ecadb57SMathias Bauer						Terminate(&quot;Default without switch&quot;,TE)
305*1ecadb57SMathias Bauer					End If
306*1ecadb57SMathias Bauer				End If
307*1ecadb57SMathias Bauer				sDefaultType = &quot;DEFAULT&quot;
308*1ecadb57SMathias Bauer				bDefaultSet = TRUE
309*1ecadb57SMathias Bauer			Else
310*1ecadb57SMathias Bauer				Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TE)
311*1ecadb57SMathias Bauer			End If
312*1ecadb57SMathias Bauer
313*1ecadb57SMathias Bauer		End If  &apos; OPENING CASE
314*1ecadb57SMathias Bauer
315*1ecadb57SMathias Bauer		If Left(sText,9) = &quot;&lt;/DEFAULT&quot; Then								&apos; a closing default tag
316*1ecadb57SMathias Bauer
317*1ecadb57SMathias Bauer			If sDefaultType &lt;&gt; &quot;DEFAULT&quot; Then
318*1ecadb57SMathias Bauer				Terminate(&quot;No default open!&quot;,TE)
319*1ecadb57SMathias Bauer			Else
320*1ecadb57SMathias Bauer				sDefaultType = &quot;&quot;
321*1ecadb57SMathias Bauer			End If
322*1ecadb57SMathias Bauer
323*1ecadb57SMathias Bauer		End If  &apos; CLOSING  CASE
324*1ecadb57SMathias Bauer	Else  &apos; We are not hlp_aux_switch
325*1ecadb57SMathias Bauer		If (sSwitchType &lt;&gt; &quot;&quot; AND sCaseType = &quot;&quot; AND sDefaultType = &quot;&quot;) Then
326*1ecadb57SMathias Bauer			Terminate(&quot;Nothing allowed between switch and case or default or /case or /default and /switch&quot;, TE)
327*1ecadb57SMathias Bauer		End If
328*1ecadb57SMathias Bauer	End If
329*1ecadb57SMathias Bauer
330*1ecadb57SMathias BauerEnd Sub
331*1ecadb57SMathias Bauer
332*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
333*1ecadb57SMathias Bauer&apos; CHECK SWITCHES IN A CELL
334*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
335*1ecadb57SMathias BauerSub CheckSwitchesInCell(CE As Object)
336*1ecadb57SMathias Bauer
337*1ecadb57SMathias Bauer	If CE.ParaStyleName=&quot;hlp_aux_switch&quot; Then					&apos; we are a switch or case or default
338*1ecadb57SMathias Bauer		sText = CE.GetString									&apos; get the switch contents
339*1ecadb57SMathias Bauer
340*1ecadb57SMathias Bauer		If Left(sText,8) = &quot;&lt;SWITCH &quot; Then								&apos; an opening switch tag
341*1ecadb57SMathias Bauer
342*1ecadb57SMathias Bauer			If sCellSwitchType = &quot;&quot; Then									&apos; no other switch is open
343*1ecadb57SMathias Bauer				sCellSwitchType = Right(sText,Len(sText)-16)
344*1ecadb57SMathias Bauer				sCellSwitchType = Left(sCellSwitchType,InStr(sCellSwitchType,&quot;&quot;&quot;&quot;)-1)
345*1ecadb57SMathias Bauer
346*1ecadb57SMathias Bauer				If (sCellSwitchType &lt;&gt; &quot;sys&quot; AND sCellSwitchType &lt;&gt; &quot;appl&quot; AND sCellSwitchType &lt;&gt; &quot;distrib&quot;) Then
347*1ecadb57SMathias Bauer					Terminate(&quot;Unknown switch type &quot;&quot;&quot;+sCellSwitchType+&quot;&quot;&quot;&quot;,CE)
348*1ecadb57SMathias Bauer				End If
349*1ecadb57SMathias Bauer
350*1ecadb57SMathias Bauer			Else
351*1ecadb57SMathias Bauer				Terminate(&quot;Previous switch (&quot;+sCellSwitchType+&quot;) not closed!&quot;,CE)
352*1ecadb57SMathias Bauer			End If
353*1ecadb57SMathias Bauer
354*1ecadb57SMathias Bauer		End If	&apos; OPENING SWITCH
355*1ecadb57SMathias Bauer
356*1ecadb57SMathias Bauer		If Left(sText,8) = &quot;&lt;/SWITCH&quot; Then								&apos; a closing switch tag
357*1ecadb57SMathias Bauer
358*1ecadb57SMathias Bauer			If sCellSwitchType = &quot;&quot; Then									&apos; there was no switch open
359*1ecadb57SMathias Bauer				Terminate(&quot;No switch open!&quot;,CE)
360*1ecadb57SMathias Bauer			Else
361*1ecadb57SMathias Bauer				If not(bCellCaseSet OR bCellDefaultSet) Then
362*1ecadb57SMathias Bauer					Terminate(&quot;Empty switch&quot;,CE)
363*1ecadb57SMathias Bauer				End If
364*1ecadb57SMathias Bauer
365*1ecadb57SMathias Bauer				If sCellCaseType &lt;&gt; &quot;&quot; Then									&apos; there is still a case open
366*1ecadb57SMathias Bauer					Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CE)
367*1ecadb57SMathias Bauer				End If
368*1ecadb57SMathias Bauer				sCellSwitchType = &quot;&quot;
369*1ecadb57SMathias Bauer				bCellDefaultSet = FALSE
370*1ecadb57SMathias Bauer				bCellCaseSet = FALSE
371*1ecadb57SMathias Bauer			End If
372*1ecadb57SMathias Bauer
373*1ecadb57SMathias Bauer		End If  &apos; CLOSING SWITCH
374*1ecadb57SMathias Bauer
375*1ecadb57SMathias Bauer		If Left(sText,6) = &quot;&lt;CASE &quot; Then								&apos; an opening case tag
376*1ecadb57SMathias Bauer
377*1ecadb57SMathias Bauer			If bCellDefaultSet Then
378*1ecadb57SMathias Bauer				Terminate(&quot;No case after default allowed.&quot;,CE)
379*1ecadb57SMathias Bauer			End If
380*1ecadb57SMathias Bauer
381*1ecadb57SMathias Bauer			If sCellCaseType = &quot;&quot; Then
382*1ecadb57SMathias Bauer				sCellCaseType = Right(sText,Len(sText)-14)
383*1ecadb57SMathias Bauer				sCellCaseType = Left(sCellCaseType,InStr(sCellCaseType,&quot;&quot;&quot;&quot;)-1)
384*1ecadb57SMathias Bauer				bCellCaseSet = TRUE
385*1ecadb57SMathias Bauer				If sCellSwitchType = &quot;&quot; Then
386*1ecadb57SMathias Bauer					Terminate(&quot;Case without switch&quot;,CE)
387*1ecadb57SMathias Bauer				End If
388*1ecadb57SMathias Bauer			Else
389*1ecadb57SMathias Bauer				Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CE)
390*1ecadb57SMathias Bauer			End If
391*1ecadb57SMathias Bauer
392*1ecadb57SMathias Bauer		End If  &apos; OPENING CASE
393*1ecadb57SMathias Bauer
394*1ecadb57SMathias Bauer		If Left(sText,6) = &quot;&lt;/CASE&quot; Then								&apos; a closing case tag
395*1ecadb57SMathias Bauer
396*1ecadb57SMathias Bauer			If sCellCaseType = &quot;&quot; Then
397*1ecadb57SMathias Bauer				Terminate(&quot;No case open!&quot;,CE)
398*1ecadb57SMathias Bauer			Else
399*1ecadb57SMathias Bauer				sCellCaseType = &quot;&quot;
400*1ecadb57SMathias Bauer			End If
401*1ecadb57SMathias Bauer
402*1ecadb57SMathias Bauer		End If  &apos; CLOSING  CASE
403*1ecadb57SMathias Bauer
404*1ecadb57SMathias Bauer		If Left(sText,8) = &quot;&lt;DEFAULT&quot; Then								&apos; an opening default tag
405*1ecadb57SMathias Bauer
406*1ecadb57SMathias Bauer			If sCellCaseType = &quot;&quot; Then
407*1ecadb57SMathias Bauer				If (sCellDefaultType &lt;&gt; &quot;&quot; OR bCellDefaultSet) Then
408*1ecadb57SMathias Bauer					Terminate(&quot;Multiple default not allowed.&quot;,CE)
409*1ecadb57SMathias Bauer				Else
410*1ecadb57SMathias Bauer					sCellDefaultType = &quot;DEFAULT&quot;
411*1ecadb57SMathias Bauer
412*1ecadb57SMathias Bauer					If sCellSwitchType = &quot;&quot; Then
413*1ecadb57SMathias Bauer						Terminate(&quot;Default without switch&quot;,CE)
414*1ecadb57SMathias Bauer					End If
415*1ecadb57SMathias Bauer				End If
416*1ecadb57SMathias Bauer				sCellDefaultType = &quot;DEFAULT&quot;
417*1ecadb57SMathias Bauer				bCellDefaultSet = TRUE
418*1ecadb57SMathias Bauer			Else
419*1ecadb57SMathias Bauer				Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CE)
420*1ecadb57SMathias Bauer			End If
421*1ecadb57SMathias Bauer
422*1ecadb57SMathias Bauer		End If  &apos; OPENING CASE
423*1ecadb57SMathias Bauer
424*1ecadb57SMathias Bauer		If Left(sText,9) = &quot;&lt;/DEFAULT&quot; Then								&apos; a closing default tag
425*1ecadb57SMathias Bauer
426*1ecadb57SMathias Bauer			If sCellDefaultType &lt;&gt; &quot;DEFAULT&quot; Then
427*1ecadb57SMathias Bauer				Terminate(&quot;No default open!&quot;,CE)
428*1ecadb57SMathias Bauer			Else
429*1ecadb57SMathias Bauer				sCellDefaultType = &quot;&quot;
430*1ecadb57SMathias Bauer			End If
431*1ecadb57SMathias Bauer
432*1ecadb57SMathias Bauer		End If  &apos; CLOSING  CASE
433*1ecadb57SMathias Bauer	Else  &apos; We are not hlp_aux_switch
434*1ecadb57SMathias Bauer		If (sCellSwitchType &lt;&gt; &quot;&quot; AND sCellCaseType = &quot;&quot; AND sCellDefaultType = &quot;&quot;) Then
435*1ecadb57SMathias Bauer			Terminate(&quot;Nothing allowed between switch and case or default or /case or /default and /switch&quot;, CE)
436*1ecadb57SMathias Bauer		End If
437*1ecadb57SMathias Bauer	End If
438*1ecadb57SMathias Bauer
439*1ecadb57SMathias Bauer
440*1ecadb57SMathias BauerEnd Sub
441*1ecadb57SMathias Bauer
442*1ecadb57SMathias Bauer
443*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
444*1ecadb57SMathias Bauer&apos; TERMINATE VALIDATION WITH AN ERROR MESSAGE
445*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
446*1ecadb57SMathias BauerSub Terminate(sStr As String, TE As Object)
447*1ecadb57SMathias Bauer
448*1ecadb57SMathias Bauer	oCur = TE.getText.createTextCursorByRange(TE)
449*1ecadb57SMathias Bauer	thiscomponent.getcurrentcontroller.select(oCur)
450*1ecadb57SMathias Bauer	msgbox sStr,48,&quot;D&apos;oh!&quot;
451*1ecadb57SMathias Bauer	Stop
452*1ecadb57SMathias Bauer
453*1ecadb57SMathias BauerEnd Sub
454*1ecadb57SMathias Bauer
455*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
456*1ecadb57SMathias Bauer&apos; SHOW A WARNING
457*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
458*1ecadb57SMathias BauerSub Warn(sWarn As String, sSolv As String, Optional TE As Object)
459*1ecadb57SMathias Bauer
460*1ecadb57SMathias Bauer	If bWarn Then
461*1ecadb57SMathias Bauer		BasicLibraries.LoadLibrary(&quot;HelpAuthoring&quot;)
462*1ecadb57SMathias Bauer		oDialog = LoadDialog(&quot;HelpAuthoring&quot;, &quot;dlgWarn&quot;)
463*1ecadb57SMathias Bauer		oTxtWarn = oDialog.GetControl(&quot;txtWarning&quot;)
464*1ecadb57SMathias Bauer		oTxtWarn.Text = sWarn
465*1ecadb57SMathias Bauer		oTxtSolv = oDialog.GetControl(&quot;txtSolution&quot;)
466*1ecadb57SMathias Bauer		oTxtSolv.Text = sSolv
467*1ecadb57SMathias Bauer
468*1ecadb57SMathias Bauer		If not(IsMissing(TE)) Then
469*1ecadb57SMathias Bauer			oCur = TE.getText.createTextCursorByRange(TE)
470*1ecadb57SMathias Bauer			thiscomponent.getcurrentcontroller.select(oCur)
471*1ecadb57SMathias Bauer		End If
472*1ecadb57SMathias Bauer
473*1ecadb57SMathias Bauer		If oDialog.Execute() = 1 Then
474*1ecadb57SMathias Bauer			oCbWarn = oDialog.GetControl(&quot;cbWarn&quot;)
475*1ecadb57SMathias Bauer			If oCbWarn.State = 1 Then
476*1ecadb57SMathias Bauer				bWarn = FALSE
477*1ecadb57SMathias Bauer			End If
478*1ecadb57SMathias Bauer			Exit Sub
479*1ecadb57SMathias Bauer		Else
480*1ecadb57SMathias Bauer			Stop
481*1ecadb57SMathias Bauer		End If
482*1ecadb57SMathias Bauer	End If
483*1ecadb57SMathias BauerEnd Sub
484*1ecadb57SMathias Bauer
485*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
486*1ecadb57SMathias Bauer&apos; CHECK DOCUMENT META DATA
487*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
488*1ecadb57SMathias BauerSub CheckMetaData(oDoc As Object)
489*1ecadb57SMathias Bauer
490*1ecadb57SMathias Bauer	sTopicID = oDoc.DocumentInfo.GetUserFieldValue(1)
491*1ecadb57SMathias Bauer
492*1ecadb57SMathias Bauer	If sTopicID &lt;&gt; AlphaNum(sTopicID) OR sTopicID=&quot;&quot; Then
493*1ecadb57SMathias Bauer		sTopicID = &quot;topic_&quot;+CreateID &apos; create a topic id
494*1ecadb57SMathias Bauer	End If
495*1ecadb57SMathias Bauer
496*1ecadb57SMathias Bauer	oDoc.DocumentInfo.SetUserFieldValue(1,sTopicID)
497*1ecadb57SMathias Bauer	sCreated = oDoc.DocumentInfo.GetUserFieldValue(2)
498*1ecadb57SMathias Bauer	sEdited = oDoc.DocumentInfo.GetUserFieldValue(3)
499*1ecadb57SMathias Bauer	sTitle = oDoc.DocumentInfo.Title
500*1ecadb57SMathias Bauer
501*1ecadb57SMathias Bauer	If sTitle=&quot;&quot; OR sTitle=&quot;&lt;Set Topic Title&gt;&quot; Then
502*1ecadb57SMathias Bauer		Enum = document.Text.createEnumeration
503*1ecadb57SMathias Bauer		Do While Enum.hasMoreElements
504*1ecadb57SMathias Bauer			TextElement = Enum.nextElement
505*1ecadb57SMathias Bauer			If TextElement.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then
506*1ecadb57SMathias Bauer				If Left(TextElement.ParaStyleName,8)=&quot;hlp_head&quot; Then
507*1ecadb57SMathias Bauer					Enum2 = TextElement.createEnumeration
508*1ecadb57SMathias Bauer					While Enum2.hasMoreElements
509*1ecadb57SMathias Bauer						TextPortion = Enum2.nextElement
510*1ecadb57SMathias Bauer						If Not(TextPortion.TextPortionType=&quot;TextField&quot;) Then
511*1ecadb57SMathias Bauer							strg = strg + TextPortion.String
512*1ecadb57SMathias Bauer						End If
513*1ecadb57SMathias Bauer					Wend
514*1ecadb57SMathias Bauer					document.DocumentInfo.Title = strg
515*1ecadb57SMathias Bauer					Exit Do
516*1ecadb57SMathias Bauer				End If
517*1ecadb57SMathias Bauer			End If
518*1ecadb57SMathias Bauer		Loop
519*1ecadb57SMathias Bauer	End If
520*1ecadb57SMathias Bauer
521*1ecadb57SMathias Bauer	sIndex = oDoc.DocumentInfo.GetUserFieldValue(0)
522*1ecadb57SMathias Bauer
523*1ecadb57SMathias BauerEnd Sub
524*1ecadb57SMathias Bauer
525*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
526*1ecadb57SMathias Bauer&apos; CHECK IF HEADING EXISTS
527*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
528*1ecadb57SMathias BauerSub CheckHeading(oDoc As Object)
529*1ecadb57SMathias Bauer
530*1ecadb57SMathias BauerEnd Sub
531*1ecadb57SMathias Bauer
532*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
533*1ecadb57SMathias Bauer&apos; CHECK FOR CORRECT INLINE TAGS
534*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
535*1ecadb57SMathias BauerSub CheckInlineTags(TE As Object)
536*1ecadb57SMathias Bauer
537*1ecadb57SMathias Bauer
538*1ecadb57SMathias Bauer
539*1ecadb57SMathias Bauer	If Left(TE.ParaStyleName,4)=&quot;hlp_&quot; AND (Left(TE.ParaStyleName,8)&lt;&gt;&quot;hlp_aux_&quot; OR TE.ParaStyleName=&quot;hlp_aux_bookmark&quot;) Then
540*1ecadb57SMathias Bauer
541*1ecadb57SMathias Bauer		Dim aTokens(0) As Object
542*1ecadb57SMathias Bauer		Dim aInlineTagsOpen(0) As String
543*1ecadb57SMathias Bauer		TP = TE.createEnumeration
544*1ecadb57SMathias Bauer
545*1ecadb57SMathias Bauer		While TP.hasmoreElements
546*1ecadb57SMathias Bauer			sDim = ubound(aTokens())+1
547*1ecadb57SMathias Bauer			ReDim Preserve aTokens(sDim) As Object
548*1ecadb57SMathias Bauer			aTokens(sDim) = TP.nextElement
549*1ecadb57SMathias Bauer		Wend
550*1ecadb57SMathias Bauer
551*1ecadb57SMathias Bauer		For i=1 to ubound(aTokens())
552*1ecadb57SMathias Bauer			Token = aTokens(i)
553*1ecadb57SMathias Bauer
554*1ecadb57SMathias Bauer			If Token.supportsService(&quot;com.sun.star.text.TextField&quot;) Then
555*1ecadb57SMathias Bauer				sTag = Token.TextField.TextFieldMaster.Name
556*1ecadb57SMathias Bauer
557*1ecadb57SMathias Bauer				If Right(sTag,1)=&quot;_&quot; Then   &apos; a tag starts
558*1ecadb57SMathias Bauer
559*1ecadb57SMathias Bauer					sTagName = Left(sTag,Len(sTag)-1)
560*1ecadb57SMathias Bauer
561*1ecadb57SMathias Bauer					&apos; check for forbidden tags in paragraphs
562*1ecadb57SMathias Bauer					sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName)
563*1ecadb57SMathias Bauer					If sTagFormat &lt;&gt; &quot;&quot; Then
564*1ecadb57SMathias Bauer						Terminate(sTagName+&quot; element has wrong paragraph style (&quot;+TE.ParaStyleName+&quot;).&quot;+chr(13)+&quot;Must be &quot;+sTagFormat,Token)
565*1ecadb57SMathias Bauer					End If
566*1ecadb57SMathias Bauer
567*1ecadb57SMathias Bauer					sDim = ubound(aInlineTagsOpen())+1
568*1ecadb57SMathias Bauer					Redim Preserve aInlineTagsOpen(sDim) as String
569*1ecadb57SMathias Bauer					aInlineTagsOpen(sDim)=sTagName
570*1ecadb57SMathias Bauer
571*1ecadb57SMathias Bauer				ElseIf Left(sTag,1)=&quot;_&quot; Then  &apos; a tag ends, all other cases are empty tags
572*1ecadb57SMathias Bauer
573*1ecadb57SMathias Bauer					sTagName = Right(sTag,Len(sTag)-1)
574*1ecadb57SMathias Bauer
575*1ecadb57SMathias Bauer					&apos; check for forbidden tags in paragraphs
576*1ecadb57SMathias Bauer					sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName)
577*1ecadb57SMathias Bauer					If sTagFormat &lt;&gt; &quot;&quot; Then
578*1ecadb57SMathias Bauer						Terminate(sTagName+&quot; element has wrong paragraph style (&quot;+TE.ParaStyleName+&quot;).&quot;+chr(13)+&quot;Must be &quot;+sTagFormat,Token)
579*1ecadb57SMathias Bauer					End If
580*1ecadb57SMathias Bauer
581*1ecadb57SMathias Bauer					If ubound(aInlineTagsOpen()) &gt; 0 Then
582*1ecadb57SMathias Bauer						If aInlineTagsOpen(ubound(aInlineTagsOpen())) &lt;&gt; sTagName Then
583*1ecadb57SMathias Bauer							Terminate(&quot;Inline Element &quot;+aInlineTagsOpen(ubound(aInlineTagsOpen()))+&quot; not closed&quot;,Token)
584*1ecadb57SMathias Bauer						End If
585*1ecadb57SMathias Bauer						sDim = ubound(aInlineTagsOpen())-1
586*1ecadb57SMathias Bauer					Else
587*1ecadb57SMathias Bauer						Terminate(&quot;No opening tag for &quot;+sTagName,Token)
588*1ecadb57SMathias Bauer					End If
589*1ecadb57SMathias Bauer					Redim Preserve aInlineTagsOpen(sDim) as String
590*1ecadb57SMathias Bauer
591*1ecadb57SMathias Bauer				Else &apos; empty tag
592*1ecadb57SMathias Bauer					sTagName = sTag
593*1ecadb57SMathias Bauer					sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName)
594*1ecadb57SMathias Bauer					If sTagFormat &lt;&gt; &quot;&quot; Then
595*1ecadb57SMathias Bauer						Terminate(sTagName+&quot; element has wrong paragraph style (&quot;+TE.ParaStyleName+&quot;).&quot;+chr(13)+&quot;Must be &quot;+sTagFormat,Token)
596*1ecadb57SMathias Bauer					End If
597*1ecadb57SMathias Bauer
598*1ecadb57SMathias Bauer				EndIf
599*1ecadb57SMathias Bauer			ElseIf (i &gt; 1) AND (Trim(Token.String) &lt;&gt; &quot;&quot;) Then
600*1ecadb57SMathias Bauer				If aInlineTagsOpen(ubound(aInlineTagsOpen())) = &quot;SWITCHINLINE&quot; Then
601*1ecadb57SMathias Bauer					Terminate(&quot;No text allowed here.&quot;,Token)
602*1ecadb57SMathias Bauer				End If
603*1ecadb57SMathias Bauer			End If
604*1ecadb57SMathias Bauer		Next
605*1ecadb57SMathias Bauer
606*1ecadb57SMathias Bauer	If ubound(aInlineTagsOpen()) &gt; 0 Then
607*1ecadb57SMathias Bauer		Terminate(&quot;Inline Element &quot;+aInlineTagsOpen(ubound(aInlineTagsOpen()))+&quot; not closed&quot;,Token)
608*1ecadb57SMathias Bauer	End If
609*1ecadb57SMathias Bauer
610*1ecadb57SMathias Bauer	End If
611*1ecadb57SMathias BauerEnd Sub
612*1ecadb57SMathias Bauer
613*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
614*1ecadb57SMathias Bauer&apos; CHECK FOR CORRECT TAGS
615*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
616*1ecadb57SMathias BauerSub CheckTags(TE As Object)
617*1ecadb57SMathias Bauer	If (Left(TE.ParaStyleName,8) = &quot;hlp_aux_&quot; AND TE.ParaStyleName &lt;&gt; &quot;hlp_aux_bookmark&quot;) Then
618*1ecadb57SMathias Bauer
619*1ecadb57SMathias Bauer	TP = TE.createEnumeration
620*1ecadb57SMathias Bauer
621*1ecadb57SMathias Bauer	While TP.hasmoreElements
622*1ecadb57SMathias Bauer		TPE = TP.nextElement
623*1ecadb57SMathias Bauer
624*1ecadb57SMathias Bauer		If TPE.supportsService(&quot;com.sun.star.text.TextField&quot;) Then
625*1ecadb57SMathias Bauer			sTag = TPE.TextField.TextFieldMaster.Name
626*1ecadb57SMathias Bauer			If Right(sTag,1)=&quot;_&quot; Then   &apos; a tag starts
627*1ecadb57SMathias Bauer
628*1ecadb57SMathias Bauer				sTagName = Left(sTag,Len(sTag)-1)
629*1ecadb57SMathias Bauer				sDim = ubound(aTagsOpen())+1
630*1ecadb57SMathias Bauer				Redim Preserve aTagsOpen(sDim) as String
631*1ecadb57SMathias Bauer				aTagsOpen(sDim)=sTagName
632*1ecadb57SMathias Bauer
633*1ecadb57SMathias Bauer			ElseIf Left(sTag,1)=&quot;_&quot; Then  &apos; a tag ends, all other cases are empty tags
634*1ecadb57SMathias Bauer
635*1ecadb57SMathias Bauer				sTagName = Right(sTag,Len(sTag)-1)
636*1ecadb57SMathias Bauer				If ubound(aTagsOpen()) &gt; 0 Then
637*1ecadb57SMathias Bauer					If aTagsOpen(ubound(aTagsOpen())) &lt;&gt; sTagName Then
638*1ecadb57SMathias Bauer						Terminate(&quot;No close tag for &quot;+aTagsOpen(ubound(aTagsOpen())),TPE)
639*1ecadb57SMathias Bauer					Else
640*1ecadb57SMathias Bauer						sDim = ubound(aTagsOpen())-1
641*1ecadb57SMathias Bauer					End If
642*1ecadb57SMathias Bauer				Else
643*1ecadb57SMathias Bauer					Terminate(&quot;No opening tag for &quot;+sTagName,TPE)
644*1ecadb57SMathias Bauer				End If
645*1ecadb57SMathias Bauer				Redim Preserve aTagsOpen(sDim) as String
646*1ecadb57SMathias Bauer
647*1ecadb57SMathias Bauer			Else &apos; empty tags
648*1ecadb57SMathias Bauer
649*1ecadb57SMathias Bauer			EndIf
650*1ecadb57SMathias Bauer		End If
651*1ecadb57SMathias Bauer	Wend
652*1ecadb57SMathias Bauer	End If
653*1ecadb57SMathias BauerEnd Sub
654*1ecadb57SMathias Bauer
655*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
656*1ecadb57SMathias Bauer&apos; CHECK FOR CORRECT TAGS IN A TABLE CELL
657*1ecadb57SMathias Bauer&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
658*1ecadb57SMathias BauerSub CheckTagsInCell(CE As Object)
659*1ecadb57SMathias Bauer	If (Left(CE.ParaStyleName,8) = &quot;hlp_aux_&quot; AND CE.ParaStyleName &lt;&gt; &quot;hlp_aux_bookmark&quot;) Then
660*1ecadb57SMathias Bauer
661*1ecadb57SMathias Bauer	CP = CE.createEnumeration
662*1ecadb57SMathias Bauer
663*1ecadb57SMathias Bauer	While CP.hasmoreElements
664*1ecadb57SMathias Bauer		CPE = CP.nextElement
665*1ecadb57SMathias Bauer
666*1ecadb57SMathias Bauer		If CPE.supportsService(&quot;com.sun.star.text.TextField&quot;) Then
667*1ecadb57SMathias Bauer			sTag = CPE.TextField.TextFieldMaster.Name
668*1ecadb57SMathias Bauer			If Right(sTag,1)=&quot;_&quot; Then   &apos; a tag starts
669*1ecadb57SMathias Bauer
670*1ecadb57SMathias Bauer				sTagName = Left(sTag,Len(sTag)-1)
671*1ecadb57SMathias Bauer				sDim = ubound(aCellTagsOpen())+1
672*1ecadb57SMathias Bauer				Redim Preserve aCellTagsOpen(sDim) as String
673*1ecadb57SMathias Bauer				aCellTagsOpen(sDim)=sTagName
674*1ecadb57SMathias Bauer
675*1ecadb57SMathias Bauer			ElseIf Left(sTag,1)=&quot;_&quot; Then  &apos; a tag ends, all other cases are empty tags
676*1ecadb57SMathias Bauer
677*1ecadb57SMathias Bauer				sTagName = Right(sTag,Len(sTag)-1)
678*1ecadb57SMathias Bauer				If ubound(aCellTagsOpen()) &gt; 0 Then
679*1ecadb57SMathias Bauer					If aCellTagsOpen(ubound(aCellTagsOpen())) &lt;&gt; sTagName Then
680*1ecadb57SMathias Bauer						Terminate(&quot;No close tag for &quot;+aCellTagsOpen(ubound(aCellTagsOpen())),CPE)
681*1ecadb57SMathias Bauer					Else
682*1ecadb57SMathias Bauer						sDim = ubound(aCellTagsOpen())-1
683*1ecadb57SMathias Bauer					End If
684*1ecadb57SMathias Bauer				Else
685*1ecadb57SMathias Bauer					Terminate(&quot;No opening tag for &quot;+sTagName,CPE)
686*1ecadb57SMathias Bauer				End If
687*1ecadb57SMathias Bauer				Redim Preserve aCellTagsOpen(sDim) as String
688*1ecadb57SMathias Bauer
689*1ecadb57SMathias Bauer			EndIf
690*1ecadb57SMathias Bauer		End If
691*1ecadb57SMathias Bauer	Wend
692*1ecadb57SMathias Bauer	End If
693*1ecadb57SMathias BauerEnd Sub
694*1ecadb57SMathias Bauer
695*1ecadb57SMathias Bauer</script:module>