create dialog runtime Josef Frysak How to create a dialog at runtime?

Every element in a dialog and the dialog itself are Control Model objects.

Therefore create a "UnoControlDialogModel" which represents a dialog window.

It is able to hold other Control Models like the "UnoControlFixedTextModel"

or the "UnoControlButtonModel", which can be created using the

"XMultiServiceFactory" interface of the dialog. After creating these elements

they must be added to the dialog by creating a control object of the

dialog and using its "XControlContainer" interface. Also create a Toolkit

service and with it create a Windowpeer for the dialog. Next create a new

"Frame" object and use it to initiate the previously created windowpeer. This

will allow the dialog to close properly.

To notice the interaction with the user (i.e.: pressing the button) of a

ooRexx macro, it is also necessary to register specific listeners to the

corresponding elements. The interaction events can then be retrieved by

calling "bsf.pollEventText()" function.

For further details see http://wi.wu-wien.ac.at/rgf/diplomarbeiten/BakkStuff/2008/200809_Frysak/200809_Frysak_Automating_OOo_ooRexx_Nutshells.pdf.

-- try to get a script context, will be .nil, if script was not invoked by OOo x_ScriptContext = uno.getScriptContext() if (x_ScriptContext <> .nil) then do -- invoked by OOo as a macro -- get context x_ComponentContext = x_ScriptContext~getComponentContext -- get desktop (an XDesktop) x_Desktop = x_ScriptContext~getDesktop -- get current document x_Document = x_ScriptContext~getDocument end else do -- called from outside of OOo, create a connection -- connect to Open Office and get component context x_ComponentContext = UNO.connect() -- create a desktop service and its interface service = "{%see com.sun.star.frame.Desktop}" s_Desktop = x_ComponentContext~getServiceManager~{%see com.sun.star.lang.XMultiServiceFactory%XMultiServiceFactory}~createInstance(service) x_Desktop = s_Desktop~{%see com.sun.star.frame.XDesktop%XDesktop} -- get the last active document x_Document = x_Desktop~getCurrentComponent() end /* *********************************** * Dialog Window *********************************** */ x_MultiServiceFactory = x_ComponentContext~getServiceManager()~{%see com.sun.star.lang.XMultiServiceFactory%XMultiServiceFactory} o_Dialog = x_MultiServiceFactory~createInstance("{%see com.sun.star.awt.UnoControlDialogModel}") o_Dialog.Properties = o_Dialog~{%see com.sun.star.beans.XPropertySet%XPropertyset} o_Dialog.Properties~setPropertyValue("PositionX", box("int", 64)) o_Dialog.Properties~setPropertyValue("PositionY", box("int", 64)) o_Dialog.Properties~setPropertyValue("Width", box("int", 256)) o_Dialog.Properties~setPropertyValue("Height", box("int", (128-8))) o_Dialog.Properties~setPropertyValue("Title", "How much do you like ooRexx?") o_Dialog.Factory = o_Dialog~{%see com.sun.star.lang.XMultiServiceFactory%XMultiServiceFactory} o_Dialog.Container = o_Dialog~{%see com.sun.star.container.XNameContainer%XNameContainer} o_Dialog.Control = x_MultiServiceFactory~createInstance("{%see com.sun.star.awt.UnoControlDialog}")~{%see com.sun.star.awt.XControl%XControl} o_Dialog.Control~setModel(o_Dialog~{%see com.sun.star.awt.XControlModel%XControlModel}) o_Dialog.ControlContainer = o_Dialog.Control~{%see com.sun.star.awt.XControlContainer%XControlContainer} s_Toolkit = x_MultiServiceFactory~createInstance("{%see com.sun.star.awt.Toolkit}") x_Toolkit = s_Toolkit~{%see com.sun.star.awt.XToolkit%XToolkit} o_Dialog.Control~createPeer(x_Toolkit, .nil) -- needed to let the Dialog dispose, if just displayed but not executed s_Frame = x_MultiServiceFactory~createInstance("{%see com.sun.star.frame.Frame}") x_Frame = s_Frame~{%see com.sun.star.frame.XFrame%XFrame} x_Frame~initialize(o_Dialog.Control~{%see com.sun.star.awt.XWindow%XWindow}) /* *********************************** * Label1 *********************************** */ o_Label1 = o_Dialog.Factory~createInstance("{%see com.sun.star.awt.UnoControlFixedTextModel}") o_Label1.Properties = o_Label1~{%see com.sun.star.beans.XPropertySet%XPropertySet} o_Label1.Properties~setPropertyValue("PositionX", box("int", 8)) o_Label1.Properties~setPropertyValue("PositionY", box("int", 40)) o_Label1.Properties~setPropertyValue("Width", box("int", (256-16))) o_Label1.Properties~setPropertyValue("Height", box("int", 32)) o_Label1.Properties~setPropertyValue("Name", "Label1") o_Label1.Properties~setPropertyValue("TabIndex", box("short", 1)) o_Label1.Properties~setPropertyValue("Label", "Prefix1") o_Dialog.Container~insertByName("Label1", o_Label1); /* *********************************** * Button1 *********************************** */ o_Button1 = o_Dialog.Factory~createInstance("{%see com.sun.star.awt.UnoControlButtonModel}") o_Button1.Properties = o_Button1~{%see com.sun.star.beans.XPropertySet%XPropertySet} o_Button1.Properties~setPropertyValue("PositionX", box("int", 8)) o_Button1.Properties~setPropertyValue("PositionY", box("int", 8)) o_Button1.Properties~setPropertyValue("Width", box("int", (256-16))) o_Button1.Properties~setPropertyValue("Height", box("int", 32)) o_Button1.Properties~setPropertyValue("Name", "Button1") o_Button1.Properties~setPropertyValue("TabIndex", box("short", 0)) o_Button1.Properties~setPropertyValue("Label", "Click Me") o_Dialog.Container~insertByName("Button1", o_Button1); o_Button1.Control = o_Dialog.ControlContainer~getControl("Button1") -- o_Button1.Control~{%see com.sun.star.awt.XButton%XButton}~bsf.addEventListener("action", "", "noAction") o_Button1.Control~{%see com.sun.star.awt.XButton%XButton}~bsf.addEventListener("action", "actionPerformed","Action") o_Button1.Control~{%see com.sun.star.awt.XButton%XButton}~bsf.addEventListener("action", "disposing", "close") -- change mouse pointer apperance, whilst moving over label -- define cursortypes CursorWait = bsf.getConstant("{%see com.sun.star.awt.SystemPointer}", "WAIT") CursorGo = bsf.getConstant("{%see com.sun.star.awt.SystemPointer}", "ARROW") -- change cursortype s_Pointer = x_MultiServiceFactory~createInstance("{%see com.sun.star.awt.Pointer}") x_Pointer = s_Pointer~{%see com.sun.star.awt.XPointer%XPointer} cursorstate = 1 -- do not call "o_Dialog.Control~XDialog~execute()" otherwise -- you do not have instant Listener report o_Dialog.Control~{%see com.sun.star.awt.XWindow%XWindow}~setVisible(.true) -- .bsf.dialog~messageBox(output, "Currently Selected Text:", "information") -- call Syssleep 1 do forever -- somehow not calling Syssleep will create an error when calling this makro -- by menu: tools -> macros -> run macro call Syssleep 0.5 eventText=bsf.pollEventText(100) -- timeout of 100/1000 sec if eventText="close" then leave; -- disposed if eventText="Action" then do if cursorstate then do x_Pointer~SetType(CursorWait) o_Button1.Control~getPeer()~setPointer(x_Pointer) cursorstate = 0 end else do x_Pointer~SetType(CursorGo) o_Button1.Control~getPeer()~setPointer(x_Pointer) cursorstate = 1 end end end o_Dialog.Control~{%see com.sun.star.lang.XComponent%XComponent}~dispose() ::requires UNO.CLS
Initial version