From 940b4d1848e8c70ab7642901a68594e8016caffc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 18:51:28 +0200 Subject: Adding upstream version 1:7.0.4. Signed-off-by: Daniel Baumann --- .../CheckContextMenuInterceptor.java | 304 +++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 framework/qa/complex/contextMenuInterceptor/CheckContextMenuInterceptor.java (limited to 'framework/qa/complex/contextMenuInterceptor/CheckContextMenuInterceptor.java') 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(); +} -- cgit v1.2.3