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