/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.wizards.toolintegration; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.help.IWorkbenchHelpSystem; import de.rcenvironment.core.component.integration.ToolIntegrationConstants; import de.rcenvironment.core.datamodel.api.DataType; import de.rcenvironment.core.gui.resources.api.FontManager; import de.rcenvironment.core.gui.resources.api.StandardFonts; import de.rcenvironment.core.gui.utils.common.widgets.LineNumberStyledText; import de.rcenvironment.core.gui.wizards.toolintegration.api.ToolIntegrationWizardPage; /** * @author Sascha Zur */ public class ScriptConfigurationPage extends ToolIntegrationWizardPage { /** Constant. */ public static final int INPUT_COMBO = 0; /** Constant. */ public static final int OUTPUT_COMBO = 1; /** Constant. */ public static final int PROPERTY_COMBO = 2; /** Constant. */ public static final int ADD_PROPERTY_COMBO = 3; /** Constant. */ public static final int DIRECTORY_COMBO = 4; private static final int MOCK_GROUP_MINIMUM_HEIGHT = 67; private static final String HELP_CONTEXT_ID = "de.rcenvironment.core.gui.wizard.toolintegration.integration_execution"; private static final int TEXTFIELD_HEIGHT = 270; private static final int TEXTFIELD_WIDTH = 300; private static final int NUMBER_OF_TABS = 4; // To avoid dependency cycles this key exists also in the file CpacsToolIntegrationConstants.java, // see KEY_MOCK_TOOL_OUTPUT_FILENAME private static final String CPACS_MOCK_TOOL_OUTPUT_FILENAME = "imitationToolOutputFilename"; protected Map<String, Object> configurationMap; private final Combo[] inputCombos; private final Combo[] outputCombos; private final Combo[] propertiesCombos; private final Combo[] directoryCombos; private final LineNumberStyledText[] textFields; private Button winEnabledButton = null; private Button linuxEnabledButton = null; private boolean winScriptHasFocus = false; private Button noErrorOnOtherExitCodeButton; private Button setWorkingDirAsCwdButton; private Button setToolDirAsCwdButton; private Label executionPathLabel; private Button mockModeCheckBox; private CTabFolder tabFolder; private Composite mockScriptTabComposite; private Composite mockScriptTabButtonComposite; private Text mockToolOutputFilenameText; private Label mockToolOutputFilenameLabel; protected ScriptConfigurationPage(String pageName, Map<String, Object> configurationMap) { super(pageName); setTitle(pageName); setDescription(Messages.scriptPageDescription); this.configurationMap = configurationMap; inputCombos = new Combo[NUMBER_OF_TABS]; outputCombos = new Combo[NUMBER_OF_TABS]; propertiesCombos = new Combo[NUMBER_OF_TABS]; directoryCombos = new Combo[NUMBER_OF_TABS]; textFields = new LineNumberStyledText[NUMBER_OF_TABS + 1]; } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayout(new GridLayout(1, false)); tabFolder = new CTabFolder(container, SWT.BORDER); GridData layoutData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL); layoutData.grabExcessVerticalSpace = true; tabFolder.setLayoutData(layoutData); createScriptTabItem(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX, Messages.commandScriptMessage, 0); createScriptTabItem(ToolIntegrationConstants.KEY_PRE_SCRIPT, Messages.preScript, 1); createScriptTabItem(ToolIntegrationConstants.KEY_POST_SCRIPT, Messages.postScript, 2); createScriptTabItem(ToolIntegrationConstants.KEY_MOCK_SCRIPT, "Tool run imitation script", 3); tabFolder.setSelection(0); createMockModeGroup(container); setControl(container); PlatformUI.getWorkbench().getHelpSystem().setHelp(this.getControl(), HELP_CONTEXT_ID); updatePageComplete(); } private void createMockModeGroup(Composite container) { GridData layoutData; Group mockGroup = new Group(container, SWT.NONE); mockGroup.setText("Tool run imitation mode"); mockGroup.setLayout(new GridLayout(2, false)); layoutData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); layoutData.minimumHeight = MOCK_GROUP_MINIMUM_HEIGHT; mockGroup.setLayoutData(layoutData); mockModeCheckBox = new Button(mockGroup, SWT.CHECK); layoutData = new GridData(); layoutData.horizontalSpan = 2; mockModeCheckBox.setLayoutData(layoutData); mockModeCheckBox.setText("Support tool run imitation"); mockModeCheckBox.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { setMockScriptTabEnabled(mockModeCheckBox.getSelection()); if (mockToolOutputFilenameText != null) { mockToolOutputFilenameText.setEnabled(mockModeCheckBox.getSelection()); } configurationMap.put(ToolIntegrationConstants.KEY_MOCK_MODE_SUPPORTED, mockModeCheckBox.getSelection()); updatePageComplete(); } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } }); // FIXME: CPACS-specific stuff must not be handled here; temporary workaround as wizard will // be replaced by an editor soon mockToolOutputFilenameLabel = new Label(mockGroup, SWT.NONE); mockToolOutputFilenameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); mockToolOutputFilenameLabel.setText("Dummy tool output filename:"); mockToolOutputFilenameText = new Text(mockGroup, SWT.BORDER); mockToolOutputFilenameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); mockToolOutputFilenameText.addModifyListener(new TextAreaModifyListener(CPACS_MOCK_TOOL_OUTPUT_FILENAME)); mockToolOutputFilenameLabel.setVisible(false); mockToolOutputFilenameText.setVisible(false); } private void setChildrenEnabled(Composite parent, boolean enabled) { for (Control control : parent.getChildren()) { control.setEnabled(enabled); } } private void setMockScriptTabEnabled(boolean enabled) { tabFolder.getTabList()[3].setEnabled(enabled); setChildrenEnabled(mockScriptTabComposite, enabled); setChildrenEnabled(mockScriptTabButtonComposite, enabled); } /** * Updates all Combos when page is shown. */ @Override @SuppressWarnings("unchecked") public void updatePage() { for (int i = 0; i < NUMBER_OF_TABS; i++) { addAllEndpoints(inputCombos[i], ToolIntegrationConstants.KEY_ENDPOINT_INPUTS, i); setComboEnabled(inputCombos[i]); if (i > 0) { addAllEndpoints(outputCombos[i], ToolIntegrationConstants.KEY_ENDPOINT_OUTPUTS, i); } setComboEnabled(outputCombos[i]); propertiesCombos[i].removeAll(); if (configurationMap.containsKey(ToolIntegrationConstants.KEY_PROPERTIES)) { Map<String, Object> properties = (Map<String, Object>) configurationMap.get(ToolIntegrationConstants.KEY_PROPERTIES); for (String propTabName : properties.keySet()) { Map<String, Object> proptab = (Map<String, Object>) properties.get(propTabName); for (String propkey : proptab.keySet()) { if (proptab.get(propkey) instanceof Map<?, ?>) { Map<String, String> property = (Map<String, String>) proptab.get(propkey); propertiesCombos[i].add((property.get(ToolIntegrationConstants.KEY_PROPERTY_DISPLAYNAME))); } } } } if (propertiesCombos[i].getItemCount() > 0) { propertiesCombos[i].select(0); } setComboEnabled(propertiesCombos[i]); directoryCombos[i].select(0); boolean mockModeSupported = configurationMap.containsKey(ToolIntegrationConstants.KEY_MOCK_MODE_SUPPORTED) && (boolean) configurationMap.get(ToolIntegrationConstants.KEY_MOCK_MODE_SUPPORTED); setMockScriptTabEnabled(mockModeSupported); mockModeCheckBox.setSelection(mockModeSupported); if (mockToolOutputFilenameText != null) { mockToolOutputFilenameText.setEnabled(mockModeSupported); } } boolean isCPACSType = ((ToolIntegrationWizard) getWizard()).getCurrentContext().getContextType().equalsIgnoreCase("CPACS"); mockToolOutputFilenameLabel.setVisible(isCPACSType); mockToolOutputFilenameText.setVisible(isCPACSType); updateButtons(); updatePageComplete(); } private void setComboEnabled(Combo combo) { if (combo != null) { if (combo.getItemCount() == 0) { combo.setEnabled(false); } else { combo.setEnabled(true); } } } private void updateButtons() { boolean windowsEnabled = false; boolean linuxEnabled = false; if (configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS_ENABLED) != null) { windowsEnabled = (Boolean) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS_ENABLED); } if (configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX_ENABLED) != null) { linuxEnabled = (Boolean) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX_ENABLED); } winEnabledButton.setSelection(windowsEnabled); linuxEnabledButton.setSelection(linuxEnabled); textFields[0].setEditable(linuxEnabled); textFields[0].setEnabled(linuxEnabled); textFields[textFields.length - 1].setEditable(windowsEnabled); textFields[textFields.length - 1].setEnabled(windowsEnabled); if ((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX) != null) { textFields[0].setText((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX)); } else { textFields[0].setText(""); } if ((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS) != null) { textFields[textFields.length - 1].setText((String) configurationMap .get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS)); } else { textFields[textFields.length - 1].setText(""); } if ((String) configurationMap.get(ToolIntegrationConstants.KEY_PRE_SCRIPT) != null) { textFields[1].setText((String) configurationMap.get(ToolIntegrationConstants.KEY_PRE_SCRIPT)); } else { textFields[1].setText(""); } if ((String) configurationMap.get(ToolIntegrationConstants.KEY_POST_SCRIPT) != null) { textFields[2].setText((String) configurationMap.get(ToolIntegrationConstants.KEY_POST_SCRIPT)); } else { textFields[2].setText(""); } if ((String) configurationMap.get(ToolIntegrationConstants.KEY_MOCK_SCRIPT) != null) { textFields[3].setText((String) configurationMap.get(ToolIntegrationConstants.KEY_MOCK_SCRIPT)); } else { textFields[3].setText(""); } if (configurationMap.get(ToolIntegrationConstants.DONT_CRASH_ON_NON_ZERO_EXIT_CODES) != null) { noErrorOnOtherExitCodeButton.setSelection((Boolean) configurationMap .get(ToolIntegrationConstants.DONT_CRASH_ON_NON_ZERO_EXIT_CODES)); } if (configurationMap.get(ToolIntegrationConstants.KEY_SET_TOOL_DIR_AS_WORKING_DIR) != null) { boolean toolDirIsCwd = (Boolean) configurationMap.get(ToolIntegrationConstants.KEY_SET_TOOL_DIR_AS_WORKING_DIR); setWorkingDirAsCwdButton.setSelection(!toolDirIsCwd); setToolDirAsCwdButton.setSelection(toolDirIsCwd); } else { setWorkingDirAsCwdButton.setSelection(true); setToolDirAsCwdButton.setSelection(false); } setWorkingDirAsCwdButton.setEnabled(true); setToolDirAsCwdButton.setEnabled(true); executionPathLabel.setEnabled(true); for (String key : ((ToolIntegrationWizard) this.getWizard()).getCurrentContext().getDisabledIntegrationKeys()) { if (ToolIntegrationConstants.KEY_SET_TOOL_DIR_AS_WORKING_DIR.equals(key)) { setToolDirAsCwdButton.setEnabled(false); setWorkingDirAsCwdButton.setEnabled(false); executionPathLabel.setEnabled(false); } } if (mockToolOutputFilenameText != null) { if ((String) configurationMap.get(CPACS_MOCK_TOOL_OUTPUT_FILENAME) != null) { mockToolOutputFilenameText.setText((String) configurationMap.get(CPACS_MOCK_TOOL_OUTPUT_FILENAME)); } else { mockToolOutputFilenameText.setText(""); } } } private void updatePageComplete() { boolean winEnabled = (configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS_ENABLED) != null && (Boolean) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS_ENABLED)); boolean linuxEnabled = (configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX_ENABLED) != null && (Boolean) configurationMap .get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX_ENABLED)); if (!(winEnabled || linuxEnabled)) { setPageComplete(false); } else { boolean winScriptNotEmpty = ((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS)) != null && !((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS)).trim().isEmpty(); boolean linuxScriptNotEmpty = ((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX)) != null && !((String) configurationMap.get(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX)).trim().isEmpty(); if ((winEnabled && winScriptNotEmpty) || (linuxEnabled && linuxScriptNotEmpty)) { validateIsMockScriptConfiguration(); } else { setMessage(Messages.toolExecutionCommandNeeded, DialogPage.ERROR); setPageComplete(false); } } } private LineNumberStyledText createScriptTabItem(String propertyKey, String name, int buttonIndex) { CTabItem item = new CTabItem(tabFolder, SWT.NONE); item.setText(name); Composite client = new Composite(tabFolder, SWT.NONE); if (buttonIndex == 0) { winEnabledButton = new Button(client, SWT.CHECK); winEnabledButton.setText(Messages.winCommandUse); linuxEnabledButton = new Button(client, SWT.CHECK); linuxEnabledButton.setText(Messages.linuxCommandUse); new Label(client, SWT.NONE); } final LineNumberStyledText scriptAreaWin; if (buttonIndex == 0) { client.setLayout(new GridLayout(3, false)); scriptAreaWin = new LineNumberStyledText(client, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); GridData scriptAreaWinData = new GridData(GridData.FILL_BOTH); scriptAreaWinData.widthHint = TEXTFIELD_WIDTH / 2; scriptAreaWinData.heightHint = TEXTFIELD_HEIGHT; scriptAreaWin.setLayoutData(scriptAreaWinData); scriptAreaWin.addModifyListener(new TextAreaModifyListener(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS)); scriptAreaWin.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent arg0) {} @Override public void focusGained(FocusEvent arg0) { winScriptHasFocus = true; } }); scriptAreaWin.setEditable(false); textFields[textFields.length - 1] = scriptAreaWin; } else { scriptAreaWin = null; client.setLayout(new GridLayout(2, false)); } item.setControl(client); final LineNumberStyledText scriptArea = new LineNumberStyledText(client, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); GridData scriptAreaData = new GridData(GridData.FILL_BOTH); if (buttonIndex == 0) { scriptArea.setEnabled(false); scriptArea.setEditable(false); scriptArea.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent arg0) {} @Override public void focusGained(FocusEvent arg0) { winScriptHasFocus = false; } }); scriptAreaData.widthHint = TEXTFIELD_WIDTH / 2; } else { scriptAreaData.widthHint = TEXTFIELD_WIDTH; } scriptAreaData.heightHint = TEXTFIELD_HEIGHT; scriptArea.setLayoutData(scriptAreaData); scriptArea.addModifyListener(new TextAreaModifyListener(propertyKey)); textFields[buttonIndex] = scriptArea; if (buttonIndex == 0) { addScriptSelectButtonListener(); } createInsertFields(buttonIndex, client, scriptAreaWin, scriptArea); if (buttonIndex > 0) { Label jythonLabel = new Label(client, SWT.NONE); jythonLabel.setText(Messages.scriptLanguageHint); } else { new Label(client, SWT.NONE).setText(Messages.scriptLanguageHintBatch); new Label(client, SWT.NONE).setText(Messages.scriptLanguageHintBash); new Label(client, SWT.NONE).setText(""); Group executionPropertiesGroup = new Group(client, SWT.NONE); executionPropertiesGroup.setText("Execution Options"); executionPropertiesGroup.setLayout(new GridLayout(1, false)); GridData executionPropertiesData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); executionPropertiesData.horizontalSpan = 3; executionPropertiesGroup.setLayoutData(executionPropertiesData); noErrorOnOtherExitCodeButton = new Button(executionPropertiesGroup, SWT.CHECK); noErrorOnOtherExitCodeButton.setText(Messages.dontCrashOtherThanZeroLabel); noErrorOnOtherExitCodeButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { configurationMap.put(ToolIntegrationConstants.DONT_CRASH_ON_NON_ZERO_EXIT_CODES, noErrorOnOtherExitCodeButton.getSelection()); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); executionPathLabel = new Label(executionPropertiesGroup, SWT.NONE); executionPathLabel.setText("Execute (command(s), pre execution/post exectuion/tool run imitation script) from"); setWorkingDirAsCwdButton = new Button(executionPropertiesGroup, SWT.RADIO); setWorkingDirAsCwdButton.setSelection(true); setWorkingDirAsCwdButton.setText("Working directory"); setWorkingDirAsCwdButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { configurationMap.put(ToolIntegrationConstants.KEY_SET_TOOL_DIR_AS_WORKING_DIR, !setWorkingDirAsCwdButton.getSelection()); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); setToolDirAsCwdButton = new Button(executionPropertiesGroup, SWT.RADIO); setToolDirAsCwdButton.setText("Tool directory"); setToolDirAsCwdButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { configurationMap.put(ToolIntegrationConstants.KEY_SET_TOOL_DIR_AS_WORKING_DIR, setToolDirAsCwdButton.getSelection()); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); } for (LineNumberStyledText textField : textFields) { if (textField != null) { textField.setFont(FontManager.getInstance().getFont(StandardFonts.CONSOLE_TEXT_FONT)); } } if (buttonIndex == 3) { mockScriptTabComposite = client; } return scriptArea; } private void validateIsMockScriptConfiguration() { if (mockModeCheckBox.getSelection() && textFields[3].getText().isEmpty() && !mockToolOutputFilenameText.isVisible()) { setMessage("Tool run imitation mode is supported but no tool run imitation script is configured.", DialogPage.ERROR); setPageComplete(false); } else if (mockModeCheckBox.getSelection() && mockToolOutputFilenameText.isVisible() && mockToolOutputFilenameText.getText().isEmpty()) { setMessage("Tool run imitation mode is supported but no dummy tool output filename is configured.", DialogPage.ERROR); setPageComplete(false); } else { setMessage(null, DialogPage.NONE); setPageComplete(true); } } private void createInsertFields(int buttonIndex, Composite client, final LineNumberStyledText scriptAreaWin, final LineNumberStyledText scriptArea) { Composite buttonComposite = new Composite(client, SWT.NONE); buttonComposite.setLayout(new GridLayout(2, false)); GridData buttonCompositeData = new GridData(); buttonCompositeData.verticalAlignment = GridData.BEGINNING; buttonComposite.setLayoutData(buttonCompositeData); GridData labelData = new GridData(); labelData.horizontalSpan = 2; Label inputLabel = new Label(buttonComposite, SWT.NONE); inputLabel.setText(Messages.inputs); inputLabel.setLayoutData(labelData); Combo inputCombo = new Combo(buttonComposite, SWT.READ_ONLY); GridData inputComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); inputCombo.setLayoutData(inputComboData); Button inputInsertButton = new Button(buttonComposite, SWT.PUSH); inputInsertButton.setText(Messages.insertButtonLabel); if (buttonIndex == 0) { inputInsertButton.addSelectionListener(new InsertButtonListener(inputCombo, scriptArea, scriptAreaWin, INPUT_COMBO)); } else { inputInsertButton.addSelectionListener(new InsertButtonListener(inputCombo, scriptArea, INPUT_COMBO)); } inputCombos[buttonIndex] = inputCombo; if (buttonIndex > 0) { GridData labelDataOutput = new GridData(); labelDataOutput.horizontalSpan = 2; Label outputLabel = new Label(buttonComposite, SWT.NONE); outputLabel.setText(Messages.outputs); outputLabel.setLayoutData(labelDataOutput); Combo outputCombo = new Combo(buttonComposite, SWT.READ_ONLY); GridData outputComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); outputCombo.setLayoutData(outputComboData); Button outputInsertButton = new Button(buttonComposite, SWT.PUSH); outputInsertButton.setText(Messages.insertButtonLabel); outputInsertButton.addSelectionListener(new InsertButtonListener(outputCombo, scriptArea, OUTPUT_COMBO)); outputCombos[buttonIndex] = outputCombo; } GridData labelDataProperties = new GridData(); labelDataProperties.horizontalSpan = 2; Label propertiesLabel = new Label(buttonComposite, SWT.NONE); propertiesLabel.setText(Messages.properties); propertiesLabel.setLayoutData(labelDataProperties); Combo propertiesCombo = new Combo(buttonComposite, SWT.READ_ONLY); GridData propertiesComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); propertiesCombo.setLayoutData(propertiesComboData); Button propertyInsertButton = new Button(buttonComposite, SWT.PUSH); propertyInsertButton.setText(Messages.insertButtonLabel); if (buttonIndex == 0) { propertyInsertButton.addSelectionListener(new InsertButtonListener(propertiesCombo, scriptArea, scriptAreaWin, PROPERTY_COMBO)); } else { propertyInsertButton.addSelectionListener(new InsertButtonListener(propertiesCombo, scriptArea, PROPERTY_COMBO)); } propertiesCombos[buttonIndex] = propertiesCombo; GridData labelDataDirectories = new GridData(); labelDataDirectories.horizontalSpan = 2; Label directoryLabel = new Label(buttonComposite, SWT.NONE); directoryLabel.setText(Messages.directory); directoryLabel.setLayoutData(labelDataDirectories); Combo directoriesCombo = new Combo(buttonComposite, SWT.READ_ONLY); GridData directoriesComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); directoriesCombo.setLayoutData(directoriesComboData); directoriesCombo.setItems(ToolIntegrationConstants.DIRECTORIES_PLACEHOLDERS_DISPLAYNAMES); Button directoryInsertButton = new Button(buttonComposite, SWT.PUSH); directoryInsertButton.setText(Messages.insertButtonLabel); if (scriptAreaWin != null) { directoryInsertButton.addSelectionListener(new InsertButtonListener(directoriesCombo, scriptArea, scriptAreaWin, DIRECTORY_COMBO)); } else { directoryInsertButton.addSelectionListener(new InsertButtonListener(directoriesCombo, scriptArea, DIRECTORY_COMBO)); } directoryCombos[buttonIndex] = directoriesCombo; if (buttonIndex == 2) { GridData labelDataAddProp = new GridData(); labelDataAddProp.horizontalSpan = 2; Label addPropLabel = new Label(buttonComposite, SWT.NONE); addPropLabel.setText("Additional Properties"); addPropLabel.setLayoutData(labelDataAddProp); Combo addPropCombo = new Combo(buttonComposite, SWT.READ_ONLY); GridData addPropComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); addPropCombo.setLayoutData(addPropComboData); addPropCombo.add(Messages.exitCodeLabel); addPropCombo.select(0); Button addPropInsertButton = new Button(buttonComposite, SWT.PUSH); addPropInsertButton.setText(Messages.insertButtonLabel); addPropInsertButton.addSelectionListener(new InsertButtonListener(addPropCombo, scriptArea, 3)); } if (buttonIndex > 0) { new Label(buttonComposite, SWT.NONE).setText(""); new Label(buttonComposite, SWT.NONE).setText(""); Button insertCopyCommand = new Button(buttonComposite, SWT.PUSH); GridData copyData = new GridData(); copyData.horizontalSpan = 2; insertCopyCommand.setLayoutData(copyData); insertCopyCommand.setText("Insert copy of file/dir..."); insertCopyCommand.addSelectionListener(new CopyInputListener(scriptArea)); } if (buttonIndex == 3) { mockScriptTabButtonComposite = buttonComposite; } } private void addScriptSelectButtonListener() { winEnabledButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { textFields[NUMBER_OF_TABS].setEnabled(winEnabledButton.getSelection()); textFields[NUMBER_OF_TABS].setEditable(winEnabledButton.getSelection()); configurationMap.put(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_WINDOWS_ENABLED, winEnabledButton.getSelection()); updatePageComplete(); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); linuxEnabledButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { textFields[0].setEnabled(linuxEnabledButton.getSelection()); textFields[0].setEditable(linuxEnabledButton.getSelection()); configurationMap.put(ToolIntegrationConstants.KEY_COMMAND_SCRIPT_LINUX_ENABLED, linuxEnabledButton.getSelection()); updatePageComplete(); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); } private void addAllEndpoints(Combo endpointCombo, String key, int tabNumber) { endpointCombo.removeAll(); @SuppressWarnings("unchecked") List<Map<String, String>> endpointList = (List<Map<String, String>>) configurationMap.get(key); if (endpointList != null) { for (Map<String, String> endpoint : endpointList) { if (!(tabNumber == 0 && endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE).equals(DataType.Vector.name()))) { endpointCombo.add(endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_NAME)); } } if (endpointCombo.getItemCount() > 0) { endpointCombo.select(0); } } } /** * Listener for the script text areas for saving the content to the correct key. * * @author Sascha Zur */ private class TextAreaModifyListener implements ModifyListener { private final String key; TextAreaModifyListener(String key) { this.key = key; } @Override public void modifyText(ModifyEvent arg0) { Object obj = arg0.getSource(); if (obj instanceof Text){ configurationMap.put(key, ((Text) obj).getText()); } else if (obj instanceof LineNumberStyledText){ configurationMap.put(key, ((LineNumberStyledText) obj).getText()); } updatePageComplete(); } } /** * Listener to insert the current selected text from the combo box to the given text. * * @author Sascha Zur */ private class InsertButtonListener implements SelectionListener { private static final String QUOTE = "\""; private final Combo combo; private final LineNumberStyledText text; private final int comboType; private LineNumberStyledText text2; InsertButtonListener(Combo inputCombo, LineNumberStyledText scriptArea, int comboType) { combo = inputCombo; text = scriptArea; this.comboType = comboType; } InsertButtonListener(Combo inputCombo, LineNumberStyledText scriptArea, LineNumberStyledText scriptArea2, int comboType) { combo = inputCombo; text = scriptArea; text2 = scriptArea2; this.comboType = comboType; } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } @SuppressWarnings("unchecked") @Override public void widgetSelected(SelectionEvent arg0) { String insertText = combo.getText(); LineNumberStyledText currentText = text; if (winScriptHasFocus && text2 != null) { currentText = text2; } if (currentText.isEnabled()) { if (comboType == INPUT_COMBO && insertText != null && !insertText.isEmpty()) { String possibleQuotes = ""; List<Map<String, Object>> endpointList = (List<Map<String, Object>>) configurationMap.get(ToolIntegrationConstants.KEY_ENDPOINT_INPUTS); Map<String, Object> endpoint = null; for (Map<String, Object> ep : endpointList) { if (ep.get(ToolIntegrationConstants.KEY_ENDPOINT_NAME).equals(insertText)) { endpoint = ep; } } if (endpoint != null) { if (endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE).equals(DataType.ShortText.name()) || endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE).equals(DataType.FileReference.name()) || endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE).equals(DataType.DirectoryReference.name())) { possibleQuotes = QUOTE; } } currentText.insert(possibleQuotes + ToolIntegrationConstants.PLACEHOLDER_PREFIX + ToolIntegrationConstants.PLACEHOLDER_INPUT_PREFIX + ToolIntegrationConstants.PLACEHOLDER_SEPARATOR + insertText + ToolIntegrationConstants.PLACEHOLDER_SUFFIX + possibleQuotes); } if (comboType == OUTPUT_COMBO && insertText != null && !insertText.isEmpty()) { currentText.insert(ToolIntegrationConstants.PLACEHOLDER_PREFIX + ToolIntegrationConstants.PLACEHOLDER_OUTPUT_PREFIX + ToolIntegrationConstants.PLACEHOLDER_SEPARATOR + insertText + ToolIntegrationConstants.PLACEHOLDER_SUFFIX); } if (comboType == PROPERTY_COMBO && insertText != null && !insertText.isEmpty() && configurationMap.containsKey(ToolIntegrationConstants.KEY_PROPERTIES)) { Map<String, Object> properties = (Map<String, Object>) configurationMap.get(ToolIntegrationConstants.KEY_PROPERTIES); for (String propTabName : properties.keySet()) { Map<String, Object> proptab = (Map<String, Object>) properties.get(propTabName); for (String propkey : proptab.keySet()) { if (proptab.get(propkey) instanceof Map<?, ?>) { Map<String, String> property = (Map<String, String>) proptab.get(propkey); if (property.get(ToolIntegrationConstants.KEY_PROPERTY_DISPLAYNAME).equals(insertText)) { currentText.insert(QUOTE + ToolIntegrationConstants.PLACEHOLDER_PREFIX + ToolIntegrationConstants.PLACEHOLDER_PROPERTY_PREFIX + ToolIntegrationConstants.PLACEHOLDER_SEPARATOR + propkey + ToolIntegrationConstants.PLACEHOLDER_SUFFIX + QUOTE); } } } } } if (comboType == DIRECTORY_COMBO && insertText != null && !insertText.isEmpty()) { currentText.insert(QUOTE + ToolIntegrationConstants.PLACEHOLDER_PREFIX + ToolIntegrationConstants.PLACEHOLDER_DIRECTORY_PREFIX + ToolIntegrationConstants.PLACEHOLDER_SEPARATOR + ToolIntegrationConstants.DIRECTORIES_PLACEHOLDER[combo.getSelectionIndex()] + ToolIntegrationConstants.PLACEHOLDER_SUFFIX + QUOTE); } if (comboType == ADD_PROPERTY_COMBO && insertText != null && !insertText.isEmpty()) { currentText.insert(createAddPropertyPlaceHolder(ToolIntegrationConstants.PLACEHOLDER_EXIT_CODE)); } currentText.setFocus(); } } } private String createAddPropertyPlaceHolder(String addPropPlaceholder) { return ToolIntegrationConstants.PLACEHOLDER_PREFIX + ToolIntegrationConstants.PLACEHOLDER_ADDITIONAL_PROPERTIES_PREFIX + ToolIntegrationConstants.PLACEHOLDER_SEPARATOR + addPropPlaceholder + ToolIntegrationConstants.PLACEHOLDER_SUFFIX; } /** * Listener for the insert copy command button. * * @author Sascha Zur */ private class CopyInputListener implements SelectionListener { private final LineNumberStyledText text; CopyInputListener(LineNumberStyledText text) { this.text = text; } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } @Override public void widgetSelected(SelectionEvent arg0) { @SuppressWarnings("unchecked") List<Map<String, String>> endpointList = (List<Map<String, String>>) configurationMap.get(ToolIntegrationConstants.KEY_ENDPOINT_INPUTS); List<String> endpointNames = new LinkedList<>(); if (endpointList != null) { for (Map<String, String> endpoint : endpointList) { if (endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE).equals(DataType.FileReference.name())) { endpointNames.add("File : " + endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_NAME)); } if (endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE).equals(DataType.DirectoryReference.name())) { endpointNames.add("Directory : " + endpoint.get(ToolIntegrationConstants.KEY_ENDPOINT_NAME)); } } } WizardInsertCopyCommandDialog dialog = new WizardInsertCopyCommandDialog(getShell(), endpointNames, directoryCombos[1].getItems()); if (dialog.open() == Dialog.OK) { String command = dialog.getCopyCommand(); if (!text.isDisposed()) { text.insert(command + "\n"); text.setFocus(); } } } } /** * Sets a new configurationMap and updates all fields. * * @param newConfigurationMap new map */ @Override public void setConfigMap(Map<String, Object> newConfigurationMap) { configurationMap = newConfigurationMap; updatePageValues(); } private void updatePageValues() { updatePage(); updatePageComplete(); } @Override public void performHelp() { super.performHelp(); IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem(); helpSystem.displayHelp(HELP_CONTEXT_ID); } }