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="ScriptBinding" script:language="StarBasic">REM  *****  BASIC  *****
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim JagielskiREM ----- Global Variables -----
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski&apos;bindingDialog can refer to either KeyBinding or MenuBinding dialog
28*b1cdbd2cSJim Jagielskiprivate languages() as String
29*b1cdbd2cSJim Jagielskiprivate extensions() as Object
30*b1cdbd2cSJim Jagielskiprivate locations() as String
31*b1cdbd2cSJim Jagielskiprivate filesysScripts() as String
32*b1cdbd2cSJim Jagielskiprivate filesysCount as integer
33*b1cdbd2cSJim Jagielskiprivate bindingDialog as object
34*b1cdbd2cSJim Jagielskiprivate helpDialog as object
35*b1cdbd2cSJim Jagielski&apos;Couldn&apos;t get redim to work, so scriptDisplayList is and array of arrays
36*b1cdbd2cSJim Jagielski&apos;where the one and only array in scriptDisplayList is an array
37*b1cdbd2cSJim Jagielski&apos;of com.sun.star.beans.PropertyValue, where Name = [logicalName][FunctionName]
38*b1cdbd2cSJim Jagielski&apos;and value is ScriptStorage object
39*b1cdbd2cSJim Jagielskiprivate scriptDisplayList(0)
40*b1cdbd2cSJim Jagielskiprivate testArray() as String
41*b1cdbd2cSJim Jagielski&apos;Array to store lines from the xml file
42*b1cdbd2cSJim Jagielskiprivate xmlFile() as string
43*b1cdbd2cSJim Jagielski&apos;Name of the xml file [writer/calc][menubar/keybindings].xml
44*b1cdbd2cSJim Jagielskiprivate xmlFileName as string
45*b1cdbd2cSJim Jagielski&apos;Number of lines in the xml file
46*b1cdbd2cSJim Jagielskiprivate numberOfLines as integer
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski&apos;Parallel arrays to store all top-level menu names and line positions
49*b1cdbd2cSJim Jagielskiprivate menuItems() as string
50*b1cdbd2cSJim Jagielskiprivate menuItemLinePosition() as integer
51*b1cdbd2cSJim Jagielski&apos;Counter for the number of top-level menus
52*b1cdbd2cSJim Jagielskiprivate menuCount as integer
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski&apos;Parallel arrays to store all sub-menu names and line positions for a particular top-level menu
55*b1cdbd2cSJim Jagielskiprivate subMenuItems() as string
56*b1cdbd2cSJim Jagielskiprivate subMenuItemLinePosition() as integer
57*b1cdbd2cSJim Jagielski&apos;Counter for the number of sub-menus
58*b1cdbd2cSJim Jagielskiprivate subMenuCount as integer
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski&apos;Parallel arrays to store all script names and line positions
61*b1cdbd2cSJim Jagielskiprivate scriptNames() as string
62*b1cdbd2cSJim Jagielskiprivate scriptLinePosition() as integer
63*b1cdbd2cSJim Jagielski&apos;Counter for the number of scripts
64*b1cdbd2cSJim Jagielskiprivate scriptCount as integer
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski&apos;Array to store all combinations of key bindings
67*b1cdbd2cSJim Jagielskiprivate allKeyBindings() as string
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski&apos;Array of Arrays
70*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(0)  contains array of &quot;SHIFT + CONTROL + F Keys&quot; data
71*b1cdbd2cSJim Jagielski&apos;Similarly
72*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(1) contains SHIFT + CONTROL + digits
73*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(2) contains SHIFT + CONTROL + letters
74*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(3) contains CONTROL + F keys
75*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(4) contains CONTROL + digits
76*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(5) contains CONTROL + letters
77*b1cdbd2cSJim Jagielski&apos;KeyBindArrayOfArrays(6) contains SHIFT + F keys
78*b1cdbd2cSJim Jagielskiprivate KeyBindArrayOfArrays(6)
79*b1cdbd2cSJim Jagielski
80*b1cdbd2cSJim Jagielski&apos;Each PropertyValue represents a key, Name member contains the script (if a binding exists)
81*b1cdbd2cSJim Jagielski&apos; the Value contains and integer
82*b1cdbd2cSJim Jagielski&apos;       0  means no script bound
83*b1cdbd2cSJim Jagielski&apos;       1  script is bound to an office function
84*b1cdbd2cSJim Jagielski&apos;       &gt;1 line number of entry in xmlfile array
85*b1cdbd2cSJim Jagielskiprivate keyAllocationMap(6,25) as new com.sun.star.beans.PropertyValue
86*b1cdbd2cSJim Jagielski&apos;array to store key group descriptions
87*b1cdbd2cSJim Jagielskiprivate AllKeyGroupsArray(6) as String
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski
90*b1cdbd2cSJim Jagielski&apos;Array of props to store all event bindings for the Applications
91*b1cdbd2cSJim Jagielskiprivate	allEventTypesApp( 14 ) as new com.sun.star.beans.PropertyValue
92*b1cdbd2cSJim Jagielski&apos;Array of props to store all event bindings for the Document
93*b1cdbd2cSJim Jagielskiprivate	allEventTypesDoc( 14 ) as new com.sun.star.beans.PropertyValue
94*b1cdbd2cSJim Jagielski&apos;Array of props to store all event types (Name) and textual description (Value)
95*b1cdbd2cSJim Jagielskiprivate allEventTypes( 14 ) as new com.sun.star.beans.PropertyValue
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski
98*b1cdbd2cSJim Jagielskiprivate dialogName as String
99*b1cdbd2cSJim JagielskiREM ------ Storage Refresh Function ------
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielskisub RefreshUserScripts()
103*b1cdbd2cSJim Jagielski&apos; TDB - change Menu bindings to allow user to refresh all, user, share or document script
104*b1cdbd2cSJim Jagielski   RefreshAppScripts( &quot;USER&quot; )
105*b1cdbd2cSJim Jagielskiend sub
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielskisub RefreshAllScripts()
108*b1cdbd2cSJim Jagielski   RefreshAppScripts( &quot;USER&quot; )
109*b1cdbd2cSJim Jagielski   RefreshAppScripts( &quot;SHARE&quot; )
110*b1cdbd2cSJim Jagielski   RefreshDocumentScripts
111*b1cdbd2cSJim Jagielskiend sub
112*b1cdbd2cSJim Jagielski
113*b1cdbd2cSJim Jagielskisub RefreshAppScripts( appName as String )
114*b1cdbd2cSJim Jagielski   On Error Goto ErrorHandler
115*b1cdbd2cSJim Jagielski   smgr = getProcessServiceManager()
116*b1cdbd2cSJim Jagielski   context = smgr.getPropertyValue( &quot;DefaultContext&quot; )
117*b1cdbd2cSJim Jagielski   scriptstoragemgr = context.getValueByName( &quot;/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager&quot; )
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielski   scriptstoragemgr.refreshScriptStorage( appName )
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski   Exit sub
122*b1cdbd2cSJim Jagielski
123*b1cdbd2cSJim Jagielski   ErrorHandler:
124*b1cdbd2cSJim Jagielski   reset
125*b1cdbd2cSJim Jagielski   MsgBox (&quot;Error: Unable to refresh Java (scripts)&quot; + chr$(10) + chr$(10)+ &quot;Detail: &quot; &amp; error$ + chr$(10) + chr$(10)+ &quot;Action: Please restart Office&quot;,0,&quot;Error&quot; )
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielskiend sub
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielskisub RefreshDocumentScripts()
130*b1cdbd2cSJim Jagielski   On Error Goto ErrorHandler
131*b1cdbd2cSJim Jagielski   smgr = getProcessServiceManager()
132*b1cdbd2cSJim Jagielski   context = smgr.getPropertyValue( &quot;DefaultContext&quot; )
133*b1cdbd2cSJim Jagielski   scriptstoragemgr = context.getValueByName( &quot;/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager&quot; )
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski   oDocURL = ThisComponent.GetCurrentController.getModel.getURL
136*b1cdbd2cSJim Jagielski
137*b1cdbd2cSJim Jagielski   On Error Goto ErrorHandlerDoc
138*b1cdbd2cSJim Jagielski   scriptstoragemgr.refreshScriptStorage( oDocURL )
139*b1cdbd2cSJim Jagielski
140*b1cdbd2cSJim Jagielski   Exit sub
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski   ErrorHandlerDoc:
143*b1cdbd2cSJim Jagielski   reset
144*b1cdbd2cSJim Jagielski   &apos; Ignore document script errors as it will happen when refreshing an unsaved doc
145*b1cdbd2cSJim Jagielski   Exit sub
146*b1cdbd2cSJim Jagielski
147*b1cdbd2cSJim Jagielski   ErrorHandler:
148*b1cdbd2cSJim Jagielski   reset
149*b1cdbd2cSJim Jagielski   MsgBox (&quot;Error: Unable to refresh Java (scripts)&quot; + chr$(10) + chr$(10)+ &quot;Detail: &quot; &amp; error$ + chr$(10) + chr$(10)+ &quot;Action: Please restart Office&quot;,0,&quot;Error&quot; )
150*b1cdbd2cSJim Jagielski
151*b1cdbd2cSJim Jagielskiend sub
152*b1cdbd2cSJim Jagielski
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim JagielskiREM ----- Launch Functions -----
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim JagielskiSub createAndPopulateKeyArrays()
157*b1cdbd2cSJim Jagielski	&apos;Create SHIFT + CONTROL + F keys array
158*b1cdbd2cSJim Jagielski	&apos;Dim keyGroupProp as new com.sun.star.beans.PropertyValue
159*b1cdbd2cSJim Jagielski
160*b1cdbd2cSJim Jagielski	Dim SCFKey( 11 )
161*b1cdbd2cSJim Jagielski	for FKey = 1 to 12
162*b1cdbd2cSJim Jagielski		SCFKey( FKey - 1 ) = &quot;SHIFT + CONTROL + F&quot; + FKey
163*b1cdbd2cSJim Jagielski	next FKey
164*b1cdbd2cSJim Jagielski
165*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(0) = SCFKey()
166*b1cdbd2cSJim Jagielski
167*b1cdbd2cSJim Jagielski	&apos;Create SHIFT + CONTROL + digits
168*b1cdbd2cSJim Jagielski	Dim SCDKey( 9 )
169*b1cdbd2cSJim Jagielski	for Digit = 0 to 9
170*b1cdbd2cSJim Jagielski		SCDKey( Digit ) = &quot;SHIFT + CONTROL + &quot; + Digit
171*b1cdbd2cSJim Jagielski	next Digit
172*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(1) = SCDKey()
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski	&apos;Create SHIFT + CONTROL + letters
175*b1cdbd2cSJim Jagielski
176*b1cdbd2cSJim Jagielski	Dim SCLKey( 25 )
177*b1cdbd2cSJim Jagielski	for Alpha = 65 to 90
178*b1cdbd2cSJim Jagielski		SCLKey( Alpha - 65 ) = &quot;SHIFT + CONTROL + &quot; + chr$( Alpha )
179*b1cdbd2cSJim Jagielski	next Alpha
180*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(2) = SCLKey()
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski	&apos;Create CONTROL + F keys
183*b1cdbd2cSJim Jagielski	Dim CFKey( 11 )
184*b1cdbd2cSJim Jagielski	for FKey = 1 to 12
185*b1cdbd2cSJim Jagielski		CFKey( Fkey - 1 ) = &quot;CONTROL + F&quot; + FKey
186*b1cdbd2cSJim Jagielski	next FKey
187*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(3) = CFKey()
188*b1cdbd2cSJim Jagielski
189*b1cdbd2cSJim Jagielski	&apos;Create CONTROL + digits
190*b1cdbd2cSJim Jagielski	Dim CDKey( 9 )
191*b1cdbd2cSJim Jagielski	for Digit = 0 to 9
192*b1cdbd2cSJim Jagielski		CDKey( Digit ) = &quot;CONTROL + &quot; + Digit
193*b1cdbd2cSJim Jagielski	next Digit
194*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(4) = CDKey()
195*b1cdbd2cSJim Jagielski
196*b1cdbd2cSJim Jagielski	&apos;Create CONTROL + letters
197*b1cdbd2cSJim Jagielski	Dim CLKey( 25 )
198*b1cdbd2cSJim Jagielski	for Alpha = 65 to 90
199*b1cdbd2cSJim Jagielski		CLKey( Alpha - 65 ) = &quot;CONTROL + &quot; + chr$( Alpha )
200*b1cdbd2cSJim Jagielski	next Alpha
201*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(5) = CLKey()
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski	&apos;Create SHIFT + F Keys
204*b1cdbd2cSJim Jagielski	Dim SFKey( 11 )
205*b1cdbd2cSJim Jagielski	for FKey = 1 to 12
206*b1cdbd2cSJim Jagielski		SFKey( Fkey - 1 ) = &quot;SHIFT + F&quot; + FKey
207*b1cdbd2cSJim Jagielski	next FKey
208*b1cdbd2cSJim Jagielski	KeyBindArrayOfArrays(6) = SFKey()
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim JagielskiEnd Sub
211*b1cdbd2cSJim Jagielski
212*b1cdbd2cSJim JagielskiSub updateMapWithDisabledKeys()
213*b1cdbd2cSJim Jagielski	&apos;disable CONTROL + F1 &amp;
214*b1cdbd2cSJim Jagielski	keyAllocationMap( 3, 0 ).Value = 1
215*b1cdbd2cSJim Jagielski	keyAllocationMap( 3, 0 ).Name = &quot;&quot;
216*b1cdbd2cSJim Jagielski	&apos;disable CONTROL + F4 &amp;
217*b1cdbd2cSJim Jagielski	keyAllocationMap( 3, 3 ).Value = 1
218*b1cdbd2cSJim Jagielski	keyAllocationMap( 3, 3 ).Name = &quot;&quot;
219*b1cdbd2cSJim Jagielski	&apos;disable CONTROL + F6
220*b1cdbd2cSJim Jagielski	keyAllocationMap( 3, 5 ).Value = 1
221*b1cdbd2cSJim Jagielski	keyAllocationMap( 3, 5 ).Name = &quot;&quot;
222*b1cdbd2cSJim Jagielski
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski	&apos;disable SHIFT + F1 &amp;
225*b1cdbd2cSJim Jagielski	keyAllocationMap( 6, 0 ).Value = 1
226*b1cdbd2cSJim Jagielski	keyAllocationMap( 6, 0 ).Name = &quot;&quot;
227*b1cdbd2cSJim Jagielski	&apos;disable SHIFT + F2 &amp;
228*b1cdbd2cSJim Jagielski	keyAllocationMap( 6, 1 ).Value = 1
229*b1cdbd2cSJim Jagielski	keyAllocationMap( 6, 1 ).Name = &quot;&quot;
230*b1cdbd2cSJim Jagielski	&apos;disable SHIFT + F6 &amp;
231*b1cdbd2cSJim Jagielski	keyAllocationMap( 6, 5 ).Value = 1
232*b1cdbd2cSJim Jagielski	keyAllocationMap( 6, 5 ).Name = &quot;&quot;
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim JagielskiEnd Sub
235*b1cdbd2cSJim Jagielski
236*b1cdbd2cSJim JagielskiSub initialiseFileExtensions()
237*b1cdbd2cSJim Jagielski	ReDim extensions(ubound(languages())+1) as Object
238*b1cdbd2cSJim Jagielski	oConfigProvider = CreateUnoService( &quot;com.sun.star.configuration.ConfigurationProvider&quot; )
239*b1cdbd2cSJim Jagielski    Dim configArgs(1) as new com.sun.star.beans.PropertyValue
240*b1cdbd2cSJim Jagielski    configargs(0).Name = &quot;nodepath&quot;
241*b1cdbd2cSJim Jagielski    configArgs(0).Value = &quot;org.openoffice.Office.Scripting/ScriptRuntimes&quot;
242*b1cdbd2cSJim Jagielski    configargs(1).Name = &quot;lazywrite&quot;
243*b1cdbd2cSJim Jagielski    configArgs(1).Value = false
244*b1cdbd2cSJim Jagielski    oConfigAccess = oConfigProvider.createInstanceWithArguments(&quot;com.sun.star.configuration.ConfigurationAccess&quot;, configArgs())
245*b1cdbd2cSJim Jagielski    for index = 0 to ubound(languages())
246*b1cdbd2cSJim Jagielski    		if(languages(index) &lt;&gt; &quot;Java&quot;) then
247*b1cdbd2cSJim Jagielski            	xPropSet = oConfigAccess.getByName(languages(index))
248*b1cdbd2cSJim Jagielski            	extns() = xPropSet.getPropertyValue(&quot;SupportedFileExtensions&quot;)
249*b1cdbd2cSJim Jagielski            	extensions(index) = extns()
250*b1cdbd2cSJim Jagielski            endif
251*b1cdbd2cSJim Jagielski    next index
252*b1cdbd2cSJim Jagielskiend sub
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim JagielskiSub ExecuteEditDebug()
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski	locations = Array ( &quot;User&quot;, &quot;Share&quot;, &quot;Document&quot;, &quot;Filesystem&quot; )
257*b1cdbd2cSJim Jagielski	languages = Array ( &quot;BeanShell&quot;, &quot;JavaScript&quot; )
258*b1cdbd2cSJim Jagielski	dialogName = &quot;EditDebug&quot;
259*b1cdbd2cSJim Jagielski	initialiseFileExtensions()
260*b1cdbd2cSJim Jagielski	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;EditDebug&quot; )
261*b1cdbd2cSJim Jagielski
262*b1cdbd2cSJim Jagielski	PopulateLanguageCombo()
263*b1cdbd2cSJim Jagielski	PopulateLocationCombo()
264*b1cdbd2cSJim Jagielski	PopulateScriptList( languages(0), locations(0) )
265*b1cdbd2cSJim Jagielski
266*b1cdbd2cSJim Jagielski	bindingDialog.execute()
267*b1cdbd2cSJim JagielskiEnd Sub
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim JagielskiSub ExecuteKeyBinding()
270*b1cdbd2cSJim Jagielski	dialogName = &quot;Key&quot;
271*b1cdbd2cSJim Jagielski    createAndPopulateKeyArrays()
272*b1cdbd2cSJim Jagielski    updateMapWithDisabledKeys()
273*b1cdbd2cSJim Jagielski	xmlFileName = GetDocumentType( &quot;Key&quot; )
274*b1cdbd2cSJim Jagielski
275*b1cdbd2cSJim Jagielski	if not (ReadXMLToArray( &quot;Key&quot; )) then
276*b1cdbd2cSJim Jagielski		Exit Sub
277*b1cdbd2cSJim Jagielski	endif
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;KeyBinding&quot; )
280*b1cdbd2cSJim Jagielski	PopulateKeyBindingList(0)
281*b1cdbd2cSJim Jagielski	initialiseNavigationComboArrays()
282*b1cdbd2cSJim Jagielski    PopulateLanguageCombo()
283*b1cdbd2cSJim Jagielski    PopulateLocationCombo()
284*b1cdbd2cSJim Jagielski	PopulateScriptList( languages(0), locations(0) )
285*b1cdbd2cSJim Jagielski	PopulateTopLevelKeyBindingList()
286*b1cdbd2cSJim Jagielski	bindingDialog.execute()
287*b1cdbd2cSJim Jagielskiend Sub
288*b1cdbd2cSJim Jagielski
289*b1cdbd2cSJim Jagielski
290*b1cdbd2cSJim JagielskiSub initialiseNavigationComboArrays()
291*b1cdbd2cSJim Jagielski    locations = Array ( &quot;User&quot;, &quot;Share&quot;, &quot;Document&quot;, &quot;Filesystem&quot; )
292*b1cdbd2cSJim Jagielski    ReDim languages(0) as String
293*b1cdbd2cSJim Jagielski    ReDim extensions(0) as Object
294*b1cdbd2cSJim Jagielski	languages(0) = &quot;Java&quot;
295*b1cdbd2cSJim Jagielski	REM extensions(0) = &quot;&quot;
296*b1cdbd2cSJim Jagielski
297*b1cdbd2cSJim Jagielski    &apos; Setup languages array for all supported languages
298*b1cdbd2cSJim Jagielski    oServiceManager = GetProcessServiceManager()
299*b1cdbd2cSJim Jagielski    svrArray = oServiceManager.getAvailableServiceNames
300*b1cdbd2cSJim Jagielski
301*b1cdbd2cSJim Jagielski    langCount = 1
302*b1cdbd2cSJim Jagielski    for index = 0 to ubound(svrArray)
303*b1cdbd2cSJim Jagielski        iPos = inStr(svrArray(index), &quot;ScriptProviderFor&quot;)
304*b1cdbd2cSJim Jagielski
305*b1cdbd2cSJim Jagielski        if (iPos &gt; 0) then
306*b1cdbd2cSJim Jagielski            lang = Mid(svrArray(index), iPos + Len(&quot;ScriptProviderFor&quot;)
307*b1cdbd2cSJim Jagielski
308*b1cdbd2cSJim Jagielski            if not (lang = &quot;Java&quot;) then
309*b1cdbd2cSJim Jagielski                &apos;Add to language vector
310*b1cdbd2cSJim Jagielski                ReDim Preserve languages(langCount) as String
311*b1cdbd2cSJim Jagielski                languages(langCount) = lang
312*b1cdbd2cSJim Jagielski                langCount = langCount + 1
313*b1cdbd2cSJim Jagielski            endif
314*b1cdbd2cSJim Jagielski        endif
315*b1cdbd2cSJim Jagielski    next index
316*b1cdbd2cSJim Jagielski    initialiseFileExtensions()
317*b1cdbd2cSJim JagielskiEnd Sub
318*b1cdbd2cSJim Jagielski
319*b1cdbd2cSJim Jagielski
320*b1cdbd2cSJim JagielskiSub ExecuteEventBinding
321*b1cdbd2cSJim Jagielski	dialogName = &quot;Event&quot;
322*b1cdbd2cSJim Jagielski	createAllEventTypes()
323*b1cdbd2cSJim Jagielski	createAllEventBindings()
324*b1cdbd2cSJim Jagielski
325*b1cdbd2cSJim Jagielski	&apos;Populate application event bindings array (from config xml file)
326*b1cdbd2cSJim Jagielski	if not (ReadXMLToArray( &quot;Event&quot; )) then
327*b1cdbd2cSJim Jagielski		Exit Sub
328*b1cdbd2cSJim Jagielski	endif
329*b1cdbd2cSJim Jagielski	&apos;Populate document event bindings array (using Office API calls)
330*b1cdbd2cSJim Jagielski	ReadEventsFromDoc()
331*b1cdbd2cSJim Jagielski
332*b1cdbd2cSJim Jagielski	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;EventsBinding&quot; )
333*b1cdbd2cSJim Jagielski	initialiseNavigationComboArrays()
334*b1cdbd2cSJim Jagielski    PopulateLanguageCombo()
335*b1cdbd2cSJim Jagielski    PopulateLocationCombo()
336*b1cdbd2cSJim Jagielski	PopulateScriptList( languages(0), locations(0) )
337*b1cdbd2cSJim Jagielski	populateEventList( 0 )
338*b1cdbd2cSJim Jagielski	EventListListener()
339*b1cdbd2cSJim Jagielski	bindingDialog.execute()
340*b1cdbd2cSJim JagielskiEnd Sub
341*b1cdbd2cSJim Jagielski
342*b1cdbd2cSJim JagielskiSub ExecuteMenuBinding()
343*b1cdbd2cSJim Jagielski	dialogName = &quot;Menu&quot;
344*b1cdbd2cSJim Jagielski	xmlFileName = GetDocumentType( &quot;Menu&quot; )
345*b1cdbd2cSJim Jagielski	if not (ReadXMLToArray( &quot;Menu&quot; )) then
346*b1cdbd2cSJim Jagielski		Exit Sub
347*b1cdbd2cSJim Jagielski	endif
348*b1cdbd2cSJim Jagielski
349*b1cdbd2cSJim Jagielski	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;MenuBinding&quot; )
350*b1cdbd2cSJim Jagielski	initialiseNavigationComboArrays()
351*b1cdbd2cSJim Jagielski    PopulateLanguageCombo()
352*b1cdbd2cSJim Jagielski    PopulateLocationCombo()
353*b1cdbd2cSJim Jagielski	PopulateScriptList( languages(0), locations(0) )
354*b1cdbd2cSJim Jagielski	PopulateMenuCombo()
355*b1cdbd2cSJim Jagielski	PopulateSubMenuList( 1 )
356*b1cdbd2cSJim Jagielski
357*b1cdbd2cSJim Jagielski	subMenuList = bindingDialog.getControl(&quot;SubMenuList&quot;)
358*b1cdbd2cSJim Jagielski
359*b1cdbd2cSJim Jagielski	subMenuList.selectItemPos( 0, true )
360*b1cdbd2cSJim Jagielski
361*b1cdbd2cSJim Jagielski	bindingDialog.execute()
362*b1cdbd2cSJim Jagielskiend Sub
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski
365*b1cdbd2cSJim JagielskiREM ----- Initialising functions -----
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski
368*b1cdbd2cSJim Jagielskifunction LoadDialog( libName as string, dialogName as string ) as object
369*b1cdbd2cSJim Jagielski	dim library as object
370*b1cdbd2cSJim Jagielski	dim libDialog as object
371*b1cdbd2cSJim Jagielski	dim runtimeDialog as object
372*b1cdbd2cSJim Jagielski	libContainer = DialogLibraries
373*b1cdbd2cSJim Jagielski	libContainer.LoadLibrary( libName )
374*b1cdbd2cSJim Jagielski	library = libContainer.getByName( libname )
375*b1cdbd2cSJim Jagielski	libDialog = library.getByName( dialogName )
376*b1cdbd2cSJim Jagielski	runtimeDialog = CreateUnoDialog( libDialog )
377*b1cdbd2cSJim Jagielski	LoadDialog() = runtimeDialog
378*b1cdbd2cSJim Jagielski
379*b1cdbd2cSJim Jagielskiend function
380*b1cdbd2cSJim Jagielski
381*b1cdbd2cSJim Jagielski
382*b1cdbd2cSJim Jagielskifunction GetDocumentType( bindingType as string ) as string
383*b1cdbd2cSJim Jagielski	document = StarDesktop.ActiveFrame.Controller.Model
384*b1cdbd2cSJim Jagielski	Dim errornumber As Integer
385*b1cdbd2cSJim Jagielski	errornumber = 111
386*b1cdbd2cSJim Jagielski	Error errornumber
387*b1cdbd2cSJim Jagielski	if document.SupportsService(&quot;com.sun.star.sheet.SpreadsheetDocument&quot;) then
388*b1cdbd2cSJim Jagielski		if bindingType = &quot;Key&quot; then
389*b1cdbd2cSJim Jagielski			GetDocumentType() = &quot;calckeybinding.xml&quot;
390*b1cdbd2cSJim Jagielski		else
391*b1cdbd2cSJim Jagielski			if bindingType = &quot;Menu&quot; then
392*b1cdbd2cSJim Jagielski				GetDocumentType() = &quot;calcmenubar.xml&quot;
393*b1cdbd2cSJim Jagielski			end if
394*b1cdbd2cSJim Jagielski		end if
395*b1cdbd2cSJim Jagielski	elseif document.SupportsService(&quot;com.sun.star.text.TextDocument&quot;) then
396*b1cdbd2cSJim Jagielski		if bindingType = &quot;Key&quot; then
397*b1cdbd2cSJim Jagielski			GetDocumentType() = &quot;writerkeybinding.xml&quot;
398*b1cdbd2cSJim Jagielski		else
399*b1cdbd2cSJim Jagielski			if bindingType = &quot;Menu&quot; then
400*b1cdbd2cSJim Jagielski				GetDocumentType() = &quot;writermenubar.xml&quot;
401*b1cdbd2cSJim Jagielski			end if
402*b1cdbd2cSJim Jagielski		end if
403*b1cdbd2cSJim Jagielski	elseif document.SupportsService(&quot;com.sun.star.presentation.PresentationDocument&quot;) then
404*b1cdbd2cSJim Jagielski		if bindingType = &quot;Key&quot; then
405*b1cdbd2cSJim Jagielski			GetDocumentType() = &quot;impresskeybinding.xml&quot;
406*b1cdbd2cSJim Jagielski		else
407*b1cdbd2cSJim Jagielski			if bindingType = &quot;Menu&quot; then
408*b1cdbd2cSJim Jagielski				GetDocumentType() = &quot;impressmenubar.xml&quot;
409*b1cdbd2cSJim Jagielski			end if
410*b1cdbd2cSJim Jagielski		end if
411*b1cdbd2cSJim Jagielski	elseif document.SupportsService(&quot;com.sun.star.presentation.PresentationDocument&quot;) then
412*b1cdbd2cSJim Jagielski		if bindingType = &quot;Key&quot; then
413*b1cdbd2cSJim Jagielski			GetDocumentType() = &quot;impresskeybinding.xml&quot;
414*b1cdbd2cSJim Jagielski		else
415*b1cdbd2cSJim Jagielski			if bindingType = &quot;Menu&quot; then
416*b1cdbd2cSJim Jagielski				GetDocumentType() = &quot;impressmenubar.xml&quot;
417*b1cdbd2cSJim Jagielski			end if
418*b1cdbd2cSJim Jagielski		end if
419*b1cdbd2cSJim Jagielski	elseif document.SupportsService(&quot;com.sun.star.drawing.DrawingDocument&quot;) then
420*b1cdbd2cSJim Jagielski		if bindingType = &quot;Key&quot; then
421*b1cdbd2cSJim Jagielski			GetDocumentType() = &quot;drawkeybinding.xml&quot;
422*b1cdbd2cSJim Jagielski		else
423*b1cdbd2cSJim Jagielski			if bindingType = &quot;Menu&quot; then
424*b1cdbd2cSJim Jagielski				GetDocumentType() = &quot;drawmenubar.xml&quot;
425*b1cdbd2cSJim Jagielski			end if
426*b1cdbd2cSJim Jagielski		end if
427*b1cdbd2cSJim Jagielski	else
428*b1cdbd2cSJim Jagielski		MsgBox (&quot;Error: Couldn&apos;t determine configuration file type&quot; + chr$(10) + chr$(10) + &quot;Action: Please reinstall Scripting Framework&quot;,0,&quot;Error&quot; )
429*b1cdbd2cSJim Jagielski	end if
430*b1cdbd2cSJim Jagielskiend function
431*b1cdbd2cSJim Jagielski
432*b1cdbd2cSJim Jagielskifunction lastIndexOf( targetStr as String, substr as String ) as Integer
433*b1cdbd2cSJim Jagielski	copyStr = targetStr
434*b1cdbd2cSJim Jagielski	while instr(copyStr, substr) &gt; 0
435*b1cdbd2cSJim Jagielski		pos = instr(copyStr, substr)
436*b1cdbd2cSJim Jagielski		tpos = tpos + pos
437*b1cdbd2cSJim Jagielski		copyStr = mid(copyStr, pos+1, len(copyStr)-pos )
438*b1cdbd2cSJim Jagielski	wend
439*b1cdbd2cSJim Jagielski	lastIndexOf() = tpos
440*b1cdbd2cSJim Jagielskiend function
441*b1cdbd2cSJim Jagielski
442*b1cdbd2cSJim Jagielskifunction getScriptURI( selectedScript as String ) as String
443*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;LocationCombo&quot; )
444*b1cdbd2cSJim Jagielski	location = combo.text
445*b1cdbd2cSJim Jagielski	if ( location = &quot;User&quot; ) then
446*b1cdbd2cSJim Jagielski		location = &quot;user&quot;
447*b1cdbd2cSJim Jagielski	elseif ( location = &quot;Share&quot; ) then
448*b1cdbd2cSJim Jagielski		location = &quot;share&quot;
449*b1cdbd2cSJim Jagielski	elseif ( location = &quot;Filesystem&quot; ) then
450*b1cdbd2cSJim Jagielski		location = &quot;filesystem&quot;
451*b1cdbd2cSJim Jagielski	else
452*b1cdbd2cSJim Jagielski		location = &quot;document&quot;
453*b1cdbd2cSJim Jagielski	end if
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski	if ( location = &quot;filesystem&quot; ) then
458*b1cdbd2cSJim Jagielski		REM need to build URI here - dcf
459*b1cdbd2cSJim Jagielski		combo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
460*b1cdbd2cSJim Jagielski		language = combo.text
461*b1cdbd2cSJim Jagielski		url = selectedscript
462*b1cdbd2cSJim Jagielski		pos = lastIndexOf( url, &quot;/&quot; )
463*b1cdbd2cSJim Jagielski		locationPath =  mid( url, 1, pos)
464*b1cdbd2cSJim Jagielski        url = mid( url, pos+1, len( url ) - pos )
465*b1cdbd2cSJim Jagielski		functionName = url
466*b1cdbd2cSJim Jagielski		pos = lastIndexOf( url, &quot;.&quot; )
467*b1cdbd2cSJim Jagielski		logicalName = mid( url, 1, pos - 1 )
468*b1cdbd2cSJim Jagielski		getScriptURI() = &quot;script://&quot; + logicalName + &quot;?language=&quot; _
469*b1cdbd2cSJim Jagielski			+ language + &quot;&amp;amp;function=&quot; + functionName _
470*b1cdbd2cSJim Jagielski			+ &quot;&amp;amp;location=filesystem:&quot; + locationPath
471*b1cdbd2cSJim Jagielski	else
472*b1cdbd2cSJim Jagielski		Dim scriptInfo as Object
473*b1cdbd2cSJim Jagielski		scripts() = scriptDisplayList(0)
474*b1cdbd2cSJim Jagielski		for n = LBOUND( scripts() ) to UBOUND( scripts() )
475*b1cdbd2cSJim Jagielski
476*b1cdbd2cSJim Jagielski			if ( scripts( n ).Name = selectedScript ) then
477*b1cdbd2cSJim Jagielski				scriptInfo = scripts( n ).Value
478*b1cdbd2cSJim Jagielski				exit for
479*b1cdbd2cSJim Jagielski			end if
480*b1cdbd2cSJim Jagielski		next n
481*b1cdbd2cSJim Jagielski		getScriptURI() = &quot;script://&quot; + scriptInfo.getLogicalName + &quot;?language=&quot; _
482*b1cdbd2cSJim Jagielski			+ scriptInfo.getLanguage() + &quot;&amp;amp;function=&quot; + _
483*b1cdbd2cSJim Jagielski			scriptInfo.getFunctionName() + &quot;&amp;amp;location=&quot; + location
484*b1cdbd2cSJim Jagielski	end if
485*b1cdbd2cSJim Jagielski
486*b1cdbd2cSJim Jagielskiend function
487*b1cdbd2cSJim Jagielski
488*b1cdbd2cSJim Jagielskifunction GetOfficePath() as string
489*b1cdbd2cSJim Jagielski	REM Error check and prompt user to manually input Office Path
490*b1cdbd2cSJim Jagielski	settings =  CreateUnoService( &quot;com.sun.star.frame.Settings&quot; )
491*b1cdbd2cSJim Jagielski	path = settings.getByName( &quot;PathSettings&quot; )
492*b1cdbd2cSJim Jagielski	unformattedOfficePath = path.getPropertyValue( &quot;UserPath&quot; )
493*b1cdbd2cSJim Jagielski
494*b1cdbd2cSJim Jagielski	dim officePath as string
495*b1cdbd2cSJim Jagielski	const removeFromEnd = &quot;/user&quot;
496*b1cdbd2cSJim Jagielski	const removeFromEndWindows = &quot;\user&quot;
497*b1cdbd2cSJim Jagielski
498*b1cdbd2cSJim Jagielski	REM If Solaris or Linux
499*b1cdbd2cSJim Jagielski	if not ( instr( unformattedOfficePath, removeFromEnd ) = 0 ) then
500*b1cdbd2cSJim Jagielski		endPosition = instr( unformattedOfficePath, removeFromEnd )
501*b1cdbd2cSJim Jagielski		officePath = mid( unformattedOfficePath, 1, endPosition )
502*b1cdbd2cSJim Jagielski	REM If Windows
503*b1cdbd2cSJim Jagielski	else if not ( instr( unformattedOfficePath, removeFromEndWindows ) = 0 ) then
504*b1cdbd2cSJim Jagielski			endPosition = instr( unformattedOfficePath, removeFromEndWindows )
505*b1cdbd2cSJim Jagielski			officePath = mid( unformattedOfficePath, 1, endPosition )
506*b1cdbd2cSJim Jagielski			while instr( officePath, &quot;\&quot; ) &gt; 0
507*b1cdbd2cSJim Jagielski				backSlash = instr( officePath, &quot;\&quot; )
508*b1cdbd2cSJim Jagielski				startPath = mid( officePath, 1, backSlash - 1 )
509*b1cdbd2cSJim Jagielski				endPath = mid( officePath, backslash + 1, len( officePath ) - backSlash )
510*b1cdbd2cSJim Jagielski				officePath = startPath + &quot;/&quot; + endPath
511*b1cdbd2cSJim Jagielski			wend
512*b1cdbd2cSJim Jagielski		else
513*b1cdbd2cSJim Jagielski			MsgBox (&quot;Error: Office path not found&quot; + chr$(10) + chr$(10) + &quot;Action: Please reinstall Scripting Framework&quot;,0,&quot;Error&quot; )
514*b1cdbd2cSJim Jagielski			REM Prompt user
515*b1cdbd2cSJim Jagielski		end if
516*b1cdbd2cSJim Jagielski	end if
517*b1cdbd2cSJim Jagielski
518*b1cdbd2cSJim Jagielski	GetOfficePath() = officePath
519*b1cdbd2cSJim Jagielskiend function
520*b1cdbd2cSJim Jagielski
521*b1cdbd2cSJim Jagielski
522*b1cdbd2cSJim Jagielski
523*b1cdbd2cSJim JagielskiREM ----- File I/O functions -----
524*b1cdbd2cSJim Jagielski
525*b1cdbd2cSJim Jagielski
526*b1cdbd2cSJim Jagielskifunction ReadXMLToArray( bindingType as string ) as boolean
527*b1cdbd2cSJim Jagielski	On Error Goto ErrorHandler
528*b1cdbd2cSJim Jagielski	if ( bindingType = &quot;Event&quot; ) then
529*b1cdbd2cSJim Jagielski		xmlfilename = &quot;eventbindings.xml&quot;
530*b1cdbd2cSJim Jagielski	endif
531*b1cdbd2cSJim Jagielski
532*b1cdbd2cSJim Jagielski	simplefileaccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
533*b1cdbd2cSJim Jagielski	filestream = simplefileaccess.openFileRead( &quot;file://&quot; + GetOfficePath() + &quot;user/config/soffice.cfg/&quot; + xmlFileName )
534*b1cdbd2cSJim Jagielski
535*b1cdbd2cSJim Jagielski    textin = CreateUnoService( &quot;com.sun.star.io.TextInputStream&quot; )
536*b1cdbd2cSJim Jagielski    textin.setInputStream( filestream )
537*b1cdbd2cSJim Jagielski
538*b1cdbd2cSJim Jagielski    redim xmlFile( 400 ) as String
539*b1cdbd2cSJim Jagielski    redim menuItems( 30 ) as String
540*b1cdbd2cSJim Jagielski    redim menuItemLinePosition( 30 ) as Integer
541*b1cdbd2cSJim Jagielski    redim scriptNames( 120 ) as string
542*b1cdbd2cSJim Jagielski    redim scriptLinePosition( 120) as integer
543*b1cdbd2cSJim Jagielski
544*b1cdbd2cSJim Jagielski    lineCount = 1
545*b1cdbd2cSJim Jagielski    menuCount = 1
546*b1cdbd2cSJim Jagielski    scriptCount = 1
547*b1cdbd2cSJim Jagielski
548*b1cdbd2cSJim Jagielski    do while not textin.isEOF()
549*b1cdbd2cSJim Jagielski    	xmlline = textin.readLine()
550*b1cdbd2cSJim Jagielski    	xmlFile( lineCount ) = xmlline
551*b1cdbd2cSJim Jagielski
552*b1cdbd2cSJim Jagielski 		const menuItemWhiteSpace = 2
553*b1cdbd2cSJim Jagielski 		const menuXMLTag = &quot;&lt;menu:menu&quot;
554*b1cdbd2cSJim Jagielski
555*b1cdbd2cSJim Jagielski		if bindingType = &quot;Menu&quot; then
556*b1cdbd2cSJim Jagielski			evaluateForMenu( xmlline, lineCount )
557*b1cdbd2cSJim Jagielski		elseif bindingType = &quot;Key&quot; then
558*b1cdbd2cSJim Jagielski			processKeyXMLLine( lineCount, xmlline )
559*b1cdbd2cSJim Jagielski		elseif bindingType = &quot;Event&quot; then
560*b1cdbd2cSJim Jagielski			evaluateForEvent( xmlline, lineCount )
561*b1cdbd2cSJim Jagielski		else
562*b1cdbd2cSJim Jagielski			MsgBox (&quot;Error: Couldn&apos;t determine file type&quot; + chr$(10) + chr$(10) + &quot;Action: Please reinstall Scripting Framework&quot;,0,&quot;Error&quot; )
563*b1cdbd2cSJim Jagielski		end if
564*b1cdbd2cSJim Jagielski        lineCount = lineCount + 1
565*b1cdbd2cSJim Jagielski    loop
566*b1cdbd2cSJim Jagielski
567*b1cdbd2cSJim Jagielski	&apos;Set global variable numberOfLines (lineCount is one too many at end of the loop)
568*b1cdbd2cSJim Jagielski	numberOfLines = lineCount - 1
569*b1cdbd2cSJim Jagielski	&apos;Set global variable menuCount (it is one too many at end of the loop)
570*b1cdbd2cSJim Jagielski	menuCount = menuCount - 1
571*b1cdbd2cSJim Jagielski
572*b1cdbd2cSJim Jagielski    filestream.closeInput()
573*b1cdbd2cSJim Jagielski    ReadXMLToArray( ) = true
574*b1cdbd2cSJim Jagielski	Exit function
575*b1cdbd2cSJim Jagielski
576*b1cdbd2cSJim Jagielski	ErrorHandler:
577*b1cdbd2cSJim Jagielski	reset
578*b1cdbd2cSJim Jagielski	MsgBox (&quot;Error: Unable to read Star Office configuration file - &quot; + xmlFileName + chr$(10) + chr$(10) + &quot;Action: Please reinstall Scripting Framework&quot;,0,&quot;Error&quot; )
579*b1cdbd2cSJim Jagielski    ReadXMLToArray( ) = false
580*b1cdbd2cSJim Jagielskiend function
581*b1cdbd2cSJim Jagielski
582*b1cdbd2cSJim Jagielski
583*b1cdbd2cSJim Jagielski
584*b1cdbd2cSJim Jagielskisub evaluateForMenu( xmlline as string, lineCount as integer )
585*b1cdbd2cSJim Jagielski	const menuItemWhiteSpace = 2
586*b1cdbd2cSJim Jagielski 	const menuXMLTag = &quot;&lt;menu:menu&quot;
587*b1cdbd2cSJim Jagielski	&apos;If the xml line is a top-level menu
588*b1cdbd2cSJim Jagielski	if instr( xmlline, menuXMLTag ) = menuItemWhiteSpace then
589*b1cdbd2cSJim Jagielski		menuLabel = ExtractLabelFromXMLLine( xmlline )
590*b1cdbd2cSJim Jagielski		menuItems( menuCount ) = menuLabel
591*b1cdbd2cSJim Jagielski		menuItemLinePosition( menuCount ) = lineCount
592*b1cdbd2cSJim Jagielski		menuCount = menuCount + 1
593*b1cdbd2cSJim Jagielski	end if
594*b1cdbd2cSJim Jagielskiend sub
595*b1cdbd2cSJim Jagielski
596*b1cdbd2cSJim Jagielskisub evaluateForEvent( xmlline as string, lineCount as integer )
597*b1cdbd2cSJim Jagielski	dim eventName as String
598*b1cdbd2cSJim Jagielski	&apos;if the xml line identifies a script or SB macro
599*b1cdbd2cSJim Jagielski	dim scriptName as string
600*b1cdbd2cSJim Jagielski	dim lineNumber as integer
601*b1cdbd2cSJim Jagielski	if instr( xmlline, &quot;event:language=&quot; + chr$(34) + &quot;Script&quot; ) &gt; 0 then
602*b1cdbd2cSJim Jagielski		eventName = ExtractEventNameFromXMLLine( xmlline )
603*b1cdbd2cSJim Jagielski		scriptName = ExtractEventScriptFromXMLLine( xmlline )
604*b1cdbd2cSJim Jagielski		lineNumber = lineCount
605*b1cdbd2cSJim Jagielski	elseif instr( xmlline, &quot;event:language=&quot; + chr$(34) + &quot;StarBasic&quot; ) &gt; 0 then
606*b1cdbd2cSJim Jagielski		eventName = ExtractEventNameFromXMLLine( xmlline )
607*b1cdbd2cSJim Jagielski		scriptName = &quot;Allocated to Office function&quot;
608*b1cdbd2cSJim Jagielski		lineNumber = 1
609*b1cdbd2cSJim Jagielski	end if
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski	&apos;Need to sequence to find the corresponding index for the event type
612*b1cdbd2cSJim Jagielski	for n = 0 to ubound( allEventTypesApp() )
613*b1cdbd2cSJim Jagielski		if ( eventName = allEventTypes( n ).Name ) then
614*b1cdbd2cSJim Jagielski			allEventTypesApp( n ).Name = scriptName
615*b1cdbd2cSJim Jagielski			allEventTypesApp( n ).Value = lineNumber
616*b1cdbd2cSJim Jagielski		end if
617*b1cdbd2cSJim Jagielski	next n
618*b1cdbd2cSJim Jagielskiend sub
619*b1cdbd2cSJim Jagielski
620*b1cdbd2cSJim Jagielski
621*b1cdbd2cSJim Jagielskifunction isOKscriptProps( props() as Object, eventName as string ) as Boolean
622*b1cdbd2cSJim Jagielski	On Error Goto ErrorHandler
623*b1cdbd2cSJim Jagielski	props  = ThisComponent.getEvents().getByName( eventName )
624*b1cdbd2cSJim Jagielski	test = ubound( props() )
625*b1cdbd2cSJim Jagielski	isOKscriptProps() = true
626*b1cdbd2cSJim Jagielski	exit function
627*b1cdbd2cSJim Jagielski
628*b1cdbd2cSJim Jagielski	ErrorHandler:
629*b1cdbd2cSJim Jagielski	isOKscriptProps() = false
630*b1cdbd2cSJim Jagielskiend function
631*b1cdbd2cSJim Jagielski
632*b1cdbd2cSJim Jagielskisub ReadEventsFromDoc()
633*b1cdbd2cSJim Jagielski	On Error Goto ErrorHandler
634*b1cdbd2cSJim Jagielski
635*b1cdbd2cSJim Jagielski	eventSupplier = ThisComponent
636*b1cdbd2cSJim Jagielski	for n = 0 to ubound( allEventTypes() )
637*b1cdbd2cSJim Jagielski		Dim scriptProps() as Object
638*b1cdbd2cSJim Jagielski		if (isOKscriptProps( scriptProps(), allEventTypes( n ).Name) ) then
639*b1cdbd2cSJim Jagielski			if ( ubound( scriptProps ) &gt; 0 ) then
640*b1cdbd2cSJim Jagielski				if ( scriptProps(0).Value = &quot;Script&quot; ) then
641*b1cdbd2cSJim Jagielski					&apos;Script binding
642*b1cdbd2cSJim Jagielski					allEventTypesDoc(n).Name = scriptProps(1).Value
643*b1cdbd2cSJim Jagielski					allEventTypesDoc(n).value = 2
644*b1cdbd2cSJim Jagielski				elseif( scriptProps(0).Value = &quot;StarBasic&quot; ) then
645*b1cdbd2cSJim Jagielski					&apos;StarBasic macro
646*b1cdbd2cSJim Jagielski					allEventTypesDoc(n).Name = &quot;Allocated to Office function&quot;
647*b1cdbd2cSJim Jagielski					allEventTypesDoc(n).value = 1
648*b1cdbd2cSJim Jagielski				end if
649*b1cdbd2cSJim Jagielski			end if
650*b1cdbd2cSJim Jagielski		end if
651*b1cdbd2cSJim Jagielski	next n
652*b1cdbd2cSJim Jagielski
653*b1cdbd2cSJim Jagielski	exit sub
654*b1cdbd2cSJim Jagielski
655*b1cdbd2cSJim Jagielski	&apos; eventProps is undefined if there are no event bindings in the doc
656*b1cdbd2cSJim Jagielski	ErrorHandler:
657*b1cdbd2cSJim Jagielski	reset
658*b1cdbd2cSJim Jagielskiend sub
659*b1cdbd2cSJim Jagielski
660*b1cdbd2cSJim Jagielski
661*b1cdbd2cSJim Jagielskisub WriteEventsToDoc()
662*b1cdbd2cSJim Jagielski	On Error Goto ErrorHandler
663*b1cdbd2cSJim Jagielski
664*b1cdbd2cSJim Jagielski	eventSupplier = ThisComponent
665*b1cdbd2cSJim Jagielski	for n = 0 to ubound( allEventTypes() )
666*b1cdbd2cSJim Jagielski		scriptName = allEventTypesDoc( n ).Name
667*b1cdbd2cSJim Jagielski		eventName = allEventTypes( n ).Name
668*b1cdbd2cSJim Jagielski		if( allEventTypesDoc( n ).Value &gt; 1 ) then &apos;script
669*b1cdbd2cSJim Jagielski			&apos;add to doc
670*b1cdbd2cSJim Jagielski			AddEventToDocViaAPI( scriptName, eventName )
671*b1cdbd2cSJim Jagielski		elseif( allEventTypesDoc( n ).Value = 0 ) then &apos;blank (this will &quot;remove&quot; already blank entries)
672*b1cdbd2cSJim Jagielski			&apos;remove from doc
673*b1cdbd2cSJim Jagielski			RemoveEventFromDocViaAPI( eventName )
674*b1cdbd2cSJim Jagielski		endif
675*b1cdbd2cSJim Jagielski		&apos;Otherwise it is a StarBasic binding - leave alone
676*b1cdbd2cSJim Jagielski	next n
677*b1cdbd2cSJim Jagielski	&apos;Mark document as modified ( should happen automatically as a result of calling the API )
678*b1cdbd2cSJim Jagielski	ThisComponent.CurrentController.getModel().setModified( True )
679*b1cdbd2cSJim Jagielski	exit sub
680*b1cdbd2cSJim Jagielski
681*b1cdbd2cSJim Jagielski	ErrorHandler:
682*b1cdbd2cSJim Jagielski	reset
683*b1cdbd2cSJim Jagielski	msgbox( &quot;Error calling UNO API for writing event bindings to the document&quot; )
684*b1cdbd2cSJim Jagielskiend sub
685*b1cdbd2cSJim Jagielski
686*b1cdbd2cSJim Jagielski
687*b1cdbd2cSJim Jagielskisub RemoveEventFromDocViaAPI( event as string )
688*b1cdbd2cSJim Jagielski	dim document   as object
689*b1cdbd2cSJim Jagielski	dim dispatcher as object
690*b1cdbd2cSJim Jagielski	dim parser     as object
691*b1cdbd2cSJim Jagielski	dim url        as new com.sun.star.util.URL
692*b1cdbd2cSJim Jagielski
693*b1cdbd2cSJim Jagielski	document = ThisComponent.CurrentController.Frame
694*b1cdbd2cSJim Jagielski	parser   = createUnoService(&quot;com.sun.star.util.URLTransformer&quot;)
695*b1cdbd2cSJim Jagielski	dim args(0) as new com.sun.star.beans.PropertyValue
696*b1cdbd2cSJim Jagielski	args(0).Name = &quot;&quot;
697*b1cdbd2cSJim Jagielski	args(0).Value = event
698*b1cdbd2cSJim Jagielski
699*b1cdbd2cSJim Jagielski	url.Complete = &quot;script://_$ScriptFrmwrkHelper.removeEvent?&quot; _
700*b1cdbd2cSJim Jagielski					+ &quot;language=Java&amp;function=ScriptFrmwrkHelper.removeEvent&quot; _
701*b1cdbd2cSJim Jagielski					+ &quot;&amp;location=share&quot;
702*b1cdbd2cSJim Jagielski
703*b1cdbd2cSJim Jagielski	parser.parseStrict(url)
704*b1cdbd2cSJim Jagielski	disp = document.queryDispatch(url,&quot;&quot;,0)
705*b1cdbd2cSJim Jagielski	disp.dispatch(url,args())
706*b1cdbd2cSJim Jagielskiend sub
707*b1cdbd2cSJim Jagielski
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielskisub AddEventToDocViaAPI( scriptName as string, eventName as string )
710*b1cdbd2cSJim Jagielski	dim properties( 1 ) as new com.sun.star.beans.PropertyValue
711*b1cdbd2cSJim Jagielski	properties( 0 ).Name = &quot;EventType&quot;
712*b1cdbd2cSJim Jagielski	properties( 0 ).Value = &quot;Script&quot;
713*b1cdbd2cSJim Jagielski	properties( 1 ).Name = &quot;Script&quot;
714*b1cdbd2cSJim Jagielski	properties( 1 ).Value = scriptName
715*b1cdbd2cSJim Jagielski
716*b1cdbd2cSJim Jagielski	eventSupplier = ThisComponent
717*b1cdbd2cSJim Jagielski	nameReplace = eventSupplier.getEvents()
718*b1cdbd2cSJim Jagielski	nameReplace.replaceByName( eventName, properties() )
719*b1cdbd2cSJim Jagielskiend sub
720*b1cdbd2cSJim Jagielski
721*b1cdbd2cSJim Jagielski
722*b1cdbd2cSJim Jagielski&apos; returns 0 for Fkey
723*b1cdbd2cSJim Jagielski&apos;         1 for digit
724*b1cdbd2cSJim Jagielski&apos;         2 for letter
725*b1cdbd2cSJim Jagielski
726*b1cdbd2cSJim Jagielskifunction getKeyTypeOffset( key as String ) as integer
727*b1cdbd2cSJim Jagielski	length = Len( key )
728*b1cdbd2cSJim Jagielski	if ( length &gt; 1 ) then
729*b1cdbd2cSJim Jagielski 		getKeyTypeOffset() = 0
730*b1cdbd2cSJim Jagielski
731*b1cdbd2cSJim Jagielski	elseif  ( key &gt;= &quot;0&quot; AND key &lt;= &quot;9&quot; )  then
732*b1cdbd2cSJim Jagielski 		getKeyTypeOffset() = 1
733*b1cdbd2cSJim Jagielski	else
734*b1cdbd2cSJim Jagielski 		getKeyTypeOffset() = 2
735*b1cdbd2cSJim Jagielski 	end if
736*b1cdbd2cSJim Jagielskiend function
737*b1cdbd2cSJim Jagielski
738*b1cdbd2cSJim Jagielskifunction getKeyGroupIndex( key as String, offset as Integer ) as Integer
739*b1cdbd2cSJim Jagielski    &apos; Keys we are interested in are A - Z, F2 - F12, 0 - 9 anything else should
740*b1cdbd2cSJim Jagielski    &apos; ensure -1 is returned
741*b1cdbd2cSJim Jagielski	cutKey = mid( key,2 )
742*b1cdbd2cSJim Jagielski
743*b1cdbd2cSJim Jagielski	if ( cutKey &lt;&gt; &quot;&quot; ) then
744*b1cdbd2cSJim Jagielski		acode = asc ( mid( cutKey,1,1) )
745*b1cdbd2cSJim Jagielski        if ( acode &gt; 57 ) then
746*b1cdbd2cSJim Jagielski			getKeyGroupIndex() = -1
747*b1cdbd2cSJim Jagielski			exit function
748*b1cdbd2cSJim Jagielski		end if
749*b1cdbd2cSJim Jagielski	end if
750*b1cdbd2cSJim Jagielski
751*b1cdbd2cSJim Jagielski	select case offset
752*b1cdbd2cSJim Jagielski	case 0:
753*b1cdbd2cSJim Jagielski			num = cint( cutKey )
754*b1cdbd2cSJim Jagielski			getKeyGroupIndex() = num - 1
755*b1cdbd2cSJim Jagielski			exit function
756*b1cdbd2cSJim Jagielski	case 1:
757*b1cdbd2cSJim Jagielski			num = asc( key ) - 48
758*b1cdbd2cSJim Jagielski			getKeyGroupIndex() = num
759*b1cdbd2cSJim Jagielski			exit function
760*b1cdbd2cSJim Jagielski	case 2:
761*b1cdbd2cSJim Jagielski			num = asc( key ) - 65
762*b1cdbd2cSJim Jagielski			getKeyGroupIndex() = num
763*b1cdbd2cSJim Jagielski			exit function
764*b1cdbd2cSJim Jagielski	end select
765*b1cdbd2cSJim Jagielski	getKeyGroupIndex() = -1
766*b1cdbd2cSJim Jagielskiend function
767*b1cdbd2cSJim Jagielski
768*b1cdbd2cSJim JagielskiSub processKeyXMLLine( lineCount as Integer, xmlline as String )
769*b1cdbd2cSJim Jagielski
770*b1cdbd2cSJim Jagielski	if instr( xmlline, &quot;&lt;accel:item&quot; ) &gt; 0 then
771*b1cdbd2cSJim Jagielski		shift = false
772*b1cdbd2cSJim Jagielski		control = false
773*b1cdbd2cSJim Jagielski		if instr( xmlline, &quot;accel:shift=&quot;+chr$(34)+&quot;true&quot;+chr$(34) ) &gt; 0 then
774*b1cdbd2cSJim Jagielski			shift = true
775*b1cdbd2cSJim Jagielski		end if
776*b1cdbd2cSJim Jagielski		if instr( xmlFile( lineCount ), &quot;accel:mod1=&quot;+chr$(34)+&quot;true&quot;+chr$(34) ) &gt; 0 then
777*b1cdbd2cSJim Jagielski			control = true
778*b1cdbd2cSJim Jagielski		end if
779*b1cdbd2cSJim Jagielski		offsetIntoArrayOfArrays = -1 &apos;default unknown
780*b1cdbd2cSJim Jagielski		if ( control AND shift ) then
781*b1cdbd2cSJim Jagielski			offsetIntoArrayOfArrays = 0
782*b1cdbd2cSJim Jagielski		elseif ( control ) then
783*b1cdbd2cSJim Jagielski			offsetIntoArrayOfArrays = 3
784*b1cdbd2cSJim Jagielski		elseif ( shift ) then
785*b1cdbd2cSJim Jagielski			offsetIntoArrayOfArrays = 6
786*b1cdbd2cSJim Jagielski		endif
787*b1cdbd2cSJim Jagielski		&apos; Calculate which of the 7 key group arrays we need to point to
788*b1cdbd2cSJim Jagielski		key = ExtractKeyCodeFromXMLLine( xmlline )
789*b1cdbd2cSJim Jagielski		keyTypeOffset = getKeyTypeOffset( key  )
790*b1cdbd2cSJim Jagielski		offsetIntoArrayOfArrays = offsetIntoArrayOfArrays + keyTypeOffset
791*b1cdbd2cSJim Jagielski
792*b1cdbd2cSJim Jagielski		&apos; Calculate from the key the offset into key group array we need to point to
793*b1cdbd2cSJim Jagielski		KeyGroupIndex = getKeyGroupIndex( key, keyTypeOffset )
794*b1cdbd2cSJim Jagielski		if ( offsetIntoArrayOfArrays = -1 ) then
795*b1cdbd2cSJim Jagielski			&apos;Unknown key group, no processing necessary
796*b1cdbd2cSJim Jagielski			Exit Sub
797*b1cdbd2cSJim Jagielski		end if
798*b1cdbd2cSJim Jagielski		if ( KeyGroupIndex &gt; -1 ) then
799*b1cdbd2cSJim Jagielski
800*b1cdbd2cSJim Jagielski			&apos; Determine if a script framework binding is present or not
801*b1cdbd2cSJim Jagielski			if  instr( xmlline, &quot;script://&quot; ) &gt; 0 then
802*b1cdbd2cSJim Jagielski				&apos; its one of ours so update its details
803*b1cdbd2cSJim Jagielski				scriptName = ExtractScriptIdFromXMLLine( xmlline )
804*b1cdbd2cSJim Jagielski
805*b1cdbd2cSJim Jagielski				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value = lineCount
806*b1cdbd2cSJim Jagielski				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
807*b1cdbd2cSJim Jagielski			else
808*b1cdbd2cSJim Jagielski				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value = 1
809*b1cdbd2cSJim Jagielski				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = &quot;&quot;
810*b1cdbd2cSJim Jagielski
811*b1cdbd2cSJim Jagielski			end if
812*b1cdbd2cSJim Jagielski		end if
813*b1cdbd2cSJim Jagielski	end if
814*b1cdbd2cSJim JagielskiEnd Sub
815*b1cdbd2cSJim Jagielski
816*b1cdbd2cSJim JagielskiSub WriteXMLFromArray()
817*b1cdbd2cSJim Jagielski	On Error Goto ErrorHandler
818*b1cdbd2cSJim Jagielski	cfgFile =  GetOfficePath() + &quot;user/config/soffice.cfg/&quot; + xmlFileName
819*b1cdbd2cSJim Jagielski	updateCfgFile( cfgFile )
820*b1cdbd2cSJim Jagielski	&apos;if ( false ) then&apos; config stuff not in build yet
821*b1cdbd2cSJim Jagielski	if ( true ) then
822*b1cdbd2cSJim Jagielski		updateConfig( xmlFileName )
823*b1cdbd2cSJim Jagielski	else
824*b1cdbd2cSJim Jagielski		msgbox (&quot;Office must be restarted before your changes will take effect.&quot;+ chr$(10)+&quot;Also close the Office QuickStarter (Windows and Linux)&quot;, 48, &quot;Assign Script (Java) To Menu&quot; )
825*b1cdbd2cSJim Jagielski	endif
826*b1cdbd2cSJim Jagielski	Exit Sub
827*b1cdbd2cSJim Jagielski
828*b1cdbd2cSJim Jagielski	ErrorHandler:
829*b1cdbd2cSJim Jagielski	reset
830*b1cdbd2cSJim Jagielski	MsgBox (&quot;Error: Unable to write to Star Office configuration file&quot; + chr$(10) + &quot;/&quot; + GetOfficePath() + &quot;user/config/soffice.cfg/&quot; +xmlFileName + chr$(10) + chr$(10) + &quot;Action: Please make sure you have write access to this file&quot;,0,&quot;Error&quot; )
831*b1cdbd2cSJim Jagielskiend Sub
832*b1cdbd2cSJim Jagielski
833*b1cdbd2cSJim Jagielski
834*b1cdbd2cSJim JagielskiSub UpdateCfgFile ( fileName as String )
835*b1cdbd2cSJim Jagielski	dim ScriptProvider as Object
836*b1cdbd2cSJim Jagielski	dim Script as Object
837*b1cdbd2cSJim Jagielski	dim args(1)
838*b1cdbd2cSJim Jagielski	dim displayDialogFlag as boolean
839*b1cdbd2cSJim Jagielski	displayDialogFlag = false
840*b1cdbd2cSJim Jagielski	args(0) = ThisComponent
841*b1cdbd2cSJim Jagielski	args(1) = displayDialogFlag
842*b1cdbd2cSJim Jagielski
843*b1cdbd2cSJim Jagielski	ScriptProvider = createUnoService(&quot;drafts.com.sun.star.script.framework.provider.MasterScriptProvider&quot;)
844*b1cdbd2cSJim Jagielski	ScriptProvider.initialize( args() )
845*b1cdbd2cSJim Jagielski	Script = ScriptProvider.getScript(&quot;script://_$ScriptFrmwrkHelper.updateCfgFile?&quot; _
846*b1cdbd2cSJim Jagielski		+ &quot;language=Java&amp;function=ScriptFrmwrkHelper.updateCfgFile&amp;location=share&quot;)
847*b1cdbd2cSJim Jagielski	Dim inArgs(2)
848*b1cdbd2cSJim Jagielski	Dim outArgs()
849*b1cdbd2cSJim Jagielski	Dim outIndex()
850*b1cdbd2cSJim Jagielski	dim localNumLines as integer
851*b1cdbd2cSJim Jagielski
852*b1cdbd2cSJim Jagielski	inArgs(0) = xmlFile()
853*b1cdbd2cSJim Jagielski	inArgs(1) = fileName
854*b1cdbd2cSJim Jagielski	inArgs(2) = numberOfLines
855*b1cdbd2cSJim Jagielski	Script.invoke( inArgs(), outIndex(), outArgs() )
856*b1cdbd2cSJim JagielskiEnd Sub
857*b1cdbd2cSJim Jagielski
858*b1cdbd2cSJim Jagielskisub UpdateConfig( a$ )
859*b1cdbd2cSJim Jagielski       dim document   as object
860*b1cdbd2cSJim Jagielski       dim dispatcher as object
861*b1cdbd2cSJim Jagielski       dim parser     as object
862*b1cdbd2cSJim Jagielski       dim disp     as object
863*b1cdbd2cSJim Jagielski       dim url        as new com.sun.star.util.URL
864*b1cdbd2cSJim Jagielski       document = ThisComponent.CurrentController.Frame
865*b1cdbd2cSJim Jagielski       parser   = createUnoService(&quot;com.sun.star.util.URLTransformer&quot;)
866*b1cdbd2cSJim Jagielski       dim args1(0) as new com.sun.star.beans.PropertyValue
867*b1cdbd2cSJim Jagielski       args1(0).Name = &quot;StreamName&quot;
868*b1cdbd2cSJim Jagielski       args1(0).Value = a$
869*b1cdbd2cSJim Jagielski       url.Complete = &quot;.uno:UpdateConfiguration&quot;
870*b1cdbd2cSJim Jagielski       parser.parseStrict(url)
871*b1cdbd2cSJim Jagielski       disp = document.queryDispatch(url,&quot;&quot;,0)
872*b1cdbd2cSJim Jagielski       disp.dispatch(url,args1())
873*b1cdbd2cSJim Jagielski
874*b1cdbd2cSJim JagielskiEnd Sub
875*b1cdbd2cSJim Jagielski
876*b1cdbd2cSJim Jagielski
877*b1cdbd2cSJim Jagielskisub AddNewEventBinding( scriptName as string, eventPosition as integer, isApp as boolean )
878*b1cdbd2cSJim Jagielski	event = allEventTypes( eventPosition ).Name
879*b1cdbd2cSJim Jagielski	&apos;dim scriptProp as new com.sun.star.beans.PropertyValue
880*b1cdbd2cSJim Jagielski	if isApp then
881*b1cdbd2cSJim Jagielski		&apos;scriptProp.Name = scriptName
882*b1cdbd2cSJim Jagielski		&apos;scriptProp.Value = numberOfLines
883*b1cdbd2cSJim Jagielski		allEventTypesApp( eventPosition ).Name = scriptName
884*b1cdbd2cSJim Jagielski		allEventTypesApp( eventPosition ).Value = numberOfLines
885*b1cdbd2cSJim Jagielski
886*b1cdbd2cSJim Jagielski		newline = &quot; &lt;event:event event:name=&quot; + chr$(34) + event + chr$(34)
887*b1cdbd2cSJim Jagielski		newline = newline + &quot; event:language=&quot; + chr$(34) + &quot;Script&quot; + chr$(34) + &quot; xlink:href=&quot; + chr$(34)
888*b1cdbd2cSJim Jagielski		newline = newline + scriptName + chr$(34) + &quot; xlink:type=&quot; + chr$(34) + &quot;simple&quot; + chr$(34) + &quot;/&gt;&quot;
889*b1cdbd2cSJim Jagielski		xmlFile( numberOfLines ) = newline
890*b1cdbd2cSJim Jagielski		xmlFile( numberOfLines + 1 ) = &quot;&lt;/event:events&gt;&quot;
891*b1cdbd2cSJim Jagielski		numberOfLines = numberOfLines + 1
892*b1cdbd2cSJim Jagielski	else
893*b1cdbd2cSJim Jagielski		&apos;scriptProp.Name = scriptName
894*b1cdbd2cSJim Jagielski		&apos;scriptProp.Value = 2
895*b1cdbd2cSJim Jagielski		allEventTypesDoc( eventPosition ).Name = scriptName
896*b1cdbd2cSJim Jagielski		allEventTypesDoc( eventPosition ).Value = 2
897*b1cdbd2cSJim Jagielski	end if
898*b1cdbd2cSJim Jagielskiend sub
899*b1cdbd2cSJim Jagielski
900*b1cdbd2cSJim JagielskiREM ----- Array update functions -----
901*b1cdbd2cSJim Jagielski
902*b1cdbd2cSJim Jagielski
903*b1cdbd2cSJim Jagielskisub AddNewMenuBinding( newScript as string, newMenuLabel as string, newLinePosition as integer )
904*b1cdbd2cSJim Jagielski	dim newXmlFile( 400 ) as string
905*b1cdbd2cSJim Jagielski	dim newLineInserted as boolean
906*b1cdbd2cSJim Jagielski	dim lineCounter as integer
907*b1cdbd2cSJim Jagielski	lineCounter = 1
908*b1cdbd2cSJim Jagielski
909*b1cdbd2cSJim Jagielski	do while lineCounter &lt;= numberOfLines
910*b1cdbd2cSJim Jagielski		if not newLineInserted then
911*b1cdbd2cSJim Jagielski			REM If the line number is the position at which to insert the new line
912*b1cdbd2cSJim Jagielski			if lineCounter = newLinePosition then
913*b1cdbd2cSJim Jagielski				if( instr( xmlFile( lineCounter ), &quot;&lt;menu:menupopup&gt;&quot; ) &gt; 0 ) then
914*b1cdbd2cSJim Jagielski					indent = GetMenuWhiteSpace( xmlFile( newLinePosition + 1 ) )
915*b1cdbd2cSJim Jagielski					newXmlFile( lineCounter ) = xmlFile( lineCounter )
916*b1cdbd2cSJim Jagielski					newXmlFile( lineCounter + 1 ) = ( indent + &quot;&lt;menu:menuitem menu:id=&quot;+chr$(34) + newScript + chr$(34)+&quot; menu:helpid=&quot;+chr$(34)+&quot;1929&quot;+chr$(34)+&quot; menu:label=&quot;+chr$(34)+ newMenuLabel + chr$(34)+&quot;/&gt;&quot; )
917*b1cdbd2cSJim Jagielski				else
918*b1cdbd2cSJim Jagielski					indent = GetMenuWhiteSpace( xmlFile( newLinePosition - 1 ) )
919*b1cdbd2cSJim Jagielski					newXmlFile( lineCounter ) = ( indent + &quot;&lt;menu:menuitem menu:id=&quot;+chr$(34) + newScript + chr$(34)+&quot; menu:helpid=&quot;+chr$(34)+&quot;1929&quot;+chr$(34)+&quot; menu:label=&quot;+chr$(34)+ newMenuLabel + chr$(34)+&quot;/&gt;&quot; )
920*b1cdbd2cSJim Jagielski					newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
921*b1cdbd2cSJim Jagielski				end if
922*b1cdbd2cSJim Jagielski			REM added -1 for debug --&gt;
923*b1cdbd2cSJim Jagielski			&apos;	indent = GetMenuWhiteSpace( xmlFile( newLinePosition ) )
924*b1cdbd2cSJim Jagielski			&apos;	newXmlFile( lineCounter ) = ( indent + &quot;&lt;menu:menuitem menu:id=&quot;+chr$(34)+&quot;script://&quot; + newScript + chr$(34)+&quot; menu:helpid=&quot;+chr$(34)+&quot;1929&quot;+chr$(34)+&quot; menu:label=&quot;+chr$(34)+ newMenuLabel + chr$(34)+&quot;/&gt;&quot; )
925*b1cdbd2cSJim Jagielski			&apos;	newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
926*b1cdbd2cSJim Jagielski				newLineInserted = true
927*b1cdbd2cSJim Jagielski			else
928*b1cdbd2cSJim Jagielski				newXmlFile( lineCounter ) = xmlFile( lineCounter )
929*b1cdbd2cSJim Jagielski			end if
930*b1cdbd2cSJim Jagielski		else
931*b1cdbd2cSJim Jagielski			REM if the new line has been inserted the read from one position behind
932*b1cdbd2cSJim Jagielski			newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
933*b1cdbd2cSJim Jagielski		end if
934*b1cdbd2cSJim Jagielski		lineCounter = lineCounter + 1
935*b1cdbd2cSJim Jagielski	loop
936*b1cdbd2cSJim Jagielski
937*b1cdbd2cSJim Jagielski	numberOfLines = numberOfLines + 1
938*b1cdbd2cSJim Jagielski
939*b1cdbd2cSJim Jagielski	REM read the new file into the global array
940*b1cdbd2cSJim Jagielski	for n = 1 to numberOfLines
941*b1cdbd2cSJim Jagielski		xmlFile( n ) = newXmlFile( n )
942*b1cdbd2cSJim Jagielski	next n
943*b1cdbd2cSJim Jagielski
944*b1cdbd2cSJim Jagielskiend sub
945*b1cdbd2cSJim Jagielski
946*b1cdbd2cSJim Jagielski
947*b1cdbd2cSJim Jagielskisub AddNewKeyBinding( scriptName as string, shift as boolean, control as boolean, key as string )
948*b1cdbd2cSJim Jagielski
949*b1cdbd2cSJim Jagielski	dim keyCombo as string
950*b1cdbd2cSJim Jagielski	newLine = &quot; &lt;accel:item accel:code=&quot;+chr$(34)+&quot;KEY_&quot; + key +chr$(34)
951*b1cdbd2cSJim Jagielski	if shift then
952*b1cdbd2cSJim Jagielski		keyCombo = &quot;SHIFT + &quot;
953*b1cdbd2cSJim Jagielski		newLine = newLine + &quot; accel:shift=&quot;+chr$(34)+&quot;true&quot;+chr$(34)
954*b1cdbd2cSJim Jagielski	end if
955*b1cdbd2cSJim Jagielski	if control then
956*b1cdbd2cSJim Jagielski		keyCombo = keyCombo + &quot;CONTROL + &quot;
957*b1cdbd2cSJim Jagielski		newLine = newLine + &quot; accel:mod1=&quot;+chr$(34)+&quot;true&quot;+chr$(34)
958*b1cdbd2cSJim Jagielski	end if
959*b1cdbd2cSJim Jagielski	keyCombo = keyCombo + key
960*b1cdbd2cSJim Jagielski	newLine = newLine + &quot; xlink:href=&quot;+chr$(34)+ scriptName +chr$(34) +&quot;/&gt;&quot;
961*b1cdbd2cSJim Jagielski
962*b1cdbd2cSJim Jagielski	if ( control AND shift ) then
963*b1cdbd2cSJim Jagielski		offsetIntoArrayOfArrays = 0
964*b1cdbd2cSJim Jagielski	elseif ( control ) then
965*b1cdbd2cSJim Jagielski		offsetIntoArrayOfArrays = 3
966*b1cdbd2cSJim Jagielski	elseif ( shift ) then
967*b1cdbd2cSJim Jagielski		offsetIntoArrayOfArrays = 6
968*b1cdbd2cSJim Jagielski	endif
969*b1cdbd2cSJim Jagielski
970*b1cdbd2cSJim Jagielski	keyTypeOffset = getKeyTypeOffset( key  )
971*b1cdbd2cSJim Jagielski	offsetIntoArrayOfArrays = offsetIntoArrayOfArrays + keyTypeOffset
972*b1cdbd2cSJim Jagielski	&apos; Calculate from the key the offset into key group array we need to point to
973*b1cdbd2cSJim Jagielski	KeyGroupIndex = getKeyGroupIndex( key, keyTypeOffset )
974*b1cdbd2cSJim Jagielski
975*b1cdbd2cSJim Jagielski	&apos; if key is allready allocated to a script then just reallocate
976*b1cdbd2cSJim Jagielski	if ( keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value &gt; 1 ) then
977*b1cdbd2cSJim Jagielski
978*b1cdbd2cSJim Jagielski		keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
979*b1cdbd2cSJim Jagielski		&apos;replace line in xml file
980*b1cdbd2cSJim Jagielski		xmlFile( keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value ) = newLine
981*b1cdbd2cSJim Jagielski	else
982*b1cdbd2cSJim Jagielski		&apos; this is a new binding, create a new line in xml file
983*b1cdbd2cSJim Jagielski		for n = 1 to numberOfLines
984*b1cdbd2cSJim Jagielski			if n = numberOfLines then
985*b1cdbd2cSJim Jagielski				xmlFile( n ) = newLine
986*b1cdbd2cSJim Jagielski				xmlFile( n + 1 ) = &quot;&lt;/accel:acceleratorlist&gt;&quot;
987*b1cdbd2cSJim Jagielski				exit for
988*b1cdbd2cSJim Jagielski			else
989*b1cdbd2cSJim Jagielski				xmlFile( n ) = xmlFile( n )
990*b1cdbd2cSJim Jagielski			end if
991*b1cdbd2cSJim Jagielski		next n
992*b1cdbd2cSJim Jagielski
993*b1cdbd2cSJim Jagielski		keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value = n
994*b1cdbd2cSJim Jagielski		keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
995*b1cdbd2cSJim Jagielski		numberOfLines = numberOfLines + 1
996*b1cdbd2cSJim Jagielski	endif
997*b1cdbd2cSJim Jagielski
998*b1cdbd2cSJim Jagielskiend sub
999*b1cdbd2cSJim Jagielski
1000*b1cdbd2cSJim Jagielski
1001*b1cdbd2cSJim JagielskiSub RemoveBinding( lineToRemove as Integer )
1002*b1cdbd2cSJim Jagielski	xmlFile( lineToRemove ) = &quot;&quot;
1003*b1cdbd2cSJim Jagielskiend Sub
1004*b1cdbd2cSJim Jagielski
1005*b1cdbd2cSJim JagielskiREM Adds or removes the starting xml line positions for each top-level menu after the menu with the added script
1006*b1cdbd2cSJim Jagielskisub UpdateTopLevelMenus( topLevelMenuPosition as integer, addLine as boolean )
1007*b1cdbd2cSJim Jagielski	for n = topLevelMenuPosition to 8
1008*b1cdbd2cSJim Jagielski		if addLine then
1009*b1cdbd2cSJim Jagielski			menuItemLinePosition( n ) = menuItemLinePosition( n ) + 1
1010*b1cdbd2cSJim Jagielski
1011*b1cdbd2cSJim Jagielski		end if
1012*b1cdbd2cSJim Jagielski	next n
1013*b1cdbd2cSJim Jagielskiend sub
1014*b1cdbd2cSJim Jagielski
1015*b1cdbd2cSJim Jagielski
1016*b1cdbd2cSJim JagielskiREM Remove scriptNames and scriptLinePosition entries
1017*b1cdbd2cSJim Jagielskisub RemoveScriptNameAndPosition( keyComboPosition )
1018*b1cdbd2cSJim Jagielski	dim updatedScriptNames( 120 ) as string
1019*b1cdbd2cSJim Jagielski	dim updatedScriptLinePosition( 120 ) as integer
1020*b1cdbd2cSJim Jagielski	dim removedScript as boolean
1021*b1cdbd2cSJim Jagielski	removedScript = false
1022*b1cdbd2cSJim Jagielski
1023*b1cdbd2cSJim Jagielski	for n = 1 to scriptCount
1024*b1cdbd2cSJim Jagielski		if not removedScript then
1025*b1cdbd2cSJim Jagielski			if not( n = keyComboPosition ) then
1026*b1cdbd2cSJim Jagielski				updatedScriptNames( n ) = scriptNames( n )
1027*b1cdbd2cSJim Jagielski			else
1028*b1cdbd2cSJim Jagielski				removedScript = true
1029*b1cdbd2cSJim Jagielski			end if
1030*b1cdbd2cSJim Jagielski		else
1031*b1cdbd2cSJim Jagielski			updatedScriptNames( n - 1 ) = scriptNames( n )
1032*b1cdbd2cSJim Jagielski		end if
1033*b1cdbd2cSJim Jagielski	next n
1034*b1cdbd2cSJim Jagielski	scriptCount = scriptCount - 1
1035*b1cdbd2cSJim Jagielski
1036*b1cdbd2cSJim Jagielski	for n = 1 to scriptCount
1037*b1cdbd2cSJim Jagielski		scriptNames( n ) = updatedScriptNames( n )
1038*b1cdbd2cSJim Jagielski	next n
1039*b1cdbd2cSJim Jagielskiend sub
1040*b1cdbd2cSJim Jagielski
1041*b1cdbd2cSJim Jagielski
1042*b1cdbd2cSJim Jagielski
1043*b1cdbd2cSJim JagielskiREM ----- Populating Dialog Controls -----
1044*b1cdbd2cSJim Jagielski
1045*b1cdbd2cSJim JagielskiSub PopulateLanguageCombo()
1046*b1cdbd2cSJim Jagielski	langCombo =  bindingDialog.getControl( &quot;LanguageCombo&quot; )
1047*b1cdbd2cSJim Jagielski	langCombo.removeItems( 0, langCombo.getItemCount() )
1048*b1cdbd2cSJim Jagielski	for n = LBOUND( languages() ) to UBOUND ( languages() )
1049*b1cdbd2cSJim Jagielski		langCombo.addItem( languages( n ), n )
1050*b1cdbd2cSJim Jagielski	next n
1051*b1cdbd2cSJim Jagielski	langCombo.setDropDownLineCount( n )
1052*b1cdbd2cSJim Jagielski	langCombo.text = langCombo.getItem( 0 )
1053*b1cdbd2cSJim JagielskiEnd Sub
1054*b1cdbd2cSJim Jagielski
1055*b1cdbd2cSJim JagielskiSub PopulateLocationCombo()
1056*b1cdbd2cSJim Jagielski	dim ScriptProvider as Object
1057*b1cdbd2cSJim Jagielski	dim args(1)
1058*b1cdbd2cSJim Jagielski	dim displayDialogFlag as boolean
1059*b1cdbd2cSJim Jagielski	displayDialogFlag = false
1060*b1cdbd2cSJim Jagielski	args(0) = ThisComponent
1061*b1cdbd2cSJim Jagielski	args(1) = displayDialogFlag
1062*b1cdbd2cSJim Jagielski
1063*b1cdbd2cSJim Jagielski	ScriptProvider = createUnoService(&quot;drafts.com.sun.star.script.framework.provider.MasterScriptProvider&quot;)
1064*b1cdbd2cSJim Jagielski	ScriptProvider.initialize( args() )
1065*b1cdbd2cSJim Jagielski
1066*b1cdbd2cSJim Jagielski	locCombo =  bindingDialog.getControl( &quot;LocationCombo&quot; )
1067*b1cdbd2cSJim Jagielski	locCombo.removeItems( 0, locCombo.getItemCount() )
1068*b1cdbd2cSJim Jagielski	for n = LBOUND( locations() ) to UBOUND ( locations() )
1069*b1cdbd2cSJim Jagielski		locCombo.addItem( locations( n ), n )
1070*b1cdbd2cSJim Jagielski	next n
1071*b1cdbd2cSJim Jagielski	locCombo.setDropDownLineCount( n )
1072*b1cdbd2cSJim Jagielski	locCombo.text = locCombo.getItem( 0 )
1073*b1cdbd2cSJim JagielskiEnd Sub
1074*b1cdbd2cSJim Jagielski
1075*b1cdbd2cSJim Jagielskisub PopulateScriptList( lang as String, loc as String )
1076*b1cdbd2cSJim Jagielski    Dim detailedView as boolean
1077*b1cdbd2cSJim Jagielski    detailedView = bindingDialog.Model.detail.state
1078*b1cdbd2cSJim Jagielski	scriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1079*b1cdbd2cSJim Jagielski	scriptList.removeItems( 0, scriptList.getItemCount() )
1080*b1cdbd2cSJim Jagielski
1081*b1cdbd2cSJim Jagielski	smgr = getProcessServiceManager()
1082*b1cdbd2cSJim Jagielski   	context = smgr.getPropertyValue( &quot;DefaultContext&quot; )
1083*b1cdbd2cSJim Jagielski   	scriptstoragemgr = context.getValueByName( &quot;/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager&quot; )
1084*b1cdbd2cSJim Jagielski	scriptLocationURI = &quot;USER&quot;
1085*b1cdbd2cSJim Jagielski	if ( loc = &quot;Share&quot; ) then
1086*b1cdbd2cSJim Jagielski		scriptLocationURI = &quot;SHARE&quot;
1087*b1cdbd2cSJim Jagielski	elseif ( loc = &quot;Document&quot; )then
1088*b1cdbd2cSJim Jagielski		document = StarDesktop.ActiveFrame.Controller.Model
1089*b1cdbd2cSJim Jagielski		scriptLocationURI = document.getURL()
1090*b1cdbd2cSJim Jagielski	elseif ( loc = &quot;Filesystem&quot; ) then
1091*b1cdbd2cSJim Jagielski		REM populate the list from the filesysScripts list
1092*b1cdbd2cSJim Jagielski		if(lang = &quot;Java&quot; ) then
1093*b1cdbd2cSJim Jagielski			exit sub
1094*b1cdbd2cSJim Jagielski		endif
1095*b1cdbd2cSJim Jagielski		length = UBOUND( filesysScripts() )
1096*b1cdbd2cSJim Jagielski		if(length = -1) then
1097*b1cdbd2cSJim Jagielski			exit sub
1098*b1cdbd2cSJim Jagielski		endif
1099*b1cdbd2cSJim Jagielski        for langIndex = lbound(languages()) to ubound(languages())
1100*b1cdbd2cSJim Jagielski            if ( lang = languages(langIndex)) then
1101*b1cdbd2cSJim Jagielski                extns = extensions(langIndex)
1102*b1cdbd2cSJim Jagielski                exit for
1103*b1cdbd2cSJim Jagielski            endif
1104*b1cdbd2cSJim Jagielski        next langIndex
1105*b1cdbd2cSJim Jagielski		dim locnDisplayList( length ) as new com.sun.star.beans.PropertyValue
1106*b1cdbd2cSJim Jagielski		for index = lbound(filesysScripts()) to ubound(filesysScripts())
1107*b1cdbd2cSJim Jagielski			scriptextn = filesysScripts( index )
1108*b1cdbd2cSJim Jagielski			pos = lastIndexOf( scriptextn, &quot;.&quot; )
1109*b1cdbd2cSJim Jagielski            scriptextn = mid( scriptextn, pos + 1, len( scriptextn ) - pos )
1110*b1cdbd2cSJim Jagielski
1111*b1cdbd2cSJim Jagielski            for extnsIndex = lbound(extns()) to ubound(extns())
1112*b1cdbd2cSJim Jagielski                extn = extns(extnsIndex)
1113*b1cdbd2cSJim Jagielski                if ( scriptextn = extn ) then
1114*b1cdbd2cSJim Jagielski                	if ( detailedView ) then
1115*b1cdbd2cSJim Jagielski                    	locnDisplayList( index ).Name = filesysScripts( index )
1116*b1cdbd2cSJim Jagielski                    	locnDisplayList( index ).Value = filesysScripts( index )
1117*b1cdbd2cSJim Jagielski                	else
1118*b1cdbd2cSJim Jagielski						REM replace name with simplified view
1119*b1cdbd2cSJim Jagielski						locnDisplayList( index ).Name = filesysScripts( index )
1120*b1cdbd2cSJim Jagielski						locnDisplayList( index ).Value = filesysScripts( index )
1121*b1cdbd2cSJim Jagielski					end if
1122*b1cdbd2cSJim Jagielski				scriptList.addItem( locnDisplayList( index ).Name, index )
1123*b1cdbd2cSJim Jagielski				exit for
1124*b1cdbd2cSJim Jagielski                end if
1125*b1cdbd2cSJim Jagielski            next extnsIndex
1126*b1cdbd2cSJim Jagielski		next index
1127*b1cdbd2cSJim Jagielski		ScriptDisplayList(0) = locnDisplayList()
1128*b1cdbd2cSJim Jagielski		scriptList.selectItemPos( 0, true )
1129*b1cdbd2cSJim Jagielski
1130*b1cdbd2cSJim Jagielski        REM !!!!At this point we exit the sub!!!!
1131*b1cdbd2cSJim Jagielski		exit sub
1132*b1cdbd2cSJim Jagielski
1133*b1cdbd2cSJim Jagielski	endif
1134*b1cdbd2cSJim Jagielski
1135*b1cdbd2cSJim Jagielski	scriptStorageID = scriptstoragemgr.getScriptStorageID( scriptLocationURI )
1136*b1cdbd2cSJim Jagielski	dim resultList() as Object
1137*b1cdbd2cSJim Jagielski	if ( scriptStorageID &gt; -1 ) then
1138*b1cdbd2cSJim Jagielski		storage = scriptstoragemgr.getScriptStorage( scriptStorageID )
1139*b1cdbd2cSJim Jagielski		implementations() = storage.getAllImplementations()
1140*b1cdbd2cSJim Jagielski		length = UBOUND( implementations() )
1141*b1cdbd2cSJim Jagielski		reservedScriptTag = &quot;_$&quot;
1142*b1cdbd2cSJim Jagielski    	if ( length &gt; -1 ) then
1143*b1cdbd2cSJim Jagielski    		dim tempDisplayList( length ) as new com.sun.star.beans.PropertyValue
1144*b1cdbd2cSJim Jagielski			for n = LBOUND( implementations() ) to UBOUND( implementations() )
1145*b1cdbd2cSJim Jagielski				logicalName = implementations( n ).getLogicalName()
1146*b1cdbd2cSJim Jagielski				firstTwoChars = LEFT( logicalName, 2 )
1147*b1cdbd2cSJim Jagielski				&apos;Only display scripts whose logicalnames don&apos;t begin with &quot;_$&quot;
1148*b1cdbd2cSJim Jagielski				if ( firstTwoChars &lt;&gt; reservedScriptTag ) then
1149*b1cdbd2cSJim Jagielski					if ( lang = implementations( n ).getLanguage() ) then
1150*b1cdbd2cSJim Jagielski						if ( detailedView ) then
1151*b1cdbd2cSJim Jagielski							tempDisplayList( n ).Name = logicalName _
1152*b1cdbd2cSJim Jagielski								+ &quot; [&quot; + implementations( n ).getFunctionName() + &quot;]&quot;
1153*b1cdbd2cSJim Jagielski							tempDisplayList( n ).Value = implementations( n )
1154*b1cdbd2cSJim Jagielski						else
1155*b1cdbd2cSJim Jagielski							tempDisplayList( n ).Name = logicalName
1156*b1cdbd2cSJim Jagielski							tempDisplayList( n ).Value = implementations( n )
1157*b1cdbd2cSJim Jagielski						endif
1158*b1cdbd2cSJim Jagielski						scriptList.addItem( tempDisplayList( n ).Name, n )
1159*b1cdbd2cSJim Jagielski					endif
1160*b1cdbd2cSJim Jagielski				endif
1161*b1cdbd2cSJim Jagielski			next n
1162*b1cdbd2cSJim Jagielski			resultList = tempDisplayList()
1163*b1cdbd2cSJim Jagielski		endif
1164*b1cdbd2cSJim Jagielski	ScriptDisplayList(0) = resultList()
1165*b1cdbd2cSJim Jagielski	endif
1166*b1cdbd2cSJim Jagielski	scriptList.selectItemPos( 0, true )
1167*b1cdbd2cSJim Jagielski
1168*b1cdbd2cSJim Jagielskiend sub
1169*b1cdbd2cSJim Jagielski
1170*b1cdbd2cSJim Jagielskisub PopulateMenuCombo()
1171*b1cdbd2cSJim Jagielski	menuComboBox = bindingDialog.getControl( &quot;MenuCombo&quot; )
1172*b1cdbd2cSJim Jagielski	menuComboBox.removeItems( 0, menuComboBox.getItemCount() )
1173*b1cdbd2cSJim Jagielski	for n = 1 to menuCount
1174*b1cdbd2cSJim Jagielski		menuComboBox.addItem( menuItems( n ), n - 1 )
1175*b1cdbd2cSJim Jagielski	next n
1176*b1cdbd2cSJim Jagielski	menuComboBox.setDropDownLineCount( 8 )
1177*b1cdbd2cSJim Jagielski	menuComboBox.text = menuComboBox.getItem( 0 )
1178*b1cdbd2cSJim Jagielskiend sub
1179*b1cdbd2cSJim Jagielski
1180*b1cdbd2cSJim Jagielski
1181*b1cdbd2cSJim Jagielskisub PopulateSubMenuList( menuItemPosition as integer )
1182*b1cdbd2cSJim Jagielski	redim subMenuItems( 100 ) as string
1183*b1cdbd2cSJim Jagielski	redim subMenuItemLinePosition( 100 ) as integer
1184*b1cdbd2cSJim Jagielski	dim lineNumber as integer
1185*b1cdbd2cSJim Jagielski	const menuItemWhiteSpace = 4
1186*b1cdbd2cSJim Jagielski	const menuXMLTag = &quot;&lt;menu:menu&quot;
1187*b1cdbd2cSJim Jagielski	subMenuCount = 1
1188*b1cdbd2cSJim Jagielski
1189*b1cdbd2cSJim Jagielski	REM xmlStartLine and xmlEndLine refer to the first and last lines
1190*b1cdbd2cSJim Jagielski	&apos; menuItemPosition of a top-level menu ( 1=File to 8=Help ) add one line
1191*b1cdbd2cSJim Jagielski	xmlStartLine = menuItemLinePosition( menuItemPosition ) + 1
1192*b1cdbd2cSJim Jagielski
1193*b1cdbd2cSJim Jagielski	REM If last menu item is chosen
1194*b1cdbd2cSJim Jagielski	if menuItemPosition = menuCount then
1195*b1cdbd2cSJim Jagielski		xmlEndLine = numberOfLines
1196*b1cdbd2cSJim Jagielski	else
1197*b1cdbd2cSJim Jagielski		REM Other wise get the line before the next top-level menu begins
1198*b1cdbd2cSJim Jagielski		xmlEndLine = menuItemLinePosition( menuItemPosition + 1 ) - 1
1199*b1cdbd2cSJim Jagielski	end if
1200*b1cdbd2cSJim Jagielski
1201*b1cdbd2cSJim Jagielski	for lineNumber = xmlStartLine to xmlEndLine
1202*b1cdbd2cSJim Jagielski		REM Insert all sub-menus and sub-popupmenus
1203*b1cdbd2cSJim Jagielski		if not( instr( xmlFile( lineNumber ), menuXMLTag ) = 0 ) and instr( xmlFile( lineNumber ), &quot;menupopup&quot;) = 0 then
1204*b1cdbd2cSJim Jagielski			subMenuIndent = GetMenuWhiteSpace( xmlFile( lineNumber ) )
1205*b1cdbd2cSJim Jagielski			if subMenuIndent = &quot; &quot; then
1206*b1cdbd2cSJim Jagielski				subMenuIndent = &quot;&quot;
1207*b1cdbd2cSJim Jagielski			else
1208*b1cdbd2cSJim Jagielski				subMenuIndent = subMenuIndent + subMenuIndent
1209*b1cdbd2cSJim Jagielski			end if
1210*b1cdbd2cSJim Jagielski			if not( instr( xmlFile( lineNumber ), &quot;menuseparator&quot; ) = 0 ) then
1211*b1cdbd2cSJim Jagielski				subMenuItems( subMenuCount ) = subMenuIndent + &quot;----------------&quot;
1212*b1cdbd2cSJim Jagielski			else
1213*b1cdbd2cSJim Jagielski				subMenuName = ExtractLabelFromXMLLine( xmlFile( lineNumber ) )
1214*b1cdbd2cSJim Jagielski				REM Add script Name if there is one bound to menu item
1215*b1cdbd2cSJim Jagielski				if instr( xmlFile( lineNumber ), &quot;script://&quot; ) &gt; 0 then
1216*b1cdbd2cSJim Jagielski					script = ExtractScriptIdFromXMLLine( xmlFile( lineNumber ) )
1217*b1cdbd2cSJim Jagielski					subMenuItems( subMenuCount ) = ( subMenuIndent + subMenuName + &quot; [&quot; + script + &quot;]&quot; )
1218*b1cdbd2cSJim Jagielski				else
1219*b1cdbd2cSJim Jagielski					subMenuItems( subMenuCount ) = subMenuIndent + subMenuName
1220*b1cdbd2cSJim Jagielski				end if
1221*b1cdbd2cSJim Jagielski			end if
1222*b1cdbd2cSJim Jagielski			subMenuItemLinePosition( subMenuCount ) = lineNumber
1223*b1cdbd2cSJim Jagielski			subMenuCount = subMenuCount + 1
1224*b1cdbd2cSJim Jagielski		end if
1225*b1cdbd2cSJim Jagielski	next lineNumber
1226*b1cdbd2cSJim Jagielski
1227*b1cdbd2cSJim Jagielski	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
1228*b1cdbd2cSJim Jagielski
1229*b1cdbd2cSJim Jagielski	currentPosition = subMenuList.getSelectedItemPos()
1230*b1cdbd2cSJim Jagielski
1231*b1cdbd2cSJim Jagielski	subMenuList.removeItems( 0, subMenuList.getItemCount() )
1232*b1cdbd2cSJim Jagielski	&apos;If there are no sub-menus i.e. a dynamically generated menu like Format
1233*b1cdbd2cSJim Jagielski	&apos;if subMenuCount = 1 then
1234*b1cdbd2cSJim Jagielski	if menuItems( menuItemPosition ) = &quot;Format&quot; then
1235*b1cdbd2cSJim Jagielski			subMenuList.addItem( &quot;Unable to Assign Scripts to this menu&quot;, 0 )
1236*b1cdbd2cSJim Jagielski	else
1237*b1cdbd2cSJim Jagielski		for n = 1 to subMenuCount - 1
1238*b1cdbd2cSJim Jagielski			subMenuList.addItem( subMenuItems( n ), n - 1 )
1239*b1cdbd2cSJim Jagielski		next n
1240*b1cdbd2cSJim Jagielski	end if
1241*b1cdbd2cSJim Jagielski
1242*b1cdbd2cSJim Jagielski	subMenuList.selectItemPos( currentPosition, true )
1243*b1cdbd2cSJim Jagielski
1244*b1cdbd2cSJim Jagielski	SubMenuListListener()
1245*b1cdbd2cSJim Jagielski	MenuLabelBoxListener()
1246*b1cdbd2cSJim Jagielskiend sub
1247*b1cdbd2cSJim Jagielski
1248*b1cdbd2cSJim Jagielski
1249*b1cdbd2cSJim Jagielski
1250*b1cdbd2cSJim Jagielskisub PopulateTopLevelKeyBindingList()
1251*b1cdbd2cSJim Jagielski
1252*b1cdbd2cSJim Jagielski    allKeyGroupsArray(0) =  &quot;SHIFT + CONTROL + F keys&quot;
1253*b1cdbd2cSJim Jagielski	allKeyGroupsArray(1) = &quot;SHIFT + CONTROL + digits&quot; &apos; CURRENTLY DISABLED
1254*b1cdbd2cSJim Jagielski	allKeyGroupsArray(2) = &quot;SHIFT + CONTROL + letters&quot;
1255*b1cdbd2cSJim Jagielski	allKeyGroupsArray(3) = &quot;CONTROL + F keys&quot;
1256*b1cdbd2cSJim Jagielski	allKeyGroupsArray(4) = &quot;CONTROL + digits&quot;
1257*b1cdbd2cSJim Jagielski	allKeyGroupsArray(5) = &quot;CONTROL + letters&quot;
1258*b1cdbd2cSJim Jagielski	allKeyGroupsArray(6) = &quot;SHIFT + F keys&quot;
1259*b1cdbd2cSJim Jagielski
1260*b1cdbd2cSJim Jagielski	keyCombo = bindingDialog.getControl( &quot;KeyCombo&quot; )
1261*b1cdbd2cSJim Jagielski	keyCombo.removeItems( 0, keyCombo.getItemCount() )
1262*b1cdbd2cSJim Jagielski	pos = 0
1263*b1cdbd2cSJim Jagielski	for n = LBOUND( allKeyGroupsArray() ) to UBOUND( allKeyGroupsArray() )
1264*b1cdbd2cSJim Jagielski	&apos; SHIFT + CONTROL + digits group is disabled at the moment, so skip
1265*b1cdbd2cSJim Jagielski	&apos; it
1266*b1cdbd2cSJim Jagielski		if ( n &lt;&gt; 1 ) then
1267*b1cdbd2cSJim Jagielski			keyCombo.addItem( allKeyGroupsArray( n ), pos )
1268*b1cdbd2cSJim Jagielski			pos = pos +1
1269*b1cdbd2cSJim Jagielski		endif
1270*b1cdbd2cSJim Jagielski	next n
1271*b1cdbd2cSJim Jagielski	keyCombo.text = keyCombo.getItem( 0 )
1272*b1cdbd2cSJim Jagielskiend sub
1273*b1cdbd2cSJim Jagielski
1274*b1cdbd2cSJim Jagielskisub PopulateKeyBindingList( keyGroupIndex as Integer )
1275*b1cdbd2cSJim Jagielski	keyList = bindingDialog.getControl( &quot;KeyList&quot; )
1276*b1cdbd2cSJim Jagielski	selectedPos = keyList.getSelectedItemPos()
1277*b1cdbd2cSJim Jagielski	keyList.removeItems( 0, keyList.getItemCount() )
1278*b1cdbd2cSJim Jagielski
1279*b1cdbd2cSJim Jagielski	ShortCutKeyArray() = KeyBindArrayOfArrays( keyGroupIndex )
1280*b1cdbd2cSJim Jagielski
1281*b1cdbd2cSJim Jagielski	Dim keyProp as new com.sun.star.beans.PropertyValue
1282*b1cdbd2cSJim Jagielski	for n = lbound( ShortCutKeyArray() )  to ubound( ShortCutKeyArray() )
1283*b1cdbd2cSJim Jagielski		keyName = ShortCutKeyArray( n )
1284*b1cdbd2cSJim Jagielski		if ( keyAllocationMap( keyGroupIndex, n ).Value = 1 ) then
1285*b1cdbd2cSJim Jagielski			keyName = keyName + &quot; [Allocated to Office function]&quot;
1286*b1cdbd2cSJim Jagielski
1287*b1cdbd2cSJim Jagielski		elseif ( keyAllocationMap( keyGroupIndex, n ).Value &gt; 1 ) then
1288*b1cdbd2cSJim Jagielski			keyName = keyName + &quot; &quot; + keyAllocationMap( keyGroupIndex, n ).Name
1289*b1cdbd2cSJim Jagielski		endif
1290*b1cdbd2cSJim Jagielski		keyList.addItem( keyName, n )
1291*b1cdbd2cSJim Jagielski	next n
1292*b1cdbd2cSJim Jagielski
1293*b1cdbd2cSJim Jagielski	if ( selectedPos &lt;&gt; -1 )then
1294*b1cdbd2cSJim Jagielski		keyList.selectItemPos( selectedPos, true )
1295*b1cdbd2cSJim Jagielski	else
1296*b1cdbd2cSJim Jagielski		keyList.selectItemPos( 0, true )
1297*b1cdbd2cSJim Jagielski	end if
1298*b1cdbd2cSJim Jagielski	KeyListListener()
1299*b1cdbd2cSJim Jagielskiend sub
1300*b1cdbd2cSJim Jagielski
1301*b1cdbd2cSJim Jagielskisub populateEventList( focusPosition as integer )
1302*b1cdbd2cSJim Jagielski	allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
1303*b1cdbd2cSJim Jagielski	eventList = bindingDialog.getControl( &quot;EventList&quot; )
1304*b1cdbd2cSJim Jagielski	eventList.removeItems( 0, eventList.getItemCount() )
1305*b1cdbd2cSJim Jagielski
1306*b1cdbd2cSJim Jagielski	dim isApp as boolean
1307*b1cdbd2cSJim Jagielski	if allApps.state = true then  &apos; Application event
1308*b1cdbd2cSJim Jagielski		isApp = true
1309*b1cdbd2cSJim Jagielski	else
1310*b1cdbd2cSJim Jagielski		isApp = false
1311*b1cdbd2cSJim Jagielski	end if
1312*b1cdbd2cSJim Jagielski
1313*b1cdbd2cSJim Jagielski	&apos; use allEventTypes() to fill list box
1314*b1cdbd2cSJim Jagielski	&apos; for each element compare with allEventTypesApp
1315*b1cdbd2cSJim Jagielski	dim scriptName as string
1316*b1cdbd2cSJim Jagielski	dim lineNumber as integer
1317*b1cdbd2cSJim Jagielski	for n = 0 to ubound( allEventTypes() )
1318*b1cdbd2cSJim Jagielski		&apos; If the line number is 1 then SB macro
1319*b1cdbd2cSJim Jagielski		&apos; more than 1 it is the line number of the script
1320*b1cdbd2cSJim Jagielski		if isApp and n &gt; 12 then
1321*b1cdbd2cSJim Jagielski			exit for
1322*b1cdbd2cSJim Jagielski		endif
1323*b1cdbd2cSJim Jagielski		if isApp then
1324*b1cdbd2cSJim Jagielski			lineNumber = allEventTypesApp( n ).Value
1325*b1cdbd2cSJim Jagielski			scriptName = allEventTypesApp( n ).Name
1326*b1cdbd2cSJim Jagielski		else
1327*b1cdbd2cSJim Jagielski			lineNumber = allEventTypesDoc( n ).Value
1328*b1cdbd2cSJim Jagielski			scriptName = allEventTypesDoc( n ).Name
1329*b1cdbd2cSJim Jagielski		end if
1330*b1cdbd2cSJim Jagielski		stringToAdd = &quot;&quot;
1331*b1cdbd2cSJim Jagielski		if ( lineNumber &gt;= 1 ) then
1332*b1cdbd2cSJim Jagielski			stringToAdd = &quot; [&quot; + scriptName + &quot;]&quot;
1333*b1cdbd2cSJim Jagielski		end if
1334*b1cdbd2cSJim Jagielski		eventList.addItem( allEventTypes( n ).Value + &quot; &quot; + stringToAdd, n )
1335*b1cdbd2cSJim Jagielski	next n
1336*b1cdbd2cSJim Jagielski
1337*b1cdbd2cSJim Jagielski	eventList.selectItemPos( focusPosition, true )
1338*b1cdbd2cSJim Jagielskiend sub
1339*b1cdbd2cSJim Jagielski
1340*b1cdbd2cSJim Jagielski
1341*b1cdbd2cSJim Jagielski
1342*b1cdbd2cSJim Jagielskisub CreateAllKeyBindings()
1343*b1cdbd2cSJim Jagielski	reDim allKeyBindings( 105 ) as string
1344*b1cdbd2cSJim Jagielski	keyBindingPosition = 1
1345*b1cdbd2cSJim Jagielski
1346*b1cdbd2cSJim Jagielski	for FKey = 2 to 12
1347*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + CONTROL + F&quot; + FKey
1348*b1cdbd2cSJim Jagielski		keyBindingPosition = keyBindingPosition + 1
1349*b1cdbd2cSJim Jagielski	next FKey
1350*b1cdbd2cSJim Jagielski	for Digit = 0 to 9
1351*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + CONTROL + &quot; + Digit
1352*b1cdbd2cSJim Jagielski			keyBindingPosition = keyBindingPosition + 1
1353*b1cdbd2cSJim Jagielski	next Digit
1354*b1cdbd2cSJim Jagielski	for Alpha = 65 to 90
1355*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + CONTROL + &quot; + chr$( Alpha )
1356*b1cdbd2cSJim Jagielski		keyBindingPosition = keyBindingPosition + 1
1357*b1cdbd2cSJim Jagielski	next Alpha
1358*b1cdbd2cSJim Jagielski
1359*b1cdbd2cSJim Jagielski	for FKey = 2 to 12
1360*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;CONTROL + F&quot; + FKey
1361*b1cdbd2cSJim Jagielski		keyBindingPosition = keyBindingPosition + 1
1362*b1cdbd2cSJim Jagielski	next FKey
1363*b1cdbd2cSJim Jagielski	for Digit = 0 to 9
1364*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;CONTROL + &quot; + Digit
1365*b1cdbd2cSJim Jagielski		keyBindingPosition = keyBindingPosition + 1
1366*b1cdbd2cSJim Jagielski	next Digit
1367*b1cdbd2cSJim Jagielski	for Alpha = 65 to 90
1368*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;CONTROL + &quot; + chr$( Alpha )
1369*b1cdbd2cSJim Jagielski		keyBindingPosition = keyBindingPosition + 1
1370*b1cdbd2cSJim Jagielski	next Alpha
1371*b1cdbd2cSJim Jagielski
1372*b1cdbd2cSJim Jagielski	for FKey = 2 to 12
1373*b1cdbd2cSJim Jagielski		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + F&quot; + FKey
1374*b1cdbd2cSJim Jagielski		keyBindingPosition = keyBindingPosition + 1
1375*b1cdbd2cSJim Jagielski	next FKey
1376*b1cdbd2cSJim Jagielskiend sub
1377*b1cdbd2cSJim Jagielski
1378*b1cdbd2cSJim Jagielski
1379*b1cdbd2cSJim Jagielskisub createAllEventTypes()
1380*b1cdbd2cSJim Jagielski	allEventTypes( 0 ).Name = &quot;OnStartApp&quot;
1381*b1cdbd2cSJim Jagielski	allEventTypes( 0 ).Value = &quot;Start Application&quot;
1382*b1cdbd2cSJim Jagielski	allEventTypes( 1 ).Name = &quot;OnCloseApp&quot;
1383*b1cdbd2cSJim Jagielski	allEventTypes( 1 ).Value = &quot;Close Application&quot;
1384*b1cdbd2cSJim Jagielski	allEventTypes( 2 ).Name = &quot;OnNew&quot;
1385*b1cdbd2cSJim Jagielski	allEventTypes( 2 ).Value = &quot;Create Document&quot;
1386*b1cdbd2cSJim Jagielski	allEventTypes( 3 ).Name = &quot;OnLoad&quot;
1387*b1cdbd2cSJim Jagielski	allEventTypes( 3 ).Value = &quot;Open Document&quot;
1388*b1cdbd2cSJim Jagielski	allEventTypes( 4 ).Name = &quot;OnSaveAs&quot;
1389*b1cdbd2cSJim Jagielski	allEventTypes( 4 ).Value = &quot;Save Document As&quot;
1390*b1cdbd2cSJim Jagielski	allEventTypes( 5 ).Name = &quot;OnSaveAsDone&quot;
1391*b1cdbd2cSJim Jagielski	allEventTypes( 5 ).Value = &quot;Document has been saved as&quot;
1392*b1cdbd2cSJim Jagielski	allEventTypes( 6 ).Name = &quot;OnSave&quot;
1393*b1cdbd2cSJim Jagielski	allEventTypes( 6 ).Value = &quot;Save Document&quot;
1394*b1cdbd2cSJim Jagielski	allEventTypes( 7 ).Name = &quot;OnSaveDone&quot;
1395*b1cdbd2cSJim Jagielski	allEventTypes( 7 ).Value = &quot;Document has been saved&quot;
1396*b1cdbd2cSJim Jagielski	allEventTypes( 8 ).Name = &quot;OnPrepareUnload&quot;
1397*b1cdbd2cSJim Jagielski	allEventTypes( 8 ).Value = &quot;Close Document&quot;
1398*b1cdbd2cSJim Jagielski	allEventTypes( 9 ).Name = &quot;OnUnload&quot;
1399*b1cdbd2cSJim Jagielski	allEventTypes( 9 ).Value = &quot;Close Document&quot;
1400*b1cdbd2cSJim Jagielski	allEventTypes( 10 ).Name = &quot;OnFocus&quot;
1401*b1cdbd2cSJim Jagielski	allEventTypes( 10 ).Value = &quot;Activate document&quot;
1402*b1cdbd2cSJim Jagielski	allEventTypes( 11 ).Name = &quot;OnUnfocus&quot;
1403*b1cdbd2cSJim Jagielski	allEventTypes( 11 ).Value = &quot;DeActivate document&quot;
1404*b1cdbd2cSJim Jagielski	allEventTypes( 12 ).Name = &quot;OnPrint&quot;
1405*b1cdbd2cSJim Jagielski	allEventTypes( 12 ).Value = &quot;Print Document&quot;
1406*b1cdbd2cSJim Jagielski	REM The following are document-only events
1407*b1cdbd2cSJim Jagielski	allEventTypes( 13 ).Name = &quot;OnMailMerge&quot;
1408*b1cdbd2cSJim Jagielski	allEventTypes( 13 ).Value = &quot;Print form letters&quot;
1409*b1cdbd2cSJim Jagielski	allEventTypes( 14 ).Name = &quot;OnPageCountChange&quot;
1410*b1cdbd2cSJim Jagielski	allEventTypes( 14 ).Value = &quot;Changing the page count&quot;
1411*b1cdbd2cSJim Jagielskiend sub
1412*b1cdbd2cSJim Jagielski
1413*b1cdbd2cSJim Jagielski
1414*b1cdbd2cSJim Jagielskisub createAllEventBindings()
1415*b1cdbd2cSJim Jagielski	&apos;dim props as new com.sun.star.beans.PropertyValue
1416*b1cdbd2cSJim Jagielski	&apos;props.Name = &quot;&quot; &apos;Name = script name
1417*b1cdbd2cSJim Jagielski	&apos;props.Value = 0 &apos;Value = 0 for empty, 1 for macro, linenumber for script
1418*b1cdbd2cSJim Jagielski
1419*b1cdbd2cSJim Jagielski	&apos; Creates all types of event bindings for both Application and Document
1420*b1cdbd2cSJim Jagielski	&apos; Initially both arrays have no bindings allocated to the events
1421*b1cdbd2cSJim Jagielski	&apos; The value for Doc is only Script/macro name (no need for line number)
1422*b1cdbd2cSJim Jagielski	for n = 0 to ubound( allEventTypes() )
1423*b1cdbd2cSJim Jagielski		allEventTypesApp( n ).Name = &quot;&quot;
1424*b1cdbd2cSJim Jagielski		allEventTypesApp( n ).Value = 0
1425*b1cdbd2cSJim Jagielski		allEventTypesDoc( n ).Name = &quot;&quot;
1426*b1cdbd2cSJim Jagielski		allEventTypesDoc( n ).Value = 0
1427*b1cdbd2cSJim Jagielski	next n
1428*b1cdbd2cSJim Jagielskiend sub
1429*b1cdbd2cSJim Jagielski
1430*b1cdbd2cSJim Jagielski
1431*b1cdbd2cSJim JagielskiREM ----- Text Handling Functions -----
1432*b1cdbd2cSJim Jagielski
1433*b1cdbd2cSJim Jagielski
1434*b1cdbd2cSJim Jagielskifunction ExtractLabelFromXMLLine( XMLLine as string ) as string
1435*b1cdbd2cSJim Jagielski	labelStart = instr( XMLLine, &quot;label=&quot;+chr$(34)) + 7
1436*b1cdbd2cSJim Jagielski	labelEnd = instr( XMLLine, chr$(34)+&quot;&gt;&quot; )
1437*b1cdbd2cSJim Jagielski	if labelEnd = 0 then
1438*b1cdbd2cSJim Jagielski	    labelEnd = instr( XMLLine, chr$(34)+&quot;/&gt;&quot; )
1439*b1cdbd2cSJim Jagielski	end if
1440*b1cdbd2cSJim Jagielski	labelLength = labelEnd - labelStart
1441*b1cdbd2cSJim Jagielski
1442*b1cdbd2cSJim Jagielski	menuLabelUnformatted = mid( XMLLine, labelStart, labelLength )
1443*b1cdbd2cSJim Jagielski	tildePosition = instr( menuLabelUnformatted, &quot;~&quot; )
1444*b1cdbd2cSJim Jagielski	select case tildePosition
1445*b1cdbd2cSJim Jagielski		case 0
1446*b1cdbd2cSJim Jagielski			menuLabel = menuLabelUnformatted
1447*b1cdbd2cSJim Jagielski		case 1
1448*b1cdbd2cSJim Jagielski			menuLabel = right( menuLabelUnformatted, labelLength - 1 )
1449*b1cdbd2cSJim Jagielski		case else
1450*b1cdbd2cSJim Jagielski			menuLabelLeft = left( menuLabelUnformatted, tildePosition - 1 )
1451*b1cdbd2cSJim Jagielski			menuLabelRight = right( menuLabelUnformatted, labelLength - tildePosition )
1452*b1cdbd2cSJim Jagielski			menuLabel = menuLabelLeft + menuLabelRight
1453*b1cdbd2cSJim Jagielski	end select
1454*b1cdbd2cSJim Jagielski
1455*b1cdbd2cSJim Jagielski	ExtractLabelFromXMLLine() = menuLabel
1456*b1cdbd2cSJim Jagielskiend function
1457*b1cdbd2cSJim Jagielski
1458*b1cdbd2cSJim Jagielski
1459*b1cdbd2cSJim Jagielskifunction ExtractScriptIdFromXMLLine( XMLLine as string ) as string
1460*b1cdbd2cSJim Jagielski	idStart = instr( XMLLine, &quot;script://&quot;) + 9
1461*b1cdbd2cSJim Jagielski	if instr( XMLLine, chr$(34)+&quot; menu:helpid=&quot; ) = 0 then
1462*b1cdbd2cSJim Jagielski		idEnd = instr( XMLLIne, &quot;?location=&quot; )
1463*b1cdbd2cSJim Jagielski	else
1464*b1cdbd2cSJim Jagielski		idEnd = instr( XMLLine, &quot;&quot;+chr$(34)+&quot; menu:helpid=&quot; )
1465*b1cdbd2cSJim Jagielski	end if
1466*b1cdbd2cSJim Jagielski	idLength = idEnd - idStart
1467*b1cdbd2cSJim Jagielski	scriptId = mid( XMLLine, idStart, idLength )
1468*b1cdbd2cSJim Jagielski
1469*b1cdbd2cSJim Jagielski	ExtractScriptIdFromXMLLine() = scriptId
1470*b1cdbd2cSJim Jagielskiend function
1471*b1cdbd2cSJim Jagielski
1472*b1cdbd2cSJim Jagielskifunction ExtractEventScriptFromXMLLine( xmlline as string )
1473*b1cdbd2cSJim Jagielski	if instr( xmlline, &quot;script://&quot; ) &gt; 0 then
1474*b1cdbd2cSJim Jagielski		idStart = instr( xmlline, &quot;script://&quot;) + 9
1475*b1cdbd2cSJim Jagielski		idEnd = instr( xmlline, chr$(34)+&quot; xlink:type=&quot; )
1476*b1cdbd2cSJim Jagielski		idLength = idEnd - idStart
1477*b1cdbd2cSJim Jagielski		scriptId = mid( xmlline, idStart, idLength )
1478*b1cdbd2cSJim Jagielski	end if
1479*b1cdbd2cSJim Jagielski	ExtractEventScriptFromXMLLine() = scriptId
1480*b1cdbd2cSJim Jagielskiend function
1481*b1cdbd2cSJim Jagielski
1482*b1cdbd2cSJim Jagielski
1483*b1cdbd2cSJim Jagielskifunction ExtractEventNameFromXMLLine(  xmlline as string )
1484*b1cdbd2cSJim Jagielski	idStart = instr( xmlline, &quot;event:name=&quot; + chr$(34) ) + 12
1485*b1cdbd2cSJim Jagielski	idEnd = instr( xmlline, chr$(34)+&quot; event:language&quot; )
1486*b1cdbd2cSJim Jagielski	idLength = idEnd - idStart
1487*b1cdbd2cSJim Jagielski	event =  mid( xmlline, idStart, idLength )
1488*b1cdbd2cSJim Jagielski
1489*b1cdbd2cSJim Jagielski	ExtractEventNameFromXMLLine() = event
1490*b1cdbd2cSJim Jagielskiend function
1491*b1cdbd2cSJim Jagielski
1492*b1cdbd2cSJim Jagielskifunction ExtractKeyCodeFromXMLLine( XMLLine as string ) as string
1493*b1cdbd2cSJim Jagielski	keyStart = instr( XMLLine, &quot;code=&quot;+chr$(34)+&quot;KEY_&quot;) + 10
1494*b1cdbd2cSJim Jagielski	keyCode = mid( XMLLine, keyStart, ( len( XMLLine ) - keyStart ) )
1495*b1cdbd2cSJim Jagielski	keyEnd = instr( keyCode, chr$(34) )
1496*b1cdbd2cSJim Jagielski	keyCode = mid( keyCode, 1, keyEnd - 1 )
1497*b1cdbd2cSJim Jagielski
1498*b1cdbd2cSJim Jagielski	ExtractKeyCodeFromXMLLine() = keyCode
1499*b1cdbd2cSJim Jagielskiend function
1500*b1cdbd2cSJim Jagielski
1501*b1cdbd2cSJim Jagielski
1502*b1cdbd2cSJim Jagielskifunction GetMenuWhiteSpace( MenuXMLLine as string ) as string
1503*b1cdbd2cSJim Jagielski	whiteSpace = &quot;&quot;
1504*b1cdbd2cSJim Jagielski	numberOfSpaces = instr( MenuXMLLine, &quot;&lt;&quot; ) - 1
1505*b1cdbd2cSJim Jagielski	for i = 1 to numberOfSpaces
1506*b1cdbd2cSJim Jagielski		whiteSpace = whiteSpace + &quot; &quot;
1507*b1cdbd2cSJim Jagielski	next i
1508*b1cdbd2cSJim Jagielski
1509*b1cdbd2cSJim Jagielski	GetMenuWhiteSpace() = whiteSpace
1510*b1cdbd2cSJim Jagielskiend function
1511*b1cdbd2cSJim Jagielski
1512*b1cdbd2cSJim Jagielskifunction IsAllocatedMenuItem( script as string ) as boolean
1513*b1cdbd2cSJim Jagielski	foundMenuItem = false
1514*b1cdbd2cSJim Jagielski	Allocated = false
1515*b1cdbd2cSJim Jagielski	count = 0
1516*b1cdbd2cSJim Jagielski	do
1517*b1cdbd2cSJim Jagielski		count = count + 1
1518*b1cdbd2cSJim Jagielski		if strcomp( script, subMenuItems( count ) ) = 0 then
1519*b1cdbd2cSJim Jagielski			foundMenuItem = true
1520*b1cdbd2cSJim Jagielski		end if
1521*b1cdbd2cSJim Jagielski	loop while not( foundMenuItem ) and count &lt; subMenuCount
1522*b1cdbd2cSJim Jagielski
1523*b1cdbd2cSJim Jagielski	linePosition = subMenuItemLinePosition( count )
1524*b1cdbd2cSJim Jagielski
1525*b1cdbd2cSJim Jagielski	if not( instr( xmlFile( linePosition ), &quot;script://&quot; ) = 0 ) then
1526*b1cdbd2cSJim Jagielski		Allocated = true
1527*b1cdbd2cSJim Jagielski	end if
1528*b1cdbd2cSJim Jagielski
1529*b1cdbd2cSJim Jagielski	isAllocatedMenuItem() = Allocated
1530*b1cdbd2cSJim Jagielskiend Function
1531*b1cdbd2cSJim Jagielski
1532*b1cdbd2cSJim Jagielski
1533*b1cdbd2cSJim Jagielskifunction HasShiftKey( keyCombo ) as boolean
1534*b1cdbd2cSJim Jagielski	if instr( keyCombo, &quot;SHIFT&quot; ) = 0 then
1535*b1cdbd2cSJim Jagielski		hasShift = false
1536*b1cdbd2cSJim Jagielski	else
1537*b1cdbd2cSJim Jagielski		hasShift = true
1538*b1cdbd2cSJim Jagielski	end if
1539*b1cdbd2cSJim Jagielski
1540*b1cdbd2cSJim Jagielski	HasShiftKey = hasShift
1541*b1cdbd2cSJim Jagielskiend function
1542*b1cdbd2cSJim Jagielski
1543*b1cdbd2cSJim Jagielski
1544*b1cdbd2cSJim Jagielskifunction HasControlKey( keyCombo ) as boolean
1545*b1cdbd2cSJim Jagielski	if instr( keyCombo, &quot;CONTROL&quot; ) = 0 then
1546*b1cdbd2cSJim Jagielski		hasControl = false
1547*b1cdbd2cSJim Jagielski	else
1548*b1cdbd2cSJim Jagielski		hasControl = true
1549*b1cdbd2cSJim Jagielski	end if
1550*b1cdbd2cSJim Jagielski
1551*b1cdbd2cSJim Jagielski	HasControlKey = hasControl
1552*b1cdbd2cSJim Jagielskiend function
1553*b1cdbd2cSJim Jagielski
1554*b1cdbd2cSJim Jagielski
1555*b1cdbd2cSJim Jagielskifunction ExtractKeyFromCombo( keyString as string ) as string
1556*b1cdbd2cSJim Jagielski	while not( instr( keyString, &quot;+&quot; ) = 0 )
1557*b1cdbd2cSJim Jagielski		removeTo = instr( keyString, &quot;+ &quot; ) + 2
1558*b1cdbd2cSJim Jagielski		keyString = mid( keyString, removeTo, ( len( keyString ) - removeTo ) + 1 )
1559*b1cdbd2cSJim Jagielski	wend
1560*b1cdbd2cSJim Jagielski	ExtractKeyFromCombo() = keyString
1561*b1cdbd2cSJim Jagielskiend function
1562*b1cdbd2cSJim Jagielski
1563*b1cdbd2cSJim Jagielski
1564*b1cdbd2cSJim Jagielski
1565*b1cdbd2cSJim JagielskiREM ------ Event Handling Functions (Listeners) ------
1566*b1cdbd2cSJim Jagielski
1567*b1cdbd2cSJim Jagielski
1568*b1cdbd2cSJim Jagielskisub KeyListListener()
1569*b1cdbd2cSJim Jagielski	keyShortCutList = bindingDialog.getControl( &quot;KeyList&quot; )
1570*b1cdbd2cSJim Jagielski	selectedShortCut = keyShortCutList.getSelectedItem()
1571*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )
1572*b1cdbd2cSJim Jagielski
1573*b1cdbd2cSJim Jagielski	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1574*b1cdbd2cSJim Jagielski	selectedScript = menuScriptList.getSelectedItem()
1575*b1cdbd2cSJim Jagielski
1576*b1cdbd2cSJim Jagielski	keyGroup = combo.text
1577*b1cdbd2cSJim Jagielski    dim keyGroupIndex as Integer
1578*b1cdbd2cSJim Jagielski    dim selectedKeyIndex as Integer
1579*b1cdbd2cSJim Jagielski	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
1580*b1cdbd2cSJim Jagielski		if ( allKeyGroupsArray( n ) = keyGroup )then
1581*b1cdbd2cSJim Jagielski			keyGroupIndex = n
1582*b1cdbd2cSJim Jagielski			exit for
1583*b1cdbd2cSJim Jagielski		end if
1584*b1cdbd2cSJim Jagielski    next n
1585*b1cdbd2cSJim Jagielski    selectedKeyIndex = keyShortCutList.getSelectedItemPos()
1586*b1cdbd2cSJim Jagielski
1587*b1cdbd2cSJim Jagielski	if  keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value &gt; 1 then
1588*b1cdbd2cSJim Jagielski		bindingDialog.Model.Delete.enabled = true
1589*b1cdbd2cSJim Jagielski		bindingDialog.Model.AddOn.enabled = true
1590*b1cdbd2cSJim Jagielski		if selectedScript &lt;&gt; &quot;&quot; then
1591*b1cdbd2cSJim Jagielski			bindingDialog.Model.NewButton.enabled = true
1592*b1cdbd2cSJim Jagielski		endif
1593*b1cdbd2cSJim Jagielski
1594*b1cdbd2cSJim Jagielski	else
1595*b1cdbd2cSJim Jagielski
1596*b1cdbd2cSJim Jagielski		if keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value  = 1 then
1597*b1cdbd2cSJim Jagielski			bindingDialog.Model.Delete.enabled = false
1598*b1cdbd2cSJim Jagielski			bindingDialog.Model.AddOn.enabled = false
1599*b1cdbd2cSJim Jagielski			bindingDialog.Model.NewButton.enabled = false
1600*b1cdbd2cSJim Jagielski		else
1601*b1cdbd2cSJim Jagielski			bindingDialog.Model.Delete.enabled = false
1602*b1cdbd2cSJim Jagielski			bindingDialog.Model.AddOn.enabled = false
1603*b1cdbd2cSJim Jagielski			if selectedScript &lt;&gt; &quot;&quot; then
1604*b1cdbd2cSJim Jagielski				bindingDialog.Model.NewButton.enabled = true
1605*b1cdbd2cSJim Jagielski			end if
1606*b1cdbd2cSJim Jagielski		end if
1607*b1cdbd2cSJim Jagielski	end if
1608*b1cdbd2cSJim Jagielskiend sub
1609*b1cdbd2cSJim Jagielski
1610*b1cdbd2cSJim Jagielski
1611*b1cdbd2cSJim Jagielskisub SubMenuListListener()
1612*b1cdbd2cSJim Jagielski	scriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1613*b1cdbd2cSJim Jagielski	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
1614*b1cdbd2cSJim Jagielski	selectedMenuItem = subMenuList.getSelectedItem()
1615*b1cdbd2cSJim Jagielski	if IsAllocatedMenuItem( selectedMenuItem ) then
1616*b1cdbd2cSJim Jagielski		bindingDialog.Model.Delete.enabled = true
1617*b1cdbd2cSJim Jagielski		bindingDialog.Model.AddOn.enabled = true
1618*b1cdbd2cSJim Jagielski	else
1619*b1cdbd2cSJim Jagielski		bindingDialog.Model.Delete.enabled = false
1620*b1cdbd2cSJim Jagielski		bindingDialog.Model.AddOn.enabled = false
1621*b1cdbd2cSJim Jagielski	end if
1622*b1cdbd2cSJim Jagielskiend sub
1623*b1cdbd2cSJim Jagielski
1624*b1cdbd2cSJim JagielskiREM a keypress listener that in turn fires the MenuCL on a return key even only
1625*b1cdbd2cSJim Jagielskisub fireMenuComboListernerOnRet( eventobj as object )
1626*b1cdbd2cSJim Jagielski	if (eventobj.KeyCode = 1280 ) then
1627*b1cdbd2cSJim Jagielski		MenuComboListener()
1628*b1cdbd2cSJim Jagielski	endif
1629*b1cdbd2cSJim Jagielskiend sub
1630*b1cdbd2cSJim Jagielski
1631*b1cdbd2cSJim Jagielski&apos;Populates the SubMenuList with the appropriate menu items from the Top-level menu selected from the combo box
1632*b1cdbd2cSJim Jagielskisub MenuComboListener()
1633*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;MenuCombo&quot; )
1634*b1cdbd2cSJim Jagielski	newToplevelMenu = combo.text
1635*b1cdbd2cSJim Jagielski	counter = 0
1636*b1cdbd2cSJim Jagielski	do
1637*b1cdbd2cSJim Jagielski		counter = counter + 1
1638*b1cdbd2cSJim Jagielski	loop while not( newToplevelMenu = menuItems( counter ) )
1639*b1cdbd2cSJim Jagielski
1640*b1cdbd2cSJim Jagielski	PopulateSubMenuList( counter )
1641*b1cdbd2cSJim Jagielskiend sub
1642*b1cdbd2cSJim Jagielski
1643*b1cdbd2cSJim JagielskiREM a keypress listener that in turn fires the LLCL on a return key even only
1644*b1cdbd2cSJim Jagielskisub fireLangLocComboListernerOnRet( eventobj as object )
1645*b1cdbd2cSJim Jagielski	if (eventobj.KeyCode = 1280 ) then
1646*b1cdbd2cSJim Jagielski		LangLocComboListener()
1647*b1cdbd2cSJim Jagielski	endif
1648*b1cdbd2cSJim Jagielskiend sub
1649*b1cdbd2cSJim Jagielski
1650*b1cdbd2cSJim Jagielskisub LangLocComboListener()
1651*b1cdbd2cSJim Jagielski
1652*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
1653*b1cdbd2cSJim Jagielski	language = combo.text
1654*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;LocationCombo&quot; )
1655*b1cdbd2cSJim Jagielski	location = combo.text
1656*b1cdbd2cSJim Jagielski
1657*b1cdbd2cSJim Jagielski	PopulateScriptList( language,location )
1658*b1cdbd2cSJim Jagielski
1659*b1cdbd2cSJim Jagielski    &apos;Enable/disable Assign button
1660*b1cdbd2cSJim Jagielski    scriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1661*b1cdbd2cSJim Jagielski    if not (dialogName = &quot;EditDebug&quot;) then
1662*b1cdbd2cSJim Jagielski        if scriptList.getSelectedItem() = &quot;&quot; then
1663*b1cdbd2cSJim Jagielski            bindingDialog.Model.NewButton.enabled = false
1664*b1cdbd2cSJim Jagielski        end if
1665*b1cdbd2cSJim Jagielski    end if
1666*b1cdbd2cSJim Jagielski
1667*b1cdbd2cSJim Jagielski    if ( location = &quot;Filesystem&quot; ) and ( language &lt;&gt; &quot;Java&quot; ) then
1668*b1cdbd2cSJim Jagielski    	bindingDialog.Model.Browse.enabled = true
1669*b1cdbd2cSJim Jagielski    	if not (dialogName = &quot;EditDebug&quot;) then
1670*b1cdbd2cSJim Jagielski    		bindingDialog.Model.fsonly.enabled = true
1671*b1cdbd2cSJim Jagielski    	end if
1672*b1cdbd2cSJim Jagielski    else
1673*b1cdbd2cSJim Jagielski    	bindingDialog.Model.Browse.enabled = false
1674*b1cdbd2cSJim Jagielski    	if not (dialogName = &quot;EditDebug&quot;) then
1675*b1cdbd2cSJim Jagielski    		bindingDialog.Model.fsonly.enabled = false
1676*b1cdbd2cSJim Jagielski    	end if
1677*b1cdbd2cSJim Jagielski    endif
1678*b1cdbd2cSJim Jagielski
1679*b1cdbd2cSJim Jagielski    &apos; extra dialog dependant processing
1680*b1cdbd2cSJim Jagielski    if dialogName = &quot;Menu&quot; then
1681*b1cdbd2cSJim Jagielski    	&apos; will set New button to false if no text in LableBox
1682*b1cdbd2cSJim Jagielski    	MenuLabelBoxListener()
1683*b1cdbd2cSJim Jagielski    elseif dialogName = &quot;Key&quot; then
1684*b1cdbd2cSJim Jagielski    	&apos; will set Assigne button to false if appropriate
1685*b1cdbd2cSJim Jagielski    	KeyListListener()
1686*b1cdbd2cSJim Jagielski    elseif dialogName = &quot;Event&quot; then
1687*b1cdbd2cSJim Jagielski    	EventListListener()
1688*b1cdbd2cSJim Jagielski    end if
1689*b1cdbd2cSJim Jagielski
1690*b1cdbd2cSJim Jagielskiend sub
1691*b1cdbd2cSJim Jagielski
1692*b1cdbd2cSJim JagielskiREM a keypress listener that in turn fires the KeyCL on a return key even only
1693*b1cdbd2cSJim Jagielskisub fireKeyComboListernerOnRet( eventobj as object )
1694*b1cdbd2cSJim Jagielski	if (eventobj.KeyCode = 1280 ) then
1695*b1cdbd2cSJim Jagielski		KeyComboListener()
1696*b1cdbd2cSJim Jagielski	endif
1697*b1cdbd2cSJim Jagielskiend sub
1698*b1cdbd2cSJim Jagielski
1699*b1cdbd2cSJim Jagielski&apos;Populates the KeyList with the appropriate key combos from the Top-level key group selected from the combo box
1700*b1cdbd2cSJim Jagielskisub KeyComboListener()
1701*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )
1702*b1cdbd2cSJim Jagielski	keyGroup = combo.text
1703*b1cdbd2cSJim Jagielski	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
1704*b1cdbd2cSJim Jagielski		if ( allKeyGroupsArray( n ) = keyGroup )then
1705*b1cdbd2cSJim Jagielski			keyGroupIndex = n
1706*b1cdbd2cSJim Jagielski			exit for
1707*b1cdbd2cSJim Jagielski		end if
1708*b1cdbd2cSJim Jagielski    next n
1709*b1cdbd2cSJim Jagielski	PopulateKeyBindingList( keyGroupIndex )
1710*b1cdbd2cSJim Jagielskiend sub
1711*b1cdbd2cSJim Jagielski
1712*b1cdbd2cSJim Jagielski
1713*b1cdbd2cSJim Jagielskisub MenuLabelBoxListener()
1714*b1cdbd2cSJim Jagielski	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1715*b1cdbd2cSJim Jagielski	selectedScript = menuScriptList.getSelectedItem()
1716*b1cdbd2cSJim Jagielski	&apos;if the SubMenuList is from a dynamically created menu (e.g. Format)
1717*b1cdbd2cSJim Jagielski	&apos;or if the Menu Label text box is empty
1718*b1cdbd2cSJim Jagielski	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
1719*b1cdbd2cSJim Jagielski	firstItem = subMenuList.getItem( 0 )
1720*b1cdbd2cSJim Jagielski	if bindingDialog.Model.MenuLabelBox.text = &quot;&quot; OR firstItem = &quot;Unable to Assign Scripts to this menu&quot; OR  selectedScript = &quot;&quot; then
1721*b1cdbd2cSJim Jagielski		bindingDialog.Model.NewButton.enabled = false
1722*b1cdbd2cSJim Jagielski	else
1723*b1cdbd2cSJim Jagielski		bindingDialog.Model.NewButton.enabled = true
1724*b1cdbd2cSJim Jagielski	end if
1725*b1cdbd2cSJim Jagielskiend sub
1726*b1cdbd2cSJim Jagielski
1727*b1cdbd2cSJim Jagielskisub AppDocEventListener()
1728*b1cdbd2cSJim Jagielski	populateEventList( 0 )
1729*b1cdbd2cSJim Jagielski	EventListListener()
1730*b1cdbd2cSJim Jagielskiend sub
1731*b1cdbd2cSJim Jagielski
1732*b1cdbd2cSJim Jagielski
1733*b1cdbd2cSJim Jagielskisub EventListListener()
1734*b1cdbd2cSJim Jagielski	on error goto ErrorHandler
1735*b1cdbd2cSJim Jagielski
1736*b1cdbd2cSJim Jagielski    eventList = bindingDialog.getControl( &quot;EventList&quot; )
1737*b1cdbd2cSJim Jagielski    eventPos = eventList.getSelectedItemPos()
1738*b1cdbd2cSJim Jagielski
1739*b1cdbd2cSJim Jagielski    allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
1740*b1cdbd2cSJim Jagielski
1741*b1cdbd2cSJim Jagielski	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1742*b1cdbd2cSJim Jagielski	selectedScript = menuScriptList.getSelectedItem()
1743*b1cdbd2cSJim Jagielski
1744*b1cdbd2cSJim Jagielski    dim binding as integer
1745*b1cdbd2cSJim Jagielski    if allApps.state = true then
1746*b1cdbd2cSJim Jagielski    	binding = allEventTypesApp( eventPos ).Value
1747*b1cdbd2cSJim Jagielski    else
1748*b1cdbd2cSJim Jagielski	    binding = allEventTypesDoc( eventPos ).Value
1749*b1cdbd2cSJim Jagielski    endif
1750*b1cdbd2cSJim Jagielski
1751*b1cdbd2cSJim Jagielski    if ( binding &gt; 1 ) then
1752*b1cdbd2cSJim Jagielski       	bindingDialog.Model.Delete.enabled = true
1753*b1cdbd2cSJim Jagielski    else
1754*b1cdbd2cSJim Jagielski       	bindingDialog.Model.Delete.enabled = false
1755*b1cdbd2cSJim Jagielski    end if
1756*b1cdbd2cSJim Jagielski
1757*b1cdbd2cSJim Jagielski	if ( binding = 1 ) then
1758*b1cdbd2cSJim Jagielski		&apos; staroffice binding, can&apos;t assign
1759*b1cdbd2cSJim Jagielski		bindingDialog.Model.NewButton.enabled = false
1760*b1cdbd2cSJim Jagielski	elseif (  selectedScript &lt;&gt; &quot;&quot; ) then
1761*b1cdbd2cSJim Jagielski		bindingDialog.Model.NewButton.enabled = true
1762*b1cdbd2cSJim Jagielski	end if
1763*b1cdbd2cSJim Jagielski    exit sub
1764*b1cdbd2cSJim Jagielski
1765*b1cdbd2cSJim Jagielski    ErrorHandler:
1766*b1cdbd2cSJim Jagielski    reset
1767*b1cdbd2cSJim Jagielski    bindingDialog.Model.Delete.enabled = false
1768*b1cdbd2cSJim Jagielski
1769*b1cdbd2cSJim Jagielskiend sub
1770*b1cdbd2cSJim Jagielski
1771*b1cdbd2cSJim Jagielski
1772*b1cdbd2cSJim JagielskiREM ------ Event Handling Functions (Buttons) ------
1773*b1cdbd2cSJim Jagielski
1774*b1cdbd2cSJim Jagielskifunction getFilePicker() as Object
1775*b1cdbd2cSJim Jagielski    REM file dialog
1776*b1cdbd2cSJim Jagielski    oFilePicker = CreateUnoService( &quot;com.sun.star.ui.dialogs.FilePicker&quot; )
1777*b1cdbd2cSJim Jagielski
1778*b1cdbd2cSJim Jagielski    combo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
1779*b1cdbd2cSJim Jagielski    language = combo.text
1780*b1cdbd2cSJim Jagielski    currentFilter = &quot;&quot;
1781*b1cdbd2cSJim Jagielski
1782*b1cdbd2cSJim Jagielski    for langIndex = 0 to ubound(languages())
1783*b1cdbd2cSJim Jagielski        if( languages(langIndex) &lt;&gt; &quot;Java&quot; ) then
1784*b1cdbd2cSJim Jagielski        	filterName = languages(langIndex) + &quot; (&quot;
1785*b1cdbd2cSJim Jagielski        	filterVal=&quot;&quot;
1786*b1cdbd2cSJim Jagielski        	extns = extensions(langIndex)
1787*b1cdbd2cSJim Jagielski        	for extnIndex = lbound(extns()) to ubound(extns())
1788*b1cdbd2cSJim Jagielski            	filterName = filterName + &quot;*.&quot; + extns(extnIndex) + &quot;,&quot;
1789*b1cdbd2cSJim Jagielski           	 	filterVal = filterVal + &quot;*.&quot; + extns(extnIndex) + &quot;,&quot;
1790*b1cdbd2cSJim Jagielski        	next extnIndex
1791*b1cdbd2cSJim Jagielski        	filterName = left(filterName, len(filterName) -1) + &quot;)&quot;
1792*b1cdbd2cSJim Jagielski        	filterVal = left(filterVal, len(filterVal) -1)
1793*b1cdbd2cSJim Jagielski        	if(instr(filterName,language) = 1 ) then
1794*b1cdbd2cSJim Jagielski            	currentFilter = filterName
1795*b1cdbd2cSJim Jagielski        	end if
1796*b1cdbd2cSJim Jagielski        	oFilePicker.AppendFilter(filterName, filterVal)
1797*b1cdbd2cSJim Jagielski        end if
1798*b1cdbd2cSJim Jagielski    next langIndex
1799*b1cdbd2cSJim Jagielski    if(len(currentFilter) &gt; 0 ) then
1800*b1cdbd2cSJim Jagielski        oFilePicker.SetCurrentFilter( currentFilter )
1801*b1cdbd2cSJim Jagielski    end if
1802*b1cdbd2cSJim Jagielski
1803*b1cdbd2cSJim Jagielski    If sFileURL = &quot;&quot; Then
1804*b1cdbd2cSJim Jagielski        oSettings = CreateUnoService( &quot;com.sun.star.frame.Settings&quot; )
1805*b1cdbd2cSJim Jagielski        oPathSettings = oSettings.getByName( &quot;PathSettings&quot; )
1806*b1cdbd2cSJim Jagielski        sFileURL = oPathSettings.getPropertyValue( &quot;Work&quot; )
1807*b1cdbd2cSJim Jagielski    End If
1808*b1cdbd2cSJim Jagielski
1809*b1cdbd2cSJim Jagielski    REM set display directory
1810*b1cdbd2cSJim Jagielski    oSimpleFileAccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
1811*b1cdbd2cSJim Jagielski
1812*b1cdbd2cSJim Jagielski    If oSimpleFileAccess.exists( sFileURL ) And oSimpleFileAccess.isFolder( sFileURL ) Then
1813*b1cdbd2cSJim Jagielski        oFilePicker.setDisplayDirectory( sFileURL )
1814*b1cdbd2cSJim Jagielski    End If
1815*b1cdbd2cSJim Jagielski    getFilePicker() = oFilePicker
1816*b1cdbd2cSJim Jagielskiend function
1817*b1cdbd2cSJim Jagielski
1818*b1cdbd2cSJim JagielskiSub DoBrowseAndEdit()
1819*b1cdbd2cSJim Jagielski    Dim oFilePicker As Object, oSimpleFileAccess As Object
1820*b1cdbd2cSJim Jagielski    Dim oSettings As Object, oPathSettings As Object
1821*b1cdbd2cSJim Jagielski    Dim sFileURL As String
1822*b1cdbd2cSJim Jagielski    Dim sFiles As Variant
1823*b1cdbd2cSJim Jagielski
1824*b1cdbd2cSJim Jagielski    oFilePicker = getFilePicker()
1825*b1cdbd2cSJim Jagielski    REM execute file dialog
1826*b1cdbd2cSJim Jagielski    If oFilePicker.execute() Then
1827*b1cdbd2cSJim Jagielski        sFiles = oFilePicker.getFiles()
1828*b1cdbd2cSJim Jagielski
1829*b1cdbd2cSJim Jagielski        sFileURL = sFiles(0)
1830*b1cdbd2cSJim Jagielski    	oSimpleFileAccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
1831*b1cdbd2cSJim Jagielski        If oSimpleFileAccess.exists( sFileURL ) Then
1832*b1cdbd2cSJim Jagielski            for langIndex = 0 to ubound(languages())
1833*b1cdbd2cSJim Jagielski                If (instr(oFilePicker.GetCurrentFilter, languages(langIndex)) = 1 ) then
1834*b1cdbd2cSJim Jagielski                	RunDebugger(languages(langIndex), sFileURL, &quot;&quot;)
1835*b1cdbd2cSJim Jagielski            	End If
1836*b1cdbd2cSJim Jagielski            next langIndex
1837*b1cdbd2cSJim Jagielski        End If
1838*b1cdbd2cSJim Jagielski        bindingDialog.endExecute()
1839*b1cdbd2cSJim Jagielski    End If
1840*b1cdbd2cSJim JagielskiEnd Sub
1841*b1cdbd2cSJim Jagielski
1842*b1cdbd2cSJim JagielskiSub RunDebugger(lang as String, uri as String, filename as String)
1843*b1cdbd2cSJim Jagielski    dim document   as object
1844*b1cdbd2cSJim Jagielski    dim dispatcher as object
1845*b1cdbd2cSJim Jagielski    dim parser     as object
1846*b1cdbd2cSJim Jagielski    dim url        as new com.sun.star.util.URL
1847*b1cdbd2cSJim Jagielski
1848*b1cdbd2cSJim Jagielski    document = ThisComponent.CurrentController.Frame
1849*b1cdbd2cSJim Jagielski    parser   = createUnoService(&quot;com.sun.star.util.URLTransformer&quot;)
1850*b1cdbd2cSJim Jagielski    dim args(2) as new com.sun.star.beans.PropertyValue
1851*b1cdbd2cSJim Jagielski    args(0).Name = &quot;language&quot;
1852*b1cdbd2cSJim Jagielski    args(0).Value = lang
1853*b1cdbd2cSJim Jagielski    args(1).Name = &quot;uri&quot;
1854*b1cdbd2cSJim Jagielski    args(1).Value = uri
1855*b1cdbd2cSJim Jagielski    args(2).Name = &quot;filename&quot;
1856*b1cdbd2cSJim Jagielski    args(2).Value = filename
1857*b1cdbd2cSJim Jagielski
1858*b1cdbd2cSJim Jagielski    url.Complete = &quot;script://_$DebugRunner.Debug?&quot; _
1859*b1cdbd2cSJim Jagielski        + &quot;language=Java&amp;function=DebugRunner.go&quot; _
1860*b1cdbd2cSJim Jagielski        + &quot;&amp;location=share&quot;
1861*b1cdbd2cSJim Jagielski
1862*b1cdbd2cSJim Jagielski    parser.parseStrict(url)
1863*b1cdbd2cSJim Jagielski    disp = document.queryDispatch(url,&quot;&quot;,0)
1864*b1cdbd2cSJim Jagielski    disp.dispatch(url, args())
1865*b1cdbd2cSJim JagielskiEnd Sub
1866*b1cdbd2cSJim Jagielski
1867*b1cdbd2cSJim Jagielskisub DoEdit()
1868*b1cdbd2cSJim Jagielski    Dim scriptInfo as Object
1869*b1cdbd2cSJim Jagielski
1870*b1cdbd2cSJim Jagielski    menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1871*b1cdbd2cSJim Jagielski    selectedScript = menuScriptList.getSelectedItem()
1872*b1cdbd2cSJim Jagielski
1873*b1cdbd2cSJim Jagielski    if not (selectedScript = &quot;&quot;) then
1874*b1cdbd2cSJim Jagielski        scripts() = scriptDisplayList(0)
1875*b1cdbd2cSJim Jagielski        for n = LBOUND( scripts() ) to UBOUND( scripts() )
1876*b1cdbd2cSJim Jagielski            if ( scripts( n ).Name = selectedScript ) then
1877*b1cdbd2cSJim Jagielski                scriptInfo = scripts( n ).Value
1878*b1cdbd2cSJim Jagielski                exit for
1879*b1cdbd2cSJim Jagielski            end if
1880*b1cdbd2cSJim Jagielski        next n
1881*b1cdbd2cSJim Jagielski
1882*b1cdbd2cSJim Jagielski        RunDebugger(scriptInfo.getLanguage, scriptInfo.getParcelURI, scriptInfo.getFunctionName)
1883*b1cdbd2cSJim Jagielski        bindingDialog.endExecute()
1884*b1cdbd2cSJim Jagielski    end if
1885*b1cdbd2cSJim Jagielskiend sub
1886*b1cdbd2cSJim Jagielski
1887*b1cdbd2cSJim Jagielskisub MenuOKButton()
1888*b1cdbd2cSJim Jagielski	WriteXMLFromArray()
1889*b1cdbd2cSJim Jagielski	bindingDialog.endExecute()
1890*b1cdbd2cSJim Jagielskiend sub
1891*b1cdbd2cSJim Jagielski
1892*b1cdbd2cSJim Jagielski
1893*b1cdbd2cSJim Jagielskisub MenuCancelButton()
1894*b1cdbd2cSJim Jagielski	bindingDialog.endExecute()
1895*b1cdbd2cSJim Jagielskiend sub
1896*b1cdbd2cSJim Jagielski
1897*b1cdbd2cSJim Jagielski
1898*b1cdbd2cSJim Jagielskisub MenuHelpButton()
1899*b1cdbd2cSJim Jagielski	helpDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;HelpBinding&quot; )
1900*b1cdbd2cSJim Jagielski	helpDialog.execute()
1901*b1cdbd2cSJim Jagielskiend sub
1902*b1cdbd2cSJim Jagielski
1903*b1cdbd2cSJim Jagielski
1904*b1cdbd2cSJim Jagielskisub MenuDeleteButton()
1905*b1cdbd2cSJim Jagielski	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
1906*b1cdbd2cSJim Jagielski	linePos = subMenuItemLinePosition( subMenuList.getSelectedItemPos() + 1 )
1907*b1cdbd2cSJim Jagielski
1908*b1cdbd2cSJim Jagielski	RemoveBinding( linePos )
1909*b1cdbd2cSJim Jagielski
1910*b1cdbd2cSJim Jagielski	REM Update the top-level menu&apos;s line positions
1911*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;MenuCombo&quot; )
1912*b1cdbd2cSJim Jagielski	newToplevelMenu = combo.text
1913*b1cdbd2cSJim Jagielski	counter = 0
1914*b1cdbd2cSJim Jagielski	do
1915*b1cdbd2cSJim Jagielski		counter = counter + 1
1916*b1cdbd2cSJim Jagielski	loop while not( newToplevelMenu = menuItems( counter ) )
1917*b1cdbd2cSJim Jagielski	UpdateTopLevelMenus( counter + 1, false )
1918*b1cdbd2cSJim Jagielski
1919*b1cdbd2cSJim Jagielski	MenuComboListener()
1920*b1cdbd2cSJim Jagielski
1921*b1cdbd2cSJim Jagielski	subMenuList.selectItemPos( subMenuList.getSelectedItemPos(), true )
1922*b1cdbd2cSJim Jagielskiend sub
1923*b1cdbd2cSJim Jagielski
1924*b1cdbd2cSJim Jagielski
1925*b1cdbd2cSJim Jagielskisub MenuNewButton()
1926*b1cdbd2cSJim Jagielski	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
1927*b1cdbd2cSJim Jagielski	selectedScript = menuScriptList.getSelectedItem()
1928*b1cdbd2cSJim Jagielski    scriptURI = getScriptURI( selectedScript )
1929*b1cdbd2cSJim Jagielski	newMenuLabel = bindingDialog.Model.MenuLabelBox.text
1930*b1cdbd2cSJim Jagielski
1931*b1cdbd2cSJim Jagielski	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
1932*b1cdbd2cSJim Jagielski
1933*b1cdbd2cSJim Jagielski	REM Update the top-level menu&apos;s line positions
1934*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;MenuCombo&quot; )
1935*b1cdbd2cSJim Jagielski	newToplevelMenu = combo.text
1936*b1cdbd2cSJim Jagielski	counter = 0
1937*b1cdbd2cSJim Jagielski	do
1938*b1cdbd2cSJim Jagielski		counter = counter + 1
1939*b1cdbd2cSJim Jagielski	loop while not( newToplevelMenu = menuItems( counter ) )
1940*b1cdbd2cSJim Jagielski	UpdateTopLevelMenus( counter + 1, true )
1941*b1cdbd2cSJim Jagielski
1942*b1cdbd2cSJim Jagielski	REM New line position is one ahead of the selected sub menu item
1943*b1cdbd2cSJim Jagielski	linePos = subMenuItemLinePosition( subMenuList.getSelectedItemPos() + 1 ) + 1
1944*b1cdbd2cSJim Jagielski
1945*b1cdbd2cSJim Jagielski	AddNewMenuBinding( scriptURI, newMenuLabel, linePos )
1946*b1cdbd2cSJim Jagielski
1947*b1cdbd2cSJim Jagielski	MenuComboListener()
1948*b1cdbd2cSJim Jagielski	subMenuList.selectItemPos( subMenuList.getSelectedItemPos() + 1, true )
1949*b1cdbd2cSJim Jagielski	SubMenuListListener()
1950*b1cdbd2cSJim Jagielskiend sub
1951*b1cdbd2cSJim Jagielski
1952*b1cdbd2cSJim Jagielskisub BrowseButton()
1953*b1cdbd2cSJim Jagielski	Dim oFilePicker As Object, oSimpleFileAccess As Object
1954*b1cdbd2cSJim Jagielski	Dim oSettings As Object, oPathSettings As Object
1955*b1cdbd2cSJim Jagielski	Dim sFileURL As String
1956*b1cdbd2cSJim Jagielski	Dim sFiles As Variant
1957*b1cdbd2cSJim Jagielski
1958*b1cdbd2cSJim Jagielski	oFilePicker = getFilePicker()
1959*b1cdbd2cSJim Jagielski
1960*b1cdbd2cSJim Jagielski	REM execute file dialog
1961*b1cdbd2cSJim Jagielski	If oFilePicker.execute() Then
1962*b1cdbd2cSJim Jagielski		sFiles = oFilePicker.getFiles()
1963*b1cdbd2cSJim Jagielski		sFileURL = sFiles(0)
1964*b1cdbd2cSJim Jagielski		oSimpleFileAccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
1965*b1cdbd2cSJim Jagielski		If oSimpleFileAccess.exists( sFileURL ) Then
1966*b1cdbd2cSJim Jagielski			REM add sFileURL to the list
1967*b1cdbd2cSJim Jagielski			ReDim preserve filesysScripts(filesysCount) as String
1968*b1cdbd2cSJim Jagielski			filesysScripts( filesysCount ) = sFileURL
1969*b1cdbd2cSJim Jagielski			filesysCount=filesysCount+1
1970*b1cdbd2cSJim Jagielski			&apos; if user changed filter in file picker then populate
1971*b1cdbd2cSJim Jagielski			&apos; language with language associated with that in file picker
1972*b1cdbd2cSJim Jagielski			sFilter = oFilePicker.getCurrentFilter()
1973*b1cdbd2cSJim Jagielski			langCombo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
1974*b1cdbd2cSJim Jagielski			dim items() as String
1975*b1cdbd2cSJim Jagielski			items() = langCombo.getItems()
1976*b1cdbd2cSJim Jagielski			for index = lbound(items()) to ubound(items())
1977*b1cdbd2cSJim Jagielski				iPos = inStr(sFilter,&quot; &quot;)
1978*b1cdbd2cSJim Jagielski				Dim theLanguage as String
1979*b1cdbd2cSJim Jagielski				if( iPos &gt; 0 ) then
1980*b1cdbd2cSJim Jagielski					theLanguage = Left( sFilter, iPos - 1)
1981*b1cdbd2cSJim Jagielski				    if ( theLanguage = items( index ) ) then
1982*b1cdbd2cSJim Jagielski				 		langCombo.text = items( index )
1983*b1cdbd2cSJim Jagielski				 		exit for
1984*b1cdbd2cSJim Jagielski				 	end if
1985*b1cdbd2cSJim Jagielski				end if
1986*b1cdbd2cSJim Jagielski			next index
1987*b1cdbd2cSJim Jagielski		End If
1988*b1cdbd2cSJim Jagielski	End If
1989*b1cdbd2cSJim Jagielski	LangLocComboListener()
1990*b1cdbd2cSJim JagielskiEnd Sub
1991*b1cdbd2cSJim Jagielski
1992*b1cdbd2cSJim Jagielskisub KeyOKButton()
1993*b1cdbd2cSJim Jagielski	WriteXMLFromArray()
1994*b1cdbd2cSJim Jagielski	bindingDialog.endExecute()
1995*b1cdbd2cSJim Jagielskiend sub
1996*b1cdbd2cSJim Jagielski
1997*b1cdbd2cSJim Jagielski
1998*b1cdbd2cSJim Jagielskisub KeyCancelButton()
1999*b1cdbd2cSJim Jagielski	bindingDialog.endExecute()
2000*b1cdbd2cSJim Jagielskiend sub
2001*b1cdbd2cSJim Jagielski
2002*b1cdbd2cSJim Jagielski
2003*b1cdbd2cSJim Jagielskisub KeyHelpButton()
2004*b1cdbd2cSJim Jagielski	helpDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;HelpBinding&quot; )
2005*b1cdbd2cSJim Jagielski	helpDialog.execute()
2006*b1cdbd2cSJim Jagielskiend sub
2007*b1cdbd2cSJim Jagielski
2008*b1cdbd2cSJim Jagielski
2009*b1cdbd2cSJim Jagielskisub KeyNewButton()
2010*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )
2011*b1cdbd2cSJim Jagielski	keyGroup = combo.text
2012*b1cdbd2cSJim Jagielski	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
2013*b1cdbd2cSJim Jagielski		if ( allKeyGroupsArray( n ) = keyGroup )then
2014*b1cdbd2cSJim Jagielski			keyGroupIndex = n
2015*b1cdbd2cSJim Jagielski			exit for
2016*b1cdbd2cSJim Jagielski		end if
2017*b1cdbd2cSJim Jagielski	next n
2018*b1cdbd2cSJim Jagielski	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
2019*b1cdbd2cSJim Jagielski	script = menuScriptList.getSelectedItem()
2020*b1cdbd2cSJim Jagielski	scriptURI = getScriptURI( script )
2021*b1cdbd2cSJim Jagielski
2022*b1cdbd2cSJim Jagielski	keyList = bindingDialog.getControl( &quot;KeyList&quot; )
2023*b1cdbd2cSJim Jagielski	keyIndex = keyList.getSelectedItemPos()
2024*b1cdbd2cSJim Jagielski	ShortCutKeyArray() = KeyBindArrayOfArrays( keyGroupIndex )
2025*b1cdbd2cSJim Jagielski	keyText = ShortCutKeyArray( keyIndex )
2026*b1cdbd2cSJim Jagielski
2027*b1cdbd2cSJim Jagielski	AddNewKeyBinding( scriptURI, HasShiftKey( keyText ), HasControlKey( keyText ), ExtractKeyFromCombo( keyText ) )
2028*b1cdbd2cSJim Jagielski
2029*b1cdbd2cSJim Jagielski	KeyComboListener()
2030*b1cdbd2cSJim Jagielskiend sub
2031*b1cdbd2cSJim Jagielski
2032*b1cdbd2cSJim Jagielski
2033*b1cdbd2cSJim Jagielskisub KeyDeleteButton()
2034*b1cdbd2cSJim Jagielski
2035*b1cdbd2cSJim Jagielski	keyShortCutList = bindingDialog.getControl( &quot;KeyList&quot; )
2036*b1cdbd2cSJim Jagielski	selectedShortCut = keyShortCutList.getSelectedItem()
2037*b1cdbd2cSJim Jagielski	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )
2038*b1cdbd2cSJim Jagielski
2039*b1cdbd2cSJim Jagielski	keyGroup = combo.text
2040*b1cdbd2cSJim Jagielski	dim keyGroupIndex as Integer
2041*b1cdbd2cSJim Jagielski	dim selectedKeyIndex as Integer
2042*b1cdbd2cSJim Jagielski	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
2043*b1cdbd2cSJim Jagielski		if ( allKeyGroupsArray( n ) = keyGroup )then
2044*b1cdbd2cSJim Jagielski			keyGroupIndex = n
2045*b1cdbd2cSJim Jagielski			exit for
2046*b1cdbd2cSJim Jagielski		end if
2047*b1cdbd2cSJim Jagielski	next n
2048*b1cdbd2cSJim Jagielski	selectedKeyIndex = keyShortCutList.getSelectedItemPos()
2049*b1cdbd2cSJim Jagielski	linePosition = keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value
2050*b1cdbd2cSJim Jagielski	keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value = 0
2051*b1cdbd2cSJim Jagielski	keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Name = &quot;&quot;
2052*b1cdbd2cSJim Jagielski	RemoveBinding( linePosition )
2053*b1cdbd2cSJim Jagielski	KeyComboListener()
2054*b1cdbd2cSJim Jagielskiend sub
2055*b1cdbd2cSJim Jagielski
2056*b1cdbd2cSJim Jagielski
2057*b1cdbd2cSJim Jagielskisub EventNewButton()
2058*b1cdbd2cSJim Jagielski	eventScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
2059*b1cdbd2cSJim Jagielski	selectedScript = eventScriptList.getSelectedItem()
2060*b1cdbd2cSJim Jagielski	scriptURI = getScriptURI( selectedScript )
2061*b1cdbd2cSJim Jagielski	eventList = bindingDialog.getControl( &quot;EventList&quot; )
2062*b1cdbd2cSJim Jagielski	eventPosition = eventList.getSelectedItemPos()
2063*b1cdbd2cSJim Jagielski
2064*b1cdbd2cSJim Jagielski	allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
2065*b1cdbd2cSJim Jagielski	dim isApp as boolean
2066*b1cdbd2cSJim Jagielski	if allApps.state = true then &apos;Application
2067*b1cdbd2cSJim Jagielski		isApp = true
2068*b1cdbd2cSJim Jagielski	else &apos;Document
2069*b1cdbd2cSJim Jagielski		isApp = false
2070*b1cdbd2cSJim Jagielski	end if
2071*b1cdbd2cSJim Jagielski	AddNewEventBinding( scriptURI, eventPosition, isApp )
2072*b1cdbd2cSJim Jagielski
2073*b1cdbd2cSJim Jagielski	populateEventList( eventPosition )
2074*b1cdbd2cSJim Jagielski	EventListListener()
2075*b1cdbd2cSJim Jagielskiend sub
2076*b1cdbd2cSJim Jagielski
2077*b1cdbd2cSJim Jagielski
2078*b1cdbd2cSJim Jagielskisub EventDeleteButton()
2079*b1cdbd2cSJim Jagielski	eventList = bindingDialog.getControl( &quot;EventList&quot; )
2080*b1cdbd2cSJim Jagielski	REM Check that combo is a script
2081*b1cdbd2cSJim Jagielski	eventPosition = eventList.getSelectedItemPos()
2082*b1cdbd2cSJim Jagielski
2083*b1cdbd2cSJim Jagielski	allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
2084*b1cdbd2cSJim Jagielski	if allApps.state = true then &apos;Application
2085*b1cdbd2cSJim Jagielski		linePosition = allEventTypesApp( eventPosition ).Value
2086*b1cdbd2cSJim Jagielski		&apos;dim eventProp as new com.sun.star.beans.PropertyValue
2087*b1cdbd2cSJim Jagielski		&apos;eventProp.Name = &quot;&quot;
2088*b1cdbd2cSJim Jagielski		&apos;eventProp.Value = 0
2089*b1cdbd2cSJim Jagielski		allEventTypesApp( eventPosition ).Name = &quot;&quot;
2090*b1cdbd2cSJim Jagielski		allEventTypesApp( eventPosition ).Value = 0
2091*b1cdbd2cSJim Jagielski		RemoveBinding( linePosition )
2092*b1cdbd2cSJim Jagielski	else &apos;Document
2093*b1cdbd2cSJim Jagielski		&apos;DeleteEvent( allEventTypes( eventPosition ) )
2094*b1cdbd2cSJim Jagielski		allEventTypesDoc( eventPosition ).Name = &quot;&quot;
2095*b1cdbd2cSJim Jagielski		allEventTypesDoc( eventPosition ).Value = 0
2096*b1cdbd2cSJim Jagielski	end if
2097*b1cdbd2cSJim Jagielski
2098*b1cdbd2cSJim Jagielski	PopulateEventList( eventPosition )
2099*b1cdbd2cSJim Jagielski	EventListListener()
2100*b1cdbd2cSJim Jagielskiend sub
2101*b1cdbd2cSJim Jagielski
2102*b1cdbd2cSJim Jagielski
2103*b1cdbd2cSJim Jagielskisub EventOKButton
2104*b1cdbd2cSJim Jagielski	WriteEventsToDoc()
2105*b1cdbd2cSJim Jagielski	WriteXMLFromArray()
2106*b1cdbd2cSJim Jagielski	bindingDialog.endExecute()
2107*b1cdbd2cSJim Jagielskiend sub
2108*b1cdbd2cSJim Jagielski
2109*b1cdbd2cSJim Jagielski
2110*b1cdbd2cSJim Jagielskisub HelpOKButton()
2111*b1cdbd2cSJim Jagielski	helpDialog.endExecute()
2112*b1cdbd2cSJim Jagielskiend sub
2113*b1cdbd2cSJim Jagielski</script:module>
2114