Java tutorial
/******************************************************************************* * Copyright (c) 2008 IBM Corporation. * 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.ptp.rm.mpi.openmpi.ui.launch; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.ILaunchConfigurationDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TableViewerEditor; import org.eclipse.jface.viewers.TableViewerFocusCellManager; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.ptp.core.elements.IPQueue; import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation; import org.eclipse.ptp.rm.mpi.openmpi.core.launch.OpenMPILaunchConfiguration; import org.eclipse.ptp.rm.mpi.openmpi.core.launch.OpenMPILaunchConfigurationDefaults; import org.eclipse.ptp.rm.mpi.openmpi.core.parameters.OmpiInfo; import org.eclipse.ptp.rm.mpi.openmpi.core.parameters.Parameters.Parameter; import org.eclipse.ptp.rm.mpi.openmpi.core.rmsystem.OpenMPIResourceManager; import org.eclipse.ptp.rm.mpi.openmpi.ui.OpenMPIUIPlugin; import org.eclipse.ptp.rm.mpi.openmpi.ui.messages.Messages; import org.eclipse.ptp.rm.ui.launch.BaseRMLaunchConfigurationDynamicTab; import org.eclipse.ptp.rm.ui.launch.RMLaunchConfigurationDynamicTabDataSource; import org.eclipse.ptp.rm.ui.launch.RMLaunchConfigurationDynamicTabWidgetListener; import org.eclipse.ptp.rmsystem.IResourceManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; 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.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; /** * * @author Daniel Felix Ferber * */ public class AdvancedOpenMpiRMLaunchConfigurationDynamicTab extends BaseRMLaunchConfigurationDynamicTab { private class DataSource extends RMLaunchConfigurationDynamicTabDataSource { private boolean useDefArgs; private String args; private boolean useDefParams; private Map<String, String> params; protected DataSource(BaseRMLaunchConfigurationDynamicTab page) { super(page); } @Override protected void copyFromFields() throws ValidationException { useDefArgs = useArgsDefaultsButton.getSelection(); args = extractText(argsText); useDefParams = useParamsDefaultsButton.getSelection(); params.clear(); for (Object object : paramsViewer.getCheckedElements()) { if (object instanceof Parameter) { Parameter param = (Parameter) object; params.put(param.getName(), param.getValue()); } } } @Override protected void copyToFields() { applyText(argsText, args); useArgsDefaultsButton.setSelection(useDefArgs); useParamsDefaultsButton.setSelection(useDefParams); if (info != null) { for (Entry<String, String> param : params.entrySet()) { Parameter p = info.getParameter(param.getKey()); if (p != null) { p.setValue(param.getValue()); paramsViewer.setChecked(p, true); paramsViewer.update(p, null); } } } } @Override protected void copyToStorage() { getConfigurationWorkingCopy().setAttribute(OpenMPILaunchConfiguration.ATTR_USEDEFAULTARGUMENTS, useDefArgs); getConfigurationWorkingCopy().setAttribute(OpenMPILaunchConfiguration.ATTR_ARGUMENTS, args); getConfigurationWorkingCopy().setAttribute(OpenMPILaunchConfiguration.ATTR_USEDEFAULTPARAMETERS, useDefParams); getConfigurationWorkingCopy().setAttribute(OpenMPILaunchConfiguration.ATTR_PARAMETERS, params); } protected boolean getUseDefArgs() { return useDefArgs; } @Override protected void loadDefault() { args = OpenMPILaunchConfigurationDefaults.ATTR_ARGUMENTS; useDefArgs = OpenMPILaunchConfigurationDefaults.ATTR_USEDEFAULTARGUMENTS; useDefParams = OpenMPILaunchConfigurationDefaults.ATTR_USEDEFAULTPARAMETERS; params = OpenMPILaunchConfigurationDefaults.ATTR_PARAMETERS; } @SuppressWarnings("unchecked") @Override protected void loadFromStorage() { try { args = getConfiguration().getAttribute(OpenMPILaunchConfiguration.ATTR_ARGUMENTS, OpenMPILaunchConfigurationDefaults.ATTR_ARGUMENTS); useDefArgs = getConfiguration().getAttribute(OpenMPILaunchConfiguration.ATTR_USEDEFAULTARGUMENTS, OpenMPILaunchConfigurationDefaults.ATTR_USEDEFAULTARGUMENTS); useDefParams = getConfiguration().getAttribute(OpenMPILaunchConfiguration.ATTR_USEDEFAULTPARAMETERS, OpenMPILaunchConfigurationDefaults.ATTR_USEDEFAULTPARAMETERS); params = getConfiguration().getAttribute(OpenMPILaunchConfiguration.ATTR_PARAMETERS, OpenMPILaunchConfigurationDefaults.ATTR_PARAMETERS); } catch (CoreException e) { // TODO handle exception? OpenMPIUIPlugin.log(e); } } @Override protected void validateLocal() throws ValidationException { if (!useDefArgs && args == null) { throw new ValidationException( Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Validation_EmptyArguments); } if (!useDefParams) { for (Object object : paramsViewer.getCheckedElements()) { if (object instanceof Parameter) { Parameter param = (Parameter) object; if (param.getValue().equals("")) { //$NON-NLS-1$ throw new ValidationException( Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Validation_EmptyParameter); } } } } } } private class WidgetListener extends RMLaunchConfigurationDynamicTabWidgetListener implements ICheckStateListener { public WidgetListener(BaseRMLaunchConfigurationDynamicTab dynamicTab) { super(dynamicTab); } public void checkStateChanged(CheckStateChangedEvent event) { if (isEnabled()) { Object source = event.getSource(); if (source == paramsViewer) { fireContentsChanged(); updateControls(); } } } @Override protected void doWidgetSelected(SelectionEvent e) { if (e.getSource() == paramsViewer || e.getSource() == useArgsDefaultsButton) { updateControls(); } else { super.doWidgetSelected(e); } } } protected Composite control; protected Button useArgsDefaultsButton; protected Text argsText; protected Button useParamsDefaultsButton; protected CheckboxTableViewer paramsViewer; protected Table paramsTable; protected OmpiInfo info; /** * @since 2.0 */ public AdvancedOpenMpiRMLaunchConfigurationDynamicTab(IResourceManager rm, ILaunchConfigurationDialog dialog) { super(dialog); info = ((OpenMPIResourceManager) rm).getOmpiInfo(); } /** * @since 2.0 */ public void createControl(Composite parent, IResourceManager rm, IPQueue queue) throws CoreException { control = new Composite(parent, SWT.NONE); control.setLayout(new GridLayout()); final Group argumentsGroup = new Group(control, SWT.NONE); argumentsGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); GridLayout layout = new GridLayout(); layout.numColumns = 2; argumentsGroup.setLayout(layout); argumentsGroup.setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Label_LaunchArguments); useArgsDefaultsButton = new Button(argumentsGroup, SWT.CHECK); useArgsDefaultsButton .setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Label_DefaultArguments); // useArgsDefaultsButton.setSelection(true); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); useArgsDefaultsButton.setLayoutData(gd); useArgsDefaultsButton.addSelectionListener(getListener()); Label label = new Label(argumentsGroup, SWT.NONE); label.setLayoutData(new GridData()); label.setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Label_Arguments); argsText = new Text(argumentsGroup, SWT.BORDER); argsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); // argsText.setEnabled(false); final Group ompiParameteresGroup = new Group(control, SWT.NONE); ompiParameteresGroup.setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Label_MCAParameters); layout = new GridLayout(); layout.numColumns = 2; ompiParameteresGroup.setLayout(layout); ompiParameteresGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); useParamsDefaultsButton = new Button(ompiParameteresGroup, SWT.CHECK); useParamsDefaultsButton.addSelectionListener(getListener()); useParamsDefaultsButton .setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Label_DefaultMCAParameters); gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); useParamsDefaultsButton.setLayoutData(gd); // useParamsDefaultsButton.setSelection(true); paramsViewer = CheckboxTableViewer.newCheckList(ompiParameteresGroup, SWT.CHECK | SWT.FULL_SELECTION); paramsViewer.setContentProvider(new IStructuredContentProvider() { public void dispose() { // Empty implementation. } public Object[] getElements(Object inputElement) { if (inputElement != null && inputElement instanceof OmpiInfo) { OmpiInfo info = (OmpiInfo) inputElement; return info.getParameters(); } return null; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // Empty implementation. } }); paramsViewer.setSorter(new ViewerSorter() { @Override public int compare(Viewer viewer, Object j1, Object j2) { return ((Parameter) j1).getName().compareTo(((Parameter) j2).getName()); } }); paramsViewer.addCheckStateListener(getLocalListener()); paramsViewer.setAllChecked(false); // Enable cursor keys in table TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(paramsViewer, new FocusCellOwnerDrawHighlighter(paramsViewer)); ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(paramsViewer) { @Override protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; } }; TableViewerEditor.create(paramsViewer, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION); paramsTable = paramsViewer.getTable(); gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.heightHint = 100; paramsTable.setLayoutData(gd); paramsTable.setLinesVisible(true); paramsTable.setHeaderVisible(true); paramsTable.setEnabled(false); // Disable cell item selection paramsTable.addListener(SWT.EraseItem, new Listener() { /* * (non-Javadoc) * * @see * org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt. * widgets.Event) */ public void handleEvent(Event event) { event.detail &= ~SWT.SELECTED; } }); addColumns(); if (info != null) { paramsViewer.setInput(info); } } public Control getControl() { return control; } @Override public Image getImage() { return null; } @Override public String getText() { return Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_Title; } /** * @since 2.0 */ public RMLaunchValidation setDefaults(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) { configuration.setAttribute(OpenMPILaunchConfiguration.ATTR_USEDEFAULTARGUMENTS, OpenMPILaunchConfigurationDefaults.ATTR_USEDEFAULTARGUMENTS); configuration.setAttribute(OpenMPILaunchConfiguration.ATTR_ARGUMENTS, OpenMPILaunchConfigurationDefaults.ATTR_ARGUMENTS); configuration.setAttribute(OpenMPILaunchConfiguration.ATTR_USEDEFAULTPARAMETERS, OpenMPILaunchConfigurationDefaults.ATTR_USEDEFAULTPARAMETERS); configuration.setAttribute(OpenMPILaunchConfiguration.ATTR_PARAMETERS, OpenMPILaunchConfigurationDefaults.ATTR_PARAMETERS); return new RMLaunchValidation(true, null); } @Override public void updateControls() { argsText.setEnabled(!useArgsDefaultsButton.getSelection()); paramsTable.setEnabled(!useParamsDefaultsButton.getSelection()); if (getLocalDataSource().getUseDefArgs()) { String launchArgs = ""; //$NON-NLS-1$ try { launchArgs = OpenMPILaunchConfiguration.calculateArguments(getLocalDataSource().getConfiguration()); } catch (CoreException e) { // ignore } argsText.setText(launchArgs); } } @Override protected RMLaunchConfigurationDynamicTabDataSource createDataSource() { return new DataSource(this); } @Override protected RMLaunchConfigurationDynamicTabWidgetListener createListener() { return new WidgetListener(this); } /** * Add columns to the table viewer */ private void addColumns() { /* * Name column */ final TableViewerColumn column1 = new TableViewerColumn(paramsViewer, SWT.NONE); column1.setLabelProvider(new ColumnLabelProvider() { /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang * .Object) */ @Override public String getText(Object element) { if (element instanceof Parameter) { String name = ((Parameter) element).getName(); return name; } return null; } }); column1.getColumn().setResizable(true); column1.getColumn() .setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_PArameterTable_Column_Name); /* * Value column */ final TableViewerColumn column2 = new TableViewerColumn(paramsViewer, SWT.NONE); column2.setLabelProvider(new ColumnLabelProvider() { /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang * .Object) */ @Override public String getText(Object element) { if (element instanceof Parameter) { return ((Parameter) element).getValue(); } return null; } }); column2.setEditingSupport(new EditingSupport(paramsViewer) { @Override protected boolean canEdit(Object element) { return !((Parameter) element).isReadOnly() && paramsViewer.getChecked(element); } @Override protected CellEditor getCellEditor(Object element) { return new TextCellEditor(paramsTable); } @Override protected Object getValue(Object element) { return ((Parameter) element).getValue(); } @Override protected void setValue(Object element, Object value) { ((Parameter) element).setValue((String) value); getViewer().update(element, null); fireContentsChanged(); updateControls(); } }); column2.getColumn().setResizable(true); column2.getColumn() .setText(Messages.AdvancedOpenMpiRMLaunchConfigurationDynamicTab_ParameterTable_Column_Value); paramsTable.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { Rectangle area = paramsTable.getClientArea(); // Point size = paramsTable.computeSize(SWT.DEFAULT, // SWT.DEFAULT); ScrollBar vBar = paramsTable.getVerticalBar(); int width = area.width - paramsTable.computeTrim(0, 0, 0, 0).width - vBar.getSize().x; paramsTable.getColumn(1).setWidth(width / 3); paramsTable.getColumn(0).setWidth(width - paramsTable.getColumn(1).getWidth()); } }); } private DataSource getLocalDataSource() { return (DataSource) super.getDataSource(); } private WidgetListener getLocalListener() { return (WidgetListener) super.getListener(); } }