package org.eclipse.jdt.internal.debug.ui.launcher;/**********************************************************************Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.This file is made available under the terms of the Common Public License v1.0which accompanies this distribution, and is available athttp://www.eclipse.org/legal/cpl-v10.html**********************************************************************/import java.io.File;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.text.MessageFormat;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import org.eclipse.core.resources.IProject;import org.eclipse.core.resources.IncrementalProjectBuilder;import org.eclipse.core.resources.ResourcesPlugin;import org.eclipse.core.runtime.CoreException;import org.eclipse.core.runtime.IProgressMonitor;import org.eclipse.core.runtime.IStatus;import org.eclipse.core.runtime.Status;import org.eclipse.core.runtime.SubProgressMonitor;import org.eclipse.jdt.core.IJavaModel;import org.eclipse.jdt.core.IJavaProject;import org.eclipse.jdt.core.JavaCore;import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;import org.eclipse.jdt.internal.debug.ui.ExceptionHandler;import org.eclipse.jdt.internal.debug.ui.IJavaDebugHelpContextIds;import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;import org.eclipse.jdt.internal.debug.ui.SWTUtil;import org.eclipse.jdt.launching.IVMInstall;import org.eclipse.jdt.launching.IVMInstallType;import org.eclipse.jdt.launching.JavaRuntime;import org.eclipse.jdt.launching.LibraryLocation;import org.eclipse.jdt.launching.VMDefinitionsContainer;import org.eclipse.jdt.launching.VMStandin;import org.eclipse.jface.dialogs.ErrorDialog;import org.eclipse.jface.dialogs.MessageDialog;import org.eclipse.jface.dialogs.ProgressMonitorDialog;import org.eclipse.jface.operation.IRunnableWithProgress;import org.eclipse.jface.preference.PreferencePage;import org.eclipse.jface.viewers.CheckStateChangedEvent;import org.eclipse.jface.viewers.CheckboxTableViewer;import org.eclipse.jface.viewers.DoubleClickEvent;import org.eclipse.jface.viewers.ICheckStateListener;import org.eclipse.jface.viewers.IDoubleClickListener;import org.eclipse.jface.viewers.ISelectionChangedListener;import org.eclipse.jface.viewers.IStructuredSelection;import org.eclipse.jface.viewers.SelectionChangedEvent;import org.eclipse.jface.viewers.TableLayout;import org.eclipse.jface.viewers.Viewer;import org.eclipse.jface.viewers.ViewerSorter;import org.eclipse.swt.SWT;import org.eclipse.swt.events.ControlAdapter;import org.eclipse.swt.events.ControlEvent;import org.eclipse.swt.graphics.Point;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.DirectoryDialog;import org.eclipse.swt.widgets.Event;import org.eclipse.swt.widgets.Listener;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;import org.eclipse.ui.IWorkbench;import org.eclipse.ui.IWorkbenchPreferencePage;import org.eclipse.ui.actions.WorkspaceModifyOperation;import org.eclipse.ui.help.WorkbenchHelp;/* * The page for setting the default Java runtime preference. */public class VMPreferencePage extends PreferencePage implements IWorkbenchPreferencePage,																	IAddVMDialogRequestor {		// The main list control	private CheckboxTableViewer fVMList;		// Action buttons	private Button fAddButton;	private Button fRemoveButton;	private Button fEditButton;	private Button fSearchButton;			private IVMInstallType[] fVMTypes;		// The VMs currently in the Checkbox table	private List fVMStandins;	// Make sure that VMStandin ids are unique if multiple calls to System.currentTimeMillis()	// happen very quickly	private static String fgLastUsedID;	public VMPreferencePage() {		super();		setDescription(LauncherMessages.getString("vmPreferencePage.message")); //$NON-NLS-1$	}	/**	 * @see IWorkbenchPreferencePage#init(IWorkbench)	 */	public void init(IWorkbench workbench) {	}		/**	 * Set the VM list that will be input for the main list control.	 */	private void populateVMList() {				// Retrieve all known VM installs from each vm install type		fVMStandins= new ArrayList();		for (int i= 0; i < fVMTypes.length; i++) {			IVMInstall[] vmInstalls= fVMTypes[i].getVMInstalls();			for (int j = 0; j < vmInstalls.length; j++) {				fVMStandins.add(new VMStandin(vmInstalls[j]));			}		}				// Set the input of the main list control		fVMList.setInput(fVMStandins);				// Set up the default VM		initDefaultVM();	}		/**	 * Find & verify the default VM.	 */	private void initDefaultVM() {		IVMInstall realDefault= JavaRuntime.getDefaultVMInstall();		if (realDefault != null) {			Iterator iter= fVMStandins.iterator();			while (iter.hasNext()) {				IVMInstall fakeVM= (IVMInstall)iter.next();				if (isSameVM(fakeVM, realDefault)) {					verifyDefaultVM(fakeVM);					break;				}			}		}	}		/**	 * @see PreferencePage#createContents(Composite)	 */	protected Control createContents(Composite ancestor) {		fVMTypes= JavaRuntime.getVMInstallTypes();		noDefaultAndApplyButton();				Composite parent= new Composite(ancestor, SWT.NULL);		GridLayout layout= new GridLayout();		layout.numColumns= 2;		layout.marginHeight = 0;		layout.marginWidth = 0;		parent.setLayout(layout);						Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);				GridData data= new GridData(GridData.FILL_BOTH);		table.setLayoutData(data);						table.setHeaderVisible(true);		table.setLinesVisible(true);				TableLayout tableLayout= new TableLayout();		table.setLayout(tableLayout);		TableColumn column1= new TableColumn(table, SWT.NULL);		column1.setText(LauncherMessages.getString("vmPreferencePage.jreType")); //$NON-NLS-1$			TableColumn column2= new TableColumn(table, SWT.NULL);		column2.setText(LauncherMessages.getString("vmPreferencePage.jreName")); //$NON-NLS-1$				TableColumn column3= new TableColumn(table, SWT.NULL);		column3.setText(LauncherMessages.getString("vmPreferencePage.jreLocation")); //$NON-NLS-1$		fVMList= new CheckboxTableViewer(table);				fVMList.setSorter(new ViewerSorter() {			public int compare(Viewer viewer, Object e1, Object e2) {				if ((e1 instanceof IVMInstall) && (e2 instanceof IVMInstall)) {					IVMInstall left= (IVMInstall)e1;					IVMInstall right= (IVMInstall)e2;					String leftType= left.getVMInstallType().getName();					String rightType= right.getVMInstallType().getName();					int res= leftType.compareToIgnoreCase(rightType);					if (res != 0) {						return res;					}					return left.getName().compareToIgnoreCase(right.getName());				}				return super.compare(viewer, e1, e2);			}						public boolean isSorterProperty(Object element, String property) {				return true;			}		});							fVMList.setLabelProvider(new VMLabelProvider());		fVMList.setContentProvider(new ListContentProvider(fVMList, Collections.EMPTY_LIST));				fVMList.addSelectionChangedListener(new ISelectionChangedListener() {			public void selectionChanged(SelectionChangedEvent evt) {				enableButtons();			}		});				fVMList.addCheckStateListener(new ICheckStateListener() {			public void checkStateChanged(CheckStateChangedEvent event) {				IVMInstall vm=  (IVMInstall)event.getElement();				if (event.getChecked()) {					verifyDefaultVM(vm);				}				fVMList.setCheckedElements(new Object[] { vm });			}		});				fVMList.addDoubleClickListener(new IDoubleClickListener() {			public void doubleClick(DoubleClickEvent e) {				editVM();			}		});				Composite buttons= new Composite(parent, SWT.NULL);		buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));		layout= new GridLayout();		layout.marginHeight= 0;		layout.marginWidth= 0;		buttons.setLayout(layout);				fAddButton= new Button(buttons, SWT.PUSH);		fAddButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		SWTUtil.setButtonDimensionHint(fAddButton);		fAddButton.setText(LauncherMessages.getString("vmPreferencePage.add")); //$NON-NLS-1$		fAddButton.addListener(SWT.Selection, new Listener() {			public void handleEvent(Event evt) {				addVM();			}		});				fEditButton= new Button(buttons, SWT.PUSH);		fEditButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		SWTUtil.setButtonDimensionHint(fEditButton);		fEditButton.setText(LauncherMessages.getString("vmPreferencePage.edit")); //$NON-NLS-1$		fEditButton.addListener(SWT.Selection, new Listener() {			public void handleEvent(Event evt) {				editVM();			}		});				fRemoveButton= new Button(buttons, SWT.PUSH);		fRemoveButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		SWTUtil.setButtonDimensionHint(fRemoveButton);		fRemoveButton.setText(LauncherMessages.getString("vmPreferencePage.remove")); //$NON-NLS-1$		fRemoveButton.addListener(SWT.Selection, new Listener() {			public void handleEvent(Event evt) {				removeVMs();			}		});				fSearchButton = new Button(buttons, SWT.PUSH);		fSearchButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		SWTUtil.setButtonDimensionHint(fSearchButton);		fSearchButton.setText(LauncherMessages.getString("VMPreferencePage.&Search..._1")); //$NON-NLS-1$		fSearchButton.addListener(SWT.Selection, new Listener() {			public void handleEvent(Event evt) {				search();			}		});						configureTableResizing(parent, buttons, table, column1, column2, column3);				populateVMList();		enableButtons();		WorkbenchHelp.setHelp(parent, IJavaDebugHelpContextIds.JRE_PREFERENCE_PAGE);				return parent;	}	/**	 * Correctly resizes the table so no phantom columns appear	 */	protected void configureTableResizing(final Composite parent, final Composite buttons, final Table table, final TableColumn column1, final TableColumn column2, final TableColumn column3) {		parent.addControlListener(new ControlAdapter() {		    public void controlResized(ControlEvent e) {		    	Rectangle area = parent.getClientArea();			    Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);			    int width = area.width - 2 * table.getBorderWidth();			    if (preferredSize.y > area.height) {			     	// Subtract the scrollbar width from the total column width			     	// if a vertical scrollbar will be required			     	Point vBarSize = table.getVerticalBar().getSize();			     	width -= vBarSize.x;			    }			    width-= buttons.getSize().x;			    Point oldSize = table.getSize();			    if (oldSize.x > width) {			    	// table is getting smaller so make the columns					// smaller first and then resize the table to				    // match the client area width				    column1.setWidth(width/4);				    column2.setWidth(width/4);			    	column3.setWidth(width - (column1.getWidth() + column2.getWidth()));				    table.setSize(width, area.height);			    } else {			    	// table is getting bigger so make the table			    	// bigger first and then make the columns wider			    	// to match the client area width			      	table.setSize(width, area.height);				    column1.setWidth(width/4);				    column2.setWidth(width/4);				    column3.setWidth(width - (column1.getWidth() + column2.getWidth()));			     }		    }		});	}				/**	 * @see IAddVMDialogRequestor#isDuplicateName(IVMInstallType, String)	 */	public boolean isDuplicateName(IVMInstallType type, String name) {		for (int i= 0; i < fVMStandins.size(); i++) {			IVMInstall vm= (IVMInstall)fVMStandins.get(i);			if (vm.getVMInstallType() == type) {				if (vm.getName().equals(name)) {					return true;				}			}		}		return false;	}				/**	 * Bring up a dialog that lets the user create a new VM definition.	 */	private void addVM() {		AddVMDialog dialog= new AddVMDialog(this, getShell(), fVMTypes, null);		dialog.setTitle(LauncherMessages.getString("vmPreferencePage.addJRE.title")); //$NON-NLS-1$		if (dialog.open() != AddVMDialog.OK) {			return;		}		fVMList.refresh();	}		/**	 * @see IAddVMDialogRequestor#vmAdded(IVMInstall)	 */	public void vmAdded(IVMInstall vm) {		fVMStandins.add(vm);		fVMList.refresh();		if (getCurrentDefaultVM() == null) {			verifyDefaultVM(vm);		}	}		private void removeVMs() {		IStructuredSelection selection= (IStructuredSelection)fVMList.getSelection();		Iterator elements= selection.iterator();		while (elements.hasNext()) {			Object o= elements.next();			fVMStandins.remove(o);		}		fVMList.refresh();		// this is order dependent. Must first refresh to work with 		// the new state of affairs		if (getCurrentDefaultVM() == null) {			if (fVMList.getTable().getItemCount() > 0) {				verifyDefaultVM((IVMInstall)fVMList.getElementAt(0));			}		}	}			private void editVM() {		IStructuredSelection selection= (IStructuredSelection)fVMList.getSelection();		// assume it's length one, otherwise this will not be called		IVMInstall vm= (IVMInstall)selection.getFirstElement();		AddVMDialog dialog= new AddVMDialog(this, getShell(), fVMTypes, vm);		dialog.setTitle(LauncherMessages.getString("vmPreferencePage.editJRE.title")); //$NON-NLS-1$		if (dialog.open() != AddVMDialog.OK) {			return;		}		fVMList.refresh(vm);	}		private boolean isSameVM(IVMInstall left, IVMInstall right) {		if (left == right) {			return true;		}		if (left != null && right != null) {			return left.getId().equals(right.getId());		}		return false;	}	/**	 * @see IPreferencePage#performOk()	 */	public boolean performOk() {				// Create a VM definition container		VMDefinitionsContainer vmContainer = new VMDefinitionsContainer();				// Set the default VM Id on the container		IVMInstall defaultVM = getCurrentDefaultVM();		String defaultVMId = JavaRuntime.getCompositeIdFromVM(defaultVM);		vmContainer.setDefaultVMInstallCompositeID(defaultVMId);				// Set the VMs on the container		vmContainer.addVMList(fVMStandins);				// Generate XML for the VM defs and save it as the new value of the VM preference		try {			String vmDefXML = vmContainer.getAsXML();			JavaRuntime.getPreferences().setValue(JavaRuntime.PREF_VM_XML, vmDefXML);			JavaRuntime.savePreferences();					} catch (IOException ioe) {			JDIDebugUIPlugin.log(ioe);		}				return super.performOk();	}			/**	 * Returns a map of VM installs to lists of projects that reference the VMs.	 */	private Map getVMsToProjects() {		HashMap map = new HashMap();		try {			IJavaProject[] projects = getJavaModel().getJavaProjects();			for (int i = 0; i < projects.length; i++) {				IJavaProject jp = projects[i];				if (jp.getProject().isOpen()) {					IVMInstall vm = JavaRuntime.getVMInstall(jp);					if (vm != null) {						List list = (List)map.get(vm);						if (list == null) {							list = new ArrayList(2);							map.put(vm, list);						}						list.add(jp);					}				}			}		} catch (CoreException e) {		}		return map;	}		protected IJavaModel getJavaModel() {		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());	}		private void updateDefaultVMInstall(final IVMInstall newDefault) {		ProgressMonitorDialog dialog= new ProgressMonitorDialog(getShell());		try {			dialog.run(true, true, new WorkspaceModifyOperation() {				public void execute(IProgressMonitor monitor) throws InvocationTargetException{					try {						JavaRuntime.setDefaultVMInstall(newDefault, monitor);					} catch (CoreException e) {						throw new InvocationTargetException(e);					}				}			});		} catch (InterruptedException e) {			// opearation canceled by user		} catch (InvocationTargetException e) {			ExceptionHandler.handle(e, getShell(), LauncherMessages.getString("VMPreferencePage.Installed_JREs_1"), LauncherMessages.getString("VMPreferencePage.Could_not_set_classpath_variables._2")); //$NON-NLS-2$ //$NON-NLS-1$		}	}		private void buildProjects(final Set projects) {		ProgressMonitorDialog dialog= new ProgressMonitorDialog(getShell());		try {			dialog.run(true, true, new WorkspaceModifyOperation() {				public void execute(IProgressMonitor monitor) throws InvocationTargetException{					try {						Iterator iter = projects.iterator();						monitor.beginTask("", projects.size() * 100); //$NON-NLS-1$						while (iter.hasNext()) {							IProgressMonitor subMontior = new SubProgressMonitor(monitor, 100);							IProject pro = ((IJavaProject)iter.next()).getProject();							pro.build(IncrementalProjectBuilder.FULL_BUILD, subMontior);							subMontior.done();						}						monitor.done();					} catch (CoreException e) {						throw new InvocationTargetException(e);					}				}			});		} catch (InterruptedException e) {			// opearation canceled by user		} catch (InvocationTargetException e) {			ExceptionHandler.handle(e, getShell(), LauncherMessages.getString("VMPreferencePage.Installed_JREs_1"), LauncherMessages.getString("VMPreferencePage.Build_failed._1")); //$NON-NLS-1$ //$NON-NLS-2$		}	}					private IVMInstall getCurrentDefaultVM() {		Object[] checked= fVMList.getCheckedElements();		if (checked.length > 0) {			return (IVMInstall)checked[0];		}		return null;	}		private void vmSelectionChanged() {		enableButtons();	}	private void enableButtons() {		fAddButton.setEnabled(fVMTypes.length > 0);		int selectionCount= ((IStructuredSelection)fVMList.getSelection()).size();		fEditButton.setEnabled(selectionCount == 1);		fRemoveButton.setEnabled(selectionCount > 0 && selectionCount < fVMList.getTable().getItemCount());	}		/**	 * Verify that the specified VM can be a valid default VM.  This amounts to verifying	 * that all of the VM's library locations exist on the file system.  If this fails,	 * remove the VM from the table and try to set another default.	 */	private void verifyDefaultVM(IVMInstall vm) {		if (vm != null) {						// Verify that all of the specified VM's library locations actually exist			LibraryLocation[] locations= JavaRuntime.getLibraryLocations(vm);			boolean exist = true;			for (int i = 0; i < locations.length; i++) {				exist = exist && new File(locations[i].getSystemLibraryPath().toOSString()).exists();			}						// If all library locations exist, check the corresponding entry in the list,			// otherwise remove the VM			if (exist) {				fVMList.setCheckedElements(new Object[] { vm });			} else {				fVMList.remove(vm);				fVMStandins.remove(vm);				IVMInstall def = JavaRuntime.getDefaultVMInstall();				if (def == null) {					fVMList.setCheckedElements(new Object[0]);				} else {					fVMList.setChecked(def, true);				}				ErrorDialog.openError(getControl().getShell(), LauncherMessages.getString("VMPreferencePage.Installed_JREs_1"), LauncherMessages.getString("VMPreferencePage.Installed_JRE_location_no_longer_exists.__JRE_will_be_removed_2"), new Status(IStatus.ERROR, IJavaDebugUIConstants.PLUGIN_ID, IJavaDebugUIConstants.INTERNAL_ERROR, LauncherMessages.getString("VMPreferencePage.JRE_removed_3"), null)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$				return;			}		} else {			fVMList.setCheckedElements(new Object[0]);		}	}		/**	 * @see IDialogPage#setVisible(boolean)	 */	public void setVisible(boolean visible) {		super.setVisible(visible);		if (visible) {			setTitle(LauncherMessages.getString("vmPreferencePage.title")); //$NON-NLS-1$		}	}	/**	 * Search for installed VMs in the file system	 */	public void search() {				// choose a root directory for the search 		DirectoryDialog dialog = new DirectoryDialog(getShell());		dialog.setMessage(LauncherMessages.getString("VMPreferencePage.Select_a_directory_to_search_in._2")); //$NON-NLS-1$		dialog.setText(LauncherMessages.getString("VMPreferencePage.Directory_Selection_3")); //$NON-NLS-1$		String path = dialog.open();		if (path == null) {			return;		}				// ignore installed locations		final Set exstingLocations = new HashSet();		Iterator iter = fVMStandins.iterator();		while (iter.hasNext()) {			exstingLocations.add(((IVMInstall)iter.next()).getInstallLocation());		}				// search		final File rootDir = new File(path);		final List locations = new ArrayList();		final List types = new ArrayList();		ProgressMonitorDialog pm = new ProgressMonitorDialog(getShell());		IRunnableWithProgress r = new IRunnableWithProgress() {			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {				monitor.beginTask(LauncherMessages.getString("VMPreferencePage.Searching..._4"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$				search(rootDir, locations, types, exstingLocations, monitor);				monitor.done();			}		};				try {			pm.run(true, true, r);		} catch (InvocationTargetException e) {			JDIDebugUIPlugin.log(e);		} catch (InterruptedException e) {			// cancelled			return;		}				if (locations.isEmpty()) {			MessageDialog.openInformation(getShell(), LauncherMessages.getString("VMPreferencePage.Information_1"), MessageFormat.format(LauncherMessages.getString("VMPreferencePage.No_JREs_found_in_{0}_2"), new String[]{path})); //$NON-NLS-1$ //$NON-NLS-2$		} else {			iter = locations.iterator();			Iterator iter2 = types.iterator();			while (iter.hasNext()) {				File location = (File)iter.next();				IVMInstallType type = (IVMInstallType)iter2.next();				IVMInstall vm = new VMStandin(type, createUniqueId(type));				String name = location.getName();				String nameCopy = new String(name);				int i = 1;				while (isDuplicateName(type, nameCopy)) {					nameCopy = name + '(' + i++ + ')'; 				}				vm.setName(nameCopy);				vm.setInstallLocation(location);				vmAdded(vm);			}		}			}		/**	 * Find a unique VM id.  Check existing 'real' VMs, as well as the last id used for	 * a VMStandin.	 */	private String createUniqueId(IVMInstallType vmType) {		String id= null;		do {			id= String.valueOf(System.currentTimeMillis());		} while (vmType.findVMInstall(id) != null || id.equals(fgLastUsedID));		fgLastUsedID = id;		return id;	}			/**	 * Searches the specified directory recursively for installed VMs, adding each	 * detected VM to the <code>found</code> list. Any directories specified in	 * the <code>ignore</code> are not traversed.	 * 	 * @param directory	 * @param found	 * @param types	 * @param ignore	 */	protected void search(File directory, List found, List types, Set ignore, IProgressMonitor monitor) {		if (monitor.isCanceled()) {			return;		}		String[] names = directory.list();		List subDirs = new ArrayList();		for (int i = 0; i < names.length; i++) {			if (monitor.isCanceled()) {				return;			}			File file = new File(directory, names[i]);			try {				monitor.subTask(MessageFormat.format(LauncherMessages.getString("VMPreferencePage.Found__{0}_-_Searching_{1}_7"), new String[]{Integer.toString(found.size()), file.getCanonicalPath()})); //$NON-NLS-1$			} catch (IOException e) {			}						if (file.isDirectory()) {				if (!ignore.contains(file)) {					boolean validLocation = false;										// Take the first VM install type that claims the location as a					// valid VM install.  VM install types should be smart enough to not					// claim another type's VM, but just in case...					for (int j = 0; j < fVMTypes.length; j++) {						if (monitor.isCanceled()) {							return;						}						IVMInstallType type = fVMTypes[j];						IStatus status = type.validateInstallLocation(file);						if (status.isOK()) {							found.add(file);							types.add(type);							validLocation = true;							break;						}					}					if (!validLocation) {						subDirs.add(file);					}				}			}		}		while (!subDirs.isEmpty()) {			File subDir = (File)subDirs.remove(0);			search(subDir, found, types, ignore, monitor);			if (monitor.isCanceled()) {				return;			}		}			}	}