blob: 07296e031f46fc02fede757b34565dd9c102a2ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 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 and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.autagent.desktop;
import java.awt.AWTException;
import java.awt.CheckboxMenuItem;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.jubula.autagent.AutStarter;
import org.eclipse.jubula.autagent.agent.AutAgent;
import org.eclipse.jubula.autagent.desktop.listener.StartOMActionListener;
import org.eclipse.jubula.autagent.desktop.listener.StopOMActionListener;
import org.eclipse.jubula.autagent.gui.ObjectMappingFrame;
import org.eclipse.jubula.autagent.i18n.Messages;
import org.eclipse.jubula.communication.internal.Communicator;
import org.eclipse.jubula.communication.internal.Communicator.ConnectionManager;
import org.eclipse.jubula.tools.internal.registration.AutIdentifier;
import org.eclipse.jubula.tools.internal.utils.EnvironmentUtils;
import org.eclipse.jubula.version.Vn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author BREDEX GmbH
* @created 11.06.2010
*/
public class DesktopIntegration implements PropertyChangeListener {
/**
*
*/
private static final String PROP_OBJECT_MAPPING_AUT = "OBJECT_MAPPING_AUT"; //$NON-NLS-1$
/** if the object agent OM is used the AUT */
private static AutIdentifier omAut = null;
/** property change support */
private static PropertyChangeSupport propertyChangedSupport;
/** the logger */
private static final Logger LOG =
LoggerFactory.getLogger(DesktopIntegration.class);
/** is the system tray supported on this platform */
private boolean m_isSystraySupported;
/** access to system tray */
private TrayIcon m_trayIcon;
/** status: port number */
private int m_port = 0;
/** {@link PopupMenu} for the start of the ObjectMapping*/
private PopupMenu m_startOMMMenu = null;
/** {@link PopupMenu} for the stop of the ObjectMapping*/
private MenuItem m_stopOMMMenu = null;
/** is the autagent mapping mode usable */
private boolean m_objectMappingMode = false;
/** status: connected AUTs */
private List<String> m_auts = new ArrayList<String>();
/**
* create the necessary environment
*
* @param autAgent The AUT Agent monitored by the created object.
*/
public DesktopIntegration(final AutAgent autAgent) {
this(autAgent, false);
}
/**
* create the necessary environment
*
* @param autAgent The AUT Agent monitored by the created object.
* @param objectMapping if the object mapping should be possible
*/
public DesktopIntegration(final AutAgent autAgent, boolean objectMapping) {
m_objectMappingMode = objectMapping;
propertyChangedSupport = new PropertyChangeSupport(this);
propertyChangedSupport.addPropertyChangeListener(this);
if (EnvironmentUtils.isMacOS()) {
// WORKAROUND for hanging SystemTray.isSupported()
m_isSystraySupported = false;
return;
}
m_isSystraySupported = SystemTray.isSupported();
if (m_isSystraySupported) {
SystemTray tray = SystemTray.getSystemTray();
final ClassLoader classLoader = this.getClass().getClassLoader();
URL imageURL = classLoader.getResource("resources/autagent.png"); //$NON-NLS-1$
Image image = Toolkit.getDefaultToolkit().getImage(imageURL);
ActionListener exitListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
PopupMenu popup = new PopupMenu();
final CheckboxMenuItem strictModeItem = new CheckboxMenuItem("Strict AUT Management"); //$NON-NLS-1$
autAgent.addPropertyChangeListener(
AutAgent.PROP_KILL_DUPLICATE_AUTS,
new PropertyChangeListener() {
@SuppressWarnings("synthetic-access")
public void propertyChange(PropertyChangeEvent evt) {
Object newValue = evt.getNewValue();
if (newValue instanceof Boolean) {
boolean isKillDuplicateAuts =
((Boolean)newValue).booleanValue();
strictModeItem.setState(isKillDuplicateAuts);
} else {
LOG.error("Expected new value for property to be of type " + Boolean.class.getName()); //$NON-NLS-1$
}
}
});
boolean isKillDuplicateAuts = autAgent.isKillDuplicateAuts();
strictModeItem.setState(isKillDuplicateAuts);
strictModeItem.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
autAgent.setKillDuplicateAuts(
e.getStateChange() == ItemEvent.SELECTED);
}
});
MenuItem defaultItem = new MenuItem("Exit"); //$NON-NLS-1$
defaultItem.addActionListener(exitListener);
popup.add(strictModeItem);
if (m_objectMappingMode) {
PopupMenu objectMappingMenu = createObjectMappingPopup();
popup.add(objectMappingMenu);
}
popup.addSeparator();
popup.add(defaultItem);
m_trayIcon = new TrayIcon(image, "AUT Agent", popup); //$NON-NLS-1$
m_trayIcon.setImageAutoSize(true);
try {
tray.add(m_trayIcon);
} catch (AWTException e) {
m_isSystraySupported = false; // strange but ignorable
}
}
}
/**
* @return the AUT which is in the agent Mapping Mode or
* <code>null</code> id there is no
*/
public static AutIdentifier getObjectMappingAUT() {
return omAut;
}
/**
* @param autID the AUT which is set to OMM or <code>null</code>
* if there is no AUT
*/
public static void setObjectMappingAUT(AutIdentifier autID) {
AutIdentifier id = omAut;
omAut = autID;
propertyChangedSupport.firePropertyChange(PROP_OBJECT_MAPPING_AUT,
id, omAut);
}
/**
*
* @return the popup menu with its children
*/
private PopupMenu createObjectMappingPopup() {
PopupMenu objectMappingMenu = new PopupMenu(
Messages.ObjectMappingMenu);
m_startOMMMenu = new PopupMenu(Messages.StartMenu);
m_startOMMMenu.setEnabled(false);
m_stopOMMMenu = new MenuItem(Messages.StopMenu);
m_stopOMMMenu.setEnabled(false);
MenuItem settings = new MenuItem(Messages.ObjectMappingMenu);
settings.addActionListener(new ActionListener() {
/** show the object mapping windows*/
public void actionPerformed(ActionEvent e) {
ObjectMappingFrame.INSTANCE.showObjectMappingPanel();
}
});
objectMappingMenu.add(m_startOMMMenu);
objectMappingMenu.add(m_stopOMMMenu);
objectMappingMenu.add(settings);
return objectMappingMenu;
}
/**
* update the tray icon when the status changes
*/
private void updateStatus() {
if (m_isSystraySupported) {
m_trayIcon.setToolTip(buildToolTip());
}
}
/**
* @return info according to status fields
*/
private String buildToolTip() {
StringBuilder tt = new StringBuilder(
"AUT Agent " + Vn.getDefault().getVersion() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
tt.append(" Port used: "); //$NON-NLS-1$
tt.append(m_port);
if (!m_auts.isEmpty()) {
tt.append('\n');
tt.append(' ');
tt.append(m_auts.size());
tt.append(" running AUT"); //$NON-NLS-1$
if (m_auts.size() == 1) {
tt.append(':');
} else {
tt.append("s:"); //$NON-NLS-1$
}
for (String aut : m_auts) {
tt.append('\n');
tt.append(' ');
tt.append(aut);
}
}
return tt.toString();
}
/**
* @param port info
*/
public void setPort(int port) {
m_port = port;
updateStatus();
}
/**
* {@inheritDoc}
*/
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(AutAgent.PROP_NAME_AUTS)) {
AutStarter.getInstance().getCommunicator()
.getConnectionManager().removePropertyChangedListener(this);
AutStarter.getInstance().getCommunicator()
.getConnectionManager().addPropertyChangedListener(this);
if (evt.getNewValue() instanceof AutIdentifier) {
AutIdentifier aut = (AutIdentifier)evt.getNewValue();
m_auts.add(aut.getExecutableName());
rebuildOMSubMenu();
}
if (evt.getOldValue() instanceof AutIdentifier) {
AutIdentifier aut = (AutIdentifier)evt.getOldValue();
if (omAut != null && omAut.equals(aut)) {
omAut = null;
}
m_auts.remove(aut.getExecutableName());
rebuildOMSubMenu();
}
}
if (evt.getPropertyName().equals(PROP_OBJECT_MAPPING_AUT)
|| evt.getPropertyName().equals(
ConnectionManager.PROP_CONNECTION_CHANGE)) {
rebuildOMSubMenu();
}
updateStatus();
}
/**
* rebuilds the sub menus in the object mapping part.
* This is enabling/disabling the menus and adding the AUTs to the
* start and stop sub menus
*/
private void rebuildOMSubMenu() {
if (!m_objectMappingMode) {
return;
}
/** Start Menu Items*/
m_startOMMMenu.removeAll();
Communicator clientComm =
AutStarter.getInstance().getCommunicator();
if ((clientComm != null && clientComm.getConnectionManager() != null
&& clientComm.getConnectionManager().getNextState() != 0)) {
m_startOMMMenu.setEnabled(false);
} else {
m_startOMMMenu.setEnabled((omAut == null && m_auts.size() > 0));
}
Set<AutIdentifier> auts = AutStarter.getInstance()
.getAgent().getAuts();
for (AutIdentifier autIdentifier : auts) {
MenuItem menuItem = new MenuItem(autIdentifier.getID());
menuItem.addActionListener(
new StartOMActionListener(autIdentifier));
m_startOMMMenu.add(menuItem);
}
/** STOP menu items */
m_stopOMMMenu.setEnabled(omAut != null);
ActionListener[] listener = m_stopOMMMenu.getActionListeners();
for (int i = 0; i < listener.length; i++) {
m_stopOMMMenu.removeActionListener(listener[i]);
}
if (m_stopOMMMenu.isEnabled()) {
m_stopOMMMenu.addActionListener(
new StopOMActionListener(omAut));
}
}
}