<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<!--***********************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 ***********************************************************-->
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ScriptBinding" script:language="StarBasic">REM  *****  BASIC  *****

REM ----- Global Variables -----

&apos;bindingDialog can refer to either KeyBinding or MenuBinding dialog
private languages() as String
private extensions() as Object
private locations() as String
private filesysScripts() as String
private filesysCount as integer
private bindingDialog as object
private helpDialog as object
&apos;Couldn&apos;t get redim to work, so scriptDisplayList is and array of arrays
&apos;where the one and only array in scriptDisplayList is an array
&apos;of com.sun.star.beans.PropertyValue, where Name = [logicalName][FunctionName]
&apos;and value is ScriptStorage object
private scriptDisplayList(0)
private testArray() as String
&apos;Array to store lines from the xml file
private xmlFile() as string
&apos;Name of the xml file [writer/calc][menubar/keybindings].xml
private xmlFileName as string
&apos;Number of lines in the xml file
private numberOfLines as integer

&apos;Parallel arrays to store all top-level menu names and line positions
private menuItems() as string
private menuItemLinePosition() as integer
&apos;Counter for the number of top-level menus
private menuCount as integer

&apos;Parallel arrays to store all sub-menu names and line positions for a particular top-level menu
private subMenuItems() as string
private subMenuItemLinePosition() as integer
&apos;Counter for the number of sub-menus
private subMenuCount as integer

&apos;Parallel arrays to store all script names and line positions
private scriptNames() as string
private scriptLinePosition() as integer
&apos;Counter for the number of scripts
private scriptCount as integer

&apos;Array to store all combinations of key bindings
private allKeyBindings() as string

&apos;Array of Arrays
&apos;KeyBindArrayOfArrays(0)  contains array of &quot;SHIFT + CONTROL + F Keys&quot; data
&apos;Similarly
&apos;KeyBindArrayOfArrays(1) contains SHIFT + CONTROL + digits
&apos;KeyBindArrayOfArrays(2) contains SHIFT + CONTROL + letters
&apos;KeyBindArrayOfArrays(3) contains CONTROL + F keys
&apos;KeyBindArrayOfArrays(4) contains CONTROL + digits
&apos;KeyBindArrayOfArrays(5) contains CONTROL + letters
&apos;KeyBindArrayOfArrays(6) contains SHIFT + F keys
private KeyBindArrayOfArrays(6)

&apos;Each PropertyValue represents a key, Name member contains the script (if a binding exists)
&apos; the Value contains and integer
&apos;       0  means no script bound
&apos;       1  script is bound to an office function
&apos;       &gt;1 line number of entry in xmlfile array
private keyAllocationMap(6,25) as new com.sun.star.beans.PropertyValue
&apos;array to store key group descriptions
private AllKeyGroupsArray(6) as String


&apos;Array of props to store all event bindings for the Applications
private	allEventTypesApp( 14 ) as new com.sun.star.beans.PropertyValue
&apos;Array of props to store all event bindings for the Document
private	allEventTypesDoc( 14 ) as new com.sun.star.beans.PropertyValue
&apos;Array of props to store all event types (Name) and textual description (Value)
private allEventTypes( 14 ) as new com.sun.star.beans.PropertyValue


private dialogName as String
REM ------ Storage Refresh Function ------


sub RefreshUserScripts()
&apos; TDB - change Menu bindings to allow user to refresh all, user, share or document script
   RefreshAppScripts( &quot;USER&quot; )
end sub

sub RefreshAllScripts()
   RefreshAppScripts( &quot;USER&quot; )
   RefreshAppScripts( &quot;SHARE&quot; )
   RefreshDocumentScripts
end sub

sub RefreshAppScripts( appName as String )
   On Error Goto ErrorHandler
   smgr = getProcessServiceManager()
   context = smgr.getPropertyValue( &quot;DefaultContext&quot; )
   scriptstoragemgr = context.getValueByName( &quot;/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager&quot; )

   scriptstoragemgr.refreshScriptStorage( appName )

   Exit sub

   ErrorHandler:
   reset
   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; )

end sub

sub RefreshDocumentScripts()
   On Error Goto ErrorHandler
   smgr = getProcessServiceManager()
   context = smgr.getPropertyValue( &quot;DefaultContext&quot; )
   scriptstoragemgr = context.getValueByName( &quot;/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager&quot; )

   oDocURL = ThisComponent.GetCurrentController.getModel.getURL

   On Error Goto ErrorHandlerDoc
   scriptstoragemgr.refreshScriptStorage( oDocURL )

   Exit sub

   ErrorHandlerDoc:
   reset
   &apos; Ignore document script errors as it will happen when refreshing an unsaved doc
   Exit sub

   ErrorHandler:
   reset
   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; )

end sub


REM ----- Launch Functions -----

Sub createAndPopulateKeyArrays()
	&apos;Create SHIFT + CONTROL + F keys array
	&apos;Dim keyGroupProp as new com.sun.star.beans.PropertyValue

	Dim SCFKey( 11 )
	for FKey = 1 to 12
		SCFKey( FKey - 1 ) = &quot;SHIFT + CONTROL + F&quot; + FKey
	next FKey

	KeyBindArrayOfArrays(0) = SCFKey()

	&apos;Create SHIFT + CONTROL + digits
	Dim SCDKey( 9 )
	for Digit = 0 to 9
		SCDKey( Digit ) = &quot;SHIFT + CONTROL + &quot; + Digit
	next Digit
	KeyBindArrayOfArrays(1) = SCDKey()

	&apos;Create SHIFT + CONTROL + letters

	Dim SCLKey( 25 )
	for Alpha = 65 to 90
		SCLKey( Alpha - 65 ) = &quot;SHIFT + CONTROL + &quot; + chr$( Alpha )
	next Alpha
	KeyBindArrayOfArrays(2) = SCLKey()

	&apos;Create CONTROL + F keys
	Dim CFKey( 11 )
	for FKey = 1 to 12
		CFKey( Fkey - 1 ) = &quot;CONTROL + F&quot; + FKey
	next FKey
	KeyBindArrayOfArrays(3) = CFKey()

	&apos;Create CONTROL + digits
	Dim CDKey( 9 )
	for Digit = 0 to 9
		CDKey( Digit ) = &quot;CONTROL + &quot; + Digit
	next Digit
	KeyBindArrayOfArrays(4) = CDKey()

	&apos;Create CONTROL + letters
	Dim CLKey( 25 )
	for Alpha = 65 to 90
		CLKey( Alpha - 65 ) = &quot;CONTROL + &quot; + chr$( Alpha )
	next Alpha
	KeyBindArrayOfArrays(5) = CLKey()

	&apos;Create SHIFT + F Keys
	Dim SFKey( 11 )
	for FKey = 1 to 12
		SFKey( Fkey - 1 ) = &quot;SHIFT + F&quot; + FKey
	next FKey
	KeyBindArrayOfArrays(6) = SFKey()

End Sub

Sub updateMapWithDisabledKeys()
	&apos;disable CONTROL + F1 &amp;
	keyAllocationMap( 3, 0 ).Value = 1
	keyAllocationMap( 3, 0 ).Name = &quot;&quot;
	&apos;disable CONTROL + F4 &amp;
	keyAllocationMap( 3, 3 ).Value = 1
	keyAllocationMap( 3, 3 ).Name = &quot;&quot;
	&apos;disable CONTROL + F6
	keyAllocationMap( 3, 5 ).Value = 1
	keyAllocationMap( 3, 5 ).Name = &quot;&quot;


	&apos;disable SHIFT + F1 &amp;
	keyAllocationMap( 6, 0 ).Value = 1
	keyAllocationMap( 6, 0 ).Name = &quot;&quot;
	&apos;disable SHIFT + F2 &amp;
	keyAllocationMap( 6, 1 ).Value = 1
	keyAllocationMap( 6, 1 ).Name = &quot;&quot;
	&apos;disable SHIFT + F6 &amp;
	keyAllocationMap( 6, 5 ).Value = 1
	keyAllocationMap( 6, 5 ).Name = &quot;&quot;

End Sub

Sub initialiseFileExtensions()
	ReDim extensions(ubound(languages())+1) as Object
	oConfigProvider = CreateUnoService( &quot;com.sun.star.configuration.ConfigurationProvider&quot; )
    Dim configArgs(1) as new com.sun.star.beans.PropertyValue
    configargs(0).Name = &quot;nodepath&quot;
    configArgs(0).Value = &quot;org.openoffice.Office.Scripting/ScriptRuntimes&quot;
    configargs(1).Name = &quot;lazywrite&quot;
    configArgs(1).Value = false
    oConfigAccess = oConfigProvider.createInstanceWithArguments(&quot;com.sun.star.configuration.ConfigurationAccess&quot;, configArgs())
    for index = 0 to ubound(languages())
    		if(languages(index) &lt;&gt; &quot;Java&quot;) then
            	xPropSet = oConfigAccess.getByName(languages(index))
            	extns() = xPropSet.getPropertyValue(&quot;SupportedFileExtensions&quot;)
            	extensions(index) = extns()
            endif
    next index
end sub

Sub ExecuteEditDebug()

	locations = Array ( &quot;User&quot;, &quot;Share&quot;, &quot;Document&quot;, &quot;Filesystem&quot; )
	languages = Array ( &quot;BeanShell&quot;, &quot;JavaScript&quot; )
	dialogName = &quot;EditDebug&quot;
	initialiseFileExtensions()
	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;EditDebug&quot; )

	PopulateLanguageCombo()
	PopulateLocationCombo()
	PopulateScriptList( languages(0), locations(0) )

	bindingDialog.execute()
End Sub

Sub ExecuteKeyBinding()
	dialogName = &quot;Key&quot;
    createAndPopulateKeyArrays()
    updateMapWithDisabledKeys()
	xmlFileName = GetDocumentType( &quot;Key&quot; )

	if not (ReadXMLToArray( &quot;Key&quot; )) then
		Exit Sub
	endif

	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;KeyBinding&quot; )
	PopulateKeyBindingList(0)
	initialiseNavigationComboArrays()
    PopulateLanguageCombo()
    PopulateLocationCombo()
	PopulateScriptList( languages(0), locations(0) )
	PopulateTopLevelKeyBindingList()
	bindingDialog.execute()
end Sub


Sub initialiseNavigationComboArrays()
    locations = Array ( &quot;User&quot;, &quot;Share&quot;, &quot;Document&quot;, &quot;Filesystem&quot; )
    ReDim languages(0) as String
    ReDim extensions(0) as Object
	languages(0) = &quot;Java&quot;
	REM extensions(0) = &quot;&quot;

    &apos; Setup languages array for all supported languages
    oServiceManager = GetProcessServiceManager()
    svrArray = oServiceManager.getAvailableServiceNames

    langCount = 1
    for index = 0 to ubound(svrArray)
        iPos = inStr(svrArray(index), &quot;ScriptProviderFor&quot;)

        if (iPos &gt; 0) then
            lang = Mid(svrArray(index), iPos + Len(&quot;ScriptProviderFor&quot;)

            if not (lang = &quot;Java&quot;) then
                &apos;Add to language vector
                ReDim Preserve languages(langCount) as String
                languages(langCount) = lang
                langCount = langCount + 1
            endif
        endif
    next index
    initialiseFileExtensions()
End Sub


Sub ExecuteEventBinding
	dialogName = &quot;Event&quot;
	createAllEventTypes()
	createAllEventBindings()

	&apos;Populate application event bindings array (from config xml file)
	if not (ReadXMLToArray( &quot;Event&quot; )) then
		Exit Sub
	endif
	&apos;Populate document event bindings array (using Office API calls)
	ReadEventsFromDoc()

	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;EventsBinding&quot; )
	initialiseNavigationComboArrays()
    PopulateLanguageCombo()
    PopulateLocationCombo()
	PopulateScriptList( languages(0), locations(0) )
	populateEventList( 0 )
	EventListListener()
	bindingDialog.execute()
End Sub

Sub ExecuteMenuBinding()
	dialogName = &quot;Menu&quot;
	xmlFileName = GetDocumentType( &quot;Menu&quot; )
	if not (ReadXMLToArray( &quot;Menu&quot; )) then
		Exit Sub
	endif

	bindingDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;MenuBinding&quot; )
	initialiseNavigationComboArrays()
    PopulateLanguageCombo()
    PopulateLocationCombo()
	PopulateScriptList( languages(0), locations(0) )
	PopulateMenuCombo()
	PopulateSubMenuList( 1 )

	subMenuList = bindingDialog.getControl(&quot;SubMenuList&quot;)

	subMenuList.selectItemPos( 0, true )

	bindingDialog.execute()
end Sub


REM ----- Initialising functions -----


function LoadDialog( libName as string, dialogName as string ) as object
	dim library as object
	dim libDialog as object
	dim runtimeDialog as object
	libContainer = DialogLibraries
	libContainer.LoadLibrary( libName )
	library = libContainer.getByName( libname )
	libDialog = library.getByName( dialogName )
	runtimeDialog = CreateUnoDialog( libDialog )
	LoadDialog() = runtimeDialog

end function


function GetDocumentType( bindingType as string ) as string
	document = StarDesktop.ActiveFrame.Controller.Model
	Dim errornumber As Integer
	errornumber = 111
	Error errornumber
	if document.SupportsService(&quot;com.sun.star.sheet.SpreadsheetDocument&quot;) then
		if bindingType = &quot;Key&quot; then
			GetDocumentType() = &quot;calckeybinding.xml&quot;
		else
			if bindingType = &quot;Menu&quot; then
				GetDocumentType() = &quot;calcmenubar.xml&quot;
			end if
		end if
	elseif document.SupportsService(&quot;com.sun.star.text.TextDocument&quot;) then
		if bindingType = &quot;Key&quot; then
			GetDocumentType() = &quot;writerkeybinding.xml&quot;
		else
			if bindingType = &quot;Menu&quot; then
				GetDocumentType() = &quot;writermenubar.xml&quot;
			end if
		end if
	elseif document.SupportsService(&quot;com.sun.star.presentation.PresentationDocument&quot;) then
		if bindingType = &quot;Key&quot; then
			GetDocumentType() = &quot;impresskeybinding.xml&quot;
		else
			if bindingType = &quot;Menu&quot; then
				GetDocumentType() = &quot;impressmenubar.xml&quot;
			end if
		end if
	elseif document.SupportsService(&quot;com.sun.star.presentation.PresentationDocument&quot;) then
		if bindingType = &quot;Key&quot; then
			GetDocumentType() = &quot;impresskeybinding.xml&quot;
		else
			if bindingType = &quot;Menu&quot; then
				GetDocumentType() = &quot;impressmenubar.xml&quot;
			end if
		end if
	elseif document.SupportsService(&quot;com.sun.star.drawing.DrawingDocument&quot;) then
		if bindingType = &quot;Key&quot; then
			GetDocumentType() = &quot;drawkeybinding.xml&quot;
		else
			if bindingType = &quot;Menu&quot; then
				GetDocumentType() = &quot;drawmenubar.xml&quot;
			end if
		end if
	else
		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; )
	end if
end function

function lastIndexOf( targetStr as String, substr as String ) as Integer
	copyStr = targetStr
	while instr(copyStr, substr) &gt; 0
		pos = instr(copyStr, substr)
		tpos = tpos + pos
		copyStr = mid(copyStr, pos+1, len(copyStr)-pos )
	wend
	lastIndexOf() = tpos
end function

function getScriptURI( selectedScript as String ) as String
	combo = bindingDialog.getControl( &quot;LocationCombo&quot; )
	location = combo.text
	if ( location = &quot;User&quot; ) then
		location = &quot;user&quot;
	elseif ( location = &quot;Share&quot; ) then
		location = &quot;share&quot;
	elseif ( location = &quot;Filesystem&quot; ) then
		location = &quot;filesystem&quot;
	else
		location = &quot;document&quot;
	end if



	if ( location = &quot;filesystem&quot; ) then
		REM need to build URI here - dcf
		combo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
		language = combo.text
		url = selectedscript
		pos = lastIndexOf( url, &quot;/&quot; )
		locationPath =  mid( url, 1, pos)
        url = mid( url, pos+1, len( url ) - pos )
		functionName = url
		pos = lastIndexOf( url, &quot;.&quot; )
		logicalName = mid( url, 1, pos - 1 )
		getScriptURI() = &quot;script://&quot; + logicalName + &quot;?language=&quot; _
			+ language + &quot;&amp;amp;function=&quot; + functionName _
			+ &quot;&amp;amp;location=filesystem:&quot; + locationPath
	else
		Dim scriptInfo as Object
		scripts() = scriptDisplayList(0)
		for n = LBOUND( scripts() ) to UBOUND( scripts() )

			if ( scripts( n ).Name = selectedScript ) then
				scriptInfo = scripts( n ).Value
				exit for
			end if
		next n
		getScriptURI() = &quot;script://&quot; + scriptInfo.getLogicalName + &quot;?language=&quot; _
			+ scriptInfo.getLanguage() + &quot;&amp;amp;function=&quot; + _
			scriptInfo.getFunctionName() + &quot;&amp;amp;location=&quot; + location
	end if

end function

function GetOfficePath() as string
	REM Error check and prompt user to manually input Office Path
	settings =  CreateUnoService( &quot;com.sun.star.frame.Settings&quot; )
	path = settings.getByName( &quot;PathSettings&quot; )
	unformattedOfficePath = path.getPropertyValue( &quot;UserPath&quot; )

	dim officePath as string
	const removeFromEnd = &quot;/user&quot;
	const removeFromEndWindows = &quot;\user&quot;

	REM If Solaris or Linux
	if not ( instr( unformattedOfficePath, removeFromEnd ) = 0 ) then
		endPosition = instr( unformattedOfficePath, removeFromEnd )
		officePath = mid( unformattedOfficePath, 1, endPosition )
	REM If Windows
	else if not ( instr( unformattedOfficePath, removeFromEndWindows ) = 0 ) then
			endPosition = instr( unformattedOfficePath, removeFromEndWindows )
			officePath = mid( unformattedOfficePath, 1, endPosition )
			while instr( officePath, &quot;\&quot; ) &gt; 0
				backSlash = instr( officePath, &quot;\&quot; )
				startPath = mid( officePath, 1, backSlash - 1 )
				endPath = mid( officePath, backslash + 1, len( officePath ) - backSlash )
				officePath = startPath + &quot;/&quot; + endPath
			wend
		else
			MsgBox (&quot;Error: Office path not found&quot; + chr$(10) + chr$(10) + &quot;Action: Please reinstall Scripting Framework&quot;,0,&quot;Error&quot; )
			REM Prompt user
		end if
	end if

	GetOfficePath() = officePath
end function



REM ----- File I/O functions -----


function ReadXMLToArray( bindingType as string ) as boolean
	On Error Goto ErrorHandler
	if ( bindingType = &quot;Event&quot; ) then
		xmlfilename = &quot;eventbindings.xml&quot;
	endif

	simplefileaccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
	filestream = simplefileaccess.openFileRead( &quot;file://&quot; + GetOfficePath() + &quot;user/config/soffice.cfg/&quot; + xmlFileName )

    textin = CreateUnoService( &quot;com.sun.star.io.TextInputStream&quot; )
    textin.setInputStream( filestream )

    redim xmlFile( 400 ) as String
    redim menuItems( 30 ) as String
    redim menuItemLinePosition( 30 ) as Integer
    redim scriptNames( 120 ) as string
    redim scriptLinePosition( 120) as integer

    lineCount = 1
    menuCount = 1
    scriptCount = 1

    do while not textin.isEOF()
    	xmlline = textin.readLine()
    	xmlFile( lineCount ) = xmlline

 		const menuItemWhiteSpace = 2
 		const menuXMLTag = &quot;&lt;menu:menu&quot;

		if bindingType = &quot;Menu&quot; then
			evaluateForMenu( xmlline, lineCount )
		elseif bindingType = &quot;Key&quot; then
			processKeyXMLLine( lineCount, xmlline )
		elseif bindingType = &quot;Event&quot; then
			evaluateForEvent( xmlline, lineCount )
		else
			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; )
		end if
        lineCount = lineCount + 1
    loop

	&apos;Set global variable numberOfLines (lineCount is one too many at end of the loop)
	numberOfLines = lineCount - 1
	&apos;Set global variable menuCount (it is one too many at end of the loop)
	menuCount = menuCount - 1

    filestream.closeInput()
    ReadXMLToArray( ) = true
	Exit function

	ErrorHandler:
	reset
	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; )
    ReadXMLToArray( ) = false
end function



sub evaluateForMenu( xmlline as string, lineCount as integer )
	const menuItemWhiteSpace = 2
 	const menuXMLTag = &quot;&lt;menu:menu&quot;
	&apos;If the xml line is a top-level menu
	if instr( xmlline, menuXMLTag ) = menuItemWhiteSpace then
		menuLabel = ExtractLabelFromXMLLine( xmlline )
		menuItems( menuCount ) = menuLabel
		menuItemLinePosition( menuCount ) = lineCount
		menuCount = menuCount + 1
	end if
end sub

sub evaluateForEvent( xmlline as string, lineCount as integer )
	dim eventName as String
	&apos;if the xml line identifies a script or SB macro
	dim scriptName as string
	dim lineNumber as integer
	if instr( xmlline, &quot;event:language=&quot; + chr$(34) + &quot;Script&quot; ) &gt; 0 then
		eventName = ExtractEventNameFromXMLLine( xmlline )
		scriptName = ExtractEventScriptFromXMLLine( xmlline )
		lineNumber = lineCount
	elseif instr( xmlline, &quot;event:language=&quot; + chr$(34) + &quot;StarBasic&quot; ) &gt; 0 then
		eventName = ExtractEventNameFromXMLLine( xmlline )
		scriptName = &quot;Allocated to Office function&quot;
		lineNumber = 1
	end if

	&apos;Need to sequence to find the corresponding index for the event type
	for n = 0 to ubound( allEventTypesApp() )
		if ( eventName = allEventTypes( n ).Name ) then
			allEventTypesApp( n ).Name = scriptName
			allEventTypesApp( n ).Value = lineNumber
		end if
	next n
end sub


function isOKscriptProps( props() as Object, eventName as string ) as Boolean
	On Error Goto ErrorHandler
	props  = ThisComponent.getEvents().getByName( eventName )
	test = ubound( props() )
	isOKscriptProps() = true
	exit function

	ErrorHandler:
	isOKscriptProps() = false
end function

sub ReadEventsFromDoc()
	On Error Goto ErrorHandler

	eventSupplier = ThisComponent
	for n = 0 to ubound( allEventTypes() )
		Dim scriptProps() as Object
		if (isOKscriptProps( scriptProps(), allEventTypes( n ).Name) ) then
			if ( ubound( scriptProps ) &gt; 0 ) then
				if ( scriptProps(0).Value = &quot;Script&quot; ) then
					&apos;Script binding
					allEventTypesDoc(n).Name = scriptProps(1).Value
					allEventTypesDoc(n).value = 2
				elseif( scriptProps(0).Value = &quot;StarBasic&quot; ) then
					&apos;StarBasic macro
					allEventTypesDoc(n).Name = &quot;Allocated to Office function&quot;
					allEventTypesDoc(n).value = 1
				end if
			end if
		end if
	next n

	exit sub

	&apos; eventProps is undefined if there are no event bindings in the doc
	ErrorHandler:
	reset
end sub


sub WriteEventsToDoc()
	On Error Goto ErrorHandler

	eventSupplier = ThisComponent
	for n = 0 to ubound( allEventTypes() )
		scriptName = allEventTypesDoc( n ).Name
		eventName = allEventTypes( n ).Name
		if( allEventTypesDoc( n ).Value &gt; 1 ) then &apos;script
			&apos;add to doc
			AddEventToDocViaAPI( scriptName, eventName )
		elseif( allEventTypesDoc( n ).Value = 0 ) then &apos;blank (this will &quot;remove&quot; already blank entries)
			&apos;remove from doc
			RemoveEventFromDocViaAPI( eventName )
		endif
		&apos;Otherwise it is a StarBasic binding - leave alone
	next n
	&apos;Mark document as modified ( should happen automatically as a result of calling the API )
	ThisComponent.CurrentController.getModel().setModified( True )
	exit sub

	ErrorHandler:
	reset
	msgbox( &quot;Error calling UNO API for writing event bindings to the document&quot; )
end sub


sub RemoveEventFromDocViaAPI( event as string )
	dim document   as object
	dim dispatcher as object
	dim parser     as object
	dim url        as new com.sun.star.util.URL

	document = ThisComponent.CurrentController.Frame
	parser   = createUnoService(&quot;com.sun.star.util.URLTransformer&quot;)
	dim args(0) as new com.sun.star.beans.PropertyValue
	args(0).Name = &quot;&quot;
	args(0).Value = event

	url.Complete = &quot;script://_$ScriptFrmwrkHelper.removeEvent?&quot; _
					+ &quot;language=Java&amp;function=ScriptFrmwrkHelper.removeEvent&quot; _
					+ &quot;&amp;location=share&quot;

	parser.parseStrict(url)
	disp = document.queryDispatch(url,&quot;&quot;,0)
	disp.dispatch(url,args())
end sub


sub AddEventToDocViaAPI( scriptName as string, eventName as string )
	dim properties( 1 ) as new com.sun.star.beans.PropertyValue
	properties( 0 ).Name = &quot;EventType&quot;
	properties( 0 ).Value = &quot;Script&quot;
	properties( 1 ).Name = &quot;Script&quot;
	properties( 1 ).Value = scriptName

	eventSupplier = ThisComponent
	nameReplace = eventSupplier.getEvents()
	nameReplace.replaceByName( eventName, properties() )
end sub


&apos; returns 0 for Fkey
&apos;         1 for digit
&apos;         2 for letter

function getKeyTypeOffset( key as String ) as integer
	length = Len( key )
	if ( length &gt; 1 ) then
 		getKeyTypeOffset() = 0

	elseif  ( key &gt;= &quot;0&quot; AND key &lt;= &quot;9&quot; )  then
 		getKeyTypeOffset() = 1
	else
 		getKeyTypeOffset() = 2
 	end if
end function

function getKeyGroupIndex( key as String, offset as Integer ) as Integer
    &apos; Keys we are interested in are A - Z, F2 - F12, 0 - 9 anything else should
    &apos; ensure -1 is returned
	cutKey = mid( key,2 )

	if ( cutKey &lt;&gt; &quot;&quot; ) then
		acode = asc ( mid( cutKey,1,1) )
        if ( acode &gt; 57 ) then
			getKeyGroupIndex() = -1
			exit function
		end if
	end if

	select case offset
	case 0:
			num = cint( cutKey )
			getKeyGroupIndex() = num - 1
			exit function
	case 1:
			num = asc( key ) - 48
			getKeyGroupIndex() = num
			exit function
	case 2:
			num = asc( key ) - 65
			getKeyGroupIndex() = num
			exit function
	end select
	getKeyGroupIndex() = -1
end function

Sub processKeyXMLLine( lineCount as Integer, xmlline as String )

	if instr( xmlline, &quot;&lt;accel:item&quot; ) &gt; 0 then
		shift = false
		control = false
		if instr( xmlline, &quot;accel:shift=&quot;+chr$(34)+&quot;true&quot;+chr$(34) ) &gt; 0 then
			shift = true
		end if
		if instr( xmlFile( lineCount ), &quot;accel:mod1=&quot;+chr$(34)+&quot;true&quot;+chr$(34) ) &gt; 0 then
			control = true
		end if
		offsetIntoArrayOfArrays = -1 &apos;default unknown
		if ( control AND shift ) then
			offsetIntoArrayOfArrays = 0
		elseif ( control ) then
			offsetIntoArrayOfArrays = 3
		elseif ( shift ) then
			offsetIntoArrayOfArrays = 6
		endif
		&apos; Calculate which of the 7 key group arrays we need to point to
		key = ExtractKeyCodeFromXMLLine( xmlline )
		keyTypeOffset = getKeyTypeOffset( key  )
		offsetIntoArrayOfArrays = offsetIntoArrayOfArrays + keyTypeOffset

		&apos; Calculate from the key the offset into key group array we need to point to
		KeyGroupIndex = getKeyGroupIndex( key, keyTypeOffset )
		if ( offsetIntoArrayOfArrays = -1 ) then
			&apos;Unknown key group, no processing necessary
			Exit Sub
		end if
		if ( KeyGroupIndex &gt; -1 ) then

			&apos; Determine if a script framework binding is present or not
			if  instr( xmlline, &quot;script://&quot; ) &gt; 0 then
				&apos; its one of ours so update its details
				scriptName = ExtractScriptIdFromXMLLine( xmlline )

				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value = lineCount
				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
			else
				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value = 1
				keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = &quot;&quot;

			end if
		end if
	end if
End Sub

Sub WriteXMLFromArray()
	On Error Goto ErrorHandler
	cfgFile =  GetOfficePath() + &quot;user/config/soffice.cfg/&quot; + xmlFileName
	updateCfgFile( cfgFile )
	&apos;if ( false ) then&apos; config stuff not in build yet
	if ( true ) then
		updateConfig( xmlFileName )
	else
		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; )
	endif
	Exit Sub

	ErrorHandler:
	reset
	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; )
end Sub


Sub UpdateCfgFile ( fileName as String )
	dim ScriptProvider as Object
	dim Script as Object
	dim args(1)
	dim displayDialogFlag as boolean
	displayDialogFlag = false
	args(0) = ThisComponent
	args(1) = displayDialogFlag

	ScriptProvider = createUnoService(&quot;drafts.com.sun.star.script.framework.provider.MasterScriptProvider&quot;)
	ScriptProvider.initialize( args() )
	Script = ScriptProvider.getScript(&quot;script://_$ScriptFrmwrkHelper.updateCfgFile?&quot; _
		+ &quot;language=Java&amp;function=ScriptFrmwrkHelper.updateCfgFile&amp;location=share&quot;)
	Dim inArgs(2)
	Dim outArgs()
	Dim outIndex()
	dim localNumLines as integer

	inArgs(0) = xmlFile()
	inArgs(1) = fileName
	inArgs(2) = numberOfLines
	Script.invoke( inArgs(), outIndex(), outArgs() )
End Sub

sub UpdateConfig( a$ )
       dim document   as object
       dim dispatcher as object
       dim parser     as object
       dim disp     as object
       dim url        as new com.sun.star.util.URL
       document = ThisComponent.CurrentController.Frame
       parser   = createUnoService(&quot;com.sun.star.util.URLTransformer&quot;)
       dim args1(0) as new com.sun.star.beans.PropertyValue
       args1(0).Name = &quot;StreamName&quot;
       args1(0).Value = a$
       url.Complete = &quot;.uno:UpdateConfiguration&quot;
       parser.parseStrict(url)
       disp = document.queryDispatch(url,&quot;&quot;,0)
       disp.dispatch(url,args1())

End Sub


sub AddNewEventBinding( scriptName as string, eventPosition as integer, isApp as boolean )
	event = allEventTypes( eventPosition ).Name
	&apos;dim scriptProp as new com.sun.star.beans.PropertyValue
	if isApp then
		&apos;scriptProp.Name = scriptName
		&apos;scriptProp.Value = numberOfLines
		allEventTypesApp( eventPosition ).Name = scriptName
		allEventTypesApp( eventPosition ).Value = numberOfLines

		newline = &quot; &lt;event:event event:name=&quot; + chr$(34) + event + chr$(34)
		newline = newline + &quot; event:language=&quot; + chr$(34) + &quot;Script&quot; + chr$(34) + &quot; xlink:href=&quot; + chr$(34)
		newline = newline + scriptName + chr$(34) + &quot; xlink:type=&quot; + chr$(34) + &quot;simple&quot; + chr$(34) + &quot;/&gt;&quot;
		xmlFile( numberOfLines ) = newline
		xmlFile( numberOfLines + 1 ) = &quot;&lt;/event:events&gt;&quot;
		numberOfLines = numberOfLines + 1
	else
		&apos;scriptProp.Name = scriptName
		&apos;scriptProp.Value = 2
		allEventTypesDoc( eventPosition ).Name = scriptName
		allEventTypesDoc( eventPosition ).Value = 2
	end if
end sub

REM ----- Array update functions -----


sub AddNewMenuBinding( newScript as string, newMenuLabel as string, newLinePosition as integer )
	dim newXmlFile( 400 ) as string
	dim newLineInserted as boolean
	dim lineCounter as integer
	lineCounter = 1

	do while lineCounter &lt;= numberOfLines
		if not newLineInserted then
			REM If the line number is the position at which to insert the new line
			if lineCounter = newLinePosition then
				if( instr( xmlFile( lineCounter ), &quot;&lt;menu:menupopup&gt;&quot; ) &gt; 0 ) then
					indent = GetMenuWhiteSpace( xmlFile( newLinePosition + 1 ) )
					newXmlFile( lineCounter ) = xmlFile( lineCounter )
					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; )
				else
					indent = GetMenuWhiteSpace( xmlFile( newLinePosition - 1 ) )
					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; )
					newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
				end if
			REM added -1 for debug --&gt;
			&apos;	indent = GetMenuWhiteSpace( xmlFile( newLinePosition ) )
			&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; )
			&apos;	newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
				newLineInserted = true
			else
				newXmlFile( lineCounter ) = xmlFile( lineCounter )
			end if
		else
			REM if the new line has been inserted the read from one position behind
			newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
		end if
		lineCounter = lineCounter + 1
	loop

	numberOfLines = numberOfLines + 1

	REM read the new file into the global array
	for n = 1 to numberOfLines
		xmlFile( n ) = newXmlFile( n )
	next n

end sub


sub AddNewKeyBinding( scriptName as string, shift as boolean, control as boolean, key as string )

	dim keyCombo as string
	newLine = &quot; &lt;accel:item accel:code=&quot;+chr$(34)+&quot;KEY_&quot; + key +chr$(34)
	if shift then
		keyCombo = &quot;SHIFT + &quot;
		newLine = newLine + &quot; accel:shift=&quot;+chr$(34)+&quot;true&quot;+chr$(34)
	end if
	if control then
		keyCombo = keyCombo + &quot;CONTROL + &quot;
		newLine = newLine + &quot; accel:mod1=&quot;+chr$(34)+&quot;true&quot;+chr$(34)
	end if
	keyCombo = keyCombo + key
	newLine = newLine + &quot; xlink:href=&quot;+chr$(34)+ scriptName +chr$(34) +&quot;/&gt;&quot;

	if ( control AND shift ) then
		offsetIntoArrayOfArrays = 0
	elseif ( control ) then
		offsetIntoArrayOfArrays = 3
	elseif ( shift ) then
		offsetIntoArrayOfArrays = 6
	endif

	keyTypeOffset = getKeyTypeOffset( key  )
	offsetIntoArrayOfArrays = offsetIntoArrayOfArrays + keyTypeOffset
	&apos; Calculate from the key the offset into key group array we need to point to
	KeyGroupIndex = getKeyGroupIndex( key, keyTypeOffset )

	&apos; if key is already allocated to a script then just reallocate
	if ( keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value &gt; 1 ) then

		keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
		&apos;replace line in xml file
		xmlFile( keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value ) = newLine
	else
		&apos; this is a new binding, create a new line in xml file
		for n = 1 to numberOfLines
			if n = numberOfLines then
				xmlFile( n ) = newLine
				xmlFile( n + 1 ) = &quot;&lt;/accel:acceleratorlist&gt;&quot;
				exit for
			else
				xmlFile( n ) = xmlFile( n )
			end if
		next n

		keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value = n
		keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
		numberOfLines = numberOfLines + 1
	endif

end sub


Sub RemoveBinding( lineToRemove as Integer )
	xmlFile( lineToRemove ) = &quot;&quot;
end Sub

REM Adds or removes the starting xml line positions for each top-level menu after the menu with the added script
sub UpdateTopLevelMenus( topLevelMenuPosition as integer, addLine as boolean )
	for n = topLevelMenuPosition to 8
		if addLine then
			menuItemLinePosition( n ) = menuItemLinePosition( n ) + 1

		end if
	next n
end sub


REM Remove scriptNames and scriptLinePosition entries
sub RemoveScriptNameAndPosition( keyComboPosition )
	dim updatedScriptNames( 120 ) as string
	dim updatedScriptLinePosition( 120 ) as integer
	dim removedScript as boolean
	removedScript = false

	for n = 1 to scriptCount
		if not removedScript then
			if not( n = keyComboPosition ) then
				updatedScriptNames( n ) = scriptNames( n )
			else
				removedScript = true
			end if
		else
			updatedScriptNames( n - 1 ) = scriptNames( n )
		end if
	next n
	scriptCount = scriptCount - 1

	for n = 1 to scriptCount
		scriptNames( n ) = updatedScriptNames( n )
	next n
end sub



REM ----- Populating Dialog Controls -----

Sub PopulateLanguageCombo()
	langCombo =  bindingDialog.getControl( &quot;LanguageCombo&quot; )
	langCombo.removeItems( 0, langCombo.getItemCount() )
	for n = LBOUND( languages() ) to UBOUND ( languages() )
		langCombo.addItem( languages( n ), n )
	next n
	langCombo.setDropDownLineCount( n )
	langCombo.text = langCombo.getItem( 0 )
End Sub

Sub PopulateLocationCombo()
	dim ScriptProvider as Object
	dim args(1)
	dim displayDialogFlag as boolean
	displayDialogFlag = false
	args(0) = ThisComponent
	args(1) = displayDialogFlag

	ScriptProvider = createUnoService(&quot;drafts.com.sun.star.script.framework.provider.MasterScriptProvider&quot;)
	ScriptProvider.initialize( args() )

	locCombo =  bindingDialog.getControl( &quot;LocationCombo&quot; )
	locCombo.removeItems( 0, locCombo.getItemCount() )
	for n = LBOUND( locations() ) to UBOUND ( locations() )
		locCombo.addItem( locations( n ), n )
	next n
	locCombo.setDropDownLineCount( n )
	locCombo.text = locCombo.getItem( 0 )
End Sub

sub PopulateScriptList( lang as String, loc as String )
    Dim detailedView as boolean
    detailedView = bindingDialog.Model.detail.state
	scriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	scriptList.removeItems( 0, scriptList.getItemCount() )

	smgr = getProcessServiceManager()
   	context = smgr.getPropertyValue( &quot;DefaultContext&quot; )
   	scriptstoragemgr = context.getValueByName( &quot;/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager&quot; )
	scriptLocationURI = &quot;USER&quot;
	if ( loc = &quot;Share&quot; ) then
		scriptLocationURI = &quot;SHARE&quot;
	elseif ( loc = &quot;Document&quot; )then
		document = StarDesktop.ActiveFrame.Controller.Model
		scriptLocationURI = document.getURL()
	elseif ( loc = &quot;Filesystem&quot; ) then
		REM populate the list from the filesysScripts list
		if(lang = &quot;Java&quot; ) then
			exit sub
		endif
		length = UBOUND( filesysScripts() )
		if(length = -1) then
			exit sub
		endif
        for langIndex = lbound(languages()) to ubound(languages())
            if ( lang = languages(langIndex)) then
                extns = extensions(langIndex)
                exit for
            endif
        next langIndex
		dim locnDisplayList( length ) as new com.sun.star.beans.PropertyValue
		for index = lbound(filesysScripts()) to ubound(filesysScripts())
			scriptextn = filesysScripts( index )
			pos = lastIndexOf( scriptextn, &quot;.&quot; )
            scriptextn = mid( scriptextn, pos + 1, len( scriptextn ) - pos )

            for extnsIndex = lbound(extns()) to ubound(extns())
                extn = extns(extnsIndex)
                if ( scriptextn = extn ) then
                	if ( detailedView ) then
                    	locnDisplayList( index ).Name = filesysScripts( index )
                    	locnDisplayList( index ).Value = filesysScripts( index )
                	else
						REM replace name with simplified view
						locnDisplayList( index ).Name = filesysScripts( index )
						locnDisplayList( index ).Value = filesysScripts( index )
					end if
				scriptList.addItem( locnDisplayList( index ).Name, index )
				exit for
                end if
            next extnsIndex
		next index
		ScriptDisplayList(0) = locnDisplayList()
		scriptList.selectItemPos( 0, true )

        REM !!!!At this point we exit the sub!!!!
		exit sub

	endif

	scriptStorageID = scriptstoragemgr.getScriptStorageID( scriptLocationURI )
	dim resultList() as Object
	if ( scriptStorageID &gt; -1 ) then
		storage = scriptstoragemgr.getScriptStorage( scriptStorageID )
		implementations() = storage.getAllImplementations()
		length = UBOUND( implementations() )
		reservedScriptTag = &quot;_$&quot;
    	if ( length &gt; -1 ) then
    		dim tempDisplayList( length ) as new com.sun.star.beans.PropertyValue
			for n = LBOUND( implementations() ) to UBOUND( implementations() )
				logicalName = implementations( n ).getLogicalName()
				firstTwoChars = LEFT( logicalName, 2 )
				&apos;Only display scripts whose logicalnames don&apos;t begin with &quot;_$&quot;
				if ( firstTwoChars &lt;&gt; reservedScriptTag ) then
					if ( lang = implementations( n ).getLanguage() ) then
						if ( detailedView ) then
							tempDisplayList( n ).Name = logicalName _
								+ &quot; [&quot; + implementations( n ).getFunctionName() + &quot;]&quot;
							tempDisplayList( n ).Value = implementations( n )
						else
							tempDisplayList( n ).Name = logicalName
							tempDisplayList( n ).Value = implementations( n )
						endif
						scriptList.addItem( tempDisplayList( n ).Name, n )
					endif
				endif
			next n
			resultList = tempDisplayList()
		endif
	ScriptDisplayList(0) = resultList()
	endif
	scriptList.selectItemPos( 0, true )

end sub

sub PopulateMenuCombo()
	menuComboBox = bindingDialog.getControl( &quot;MenuCombo&quot; )
	menuComboBox.removeItems( 0, menuComboBox.getItemCount() )
	for n = 1 to menuCount
		menuComboBox.addItem( menuItems( n ), n - 1 )
	next n
	menuComboBox.setDropDownLineCount( 8 )
	menuComboBox.text = menuComboBox.getItem( 0 )
end sub


sub PopulateSubMenuList( menuItemPosition as integer )
	redim subMenuItems( 100 ) as string
	redim subMenuItemLinePosition( 100 ) as integer
	dim lineNumber as integer
	const menuItemWhiteSpace = 4
	const menuXMLTag = &quot;&lt;menu:menu&quot;
	subMenuCount = 1

	REM xmlStartLine and xmlEndLine refer to the first and last lines
	&apos; menuItemPosition of a top-level menu ( 1=File to 8=Help ) add one line
	xmlStartLine = menuItemLinePosition( menuItemPosition ) + 1

	REM If last menu item is chosen
	if menuItemPosition = menuCount then
		xmlEndLine = numberOfLines
	else
		REM Other wise get the line before the next top-level menu begins
		xmlEndLine = menuItemLinePosition( menuItemPosition + 1 ) - 1
	end if

	for lineNumber = xmlStartLine to xmlEndLine
		REM Insert all sub-menus and sub-popupmenus
		if not( instr( xmlFile( lineNumber ), menuXMLTag ) = 0 ) and instr( xmlFile( lineNumber ), &quot;menupopup&quot;) = 0 then
			subMenuIndent = GetMenuWhiteSpace( xmlFile( lineNumber ) )
			if subMenuIndent = &quot; &quot; then
				subMenuIndent = &quot;&quot;
			else
				subMenuIndent = subMenuIndent + subMenuIndent
			end if
			if not( instr( xmlFile( lineNumber ), &quot;menuseparator&quot; ) = 0 ) then
				subMenuItems( subMenuCount ) = subMenuIndent + &quot;----------------&quot;
			else
				subMenuName = ExtractLabelFromXMLLine( xmlFile( lineNumber ) )
				REM Add script Name if there is one bound to menu item
				if instr( xmlFile( lineNumber ), &quot;script://&quot; ) &gt; 0 then
					script = ExtractScriptIdFromXMLLine( xmlFile( lineNumber ) )
					subMenuItems( subMenuCount ) = ( subMenuIndent + subMenuName + &quot; [&quot; + script + &quot;]&quot; )
				else
					subMenuItems( subMenuCount ) = subMenuIndent + subMenuName
				end if
			end if
			subMenuItemLinePosition( subMenuCount ) = lineNumber
			subMenuCount = subMenuCount + 1
		end if
	next lineNumber

	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )

	currentPosition = subMenuList.getSelectedItemPos()

	subMenuList.removeItems( 0, subMenuList.getItemCount() )
	&apos;If there are no sub-menus i.e. a dynamically generated menu like Format
	&apos;if subMenuCount = 1 then
	if menuItems( menuItemPosition ) = &quot;Format&quot; then
			subMenuList.addItem( &quot;Unable to Assign Scripts to this menu&quot;, 0 )
	else
		for n = 1 to subMenuCount - 1
			subMenuList.addItem( subMenuItems( n ), n - 1 )
		next n
	end if

	subMenuList.selectItemPos( currentPosition, true )

	SubMenuListListener()
	MenuLabelBoxListener()
end sub



sub PopulateTopLevelKeyBindingList()

    allKeyGroupsArray(0) =  &quot;SHIFT + CONTROL + F keys&quot;
	allKeyGroupsArray(1) = &quot;SHIFT + CONTROL + digits&quot; &apos; CURRENTLY DISABLED
	allKeyGroupsArray(2) = &quot;SHIFT + CONTROL + letters&quot;
	allKeyGroupsArray(3) = &quot;CONTROL + F keys&quot;
	allKeyGroupsArray(4) = &quot;CONTROL + digits&quot;
	allKeyGroupsArray(5) = &quot;CONTROL + letters&quot;
	allKeyGroupsArray(6) = &quot;SHIFT + F keys&quot;

	keyCombo = bindingDialog.getControl( &quot;KeyCombo&quot; )
	keyCombo.removeItems( 0, keyCombo.getItemCount() )
	pos = 0
	for n = LBOUND( allKeyGroupsArray() ) to UBOUND( allKeyGroupsArray() )
	&apos; SHIFT + CONTROL + digits group is disabled at the moment, so skip
	&apos; it
		if ( n &lt;&gt; 1 ) then
			keyCombo.addItem( allKeyGroupsArray( n ), pos )
			pos = pos +1
		endif
	next n
	keyCombo.text = keyCombo.getItem( 0 )
end sub

sub PopulateKeyBindingList( keyGroupIndex as Integer )
	keyList = bindingDialog.getControl( &quot;KeyList&quot; )
	selectedPos = keyList.getSelectedItemPos()
	keyList.removeItems( 0, keyList.getItemCount() )

	ShortCutKeyArray() = KeyBindArrayOfArrays( keyGroupIndex )

	Dim keyProp as new com.sun.star.beans.PropertyValue
	for n = lbound( ShortCutKeyArray() )  to ubound( ShortCutKeyArray() )
		keyName = ShortCutKeyArray( n )
		if ( keyAllocationMap( keyGroupIndex, n ).Value = 1 ) then
			keyName = keyName + &quot; [Allocated to Office function]&quot;

		elseif ( keyAllocationMap( keyGroupIndex, n ).Value &gt; 1 ) then
			keyName = keyName + &quot; &quot; + keyAllocationMap( keyGroupIndex, n ).Name
		endif
		keyList.addItem( keyName, n )
	next n

	if ( selectedPos &lt;&gt; -1 )then
		keyList.selectItemPos( selectedPos, true )
	else
		keyList.selectItemPos( 0, true )
	end if
	KeyListListener()
end sub

sub populateEventList( focusPosition as integer )
	allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
	eventList = bindingDialog.getControl( &quot;EventList&quot; )
	eventList.removeItems( 0, eventList.getItemCount() )

	dim isApp as boolean
	if allApps.state = true then  &apos; Application event
		isApp = true
	else
		isApp = false
	end if

	&apos; use allEventTypes() to fill list box
	&apos; for each element compare with allEventTypesApp
	dim scriptName as string
	dim lineNumber as integer
	for n = 0 to ubound( allEventTypes() )
		&apos; If the line number is 1 then SB macro
		&apos; more than 1 it is the line number of the script
		if isApp and n &gt; 12 then
			exit for
		endif
		if isApp then
			lineNumber = allEventTypesApp( n ).Value
			scriptName = allEventTypesApp( n ).Name
		else
			lineNumber = allEventTypesDoc( n ).Value
			scriptName = allEventTypesDoc( n ).Name
		end if
		stringToAdd = &quot;&quot;
		if ( lineNumber &gt;= 1 ) then
			stringToAdd = &quot; [&quot; + scriptName + &quot;]&quot;
		end if
		eventList.addItem( allEventTypes( n ).Value + &quot; &quot; + stringToAdd, n )
	next n

	eventList.selectItemPos( focusPosition, true )
end sub



sub CreateAllKeyBindings()
	reDim allKeyBindings( 105 ) as string
	keyBindingPosition = 1

	for FKey = 2 to 12
		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + CONTROL + F&quot; + FKey
		keyBindingPosition = keyBindingPosition + 1
	next FKey
	for Digit = 0 to 9
		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + CONTROL + &quot; + Digit
			keyBindingPosition = keyBindingPosition + 1
	next Digit
	for Alpha = 65 to 90
		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + CONTROL + &quot; + chr$( Alpha )
		keyBindingPosition = keyBindingPosition + 1
	next Alpha

	for FKey = 2 to 12
		allKeyBindings( keyBindingPosition ) = &quot;CONTROL + F&quot; + FKey
		keyBindingPosition = keyBindingPosition + 1
	next FKey
	for Digit = 0 to 9
		allKeyBindings( keyBindingPosition ) = &quot;CONTROL + &quot; + Digit
		keyBindingPosition = keyBindingPosition + 1
	next Digit
	for Alpha = 65 to 90
		allKeyBindings( keyBindingPosition ) = &quot;CONTROL + &quot; + chr$( Alpha )
		keyBindingPosition = keyBindingPosition + 1
	next Alpha

	for FKey = 2 to 12
		allKeyBindings( keyBindingPosition ) = &quot;SHIFT + F&quot; + FKey
		keyBindingPosition = keyBindingPosition + 1
	next FKey
end sub


sub createAllEventTypes()
	allEventTypes( 0 ).Name = &quot;OnStartApp&quot;
	allEventTypes( 0 ).Value = &quot;Start Application&quot;
	allEventTypes( 1 ).Name = &quot;OnCloseApp&quot;
	allEventTypes( 1 ).Value = &quot;Close Application&quot;
	allEventTypes( 2 ).Name = &quot;OnNew&quot;
	allEventTypes( 2 ).Value = &quot;Create Document&quot;
	allEventTypes( 3 ).Name = &quot;OnLoad&quot;
	allEventTypes( 3 ).Value = &quot;Open Document&quot;
	allEventTypes( 4 ).Name = &quot;OnSaveAs&quot;
	allEventTypes( 4 ).Value = &quot;Save Document As&quot;
	allEventTypes( 5 ).Name = &quot;OnSaveAsDone&quot;
	allEventTypes( 5 ).Value = &quot;Document has been saved as&quot;
	allEventTypes( 6 ).Name = &quot;OnSave&quot;
	allEventTypes( 6 ).Value = &quot;Save Document&quot;
	allEventTypes( 7 ).Name = &quot;OnSaveDone&quot;
	allEventTypes( 7 ).Value = &quot;Document has been saved&quot;
	allEventTypes( 8 ).Name = &quot;OnPrepareUnload&quot;
	allEventTypes( 8 ).Value = &quot;Close Document&quot;
	allEventTypes( 9 ).Name = &quot;OnUnload&quot;
	allEventTypes( 9 ).Value = &quot;Close Document&quot;
	allEventTypes( 10 ).Name = &quot;OnFocus&quot;
	allEventTypes( 10 ).Value = &quot;Activate document&quot;
	allEventTypes( 11 ).Name = &quot;OnUnfocus&quot;
	allEventTypes( 11 ).Value = &quot;DeActivate document&quot;
	allEventTypes( 12 ).Name = &quot;OnPrint&quot;
	allEventTypes( 12 ).Value = &quot;Print Document&quot;
	REM The following are document-only events
	allEventTypes( 13 ).Name = &quot;OnMailMerge&quot;
	allEventTypes( 13 ).Value = &quot;Print form letters&quot;
	allEventTypes( 14 ).Name = &quot;OnPageCountChange&quot;
	allEventTypes( 14 ).Value = &quot;Changing the page count&quot;
end sub


sub createAllEventBindings()
	&apos;dim props as new com.sun.star.beans.PropertyValue
	&apos;props.Name = &quot;&quot; &apos;Name = script name
	&apos;props.Value = 0 &apos;Value = 0 for empty, 1 for macro, linenumber for script

	&apos; Creates all types of event bindings for both Application and Document
	&apos; Initially both arrays have no bindings allocated to the events
	&apos; The value for Doc is only Script/macro name (no need for line number)
	for n = 0 to ubound( allEventTypes() )
		allEventTypesApp( n ).Name = &quot;&quot;
		allEventTypesApp( n ).Value = 0
		allEventTypesDoc( n ).Name = &quot;&quot;
		allEventTypesDoc( n ).Value = 0
	next n
end sub


REM ----- Text Handling Functions -----


function ExtractLabelFromXMLLine( XMLLine as string ) as string
	labelStart = instr( XMLLine, &quot;label=&quot;+chr$(34)) + 7
	labelEnd = instr( XMLLine, chr$(34)+&quot;&gt;&quot; )
	if labelEnd = 0 then
	    labelEnd = instr( XMLLine, chr$(34)+&quot;/&gt;&quot; )
	end if
	labelLength = labelEnd - labelStart

	menuLabelUnformatted = mid( XMLLine, labelStart, labelLength )
	tildePosition = instr( menuLabelUnformatted, &quot;~&quot; )
	select case tildePosition
		case 0
			menuLabel = menuLabelUnformatted
		case 1
			menuLabel = right( menuLabelUnformatted, labelLength - 1 )
		case else
			menuLabelLeft = left( menuLabelUnformatted, tildePosition - 1 )
			menuLabelRight = right( menuLabelUnformatted, labelLength - tildePosition )
			menuLabel = menuLabelLeft + menuLabelRight
	end select

	ExtractLabelFromXMLLine() = menuLabel
end function


function ExtractScriptIdFromXMLLine( XMLLine as string ) as string
	idStart = instr( XMLLine, &quot;script://&quot;) + 9
	if instr( XMLLine, chr$(34)+&quot; menu:helpid=&quot; ) = 0 then
		idEnd = instr( XMLLIne, &quot;?location=&quot; )
	else
		idEnd = instr( XMLLine, &quot;&quot;+chr$(34)+&quot; menu:helpid=&quot; )
	end if
	idLength = idEnd - idStart
	scriptId = mid( XMLLine, idStart, idLength )

	ExtractScriptIdFromXMLLine() = scriptId
end function

function ExtractEventScriptFromXMLLine( xmlline as string )
	if instr( xmlline, &quot;script://&quot; ) &gt; 0 then
		idStart = instr( xmlline, &quot;script://&quot;) + 9
		idEnd = instr( xmlline, chr$(34)+&quot; xlink:type=&quot; )
		idLength = idEnd - idStart
		scriptId = mid( xmlline, idStart, idLength )
	end if
	ExtractEventScriptFromXMLLine() = scriptId
end function


function ExtractEventNameFromXMLLine(  xmlline as string )
	idStart = instr( xmlline, &quot;event:name=&quot; + chr$(34) ) + 12
	idEnd = instr( xmlline, chr$(34)+&quot; event:language&quot; )
	idLength = idEnd - idStart
	event =  mid( xmlline, idStart, idLength )

	ExtractEventNameFromXMLLine() = event
end function

function ExtractKeyCodeFromXMLLine( XMLLine as string ) as string
	keyStart = instr( XMLLine, &quot;code=&quot;+chr$(34)+&quot;KEY_&quot;) + 10
	keyCode = mid( XMLLine, keyStart, ( len( XMLLine ) - keyStart ) )
	keyEnd = instr( keyCode, chr$(34) )
	keyCode = mid( keyCode, 1, keyEnd - 1 )

	ExtractKeyCodeFromXMLLine() = keyCode
end function


function GetMenuWhiteSpace( MenuXMLLine as string ) as string
	whiteSpace = &quot;&quot;
	numberOfSpaces = instr( MenuXMLLine, &quot;&lt;&quot; ) - 1
	for i = 1 to numberOfSpaces
		whiteSpace = whiteSpace + &quot; &quot;
	next i

	GetMenuWhiteSpace() = whiteSpace
end function

function IsAllocatedMenuItem( script as string ) as boolean
	foundMenuItem = false
	Allocated = false
	count = 0
	do
		count = count + 1
		if strcomp( script, subMenuItems( count ) ) = 0 then
			foundMenuItem = true
		end if
	loop while not( foundMenuItem ) and count &lt; subMenuCount

	linePosition = subMenuItemLinePosition( count )

	if not( instr( xmlFile( linePosition ), &quot;script://&quot; ) = 0 ) then
		Allocated = true
	end if

	isAllocatedMenuItem() = Allocated
end Function


function HasShiftKey( keyCombo ) as boolean
	if instr( keyCombo, &quot;SHIFT&quot; ) = 0 then
		hasShift = false
	else
		hasShift = true
	end if

	HasShiftKey = hasShift
end function


function HasControlKey( keyCombo ) as boolean
	if instr( keyCombo, &quot;CONTROL&quot; ) = 0 then
		hasControl = false
	else
		hasControl = true
	end if

	HasControlKey = hasControl
end function


function ExtractKeyFromCombo( keyString as string ) as string
	while not( instr( keyString, &quot;+&quot; ) = 0 )
		removeTo = instr( keyString, &quot;+ &quot; ) + 2
		keyString = mid( keyString, removeTo, ( len( keyString ) - removeTo ) + 1 )
	wend
	ExtractKeyFromCombo() = keyString
end function



REM ------ Event Handling Functions (Listeners) ------


sub KeyListListener()
	keyShortCutList = bindingDialog.getControl( &quot;KeyList&quot; )
	selectedShortCut = keyShortCutList.getSelectedItem()
	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )

	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	selectedScript = menuScriptList.getSelectedItem()

	keyGroup = combo.text
    dim keyGroupIndex as Integer
    dim selectedKeyIndex as Integer
	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
		if ( allKeyGroupsArray( n ) = keyGroup )then
			keyGroupIndex = n
			exit for
		end if
    next n
    selectedKeyIndex = keyShortCutList.getSelectedItemPos()

	if  keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value &gt; 1 then
		bindingDialog.Model.Delete.enabled = true
		bindingDialog.Model.AddOn.enabled = true
		if selectedScript &lt;&gt; &quot;&quot; then
			bindingDialog.Model.NewButton.enabled = true
		endif

	else

		if keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value  = 1 then
			bindingDialog.Model.Delete.enabled = false
			bindingDialog.Model.AddOn.enabled = false
			bindingDialog.Model.NewButton.enabled = false
		else
			bindingDialog.Model.Delete.enabled = false
			bindingDialog.Model.AddOn.enabled = false
			if selectedScript &lt;&gt; &quot;&quot; then
				bindingDialog.Model.NewButton.enabled = true
			end if
		end if
	end if
end sub


sub SubMenuListListener()
	scriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
	selectedMenuItem = subMenuList.getSelectedItem()
	if IsAllocatedMenuItem( selectedMenuItem ) then
		bindingDialog.Model.Delete.enabled = true
		bindingDialog.Model.AddOn.enabled = true
	else
		bindingDialog.Model.Delete.enabled = false
		bindingDialog.Model.AddOn.enabled = false
	end if
end sub

REM a keypress listener that in turn fires the MenuCL on a return key even only
sub fireMenuComboListernerOnRet( eventobj as object )
	if (eventobj.KeyCode = 1280 ) then
		MenuComboListener()
	endif
end sub

&apos;Populates the SubMenuList with the appropriate menu items from the Top-level menu selected from the combo box
sub MenuComboListener()
	combo = bindingDialog.getControl( &quot;MenuCombo&quot; )
	newToplevelMenu = combo.text
	counter = 0
	do
		counter = counter + 1
	loop while not( newToplevelMenu = menuItems( counter ) )

	PopulateSubMenuList( counter )
end sub

REM a keypress listener that in turn fires the LLCL on a return key even only
sub fireLangLocComboListernerOnRet( eventobj as object )
	if (eventobj.KeyCode = 1280 ) then
		LangLocComboListener()
	endif
end sub

sub LangLocComboListener()

	combo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
	language = combo.text
	combo = bindingDialog.getControl( &quot;LocationCombo&quot; )
	location = combo.text

	PopulateScriptList( language,location )

    &apos;Enable/disable Assign button
    scriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
    if not (dialogName = &quot;EditDebug&quot;) then
        if scriptList.getSelectedItem() = &quot;&quot; then
            bindingDialog.Model.NewButton.enabled = false
        end if
    end if

    if ( location = &quot;Filesystem&quot; ) and ( language &lt;&gt; &quot;Java&quot; ) then
    	bindingDialog.Model.Browse.enabled = true
    	if not (dialogName = &quot;EditDebug&quot;) then
    		bindingDialog.Model.fsonly.enabled = true
    	end if
    else
    	bindingDialog.Model.Browse.enabled = false
    	if not (dialogName = &quot;EditDebug&quot;) then
    		bindingDialog.Model.fsonly.enabled = false
    	end if
    endif

    &apos; extra dialog dependent processing
    if dialogName = &quot;Menu&quot; then
    	&apos; will set New button to false if no text in LableBox
    	MenuLabelBoxListener()
    elseif dialogName = &quot;Key&quot; then
    	&apos; will set Assigne button to false if appropriate
    	KeyListListener()
    elseif dialogName = &quot;Event&quot; then
    	EventListListener()
    end if

end sub

REM a keypress listener that in turn fires the KeyCL on a return key even only
sub fireKeyComboListernerOnRet( eventobj as object )
	if (eventobj.KeyCode = 1280 ) then
		KeyComboListener()
	endif
end sub

&apos;Populates the KeyList with the appropriate key combos from the Top-level key group selected from the combo box
sub KeyComboListener()
	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )
	keyGroup = combo.text
	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
		if ( allKeyGroupsArray( n ) = keyGroup )then
			keyGroupIndex = n
			exit for
		end if
    next n
	PopulateKeyBindingList( keyGroupIndex )
end sub


sub MenuLabelBoxListener()
	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	selectedScript = menuScriptList.getSelectedItem()
	&apos;if the SubMenuList is from a dynamically created menu (e.g. Format)
	&apos;or if the Menu Label text box is empty
	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
	firstItem = subMenuList.getItem( 0 )
	if bindingDialog.Model.MenuLabelBox.text = &quot;&quot; OR firstItem = &quot;Unable to Assign Scripts to this menu&quot; OR  selectedScript = &quot;&quot; then
		bindingDialog.Model.NewButton.enabled = false
	else
		bindingDialog.Model.NewButton.enabled = true
	end if
end sub

sub AppDocEventListener()
	populateEventList( 0 )
	EventListListener()
end sub


sub EventListListener()
	on error goto ErrorHandler

    eventList = bindingDialog.getControl( &quot;EventList&quot; )
    eventPos = eventList.getSelectedItemPos()

    allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )

	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	selectedScript = menuScriptList.getSelectedItem()

    dim binding as integer
    if allApps.state = true then
    	binding = allEventTypesApp( eventPos ).Value
    else
	    binding = allEventTypesDoc( eventPos ).Value
    endif

    if ( binding &gt; 1 ) then
       	bindingDialog.Model.Delete.enabled = true
    else
       	bindingDialog.Model.Delete.enabled = false
    end if

	if ( binding = 1 ) then
		&apos; staroffice binding, can&apos;t assign
		bindingDialog.Model.NewButton.enabled = false
	elseif (  selectedScript &lt;&gt; &quot;&quot; ) then
		bindingDialog.Model.NewButton.enabled = true
	end if
    exit sub

    ErrorHandler:
    reset
    bindingDialog.Model.Delete.enabled = false

end sub


REM ------ Event Handling Functions (Buttons) ------

function getFilePicker() as Object
    REM file dialog
    oFilePicker = CreateUnoService( &quot;com.sun.star.ui.dialogs.FilePicker&quot; )

    combo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
    language = combo.text
    currentFilter = &quot;&quot;

    for langIndex = 0 to ubound(languages())
        if( languages(langIndex) &lt;&gt; &quot;Java&quot; ) then
        	filterName = languages(langIndex) + &quot; (&quot;
        	filterVal=&quot;&quot;
        	extns = extensions(langIndex)
        	for extnIndex = lbound(extns()) to ubound(extns())
            	filterName = filterName + &quot;*.&quot; + extns(extnIndex) + &quot;,&quot;
           	 	filterVal = filterVal + &quot;*.&quot; + extns(extnIndex) + &quot;,&quot;
        	next extnIndex
        	filterName = left(filterName, len(filterName) -1) + &quot;)&quot;
        	filterVal = left(filterVal, len(filterVal) -1)
        	if(instr(filterName,language) = 1 ) then
            	currentFilter = filterName
        	end if
        	oFilePicker.AppendFilter(filterName, filterVal)
        end if
    next langIndex
    if(len(currentFilter) &gt; 0 ) then
        oFilePicker.SetCurrentFilter( currentFilter )
    end if

    If sFileURL = &quot;&quot; Then
        oSettings = CreateUnoService( &quot;com.sun.star.frame.Settings&quot; )
        oPathSettings = oSettings.getByName( &quot;PathSettings&quot; )
        sFileURL = oPathSettings.getPropertyValue( &quot;Work&quot; )
    End If

    REM set display directory
    oSimpleFileAccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )

    If oSimpleFileAccess.exists( sFileURL ) And oSimpleFileAccess.isFolder( sFileURL ) Then
        oFilePicker.setDisplayDirectory( sFileURL )
    End If
    getFilePicker() = oFilePicker
end function

Sub DoBrowseAndEdit()
    Dim oFilePicker As Object, oSimpleFileAccess As Object
    Dim oSettings As Object, oPathSettings As Object
    Dim sFileURL As String
    Dim sFiles As Variant

    oFilePicker = getFilePicker()
    REM execute file dialog
    If oFilePicker.execute() Then
        sFiles = oFilePicker.getFiles()

        sFileURL = sFiles(0)
    	oSimpleFileAccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
        If oSimpleFileAccess.exists( sFileURL ) Then
            for langIndex = 0 to ubound(languages())
                If (instr(oFilePicker.GetCurrentFilter, languages(langIndex)) = 1 ) then
                	RunDebugger(languages(langIndex), sFileURL, &quot;&quot;)
            	End If
            next langIndex
        End If
        bindingDialog.endExecute()
    End If
End Sub

Sub RunDebugger(lang as String, uri as String, filename as String)
    dim document   as object
    dim dispatcher as object
    dim parser     as object
    dim url        as new com.sun.star.util.URL

    document = ThisComponent.CurrentController.Frame
    parser   = createUnoService(&quot;com.sun.star.util.URLTransformer&quot;)
    dim args(2) as new com.sun.star.beans.PropertyValue
    args(0).Name = &quot;language&quot;
    args(0).Value = lang
    args(1).Name = &quot;uri&quot;
    args(1).Value = uri
    args(2).Name = &quot;filename&quot;
    args(2).Value = filename

    url.Complete = &quot;script://_$DebugRunner.Debug?&quot; _
        + &quot;language=Java&amp;function=DebugRunner.go&quot; _
        + &quot;&amp;location=share&quot;

    parser.parseStrict(url)
    disp = document.queryDispatch(url,&quot;&quot;,0)
    disp.dispatch(url, args())
End Sub

sub DoEdit()
    Dim scriptInfo as Object

    menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
    selectedScript = menuScriptList.getSelectedItem()

    if not (selectedScript = &quot;&quot;) then
        scripts() = scriptDisplayList(0)
        for n = LBOUND( scripts() ) to UBOUND( scripts() )
            if ( scripts( n ).Name = selectedScript ) then
                scriptInfo = scripts( n ).Value
                exit for
            end if
        next n

        RunDebugger(scriptInfo.getLanguage, scriptInfo.getParcelURI, scriptInfo.getFunctionName)
        bindingDialog.endExecute()
    end if
end sub

sub MenuOKButton()
	WriteXMLFromArray()
	bindingDialog.endExecute()
end sub


sub MenuCancelButton()
	bindingDialog.endExecute()
end sub


sub MenuHelpButton()
	helpDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;HelpBinding&quot; )
	helpDialog.execute()
end sub


sub MenuDeleteButton()
	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )
	linePos = subMenuItemLinePosition( subMenuList.getSelectedItemPos() + 1 )

	RemoveBinding( linePos )

	REM Update the top-level menu&apos;s line positions
	combo = bindingDialog.getControl( &quot;MenuCombo&quot; )
	newToplevelMenu = combo.text
	counter = 0
	do
		counter = counter + 1
	loop while not( newToplevelMenu = menuItems( counter ) )
	UpdateTopLevelMenus( counter + 1, false )

	MenuComboListener()

	subMenuList.selectItemPos( subMenuList.getSelectedItemPos(), true )
end sub


sub MenuNewButton()
	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	selectedScript = menuScriptList.getSelectedItem()
    scriptURI = getScriptURI( selectedScript )
	newMenuLabel = bindingDialog.Model.MenuLabelBox.text

	subMenuList = bindingDialog.getControl( &quot;SubMenuList&quot; )

	REM Update the top-level menu&apos;s line positions
	combo = bindingDialog.getControl( &quot;MenuCombo&quot; )
	newToplevelMenu = combo.text
	counter = 0
	do
		counter = counter + 1
	loop while not( newToplevelMenu = menuItems( counter ) )
	UpdateTopLevelMenus( counter + 1, true )

	REM New line position is one ahead of the selected sub menu item
	linePos = subMenuItemLinePosition( subMenuList.getSelectedItemPos() + 1 ) + 1

	AddNewMenuBinding( scriptURI, newMenuLabel, linePos )

	MenuComboListener()
	subMenuList.selectItemPos( subMenuList.getSelectedItemPos() + 1, true )
	SubMenuListListener()
end sub

sub BrowseButton()
	Dim oFilePicker As Object, oSimpleFileAccess As Object
	Dim oSettings As Object, oPathSettings As Object
	Dim sFileURL As String
	Dim sFiles As Variant

	oFilePicker = getFilePicker()

	REM execute file dialog
	If oFilePicker.execute() Then
		sFiles = oFilePicker.getFiles()
		sFileURL = sFiles(0)
		oSimpleFileAccess = CreateUnoService( &quot;com.sun.star.ucb.SimpleFileAccess&quot; )
		If oSimpleFileAccess.exists( sFileURL ) Then
			REM add sFileURL to the list
			ReDim preserve filesysScripts(filesysCount) as String
			filesysScripts( filesysCount ) = sFileURL
			filesysCount=filesysCount+1
			&apos; if user changed filter in file picker then populate
			&apos; language with language associated with that in file picker
			sFilter = oFilePicker.getCurrentFilter()
			langCombo = bindingDialog.getControl( &quot;LanguageCombo&quot; )
			dim items() as String
			items() = langCombo.getItems()
			for index = lbound(items()) to ubound(items())
				iPos = inStr(sFilter,&quot; &quot;)
				Dim theLanguage as String
				if( iPos &gt; 0 ) then
					theLanguage = Left( sFilter, iPos - 1)
				    if ( theLanguage = items( index ) ) then
				 		langCombo.text = items( index )
				 		exit for
				 	end if
				end if
			next index
		End If
	End If
	LangLocComboListener()
End Sub

sub KeyOKButton()
	WriteXMLFromArray()
	bindingDialog.endExecute()
end sub


sub KeyCancelButton()
	bindingDialog.endExecute()
end sub


sub KeyHelpButton()
	helpDialog = LoadDialog( &quot;ScriptBindingLibrary&quot;, &quot;HelpBinding&quot; )
	helpDialog.execute()
end sub


sub KeyNewButton()
	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )
	keyGroup = combo.text
	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
		if ( allKeyGroupsArray( n ) = keyGroup )then
			keyGroupIndex = n
			exit for
		end if
	next n
	menuScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	script = menuScriptList.getSelectedItem()
	scriptURI = getScriptURI( script )

	keyList = bindingDialog.getControl( &quot;KeyList&quot; )
	keyIndex = keyList.getSelectedItemPos()
	ShortCutKeyArray() = KeyBindArrayOfArrays( keyGroupIndex )
	keyText = ShortCutKeyArray( keyIndex )

	AddNewKeyBinding( scriptURI, HasShiftKey( keyText ), HasControlKey( keyText ), ExtractKeyFromCombo( keyText ) )

	KeyComboListener()
end sub


sub KeyDeleteButton()

	keyShortCutList = bindingDialog.getControl( &quot;KeyList&quot; )
	selectedShortCut = keyShortCutList.getSelectedItem()
	combo = bindingDialog.getControl( &quot;KeyCombo&quot; )

	keyGroup = combo.text
	dim keyGroupIndex as Integer
	dim selectedKeyIndex as Integer
	for n = lbound ( allKeyGroupsArray() ) to ubound ( allKeyGroupsArray() )
		if ( allKeyGroupsArray( n ) = keyGroup )then
			keyGroupIndex = n
			exit for
		end if
	next n
	selectedKeyIndex = keyShortCutList.getSelectedItemPos()
	linePosition = keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value
	keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Value = 0
	keyAllocationMap( keyGroupIndex, selectedKeyIndex ).Name = &quot;&quot;
	RemoveBinding( linePosition )
	KeyComboListener()
end sub


sub EventNewButton()
	eventScriptList = bindingDialog.getControl( &quot;ScriptList&quot; )
	selectedScript = eventScriptList.getSelectedItem()
	scriptURI = getScriptURI( selectedScript )
	eventList = bindingDialog.getControl( &quot;EventList&quot; )
	eventPosition = eventList.getSelectedItemPos()

	allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
	dim isApp as boolean
	if allApps.state = true then &apos;Application
		isApp = true
	else &apos;Document
		isApp = false
	end if
	AddNewEventBinding( scriptURI, eventPosition, isApp )

	populateEventList( eventPosition )
	EventListListener()
end sub


sub EventDeleteButton()
	eventList = bindingDialog.getControl( &quot;EventList&quot; )
	REM Check that combo is a script
	eventPosition = eventList.getSelectedItemPos()

	allApps = bindingDialog.getControl( &quot;AllAppsOption&quot; )
	if allApps.state = true then &apos;Application
		linePosition = allEventTypesApp( eventPosition ).Value
		&apos;dim eventProp as new com.sun.star.beans.PropertyValue
		&apos;eventProp.Name = &quot;&quot;
		&apos;eventProp.Value = 0
		allEventTypesApp( eventPosition ).Name = &quot;&quot;
		allEventTypesApp( eventPosition ).Value = 0
		RemoveBinding( linePosition )
	else &apos;Document
		&apos;DeleteEvent( allEventTypes( eventPosition ) )
		allEventTypesDoc( eventPosition ).Name = &quot;&quot;
		allEventTypesDoc( eventPosition ).Value = 0
	end if

	PopulateEventList( eventPosition )
	EventListListener()
end sub


sub EventOKButton
	WriteEventsToDoc()
	WriteXMLFromArray()
	bindingDialog.endExecute()
end sub


sub HelpOKButton()
	helpDialog.endExecute()
end sub
</script:module>
