package 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.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.XPropertySetInfo;
import com.sun.star.container.XIndexAccess;
import com.sun.star.drawing.XShape;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XController;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XModel;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.text.XTextDocument;
import com.sun.star.ui.XContextMenuInterceptor;
import com.sun.star.ui.XContextMenuInterception;
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.uno.Exception;
import com.sun.star.util.CloseVetoException;
import com.sun.star.util.XCloseable;
import com.sun.star.view.XViewSettingsSupplier;
import complexlib.ComplexTestCase;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.io.PrintWriter;
import share.LogWriter;
import util.AccessibilityTools;
import util.DesktopTools;
import util.DrawTools;
import util.SOfficeFactory;
import util.utils;
/**
*
*/
public class CheckContextMenuInterceptor extends ComplexTestCase {
XMultiServiceFactory xMSF = null;
XFrame xFrame = null;
Point point = null;
XWindow xWindow = null;
public void before() {
xMSF = (XMultiServiceFactory)param.getMSF();
}
public void after() {
log.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) {
log.println("couldn't press mouse button");
}
com.sun.star.util.XCloseable xClose = (com.sun.star.util.XCloseable)UnoRuntime.queryInterface(
com.sun.star.util.XCloseable.class, xFrame);
try
{
xClose.close(false);
}
catch(com.sun.star.util.CloseVetoException exVeto)
{
failed("Test frame couldn't be closed successfully.");
}
xFrame = null;
}
public String[] getTestMethodNames() {
return new String[]{"checkContextMenuInterceptor"};
}
public void checkContextMenuInterceptor() {
log.println(" **** Context Menu Interceptor *** ");
try {
// intialize the test document
com.sun.star.lang.XComponent 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 =
(com.sun.star.frame.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 = (XPropertySet)
UnoRuntime.queryInterface(XPropertySet.class,oShape);
log.println( "Inserting a shape into the document");
try
{
oShapeProps.setPropertyValue(
"GraphicURL",util.utils.getFullTestURL("space-metal.jpg"));
xBitmap = (XBitmap) AnyConverter.toObject(
new Type(XBitmap.class),oShapeProps.getPropertyValue
("GraphicObjectFillBitmap"));
} 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();
com.sun.star.ui.XContextMenuInterception xContextMenuInterception = null;
com.sun.star.ui.XContextMenuInterceptor xContextMenuInterceptor = null;
if ( xController != null )
{
log.println( "Creating context menu interceptor");
// add our context menu interceptor
xContextMenuInterception =
(com.sun.star.ui.XContextMenuInterception)UnoRuntime.queryInterface(
com.sun.star.ui.XContextMenuInterception.class, xController );
if( xContextMenuInterception != null )
{
ContextMenuInterceptor aContextMenuInterceptor = new ContextMenuInterceptor( xBitmap );
xContextMenuInterceptor =
(com.sun.star.ui.XContextMenuInterceptor)UnoRuntime.queryInterface(
com.sun.star.ui.XContextMenuInterceptor.class, aContextMenuInterceptor );
log.println( "Register context menu interceptor");
xContextMenuInterception.registerContextMenuInterceptor( xContextMenuInterceptor );
}
}
// utils.shortWait(10000);
openContextMenu((XModel) UnoRuntime.queryInterface(XModel.class, xDrawDoc));
checkHelpEntry();
// remove our context menu interceptor
if ( xContextMenuInterception != null &&
xContextMenuInterceptor != null ) {
log.println( "Release context menu interceptor");
xContextMenuInterception.releaseContextMenuInterceptor(
xContextMenuInterceptor );
}
}
catch ( com.sun.star.uno.RuntimeException ex ) {
ex.printStackTrace((PrintWriter)log);
failed("Runtime exception caught!" + ex.getMessage());
}
catch ( java.lang.Exception ex ) {
ex.printStackTrace((PrintWriter)log);
failed("Java lang exception caught!" + ex.getMessage());
}
}
private void checkHelpEntry(){
XInterface toolkit = null;
log.println("get accesibility...");
try{
toolkit = (XInterface) xMSF.createInstance("com.sun.star.awt.Toolkit");
} catch (com.sun.star.uno.Exception e){
log.println("could not get Toolkit " + e.toString());
}
XExtendedToolkit tk = (XExtendedToolkit) UnoRuntime.queryInterface(
XExtendedToolkit.class, toolkit);
XAccessible xRoot = null;
AccessibilityTools at = new AccessibilityTools();
try {
xWindow = (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((PrintWriter)log, xRoot, true);
}
catch (com.sun.star.lang.IndexOutOfBoundsException e)
{
log.println("Couldn't get Window");
}
XAccessibleContext oPopMenu = at.getAccessibleObjectForRole(xRoot, AccessibleRole.POPUP_MENU);
log.println("ImplementationName: " + util.utils.getImplName(oPopMenu));
XAccessible xHelp = null;
try{
log.println("Try to get first entry of context menu...");
xHelp = oPopMenu.getAccessibleChild(0);
} catch (IndexOutOfBoundsException e){
failed("Not possible to get first entry of context menu");
}
if (xHelp == null) failed("first entry of context menu is NULL");
XAccessibleContext xHelpCont = xHelp.getAccessibleContext();
if ( xHelpCont == null )
failed("No able to retrieve accessible context from first entry of context menu");
String aAccessibleName = xHelpCont.getAccessibleName();
if ( !aAccessibleName.equals( "Help" )) {
log.println("Accessible name found = "+aAccessibleName );
failed("First entry of context menu is not from context menu interceptor");
}
try
{
log.println("try to get first children of Help context...");
XAccessible xHelpChild = xHelpCont.getAccessibleChild(0);
} catch (IndexOutOfBoundsException e){
failed("not possible to get first children of Help context");
}
}
private void openContextMenu(XModel aModel){
log.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 = (XAccessibleComponent) UnoRuntime.queryInterface(
XAccessibleComponent.class, oObj);
point = window.getLocationOnScreen();
Rectangle rect = window.getBounds();
log.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) {
log.println("couldn't press mouse button");
}
utils.shortWait(3000);
}
}