summaryrefslogtreecommitdiff
path: root/scripting/workben/bindings/ScriptBinding.xba
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/workben/bindings/ScriptBinding.xba')
-rw-r--r--scripting/workben/bindings/ScriptBinding.xba2093
1 files changed, 2093 insertions, 0 deletions
diff --git a/scripting/workben/bindings/ScriptBinding.xba b/scripting/workben/bindings/ScriptBinding.xba
new file mode 100644
index 000000000000..7f689d34f797
--- /dev/null
+++ b/scripting/workben/bindings/ScriptBinding.xba
@@ -0,0 +1,2093 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
+<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 allready 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 dependant 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>