net.rim.ejde.internal.ui.launchers.BBJRETab.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.launchers.BBJRETab.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.launchers;

import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.rim.ejde.internal.launching.IFledgeLaunchConstants;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.VMUtils;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.ui.preferences.CompliancePreferencePage;
import org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage;
import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstall2;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IDialogConstants;
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.graphics.Point;
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.Group;
import org.eclipse.ui.dialogs.PreferencesUtil;

public class BBJRETab extends AbstractLaunchConfigurationTab implements IFledgeLaunchConstants {

    private static final Logger _logger = Logger.getLogger(BBJRETab.class);
    private Button _projectJREButton;
    private Button _alternateJREButton;
    private Combo _jreCombo;
    private Button _installedJREButton;
    private ProjectsTab _projectsTab;

    /**
     * Constructor
     *
     * @param simulatorTab
     *            SimulatorConfigurationTab
     */
    public BBJRETab(ProjectsTab projectsTab) {
        _projectsTab = projectsTab;
    }

    /*
     * Returns false if there is no project stored in launch configuration; it disables Run/Debug button.
     *
     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse .debug.core.ILaunchConfiguration)
     */
    @Override
    public boolean isValid(ILaunchConfiguration configuration) {
        Set<IProject> projects = LaunchUtils.getProjectsFromConfiguration(configuration);
        if (projects.isEmpty()) {
            setErrorMessage("Please select at least one project.");
            return false;
        }
        IVMInstall vm = LaunchUtils.getVMFromConfiguration(configuration);
        // VM is removed
        if (vm == null) {
            String vmId = LaunchUtils.getVMNameFromConfiguration(configuration);
            setErrorMessage("Unable to resolve JRE: " + vmId);
            return false;
        }
        // VM is not a BlackBerry VM
        if (!VMUtils.isBlackBerryVM(vm)) {
            String vmId = LaunchUtils.getVMNameFromConfiguration(configuration);
            setErrorMessage("Not a BlackBerry JRE: " + vmId);
            return false;
        }
        setMessage(null);
        setErrorMessage(null);
        return true;
    }

    /**
     * Creates the UI for this tab
     *
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        Composite mainComposite = new Composite(parent, SWT.NONE);
        mainComposite.setLayout(new GridLayout());
        GridData layoutData = new GridData(GridData.FILL_BOTH);
        mainComposite.setLayoutData(layoutData);

        Group group = createJRESelectionGroup(mainComposite);
        layoutData = new GridData(GridData.FILL_HORIZONTAL);
        group.setLayoutData(layoutData);
        setControl(mainComposite);
    }

    /**
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
     */
    public String getName() {
        return Messages.JRETab_title;
    }

    /**
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
     */
    public Image getImage() {
        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);

    }

    /**
     * Initialize current UI selection to data given by configuration parameter
     *
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
     */
    public void initializeFrom(ILaunchConfiguration configuration) {
        try {
            Collection<IProject> projects = _projectsTab.getSelectedProjects();
            IVMInstall vm = LaunchUtils.getDefaultLaunchVM(projects);
            if (vm != null) {
                _projectJREButton.setText(Messages.JRETab_projectJRE + " (" + vm.getName() + ")");
            } else {
                _projectJREButton.setText(Messages.JRETab_projectJRE + " (undefined)");
            }
            int jreType = configuration.getAttribute(ATTR_JRE_TYPE, DEFAULT_JRE_TYPE);
            if (jreType == JRE_TYPE_PROJECT) {
                _projectJREButton.setSelection(true);
                _alternateJREButton.setSelection(false);
                _jreCombo.setEnabled(false);
            } else if (jreType == JRE_TYPE_ALTERNATE) {
                _projectJREButton.setSelection(false);
                _alternateJREButton.setSelection(true);
                initJREComboSelection(configuration);
            }
        } catch (CoreException e) {
            setErrorMessage(Messages.ProjectsTab_noProjectSelected);
            _logger.error("", e);
        }
    }

    /**
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
        if (_projectJREButton.getSelection()) {
            configuration.setAttribute(ATTR_JRE_TYPE, JRE_TYPE_PROJECT);
        } else {
            configuration.setAttribute(ATTR_JRE_TYPE, JRE_TYPE_ALTERNATE);
            IVMInstall vm = VMUtils.findVMByName(_jreCombo.getText());
            if (vm != null) {
                configuration.setAttribute(ATTR_JRE_ID, vm.getId());
            }
        }
    }

    /**
     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
        // do nothing
    }

    /**
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
    }

    /**
     * Sets the layout of the given <code>button</code>.
     *
     * @param button
     */
    public static void setDialogConfirmButtonLayoutData(Button button) {
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
        Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
        data.widthHint = Math.max(IDialogConstants.BUTTON_WIDTH, minSize.x);
        button.setLayoutData(data);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        updateLaunchConfigurationDialog();
    }

    private Group createJRESelectionGroup(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        group.setText(Messages.JRETab_groupTitle);
        GridLayout layout = new GridLayout(3, false);
        group.setLayout(layout);

        _projectJREButton = new Button(group, SWT.RADIO);
        GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
        layoutData.horizontalSpan = 3;
        _projectJREButton.setLayoutData(layoutData);
        _projectJREButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (_projectJREButton.getSelection()) {
                    _jreCombo.setEnabled(false);
                    updateLaunchConfigurationDialog();
                }
            }
        });

        _alternateJREButton = new Button(group, SWT.RADIO);
        _alternateJREButton.setText(Messages.JRETab_alternateJRE);
        _alternateJREButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (_alternateJREButton.getSelection()) {
                    _jreCombo.setEnabled(true);
                    int index = _jreCombo.getSelectionIndex();
                    if (index == -1 && _jreCombo.getItemCount() > 0) {
                        _jreCombo.select(0);
                    }
                    updateLaunchConfigurationDialog();
                }
            }
        });

        _jreCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
        List<IVMInstall> installedVMs = VMUtils.getInstalledBBVMs();
        List<String> vmNames = new ArrayList<String>();
        for (IVMInstall vm : installedVMs) {
            vmNames.add(vm.getName());
        }
        _jreCombo.setItems(vmNames.toArray(new String[vmNames.size()]));
        _jreCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        _jreCombo.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateLaunchConfigurationDialog();
            }
        });

        _installedJREButton = new Button(group, SWT.NONE);
        _installedJREButton.setText(Messages.JRETab_installedJREs);
        _installedJREButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                String jreID = BuildPathSupport.JRE_PREF_PAGE_ID;
                String eeID = BuildPathSupport.EE_PREF_PAGE_ID;
                String complianceId = CompliancePreferencePage.PREF_ID;
                Map data = new HashMap();
                data.put(PropertyAndPreferencePage.DATA_NO_LINK, Boolean.TRUE);
                PreferencesUtil.createPreferenceDialogOn(e.display.getActiveShell(), jreID,
                        new String[] { jreID, complianceId, eeID }, data).open();
                fillInstalledJREs();
                updateProjectJRE();
                updateLaunchConfigurationDialog();
            }
        });
        return group;
    }

    private void initJREComboSelection(ILaunchConfiguration configuration) {
        try {
            String jreId = configuration.getAttribute(ATTR_JRE_ID, StringUtils.EMPTY);
            List<IVMInstall> installedVMs = VMUtils.getInstalledBBVMs();
            int selectedIndex = 0;
            for (IVMInstall vm : installedVMs) {
                if (vm.getId().equals(jreId)) {
                    break;
                }
                selectedIndex++;
            }
            _jreCombo.select(selectedIndex);
        } catch (CoreException e) {
            _logger.error("", e);
        }
    }

    /**
     * Populate installed JRE ComboBox.Preserve the current selection.
     */
    private void fillInstalledJREs() {
        String selectedItem = "";
        int selectionIndex = -1;
        selectionIndex = _jreCombo.getSelectionIndex();
        if (selectionIndex != -1) {// paranoia
            selectedItem = _jreCombo.getItems()[selectionIndex];
        }
        List<IVMInstall> standins = VMUtils.getInstalledBBVMs();
        IVMInstall[] installedVMs = (standins.toArray(new IVMInstall[standins.size()]));

        selectionIndex = -1;// find new index
        String[] jreLabels = new String[installedVMs.length];
        String[] RECompliance = new String[installedVMs.length];
        for (int i = 0; i < installedVMs.length; i++) {
            jreLabels[i] = installedVMs[i].getName();
            if (selectedItem != null && jreLabels[i].equals(selectedItem)) {
                selectionIndex = i;
            }
            if (installedVMs[i] instanceof IVMInstall2) {
                RECompliance[i] = JavaModelUtil.getCompilerCompliance((IVMInstall2) installedVMs[i],
                        JavaCore.VERSION_1_4);
            } else {
                RECompliance[i] = JavaCore.VERSION_1_4;
            }
        }
        _jreCombo.setItems(jreLabels);
        if (selectionIndex == -1) {
            _jreCombo.setText(getDefaultJREName());
        } else {
            _jreCombo.select(selectionIndex);
        }
    }

    /**
     * Update project JRE.
     */
    private void updateProjectJRE() {
        Collection<IProject> projects = _projectsTab.getSelectedProjects();
        IVMInstall vm = LaunchUtils.getDefaultLaunchVM(projects);
        if (vm != null) {
            _projectJREButton.setText(Messages.JRETab_projectJRE + " (" + vm.getName() + ")");
        }
    }

    private String getDefaultJREName() {
        IVMInstall vm = VMUtils.getDefaultBBVM();
        return vm != null ? vm.getName() : StringUtils.EMPTY;
    }
}