/*******************************************************************************
* 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.remote.dialogs;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.swing.JTextField;
import org.eclipse.jubula.autagent.AutStarter;
import org.eclipse.jubula.communication.internal.Communicator;
import org.eclipse.jubula.communication.internal.message.CAPRecordedMessage;
import org.eclipse.jubula.communication.internal.message.ChangeAUTModeMessage;
import org.eclipse.jubula.communication.internal.message.MessageCap;
import org.eclipse.jubula.communication.internal.message.MessageParam;
import org.eclipse.jubula.communication.internal.message.ServerShowDialogResponseMessage;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.exception.CommunicationException;
import org.eclipse.jubula.tools.internal.i18n.CompSystemI18n;
import org.eclipse.jubula.tools.internal.objects.IComponentIdentifier;
import org.eclipse.jubula.tools.internal.xml.businessmodell.Action;
import org.eclipse.jubula.tools.internal.xml.businessmodell.Component;
import org.eclipse.jubula.tools.internal.xml.businessmodell.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author BREDEX GmbH
* @created 20.06.2005
*/
public class ChooseCheckModeDialogBP {
/** the logger */
private static final Logger LOG = LoggerFactory
.getLogger(ChooseCheckModeDialogBP.class);
/**
* singleton
*/
private static ChooseCheckModeDialog dialog = null;
/**
* instance
*/
private static ChooseCheckModeDialogBP instance = null;
/**
* a list of actions
*/
private Map<String, Action> m_actionsObj = new HashMap<String, Action>();
/**
* a list of actions
*/
private List<String> m_actionsNames = new ArrayList<String>();
/** ComponentIdentifier of actual component */
private IComponentIdentifier m_compId;
/** String for logical Name */
private String m_logName;
/**
* constructor
*
*/
private ChooseCheckModeDialogBP() {
// private constructor
}
/**
* creates a dialog
* @param component Component
* @param ci ComponentIdentifier
* @param point Point on Screen
* @param checkValues Map
* @param logName String
*/
public void create(final Component component, IComponentIdentifier ci,
final Point point, final Map checkValues, String logName) {
m_compId = ci;
m_logName = logName;
if (dialog != null) {
closeDialog(ChangeAUTModeMessage.RECORD_MODE);
}
EventQueue.invokeLater(new Runnable() {
public void run() {
dialog = new ChooseCheckModeDialog();
dialog.setCheckValues(checkValues);
initValues(component);
initialize();
dialog.createParameterPanel((m_actionsObj.get(
m_actionsNames.get(dialog.getAction()))));
addListener();
addListenerStopCheckMode();
dialog.getOkAndCheckOnButton().requestFocus();
Dimension screenSize = java.awt.Toolkit
.getDefaultToolkit().getScreenSize();
Dimension frameSize = dialog.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
dialog.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
dialog.setVisible(true);
dialog.toFront();
}
});
}
/**
* adds the listeners to the dialog
*
*/
private void addListener() {
dialog.getOkAndCheckOnButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
createCAP();
closeDialog(ChangeAUTModeMessage.CHECK_MODE);
}
});
dialog.getOkAndCheckOnButton().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
createCAP();
closeDialog(ChangeAUTModeMessage.CHECK_MODE);
}
}
});
dialog.getCancelButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
closeDialog(ChangeAUTModeMessage.CHECK_MODE);
}
});
dialog.getCancelButton().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
closeDialog(ChangeAUTModeMessage.CHECK_MODE);
}
}
});
dialog.getActionCombo().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
dialog.createParameterPanel((m_actionsObj.get(
m_actionsNames.get(dialog.getAction()))));
for (int i = 0; i < dialog.getTextFields().size(); i++) {
JTextField field = (JTextField)dialog.getTextFields()
.get(i);
field.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
createCAP();
for (int i1 = 0; i1 < dialog.getTextFields()
.size(); i1++) {
JTextField field1 = (JTextField)dialog
.getTextFields().get(i1);
field1.removeKeyListener(this);
}
closeDialog(ChangeAUTModeMessage.CHECK_MODE);
}
}
});
}
}
});
for (int i = 0; i < dialog.getTextFields().size(); i++) {
JTextField field = (JTextField)dialog.getTextFields().get(i);
field.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
createCAP();
for (int i1 = 0; i1 < dialog.getTextFields().size();
i1++) {
JTextField field1 = (JTextField)dialog
.getTextFields().get(i1);
field1.removeKeyListener(this);
}
closeDialog(ChangeAUTModeMessage.CHECK_MODE);
}
}
});
}
}
/**
* adds the listeners to the dialog
*
*/
private void addListenerStopCheckMode() {
dialog.getOkButStopCheckButton().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
createCAP();
closeDialog(ChangeAUTModeMessage.RECORD_MODE);
}
});
dialog.getOkButStopCheckButton().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 10) {
createCAP();
closeDialog(ChangeAUTModeMessage.RECORD_MODE);
}
}
});
}
/**
* records and executes a cap
*
*/
private void createCAP() {
MessageCap messageCap = new MessageCap();
// setup Action in MessageCap
Action action = m_actionsObj.get(m_actionsNames.
get(dialog.getAction()));
messageCap.setMethod(action.getMethod());
messageCap.setAction(action);
// setup ComponentIdentifier in MessageCap
messageCap.setCi(m_compId);
messageCap.setLogicalName(m_logName);
// setup parameters in MessageCap
List parameterValues = dialog.getParameter();
List params = m_actionsObj.get(m_actionsNames.get(dialog.
getAction())).getParams();
for (int i = 0; i < params.size(); i++) {
Param param = (Param) params.get(i);
MessageParam messageParam = new MessageParam();
messageParam.setType(param.getType());
String emptyString = StringConstants.EMPTY;
String value =
emptyString.equals(parameterValues.get(i)) ? null
: (String)parameterValues.get(i);
if (value.length() > 3999) {
String extraMsg =
"Actions with Strings larger than 3999 are not supported"; //$NON-NLS-1$
ObservationConsoleBP.getInstance().setExtraMessage(extraMsg);
return;
}
messageParam.setValue(value);
messageCap.addMessageParam(messageParam);
}
CAPRecordedMessage capTestMessage = new CAPRecordedMessage(messageCap);
try {
AutStarter.getInstance().getCommunicator().send(capTestMessage);
} catch (CommunicationException e) { // NOPMD by al on 4/11/07 3:39 PM
LOG.error(e.getLocalizedMessage(), e);
}
}
/**
* initializing values
* @param comp
* Component
*/
private void initValues(Component comp) {
Component component = comp;
while (component != null && !component.isVisible()
&& !component.getRealized().isEmpty()) {
List realizedComponents = component.getRealized();
component = (Component)realizedComponents.get(0);
}
if (component.getType() != null) {
dialog.setNameLabel(CompSystemI18n.getString(component.getType()));
} else {
dialog.setNameLabel(
CompSystemI18n.getString(m_compId.getSupportedClassName()));
}
m_actionsObj.clear();
Iterator iter = component.getActions().iterator();
List<String> names = new LinkedList<String>();
while (iter.hasNext()) {
Action action = (Action) iter.next();
if (!action.isDeprecated()
&& action.getName().indexOf("Verify") != -1 //$NON-NLS-1$
&& !action.getName().equals(
"CompSystem.VerifyTableCellTextAtMousePosition") //$NON-NLS-1$
&& !action.getName().endsWith("Indexpath") //$NON-NLS-1$
&& !action.getName().endsWith("Indexpath (Specify Position)") //$NON-NLS-1$
&& !action.getName().endsWith("Index") //$NON-NLS-1$
&& !action.getName().endsWith("Indices")) { //$NON-NLS-1$
names.add(CompSystemI18n.getString(action.getName()));
m_actionsObj.put(CompSystemI18n.getString(action.getName()),
action);
}
}
m_actionsNames = names;
Collections.sort(m_actionsNames, Collections.reverseOrder());
dialog.setActions(m_actionsNames);
}
/**
* Initialize the AutFrame
*/
private void initialize() {
dialog.setSize(320, 250);
dialog.setResizable(false);
}
/**
* disposes the dialog if open and sets mode
* @param mode int
*/
public void closeDialog(int mode) {
if (dialog != null) {
EventQueue.invokeLater(new Runnable() {
public void run() {
dialog.dispose();
dialog = null;
}
});
m_actionsNames.clear();
m_actionsObj.clear();
try {
ServerShowDialogResponseMessage responseMsg =
new ServerShowDialogResponseMessage(false, mode);
responseMsg.setBelongsToDialog(true);
Communicator autCommunicator =
AutStarter.getInstance().getAutCommunicator();
if (autCommunicator != null
&& autCommunicator.getConnection() != null) {
autCommunicator.send(responseMsg);
}
} catch (CommunicationException e) {
LOG.error("Error sending message!", e); //$NON-NLS-1$
}
}
}
/**
* disposes the dialog if open;
*
*/
public void closeDialog() {
if (dialog != null) {
EventQueue.invokeLater(new Runnable() {
public void run() {
dialog.dispose();
dialog = null;
}
});
m_actionsNames.clear();
m_actionsObj.clear();
}
}
/**
* getting instance of this class
* @return instance
*/
public static ChooseCheckModeDialogBP getInstance() {
if (instance == null) {
instance = new ChooseCheckModeDialogBP();
}
return instance;
}
}