diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
commit | 940b4d1848e8c70ab7642901a68594e8016caffc (patch) | |
tree | eb72f344ee6c3d9b80a7ecc079ea79e9fba8676d /framework/qa/complex/contextMenuInterceptor | |
parent | Initial commit. (diff) | |
download | libreoffice-upstream/1%7.0.4.tar.xz libreoffice-upstream/1%7.0.4.zip |
Adding upstream version 1:7.0.4.upstream/1%7.0.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'framework/qa/complex/contextMenuInterceptor')
-rw-r--r-- | framework/qa/complex/contextMenuInterceptor/CheckContextMenuInterceptor.java | 304 | ||||
-rw-r--r-- | framework/qa/complex/contextMenuInterceptor/ContextMenuInterceptor.java | 132 | ||||
-rw-r--r-- | framework/qa/complex/contextMenuInterceptor/space-metal.jpg | bin | 0 -> 4313 bytes |
3 files changed, 436 insertions, 0 deletions
diff --git a/framework/qa/complex/contextMenuInterceptor/CheckContextMenuInterceptor.java b/framework/qa/complex/contextMenuInterceptor/CheckContextMenuInterceptor.java new file mode 100644 index 000000000..e1f59fdf7 --- /dev/null +++ b/framework/qa/complex/contextMenuInterceptor/CheckContextMenuInterceptor.java @@ -0,0 +1,304 @@ +/* + * 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 complex.contextMenuInterceptor; + +import com.sun.star.accessibility.AccessibleRole; +import com.sun.star.accessibility.XAccessible; +import com.sun.star.accessibility.XAccessibleComponent; +import com.sun.star.accessibility.XAccessibleContext; +import com.sun.star.awt.Point; +import com.sun.star.awt.Rectangle; +import com.sun.star.awt.XBitmap; +import com.sun.star.awt.XExtendedToolkit; +import com.sun.star.awt.XWindow; +import com.sun.star.beans.XPropertySet; +import com.sun.star.drawing.XShape; +import com.sun.star.frame.XFrame; +import com.sun.star.frame.XModel; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.ui.XContextMenuInterception; +import com.sun.star.ui.XContextMenuInterceptor; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Type; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.util.XCloseable; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.io.File; +import util.AccessibilityTools; +import util.DesktopTools; +import util.DrawTools; +import util.SOfficeFactory; +import org.openoffice.test.OfficeFileUrl; + +// ---------- junit imports ----------------- +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; +import static org.junit.Assert.*; + + +/** + * + */ +public class CheckContextMenuInterceptor +{ + + XMultiServiceFactory xMSF = null; + XFrame xFrame = null; + Point point = null; + XWindow xWindow = null; + com.sun.star.lang.XComponent xDrawDoc; + + @Before + public void before() + { + xMSF = getMSF(); + } + + @After + public void after() throws Exception + { + System.out.println("release the popup menu"); + try + { + Robot rob = new Robot(); + int x = point.X; + int y = point.Y; + rob.mouseMove(x, y); + rob.mousePress(InputEvent.BUTTON1_MASK); + rob.mouseRelease(InputEvent.BUTTON1_MASK); + } + catch (java.awt.AWTException e) + { + System.out.println("couldn't press mouse button"); + } + + XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xFrame); + + xClose.close(true); + + xFrame = null; + } + + @Test + public void checkContextMenuInterceptor() throws Exception + { + System.out.println(" **** Context Menu Interceptor *** "); + + // initialize the test document + xDrawDoc = DrawTools.createDrawDoc(xMSF); + + SOfficeFactory SOF = SOfficeFactory.getFactory(xMSF); + XShape oShape = SOF.createShape(xDrawDoc, 5000, 5000, 1500, 1000, "GraphicObject"); + DrawTools.getShapes(DrawTools.getDrawPage(xDrawDoc, 0)).add(oShape); + + com.sun.star.frame.XModel xModel = + UnoRuntime.queryInterface(com.sun.star.frame.XModel.class, xDrawDoc); + + // get the frame for later usage + xFrame = xModel.getCurrentController().getFrame(); + + // ensure that the document content is optimal visible + DesktopTools.zoomToEntirePage(xMSF, xDrawDoc); + + XBitmap xBitmap = null; + + // adding graphic as ObjRelation for GraphicObjectShape + XPropertySet oShapeProps = UnoRuntime.queryInterface(XPropertySet.class, oShape); + System.out.println("Inserting a shape into the document"); + + try + { + String sFile = OfficeFileUrl.getAbsolute(new File("space-metal.jpg")); + oShapeProps.setPropertyValue("GraphicURL", sFile); + Object oProp = oShapeProps.getPropertyValue("GraphicObjectFillBitmap"); + xBitmap = (XBitmap) AnyConverter.toObject(new Type(XBitmap.class), oProp); + } + catch (com.sun.star.lang.WrappedTargetException e) + { + } + catch (com.sun.star.lang.IllegalArgumentException e) + { + } + catch (com.sun.star.beans.PropertyVetoException e) + { + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + } + + // reuse the frame + com.sun.star.frame.XController xController = xFrame.getController(); + XContextMenuInterception xContextMenuInterception = null; + XContextMenuInterceptor xContextMenuInterceptor = null; + + if (xController != null) + { + System.out.println("Creating context menu interceptor"); + + // add our context menu interceptor + xContextMenuInterception = + UnoRuntime.queryInterface(XContextMenuInterception.class, xController); + + if (xContextMenuInterception != null) + { + ContextMenuInterceptor aContextMenuInterceptor = new ContextMenuInterceptor(xBitmap); + xContextMenuInterceptor = + UnoRuntime.queryInterface(XContextMenuInterceptor.class, aContextMenuInterceptor); + + System.out.println("Register context menu interceptor"); + xContextMenuInterception.registerContextMenuInterceptor(xContextMenuInterceptor); + } + } + + openContextMenu(UnoRuntime.queryInterface(XModel.class, xDrawDoc)); + + checkHelpEntry(); + + // remove our context menu interceptor + if (xContextMenuInterception != null + && xContextMenuInterceptor != null) + { + System.out.println("Release context menu interceptor"); + xContextMenuInterception.releaseContextMenuInterceptor( + xContextMenuInterceptor); + } + } + + private void checkHelpEntry() throws Exception + { + XInterface toolkit = null; + + System.out.println("get accessibility..."); + try + { + toolkit = (XInterface) xMSF.createInstance("com.sun.star.awt.Toolkit"); + } + catch (com.sun.star.uno.Exception e) + { + System.out.println("could not get Toolkit " + e.toString()); + } + XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.class, toolkit); + + XAccessible xRoot = null; + + try + { + xWindow = UnoRuntime.queryInterface(XWindow.class, tk.getTopWindow(0)); + + xRoot = AccessibilityTools.getAccessibleObject(xWindow); + } + catch (com.sun.star.lang.IndexOutOfBoundsException e) + { + System.out.println("Couldn't get Window"); + } + + XAccessibleContext oPopMenu = AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.POPUP_MENU); + + System.out.println("ImplementationName: " + util.utils.getImplName(oPopMenu)); + + XAccessible xHelp = null; + System.out.println("Try to get first entry of context menu..."); + xHelp = oPopMenu.getAccessibleChild(0); + if (xHelp == null) + { + fail("first entry of context menu is NULL"); + } + + XAccessibleContext xHelpCont = xHelp.getAccessibleContext(); + if (xHelpCont == null) + { + fail("No able to retrieve accessible context from first entry of context menu"); + } + + String aAccessibleName = xHelpCont.getAccessibleName(); + if (!aAccessibleName.equals("Help")) + { + System.out.println("Accessible name found = " + aAccessibleName); + fail("First entry of context menu is not from context menu interceptor"); + } + + System.out.println("try to get first children of Help context..."); + xHelpCont.getAccessibleChild(0); + } + + private void openContextMenu(XModel aModel) + { + + System.out.println("try to open context menu..."); + + xWindow = AccessibilityTools.getCurrentWindow(aModel); + + XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow); + + XInterface oObj = AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.PANEL); + + XAccessibleComponent window = UnoRuntime.queryInterface(XAccessibleComponent.class, oObj); + + point = window.getLocationOnScreen(); + Rectangle rect = window.getBounds(); + + System.out.println("click mouse button..."); + try + { + Robot rob = new Robot(); + int x = point.X + (rect.Width / 2); + int y = point.Y + (rect.Height / 2); + rob.mouseMove(x, y); + System.out.println("Press Button"); + rob.mousePress(InputEvent.BUTTON3_MASK); + System.out.println("Release Button"); + rob.mouseRelease(InputEvent.BUTTON3_MASK); + System.out.println("done"); + } + catch (java.awt.AWTException e) + { + System.out.println("couldn't press mouse button"); + } + + util.utils.waitForEventIdle(getMSF()); + } + + private XMultiServiceFactory getMSF() + { + return UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); + } + + // setup and close connections + @BeforeClass + public static void setUpConnection() throws Exception + { + System.out.println("setUpConnection()"); + connection.setUp(); + } + + @AfterClass + public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println("tearDownConnection()"); + connection.tearDown(); + } + private static final OfficeConnection connection = new OfficeConnection(); +} diff --git a/framework/qa/complex/contextMenuInterceptor/ContextMenuInterceptor.java b/framework/qa/complex/contextMenuInterceptor/ContextMenuInterceptor.java new file mode 100644 index 000000000..7496b58e0 --- /dev/null +++ b/framework/qa/complex/contextMenuInterceptor/ContextMenuInterceptor.java @@ -0,0 +1,132 @@ +/* + * 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 complex.contextMenuInterceptor; + +import com.sun.star.ui.*; +import com.sun.star.beans.XPropertySet; +import com.sun.star.uno.UnoRuntime; + +public class ContextMenuInterceptor implements XContextMenuInterceptor +{ + + private final com.sun.star.awt.XBitmap myBitmap; + + public ContextMenuInterceptor(com.sun.star.awt.XBitmap aBitmap) + { + myBitmap = aBitmap; + } + + public ContextMenuInterceptorAction notifyContextMenuExecute( + com.sun.star.ui.ContextMenuExecuteEvent aEvent) throws RuntimeException + { + try + { + // Retrieve context menu container and query for service factory to + // create sub menus, menu entries and separators + com.sun.star.container.XIndexContainer xContextMenu = aEvent.ActionTriggerContainer; + com.sun.star.lang.XMultiServiceFactory xMenuElementFactory = + UnoRuntime.queryInterface(com.sun.star.lang.XMultiServiceFactory.class, xContextMenu); + + if (xMenuElementFactory != null) + { + + // create root menu entry for sub menu and sub menu + com.sun.star.beans.XPropertySet xRootMenuEntry = + UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, xMenuElementFactory.createInstance("com.sun.star.ui.ActionTrigger")); + + // create a line separator for our new help sub menu + com.sun.star.beans.XPropertySet xSeparator = + UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, xMenuElementFactory.createInstance("com.sun.star.ui.ActionTriggerSeparator")); + Short aSeparatorType = Short.valueOf(ActionTriggerSeparatorType.LINE); + xSeparator.setPropertyValue("SeparatorType", aSeparatorType); + + // query sub menu for index container to get access + com.sun.star.container.XIndexContainer xSubMenuContainer = + UnoRuntime.queryInterface(com.sun.star.container.XIndexContainer.class, xMenuElementFactory.createInstance("com.sun.star.ui.ActionTriggerContainer")); + + // initialize root menu entry "Help" + xRootMenuEntry.setPropertyValue("Text", "Help"); + xRootMenuEntry.setPropertyValue("CommandURL", "slot:5410"); + xRootMenuEntry.setPropertyValue("HelpURL", "5410"); + xRootMenuEntry.setPropertyValue("SubContainer", xSubMenuContainer); + xRootMenuEntry.setPropertyValue("Image", myBitmap); + + // create menu entries for the new sub menu + // initialize help/content menu entry + // entry "Content" + XPropertySet xMenuEntry = UnoRuntime.queryInterface(XPropertySet.class, xMenuElementFactory.createInstance("com.sun.star.ui.ActionTrigger")); + xMenuEntry.setPropertyValue("Text", "Content"); + xMenuEntry.setPropertyValue("CommandURL", "slot:5401"); + xMenuEntry.setPropertyValue("HelpURL", "5401"); + + // insert menu entry to sub menu + xSubMenuContainer.insertByIndex(0, xMenuEntry); + + // initialize help/help on help + // entry "Help on Help" + xMenuEntry = UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, xMenuElementFactory.createInstance("com.sun.star.ui.ActionTrigger")); + xMenuEntry.setPropertyValue("Text", "Help on Help"); + xMenuEntry.setPropertyValue("CommandURL", "slot:5400"); + xMenuEntry.setPropertyValue("HelpURL", "5400"); + + // insert menu entry to sub menu + xSubMenuContainer.insertByIndex(1, xMenuEntry); + // initialize help/tips + // entry "Tips" + xMenuEntry = UnoRuntime.queryInterface(com.sun.star.beans.XPropertySet.class, xMenuElementFactory.createInstance("com.sun.star.ui.ActionTrigger")); + xMenuEntry.setPropertyValue("Text", "Tips"); + xMenuEntry.setPropertyValue("CommandURL", "slot:5404"); + xMenuEntry.setPropertyValue("HelpURL", "5404"); + + // insert menu entry to sub menu + xSubMenuContainer.insertByIndex(2, xMenuEntry); + + // add separator into the given context menu + xContextMenu.insertByIndex(0, xSeparator); + + // add new sub menu into the given context menu + xContextMenu.insertByIndex(0, xRootMenuEntry); + + // The controller should execute the modified context menu and stop notifying other + // interceptors. + return com.sun.star.ui.ContextMenuInterceptorAction.EXECUTE_MODIFIED; + } + } + catch (com.sun.star.beans.UnknownPropertyException ex) + { + // do something useful + // we used an unknown property + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + // do something useful + // we used an invalid index for accessing a container + } + catch (com.sun.star.uno.Exception ex) + { + // something strange has happened! + } + catch (java.lang.Throwable ex) + { + // catch java exceptions do something useful + } + + return com.sun.star.ui.ContextMenuInterceptorAction.IGNORED; + } +} diff --git a/framework/qa/complex/contextMenuInterceptor/space-metal.jpg b/framework/qa/complex/contextMenuInterceptor/space-metal.jpg Binary files differnew file mode 100644 index 000000000..d23344389 --- /dev/null +++ b/framework/qa/complex/contextMenuInterceptor/space-metal.jpg |