import com.sun.star.awt.XExtendedToolkit; import com.sun.star.awt.XWindow; import com.sun.star.awt.XWindowPeer; import com.sun.star.awt.XToolkit; import com.sun.star.awt.KeyEvent; import com.sun.star.awt.XKeyHandler; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.bridge.XUnoUrlResolver; import com.sun.star.frame.XController; import com.sun.star.frame.XComponentLoader; import com.sun.star.frame.XDesktop; import com.sun.star.frame.XFrame; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.lang.XComponent; import com.sun.star.lang.EventObject; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextViewCursor; import com.sun.star.text.XTextViewCursorSupplier; import com.sun.star.text.XTextCursor; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; public class OODocument implements XKeyHandler { private XController xController = null; private XTextViewCursor xViewCursor = null; private XWindow xWindow = null; private XExtendedToolkit myExtToolkit = null; private XTextDocument xTextDocument; private XTextCursor insertCursor; private XComponentContext xRemoteContext = null; private XMultiComponentFactory xRemoteServiceManager = null; public static void main( String[] args ) { new OODocument(); } public OODocument() { try { xRemoteServiceManager = getRemoteServiceManager("uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager"); // get the Desktop, we need its XComponentLoader interface to load a // new document Object desktop = xRemoteServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", xRemoteContext); // query the XComponentLoader interface from the desktop XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop); // get a XDesktop-implementing "view" to desktop XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, desktop); PropertyValue[] loadProps = new PropertyValue[0]; XComponent xTextComponent = xComponentLoader.loadComponentFromURL( "private:factory/swriter", "_blank", 0, loadProps); xTextDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xTextComponent); XFrame xFrame = xDesktop.getCurrentFrame(); xWindow = xFrame.getComponentWindow(); xWindow.addEventListener(this); xController = xFrame.getController(); XTextViewCursorSupplier xViewCursorSupplier = (XTextViewCursorSupplier) UnoRuntime.queryInterface( XTextViewCursorSupplier.class, xController ); xViewCursor = xViewCursorSupplier.getViewCursor(); insertCursor = xTextDocument.getText().createTextCursor(); XWindowPeer MyWindowPeer = (XWindowPeer) UnoRuntime.queryInterface (XWindowPeer.class, xWindow); XToolkit MyToolkit = MyWindowPeer.getToolkit(); myExtToolkit = (XExtendedToolkit) UnoRuntime.queryInterface (XExtendedToolkit.class, MyToolkit); myExtToolkit.addKeyHandler(this); } catch ( Exception e ) { System.err.println( e ); } } /** * XKeyHandler * gets called with each key the user presses */ public boolean keyPressed( KeyEvent event ) { //System.out.println( "Key " + event.KeyChar + " at position " + position ); //System.out.println( "char: " + event.KeyChar + ", code: " + event.KeyCode + ", func: " + event.KeyFunc ); XTextViewCursorSupplier xViewCursorSupplier = (XTextViewCursorSupplier) UnoRuntime.queryInterface( XTextViewCursorSupplier.class, xController ); XTextViewCursor xViewCursor = xViewCursorSupplier.getViewCursor(); XTextCursor modelCursor = xViewCursor.getText().createTextCursorByRange(xViewCursor); modelCursor.gotoStart(true); int position = modelCursor.getString().length(); // do some stuff here instead of just sleeping try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { } System.out.println( event.KeyChar + " at position " + position ); return false; } public boolean keyReleased( KeyEvent event ) { //System.out.println( "keyReleased got KeyEvent:\nCode: " + event.KeyCode + "\nChar: " + event.KeyChar + "\nFunc: " + event.KeyFunc ); return false; } /** * XEventListener */ public void disposing( EventObject source ) { // OOo document got closed -> exit System.out.println( "Got disposing event from " + source ); System.out.println( "Will disconnect and exit. Bye!" ); System.exit( 0 ); } private XMultiComponentFactory getRemoteServiceManager(String unoUrl) throws java.lang.Exception { if (xRemoteContext == null) { // First step: create local component context, get local // servicemanager and // ask it to create a UnoUrlResolver object with an XUnoUrlResolver // interface XComponentContext xLocalContext = com.sun.star.comp.helper.Bootstrap .createInitialComponentContext(null); XMultiComponentFactory xLocalServiceManager = xLocalContext .getServiceManager(); Object urlResolver = xLocalServiceManager .createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", xLocalContext); // query XUnoUrlResolver interface from urlResolver object XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime .queryInterface(XUnoUrlResolver.class, urlResolver); // Second step: use xUrlResolver interface to import the remote // StarOffice.ServiceManager, // retrieve its property DefaultContext and get the remote // servicemanager Object initialObject = xUnoUrlResolver.resolve(unoUrl); XPropertySet xPropertySet = (XPropertySet) UnoRuntime .queryInterface(XPropertySet.class, initialObject); Object context = xPropertySet.getPropertyValue("DefaultContext"); xRemoteContext = (XComponentContext) UnoRuntime.queryInterface( XComponentContext.class, context); } return xRemoteContext.getServiceManager(); } }