blob: 2a1a815da8a62deb8f8a2e923aa4f8424ca1c0c3 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
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.IndexOutOfBoundsException;
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 util.utils;
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()
{
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);
try
{
xClose.close(true);
}
catch (com.sun.star.util.CloseVetoException exVeto)
{
fail("Test frame couldn't be closed successfully.");
}
xFrame = null;
// xClose = UnoRuntime.queryInterface(XCloseable.class, xDrawDoc);
// try
// {
// xClose.close(true);
// }
// catch (com.sun.star.util.CloseVetoException exVeto)
// {
// fail("Test DrawDoc couldn't be closed successfully.");
// }
}
// public String[] getTestMethodNames() {
// return new String[]{"checkContextMenuInterceptor"};
// }
@Test
public void checkContextMenuInterceptor()
{
System.out.println(" **** Context Menu Interceptor *** ");
try
{
// intialize 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(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"));
// String sFile = util.utils.getFullTestURL("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);
}
}
// utils.shortWait(10000);
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);
}
}
catch (com.sun.star.uno.RuntimeException ex)
{
// ex.printStackTrace();
fail("Runtime exception caught!" + ex.getMessage());
}
catch (java.lang.Exception ex)
{
// ex.printStackTrace();
fail("Java lang exception caught!" + ex.getMessage());
}
}
private void checkHelpEntry()
{
XInterface toolkit = null;
System.out.println("get accesibility...");
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;
AccessibilityTools at = new AccessibilityTools();
try
{
xWindow = UnoRuntime.queryInterface(XWindow.class, tk.getTopWindow(0));
xRoot = at.getAccessibleObject(xWindow);
// at.printAccessibleTree((PrintWriter)log, xRoot, param.getBool(util.PropertyName.DEBUG_IS_ACTIVE));
// at.printAccessibleTree(System.out, xRoot, true);
}
catch (com.sun.star.lang.IndexOutOfBoundsException e)
{
System.out.println("Couldn't get Window");
}
XAccessibleContext oPopMenu = at.getAccessibleObjectForRole(xRoot, AccessibleRole.POPUP_MENU);
System.out.println("ImplementationName: " + util.utils.getImplName(oPopMenu));
XAccessible xHelp = null;
try
{
System.out.println("Try to get first entry of context menu...");
xHelp = oPopMenu.getAccessibleChild(0);
}
catch (IndexOutOfBoundsException e)
{
fail("Not possible to get first entry of context menu");
}
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");
}
try
{
System.out.println("try to get first children of Help context...");
XAccessible xHelpChild = xHelpCont.getAccessibleChild(0);
}
catch (IndexOutOfBoundsException e)
{
fail("not possible to get first children of Help context");
}
}
private void openContextMenu(XModel aModel)
{
System.out.println("try to open contex menu...");
AccessibilityTools at = new AccessibilityTools();
xWindow = at.getCurrentWindow(xMSF, aModel);
XAccessible xRoot = at.getAccessibleObject(xWindow);
XInterface oObj = at.getAccessibleObjectForRole(xRoot, AccessibleRole.PANEL);
XAccessibleComponent window = UnoRuntime.queryInterface(XAccessibleComponent.class, oObj);
point = window.getLocationOnScreen();
Rectangle rect = window.getBounds();
System.out.println("klick 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");
}
utils.shortWait(3000);
}
private XMultiServiceFactory getMSF()
{
final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
return xMSF1;
}
// 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();
}