org.jboss.tools.common.jdt.debug.ui.launching.LaunchRemoteApplicationDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.common.jdt.debug.ui.launching.LaunchRemoteApplicationDialog.java

Source

/*******************************************************************************
 * 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);
        }
    }

}