304 lines
10 KiB
Java
304 lines
10 KiB
Java
/*
|
|
* 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();
|
|
}
|