/******************************************************************************* * Copyright (c) 2012 BREDEX GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * BREDEX GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.jubula.rc.swing.tester.adapter; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.MenuElement; import javax.swing.MenuSelectionManager; import org.eclipse.jubula.rc.common.driver.ClickOptions; import org.eclipse.jubula.rc.common.driver.IEventThreadQueuer; import org.eclipse.jubula.rc.common.driver.IRobot; import org.eclipse.jubula.rc.common.driver.IRunnable; import org.eclipse.jubula.rc.common.driver.RobotTiming; import org.eclipse.jubula.rc.common.exception.RobotException; import org.eclipse.jubula.rc.common.exception.StepExecutionException; import org.eclipse.jubula.rc.common.tester.adapter.interfaces.IMenuComponent; import org.eclipse.jubula.rc.common.tester.adapter.interfaces.IMenuItemComponent; import org.eclipse.jubula.tools.internal.objects.event.EventFactory; import org.eclipse.jubula.tools.internal.objects.event.TestErrorEvent; import org.eclipse.jubula.tools.internal.utils.EnvironmentUtils; import org.eclipse.jubula.tools.internal.utils.TimeUtil; /** * Implementation of the MenuItem interface for adapting <code>JMenuItem</code>. * @author BREDEX GmbH * */ public class JMenuItemAdapter extends AbstractComponentAdapter implements IMenuItemComponent { /** the JMenuItem from the AUT */ private JMenuItem m_menuItem; /** * * @param objectToAdapt */ public JMenuItemAdapter(Object objectToAdapt) { m_menuItem = (JMenuItem) objectToAdapt; } /** * Gets the IEventThreadQueuer. * * @return The Robot * @throws RobotException * If the Robot cannot be created. */ protected IRobot getRobot() throws RobotException { return getRobotFactory().getRobot(); } /** * @return The event thread queuer. */ public IEventThreadQueuer getEventThreadQueuer() { return getRobotFactory().getEventThreadQueuer(); } /** * {@inheritDoc} */ public Object getRealComponent() { return m_menuItem; } /** * {@inheritDoc} */ public void setComponent(Object element) { m_menuItem = (JMenuItem) element; } /** * {@inheritDoc} */ public boolean isEnabled() { return getEventThreadQueuer().invokeAndWait( "isEnabled", new IRunnable<Boolean>() { //$NON-NLS-1$ public Boolean run() { return ((m_menuItem != null) && m_menuItem.isEnabled()); } }); } /** * {@inheritDoc} */ public String getText() { return getEventThreadQueuer().invokeAndWait( "getText", new IRunnable<String>() { //$NON-NLS-1$ public String run() { return m_menuItem.getText(); } }); } /** * {@inheritDoc} */ public boolean isShowing() { return getEventThreadQueuer().invokeAndWait( "isShowing", new IRunnable<Boolean>() { //$NON-NLS-1$ public Boolean run() { return ((m_menuItem != null) && m_menuItem.isShowing()); } }); } /** * {@inheritDoc} */ public boolean isExisting() { return m_menuItem != null; } /** * {@inheritDoc} */ public boolean isSelected() { return getEventThreadQueuer().invokeAndWait( "isSelected", new IRunnable<Boolean>() { //$NON-NLS-1$ public Boolean run() { return ((m_menuItem != null) && m_menuItem.isSelected()); } }); } /** * {@inheritDoc} */ public IMenuComponent getMenu() { if (m_menuItem instanceof JMenu) { return new JMenuAdapter(m_menuItem); } return null; } /** * {@inheritDoc} */ public boolean hasSubMenu() { return m_menuItem.getSubElements().length > 0; } /** * {@inheritDoc} */ public boolean isSeparator() { return m_menuItem == null; } /** * {@inheritDoc} */ public void selectMenuItem() { clickMenuItem(getRobot(), m_menuItem); } /** * {@inheritDoc} */ public IMenuComponent openSubMenu() { if (!m_menuItem.isEnabled()) { throw new StepExecutionException("menu item not enabled", //$NON-NLS-1$ EventFactory.createActionError( TestErrorEvent.MENU_ITEM_NOT_ENABLED)); } if (!(m_menuItem instanceof JMenu)) { throw new StepExecutionException("unexpected item found", //$NON-NLS-1$ EventFactory.createActionError(TestErrorEvent.NOT_FOUND)); } JMenu menu = (JMenu) m_menuItem; clickMenuItem(getRobot(), m_menuItem); RobotTiming.sleepPostShowSubMenuItem(menu.getDelay()); return getMenu(); } /** * Clicks on a menu item * * @param robot the robot * @param item the menu item */ private void clickMenuItem(IRobot robot, JMenuItem item) { if (EnvironmentUtils.isMacOS()) { TimeUtil.delay(300); } if (!item.isEnabled()) { throw new StepExecutionException("menu item not enabled", //$NON-NLS-1$ EventFactory.createActionError( TestErrorEvent.MENU_ITEM_NOT_ENABLED)); } MenuSelectionManager selectionmanager = MenuSelectionManager .defaultManager(); MenuElement[] menus = new MenuElement[0]; if (selectionmanager != null) { menus = MenuSelectionManager.defaultManager().getSelectedPath(); } if (item.getParent() instanceof JPopupMenu && ((JPopupMenu) item.getParent()).getInvoker() .getParent() instanceof JMenuBar) { if (!EnvironmentUtils.isMacOS() || (menus.length > 0 && menus[0] instanceof JPopupMenu)) { robot.click(item, null, ClickOptions.create() .setClickType(ClickOptions.ClickType.RELEASED) .setFirstHorizontal(false)); } else { item.doClick(); } } else { if (!EnvironmentUtils.isMacOS() || (menus.length > 0 && menus[0] instanceof JPopupMenu)) { robot.click(item, null, ClickOptions.create() .setClickType(ClickOptions.ClickType.RELEASED)); } else { item.doClick(); } } } }