1*b1cdbd2cSJim Jagielski<?xml version="1.0" encoding="UTF-8"?>
2*b1cdbd2cSJim Jagielski<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
3*b1cdbd2cSJim Jagielski<!--***********************************************************
4*b1cdbd2cSJim Jagielski *
5*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
6*b1cdbd2cSJim Jagielski * or more contributor license agreements.  See the NOTICE file
7*b1cdbd2cSJim Jagielski * distributed with this work for additional information
8*b1cdbd2cSJim Jagielski * regarding copyright ownership.  The ASF licenses this file
9*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
10*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
11*b1cdbd2cSJim Jagielski * with the License.  You may obtain a copy of the License at
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski *   http://www.apache.org/licenses/LICENSE-2.0
14*b1cdbd2cSJim Jagielski *
15*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
16*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
17*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18*b1cdbd2cSJim Jagielski * KIND, either express or implied.  See the License for the
19*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
20*b1cdbd2cSJim Jagielski * under the License.
21*b1cdbd2cSJim Jagielski *
22*b1cdbd2cSJim Jagielski ***********************************************************-->
23*b1cdbd2cSJim Jagielski<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Helpers" script:language="StarBasic">&apos; *** MODULE HELPERS ***
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim Jagielski&apos;=======================================================
26*b1cdbd2cSJim Jagielski&apos; Main
27*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
28*b1cdbd2cSJim Jagielski&apos; Ensure that necessary library functions are available
29*b1cdbd2cSJim Jagielski&apos;=======================================================
30*b1cdbd2cSJim JagielskiSub Main
31*b1cdbd2cSJim Jagielski	GlobalScope.BasicLibraries.loadLibrary(&quot;Tools&quot;)
32*b1cdbd2cSJim JagielskiEnd Sub
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski&apos;=======================================================
35*b1cdbd2cSJim Jagielski&apos; ShowProp
36*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
37*b1cdbd2cSJim Jagielski&apos; Displays a dialog that shows the properties and
38*b1cdbd2cSJim Jagielski&apos; the methods of an object. Used for debugging.
39*b1cdbd2cSJim Jagielski&apos;=======================================================
40*b1cdbd2cSJim JagielskiSub ShowProp(Elem As Object)
41*b1cdbd2cSJim Jagielski	dim oDialog As Object
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski	BasicLibraries.LoadLibrary(&quot;HelpAuthoring&quot;)
44*b1cdbd2cSJim Jagielski	oDialog = LoadDialog(&quot;HelpAuthoring&quot;, &quot;dlgObjProp&quot;)
45*b1cdbd2cSJim Jagielski	oDialogModel = oDialog.Model
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski	oTxtProp = oDialog.GetControl(&quot;txtProp&quot;)
48*b1cdbd2cSJim Jagielski	oTxtProp.Text = Join(Split(Elem.dbg_properties,&quot;;&quot;),chr(13))
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski	oTxtMeth = oDialog.GetControl(&quot;txtMeth&quot;)
51*b1cdbd2cSJim Jagielski	oTxtMeth.Text = Join(Split(Elem.dbg_methods,&quot;;&quot;),chr(13))
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski	oTxtInt = oDialog.GetControl(&quot;txtInt&quot;)
54*b1cdbd2cSJim Jagielski	oTxtInt.Text = Join(Split(Elem.dbg_supportedInterfaces,&quot;;&quot;),chr(13))
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski	oDialog.Execute()
57*b1cdbd2cSJim Jagielski	oDialog.dispose
58*b1cdbd2cSJim JagielskiEnd Sub
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski&apos;=======================================================
61*b1cdbd2cSJim Jagielski&apos; AlphaNum
62*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
63*b1cdbd2cSJim Jagielski&apos; Removes all invalid characters from a string
64*b1cdbd2cSJim Jagielski&apos;=======================================================
65*b1cdbd2cSJim JagielskiFunction AlphaNum(Strg As String)
66*b1cdbd2cSJim Jagielski	dim OutStrg As String
67*b1cdbd2cSJim Jagielski	dim sValid As String
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski	sValid = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789&quot;
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski	For i=1 to Len(Strg)
72*b1cdbd2cSJim Jagielski		If (Instr(sValid,LCase(Mid(Strg,i,1)))) Then
73*b1cdbd2cSJim Jagielski			OutStrg = OutStrg + Mid(Strg,i,1)
74*b1cdbd2cSJim Jagielski		End If
75*b1cdbd2cSJim Jagielski	Next i
76*b1cdbd2cSJim Jagielski	AlphaNum = OutStrg
77*b1cdbd2cSJim JagielskiEnd Function
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski&apos;=======================================================
80*b1cdbd2cSJim Jagielski&apos; Replace
81*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
82*b1cdbd2cSJim Jagielski&apos; Replaces a character with another character in a string
83*b1cdbd2cSJim Jagielski&apos;=======================================================
84*b1cdbd2cSJim JagielskiFunction Replace(txt As String, ReplaceFrom As String, ReplaceTo As String)
85*b1cdbd2cSJim Jagielski	dim OutStr As String
86*b1cdbd2cSJim Jagielski	For i=1 to len(txt)
87*b1cdbd2cSJim Jagielski		If LCase(mid(txt,i,1))=ReplaceFrom Then
88*b1cdbd2cSJim Jagielski			OutStr = OutStr + ReplaceTo
89*b1cdbd2cSJim Jagielski		Else
90*b1cdbd2cSJim Jagielski			OutStr = OutStr + mid(txt,i,1)
91*b1cdbd2cSJim Jagielski		End If
92*b1cdbd2cSJim Jagielski	Next i
93*b1cdbd2cSJim Jagielski	Replace = OutStr
94*b1cdbd2cSJim JagielskiEnd Function
95*b1cdbd2cSJim Jagielski
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski&apos;=======================================================
98*b1cdbd2cSJim Jagielski&apos; ReplaceAll
99*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
100*b1cdbd2cSJim Jagielski&apos; Replaces a character with another character in a string
101*b1cdbd2cSJim Jagielski&apos;=======================================================
102*b1cdbd2cSJim JagielskiFunction ReplaceAll(txt As String, ReplaceFrom As String, ReplaceTo As String)
103*b1cdbd2cSJim Jagielski	dim OutStr As String
104*b1cdbd2cSJim Jagielski	For i=1 to len(txt)
105*b1cdbd2cSJim Jagielski	    bFound = 0
106*b1cdbd2cSJim Jagielski		For j=1 to len(ReplaceFrom)
107*b1cdbd2cSJim Jagielski			If LCase(mid(txt,i,1))=LCase(mid(ReplaceFrom,j,1)) Then
108*b1cdbd2cSJim Jagielski				bFound = 1
109*b1cdbd2cSJim Jagielski				OutStr = OutStr + ReplaceTo
110*b1cdbd2cSJim Jagielski				j = len(ReplaceFrom)
111*b1cdbd2cSJim Jagielski			End If
112*b1cdbd2cSJim Jagielski		Next j
113*b1cdbd2cSJim Jagielski		If bFound=0 Then
114*b1cdbd2cSJim Jagielski			OutStr = OutStr + mid(txt,i,1)
115*b1cdbd2cSJim Jagielski		End If
116*b1cdbd2cSJim Jagielski	Next i
117*b1cdbd2cSJim Jagielski	ReplaceAll = OutStr
118*b1cdbd2cSJim JagielskiEnd Function
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski&apos;=======================================================
123*b1cdbd2cSJim Jagielski&apos; CreateID
124*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
125*b1cdbd2cSJim Jagielski&apos; Creates a numerical randomized ID
126*b1cdbd2cSJim Jagielski&apos;=======================================================
127*b1cdbd2cSJim JagielskiFunction CreateID
128*b1cdbd2cSJim Jagielski	sDate = ReplaceAll(Date,&quot;/:. \&quot;,&quot;&quot;)
129*b1cdbd2cSJim Jagielski    sTime = ReplaceAll(Time,&quot;/:. \AMP&quot;,&quot;&quot;)
130*b1cdbd2cSJim Jagielski	Randomize
131*b1cdbd2cSJim Jagielski	CreateID = sDate + sTime + Int(Rnd * 100)
132*b1cdbd2cSJim JagielskiEnd Function
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski&apos;=======================================================
135*b1cdbd2cSJim Jagielski&apos; InsertTag
136*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
137*b1cdbd2cSJim Jagielski&apos; Inserts an inline tag (element) in the document at the
138*b1cdbd2cSJim Jagielski&apos; current cursor position. It also sets the character
139*b1cdbd2cSJim Jagielski&apos; format to hlp_aux_tag
140*b1cdbd2cSJim Jagielski&apos;=======================================================
141*b1cdbd2cSJim JagielskiSub InsertTag (Element As String, Content As String)
142*b1cdbd2cSJim Jagielski	dim document   as object
143*b1cdbd2cSJim Jagielski	dim dispatcher as object
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
146*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski	dim args(5) as new com.sun.star.beans.PropertyValue
149*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Type&quot;
150*b1cdbd2cSJim Jagielski	args(0).Value = 8
151*b1cdbd2cSJim Jagielski	args(1).Name = &quot;SubType&quot;
152*b1cdbd2cSJim Jagielski	args(1).Value = 1
153*b1cdbd2cSJim Jagielski	args(2).Name = &quot;Name&quot;
154*b1cdbd2cSJim Jagielski	args(2).Value = Element
155*b1cdbd2cSJim Jagielski	args(3).Name = &quot;Content&quot;
156*b1cdbd2cSJim Jagielski	args(3).Value = Content
157*b1cdbd2cSJim Jagielski	args(4).Name = &quot;Format&quot;
158*b1cdbd2cSJim Jagielski	args(4).Value = -1
159*b1cdbd2cSJim Jagielski	args(5).Name = &quot;Separator&quot;
160*b1cdbd2cSJim Jagielski	args(5).Value = &quot; &quot;
161*b1cdbd2cSJim Jagielski	SetCharStyle(&quot;hlp_aux_tag&quot;)
162*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertField&quot;, &quot;&quot;, 0, args())
163*b1cdbd2cSJim Jagielski	SetCharStyle(&quot;Default&quot;)
164*b1cdbd2cSJim JagielskiEnd Sub
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski&apos;=======================================================
167*b1cdbd2cSJim Jagielski&apos; INSERTTAGCR
168*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
169*b1cdbd2cSJim Jagielski&apos; Inserts a tag (element) in the document at the
170*b1cdbd2cSJim Jagielski&apos; current cursor position in its own newly created paragraph.
171*b1cdbd2cSJim Jagielski&apos; It also sets the character format to hlp_aux_tag and
172*b1cdbd2cSJim Jagielski&apos; the paragraph to the specified value (should start with hlp_)
173*b1cdbd2cSJim Jagielski&apos;=======================================================
174*b1cdbd2cSJim JagielskiSub InsertTagCR (Element As String, Content As String, Style As String)
175*b1cdbd2cSJim Jagielski	dim document   as object
176*b1cdbd2cSJim Jagielski	dim dispatcher as object
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
179*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
180*b1cdbd2cSJim Jagielski
181*b1cdbd2cSJim Jagielski	dim args(5) as new com.sun.star.beans.PropertyValue
182*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Type&quot;
183*b1cdbd2cSJim Jagielski	args(0).Value = 8
184*b1cdbd2cSJim Jagielski	args(1).Name = &quot;SubType&quot;
185*b1cdbd2cSJim Jagielski	args(1).Value = 1
186*b1cdbd2cSJim Jagielski	args(2).Name = &quot;Name&quot;
187*b1cdbd2cSJim Jagielski	args(2).Value = Element
188*b1cdbd2cSJim Jagielski	args(3).Name = &quot;Content&quot;
189*b1cdbd2cSJim Jagielski	args(3).Value = Content
190*b1cdbd2cSJim Jagielski	args(4).Name = &quot;Format&quot;
191*b1cdbd2cSJim Jagielski	args(4).Value = -1
192*b1cdbd2cSJim Jagielski	args(5).Name = &quot;Separator&quot;
193*b1cdbd2cSJim Jagielski	args(5).Value = &quot; &quot;
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski	CR
196*b1cdbd2cSJim Jagielski	goUp(1)
197*b1cdbd2cSJim Jagielski	SetParaStyle(Style)
198*b1cdbd2cSJim Jagielski	SetCharStyle(&quot;hlp_aux_tag&quot;)
199*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertField&quot;, &quot;&quot;, 0, args())
200*b1cdbd2cSJim Jagielski	SetCharStyle(&quot;Default&quot;)
201*b1cdbd2cSJim Jagielski	goDown(1)
202*b1cdbd2cSJim JagielskiEnd Sub
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski&apos;=======================================================
205*b1cdbd2cSJim Jagielski&apos; InsertField
206*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
207*b1cdbd2cSJim Jagielski&apos; Inserts a field in the document at the
208*b1cdbd2cSJim Jagielski&apos; current cursor position.
209*b1cdbd2cSJim Jagielski&apos;=======================================================
210*b1cdbd2cSJim JagielskiSub InsertField(Field as String, Content as String)
211*b1cdbd2cSJim Jagielski	dim document   as object
212*b1cdbd2cSJim Jagielski	dim dispatcher as object
213*b1cdbd2cSJim Jagielski
214*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
215*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
216*b1cdbd2cSJim Jagielski
217*b1cdbd2cSJim Jagielski	dim args(5) as new com.sun.star.beans.PropertyValue
218*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Type&quot;
219*b1cdbd2cSJim Jagielski	args(0).Value = 8
220*b1cdbd2cSJim Jagielski	args(1).Name = &quot;SubType&quot;
221*b1cdbd2cSJim Jagielski	args(1).Value = 1
222*b1cdbd2cSJim Jagielski	args(2).Name = &quot;Name&quot;
223*b1cdbd2cSJim Jagielski	args(2).Value = Field
224*b1cdbd2cSJim Jagielski	args(3).Name = &quot;Content&quot;
225*b1cdbd2cSJim Jagielski	args(3).Value = Content
226*b1cdbd2cSJim Jagielski	args(4).Name = &quot;Format&quot;
227*b1cdbd2cSJim Jagielski	args(4).Value = -1
228*b1cdbd2cSJim Jagielski	args(5).Name = &quot;Separator&quot;
229*b1cdbd2cSJim Jagielski	args(5).Value = &quot; &quot;
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertField&quot;, &quot;&quot;, 0, args())
232*b1cdbd2cSJim JagielskiEnd Sub
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski&apos;=======================================================
235*b1cdbd2cSJim Jagielski&apos; GoUp
236*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
237*b1cdbd2cSJim Jagielski&apos; Simulates the CursorUp key
238*b1cdbd2cSJim Jagielski&apos;=======================================================
239*b1cdbd2cSJim JagielskiSub goUp(Count As Integer, Optional bSelect As Boolean)
240*b1cdbd2cSJim Jagielski	dim document   as object
241*b1cdbd2cSJim Jagielski	dim dispatcher as object
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
244*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski	dim args(1) as new com.sun.star.beans.PropertyValue
247*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Count&quot;
248*b1cdbd2cSJim Jagielski	args(0).Value = Count
249*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Select&quot;
250*b1cdbd2cSJim Jagielski	If IsMissing(bSelect) Then
251*b1cdbd2cSJim Jagielski		args(1).Value = false
252*b1cdbd2cSJim Jagielski	Else
253*b1cdbd2cSJim Jagielski		args(1).Value = bSelect
254*b1cdbd2cSJim Jagielski	End If
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:GoUp&quot;, &quot;&quot;, 0, args())
257*b1cdbd2cSJim JagielskiEnd Sub
258*b1cdbd2cSJim Jagielski
259*b1cdbd2cSJim Jagielski&apos;=======================================================
260*b1cdbd2cSJim Jagielski&apos; GoDown
261*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
262*b1cdbd2cSJim Jagielski&apos; Simulates the CursorDown key
263*b1cdbd2cSJim Jagielski&apos;=======================================================
264*b1cdbd2cSJim JagielskiSub goDown(Count As Integer, Optional bSelect As Boolean)
265*b1cdbd2cSJim Jagielski	dim document   as object
266*b1cdbd2cSJim Jagielski	dim dispatcher as object
267*b1cdbd2cSJim Jagielski
268*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
269*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski	dim args(1) as new com.sun.star.beans.PropertyValue
272*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Count&quot;
273*b1cdbd2cSJim Jagielski	args(0).Value = Count
274*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Select&quot;
275*b1cdbd2cSJim Jagielski	If IsMissing(bSelect) Then
276*b1cdbd2cSJim Jagielski		args(1).Value = false
277*b1cdbd2cSJim Jagielski	Else
278*b1cdbd2cSJim Jagielski		args(1).Value = bSelect
279*b1cdbd2cSJim Jagielski	End If
280*b1cdbd2cSJim Jagielski
281*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:GoDown&quot;, &quot;&quot;, 0, args())
282*b1cdbd2cSJim JagielskiEnd Sub
283*b1cdbd2cSJim Jagielski
284*b1cdbd2cSJim Jagielski
285*b1cdbd2cSJim Jagielski&apos;=======================================================
286*b1cdbd2cSJim Jagielski&apos; GoRight
287*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
288*b1cdbd2cSJim Jagielski&apos; Simulates the CursorRight key
289*b1cdbd2cSJim Jagielski&apos;=======================================================
290*b1cdbd2cSJim JagielskiSub goRight(Count As Integer, Optional bSelect As Boolean)
291*b1cdbd2cSJim Jagielski	dim document   as object
292*b1cdbd2cSJim Jagielski	dim dispatcher as object
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
295*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
296*b1cdbd2cSJim Jagielski
297*b1cdbd2cSJim Jagielski	dim args(1) as new com.sun.star.beans.PropertyValue
298*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Count&quot;
299*b1cdbd2cSJim Jagielski	args(0).Value = Count
300*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Select&quot;
301*b1cdbd2cSJim Jagielski	If IsMissing(bSelect) Then
302*b1cdbd2cSJim Jagielski		args(1).Value = false
303*b1cdbd2cSJim Jagielski	Else
304*b1cdbd2cSJim Jagielski		args(1).Value = bSelect
305*b1cdbd2cSJim Jagielski	End If
306*b1cdbd2cSJim Jagielski
307*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:GoRight&quot;, &quot;&quot;, 0, args())
308*b1cdbd2cSJim JagielskiEnd Sub
309*b1cdbd2cSJim Jagielski
310*b1cdbd2cSJim Jagielski&apos;=======================================================
311*b1cdbd2cSJim Jagielski&apos; GoLeft
312*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
313*b1cdbd2cSJim Jagielski&apos; Simulates the CursorLeft key
314*b1cdbd2cSJim Jagielski&apos;=======================================================
315*b1cdbd2cSJim JagielskiSub goLeft(Count As Integer, optional bSelect As boolean)
316*b1cdbd2cSJim Jagielski	dim document   as object
317*b1cdbd2cSJim Jagielski	dim dispatcher as object
318*b1cdbd2cSJim Jagielski
319*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
320*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
321*b1cdbd2cSJim Jagielski
322*b1cdbd2cSJim Jagielski	dim args(1) as new com.sun.star.beans.PropertyValue
323*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Count&quot;
324*b1cdbd2cSJim Jagielski	args(0).Value = Count
325*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Select&quot;
326*b1cdbd2cSJim Jagielski	If IsMissing(bSelect) Then
327*b1cdbd2cSJim Jagielski		args(1).Value = false
328*b1cdbd2cSJim Jagielski	Else
329*b1cdbd2cSJim Jagielski		args(1).Value = bSelect
330*b1cdbd2cSJim Jagielski	End If
331*b1cdbd2cSJim Jagielski
332*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:GoLeft&quot;, &quot;&quot;, 0, args())
333*b1cdbd2cSJim JagielskiEnd Sub
334*b1cdbd2cSJim Jagielski
335*b1cdbd2cSJim Jagielski&apos;=======================================================
336*b1cdbd2cSJim Jagielski&apos; CR
337*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
338*b1cdbd2cSJim Jagielski&apos; Inserts a Carriage Return (a new paragraph)
339*b1cdbd2cSJim Jagielski&apos;=======================================================
340*b1cdbd2cSJim JagielskiSub CR
341*b1cdbd2cSJim Jagielski	dim document   as object
342*b1cdbd2cSJim Jagielski	dim dispatcher as object
343*b1cdbd2cSJim Jagielski
344*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
345*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
346*b1cdbd2cSJim Jagielski
347*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
348*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
349*b1cdbd2cSJim Jagielski	oCur.gotoEndOfParagraph(0)
350*b1cdbd2cSJim Jagielski	thiscomponent.getcurrentcontroller.select(oCur)
351*b1cdbd2cSJim Jagielski
352*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertPara&quot;, &quot;&quot;, 0, Array())
353*b1cdbd2cSJim JagielskiEnd Sub
354*b1cdbd2cSJim Jagielski
355*b1cdbd2cSJim Jagielski&apos;=======================================================
356*b1cdbd2cSJim Jagielski&apos; CR_before
357*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
358*b1cdbd2cSJim Jagielski&apos; Inserts a Carriage Return (a new paragraph) before the current para
359*b1cdbd2cSJim Jagielski&apos;=======================================================
360*b1cdbd2cSJim JagielskiSub CR_before
361*b1cdbd2cSJim Jagielski	dim document   as object
362*b1cdbd2cSJim Jagielski	dim dispatcher as object
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
365*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
368*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
369*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
370*b1cdbd2cSJim Jagielski	thiscomponent.getcurrentcontroller.select(oCur)
371*b1cdbd2cSJim Jagielski
372*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertPara&quot;, &quot;&quot;, 0, Array())
373*b1cdbd2cSJim JagielskiEnd Sub
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski&apos;=======================================================
376*b1cdbd2cSJim Jagielski&apos; LF
377*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
378*b1cdbd2cSJim Jagielski&apos; Inserts a line feed (manual line break)
379*b1cdbd2cSJim Jagielski&apos;=======================================================
380*b1cdbd2cSJim Jagielskisub LF
381*b1cdbd2cSJim Jagielski	dim document   as object
382*b1cdbd2cSJim Jagielski	dim dispatcher as object
383*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
384*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
385*b1cdbd2cSJim Jagielski
386*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertLinebreak&quot;, &quot;&quot;, 0, Array())
387*b1cdbd2cSJim Jagielskiend sub
388*b1cdbd2cSJim Jagielski
389*b1cdbd2cSJim Jagielski&apos;=======================================================
390*b1cdbd2cSJim Jagielski&apos; SetParaStyle
391*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
392*b1cdbd2cSJim Jagielski&apos; Sets the para style to the given value
393*b1cdbd2cSJim Jagielski&apos;=======================================================
394*b1cdbd2cSJim JagielskiSub SetParaStyle(StyleName As String)
395*b1cdbd2cSJim Jagielski	dim document   as object
396*b1cdbd2cSJim Jagielski	dim dispatcher as object
397*b1cdbd2cSJim Jagielski
398*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
399*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
400*b1cdbd2cSJim Jagielski
401*b1cdbd2cSJim Jagielski	dim args(1) as new com.sun.star.beans.PropertyValue
402*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Template&quot;
403*b1cdbd2cSJim Jagielski	args(0).Value = StyleName
404*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Family&quot;
405*b1cdbd2cSJim Jagielski	args(1).Value = 2
406*b1cdbd2cSJim Jagielski
407*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:StyleApply&quot;, &quot;&quot;, 0, args())
408*b1cdbd2cSJim Jagielskiend Sub
409*b1cdbd2cSJim Jagielski
410*b1cdbd2cSJim Jagielski&apos;=======================================================
411*b1cdbd2cSJim Jagielski&apos; SetCharStyle
412*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
413*b1cdbd2cSJim Jagielski&apos; Sets the character style to the given value
414*b1cdbd2cSJim Jagielski&apos;=======================================================
415*b1cdbd2cSJim JagielskiSub SetCharStyle(StyleName As String)
416*b1cdbd2cSJim Jagielski	dim document   as object
417*b1cdbd2cSJim Jagielski	dim dispatcher as object
418*b1cdbd2cSJim Jagielski
419*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
420*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
421*b1cdbd2cSJim Jagielski
422*b1cdbd2cSJim Jagielski	dim args(1) as new com.sun.star.beans.PropertyValue
423*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Template&quot;
424*b1cdbd2cSJim Jagielski	args(0).Value = StyleName
425*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Family&quot;
426*b1cdbd2cSJim Jagielski	args(1).Value = 1
427*b1cdbd2cSJim Jagielski
428*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:StyleApply&quot;, &quot;&quot;, 0, args())
429*b1cdbd2cSJim Jagielskiend Sub
430*b1cdbd2cSJim Jagielski
431*b1cdbd2cSJim Jagielski&apos;=======================================================
432*b1cdbd2cSJim Jagielski&apos; InsertNewParaData
433*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
434*b1cdbd2cSJim Jagielski&apos; Inserts a new ID for the paragraph
435*b1cdbd2cSJim Jagielski&apos;=======================================================
436*b1cdbd2cSJim JagielskiSub InsertNewParaData
437*b1cdbd2cSJim Jagielski
438*b1cdbd2cSJim Jagielski		If not IsHelpFile Then
439*b1cdbd2cSJim Jagielski		msgbox(strErr_NoHelpFile)
440*b1cdbd2cSJim Jagielski		Exit Sub
441*b1cdbd2cSJim Jagielski	End If
442*b1cdbd2cSJim Jagielski
443*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
444*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
445*b1cdbd2cSJim Jagielski
446*b1cdbd2cSJim Jagielski	arParaData = GetParaData
447*b1cdbd2cSJim Jagielski	sID = arParaData(0)
448*b1cdbd2cSJim Jagielski	slocalize = arParaData(1)
449*b1cdbd2cSJim Jagielski	sMsg = arParaData(2)
450*b1cdbd2cSJim Jagielski
451*b1cdbd2cSJim Jagielski	If sMsg &lt;&gt; &quot;&quot; Then
452*b1cdbd2cSJim Jagielski		msgbox &quot;Cannot assign paragraph id:&quot;+chr(13)+sMsg,48,&quot;Error&quot;
453*b1cdbd2cSJim Jagielski		Exit Sub
454*b1cdbd2cSJim Jagielski	End If
455*b1cdbd2cSJim Jagielski
456*b1cdbd2cSJim Jagielski	If sID &lt;&gt; &quot;&quot; Then
457*b1cdbd2cSJim Jagielski		msgbox &quot;Paragraph already has an ID.&quot;+chr(13)+&quot;If you want to assign a new ID delete the existing one first.&quot;,48,&quot;Error&quot;
458*b1cdbd2cSJim Jagielski		Exit Sub
459*b1cdbd2cSJim Jagielski	End If
460*b1cdbd2cSJim Jagielski
461*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
462*b1cdbd2cSJim Jagielski
463*b1cdbd2cSJim Jagielski	If (Left(oCur.ParaStyleName,8) = &quot;hlp_head&quot;) Then
464*b1cdbd2cSJim Jagielski		id = &quot;hd_id&quot; + CreateID
465*b1cdbd2cSJim Jagielski		thiscomponent.getcurrentcontroller.select(oCur)
466*b1cdbd2cSJim Jagielski		MetaData = id
467*b1cdbd2cSJim Jagielski		SetCharStyle(&quot;hlp_aux_parachanged&quot;)
468*b1cdbd2cSJim Jagielski		InsertField(&quot;ID&quot;,MetaData)
469*b1cdbd2cSJim Jagielski		SetCharStyle(&quot;Default&quot;)
470*b1cdbd2cSJim Jagielski	Else
471*b1cdbd2cSJim Jagielski		id = &quot;par_id&quot; + CreateID
472*b1cdbd2cSJim Jagielski		thiscomponent.getcurrentcontroller.select(oCur)
473*b1cdbd2cSJim Jagielski		MetaData = id
474*b1cdbd2cSJim Jagielski		SetCharStyle(&quot;hlp_aux_parachanged&quot;)
475*b1cdbd2cSJim Jagielski		InsertField(&quot;ID&quot;,MetaData)
476*b1cdbd2cSJim Jagielski		SetCharStyle(&quot;Default&quot;)
477*b1cdbd2cSJim Jagielski	End If
478*b1cdbd2cSJim Jagielski
479*b1cdbd2cSJim Jagielski
480*b1cdbd2cSJim JagielskiEnd Sub
481*b1cdbd2cSJim Jagielski
482*b1cdbd2cSJim Jagielski&apos;=======================================================
483*b1cdbd2cSJim Jagielski&apos; LoadDialog
484*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
485*b1cdbd2cSJim Jagielski&apos; Loads a BASIC dialog
486*b1cdbd2cSJim Jagielski&apos;=======================================================
487*b1cdbd2cSJim JagielskiFunction LoadDialog(Libname as String, DialogName as String, Optional oLibContainer)
488*b1cdbd2cSJim Jagielski	Dim oLib as Object
489*b1cdbd2cSJim Jagielski	Dim oLibDialog as Object
490*b1cdbd2cSJim Jagielski	Dim oRuntimeDialog as Object
491*b1cdbd2cSJim Jagielski
492*b1cdbd2cSJim Jagielski	If IsMissing(oLibContainer ) then
493*b1cdbd2cSJim Jagielski		oLibContainer = DialogLibraries
494*b1cdbd2cSJim Jagielski	End If
495*b1cdbd2cSJim Jagielski
496*b1cdbd2cSJim Jagielski	oLibContainer.LoadLibrary(LibName)
497*b1cdbd2cSJim Jagielski	oLib = oLibContainer.GetByName(Libname)
498*b1cdbd2cSJim Jagielski	oLibDialog = oLib.GetByName(DialogName)
499*b1cdbd2cSJim Jagielski	oRuntimeDialog = CreateUnoDialog(oLibDialog)
500*b1cdbd2cSJim Jagielski	LoadDialog() = oRuntimeDialog
501*b1cdbd2cSJim JagielskiEnd Function
502*b1cdbd2cSJim Jagielski
503*b1cdbd2cSJim Jagielski&apos;=======================================================
504*b1cdbd2cSJim Jagielski&apos; Surprise
505*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
506*b1cdbd2cSJim Jagielski&apos; D&apos;oh
507*b1cdbd2cSJim Jagielski&apos;=======================================================
508*b1cdbd2cSJim JagielskiSub Surprise
509*b1cdbd2cSJim Jagielski	msgbox &quot;This function is unsupported.&quot;+chr(13)+&quot;If you know how to implement this -- go ahead!&quot;,0,&quot;D&apos;oh!&quot;
510*b1cdbd2cSJim JagielskiEnd Sub
511*b1cdbd2cSJim Jagielski
512*b1cdbd2cSJim Jagielski&apos;=======================================================
513*b1cdbd2cSJim Jagielski&apos; InsertNote
514*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
515*b1cdbd2cSJim Jagielski&apos; Inserts a note (annotation) at the current position
516*b1cdbd2cSJim Jagielski&apos;=======================================================
517*b1cdbd2cSJim Jagielskisub InsertNote(Content As String)
518*b1cdbd2cSJim Jagielski	dim document   as object
519*b1cdbd2cSJim Jagielski	dim dispatcher as object
520*b1cdbd2cSJim Jagielski
521*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
522*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
523*b1cdbd2cSJim Jagielski
524*b1cdbd2cSJim Jagielski	dim args(2) as new com.sun.star.beans.PropertyValue
525*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Text&quot;
526*b1cdbd2cSJim Jagielski	args(0).Value = Content
527*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Author&quot;
528*b1cdbd2cSJim Jagielski	args(1).Value = &quot;Help Tooling - DO NOT EDIT&quot;
529*b1cdbd2cSJim Jagielski	args(2).Name = &quot;Date&quot;
530*b1cdbd2cSJim Jagielski	args(2).Value = &quot;02/27/2004&quot;
531*b1cdbd2cSJim Jagielski
532*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertAnnotation&quot;, &quot;&quot;, 0, args())
533*b1cdbd2cSJim Jagielskiend sub
534*b1cdbd2cSJim Jagielski
535*b1cdbd2cSJim Jagielski&apos;=======================================================
536*b1cdbd2cSJim Jagielski&apos; InsertText
537*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
538*b1cdbd2cSJim Jagielski&apos; Inserts a string at the current position
539*b1cdbd2cSJim Jagielski&apos;=======================================================
540*b1cdbd2cSJim JagielskiSub InsertText(strg As String)
541*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
542*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
543*b1cdbd2cSJim Jagielski	oCur.String = strg
544*b1cdbd2cSJim JagielskiEnd Sub
545*b1cdbd2cSJim Jagielski
546*b1cdbd2cSJim Jagielski&apos;=======================================================
547*b1cdbd2cSJim Jagielski&apos; ParaIsEmpty
548*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
549*b1cdbd2cSJim Jagielski&apos; Evaluates if a paragraph is empty.
550*b1cdbd2cSJim Jagielski&apos;=======================================================
551*b1cdbd2cSJim JagielskiFunction ParaIsEmpty
552*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
553*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
554*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
555*b1cdbd2cSJim Jagielski	ParaIsEmpty = oCur.IsEndOfParagraph
556*b1cdbd2cSJim JagielskiEnd Function
557*b1cdbd2cSJim Jagielski
558*b1cdbd2cSJim Jagielski&apos;=======================================================
559*b1cdbd2cSJim Jagielski&apos; IsInBookmark
560*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
561*b1cdbd2cSJim Jagielski&apos; Evaluates if the cursor is inside a &lt;bookmark&gt; &lt;/bookmark&gt; element
562*b1cdbd2cSJim Jagielski&apos;=======================================================
563*b1cdbd2cSJim JagielskiFunction IsInBookmark
564*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
565*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
566*b1cdbd2cSJim Jagielski
567*b1cdbd2cSJim Jagielski	If ((oCur.ParaStyleName = &quot;hlp_aux_bookmark&quot;) AND (not(oCur.IsEndOfParagraph))) Then
568*b1cdbd2cSJim Jagielski		oCur.GotoStartOfParagraph(0)
569*b1cdbd2cSJim Jagielski		oCur.GotoEndOfParagraph(1)
570*b1cdbd2cSJim Jagielski		sText = Left(oCur.GetString,Instr(oCur.GetString,&quot;&quot;&quot; id=&quot;&quot;&quot;)-1)
571*b1cdbd2cSJim Jagielski		sText = Right(sText,Len(sText)-InStr(sText,&quot;&quot;&quot;&quot;))
572*b1cdbd2cSJim Jagielski		Select Case Left(sText,3)
573*b1cdbd2cSJim Jagielski			Case &quot;ind&quot;
574*b1cdbd2cSJim Jagielski				IsInBookmark = 1
575*b1cdbd2cSJim Jagielski			Case &quot;hid&quot;
576*b1cdbd2cSJim Jagielski				IsInBookmark = 2
577*b1cdbd2cSJim Jagielski			Case &quot;con&quot;
578*b1cdbd2cSJim Jagielski				IsInBookmark = 3
579*b1cdbd2cSJim Jagielski			Case Else
580*b1cdbd2cSJim Jagielski				IsInBookmark = 0
581*b1cdbd2cSJim Jagielski		End Select
582*b1cdbd2cSJim Jagielski	Else
583*b1cdbd2cSJim Jagielski		IsInBookmark = 0
584*b1cdbd2cSJim Jagielski	End If
585*b1cdbd2cSJim JagielskiEnd Function
586*b1cdbd2cSJim Jagielski
587*b1cdbd2cSJim Jagielski&apos;=======================================================
588*b1cdbd2cSJim Jagielski&apos; IsInTable
589*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
590*b1cdbd2cSJim Jagielski&apos; Evaluates if the cursor is in a table
591*b1cdbd2cSJim Jagielski&apos;=======================================================
592*b1cdbd2cSJim JagielskiFunction IsInTable
593*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
594*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
595*b1cdbd2cSJim Jagielski
596*b1cdbd2cSJim Jagielski	IsInTable = (VarType(oCur.TextTable) &lt;&gt; 0)
597*b1cdbd2cSJim JagielskiEnd Function
598*b1cdbd2cSJim Jagielski
599*b1cdbd2cSJim Jagielski&apos;=======================================================
600*b1cdbd2cSJim Jagielski&apos; InsertLink
601*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
602*b1cdbd2cSJim Jagielski&apos; Inserts a hyperlink at the current position
603*b1cdbd2cSJim Jagielski&apos;=======================================================
604*b1cdbd2cSJim JagielskiSub InsertLink(sPath As String, sText As String, sName As String)
605*b1cdbd2cSJim Jagielski	dim document   as object
606*b1cdbd2cSJim Jagielski	dim dispatcher as object
607*b1cdbd2cSJim Jagielski
608*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
609*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski	dim args(4) as new com.sun.star.beans.PropertyValue
612*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Hyperlink.Text&quot;
613*b1cdbd2cSJim Jagielski	args(0).Value = sText
614*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Hyperlink.URL&quot;
615*b1cdbd2cSJim Jagielski	args(1).Value = sPath
616*b1cdbd2cSJim Jagielski	args(2).Name = &quot;Hyperlink.Target&quot;
617*b1cdbd2cSJim Jagielski	args(2).Value = &quot;&quot;
618*b1cdbd2cSJim Jagielski	args(3).Name = &quot;Hyperlink.Name&quot;
619*b1cdbd2cSJim Jagielski	args(3).Value = sName
620*b1cdbd2cSJim Jagielski	args(4).Name = &quot;Hyperlink.Type&quot;
621*b1cdbd2cSJim Jagielski	args(4).Value = 1
622*b1cdbd2cSJim Jagielski
623*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:SetHyperlink&quot;, &quot;&quot;, 0, args())
624*b1cdbd2cSJim Jagielski	args(0).Name = &quot;Count&quot;
625*b1cdbd2cSJim Jagielski	args(0).Value = 1
626*b1cdbd2cSJim Jagielski	args(1).Name = &quot;Select&quot;
627*b1cdbd2cSJim Jagielski	args(1).Value = false
628*b1cdbd2cSJim Jagielski
629*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:GoRight&quot;, &quot;&quot;, 0, args())
630*b1cdbd2cSJim Jagielski
631*b1cdbd2cSJim JagielskiEnd Sub
632*b1cdbd2cSJim Jagielski
633*b1cdbd2cSJim Jagielski&apos;=======================================================
634*b1cdbd2cSJim Jagielski&apos; AssignMissingIDs
635*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
636*b1cdbd2cSJim Jagielski&apos; Assigns IDs to elements that miss them
637*b1cdbd2cSJim Jagielski&apos;=======================================================
638*b1cdbd2cSJim JagielskiSub AssignMissingIDs
639*b1cdbd2cSJim Jagielski&apos; NOT IMPLEMENTED YET
640*b1cdbd2cSJim Jagielskiend sub
641*b1cdbd2cSJim Jagielski
642*b1cdbd2cSJim Jagielski&apos;=======================================================
643*b1cdbd2cSJim Jagielski&apos; CreateTable
644*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
645*b1cdbd2cSJim Jagielski&apos; Creates a new table
646*b1cdbd2cSJim Jagielski&apos;=======================================================
647*b1cdbd2cSJim JagielskiSub CreateTable(nRows as Integer, nCols as Integer, sID as String)
648*b1cdbd2cSJim Jagielski	dim document   as object
649*b1cdbd2cSJim Jagielski	dim dispatcher as object
650*b1cdbd2cSJim Jagielski
651*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
652*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski	dim args1(3) as new com.sun.star.beans.PropertyValue
655*b1cdbd2cSJim Jagielski	args1(0).Name = &quot;TableName&quot;
656*b1cdbd2cSJim Jagielski	args1(0).Value = sID
657*b1cdbd2cSJim Jagielski	args1(1).Name = &quot;Columns&quot;
658*b1cdbd2cSJim Jagielski	args1(1).Value = nCols
659*b1cdbd2cSJim Jagielski	args1(2).Name = &quot;Rows&quot;
660*b1cdbd2cSJim Jagielski	args1(2).Value = nRows
661*b1cdbd2cSJim Jagielski	args1(3).Name = &quot;Flags&quot;
662*b1cdbd2cSJim Jagielski	args1(3).Value = 9
663*b1cdbd2cSJim Jagielski
664*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:InsertTable&quot;, &quot;&quot;, 0, args1())
665*b1cdbd2cSJim Jagielski
666*b1cdbd2cSJim Jagielski	args1(0).Name = &quot;TopBottomMargin.TopMargin&quot;
667*b1cdbd2cSJim Jagielski	args1(0).Value = 500
668*b1cdbd2cSJim Jagielski	args1(1).Name = &quot;TopBottomMargin.BottomMargin&quot;
669*b1cdbd2cSJim Jagielski	args1(1).Value = 0
670*b1cdbd2cSJim Jagielski	args1(2).Name = &quot;TopBottomMargin.TopRelMargin&quot;
671*b1cdbd2cSJim Jagielski	args1(2).Value = 100
672*b1cdbd2cSJim Jagielski	args1(3).Name = &quot;TopBottomMargin.BottomRelMargin&quot;
673*b1cdbd2cSJim Jagielski	args1(3).Value = 100
674*b1cdbd2cSJim Jagielski
675*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:TopBottomMargin&quot;, &quot;&quot;, 0, args1())
676*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:SelectAll&quot;, &quot;&quot;, 0, Array())
677*b1cdbd2cSJim Jagielski	SetParaStyle(&quot;hlp_tablecontent&quot;)
678*b1cdbd2cSJim Jagielski	GoDown(1)
679*b1cdbd2cSJim Jagielskiend Sub
680*b1cdbd2cSJim Jagielski
681*b1cdbd2cSJim Jagielski&apos;=======================================================
682*b1cdbd2cSJim Jagielski&apos; IsBlockImage
683*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
684*b1cdbd2cSJim Jagielski&apos; Evaluates if the cursor is in a paragraph with
685*b1cdbd2cSJim Jagielski&apos; a block image (image in its own paragraph)
686*b1cdbd2cSJim Jagielski&apos;=======================================================
687*b1cdbd2cSJim JagielskiFunction IsBlockImage
688*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
689*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
690*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
691*b1cdbd2cSJim Jagielski	oCur.gotoEndOfParagraph(1)
692*b1cdbd2cSJim Jagielski	sStr = Right(oCur.String,Len(oCur.String)-InStr(oCur.String,&quot; &quot;))  &apos;string must start with &lt;IMG and end with IMG with no &lt;IMG in between
693*b1cdbd2cSJim Jagielski	IsBlockImage = (not(Left(sStr,4)=&quot;IMG&gt;&quot;) AND (Right(sStr,6)=&quot;&lt;/IMG&gt;&quot;))
694*b1cdbd2cSJim JagielskiEnd Function
695*b1cdbd2cSJim Jagielski
696*b1cdbd2cSJim Jagielski&apos;=======================================================
697*b1cdbd2cSJim Jagielski&apos; HasCaption
698*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
699*b1cdbd2cSJim Jagielski&apos; Evaluates if the current image has a caption element
700*b1cdbd2cSJim Jagielski&apos;=======================================================
701*b1cdbd2cSJim JagielskiFunction HasCaption
702*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
703*b1cdbd2cSJim Jagielski	If oSel.ImplementationName = &quot;SwXTextGraphicObject&quot; Then
704*b1cdbd2cSJim Jagielski		oCur = oSel(0).getAnchor.getText.createTextCursorByRange(oSel(0).getAnchor)
705*b1cdbd2cSJim Jagielski	Else
706*b1cdbd2cSJim Jagielski		oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
707*b1cdbd2cSJim Jagielski	End If
708*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
709*b1cdbd2cSJim Jagielski	oCur.gotoEndOfParagraph(1)
710*b1cdbd2cSJim Jagielski	HasCaption = (InStr(oCur.String,&quot;&lt;IMGCAPTION&quot;)&gt;0)
711*b1cdbd2cSJim JagielskiEnd Function
712*b1cdbd2cSJim Jagielski
713*b1cdbd2cSJim Jagielski&apos;=======================================================
714*b1cdbd2cSJim Jagielski&apos; GetImageID
715*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
716*b1cdbd2cSJim Jagielski&apos; Returns the ID of an image at the cursor position
717*b1cdbd2cSJim Jagielski&apos;=======================================================
718*b1cdbd2cSJim JagielskiFunction GetImageID
719*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
720*b1cdbd2cSJim Jagielski	If oSel.ImplementationName = &quot;SwXTextGraphicObject&quot; Then
721*b1cdbd2cSJim Jagielski		oCur = oSel(0).getAnchor.getText.createTextCursorByRange(oSel(0).getAnchor)
722*b1cdbd2cSJim Jagielski	Else
723*b1cdbd2cSJim Jagielski		oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
724*b1cdbd2cSJim Jagielski	End If
725*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
726*b1cdbd2cSJim Jagielski	oCur.gotoEndOfParagraph(1)
727*b1cdbd2cSJim Jagielski	sStr = Right(oCur.String,Len(oCur.String)-(InStr(oCur.String,&quot;IMG ID=&quot;&quot;&quot;)+7))
728*b1cdbd2cSJim Jagielski	GetImageID = Left(sStr,InStr(sStr,&quot;&quot;&quot;&gt;&quot;)+1)  &apos;string must start with &lt;IMG and end with IMG with no &lt;IMG in between
729*b1cdbd2cSJim JagielskiEnd Function
730*b1cdbd2cSJim Jagielski
731*b1cdbd2cSJim Jagielski&apos;=======================================================
732*b1cdbd2cSJim Jagielski&apos; SelAll
733*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
734*b1cdbd2cSJim Jagielski&apos; Selects everything
735*b1cdbd2cSJim Jagielski&apos;=======================================================
736*b1cdbd2cSJim JagielskiSub SelAll
737*b1cdbd2cSJim Jagielski	dim document   as object
738*b1cdbd2cSJim Jagielski	dim dispatcher as object
739*b1cdbd2cSJim Jagielski
740*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
741*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
742*b1cdbd2cSJim Jagielski
743*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:SelectAll&quot;, &quot;&quot;, 0, Array())
744*b1cdbd2cSJim JagielskiEnd Sub
745*b1cdbd2cSJim Jagielski
746*b1cdbd2cSJim Jagielski&apos;=======================================================
747*b1cdbd2cSJim Jagielski&apos; GetParaData
748*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
749*b1cdbd2cSJim Jagielski&apos; Returns the Paragraph ID and localization status
750*b1cdbd2cSJim Jagielski&apos;=======================================================
751*b1cdbd2cSJim JagielskiFunction GetParaData
752*b1cdbd2cSJim Jagielski	arParaData = Array(&quot;&quot;,&quot;&quot;,&quot;&quot;) &apos; ID, localize, #message
753*b1cdbd2cSJim Jagielski
754*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
755*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
756*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
757*b1cdbd2cSJim Jagielski	oCur.gotoEndOfParagraph(1)
758*b1cdbd2cSJim Jagielski	sID = &quot;&quot;
759*b1cdbd2cSJim Jagielski	Enum = oCur.createEnumeration
760*b1cdbd2cSJim Jagielski	Fd = FALSE
761*b1cdbd2cSJim Jagielski
762*b1cdbd2cSJim Jagielski
763*b1cdbd2cSJim Jagielski	TE = Enum.nextElement
764*b1cdbd2cSJim Jagielski
765*b1cdbd2cSJim Jagielski	TP = TE.createEnumeration
766*b1cdbd2cSJim Jagielski	Ct = 0
767*b1cdbd2cSJim Jagielski	posID = 0
768*b1cdbd2cSJim Jagielski
769*b1cdbd2cSJim Jagielski	Do While TP.hasmoreElements
770*b1cdbd2cSJim Jagielski		Ct = Ct+1
771*b1cdbd2cSJim Jagielski		TPE = TP.nextElement
772*b1cdbd2cSJim Jagielski		If TPE.TextPortionType=&quot;TextField&quot; Then
773*b1cdbd2cSJim Jagielski			If TPE.TextField.TextFieldMaster.Name=&quot;ID&quot; Then
774*b1cdbd2cSJim Jagielski				sID = TPE.TextField.Content
775*b1cdbd2cSJim Jagielski				Fd = TRUE
776*b1cdbd2cSJim Jagielski				Exit Do
777*b1cdbd2cSJim Jagielski			End If
778*b1cdbd2cSJim Jagielski		End If
779*b1cdbd2cSJim Jagielski		If TPE.String = &quot;&quot; Then
780*b1cdbd2cSJim Jagielski			Ct = Ct-1
781*b1cdbd2cSJim Jagielski		End If
782*b1cdbd2cSJim Jagielski	Loop
783*b1cdbd2cSJim Jagielski
784*b1cdbd2cSJim Jagielski	If ((Left(oCur.ParaStyleName,8) = &quot;hlp_aux_&quot;) or (Left(oCur.ParaStyleName,4) &lt;&gt; &quot;hlp_&quot;)) Then
785*b1cdbd2cSJim Jagielski		arParaData(2)=&quot;Invalid Paragraph Style&quot;
786*b1cdbd2cSJim Jagielski		GetParaData = arParaData
787*b1cdbd2cSJim Jagielski		Exit Function
788*b1cdbd2cSJim Jagielski	End If
789*b1cdbd2cSJim Jagielski
790*b1cdbd2cSJim Jagielski	If sID = &quot;&quot; Then
791*b1cdbd2cSJim Jagielski		GetParaData = arParaData
792*b1cdbd2cSJim Jagielski		Exit Function
793*b1cdbd2cSJim Jagielski	End If
794*b1cdbd2cSJim Jagielski
795*b1cdbd2cSJim Jagielski	If Right(sID,7) = &quot;_NOL10N&quot; Then
796*b1cdbd2cSJim Jagielski		arParaData(0) = Left(sID,Len(sID)-7)
797*b1cdbd2cSJim Jagielski		arParaData(1) = &quot;no&quot;
798*b1cdbd2cSJim Jagielski	Else
799*b1cdbd2cSJim Jagielski		arParaData(0) = sID
800*b1cdbd2cSJim Jagielski		arParaData(1) = &quot;yes&quot;
801*b1cdbd2cSJim Jagielski	End If
802*b1cdbd2cSJim Jagielski
803*b1cdbd2cSJim Jagielski	GetParaData = arParaData
804*b1cdbd2cSJim JagielskiEnd Function
805*b1cdbd2cSJim Jagielski
806*b1cdbd2cSJim Jagielski&apos;=======================================================
807*b1cdbd2cSJim Jagielski&apos; SetsParaData
808*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
809*b1cdbd2cSJim Jagielski&apos; Sets the Paragraph ID and localization status
810*b1cdbd2cSJim Jagielski&apos;=======================================================
811*b1cdbd2cSJim Jagielski
812*b1cdbd2cSJim JagielskiSub SetParaData(sID as String, sLocalize as String)
813*b1cdbd2cSJim Jagielski
814*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
815*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
816*b1cdbd2cSJim Jagielski	oCur.gotoStartOfParagraph(0)
817*b1cdbd2cSJim Jagielski	oCur.gotoEndOfParagraph(1)
818*b1cdbd2cSJim Jagielski	Enum = oCur.createEnumeration
819*b1cdbd2cSJim Jagielski	Fd = FALSE
820*b1cdbd2cSJim Jagielski
821*b1cdbd2cSJim Jagielski
822*b1cdbd2cSJim Jagielski	Do While Enum.hasMoreElements
823*b1cdbd2cSJim Jagielski		TE = Enum.nextElement
824*b1cdbd2cSJim Jagielski
825*b1cdbd2cSJim Jagielski		TP = TE.createEnumeration
826*b1cdbd2cSJim Jagielski		Ct = 0
827*b1cdbd2cSJim Jagielski		posID = 0
828*b1cdbd2cSJim Jagielski
829*b1cdbd2cSJim Jagielski		Do While TP.hasmoreElements
830*b1cdbd2cSJim Jagielski			Ct = Ct+1
831*b1cdbd2cSJim Jagielski			TPE = TP.nextElement
832*b1cdbd2cSJim Jagielski			If TPE.TextPortionType=&quot;TextField&quot; Then
833*b1cdbd2cSJim Jagielski				If TPE.TextField.TextFieldMaster.Name=&quot;ID&quot; Then
834*b1cdbd2cSJim Jagielski					posID = Ct
835*b1cdbd2cSJim Jagielski					If sLocalize = &quot;no&quot; Then
836*b1cdbd2cSJim Jagielski						TPE.TextField.Content = sID+&quot;_NOL10N&quot;
837*b1cdbd2cSJim Jagielski						TPE.TextField.IsVisible = TRUE
838*b1cdbd2cSJim Jagielski					ElseIf sLocalize = &quot;yes&quot; Then
839*b1cdbd2cSJim Jagielski						TPE.TextField.Content = sID
840*b1cdbd2cSJim Jagielski						TPE.TextField.IsVisible = TRUE
841*b1cdbd2cSJim Jagielski					Else
842*b1cdbd2cSJim Jagielski						msgbox &quot;Unknown localization parameter: &quot;+sLocalize,0,&quot;Error&quot;
843*b1cdbd2cSJim Jagielski					End If
844*b1cdbd2cSJim Jagielski					Fd = TRUE
845*b1cdbd2cSJim Jagielski					Exit Do
846*b1cdbd2cSJim Jagielski				End If
847*b1cdbd2cSJim Jagielski			End If
848*b1cdbd2cSJim Jagielski			If TPE.String = &quot;&quot; Then
849*b1cdbd2cSJim Jagielski				Ct = Ct-1
850*b1cdbd2cSJim Jagielski			End If
851*b1cdbd2cSJim Jagielski		Loop
852*b1cdbd2cSJim Jagielski		If Fd Then
853*b1cdbd2cSJim Jagielski			Exit Do
854*b1cdbd2cSJim Jagielski		End If
855*b1cdbd2cSJim Jagielski	Loop
856*b1cdbd2cSJim Jagielski
857*b1cdbd2cSJim Jagielski	oCur.TextField.update
858*b1cdbd2cSJim Jagielski	UpdateFields
859*b1cdbd2cSJim Jagielski
860*b1cdbd2cSJim JagielskiEnd Sub
861*b1cdbd2cSJim Jagielski
862*b1cdbd2cSJim Jagielski
863*b1cdbd2cSJim Jagielski&apos;=======================================================
864*b1cdbd2cSJim Jagielski&apos; IsInList
865*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
866*b1cdbd2cSJim Jagielski&apos; Evaluates if the cursor is inside a list (ordered or unordered)
867*b1cdbd2cSJim Jagielski&apos;=======================================================
868*b1cdbd2cSJim JagielskiFunction IsInList
869*b1cdbd2cSJim Jagielski	oSel = thiscomponent.getcurrentcontroller.getselection
870*b1cdbd2cSJim Jagielski	oCur = oSel(0).getText.createTextCursorByRange(oSel(0))
871*b1cdbd2cSJim Jagielski	If oCur.NumberingStyleName = &quot;&quot;  Then
872*b1cdbd2cSJim Jagielski		IsInList = false
873*b1cdbd2cSJim Jagielski	ElseIf oCur.NumberingRules.NumberingIsOutline = true Then
874*b1cdbd2cSJim Jagielski		IsInList = false
875*b1cdbd2cSJim Jagielski	Else
876*b1cdbd2cSJim Jagielski		IsInList = true
877*b1cdbd2cSJim Jagielski	End If
878*b1cdbd2cSJim JagielskiEnd Function
879*b1cdbd2cSJim Jagielski
880*b1cdbd2cSJim Jagielski&apos;=======================================================
881*b1cdbd2cSJim Jagielski&apos; TagFormatIsCorrect
882*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
883*b1cdbd2cSJim Jagielski&apos; Checks for correct paragraph format for tags
884*b1cdbd2cSJim Jagielski&apos;=======================================================
885*b1cdbd2cSJim JagielskiFunction TagFormatIsCorrect(sTN As String, sPS As String)
886*b1cdbd2cSJim Jagielski
887*b1cdbd2cSJim Jagielski	arTag = Array(&quot;BOOKMARK&quot;,&quot;SORT&quot;,&quot;SECTION&quot;,&quot;SWITCH&quot;,&quot;CASE&quot;,&quot;DEFAULT&quot;)
888*b1cdbd2cSJim Jagielski	arTagFormat = Array(&quot;hlp_aux_bookmark&quot;,&quot;hlp_aux_sort&quot;,&quot;hlp_aux_section&quot;,&quot;hlp_aux_switch&quot;,&quot;hlp_aux_switch&quot;,&quot;hlp_aux_switch&quot;)
889*b1cdbd2cSJim Jagielski
890*b1cdbd2cSJim Jagielski	For n=0 to ubound(arTag)
891*b1cdbd2cSJim Jagielski		If (sTN = arTag(n) AND sPS &lt;&gt; arTagFormat(n)) Then
892*b1cdbd2cSJim Jagielski			TagFormatIsCorrect = arTagFormat(n)
893*b1cdbd2cSJim Jagielski			Exit Function
894*b1cdbd2cSJim Jagielski		End If
895*b1cdbd2cSJim Jagielski		TagFormatIsCorrect = &quot;&quot;
896*b1cdbd2cSJim Jagielski	Next n
897*b1cdbd2cSJim Jagielski
898*b1cdbd2cSJim JagielskiEnd Function
899*b1cdbd2cSJim Jagielski
900*b1cdbd2cSJim Jagielski&apos;=======================================================
901*b1cdbd2cSJim Jagielski&apos; GetFilePath
902*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
903*b1cdbd2cSJim Jagielski&apos; look for the &quot;text/...&quot; part of the file name and separate it
904*b1cdbd2cSJim Jagielski&apos;=======================================================
905*b1cdbd2cSJim JagielskiFunction GetFilePath(fname As String)
906*b1cdbd2cSJim Jagielski
907*b1cdbd2cSJim Jagielski	i = 1
908*b1cdbd2cSJim Jagielski	Do
909*b1cdbd2cSJim Jagielski		If (Mid(fname,i,5) = &quot;text/&quot;) Then
910*b1cdbd2cSJim Jagielski			Strg = Mid(fname,i,Len(fname)-i+1)
911*b1cdbd2cSJim Jagielski			Exit Do
912*b1cdbd2cSJim Jagielski		Else
913*b1cdbd2cSJim Jagielski			i = i+1
914*b1cdbd2cSJim Jagielski			Strg = fname
915*b1cdbd2cSJim Jagielski		End If
916*b1cdbd2cSJim Jagielski	Loop While (i+5 &lt; Len(fname))
917*b1cdbd2cSJim Jagielski	GetFilePath = Strg
918*b1cdbd2cSJim JagielskiEnd Function
919*b1cdbd2cSJim Jagielski
920*b1cdbd2cSJim Jagielski&apos;=======================================================
921*b1cdbd2cSJim Jagielski&apos; OpenGraphics
922*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
923*b1cdbd2cSJim Jagielski&apos; Calls the graphic open dialog for inserting an image
924*b1cdbd2cSJim Jagielski&apos;=======================================================
925*b1cdbd2cSJim JagielskiFunction OpenGraphics(oDoc As Object)
926*b1cdbd2cSJim JagielskiDim ListAny(0) as Long
927*b1cdbd2cSJim JagielskiDim oStoreProperties(0) as New com.sun.star.beans.PropertyValue
928*b1cdbd2cSJim Jagielski	GlobalScope.BasicLibraries.loadLibrary(&quot;Tools&quot;)
929*b1cdbd2cSJim Jagielski	ListAny(0) = com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE
930*b1cdbd2cSJim Jagielski&apos;	ListAny(0) = com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE
931*b1cdbd2cSJim Jagielski	oFileDialog = CreateUnoService(&quot;com.sun.star.ui.dialogs.FilePicker&quot;)
932*b1cdbd2cSJim Jagielski	oFileDialog.Initialize(ListAny())
933*b1cdbd2cSJim Jagielski
934*b1cdbd2cSJim Jagielski	sLastImgDir = ReadConfig(&quot;LastImgDir&quot;)
935*b1cdbd2cSJim Jagielski	If sLastImgDir &lt;&gt; &quot;&quot; Then
936*b1cdbd2cSJim Jagielski		oFileDialog.setDisplayDirectory(sLastImgDir)
937*b1cdbd2cSJim Jagielski	End If
938*b1cdbd2cSJim Jagielski
939*b1cdbd2cSJim Jagielski	oMasterKey = GetRegistryKeyContent(&quot;org.openoffice.TypeDetection.Types/&quot;)
940*b1cdbd2cSJim Jagielski	oTypes() = oMasterKey.Types
941*b1cdbd2cSJim Jagielski
942*b1cdbd2cSJim Jagielski	oFileDialog.AppendFilter(oTypes.GetByName(&quot;gif_Graphics_Interchange&quot;).UIName, &quot;*.gif&quot;)
943*b1cdbd2cSJim Jagielski	oFileDialog.AppendFilter(oTypes.GetByName(&quot;png_Portable_Network_Graphic&quot;).UIName, &quot;*.png&quot;)
944*b1cdbd2cSJim Jagielski
945*b1cdbd2cSJim Jagielski	oFileDialog.SetTitle(&quot;Insert Image&quot;)
946*b1cdbd2cSJim Jagielski	iAccept = oFileDialog.Execute()
947*b1cdbd2cSJim Jagielski	If iAccept = 1 Then
948*b1cdbd2cSJim Jagielski		sPath = oFileDialog.Files(0)
949*b1cdbd2cSJim Jagielski		WriteConfig(&quot;LastImgDir&quot;,oFileDialog.getDisplayDirectory)
950*b1cdbd2cSJim Jagielski		UIFilterName = oFileDialog.GetCurrentFilter()
951*b1cdbd2cSJim Jagielski		OpenGraphics = oFileDialog.Files(0)
952*b1cdbd2cSJim Jagielski	Else
953*b1cdbd2cSJim Jagielski		OpenGraphics = &quot;&quot;
954*b1cdbd2cSJim Jagielski	End If
955*b1cdbd2cSJim Jagielski	oFileDialog.Dispose()
956*b1cdbd2cSJim JagielskiEnd Function
957*b1cdbd2cSJim Jagielski
958*b1cdbd2cSJim Jagielski&apos;=======================================================
959*b1cdbd2cSJim Jagielski&apos; WriteConfig
960*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
961*b1cdbd2cSJim Jagielski&apos; Reads a parameter value from the config file
962*b1cdbd2cSJim Jagielski&apos;=======================================================
963*b1cdbd2cSJim JagielskiFunction ReadConfig(Parm As String)
964*b1cdbd2cSJim Jagielski	oPath = createUNOService(&quot;com.sun.star.util.PathSettings&quot;)
965*b1cdbd2cSJim Jagielski	filename = oPath.UserConfig+&quot;/helpauthoring.cfg&quot;
966*b1cdbd2cSJim Jagielski	iNumber = Freefile
967*b1cdbd2cSJim Jagielski	bFound = false
968*b1cdbd2cSJim Jagielski	If FileExists(filename) Then
969*b1cdbd2cSJim Jagielski		Open filename For Input As iNumber
970*b1cdbd2cSJim Jagielski		Do While (not eof(iNumber) AND not(bFound))
971*b1cdbd2cSJim Jagielski			Line Input #iNumber, sLine
972*b1cdbd2cSJim Jagielski			If InStr(sLine, &quot;=&quot;) &gt; 0 Then
973*b1cdbd2cSJim Jagielski				arLine = split(sLine,&quot;=&quot;)
974*b1cdbd2cSJim Jagielski				If arLine(0) = Parm Then
975*b1cdbd2cSJim Jagielski					sResult = arLine(1)
976*b1cdbd2cSJim Jagielski					bFound = true
977*b1cdbd2cSJim Jagielski				End If
978*b1cdbd2cSJim Jagielski			End If
979*b1cdbd2cSJim Jagielski		Loop
980*b1cdbd2cSJim Jagielski		Close #iNumber
981*b1cdbd2cSJim Jagielski		If bFound Then
982*b1cdbd2cSJim Jagielski			ReadConfig = sResult
983*b1cdbd2cSJim Jagielski		Else
984*b1cdbd2cSJim Jagielski			ReadConfig = &quot;&quot;
985*b1cdbd2cSJim Jagielski		End If
986*b1cdbd2cSJim Jagielski	Else
987*b1cdbd2cSJim Jagielski		ReadConfig = &quot;&quot;
988*b1cdbd2cSJim Jagielski	End If
989*b1cdbd2cSJim JagielskiEnd Function
990*b1cdbd2cSJim Jagielski
991*b1cdbd2cSJim Jagielski
992*b1cdbd2cSJim Jagielski&apos;=======================================================
993*b1cdbd2cSJim Jagielski&apos; WriteConfig
994*b1cdbd2cSJim Jagielski&apos;-------------------------------------------------------
995*b1cdbd2cSJim Jagielski&apos; Writes a parameter/value pair to the config file
996*b1cdbd2cSJim Jagielski&apos;=======================================================
997*b1cdbd2cSJim JagielskiFunction WriteConfig(Parm As String, Value As String)
998*b1cdbd2cSJim Jagielski	Dim arLines(0) As String
999*b1cdbd2cSJim Jagielski	bFound = false
1000*b1cdbd2cSJim Jagielski	oPath = createUNOService(&quot;com.sun.star.util.PathSettings&quot;)
1001*b1cdbd2cSJim Jagielski	filename = oPath.UserConfig+&quot;/helpauthoring.cfg&quot;
1002*b1cdbd2cSJim Jagielski	iNumber = Freefile
1003*b1cdbd2cSJim Jagielski	If FileExists(filename) Then
1004*b1cdbd2cSJim Jagielski
1005*b1cdbd2cSJim Jagielski		Open filename For Input As iNumber
1006*b1cdbd2cSJim Jagielski		Do While (not eof(iNumber))
1007*b1cdbd2cSJim Jagielski			Line Input #iNumber, sLine
1008*b1cdbd2cSJim Jagielski			If InStr(sLine, &quot;=&quot;) &gt; 0 Then
1009*b1cdbd2cSJim Jagielski				sDim = ubound(arLines())+1
1010*b1cdbd2cSJim Jagielski				ReDim Preserve arLines(sDim)
1011*b1cdbd2cSJim Jagielski				arLines(sDim) = sLine
1012*b1cdbd2cSJim Jagielski			End If
1013*b1cdbd2cSJim Jagielski		Loop
1014*b1cdbd2cSJim Jagielski		Close #iNumber
1015*b1cdbd2cSJim Jagielski
1016*b1cdbd2cSJim Jagielski		nLine = 1
1017*b1cdbd2cSJim Jagielski		Do While (nLine &lt;= ubound(arLines())) and (not bFound)
1018*b1cdbd2cSJim Jagielski			arLine = split(arLines(nLine),&quot;=&quot;)
1019*b1cdbd2cSJim Jagielski			If arLine(0) = Parm Then
1020*b1cdbd2cSJim Jagielski				arLines(nLine) = Parm+&quot;=&quot;+Value
1021*b1cdbd2cSJim Jagielski				bFound = true
1022*b1cdbd2cSJim Jagielski			End If
1023*b1cdbd2cSJim Jagielski			nLine = nLine +1
1024*b1cdbd2cSJim Jagielski		Loop
1025*b1cdbd2cSJim Jagielski
1026*b1cdbd2cSJim Jagielski		nLine = 1
1027*b1cdbd2cSJim Jagielski		Open filename For Output As iNumber
1028*b1cdbd2cSJim Jagielski		Do While (nLine &lt;= ubound(arLines()))
1029*b1cdbd2cSJim Jagielski			Print #iNumber, arLines(nLine)
1030*b1cdbd2cSJim Jagielski			nLine = nLine + 1
1031*b1cdbd2cSJim Jagielski		Loop
1032*b1cdbd2cSJim Jagielski		If (not bFound) Then
1033*b1cdbd2cSJim Jagielski			Print #iNumber, Parm+&quot;=&quot;+Value
1034*b1cdbd2cSJim Jagielski		End If
1035*b1cdbd2cSJim Jagielski		Close #iNumber
1036*b1cdbd2cSJim Jagielski
1037*b1cdbd2cSJim Jagielski	Else
1038*b1cdbd2cSJim Jagielski		Open filename For Output As iNumber
1039*b1cdbd2cSJim Jagielski		Print #iNumber, Parm+&quot;=&quot;+Value
1040*b1cdbd2cSJim Jagielski		Close #iNumber
1041*b1cdbd2cSJim Jagielski	End If
1042*b1cdbd2cSJim JagielskiEnd Function
1043*b1cdbd2cSJim Jagielski
1044*b1cdbd2cSJim JagielskiFunction GetRelPath(sPath As String)
1045*b1cdbd2cSJim Jagielski	sHelpPrefix = ReadConfig(&quot;HelpPrefix&quot;)
1046*b1cdbd2cSJim Jagielski	If sHelpPrefix = &quot;&quot; Then
1047*b1cdbd2cSJim Jagielski		sHelpPrefix = SetDocumentRoot
1048*b1cdbd2cSJim Jagielski	End If
1049*b1cdbd2cSJim Jagielski	GetRelPath = Right(sPath, Len(sPath)-(InStr(sPath,sHelpPrefix) + Len(sHelpPrefix)-1))
1050*b1cdbd2cSJim JagielskiEnd Function
1051*b1cdbd2cSJim Jagielski
1052*b1cdbd2cSJim JagielskiFunction SetDocumentRoot
1053*b1cdbd2cSJim Jagielski	sHelpPrefix = ReadConfig(&quot;HelpPrefix&quot;)
1054*b1cdbd2cSJim Jagielski	oFolderDialog = CreateUnoService(&quot;com.sun.star.ui.dialogs.FolderPicker&quot;)
1055*b1cdbd2cSJim Jagielski	oFolderDialog.SetTitle(&quot;Select Document Root Folder&quot;)
1056*b1cdbd2cSJim Jagielski	If sHelpPrefix &gt; &quot;&quot; Then
1057*b1cdbd2cSJim Jagielski		oFolderDialog.setDisplayDirectory(sHelpPrefix)
1058*b1cdbd2cSJim Jagielski	End If
1059*b1cdbd2cSJim Jagielski	iAccept = oFolderDialog.Execute()
1060*b1cdbd2cSJim Jagielski
1061*b1cdbd2cSJim Jagielski	If iAccept = 1 Then
1062*b1cdbd2cSJim Jagielski		sHelpPrefix = oFolderDialog.getDirectory + &quot;/&quot;
1063*b1cdbd2cSJim Jagielski		WriteConfig(&quot;HelpPrefix&quot;,sHelpPrefix)
1064*b1cdbd2cSJim Jagielski	End If
1065*b1cdbd2cSJim Jagielski
1066*b1cdbd2cSJim Jagielski	SetDocumentRoot = sHelpPrefix
1067*b1cdbd2cSJim JagielskiEnd Function
1068*b1cdbd2cSJim Jagielski
1069*b1cdbd2cSJim JagielskiFunction MakeAbsPath(sPath As String)
1070*b1cdbd2cSJim Jagielski
1071*b1cdbd2cSJim Jagielski	sHelpPrefix = ReadConfig(&quot;HelpPrefix&quot;)
1072*b1cdbd2cSJim Jagielski	If sHelpPrefix = &quot;&quot; Then
1073*b1cdbd2cSJim Jagielski		sHelpPrefix = SetDocumentRoot
1074*b1cdbd2cSJim Jagielski	End If
1075*b1cdbd2cSJim Jagielski
1076*b1cdbd2cSJim Jagielski	If Right(sPath,4) &lt;&gt; &quot;.xhp&quot; Then
1077*b1cdbd2cSJim Jagielski		sPath=sPath+&quot;.xhp&quot;
1078*b1cdbd2cSJim Jagielski	End If
1079*b1cdbd2cSJim Jagielski	MakeAbsPath = sHelpPrefix+sPath
1080*b1cdbd2cSJim JagielskiEnd Function
1081*b1cdbd2cSJim Jagielski
1082*b1cdbd2cSJim Jagielski
1083*b1cdbd2cSJim JagielskiSub UpdateFields
1084*b1cdbd2cSJim Jagielski	dim document   as object
1085*b1cdbd2cSJim Jagielski	dim dispatcher as object
1086*b1cdbd2cSJim Jagielski	document   = ThisComponent.CurrentController.Frame
1087*b1cdbd2cSJim Jagielski	dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
1088*b1cdbd2cSJim Jagielski
1089*b1cdbd2cSJim Jagielski	dispatcher.executeDispatch(document, &quot;.uno:UpdateFields&quot;, &quot;&quot;, 0, Array())
1090*b1cdbd2cSJim JagielskiEnd Sub
1091*b1cdbd2cSJim Jagielski
1092*b1cdbd2cSJim JagielskiFunction IsHelpFile
1093*b1cdbd2cSJim Jagielski	document = StarDesktop.CurrentComponent
1094*b1cdbd2cSJim Jagielski	IsHelpFile = (Right(GetFilePath(document.URL),4)=&quot;.xhp&quot;)
1095*b1cdbd2cSJim JagielskiEnd Function
1096*b1cdbd2cSJim Jagielski
1097*b1cdbd2cSJim JagielskiFunction GetUserFieldNumber(fn as String)
1098*b1cdbd2cSJim Jagielski	fnum = -1
1099*b1cdbd2cSJim Jagielski	For a=0 to document.DocumentInfo.getUserFieldCount - 1
1100*b1cdbd2cSJim Jagielski		If document.DocumentInfo.getUserFieldName(a) = fn Then
1101*b1cdbd2cSJim Jagielski			fnum = a
1102*b1cdbd2cSJim Jagielski			Exit for
1103*b1cdbd2cSJim Jagielski		End If
1104*b1cdbd2cSJim Jagielski	Next a
1105*b1cdbd2cSJim Jagielski	GetUserFieldNumber = fnum
1106*b1cdbd2cSJim JagielskiEnd Function
1107*b1cdbd2cSJim Jagielski</script:module>
1108