/******************************************************************************* * Copyright (c) 2011 - 2012 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.jdt.debug.ui.launching; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.dialogs.WorkbenchPreferenceDialog; import org.jboss.tools.common.jdt.debug.IPropertyKeys; import org.jboss.tools.common.jdt.debug.RemoteDebugActivator; import org.jboss.tools.common.jdt.debug.VmModel; import org.jboss.tools.common.jdt.debug.ui.RemoteDebugUIActivator; import org.jboss.tools.common.jdt.debug.ui.actions.RemoteLaunchAction; import org.jboss.tools.common.jdt.debug.ui.preferences.AutoResizeTableLayout; /** * @author snjeza * */ public class LaunchRemoteApplicationDialog extends Dialog { private VmModel[] vmModels; private TableViewer viewer; private Combo configurationsCombo; private Button customPort; private Text customPortVal; public LaunchRemoteApplicationDialog(Shell parentShell) { super(parentShell); setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER | SWT.RESIZE | getDefaultOrientation()); vmModels = RemoteDebugUIActivator.getDefault().getCurrentDebugModels(); } @Override protected Control createDialogArea(Composite parent) { getShell().setText("Remote Java Application"); Composite area = (Composite) super.createDialogArea(parent); Composite contents = new Composite(area, SWT.NONE); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 400; gd.widthHint = 600; contents.setLayoutData(gd); contents.setLayout(new GridLayout(1, false)); applyDialogFont(contents); initializeDialogUnits(area); Composite messageComposite = new Composite(contents, SWT.NONE); gd = new GridData(SWT.FILL, SWT.FILL, true, false); messageComposite.setLayoutData(gd); messageComposite.setLayout(new GridLayout(1, false)); Label pathLabel = new Label(messageComposite, SWT.NONE); pathLabel.setText("Found " + vmModels.length + " Remote Java Application's. Please select which application you want to connect the debugger to."); viewer = new TableViewer(contents, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 250; viewer.getTable().setLayoutData(gd); final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); table.setFont(parent.getFont()); table.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int selection = table.getSelectionIndex(); Button okButton = getButton(IDialogConstants.OK_ID); if (selection < 0 || selection >= vmModels.length) { okButton.setEnabled(false); } else { okButton.setEnabled(true); } } }); viewer.setContentProvider(new RemoteApplicationContentProvider()); String[] columnHeaders = {"PID", "Port", "Class", "Arguments"}; for (int i = 0; i < columnHeaders.length; i++) { TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new RemoteApplicationLabelProvider(i)); column.getColumn().setText(columnHeaders[i]); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); } ColumnLayoutData[] remoteApplicationLayouts= { new ColumnWeightData(80,80), new ColumnWeightData(80,80), new ColumnWeightData(200,200), new ColumnWeightData(200,200), }; TableLayout tableLayout = new AutoResizeTableLayout(table); for (int i = 0; i < remoteApplicationLayouts.length; i++) { tableLayout.addColumnData(remoteApplicationLayouts[i]); } viewer.getTable().setLayout(tableLayout); viewer.setInput(vmModels); viewer.getTable().select(0); Composite configurationComposite = new Composite(contents, SWT.NONE); configurationComposite.setLayout(new GridLayout(2, false)); gd = new GridData(SWT.FILL, SWT.FILL, true, false); configurationComposite.setLayoutData(gd); Label configurationLabel = new Label(configurationComposite, SWT.NONE); gd = new GridData(SWT.FILL, SWT.FILL, false, false); configurationLabel.setLayoutData(gd); configurationLabel.setText("Configurations:"); configurationsCombo = new Combo(configurationComposite, SWT.NONE); gd = new GridData(SWT.FILL, SWT.FILL, true, false); configurationsCombo.setLayoutData(gd); configureCombo(); Composite wrapper = new Composite(contents, SWT.NONE); wrapper.setLayout(new GridLayout(2, false)); customPort = new Button(wrapper, SWT.CHECK); customPort.setText("Custize debugger port: "); customPort.setSelection(false); customPort.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { customPortVal.setEnabled(customPort.getSelection()); } }); customPortVal = new Text(wrapper, SWT.NONE | SWT.BORDER); customPortVal.setEnabled(false); final Button autoButton = new Button(contents, SWT.CHECK); gd = new GridData(SWT.FILL, SWT.FILL, true, false); messageComposite.setLayoutData(gd); autoButton.setText("Automatically connect if only one application found"); autoButton.setSelection(RemoteDebugUIActivator.getDefault().isAutoConnect()); autoButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RemoteDebugUIActivator.getDefault().setAutoConnect(autoButton.getSelection()); } }); return area; } private void configureCombo() { String[] configurations = getConfigurations(); configurationsCombo.setItems(configurations); configurationsCombo.select(getDefaultConfigurationIndex(configurations)); } private int getDefaultConfigurationIndex(String[] configurations) { if (configurations.length == 0) { return 0; } ILaunchConfiguration defaultConfiguration = RemoteDebugActivator.getDefault().getDefaultLaunchConfiguration(); if (defaultConfiguration == null) { return 0; } for (int i = 0; i < configurations.length; i++) { String name = configurations[i]; if (name.equals(defaultConfiguration.getName())) { return i; } } return 0; } private String[] getConfigurations() { ILaunchConfiguration[] configs = RemoteDebugActivator.getDefault().getLaunchConfigurations(); if (configs == null || configs.length == 0) { try { ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); ILaunchConfigurationType type = manager.getLaunchConfigurationType(RemoteDebugActivator.REMOTE_JAVA_APPLICATION_ID); ILaunchConfigurationWorkingCopy config = RemoteDebugActivator.createNewLaunchConfiguration(type); return new String[] { config.getName() }; } catch (CoreException e) { RemoteDebugUIActivator.log(e); return new String[0]; } } String[] configNames = new String[configs.length]; for (int i = 0; i < configs.length; i++) { configNames[i] = configs[i].getName(); } return configNames; } class RemoteApplicationContentProvider implements IStructuredContentProvider { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object[] getElements(Object inputElement) { return vmModels; } @Override public void dispose() { } } class RemoteApplicationLabelProvider extends ColumnLabelProvider { private int columnIndex; public RemoteApplicationLabelProvider(int i) { this.columnIndex = i; } public String getText(Object element) { if (element instanceof VmModel) { VmModel model = (VmModel) element; switch (columnIndex) { case 0: return model.getPid(); case 1: return model.getPort(); case 2: return model.getMainClass(); case 3: return model.getMainArgs(); } } return null; } @Override public Image getImage(Object element) { return null; } } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.YES_ID, "Configure...", false); super.createButtonsForButtonBar(parent); Button okButton = getButton(IDialogConstants.OK_ID); okButton.setText("Debug"); } @Override protected void okPressed() { String port = null; if( customPort.getSelection()) { port = customPortVal.getText(); } else { VmModel vmModel = vmModels[viewer.getTable().getSelectionIndex()]; port = vmModel.getPort(); } String configurationName = configurationsCombo.getText(); ILaunchConfiguration[] configurations = RemoteDebugActivator.getDefault().getLaunchConfigurations(); ILaunchConfiguration selectedConfiguration = null; for (ILaunchConfiguration configuration:configurations) { if (configurationName.equals(configuration.getName())) { selectedConfiguration = configuration; } else { setDefault(configuration, false); } } if (selectedConfiguration != null) { setDefault(selectedConfiguration, true); } super.okPressed(); new RemoteLaunchAction(port).run(); } private void setDefault(ILaunchConfiguration configuration, boolean value) { try { boolean isDefault = configuration.getAttribute(IPropertyKeys.SET_AS_DEFAULT, false); if (isDefault != value) { ILaunchConfigurationWorkingCopy wc = configuration.getWorkingCopy(); wc.setAttribute(IPropertyKeys.SET_AS_DEFAULT, value); wc.doSave(); } } catch (CoreException e) { RemoteDebugUIActivator.log(e); } } @Override protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.YES_ID) { //new LaunchDialogAction().run(); Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell(); PreferenceDialog dialog = WorkbenchPreferenceDialog.createDialogOn( shell, RemoteDebugUIActivator.REMOTE_DEBUG_PREFERENCE_PAGE_ID); dialog.open(); configureCombo(); } else { super.buttonPressed(buttonId); } } }