diff options
Diffstat (limited to '')
9 files changed, 1149 insertions, 0 deletions
diff --git a/extensions/qa/integration/extensions/ComponentFactory.java b/extensions/qa/integration/extensions/ComponentFactory.java new file mode 100644 index 000000000..ec848c4df --- /dev/null +++ b/extensions/qa/integration/extensions/ComponentFactory.java @@ -0,0 +1,93 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package integration.extensions; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.lang.XSingleComponentFactory; +import java.lang.reflect.Constructor; + +public class ComponentFactory implements XSingleComponentFactory +{ + private final Class m_handlerClass; + private Constructor m_defaultConstructor; + private Constructor m_initConstructor; + + public ComponentFactory( Class _handlerClass ) + { + m_handlerClass = _handlerClass; + + Class objectArrayClass = null; + try + { + objectArrayClass = Class.forName("[Ljava.lang.Object;"); + } + catch ( java.lang.ClassNotFoundException e ) { } + + Constructor ctors[] = _handlerClass.getConstructors(); + for ( int i = 0; i < ctors.length; ++i) + { + Class ctorParams[] = ctors[i].getParameterTypes(); + if ( ( ctorParams.length == 1 ) && ( ctorParams[0].equals( XComponentContext.class ) ) ) + m_defaultConstructor = ctors[i]; + if ( ( ctorParams.length == 2 ) + && ( ctorParams[0].equals( XComponentContext.class ) ) + && ( ctorParams[1].equals( objectArrayClass ) ) + ) + m_initConstructor = ctors[i]; + } + if ( m_defaultConstructor == null ) + throw new java.lang.IllegalArgumentException(); + } + + private Object ipml_createInstance( Constructor _ctor, Object[] _arguments ) + { + Object newInstance = null; + try + { + newInstance = _ctor.newInstance( _arguments ); + } + catch( InstantiationException e ) + { + System.err.println( "InstantiationException: Could not instantiate an instance of " + m_handlerClass.getName() ); + } + catch( IllegalAccessException e ) + { + System.err.println( "IllegalAccessException: Could not instantiate an instance of " + m_handlerClass.getName() ); + } + catch( java.lang.reflect.InvocationTargetException e ) + { + System.err.println( "InvocationTargetException: Could not instantiate an instance of " + m_handlerClass.getName() ); + } + return newInstance; + } + + public Object createInstanceWithArgumentsAndContext(Object[] _arguments, XComponentContext _componentContext) throws com.sun.star.uno.Exception + { + if ( m_initConstructor != null ) + return ipml_createInstance( m_initConstructor, new Object[] { _componentContext, _arguments } ); + else + return createInstanceWithContext( _componentContext ); + } + + public Object createInstanceWithContext(XComponentContext _componentContext) throws com.sun.star.uno.Exception + { + return ipml_createInstance( m_defaultConstructor, new Object[] { _componentContext } ); + } +} + diff --git a/extensions/qa/integration/extensions/ConsoleWait.java b/extensions/qa/integration/extensions/ConsoleWait.java new file mode 100644 index 000000000..34fdaa7c0 --- /dev/null +++ b/extensions/qa/integration/extensions/ConsoleWait.java @@ -0,0 +1,120 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package integration.extensions; + +import com.sun.star.uno.*; +import com.sun.star.lang.XComponent; + +public class ConsoleWait implements com.sun.star.lang.XEventListener +{ + private final Object m_disposable; + + /** a helper class which waits for a console ENTER key event in a dedicated thread, + and notifies a ConsoleWait object if this event happened + */ + private class WaitForEnter extends java.lang.Thread + { + private final ConsoleWait m_toNotify; + private boolean m_done; + + public WaitForEnter( ConsoleWait _toNotify ) + { + m_toNotify = _toNotify; + m_done = false; + } + + public boolean isDone() + { + return m_done; + } + + @Override + public void run() + { + try + { + System.out.println( "\npress enter to exit" ); + System.in.read(); + + m_done = true; + // notify that the user pressed the key + synchronized ( m_toNotify ) + { + m_toNotify.notify(); + } + } + catch( java.lang.Exception e ) + { + // not really interested in + System.err.println( e ); + } + } + } + + /** creates a ConsoleWait instance + * @param _disposable + * a component whose disposal should be monitored. When this component dies, + * the ConsoleWait also returns from a waitForConsole call, even if the user + * did not yet press the enter key + */ + public ConsoleWait( Object _disposable ) + { + m_disposable = _disposable; + XComponent component = UnoRuntime.queryInterface( XComponent.class, _disposable ); + if ( component != null ) + component.addEventListener( this ); + } + + /** waits for the user to press the ENTER key (on the console where she started the java program) + or the disposable component to be closed by the user. + @return + TRUE if the user pressed a key on the console, FALSE if she closed the document + */ + public boolean waitForUserInput() throws java.lang.Exception + { + synchronized (this) + { + WaitForEnter keyWaiter = new WaitForEnter( this ); + keyWaiter.start(); + wait(); + + // if the waiter thread is done, the user pressed enter + boolean bKeyPressed = keyWaiter.isDone(); + if ( !bKeyPressed ) + keyWaiter.interrupt(); + + return bKeyPressed; + } + } + + /* ------------------------------------------------------------------ */ + /* XEventListener overridables */ + /* ------------------------------------------------------------------ */ + public void disposing( com.sun.star.lang.EventObject eventObject ) + { + if ( eventObject.Source.equals( m_disposable ) ) + { + // notify ourself that we can stop waiting for user input + synchronized (this) + { + notify(); + } + } + } +} diff --git a/extensions/qa/integration/extensions/Frame.java b/extensions/qa/integration/extensions/Frame.java new file mode 100644 index 000000000..15f26de74 --- /dev/null +++ b/extensions/qa/integration/extensions/Frame.java @@ -0,0 +1,215 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package integration.extensions; + +import com.sun.star.uno.*; +import com.sun.star.frame.*; +import com.sun.star.task.XStatusIndicatorFactory; +import com.sun.star.util.XCloseable; + +/** + * wraps the com.sun.star.frame.Frame service + */ +public class Frame implements XDispatchProvider, + XDispatchProviderInterception, + XFramesSupplier, + XStatusIndicatorFactory, + XCloseable +{ + private XFrame m_frame; + private XDispatchProvider m_dispatchProvider; + private XDispatchProviderInterception m_dispatchProviderInterception; + private XFramesSupplier m_framesSupplier; + private XStatusIndicatorFactory m_statusIndicatorFactory; + private XCloseable m_closeable; + + /** Creates a new instance of Frame */ + public Frame( Object _frameComponent ) + { + if ( _frameComponent != null ) + { + m_frame = UnoRuntime.queryInterface( XFrame.class, _frameComponent ); + m_dispatchProvider = UnoRuntime.queryInterface( XDispatchProvider.class, _frameComponent ); + m_dispatchProviderInterception = UnoRuntime.queryInterface( XDispatchProviderInterception.class, _frameComponent ); + m_framesSupplier = UnoRuntime.queryInterface( XFramesSupplier.class, _frameComponent ); + m_statusIndicatorFactory = UnoRuntime.queryInterface( XStatusIndicatorFactory.class, _frameComponent ); + m_closeable = UnoRuntime.queryInterface( XCloseable.class, _frameComponent ); + } + } + + public XFrame getXFrame() + { + return m_frame; + } + + public void activate() + { + m_frame.activate(); + } + + public void addEventListener(com.sun.star.lang.XEventListener _eventListener) + { + m_frame.addEventListener( _eventListener ); + } + + public void addFrameActionListener(XFrameActionListener _frameActionListener) + { + m_frame.addFrameActionListener( _frameActionListener ); + } + + public void contextChanged() + { + m_frame.contextChanged(); + } + + public com.sun.star.task.XStatusIndicator createStatusIndicator() + { + return m_statusIndicatorFactory.createStatusIndicator(); + } + + public void deactivate() + { + m_frame.deactivate(); + } + + public void dispose() + { + m_frame.dispose(); + } + + public XFrame findFrame(String str, int param) + { + return m_frame.findFrame( str, param ); + } + + public XFrame getActiveFrame() + { + return m_framesSupplier.getActiveFrame(); + } + + public com.sun.star.awt.XWindow getComponentWindow() + { + return m_frame.getComponentWindow(); + } + + public com.sun.star.awt.XWindow getContainerWindow() + { + return m_frame.getContainerWindow(); + } + + public XController getController() + { + return m_frame.getController(); + } + + public XFramesSupplier getCreator() + { + return m_frame.getCreator(); + } + + public XFrames getFrames() + { + return m_framesSupplier.getFrames(); + } + + public String getName() + { + return m_frame.getName(); + } + + public void initialize(com.sun.star.awt.XWindow _window) + { + m_frame.initialize( _window ); + } + + public boolean isActive() + { + return m_frame.isActive(); + } + + public boolean isTop() + { + return m_frame.isTop(); + } + + public XDispatch queryDispatch(com.sun.star.util.URL _url, String _str, int _param) + { + return m_dispatchProvider.queryDispatch( _url, _str, _param ); + } + + public XDispatch[] queryDispatches(DispatchDescriptor[] dispatchDescriptor) + { + return m_dispatchProvider.queryDispatches( dispatchDescriptor ); + } + + public void registerDispatchProviderInterceptor(XDispatchProviderInterceptor _dispatchProviderInterceptor) + { + m_dispatchProviderInterception.registerDispatchProviderInterceptor( _dispatchProviderInterceptor ); + } + + public void releaseDispatchProviderInterceptor(XDispatchProviderInterceptor _dispatchProviderInterceptor) + { + m_dispatchProviderInterception.releaseDispatchProviderInterceptor( _dispatchProviderInterceptor ); + } + + public void removeEventListener(com.sun.star.lang.XEventListener _eventListener) + { + m_frame.removeEventListener( _eventListener ); + } + + public void removeFrameActionListener(XFrameActionListener _frameActionListener) + { + m_frame.removeFrameActionListener( _frameActionListener ); + } + + public void setActiveFrame(XFrame _frame) + { + m_framesSupplier.setActiveFrame( _frame ); + } + + public boolean setComponent(com.sun.star.awt.XWindow _window, XController _controller) + { + return m_frame.setComponent( _window, _controller ); + } + + public void setCreator(XFramesSupplier _framesSupplier) + { + m_frame.setCreator( _framesSupplier ); + } + + public void setName(String str) + { + m_frame.setName( str ); + } + + public void close(boolean _deliverOwnership) throws com.sun.star.util.CloseVetoException + { + m_closeable.close( _deliverOwnership ); + } + + public void removeCloseListener(com.sun.star.util.XCloseListener _closeListener) + { + m_closeable.removeCloseListener( _closeListener ); + } + + public void addCloseListener(com.sun.star.util.XCloseListener _closeListener) + { + m_closeable.addCloseListener( _closeListener ); + } +} diff --git a/extensions/qa/integration/extensions/HelpTextProvider.java b/extensions/qa/integration/extensions/HelpTextProvider.java new file mode 100644 index 000000000..8bd6596bc --- /dev/null +++ b/extensions/qa/integration/extensions/HelpTextProvider.java @@ -0,0 +1,58 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package integration.extensions; + +import com.sun.star.inspection.XObjectInspectorUI; +import com.sun.star.inspection.XPropertyControl; +import com.sun.star.inspection.XPropertyControlObserver; +import com.sun.star.lang.NoSupportException; + +/** displays help text for the currently selected method + */ +public class HelpTextProvider implements XPropertyControlObserver +{ + private final XObjectInspectorUI m_inspectorUI; + + /** + * Creates a new instance of HelpTextProvider + */ + public HelpTextProvider( XObjectInspectorUI _inspectorUI ) + { + m_inspectorUI = _inspectorUI; + m_inspectorUI.registerControlObserver( this ); + } + + public void focusGained( XPropertyControl _propertyControl ) + { + try + { + String helpText = "here could be the help for:\n"; + helpText += _propertyControl.getValue().toString(); + m_inspectorUI.setHelpSectionText( helpText ); + } + catch (NoSupportException ex) + { + ex.printStackTrace(); + } + } + + public void valueChanged( XPropertyControl _propertyControl ) + { + // not interested in + } +} diff --git a/extensions/qa/integration/extensions/MethodHandler.java b/extensions/qa/integration/extensions/MethodHandler.java new file mode 100644 index 000000000..ffc81c5f5 --- /dev/null +++ b/extensions/qa/integration/extensions/MethodHandler.java @@ -0,0 +1,217 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package integration.extensions; + +import com.sun.star.uno.*; +import com.sun.star.beans.*; +import com.sun.star.reflection.*; +import com.sun.star.inspection.*; + +public class MethodHandler implements XPropertyHandler +{ + private XIntrospection m_introspection; + private XIdlMethod[] m_methods; + private java.util.HashMap<String,XIdlMethod> m_methodsHash; + + /** Creates a new instance of MethodHandler */ + public MethodHandler( XComponentContext _context ) + { + m_methodsHash = new java.util.HashMap<String,XIdlMethod>(); + + try + { + m_introspection = UnoRuntime.queryInterface( XIntrospection.class, + _context.getServiceManager().createInstanceWithContext( "com.sun.star.beans.Introspection", _context ) + ); + } + catch( com.sun.star.uno.Exception e ) + { + System.err.println( "MethodHandler: could not create an Introspection service, not much functionality will be available." ); + } + } + + + + public void actuatingPropertyChanged(String _propertyName, Object _newValue, Object _oldValue, com.sun.star.inspection.XObjectInspectorUI _objectInspectorUI, boolean _firstTimeInit) throws com.sun.star.lang.NullPointerException + { + // not interested in + } + + public void addEventListener(com.sun.star.lang.XEventListener _eventListener) + { + // ignoring this + } + + public void addPropertyChangeListener(com.sun.star.beans.XPropertyChangeListener _propertyChangeListener) throws com.sun.star.lang.NullPointerException + { + // ignoring this + } + + public Object convertToControlValue(String _propertyName, Object _propertyValue, com.sun.star.uno.Type type) throws com.sun.star.beans.UnknownPropertyException + { + return _propertyValue; + } + + public Object convertToPropertyValue(String _propertyName, Object _controlValue) throws com.sun.star.beans.UnknownPropertyException + { + return _controlValue; + } + + public com.sun.star.inspection.LineDescriptor describePropertyLine(String _propertyName, com.sun.star.inspection.XPropertyControlFactory _propertyControlFactory) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.NullPointerException + { + com.sun.star.inspection.LineDescriptor descriptor = new com.sun.star.inspection.LineDescriptor(); + + descriptor = new LineDescriptor(); + descriptor.Category = "Methods"; + descriptor.DisplayName = "has method"; + descriptor.HasPrimaryButton = descriptor.HasSecondaryButton = false; + descriptor.IndentLevel = 0; + try + { + XPropertyControl control = UnoRuntime.queryInterface( + XPropertyControl.class, _propertyControlFactory.createPropertyControl( + PropertyControlType.TextField, true ) ); + + descriptor.Control = control; + } + catch( com.sun.star.lang.IllegalArgumentException e ) + { + } + return descriptor; + } + + public void dispose() + { + // nothing to do + } + + public String[] getActuatingProperties() + { + // none + return new String[] { }; + } + + public com.sun.star.beans.PropertyState getPropertyState(String _propertyName) throws com.sun.star.beans.UnknownPropertyException + { + return com.sun.star.beans.PropertyState.DIRECT_VALUE; + } + + public Object getPropertyValue(String _propertyName) throws com.sun.star.beans.UnknownPropertyException + { + XIdlMethod method = impl_getMethod( _propertyName ); + + String signature = ""; + signature += method.getReturnType().getName(); + signature += " "; + signature += method.getName(); + + signature += "("; + + XIdlClass[] parameterTypes = method.getParameterTypes(); + for ( int param = 0; param<parameterTypes.length; ++param ) + { + signature += ( param == 0 ) ? " " : ", "; + signature += parameterTypes[param].getName(); + } + + signature += " )"; + return signature; + } + + public String[] getSupersededProperties() + { + return new String[] { }; + } + + public com.sun.star.beans.Property[] getSupportedProperties() + { + Property[] properties = new Property[] { }; + if ( m_methods != null ) + { + properties = new Property[ m_methods.length ]; + for ( int i=0; i<m_methods.length; ++i ) + { + properties[i] = new Property( m_methods[i].getName(), 0, new Type( String.class ), (short)0 ); + m_methodsHash.put( m_methods[i].getName(), m_methods[i] ); + } + } + return properties; + } + + public void inspect(Object _component) throws com.sun.star.lang.NullPointerException + { + if ( m_introspection == null ) + return; + + m_methods = null; + m_methodsHash = new java.util.HashMap<String,XIdlMethod>(); + + XIntrospectionAccess introspectionAccess = m_introspection.inspect( _component ); + if ( introspectionAccess == null ) + return; + + m_methods = introspectionAccess.getMethods( MethodConcept.ALL ); + } + + public boolean isComposable(String _propertyName) throws com.sun.star.beans.UnknownPropertyException + { + return true; + } + + public com.sun.star.inspection.InteractiveSelectionResult onInteractivePropertySelection(String str, boolean param, Object[] obj, com.sun.star.inspection.XObjectInspectorUI xObjectInspectorUI) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.NullPointerException + { + return InteractiveSelectionResult.Cancelled; + } + + public void removeEventListener(com.sun.star.lang.XEventListener _eventListener) + { + // ignoring this + } + + public void removePropertyChangeListener(com.sun.star.beans.XPropertyChangeListener _propertyChangeListener) + { + // ignoring this + } + + public void setPropertyValue(String str, Object obj) throws com.sun.star.beans.UnknownPropertyException + { + // we declared our properties as readonly + throw new java.lang.RuntimeException(); + } + + public boolean suspend(boolean param) + { + return true; + } + + /** returns the descriptor for the method with the given name + * @param _propertyName + * the name of the method whose descriptor should be obtained + * @throws com.sun.star.beans.UnknownPropertyException + * if we don't have a method hash, or the given property name does not denote a method of our inspectee + */ + private XIdlMethod impl_getMethod( String _methodName ) throws UnknownPropertyException + { + XIdlMethod method = m_methodsHash.get( _methodName ); + if ( method == null ) + throw new com.sun.star.beans.UnknownPropertyException(); + + return method; + } +} diff --git a/extensions/qa/integration/extensions/ObjectInspector.java b/extensions/qa/integration/extensions/ObjectInspector.java new file mode 100644 index 000000000..2b2fa4e0a --- /dev/null +++ b/extensions/qa/integration/extensions/ObjectInspector.java @@ -0,0 +1,159 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package integration.extensions; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XMultiServiceFactory; + +import com.sun.star.frame.*; +import com.sun.star.inspection.*; +import com.sun.star.beans.*; + +public class ObjectInspector extends complexlib.ComplexTestCase +{ + private XComponentContext m_context; + private XMultiServiceFactory m_orb; + private Frame m_desktop; + + static final private String m_inspectorFrameName = "ObjectInspector"; + + /* ------------------------------------------------------------------ */ + @Override + public String[] getTestMethodNames() + { + return new String[] { + "interactiveObjectInspector" + }; + } + + /* ------------------------------------------------------------------ */ + @Override + public String getTestObjectName() + { + return "Test Skeleton"; + } + + /* ------------------------------------------------------------------ */ + public void before() throws com.sun.star.uno.Exception, java.lang.Exception + { + m_orb = param.getMSF(); + m_context = UnoRuntime.queryInterface( XComponentContext.class, + UnoRuntime.queryInterface( XPropertySet.class, m_orb ).getPropertyValue( "DefaultContext" ) ); + m_desktop = new Frame( m_orb.createInstance( "com.sun.star.frame.Desktop" ) ); + } + + /* ------------------------------------------------------------------ */ + public void after() throws java.lang.Exception + { + closeExistentInspector(); + } + + /* ------------------------------------------------------------------ */ + public void interactiveObjectInspector() throws com.sun.star.uno.Exception, java.lang.Exception + { + closeExistentInspector(); + + // the to-be-inspected object + XFrame inspectee = m_desktop.getActiveFrame(); + + // the inspector + XObjectInspector inspector = createObjectInspector(); + + // do inspect + inspector.inspect( new Object[] { inspectee } ); + + ConsoleWait keyWaiter = new ConsoleWait( inspector ); + keyWaiter.waitForUserInput(); + } + + /* ------------------------------------------------------------------ */ + private XObjectInspector createObjectInspector() throws com.sun.star.uno.Exception + { + com.sun.star.awt.XWindow floatingWindow = createFloatingWindow(); + + Frame inspectorFrame = new Frame( m_orb.createInstance( "com.sun.star.frame.Frame" ) ); + inspectorFrame.setName( m_inspectorFrameName ); + inspectorFrame.initialize( floatingWindow ); + m_desktop.getFrames().append( inspectorFrame.getXFrame() ); + + // handler factories: + Object[] handlerFactories = new Object[] { + "com.sun.star.inspection.GenericPropertyHandler", + new ComponentFactory( ServicesHandler.class ), + new ComponentFactory( MethodHandler.class ) + }; + // a model + XObjectInspectorModel model = ObjectInspectorModel.createWithHandlerFactoriesAndHelpSection( + m_context, handlerFactories, 4, 4 ); + + // create the ObjectInspector + XObjectInspector inspector = com.sun.star.inspection.ObjectInspector.createWithModel( + m_context, model ); + + // add an observer which will emit help texts + new HelpTextProvider( inspector.getInspectorUI() ); + + // plug it into the frame + inspector.attachFrame( inspectorFrame.getXFrame() ); + + // make the window visible + floatingWindow.setVisible( true ); + + // outta here + return inspector; + } + + /* ------------------------------------------------------------------ */ + private void closeExistentInspector() + { + Frame existentInspectorFrame = new Frame( m_desktop.findFrame( m_inspectorFrameName, 255 ) ); + try + { + existentInspectorFrame.close( true ); + } + catch( com.sun.star.util.CloseVetoException e ) + { + failed( "could not close the existent inspector frame" ); + } + } + + /* ------------------------------------------------------------------ */ + private com.sun.star.awt.XWindow createFloatingWindow() throws com.sun.star.uno.Exception + { + com.sun.star.awt.XToolkit toolkit = UnoRuntime.queryInterface( + com.sun.star.awt.XToolkit.class, m_orb.createInstance( "com.sun.star.awt.Toolkit" ) ); + + com.sun.star.awt.WindowDescriptor windowDescriptor = new com.sun.star.awt.WindowDescriptor(); + windowDescriptor.Type = com.sun.star.awt.WindowClass.TOP; + windowDescriptor.WindowServiceName = "modelessdialog"; // "floatingwindow" would need a parent + windowDescriptor.ParentIndex = -1; + //windowDescriptor.Parent = null; + + windowDescriptor.Bounds = new com.sun.star.awt.Rectangle( 500, 100, 400, 600 ); + windowDescriptor.WindowAttributes = com.sun.star.awt.WindowAttribute.BORDER + + com.sun.star.awt.WindowAttribute.MOVEABLE + + com.sun.star.awt.WindowAttribute.SIZEABLE + + com.sun.star.awt.WindowAttribute.CLOSEABLE + + com.sun.star.awt.VclWindowPeerAttribute.CLIPCHILDREN; + + return UnoRuntime.queryInterface( com.sun.star.awt.XWindow.class, + toolkit.createWindow( windowDescriptor ) ); + } +} diff --git a/extensions/qa/integration/extensions/ServicesHandler.java b/extensions/qa/integration/extensions/ServicesHandler.java new file mode 100644 index 000000000..c84e128e8 --- /dev/null +++ b/extensions/qa/integration/extensions/ServicesHandler.java @@ -0,0 +1,212 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package integration.extensions; + +import com.sun.star.uno.*; +import com.sun.star.beans.*; +import com.sun.star.inspection.*; +import com.sun.star.frame.*; +import com.sun.star.lang.XServiceInfo; + +public class ServicesHandler implements XPropertyHandler +{ + private final XComponentContext m_context; + private String[] m_supportedServices; + + private static class ClickHandler implements com.sun.star.awt.XActionListener + { + XComponentContext m_context; + private final String m_serviceName; + + public ClickHandler( XComponentContext _context, String _serviceName ) + { + m_context = _context; + m_serviceName = _serviceName; + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + // not interested in + } + + public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent) + { + try + { + // translate the service name into a URL to dispatch + String documentationURL = "https://api.libreoffice.org/docs/common/ref/" + m_serviceName.replace('.','/') + ".html"; + System.out.println( documentationURL ); + + // the OpenHyperlink command, to be dispatched to the Desktop + com.sun.star.util.URL dispatchURL[] = { new com.sun.star.util.URL() }; + dispatchURL[0].Complete = ".uno:OpenHyperlink"; + com.sun.star.util.XURLTransformer transformer = UnoRuntime.queryInterface( + com.sun.star.util.XURLTransformer.class, + m_context.getServiceManager().createInstanceWithContext( "com.sun.star.util.URLTransformer", m_context ) ); + transformer.parseStrict( dispatchURL ); + + // the dispatcher for the OpenHyperlink command + Frame desktop = new Frame( + m_context.getServiceManager().createInstanceWithContext( "com.sun.star.frame.Desktop", m_context ) ); + XDispatch dispatcher = desktop.queryDispatch(dispatchURL[0],"",0); + + // the arguments for the OpenHyperlink command + PropertyValue dispatchArgs[] = new PropertyValue[] { new PropertyValue() }; + dispatchArgs[0].Name = "URL"; + dispatchArgs[0].Value = documentationURL; + + dispatcher.dispatch(dispatchURL[0], dispatchArgs ); + } + catch( com.sun.star.uno.Exception e ) + { + e.printStackTrace( System.err ); + } + } + } + + /** Creates a new instance of ServicesHandler */ + public ServicesHandler( XComponentContext _context ) + { + m_context = _context; + m_supportedServices = new String[] { }; + } + + public void actuatingPropertyChanged(String _propertyName, Object _newValue, Object _oldValue, com.sun.star.inspection.XObjectInspectorUI _objectInspectorUI, boolean _firstTimeInit) throws com.sun.star.lang.NullPointerException + { + // not interested in + } + + public void addEventListener(com.sun.star.lang.XEventListener _eventListener) + { + // ignoring this + } + + public void addPropertyChangeListener(com.sun.star.beans.XPropertyChangeListener _propertyChangeListener) throws com.sun.star.lang.NullPointerException + { + // ignoring this + } + + public Object convertToControlValue(String _propertyName, Object _propertyValue, com.sun.star.uno.Type type) throws com.sun.star.beans.UnknownPropertyException + { + return _propertyValue; + } + + public Object convertToPropertyValue(String _propertyName, Object _controlValue) throws com.sun.star.beans.UnknownPropertyException + { + return _controlValue; + } + + public com.sun.star.inspection.LineDescriptor describePropertyLine(String _propertyName, com.sun.star.inspection.XPropertyControlFactory _propertyControlFactory) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.NullPointerException + { + com.sun.star.inspection.LineDescriptor descriptor = new com.sun.star.inspection.LineDescriptor(); + + descriptor = new LineDescriptor(); + descriptor.Category = "Services"; + descriptor.DisplayName = "supports service"; + descriptor.HasPrimaryButton = descriptor.HasSecondaryButton = false; + descriptor.IndentLevel = 0; + try + { + XHyperlinkControl hyperlinkControl = UnoRuntime.queryInterface( + XHyperlinkControl.class, _propertyControlFactory.createPropertyControl( PropertyControlType.HyperlinkField, true ) ); + hyperlinkControl.addActionListener( new ClickHandler( m_context, _propertyName ) ); + + descriptor.Control = hyperlinkControl; + } + catch( com.sun.star.lang.IllegalArgumentException e ) + { + } + return descriptor; + } + + public void dispose() + { + // nothing to do + } + + public String[] getActuatingProperties() + { + // none + return new String[] { }; + } + + public com.sun.star.beans.PropertyState getPropertyState(String _propertyName) throws com.sun.star.beans.UnknownPropertyException + { + return com.sun.star.beans.PropertyState.DIRECT_VALUE; + } + + public Object getPropertyValue(String _propertyName) throws com.sun.star.beans.UnknownPropertyException + { + return _propertyName; + } + + public String[] getSupersededProperties() + { + return new String[] { "SupportedServiceNames" }; + // we're used in conjunction with a GenericPropertyHandler, which (via inspection) finds + // a property SupportedServiceNames, resulting from the XServiceInfo.getSupportedServiceNames + // method. Since we handle those ourself, we supersede them. + } + + public com.sun.star.beans.Property[] getSupportedProperties() + { + Property[] properties = new Property[ m_supportedServices.length ]; + for ( int i=0; i<m_supportedServices.length; ++i ) + properties[i] = new Property( m_supportedServices[i], 0, new Type( String.class ), (short)0 ); + return properties; + } + + public void inspect(Object _component) throws com.sun.star.lang.NullPointerException + { + XServiceInfo serviceInfo = UnoRuntime.queryInterface( XServiceInfo.class, _component ); + if ( serviceInfo != null ) + m_supportedServices = serviceInfo.getSupportedServiceNames(); + } + + public boolean isComposable(String _propertyName) throws com.sun.star.beans.UnknownPropertyException + { + return true; + } + + public com.sun.star.inspection.InteractiveSelectionResult onInteractivePropertySelection(String str, boolean param, Object[] obj, com.sun.star.inspection.XObjectInspectorUI xObjectInspectorUI) throws com.sun.star.beans.UnknownPropertyException, com.sun.star.lang.NullPointerException + { + return InteractiveSelectionResult.Cancelled; + } + + public void removeEventListener(com.sun.star.lang.XEventListener _eventListener) + { + // ignoring this + } + + public void removePropertyChangeListener(com.sun.star.beans.XPropertyChangeListener _propertyChangeListener) + { + // ignoring this + } + + public void setPropertyValue(String str, Object obj) throws com.sun.star.beans.UnknownPropertyException + { + // we declared our properties as readonly + throw new java.lang.RuntimeException(); + } + + public boolean suspend(boolean param) + { + return true; + } +} diff --git a/extensions/qa/integration/extensions/extensions_complex.sce b/extensions/qa/integration/extensions/extensions_complex.sce new file mode 100644 index 000000000..563376c72 --- /dev/null +++ b/extensions/qa/integration/extensions/extensions_complex.sce @@ -0,0 +1 @@ +#-o integration.extensions.ObjectInspector
\ No newline at end of file diff --git a/extensions/qa/integration/extensions/makefile.mk b/extensions/qa/integration/extensions/makefile.mk new file mode 100644 index 000000000..ca524e0eb --- /dev/null +++ b/extensions/qa/integration/extensions/makefile.mk @@ -0,0 +1,74 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +PRJ = ..$/..$/.. +TARGET = ExtensionsIntegrationTests +PRJNAME = extensions +PACKAGE = integration$/$(PRJNAME) + +# --- Settings ----------------------------------------------------- +.INCLUDE: settings.mk + + +#----- compile .java files ----------------------------------------- + +JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar +JAVAFILES := $(shell @$(FIND) .$/*.java) +JAVACLASSFILES := $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +#----- make a jar from compiled files ------------------------------ + +MAXLINELENGTH = 100000 + +JARCLASSDIRS = $(PACKAGE) +JARTARGET = $(TARGET).jar +JARCOMPRESS = TRUE + +# --- Runner Settings ---------------------------------------------- + +# create connection string for OOoRunner +.IF "$(RUNNER_CONNECTION_STRING)" == "" + .IF "$(OOO_RUNNER_PORT)" == "" + OOO_RUNNER_PORT=8100 + .ENDIF + .IF "$(OOO_RUNNER_HOST)" == "" + OOO_RUNNER_HOST=localhost + .ENDIF + RUNNER_CONNECTION_STRING=socket,host=$(OOO_RUNNER_HOST),port=$(OOO_RUNNER_PORT) +.ENDIF + +# classpath and argument list +RUNNER_CLASSPATH = -cp $(CLASSPATH)$(LIBO_PATH_SEPARATOR)$(SOLARBINDIR)$/OOoRunner.jar$(LIBO_PATH_SEPARATOR)$(CLASSPATH)$(LIBO_PATH_SEPARATOR)$(SOLARBINDIR)$/ConnectivityTools.jar +RUNNER_ARGS = org.openoffice.Runner -TestBase java_complex -cs $(RUNNER_CONNECTION_STRING) + +# --- Targets ------------------------------------------------------ + +.IF "$(depend)" == "" +ALL : ALLTAR +.ELSE +ALL: ALLDEP +.ENDIF + +.INCLUDE : target.mk + +run: + +java $(RUNNER_CLASSPATH) $(RUNNER_ARGS) -sce extensions_complex.sce + +run_%: + +java $(RUNNER_CLASSPATH) $(RUNNER_ARGS) -o integration.$(PRJNAME).$(@:s/run_//) + |