<?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>
