1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski 25*b1cdbd2cSJim Jagielski package ifc.ui; 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.AccessibleRole; 28*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessible; 29*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessibleComponent; 30*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessibleContext; 31*b1cdbd2cSJim Jagielski import com.sun.star.awt.Point; 32*b1cdbd2cSJim Jagielski import com.sun.star.awt.Rectangle; 33*b1cdbd2cSJim Jagielski import com.sun.star.awt.XExtendedToolkit; 34*b1cdbd2cSJim Jagielski import com.sun.star.awt.XWindow; 35*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel; 36*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException; 37*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 38*b1cdbd2cSJim Jagielski import com.sun.star.ui.XContextMenuInterception; 39*b1cdbd2cSJim Jagielski import com.sun.star.ui.XContextMenuInterceptor; 40*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 41*b1cdbd2cSJim Jagielski import com.sun.star.uno.XInterface; 42*b1cdbd2cSJim Jagielski import helper.ContextMenuInterceptor; 43*b1cdbd2cSJim Jagielski import java.awt.Robot; 44*b1cdbd2cSJim Jagielski import java.awt.event.InputEvent; 45*b1cdbd2cSJim Jagielski import lib.MultiMethodTest; 46*b1cdbd2cSJim Jagielski import lib.Status; 47*b1cdbd2cSJim Jagielski import lib.StatusException; 48*b1cdbd2cSJim Jagielski import util.AccessibilityTools; 49*b1cdbd2cSJim Jagielski import util.DesktopTools; 50*b1cdbd2cSJim Jagielski import util.utils; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski public class _XContextMenuInterception extends MultiMethodTest { 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski private XModel docModel = null; 55*b1cdbd2cSJim Jagielski private XContextMenuInterceptor xCI = null; 56*b1cdbd2cSJim Jagielski public XContextMenuInterception oObj = null; 57*b1cdbd2cSJim Jagielski private XWindow xWindow = null; 58*b1cdbd2cSJim Jagielski private XMultiServiceFactory xMSF = null; 59*b1cdbd2cSJim Jagielski private Point point = null; 60*b1cdbd2cSJim Jagielski before()61*b1cdbd2cSJim Jagielski public void before() { 62*b1cdbd2cSJim Jagielski docModel = (XModel) UnoRuntime.queryInterface( 63*b1cdbd2cSJim Jagielski XModel.class,tEnv.getObjRelation("FirstModel")); 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski xCI = (XContextMenuInterceptor) UnoRuntime.queryInterface( 66*b1cdbd2cSJim Jagielski XContextMenuInterceptor.class, new ContextMenuInterceptor()); 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski xMSF = (XMultiServiceFactory)tParam.getMSF(); 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski //ensure that the first model is focused 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski log.println("ensure that the first model is focused"); 73*b1cdbd2cSJim Jagielski DesktopTools.bringWindowToFront(docModel); 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski utils.shortWait(3000); 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski after()78*b1cdbd2cSJim Jagielski public void after() { 79*b1cdbd2cSJim Jagielski if (xCI != null) { 80*b1cdbd2cSJim Jagielski oObj.releaseContextMenuInterceptor(xCI); 81*b1cdbd2cSJim Jagielski } 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski _registerContextMenuInterceptor()84*b1cdbd2cSJim Jagielski public void _registerContextMenuInterceptor() { 85*b1cdbd2cSJim Jagielski oObj.registerContextMenuInterceptor(xCI); 86*b1cdbd2cSJim Jagielski openContextMenu(docModel); 87*b1cdbd2cSJim Jagielski boolean res = checkHelpEntry(); 88*b1cdbd2cSJim Jagielski releasePopUp(); 89*b1cdbd2cSJim Jagielski tRes.tested("registerContextMenuInterceptor()",res); 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski _releaseContextMenuInterceptor()92*b1cdbd2cSJim Jagielski public void _releaseContextMenuInterceptor() { 93*b1cdbd2cSJim Jagielski requiredMethod("registerContextMenuInterceptor()"); 94*b1cdbd2cSJim Jagielski oObj.releaseContextMenuInterceptor(xCI); 95*b1cdbd2cSJim Jagielski openContextMenu(docModel); 96*b1cdbd2cSJim Jagielski boolean res = checkHelpEntry(); 97*b1cdbd2cSJim Jagielski releasePopUp(); 98*b1cdbd2cSJim Jagielski tRes.tested("releaseContextMenuInterceptor()",!res); 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski checkHelpEntry()101*b1cdbd2cSJim Jagielski private boolean checkHelpEntry(){ 102*b1cdbd2cSJim Jagielski XInterface toolkit = null; 103*b1cdbd2cSJim Jagielski boolean res = true; 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski log.println("get accesibility..."); 106*b1cdbd2cSJim Jagielski try{ 107*b1cdbd2cSJim Jagielski toolkit = (XInterface) xMSF.createInstance("com.sun.star.awt.Toolkit"); 108*b1cdbd2cSJim Jagielski } catch (com.sun.star.uno.Exception e){ 109*b1cdbd2cSJim Jagielski log.println("could not get Toolkit " + e.toString()); 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski XExtendedToolkit tk = (XExtendedToolkit) UnoRuntime.queryInterface( 112*b1cdbd2cSJim Jagielski XExtendedToolkit.class, toolkit); 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski XAccessible xRoot = null; 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski AccessibilityTools at = new AccessibilityTools(); 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski try { 119*b1cdbd2cSJim Jagielski xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, 120*b1cdbd2cSJim Jagielski tk.getTopWindow(0)); 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski xRoot = at.getAccessibleObject(xWindow); 123*b1cdbd2cSJim Jagielski at.printAccessibleTree(log, xRoot, tParam.getBool(util.PropertyName.DEBUG_IS_ACTIVE)); 124*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IndexOutOfBoundsException e) { 125*b1cdbd2cSJim Jagielski log.println("Couldn't get Window"); 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski XAccessibleContext oPopMenu = at.getAccessibleObjectForRole(xRoot, AccessibleRole.POPUP_MENU,true); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski log.println("ImplementationName: " + util.utils.getImplName(oPopMenu)); 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski XAccessible xHelp = null; 133*b1cdbd2cSJim Jagielski try{ 134*b1cdbd2cSJim Jagielski log.println("Try to get second entry of context menu..."); 135*b1cdbd2cSJim Jagielski xHelp = oPopMenu.getAccessibleChild(1); 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski } catch (IndexOutOfBoundsException e){ 138*b1cdbd2cSJim Jagielski throw new StatusException("Not possible to get second entry of context menu",e); 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski if (xHelp == null) throw new StatusException(new Status("second entry of context menu is NULL", false)); 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski XAccessibleContext xHelpCont = xHelp.getAccessibleContext(); 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski if ( xHelpCont == null ) 146*b1cdbd2cSJim Jagielski throw new StatusException(new Status("No able to retrieve accessible context from first entry of context menu",false)); 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski String aAccessibleName = xHelpCont.getAccessibleName(); 149*b1cdbd2cSJim Jagielski if ( !aAccessibleName.equals( "Help" )) { 150*b1cdbd2cSJim Jagielski log.println("Accessible name found = "+aAccessibleName ); 151*b1cdbd2cSJim Jagielski log.println("Second entry of context menu is not from context menu interceptor"); 152*b1cdbd2cSJim Jagielski res=false; 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski return res; 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski openContextMenu(XModel xModel)159*b1cdbd2cSJim Jagielski private void openContextMenu(XModel xModel){ 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski log.println("try to open contex menu..."); 162*b1cdbd2cSJim Jagielski AccessibilityTools at = new AccessibilityTools(); 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski xWindow = at.getCurrentWindow(xMSF, xModel); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski XAccessible xRoot = at.getAccessibleObject(xWindow); 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski XInterface oObj = at.getAccessibleObjectForRole(xRoot, AccessibleRole.PANEL); 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski XAccessibleComponent window = (XAccessibleComponent) UnoRuntime.queryInterface( 171*b1cdbd2cSJim Jagielski XAccessibleComponent.class, oObj); 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski point = window.getLocationOnScreen(); 174*b1cdbd2cSJim Jagielski Rectangle rect = window.getBounds(); 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski log.println("klick mouse button..."); 177*b1cdbd2cSJim Jagielski try { 178*b1cdbd2cSJim Jagielski Robot rob = new Robot(); 179*b1cdbd2cSJim Jagielski int x = point.X + (rect.Width / 2); 180*b1cdbd2cSJim Jagielski int y = point.Y + (rect.Height / 2); 181*b1cdbd2cSJim Jagielski rob.mouseMove(x, y); 182*b1cdbd2cSJim Jagielski System.out.println("Press Button"); 183*b1cdbd2cSJim Jagielski rob.mousePress(InputEvent.BUTTON3_MASK); 184*b1cdbd2cSJim Jagielski System.out.println("Release Button"); 185*b1cdbd2cSJim Jagielski rob.mouseRelease(InputEvent.BUTTON3_MASK); 186*b1cdbd2cSJim Jagielski System.out.println("done"); 187*b1cdbd2cSJim Jagielski } catch (java.awt.AWTException e) { 188*b1cdbd2cSJim Jagielski log.println("couldn't press mouse button"); 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski utils.shortWait(1000); 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski } 194*b1cdbd2cSJim Jagielski releasePopUp()195*b1cdbd2cSJim Jagielski private void releasePopUp() { 196*b1cdbd2cSJim Jagielski log.println("release the popup menu"); 197*b1cdbd2cSJim Jagielski try { 198*b1cdbd2cSJim Jagielski Robot rob = new Robot(); 199*b1cdbd2cSJim Jagielski int x = point.X; 200*b1cdbd2cSJim Jagielski int y = point.Y; 201*b1cdbd2cSJim Jagielski rob.mouseMove(x, y); 202*b1cdbd2cSJim Jagielski rob.mousePress(InputEvent.BUTTON1_MASK); 203*b1cdbd2cSJim Jagielski rob.mouseRelease(InputEvent.BUTTON1_MASK); 204*b1cdbd2cSJim Jagielski } catch (java.awt.AWTException e) { 205*b1cdbd2cSJim Jagielski log.println("couldn't press mouse button"); 206*b1cdbd2cSJim Jagielski } 207*b1cdbd2cSJim Jagielski } 208*b1cdbd2cSJim Jagielski } 209