forked from amazingfate/loongoffice
1701 lines
56 KiB
XML
1701 lines
56 KiB
XML
<?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 -----
|
|
|
|
'bindingDialog can refer to either KeyBinding or MenuBinding dialog
|
|
private languages() as String
|
|
private locations() as String
|
|
private bindingDialog as object
|
|
private helpDialog as object
|
|
'Couldn't get redim to work, so scriptDisplayList is and array of arrays
|
|
'where the one and only array in scriptDisplayList is an array
|
|
'of com.sun.star.beans.PropertyValue, where Name = [logicalName][FunctionName]
|
|
'and value is ScriptStorage object
|
|
private scriptDisplayList(0)
|
|
private testArray() as String
|
|
'Array to store lines from the xml file
|
|
private xmlFile() as string
|
|
'Name of the xml file [writer/calc][menubar/keybindings].xml
|
|
private xmlFileName as string
|
|
'Number of lines in the xml file
|
|
private numberOfLines as integer
|
|
|
|
'Parallel arrays to store all top-level menu names and line positions
|
|
private menuItems() as string
|
|
private menuItemLinePosition() as integer
|
|
'Counter for the number of top-level menus
|
|
private menuCount as integer
|
|
|
|
'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
|
|
'Counter for the number of sub-menus
|
|
private subMenuCount as integer
|
|
|
|
'Parallel arrays to store all script names and line positions
|
|
private scriptNames() as string
|
|
private scriptLinePosition() as integer
|
|
'Counter for the number of scripts
|
|
private scriptCount as integer
|
|
|
|
'Array to store all combinations of key bindings
|
|
private allKeyBindings() as string
|
|
|
|
'Array of Arrays
|
|
'KeyBindArrayOfArrays(0) contains array of "SHIFT + CONTROL + F Keys" data
|
|
'Similarly
|
|
'KeyBindArrayOfArrays(1) contains SHIFT + CONTROL + digits
|
|
'KeyBindArrayOfArrays(2) contains SHIFT + CONTROL + letters
|
|
'KeyBindArrayOfArrays(3) contains CONTROL + F keys
|
|
'KeyBindArrayOfArrays(4) contains CONTROL + digits
|
|
'KeyBindArrayOfArrays(5) contains CONTROL + letters
|
|
'KeyBindArrayOfArrays(6) contains SHIFT + F keys
|
|
private KeyBindArrayOfArrays(6)
|
|
|
|
'Each PropertyValue represents a key, Name member contains the script (if a binding exists)
|
|
' the Value contains and integer
|
|
' 0 means no script bound
|
|
' 1 script is bound to an office function
|
|
' >1 line number of entry in xmlfile array
|
|
private keyAllocationMap(6,25) as new com.sun.star.beans.PropertyValue
|
|
'array to store key group descriptions
|
|
private AllKeyGroupsArray(6) as String
|
|
|
|
|
|
'Array to store all event bindings for the Applications
|
|
private allEventTypesApp( 14 ) as new com.sun.star.beans.PropertyValue
|
|
'Array to store all event types
|
|
private allEventTypes( 14 ) as string
|
|
'Array to store textual description for all event types
|
|
private allEventTypesAsText( 14 ) as string
|
|
REM ------ Storage Refresh Function ------
|
|
|
|
|
|
sub RefreshUserScripts()
|
|
' TDB - change Menu bindings to allow user to refresh all, user, share or document script
|
|
RefreshAppScripts( "USER" )
|
|
end sub
|
|
|
|
sub RefreshAllScripts()
|
|
RefreshAppScripts( "USER" )
|
|
RefreshAppScripts( "SHARE" )
|
|
RefreshDocumentScripts
|
|
end sub
|
|
|
|
sub RefreshAppScripts( appName as String )
|
|
On Error Goto ErrorHandler
|
|
smgr = getProcessServiceManager()
|
|
context = smgr.getPropertyValue( "DefaultContext" )
|
|
scriptstoragemgr = context.getValueByName( "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager" )
|
|
|
|
scriptstoragemgr.refreshScriptStorage( appName )
|
|
|
|
Exit sub
|
|
|
|
ErrorHandler:
|
|
reset
|
|
MsgBox ("Error: Unable to refresh Java (scripts)" + chr$(10) + chr$(10)+ "Detail: " & error$ + chr$(10) + chr$(10)+ "Action: Please restart Office",0,"Error" )
|
|
|
|
end sub
|
|
|
|
sub RefreshDocumentScripts()
|
|
On Error Goto ErrorHandler
|
|
smgr = getProcessServiceManager()
|
|
context = smgr.getPropertyValue( "DefaultContext" )
|
|
scriptstoragemgr = context.getValueByName( "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager" )
|
|
|
|
oDocURL = ThisComponent.GetCurrentController.getModel.getURL
|
|
|
|
On Error Goto ErrorHandlerDoc
|
|
scriptstoragemgr.refreshScriptStorage( oDocURL )
|
|
|
|
Exit sub
|
|
|
|
ErrorHandlerDoc:
|
|
reset
|
|
' Ignore document script errors as it will happen when refreshing an unsaved doc
|
|
Exit sub
|
|
|
|
ErrorHandler:
|
|
reset
|
|
MsgBox ("Error: Unable to refresh Java (scripts)" + chr$(10) + chr$(10)+ "Detail: " & error$ + chr$(10) + chr$(10)+ "Action: Please restart Office",0,"Error" )
|
|
|
|
end sub
|
|
|
|
|
|
REM ----- Launch Functions -----
|
|
|
|
Sub createAndPopulateKeyArrays()
|
|
'Create SHIFT + CONTROL + F keys array
|
|
'Dim keyGroupProp as new com.sun.star.beans.PropertyValue
|
|
|
|
Dim SCFKey( 10 )
|
|
for FKey = 2 to 12
|
|
SCFKey( FKey - 2 ) = "SHIFT + CONTROL + F" + FKey
|
|
next FKey
|
|
|
|
KeyBindArrayOfArrays(0) = SCFKey()
|
|
|
|
'Create SHIFT + CONTROL + digits
|
|
Dim SCDKey( 9 )
|
|
for Digit = 0 to 9
|
|
SCDKey( Digit ) = "SHIFT + CONTROL + " + Digit
|
|
next Digit
|
|
KeyBindArrayOfArrays(1) = SCDKey()
|
|
|
|
'Create SHIFT + CONTROL + letters
|
|
|
|
Dim SCLKey( 25 )
|
|
for Alpha = 65 to 90
|
|
SCLKey( Alpha - 65 ) = "SHIFT + CONTROL + " + chr$( Alpha )
|
|
next Alpha
|
|
KeyBindArrayOfArrays(2) = SCLKey()
|
|
|
|
'Create CONTROL + F keys
|
|
Dim CFKey( 10 )
|
|
for FKey = 2 to 12
|
|
CFKey( Fkey - 2 ) = "CONTROL + F" + FKey
|
|
next FKey
|
|
KeyBindArrayOfArrays(3) = CFKey()
|
|
|
|
'Create CONTROL + digits
|
|
Dim CDKey( 9 )
|
|
for Digit = 0 to 9
|
|
CDKey( Digit ) = "CONTROL + " + Digit
|
|
next Digit
|
|
KeyBindArrayOfArrays(4) = CDKey()
|
|
|
|
'Create CONTROL + letters
|
|
Dim CLKey( 25 )
|
|
for Alpha = 65 to 90
|
|
CLKey( Alpha - 65 ) = "CONTROL + " + chr$( Alpha )
|
|
next Alpha
|
|
KeyBindArrayOfArrays(5) = CLKey()
|
|
|
|
'Create SHIFT + F Keys
|
|
Dim SFKey( 10 )
|
|
for FKey = 2 to 12
|
|
SFKey( Fkey - 2 ) = "SHIFT + F" + FKey
|
|
next FKey
|
|
KeyBindArrayOfArrays(6) = SFKey()
|
|
|
|
End Sub
|
|
|
|
Sub ExecuteKeyBinding()
|
|
createAndPopulateKeyArrays()
|
|
xmlFileName = GetDocumentType( "Key" )
|
|
|
|
if not (ReadXMLToArray( "Key" )) then
|
|
Exit Sub
|
|
endif
|
|
|
|
bindingDialog = LoadDialog( "ScriptBindingLibrary", "KeyBinding" )
|
|
PopulateKeyBindingList(0)
|
|
initialiseNavigationComboArrays()
|
|
PopulateLanguageCombo()
|
|
PopulateLocationCombo()
|
|
PopulateScriptList( languages(0), locations(0) )
|
|
PopulateTopLevelKeyBindingList()
|
|
bindingDialog.execute()
|
|
end Sub
|
|
|
|
|
|
Sub initialiseNavigationComboArrays()
|
|
locations = Array ( "User", "Share", "Document" )
|
|
ReDim languages(0) as String
|
|
languages(0) = "Java"
|
|
|
|
' Setup languages array for all supported languages
|
|
oServiceManager = GetProcessServiceManager()
|
|
svrArray = oServiceManager.getAvailableServiceNames
|
|
|
|
langCount = 1
|
|
for index = 0 to ubound(svrArray)
|
|
iPos = inStr(svrArray(index), "ScriptRuntimeFor")
|
|
iJava = inStr(svrArray(index), "ScriptRuntimeForJava")
|
|
|
|
if (iJava = 0) and (iPos > 0) then
|
|
lang = Mid(svrArray(index), iPos + Len("ScriptRuntimeFor")
|
|
|
|
'Add to language vector
|
|
ReDim Preserve languages(langCount) as String
|
|
languages(langCount) = lang
|
|
langCount = langCount +1
|
|
endif
|
|
next index
|
|
End Sub
|
|
|
|
|
|
Sub ExecuteEventBinding
|
|
createAllEventTypes()
|
|
createAllEventBindings()
|
|
|
|
if not (ReadXMLToArray( "Event" )) then
|
|
Exit Sub
|
|
endif
|
|
bindingDialog = LoadDialog( "ScriptBindingLibrary", "EventsBinding" )
|
|
initialiseNavigationComboArrays()
|
|
PopulateLanguageCombo()
|
|
PopulateLocationCombo()
|
|
PopulateScriptList( languages(0), locations(0) )
|
|
populateEventList( 0 )
|
|
EventListListener()
|
|
bindingDialog.execute()
|
|
End Sub
|
|
|
|
Sub ExecuteMenuBinding()
|
|
|
|
xmlFileName = GetDocumentType( "Menu" )
|
|
if not (ReadXMLToArray( "Menu" )) then
|
|
Exit Sub
|
|
endif
|
|
|
|
bindingDialog = LoadDialog( "ScriptBindingLibrary", "MenuBinding" )
|
|
initialiseNavigationComboArrays()
|
|
PopulateLanguageCombo()
|
|
PopulateLocationCombo()
|
|
PopulateScriptList( languages(0), locations(0) )
|
|
PopulateMenuCombo()
|
|
PopulateSubMenuList( 1 )
|
|
|
|
subMenuList = bindingDialog.getControl("SubMenuList")
|
|
|
|
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
|
|
'msgbox document.dbg_supportedinterfaces
|
|
Dim errornumber As Integer
|
|
errornumber = 111
|
|
Error errornumber
|
|
if document.SupportsService("com.sun.star.sheet.SpreadsheetDocument") then
|
|
if bindingType = "Key" then
|
|
GetDocumentType() = "calckeybinding.xml"
|
|
else
|
|
if bindingType = "Menu" then
|
|
GetDocumentType() = "calcmenubar.xml"
|
|
end if
|
|
end if
|
|
elseif document.SupportsService("com.sun.star.text.TextDocument") then
|
|
if bindingType = "Key" then
|
|
GetDocumentType() = "writerkeybinding.xml"
|
|
else
|
|
if bindingType = "Menu" then
|
|
GetDocumentType() = "writermenubar.xml"
|
|
end if
|
|
end if
|
|
elseif document.SupportsService("com.sun.star.presentation.PresentationDocument") then
|
|
if bindingType = "Key" then
|
|
GetDocumentType() = "impresskeybinding.xml"
|
|
else
|
|
if bindingType = "Menu" then
|
|
GetDocumentType() = "impressmenubar.xml"
|
|
end if
|
|
end if
|
|
elseif document.SupportsService("com.sun.star.presentation.PresentationDocument") then
|
|
if bindingType = "Key" then
|
|
GetDocumentType() = "impresskeybinding.xml"
|
|
else
|
|
if bindingType = "Menu" then
|
|
GetDocumentType() = "impressmenubar.xml"
|
|
end if
|
|
end if
|
|
elseif document.SupportsService("com.sun.star.drawing.DrawingDocument") then
|
|
if bindingType = "Key" then
|
|
GetDocumentType() = "drawkeybinding.xml"
|
|
else
|
|
if bindingType = "Menu" then
|
|
GetDocumentType() = "drawmenubar.xml"
|
|
end if
|
|
end if
|
|
else
|
|
MsgBox ("Error: Couldn't determine configuration file type" + chr$(10) + chr$(10) + "Action: Please reinstall Scripting Framework",0,"Error" )
|
|
end if
|
|
end function
|
|
|
|
function getScriptURI( selectedScript as String ) as String
|
|
combo = bindingDialog.getControl( "LocationCombo" )
|
|
location = combo.text
|
|
if ( location = "User" ) then
|
|
location = "user"
|
|
elseif ( location = "Share" ) then
|
|
location = "share"
|
|
else
|
|
location = "document"
|
|
end if
|
|
|
|
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() = "script://" + scriptInfo.getLogicalName + "?language=" + scriptInfo.getLanguage() + "+function=" + scriptInfo.getFunctionName() + "+location=" + location
|
|
|
|
end function
|
|
|
|
function GetOfficePath() as string
|
|
REM Error check and prompt user to manually input Office Path
|
|
settings = CreateUnoService( "com.sun.star.frame.Settings" )
|
|
path = settings.getByName( "PathSettings" )
|
|
unformattedOfficePath = path.getPropertyValue( "UserPath" )
|
|
|
|
dim officePath as string
|
|
const removeFromEnd = "/user"
|
|
const removeFromEndWindows = "\user"
|
|
|
|
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, "\" ) > 0
|
|
backSlash = instr( officePath, "\" )
|
|
startPath = mid( officePath, 1, backSlash - 1 )
|
|
endPath = mid( officePath, backslash + 1, len( officePath ) - backSlash )
|
|
officePath = startPath + "/" + endPath
|
|
wend
|
|
else
|
|
MsgBox ("Error: Office path not found" + chr$(10) + chr$(10) + "Action: Please reinstall Scripting Framework",0,"Error" )
|
|
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 = "Event" ) then
|
|
xmlfilename = "eventbindings.xml"
|
|
endif
|
|
|
|
simplefileaccess = CreateUnoService( "com.sun.star.ucb.SimpleFileAccess" )
|
|
filestream = simplefileaccess.openFileRead( "file://" + GetOfficePath() + "user/config/soffice.cfg/" + xmlFileName )
|
|
|
|
textin = CreateUnoService( "com.sun.star.io.TextInputStream" )
|
|
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 = "<menu:menu"
|
|
|
|
if bindingType = "Menu" then
|
|
evaluateForMenu( xmlline, lineCount )
|
|
elseif bindingType = "Key" then
|
|
processKeyXMLLine( lineCount, xmlline )
|
|
elseif bindingType = "Event" then
|
|
evaluateForEvent( xmlline, lineCount )
|
|
else
|
|
MsgBox ("Error: Couldn't determine file type" + chr$(10) + chr$(10) + "Action: Please reinstall Scripting Framework",0,"Error" )
|
|
end if
|
|
lineCount = lineCount + 1
|
|
loop
|
|
|
|
'Set global variable numberOfLines (lineCount is one too many at end of the loop)
|
|
numberOfLines = lineCount - 1
|
|
'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 ("Error: Unable to read Star Office configuration file - " + xmlFileName + chr$(10) + chr$(10) + "Action: Please reinstall Scripting Framework",0,"Error" )
|
|
ReadXMLToArray( ) = false
|
|
end function
|
|
|
|
|
|
|
|
sub evaluateForMenu( xmlline as string, lineCount as integer )
|
|
const menuItemWhiteSpace = 2
|
|
const menuXMLTag = "<menu:menu"
|
|
'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
|
|
'if the xml line identifies a script or SB macro
|
|
dim scriptProp as new com.sun.star.beans.PropertyValue
|
|
if instr( xmlline, "event:language=" + chr$(34) + "Script" ) > 0 then
|
|
|
|
eventName = ExtractEventNameFromXMLLine( xmlline )
|
|
scriptProp.Name = ExtractEventScriptFromXMLLine( xmlline )
|
|
scriptProp.Value = lineCount
|
|
|
|
elseif instr( xmlline, "event:language=" + chr$(34) + "StarBasic" ) > 0 then
|
|
eventName = ExtractEventNameFromXMLLine( xmlline )
|
|
scriptProp.Name = "Allocated to Office function"
|
|
scriptProp.Value = 1
|
|
end if
|
|
for n = 0 to ubound( allEventTypesApp() )
|
|
if ( eventName = allEventTypes( n ) ) then
|
|
allEventTypesApp( n ).Value = scriptProp
|
|
end if
|
|
next n
|
|
end sub
|
|
|
|
|
|
|
|
|
|
' returns 0 for Fkey
|
|
' 1 for digit
|
|
' 2 for letter
|
|
|
|
function getKeyTypeOffset( key as String ) as integer
|
|
length = Len( key )
|
|
if ( length > 1 ) then
|
|
getKeyTypeOffset() = 0
|
|
|
|
elseif ( key >= "0" AND key <= "9" ) then
|
|
getKeyTypeOffset() = 1
|
|
else
|
|
getKeyTypeOffset() = 2
|
|
end if
|
|
end function
|
|
|
|
function getKeyGroupIndex( key as String, offset as Integer ) as Integer
|
|
' Keys we are interested in are A - Z, F2 - F12, 0 - 9 anything else should
|
|
' ensure -1 is returned
|
|
cutKey = mid( key,2 )
|
|
|
|
if ( cutKey <> "" ) then
|
|
acode = asc ( mid( cutKey,1,1) )
|
|
if ( acode > 57 ) then
|
|
getKeyGroupIndex() = -1
|
|
exit function
|
|
end if
|
|
end if
|
|
|
|
select case offset
|
|
case 0:
|
|
num = cint( cutKey )
|
|
getKeyGroupIndex() = num - 2
|
|
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, "<accel:item" ) > 0 then
|
|
shift = false
|
|
control = false
|
|
if instr( xmlline, "accel:shift="+chr$(34)+"true"+chr$(34) ) > 0 then
|
|
shift = true
|
|
end if
|
|
if instr( xmlFile( lineCount ), "accel:mod1="+chr$(34)+"true"+chr$(34) ) > 0 then
|
|
control = true
|
|
end if
|
|
offsetIntoArrayOfArrays = 0 'default to "SHIFT + CONTROL" set of arrays
|
|
if ( control AND shift ) then
|
|
offsetIntoArrayOfArrays = 0
|
|
elseif ( control ) then
|
|
offsetIntoArrayOfArrays = 3
|
|
elseif ( shift ) then
|
|
offsetIntoArrayOfArrays = 6
|
|
endif
|
|
' Calculate which of the 7 key group arrays we need to point to
|
|
key = ExtractKeyCodeFromXMLLine( xmlline )
|
|
keyTypeOffset = getKeyTypeOffset( key )
|
|
offsetIntoArrayOfArrays = offsetIntoArrayOfArrays + keyTypeOffset
|
|
|
|
' Calculate from the key the offset into key group array we need to point to
|
|
KeyGroupIndex = getKeyGroupIndex( key, keyTypeOffset )
|
|
if ( KeyGroupIndex > -1 ) then
|
|
|
|
' Determine if a script framework binding is present or not
|
|
if instr( xmlline, "script://" ) > 0 then
|
|
' 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 = ""
|
|
|
|
end if
|
|
end if
|
|
end if
|
|
End Sub
|
|
|
|
Sub WriteXMLFromArray()
|
|
On Error Goto ErrorHandler
|
|
cfgFile = GetOfficePath() + "user/config/soffice.cfg/" + xmlFileName
|
|
updateCfgFile( cfgFile )
|
|
if ( false ) then' config stuff not in build yet
|
|
updateConfig( xmlFileName )
|
|
else
|
|
msgbox ("Office must be restarted before your changes will take effect."+ chr$(10)+"Also close the Office QuickStarter (Windows and Linux)", 48, "Assign Script (Java) To Menu" )
|
|
endif
|
|
Exit Sub
|
|
|
|
ErrorHandler:
|
|
reset
|
|
MsgBox ("Error: Unable to write to Star Office configuration file" + chr$(10) + "/" + GetOfficePath() + "user/config/soffice.cfg/" +xmlFileName + chr$(10) + chr$(10) + "Action: Please make sure you have write access to this file",0,"Error" )
|
|
end Sub
|
|
|
|
|
|
Sub UpdateCfgFile ( fileName as String )
|
|
dim FuncProvider as Object
|
|
dim Func as Object
|
|
dim args(0)
|
|
args(0) = ThisComponent
|
|
FuncProvider = createUnoService("drafts.com.sun.star.script.framework.provider.FunctionProvider")
|
|
FuncProvider.initialize( args() )
|
|
Func = FuncProvider.getFunction("script://ScriptFrmwrkHelper.updateCfgFile")
|
|
Dim inArgs(2)
|
|
Dim outArgs()
|
|
Dim outIndex()
|
|
dim localNumLines as integer
|
|
|
|
inArgs(0) = xmlFile()
|
|
inArgs(1) = fileName
|
|
inArgs(2) = numberOfLines
|
|
Func.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("com.sun.star.util.URLTransformer")
|
|
dim args1(0) as new com.sun.star.beans.PropertyValue
|
|
args1(0).Name = "StreamName"
|
|
args1(0).Value = a$
|
|
url.Complete = ".uno:UpdateConfiguration"
|
|
parser.parseStrict(url)
|
|
disp = document.queryDispatch(url,"",0)
|
|
disp.dispatch(url,args1())
|
|
|
|
End Sub
|
|
|
|
sub AddNewEventBindingDoc( scriptName as string, eventName as string )
|
|
dim properties( 1 ) as new com.sun.star.beans.PropertyValue
|
|
properties( 0 ).Name = "EventType"
|
|
properties( 0 ).Value = "Script"
|
|
properties( 1 ).Name = "URL"
|
|
properties( 1 ).Value = scriptName
|
|
|
|
eventSupplier = ThisComponent
|
|
'eventSupplier = StarDesktop.ActiveFrame.Controller.Model
|
|
nameReplace = eventSupplier.getEvents()
|
|
nameReplace.replaceByName( eventName, properties() )
|
|
end sub
|
|
|
|
|
|
sub AddNewEventBindingApp( scriptName as string, eventBinding as string )
|
|
|
|
for n = 0 to ubound( allEventTypesApp() )
|
|
if strcomp( allEventTypesApp( n ).Name, eventBinding, 1 ) = 0 then
|
|
dim scriptProp as new com.sun.star.beans.PropertyValue
|
|
scriptProp.Name = scriptName
|
|
scriptProp.Value = numberOfLines
|
|
allEventTypesApp( n ).Value = scriptProp
|
|
exit for
|
|
end if
|
|
next n
|
|
|
|
newline = " <event:event event:name=" + chr$(34) + eventBinding + chr$(34)
|
|
newline = newline + " event:language=" + chr$(34) + "Script" + chr$(34) + " xlink:href=" + chr$(34)
|
|
newline = newline + scriptName + chr$(34) + " xlink:type=" + chr$(34) + "simple" + chr$(34) + "/>"
|
|
|
|
'msgbox ( "numberOfLines is " + numberOfLines )
|
|
for n = 1 to numberOfLines
|
|
if n = numberOfLines then
|
|
'msgbox ( "Adding new line: " + newline + " " + n)
|
|
'msgbox ( "Adding last line: </event:events>"+ n )
|
|
xmlFile( n ) = newline
|
|
xmlFile( n + 1 ) = "</event:events>"
|
|
exit for
|
|
else
|
|
'msgbox ( "Adding line: " + xmlFile( n )+ " " + n )
|
|
xmlFile( n ) = xmlFile( n )
|
|
end if
|
|
next n
|
|
numberOfLines = numberOfLines + 1
|
|
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 <= 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 ), "<menu:menupopup>" ) > 0 ) then
|
|
indent = GetMenuWhiteSpace( xmlFile( newLinePosition + 1 ) )
|
|
newXmlFile( lineCounter ) = xmlFile( lineCounter )
|
|
newXmlFile( lineCounter + 1 ) = ( indent + "<menu:menuitem menu:id="+chr$(34) + newScript + chr$(34)+" menu:helpid="+chr$(34)+"1929"+chr$(34)+" menu:label="+chr$(34)+ newMenuLabel + chr$(34)+"/>" )
|
|
else
|
|
indent = GetMenuWhiteSpace( xmlFile( newLinePosition - 1 ) )
|
|
newXmlFile( lineCounter ) = ( indent + "<menu:menuitem menu:id="+chr$(34) + newScript + chr$(34)+" menu:helpid="+chr$(34)+"1929"+chr$(34)+" menu:label="+chr$(34)+ newMenuLabel + chr$(34)+"/>" )
|
|
newXmlFile( lineCounter + 1 ) = xmlFile( lineCounter )
|
|
end if
|
|
REM added -1 for debug -->
|
|
' indent = GetMenuWhiteSpace( xmlFile( newLinePosition ) )
|
|
' newXmlFile( lineCounter ) = ( indent + "<menu:menuitem menu:id="+chr$(34)+"script://" + newScript + chr$(34)+" menu:helpid="+chr$(34)+"1929"+chr$(34)+" menu:label="+chr$(34)+ newMenuLabel + chr$(34)+"/>" )
|
|
' 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 = " <accel:item accel:code="+chr$(34)+"KEY_" + key +chr$(34)
|
|
if shift then
|
|
keyCombo = "SHIFT + "
|
|
newLine = newLine + " accel:shift="+chr$(34)+"true"+chr$(34)
|
|
end if
|
|
if control then
|
|
keyCombo = keyCombo + "CONTROL + "
|
|
newLine = newLine + " accel:mod1="+chr$(34)+"true"+chr$(34)
|
|
end if
|
|
keyCombo = keyCombo + key
|
|
newLine = newLine + " xlink:href="+chr$(34)+ scriptName +chr$(34) +"/>"
|
|
|
|
if ( control AND shift ) then
|
|
offsetIntoArrayOfArrays = 0
|
|
elseif ( control ) then
|
|
offsetIntoArrayOfArrays = 3
|
|
elseif ( shift ) then
|
|
offsetIntoArrayOfArrays = 6
|
|
endif
|
|
|
|
keyTypeOffset = getKeyTypeOffset( key )
|
|
offsetIntoArrayOfArrays = offsetIntoArrayOfArrays + keyTypeOffset
|
|
' Calculate from the key the offset into key group array we need to point to
|
|
KeyGroupIndex = getKeyGroupIndex( key, keyTypeOffset )
|
|
|
|
' if key is allready allocated to a script then just reallocate
|
|
if ( keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value > 1 ) then
|
|
|
|
keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Name = scriptName
|
|
'replace line in xml file
|
|
xmlFile( keyAllocationMap( offsetIntoArrayOfArrays, KeyGroupIndex ).Value ) = newLine
|
|
else
|
|
' 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 ) = "</accel:acceleratorlist>"
|
|
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 ) = ""
|
|
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
|
|
else
|
|
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( "LanguageCombo" )
|
|
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()
|
|
locCombo = bindingDialog.getControl( "LocationCombo" )
|
|
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( "ScriptList" )
|
|
scriptList.removeItems( 0, scriptList.getItemCount() )
|
|
|
|
smgr = getProcessServiceManager()
|
|
context = smgr.getPropertyValue( "DefaultContext" )
|
|
scriptstoragemgr = context.getValueByName( "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager" )
|
|
scriptLocationURI = "USER"
|
|
if ( loc = "Share" ) then
|
|
scriptLocationURI = "SHARE"
|
|
elseif ( loc = "Document" )then
|
|
document = StarDesktop.ActiveFrame.Controller.Model
|
|
scriptLocationURI = document.getURL()
|
|
endif
|
|
scriptStorageID = scriptstoragemgr.getScriptStorageID( scriptLocationURI )
|
|
if ( scriptStorageID > -1 ) then
|
|
storage = scriptstoragemgr.getScriptStorage( scriptStorageID )
|
|
implementations() = storage.getAllImplementations()
|
|
length = UBOUND( implementations() )
|
|
|
|
if ( length > -1 ) then
|
|
dim tempDisplayList( length ) as new com.sun.star.beans.PropertyValue
|
|
for n = LBOUND( implementations() ) to UBOUND( implementations() )
|
|
if ( lang = implementations( n ).getLanguage() ) then
|
|
if ( detailedView ) then
|
|
tempDisplayList( n ).Name = implementations( n ).getLogicalName() + " [" + implementations( n ).getFunctionName() + "]"
|
|
tempDisplayList( n ).Value = implementations( n )
|
|
else
|
|
tempDisplayList( n ).Name = implementations( n ).getLogicalName()
|
|
tempDisplayList( n ).Value = implementations( n )
|
|
endif
|
|
scriptList.addItem( tempDisplayList( n ).Name, n )
|
|
endif
|
|
next n
|
|
endif
|
|
ScriptDisplayList(0) = tempDisplayList()
|
|
endif
|
|
scriptList.selectItemPos( 0, true )
|
|
|
|
end sub
|
|
|
|
sub PopulateMenuCombo()
|
|
menuComboBox = bindingDialog.getControl( "MenuCombo" )
|
|
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 = "<menu:menu"
|
|
subMenuCount = 1
|
|
|
|
REM xmlStartLine and xmlEndLine refer to the first and last lines
|
|
' 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 ), "menupopup") = 0 then
|
|
subMenuIndent = GetMenuWhiteSpace( xmlFile( lineNumber ) )
|
|
if subMenuIndent = " " then
|
|
subMenuIndent = ""
|
|
else
|
|
subMenuIndent = subMenuIndent + subMenuIndent
|
|
end if
|
|
if not( instr( xmlFile( lineNumber ), "menuseparator" ) = 0 ) then
|
|
subMenuItems( subMenuCount ) = subMenuIndent + "----------------"
|
|
else
|
|
subMenuName = ExtractLabelFromXMLLine( xmlFile( lineNumber ) )
|
|
REM Add script Name if there is one bound to menu item
|
|
if instr( xmlFile( lineNumber ), "script://" ) > 0 then
|
|
script = ExtractScriptIdFromXMLLine( xmlFile( lineNumber ) )
|
|
subMenuItems( subMenuCount ) = ( subMenuIndent + subMenuName + " [" + script + "]" )
|
|
else
|
|
subMenuItems( subMenuCount ) = subMenuIndent + subMenuName
|
|
end if
|
|
end if
|
|
subMenuItemLinePosition( subMenuCount ) = lineNumber
|
|
subMenuCount = subMenuCount + 1
|
|
end if
|
|
next lineNumber
|
|
|
|
subMenuList = bindingDialog.getControl( "SubMenuList" )
|
|
|
|
currentPosition = subMenuList.getSelectedItemPos()
|
|
|
|
subMenuList.removeItems( 0, subMenuList.getItemCount() )
|
|
'If there are no sub-menus i.e. a dynamically generated menu like Format
|
|
if subMenuCount = 1 then
|
|
subMenuList.addItem( "Unable to Assign Scripts to this menu", 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) = "SHIFT + CONTROL + F keys"
|
|
allKeyGroupsArray(1) = "SHIFT + CONTROL + digits"
|
|
allKeyGroupsArray(2) = "SHIFT + CONTROL + letters"
|
|
allKeyGroupsArray(3) = "CONTROL + F keys"
|
|
allKeyGroupsArray(4) = "CONTROL + digits"
|
|
allKeyGroupsArray(5) = "CONTROL + letters"
|
|
allKeyGroupsArray(6) = "SHIFT + F keys"
|
|
|
|
keyCombo = bindingDialog.getControl( "KeyCombo" )
|
|
keyCombo.removeItems( 0, keyCombo.getItemCount() )
|
|
for n = LBOUND( allKeyGroupsArray() ) to UBOUND( allKeyGroupsArray() )
|
|
|
|
keyCombo.addItem( allKeyGroupsArray( n ), n )
|
|
next n
|
|
keyCombo.text = keyCombo.getItem( 0 )
|
|
end sub
|
|
|
|
sub PopulateKeyBindingList( keyGroupIndex as Integer )
|
|
keyList = bindingDialog.getControl( "KeyList" )
|
|
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 + " [Allocated to Office function]"
|
|
|
|
elseif ( keyAllocationMap( keyGroupIndex, n ).Value > 1 ) then
|
|
keyName = keyName + " " + keyAllocationMap( keyGroupIndex, n ).Name
|
|
endif
|
|
keyList.addItem( keyName, n )
|
|
next n
|
|
|
|
if ( selectedPos <> -1 )then
|
|
keyList.selectItemPos( selectedPos, true )
|
|
else
|
|
keyList.selectItemPos( 0, true )
|
|
end if
|
|
KeyListListener()
|
|
end sub
|
|
|
|
sub populateEventList( focusPosition as integer )
|
|
on error goto ErrorHandler
|
|
|
|
allApps = bindingDialog.getControl( "AllAppsOption" )
|
|
eventList = bindingDialog.getControl( "EventList" )
|
|
eventList.removeItems( 0, eventList.getItemCount() )
|
|
|
|
' use allEventTypes() to fill list box
|
|
' for each element compare with allEventTypesApp
|
|
|
|
if allApps.state = true then ' Application event
|
|
for n = 0 to ubound( allEventTypesAsText() )
|
|
stringToAdd = ""
|
|
scriptProp = allEventTypesApp( n ).Value
|
|
' If the line number is 1 then SB macro
|
|
' more than 1 it is the line number of the script
|
|
if ( scriptProp.Value = 1 ) then
|
|
stringToAdd = stringToAdd + " [Allocated to Office function]"
|
|
elseif ( scriptProp.Value > 1 ) then
|
|
stringToAdd = stringToAdd + " [" + scriptProp.Name + "]"
|
|
end if
|
|
eventList.addItem( allEventTypesAsText( n ) + " " + stringToAdd, n )
|
|
next n
|
|
else 'Document event
|
|
for n = 0 to ubound( allEventTypes() )
|
|
displayLine = allEventTypesAsText( n )
|
|
eventSupplier = ThisComponent
|
|
scriptProps = eventSupplier.getEvents().getByName( allEventTypes( n ) )
|
|
if ( UBOUND( scriptProps ) > 0 ) then
|
|
if ( UBOUND( scriptProps ) = 2 ) then
|
|
' Starbasic script
|
|
displayLine = displayLine + " [Allocated to Office function]"
|
|
else
|
|
displayLine = displayLine + " [" + scriptProps(1).Value + "]"
|
|
end if
|
|
end if
|
|
eventList.addItem( displayLine, n ) 'add doc event info later
|
|
next n
|
|
|
|
end if
|
|
|
|
eventList.selectItemPos( focusPosition, true )
|
|
Exit Sub
|
|
|
|
' eventProps is undefined if there are no event bindings in the doc
|
|
ErrorHandler:
|
|
reset
|
|
for n = 0 to ubound( allEventTypesAsText() )
|
|
eventList.addItem( allEventTypesAsText(n), 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 ) = "SHIFT + CONTROL + F" + FKey
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next FKey
|
|
for Digit = 0 to 9
|
|
allKeyBindings( keyBindingPosition ) = "SHIFT + CONTROL + " + Digit
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next Digit
|
|
for Alpha = 65 to 90
|
|
allKeyBindings( keyBindingPosition ) = "SHIFT + CONTROL + " + chr$( Alpha )
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next Alpha
|
|
|
|
for FKey = 2 to 12
|
|
allKeyBindings( keyBindingPosition ) = "CONTROL + F" + FKey
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next FKey
|
|
for Digit = 0 to 9
|
|
allKeyBindings( keyBindingPosition ) = "CONTROL + " + Digit
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next Digit
|
|
for Alpha = 65 to 90
|
|
allKeyBindings( keyBindingPosition ) = "CONTROL + " + chr$( Alpha )
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next Alpha
|
|
|
|
for FKey = 2 to 12
|
|
allKeyBindings( keyBindingPosition ) = "SHIFT + F" + FKey
|
|
keyBindingPosition = keyBindingPosition + 1
|
|
next FKey
|
|
end sub
|
|
|
|
|
|
sub createAllEventTypes()
|
|
allEventTypes( 0 ) = "OnStartApp"
|
|
allEventTypes( 1 ) = "OnCloseApp"
|
|
allEventTypes( 2 ) = "OnNew"
|
|
allEventTypes( 3 ) = "OnLoad"
|
|
allEventTypes( 4 ) = "OnSaveAs"
|
|
allEventTypes( 5 ) = "OnSaveAsDone"
|
|
allEventTypes( 6 ) = "OnSave"
|
|
allEventTypes( 7 ) = "OnSaveDone"
|
|
allEventTypes( 8 ) = "OnPrepareUnload"
|
|
allEventTypes( 9 ) = "OnUnload"
|
|
allEventTypes( 10 ) = "OnFocus"
|
|
allEventTypes( 11 ) = "OnUnfocus"
|
|
allEventTypes( 12 ) = "OnPrint"
|
|
allEventTypes( 13 ) = "OnError"
|
|
allEventTypes( 14 ) = "OnNewMail"
|
|
|
|
allEventTypesAsText(0) = "Start Application"
|
|
allEventTypesAsText(1) = "Close Application"
|
|
allEventTypesAsText(2) = "Create Document"
|
|
allEventTypesAsText(3) = "Open Document"
|
|
allEventTypesAsText(4) = "Save Document As"
|
|
allEventTypesAsText(5) = "Document has been saved as"
|
|
allEventTypesAsText(6) = "Save Document"
|
|
allEventTypesAsText(7) = "Document has been saved"
|
|
allEventTypesAsText(8) = "Close Document"
|
|
allEventTypesAsText(9) = "Close Document"
|
|
allEventTypesAsText(10) = "Activate document"
|
|
allEventTypesAsText(11) = "DeActivate document"
|
|
allEventTypesAsText(12) = "Print Document"
|
|
allEventTypesAsText(13) = "JavaScript Error"
|
|
allEventTypesAsText(14) = "Message received"
|
|
|
|
end sub
|
|
|
|
|
|
sub createAllEventBindings()
|
|
dim props as new com.sun.star.beans.PropertyValue
|
|
props.Name = ""
|
|
props.Value = 0
|
|
|
|
' Creates all types of event bindings for both Application and Document
|
|
' Initially both arrays have no bindings allocated to the events
|
|
allEventTypesApp( 0 ).Name = "OnStartApp"
|
|
allEventTypesApp( 0 ).Value = props
|
|
|
|
allEventTypesApp( 1 ).Name = "OnCloseApp"
|
|
allEventTypesApp( 1 ).Value = props
|
|
|
|
allEventTypesApp( 2 ).Name = "OnNew"
|
|
allEventTypesApp( 2 ).Value = props
|
|
|
|
allEventTypesApp( 3 ).Name = "OnLoad"
|
|
allEventTypesApp( 3 ).Value = props
|
|
|
|
allEventTypesApp( 4 ).Name = "OnSaveAs"
|
|
allEventTypesApp( 4 ).Value = props
|
|
|
|
allEventTypesApp( 5 ).Name = "OnSaveAsDone"
|
|
allEventTypesApp( 5 ).Value = props
|
|
|
|
allEventTypesApp( 6 ).Name = "OnSave"
|
|
allEventTypesApp( 6 ).Value = props
|
|
|
|
allEventTypesApp( 7 ).Name = "OnSaveDone"
|
|
allEventTypesApp( 7 ).Value = props
|
|
|
|
allEventTypesApp( 8 ).Name = "OnPrepareLoad"
|
|
allEventTypesApp( 8 ).Value = props
|
|
|
|
allEventTypesApp( 9 ).Name = "OnUnload"
|
|
allEventTypesApp( 9 ).Value = props
|
|
|
|
allEventTypesApp( 10 ).Name = "OnFocus"
|
|
allEventTypesApp( 10 ).Value = props
|
|
|
|
allEventTypesApp( 11 ).Name = "OnUnfocus"
|
|
allEventTypesApp( 11 ).Value = props
|
|
|
|
allEventTypesApp( 12 ).Name = "OnPrint"
|
|
allEventTypesApp( 12 ).Value = props
|
|
|
|
allEventTypesApp( 13 ).Name = "OnError"
|
|
allEventTypesApp( 13 ).Value = props
|
|
|
|
allEventTypesApp( 14 ).Name = "OnNewMail"
|
|
allEventTypesApp( 14 ).Value = props
|
|
end sub
|
|
|
|
|
|
REM ----- Text Handling Functions -----
|
|
|
|
|
|
function ExtractLabelFromXMLLine( XMLLine as string ) as string
|
|
labelStart = instr( XMLLine, "label="+chr$(34)) + 7
|
|
labelEnd = instr( XMLLine, chr$(34)+">" )
|
|
if labelEnd = 0 then
|
|
labelEnd = instr( XMLLine, chr$(34)+"/>" )
|
|
end if
|
|
labelLength = labelEnd - labelStart
|
|
|
|
menuLabelUnformatted = mid( XMLLine, labelStart, labelLength )
|
|
tildePosition = instr( menuLabelUnformatted, "~" )
|
|
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, "script://") + 9
|
|
if instr( XMLLine, chr$(34)+" menu:helpid=" ) = 0 then
|
|
idEnd = instr( XMLLIne, "?location=" )
|
|
else
|
|
idEnd = instr( XMLLine, ""+chr$(34)+" menu:helpid=" )
|
|
end if
|
|
idLength = idEnd - idStart
|
|
scriptId = mid( XMLLine, idStart, idLength )
|
|
|
|
ExtractScriptIdFromXMLLine() = scriptId
|
|
end function
|
|
|
|
function ExtractEventScriptFromXMLLine( xmlline as string )
|
|
if instr( xmlline, "script://" ) > 0 then
|
|
idStart = instr( xmlline, "script://") + 9
|
|
idEnd = instr( xmlline, chr$(34)+" xlink:type=" )
|
|
idLength = idEnd - idStart
|
|
scriptId = mid( xmlline, idStart, idLength )
|
|
end if
|
|
ExtractEventScriptFromXMLLine() = scriptId
|
|
end function
|
|
|
|
|
|
function ExtractEventNameFromXMLLine( xmlline as string )
|
|
idStart = instr( xmlline, "event:name=" + chr$(34) ) + 12
|
|
idEnd = instr( xmlline, chr$(34)+" event:language" )
|
|
idLength = idEnd - idStart
|
|
event = mid( xmlline, idStart, idLength )
|
|
'msgbox ( "event: " + event )
|
|
|
|
ExtractEventNameFromXMLLine() = event
|
|
end function
|
|
|
|
function ExtractKeyCodeFromXMLLine( XMLLine as string ) as string
|
|
keyStart = instr( XMLLine, "code="+chr$(34)+"KEY_") + 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 = ""
|
|
numberOfSpaces = instr( MenuXMLLine, "<" ) - 1
|
|
for i = 1 to numberOfSpaces
|
|
whiteSpace = whiteSpace + " "
|
|
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 < subMenuCount
|
|
|
|
linePosition = subMenuItemLinePosition( count )
|
|
|
|
if not( instr( xmlFile( linePosition ), "script://" ) = 0 ) then
|
|
Allocated = true
|
|
end if
|
|
|
|
isAllocatedMenuItem() = Allocated
|
|
end Function
|
|
|
|
|
|
function HasShiftKey( keyCombo ) as boolean
|
|
if instr( keyCombo, "SHIFT" ) = 0 then
|
|
hasShift = false
|
|
else
|
|
hasShift = true
|
|
end if
|
|
|
|
HasShiftKey = hasShift
|
|
end function
|
|
|
|
|
|
function HasControlKey( keyCombo ) as boolean
|
|
if instr( keyCombo, "CONTROL" ) = 0 then
|
|
hasControl = false
|
|
else
|
|
hasControl = true
|
|
end if
|
|
|
|
HasControlKey = hasControl
|
|
end function
|
|
|
|
|
|
function ExtractKeyFromCombo( keyString as string ) as string
|
|
while not( instr( keyString, "+" ) = 0 )
|
|
removeTo = instr( keyString, "+ " ) + 2
|
|
keyString = mid( keyString, removeTo, ( len( keyString ) - removeTo ) + 1 )
|
|
wend
|
|
ExtractKeyFromCombo() = keyString
|
|
end function
|
|
|
|
|
|
|
|
REM ------ Event Handling Functions (Listeners) ------
|
|
|
|
|
|
sub KeyListListener()
|
|
keyShortCutList = bindingDialog.getControl( "KeyList" )
|
|
selectedShortCut = keyShortCutList.getSelectedItem()
|
|
combo = bindingDialog.getControl( "KeyCombo" )
|
|
|
|
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 > 1 then
|
|
bindingDialog.Model.Delete.enabled = true
|
|
bindingDialog.Model.AddOn.enabled = true
|
|
bindingDialog.Model.NewButton.enabled = true
|
|
|
|
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
|
|
bindingDialog.Model.NewButton.enabled = true
|
|
end if
|
|
end if
|
|
end sub
|
|
|
|
|
|
sub SubMenuListListener()
|
|
scriptList = bindingDialog.getControl( "ScriptList" )
|
|
subMenuList = bindingDialog.getControl( "SubMenuList" )
|
|
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
|
|
|
|
|
|
'Populates the SubMenuList with the appropriate menu items from the Top-level menu selected from the combo box
|
|
sub MenuComboListener()
|
|
combo = bindingDialog.getControl( "MenuCombo" )
|
|
newToplevelMenu = combo.text
|
|
counter = 0
|
|
do
|
|
counter = counter + 1
|
|
loop while not( newToplevelMenu = menuItems( counter ) )
|
|
|
|
PopulateSubMenuList( counter )
|
|
end sub
|
|
|
|
sub LangLocComboListener()
|
|
combo = bindingDialog.getControl( "LanguageCombo" )
|
|
language = combo.text
|
|
combo = bindingDialog.getControl( "LocationCombo" )
|
|
location = combo.text
|
|
PopulateScriptList( language,location )
|
|
|
|
'Enable/disable Assign button
|
|
scriptList = bindingDialog.getControl( "ScriptList" )
|
|
if scriptList.getSelectedItem() = "" then
|
|
bindingDialog.Model.NewButton.enabled = false
|
|
else
|
|
bindingDialog.Model.NewButton.enabled = true
|
|
end if
|
|
end sub
|
|
|
|
|
|
'Populates the KeyList with the appropriate key combos from the Top-level key group selected from the combo box
|
|
sub KeyComboListener()
|
|
combo = bindingDialog.getControl( "KeyCombo" )
|
|
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( "ScriptList" )
|
|
selectedScript = menuScriptList.getSelectedItem()
|
|
'if the SubMenuList is from a dynamically created menu (e.g. Format)
|
|
'or if the Menu Label text box is empty
|
|
subMenuList = bindingDialog.getControl( "SubMenuList" )
|
|
firstItem = subMenuList.getItem( 0 )
|
|
if bindingDialog.Model.MenuLabelBox.text = "" OR firstItem = "Unable to Assign Scripts to this menu" OR selectedScript = "" 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( "EventList" )
|
|
eventPos = eventList.getSelectedItemPos()
|
|
|
|
allApps = bindingDialog.getControl( "AllAppsOption" )
|
|
if allApps.state = true then
|
|
'if the name is blank then the event is unassigned or assigned to a macro
|
|
binding = allEventTypesApp( eventPos ).Value.Value
|
|
|
|
if ( binding > 1 ) then
|
|
bindingDialog.Model.Delete.enabled = true
|
|
else
|
|
bindingDialog.Model.Delete.enabled = false
|
|
end if
|
|
else
|
|
event = allEventTypes( eventPos )
|
|
'if doc bindings
|
|
'sequence through doc bindings using api
|
|
'when find matching event - see if script or macro
|
|
dim prop as new com.sun.star.beans.PropertyValue
|
|
eventSupplier = StarDesktop.ActiveFrame.Controller.Model
|
|
scriptProps = eventSupplier.getEvents().getByName( event )
|
|
'msgbox ("listener scriptprops has " + UBOUND( scriptProps ) + "elems")
|
|
if ( UBOUND( scriptProps ) >= 0 ) then
|
|
if ( UBOUND( scriptProps ) = 2 ) then
|
|
' Starbasic script
|
|
bindingDialog.Model.Delete.enabled = false
|
|
else
|
|
bindingDialog.Model.Delete.enabled = true
|
|
end if
|
|
else
|
|
bindingDialog.Model.Delete.enabled = false
|
|
end if
|
|
end if
|
|
|
|
exit sub
|
|
|
|
ErrorHandler:
|
|
reset
|
|
'msgbox ( "EventListListener: ErrorHandler called" )
|
|
bindingDialog.Model.Delete.enabled = false
|
|
|
|
end sub
|
|
|
|
|
|
REM ------ Event Handling Functions (Buttons) ------
|
|
|
|
|
|
sub MenuOKButton()
|
|
WriteXMLFromArray()
|
|
bindingDialog.endExecute()
|
|
end sub
|
|
|
|
|
|
sub MenuCancelButton()
|
|
bindingDialog.endExecute()
|
|
end sub
|
|
|
|
|
|
sub MenuHelpButton()
|
|
helpDialog = LoadDialog( "ScriptBindingLibrary", "HelpBinding" )
|
|
helpDialog.execute()
|
|
end sub
|
|
|
|
|
|
sub MenuDeleteButton()
|
|
subMenuList = bindingDialog.getControl( "SubMenuList" )
|
|
linePos = subMenuItemLinePosition( subMenuList.getSelectedItemPos() + 1 )
|
|
|
|
RemoveBinding( linePos )
|
|
|
|
REM Update the top-level menu's line positions
|
|
combo = bindingDialog.getControl( "MenuCombo" )
|
|
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( "ScriptList" )
|
|
selectedScript = menuScriptList.getSelectedItem()
|
|
scriptURI = getScriptURI( selectedScript )
|
|
newMenuLabel = bindingDialog.Model.MenuLabelBox.text
|
|
|
|
subMenuList = bindingDialog.getControl( "SubMenuList" )
|
|
|
|
REM Update the top-level menu's line positions
|
|
combo = bindingDialog.getControl( "MenuCombo" )
|
|
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 KeyOKButton()
|
|
WriteXMLFromArray()
|
|
bindingDialog.endExecute()
|
|
end sub
|
|
|
|
|
|
sub KeyCancelButton()
|
|
bindingDialog.endExecute()
|
|
end sub
|
|
|
|
|
|
sub KeyHelpButton()
|
|
helpDialog = LoadDialog( "ScriptBindingLibrary", "HelpBinding" )
|
|
helpDialog.execute()
|
|
end sub
|
|
|
|
|
|
sub KeyNewButton()
|
|
combo = bindingDialog.getControl( "KeyCombo" )
|
|
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( "ScriptList" )
|
|
script = menuScriptList.getSelectedItem()
|
|
scriptURI = getScriptURI( script )
|
|
|
|
keyList = bindingDialog.getControl( "KeyList" )
|
|
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( "KeyList" )
|
|
selectedShortCut = keyShortCutList.getSelectedItem()
|
|
combo = bindingDialog.getControl( "KeyCombo" )
|
|
|
|
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 = ""
|
|
RemoveBinding( linePosition )
|
|
KeyComboListener()
|
|
end sub
|
|
|
|
|
|
sub EventNewButton()
|
|
eventScriptList = bindingDialog.getControl( "ScriptList" )
|
|
selectedScript = eventScriptList.getSelectedItem()
|
|
scriptURI = getScriptURI( selectedScript )
|
|
eventList = bindingDialog.getControl( "EventList" )
|
|
eventPosition = eventList.getSelectedItemPos()
|
|
event = allEventTypes( eventPosition )
|
|
'msgbox ( "script is: " + scriptLogical + " and event is " + event )
|
|
|
|
allApps = bindingDialog.getControl( "AllAppsOption" )
|
|
if allApps.state = true then 'Application
|
|
AddNewEventBindingApp( scriptURI, event )
|
|
else 'Document
|
|
AddNewEventBindingDoc( scriptURI, event )
|
|
end if
|
|
|
|
populateEventList( eventPosition )
|
|
EventListListener()
|
|
end sub
|
|
|
|
|
|
sub EventDeleteButton()
|
|
eventList = bindingDialog.getControl( "EventList" )
|
|
REM Check that combo is a script
|
|
eventPosition = eventList.getSelectedItemPos()
|
|
|
|
allApps = bindingDialog.getControl( "AllAppsOption" )
|
|
if allApps.state = true then 'Application
|
|
eventProp = allEventTypesApp( eventPosition ).Value
|
|
linePosition = eventProp.Value
|
|
eventProp.Name = ""
|
|
eventProp.Value = 0
|
|
allEventTypesApp( eventPosition ).Value = eventProp
|
|
RemoveBinding( linePosition )
|
|
else 'Document
|
|
DeleteEvent( allEventTypes( eventPosition ) )
|
|
end if
|
|
|
|
PopulateEventList( eventPosition )
|
|
EventListListener()
|
|
|
|
end sub
|
|
|
|
sub HelpOKButton()
|
|
helpDialog.endExecute()
|
|
end sub
|
|
|
|
sub DeleteEvent( 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("com.sun.star.util.URLTransformer")
|
|
dim args(0) as new com.sun.star.beans.PropertyValue
|
|
args(0).Name = ""
|
|
args(0).Value = event
|
|
url.Complete = "script://ScriptFrmwrkHelper.removeEvent"
|
|
parser.parseStrict(url)
|
|
disp = document.queryDispatch(url,"",0)
|
|
disp.dispatch(url,args())
|
|
end sub
|
|
|
|
</script:module> |