blob: c8bdef0126dc063f2aafd76151eb53de794aed48 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.debug.ui.launchConfigurations;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.internal.debug.ui.IJavaDebugHelpContextIds;
import org.eclipse.jdt.internal.debug.ui.JavaDebugImages;
import org.eclipse.jdt.internal.debug.ui.launcher.LauncherMessages;
import org.eclipse.jdt.internal.debug.ui.launcher.NameValuePairDialog;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
/**
* This tab appears for java applet launch configurations and allows the user to edit
* applet-specific attributes such as width, height, name & applet parameters.
* <p>
* This class may be instantiated. This class is not intended to be subclassed.
* </p>
* @since 2.1
*/
public class AppletParametersTab extends JavaLaunchTab {
private Label fWidthLabel;
private Text fWidthText;
private Label fHeightLabel;
private Text fHeightText;
private Label fNameLabel;
private Text fNameText;
private Button fParametersAddButton;
private Button fParametersRemoveButton;
private Button fParametersEditButton;
private class AppletTabListener extends SelectionAdapter implements ModifyListener {
/* (non-Javadoc)
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
Object source= e.getSource();
if (source == fViewer.getTable() || source == fViewer) {
setParametersButtonsEnableState();
} else if (source == fParametersAddButton) {
handleParametersAddButtonSelected();
} else if (source == fParametersEditButton) {
handleParametersEditButtonSelected();
} else if (source == fParametersRemoveButton) {
handleParametersRemoveButtonSelected();
}
}
}
private AppletTabListener fListener= new AppletTabListener();
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
/**
* The default value for the 'width' attribute.
*/
public static final int DEFAULT_APPLET_WIDTH = 200;
/**
* The default value for the 'height' attribute.
*/
public static final int DEFAULT_APPLET_HEIGHT = 200;
/**
* The parameters table viewer
*/
private TableViewer fViewer;
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
*/
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_APPLET_PARAMETERS_TAB);
GridLayout topLayout = new GridLayout();
comp.setLayout(topLayout);
GridData gd;
Composite widthHeightNameComp = new Composite(comp, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
widthHeightNameComp.setLayoutData(gd);
GridLayout widthHeightNameLayout = new GridLayout();
widthHeightNameLayout.marginHeight = 0;
widthHeightNameLayout.marginWidth = 0;
widthHeightNameLayout.numColumns = 4;
widthHeightNameComp.setLayout(widthHeightNameLayout);
fWidthLabel= new Label(widthHeightNameComp, SWT.NONE);
fWidthLabel.setText(LauncherMessages.appletlauncher_argumenttab_widthlabel_text);
fWidthText = new Text(widthHeightNameComp, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
fWidthText.setLayoutData(gd);
fWidthText.addModifyListener(fListener);
fNameLabel = new Label(widthHeightNameComp, SWT.NONE);
fNameLabel.setText(LauncherMessages.appletlauncher_argumenttab_namelabel_text);
fNameText = new Text(widthHeightNameComp, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
fNameText.setLayoutData(gd);
fNameText.addModifyListener(fListener);
fHeightLabel= new Label(widthHeightNameComp, SWT.NONE);
fHeightLabel.setText(LauncherMessages.appletlauncher_argumenttab_heightlabel_text);
fHeightText = new Text(widthHeightNameComp, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
fHeightText.setLayoutData(gd);
fHeightText.addModifyListener(fListener);
Label blank = new Label(widthHeightNameComp, SWT.NONE);
blank.setText(EMPTY_STRING);
Label hint = new Label(widthHeightNameComp, SWT.NONE);
hint.setText(LauncherMessages.AppletParametersTab__optional_applet_instance_name__1);
gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
hint.setLayoutData(gd);
createVerticalSpacer(comp);
Composite parametersComp = new Composite(comp, SWT.NONE);
gd = new GridData(GridData.FILL_BOTH);
parametersComp.setLayoutData(gd);
GridLayout parametersLayout = new GridLayout();
parametersLayout.numColumns = 2;
parametersLayout.marginHeight = 0;
parametersLayout.marginWidth = 0;
parametersComp.setLayout(parametersLayout);
Label parameterLabel = new Label(parametersComp, SWT.NONE);
parameterLabel.setText(LauncherMessages.appletlauncher_argumenttab_parameterslabel_text);
gd = new GridData();
gd.horizontalSpan = 2;
parameterLabel.setLayoutData(gd);
fViewer = new TableViewer(parametersComp);
Table parametersTable = fViewer.getTable();
gd = new GridData(GridData.FILL_BOTH);
parametersTable.setLayoutData(gd);
TableColumn column1 = new TableColumn(parametersTable, SWT.NONE);
column1.setText(LauncherMessages.appletlauncher_argumenttab_parameterscolumn_name_text);
TableColumn column2 = new TableColumn(parametersTable, SWT.NONE);
column2.setText(LauncherMessages.appletlauncher_argumenttab_parameterscolumn_value_text);
TableLayout tableLayout = new TableLayout();
parametersTable.setLayout(tableLayout);
tableLayout.addColumnData(new ColumnWeightData(100));
tableLayout.addColumnData(new ColumnWeightData(100));
parametersTable.setHeaderVisible(true);
parametersTable.setLinesVisible(true);
parametersTable.addSelectionListener(fListener);
parametersTable.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e) {
setParametersButtonsEnableState();
if (fParametersEditButton.isEnabled()) {
handleParametersEditButtonSelected();
}
}
});
fViewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
Map params = (Map) inputElement;
return params.keySet().toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
fViewer.setLabelProvider(new ITableLabelProvider() {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (columnIndex == 0) {
return element.toString();
}
String key = (String) element;
Map params = (Map) fViewer.getInput();
Object object = params.get(key);
if (object != null)
return object.toString();
return null;
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
});
fViewer.setComparator(new ViewerComparator());
Composite envButtonComp = new Composite(parametersComp, SWT.NONE);
GridLayout envButtonLayout = new GridLayout();
envButtonLayout.marginHeight = 0;
envButtonLayout.marginWidth = 0;
envButtonComp.setLayout(envButtonLayout);
gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL);
envButtonComp.setLayoutData(gd);
fParametersAddButton = createPushButton(envButtonComp ,LauncherMessages.appletlauncher_argumenttab_parameters_button_add_text, null);
fParametersAddButton.addSelectionListener(fListener);
fParametersEditButton = createPushButton(envButtonComp, LauncherMessages.appletlauncher_argumenttab_parameters_button_edit_text, null);
fParametersEditButton.addSelectionListener(fListener);
fParametersRemoveButton = createPushButton(envButtonComp, LauncherMessages.appletlauncher_argumenttab_parameters_button_remove_text, null);
fParametersRemoveButton.addSelectionListener(fListener);
Dialog.applyDialogFont(parent);
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration)
*/
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
try {
Integer.parseInt(getWidthText());
} catch(NumberFormatException nfe) {
setErrorMessage(LauncherMessages.appletlauncher_argumenttab_width_error_notaninteger);
return false;
}
try {
Integer.parseInt(getHeightText());
} catch(NumberFormatException nfe) {
setErrorMessage(LauncherMessages.appletlauncher_argumenttab_height_error_notaninteger);
return false;
}
return true;
}
private void handleParametersAddButtonSelected() {
NameValuePairDialog dialog =
new NameValuePairDialog(getShell(),
LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_title,
new String[] {LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_name_text, LauncherMessages.appletlauncher_argumenttab_parameters_dialog_add_value_text}, //
new String[] {EMPTY_STRING, EMPTY_STRING});
openNewParameterDialog(dialog, null);
setParametersButtonsEnableState();
}
private void handleParametersEditButtonSelected() {
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
String key = (String) selection.getFirstElement();
Map params = (Map) fViewer.getInput();
String value = (String) params.get(key);
NameValuePairDialog dialog =
new NameValuePairDialog(getShell(),
LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_title,
new String[] {LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_name_text, LauncherMessages.appletlauncher_argumenttab_parameters_dialog_edit_value_text}, //
new String[] {key, value});
openNewParameterDialog(dialog, key);
}
private void handleParametersRemoveButtonSelected() {
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
Object[] keys = selection.toArray();
for (int i = 0; i < keys.length; i++) {
String key = (String) keys[i];
Map params = (Map) fViewer.getInput();
params.remove(key);
}
fViewer.refresh();
setParametersButtonsEnableState();
updateLaunchConfigurationDialog();
}
/**
* Set the enabled state of the three environment variable-related buttons based on the
* selection in the Table widget.
*/
private void setParametersButtonsEnableState() {
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
int selectCount = selection.size();
if (selectCount < 1) {
fParametersEditButton.setEnabled(false);
fParametersRemoveButton.setEnabled(false);
} else {
fParametersRemoveButton.setEnabled(true);
if (selectCount == 1) {
fParametersEditButton.setEnabled(true);
} else {
fParametersEditButton.setEnabled(false);
}
}
fParametersAddButton.setEnabled(true);
}
/**
* Show the specified dialog and update the parameter table based on its results.
*
* @param updateItem the item to update, or <code>null</code> if
* adding a new item
*/
private void openNewParameterDialog(NameValuePairDialog dialog, String key) {
if (dialog.open() != Window.OK) {
return;
}
String[] nameValuePair = dialog.getNameValuePair();
Map params = (Map) fViewer.getInput();
params.remove(key);
params.put(nameValuePair[0], nameValuePair[1]);
fViewer.refresh();
updateLaunchConfigurationDialog();
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
*/
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
try {
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, Integer.parseInt(getWidthText()));
} catch (NumberFormatException e) {
}
try {
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, Integer.parseInt(getHeightText()));
} catch (NumberFormatException e) {
}
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, fNameText.getText());
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_PARAMETERS, (Map) fViewer.getInput());
}
/**
* Returns the current width specified by the user
* @return the width specified by the user
*/
private String getWidthText() {
return fWidthText.getText().trim();
}
/**
* Returns the current height specified by the user
* @return the height specified by the user
*/
private String getHeightText() {
return fHeightText.getText().trim();
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
*/
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
*/
public void initializeFrom(ILaunchConfiguration config) {
try {
fWidthText.setText(Integer.toString(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, DEFAULT_APPLET_WIDTH)));
} catch(CoreException ce) {
fWidthText.setText(Integer.toString(DEFAULT_APPLET_WIDTH));
}
try {
fHeightText.setText(Integer.toString(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, DEFAULT_APPLET_HEIGHT)));
} catch(CoreException ce) {
fHeightText.setText(Integer.toString(DEFAULT_APPLET_HEIGHT));
}
try {
fNameText.setText(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, LauncherMessages.appletlauncher_argumenttab_name_defaultvalue));
} catch(CoreException ce) {
fNameText.setText(LauncherMessages.appletlauncher_argumenttab_name_defaultvalue);
}
Map input = new HashMap();
try {
Map params = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_PARAMETERS, (Map) null);
if (params != null)
input.putAll(params);
} catch (CoreException e) {
}
fViewer.setInput(input);
}
/**
* Create some empty space
*/
private void createVerticalSpacer(Composite comp) {
new Label(comp, SWT.NONE);
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
*/
public String getName() {
return LauncherMessages.appletlauncher_argumenttab_name;
}
/**
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
*
* @since 3.3
*/
public String getId() {
return "org.eclipse.jdt.debug.ui.appletParametersTab"; //$NON-NLS-1$
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
*/
public Image getImage() {
return JavaDebugImages.get(JavaDebugImages.IMG_VIEW_ARGUMENTS_TAB);
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
// do nothing when activated
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
// do nothing when deactivated
}
}