blob: b89d0f050cc075f60d3fcf0e17f8d933824439d8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.debug.ui.interpreters;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
import org.eclipse.dltk.internal.ui.util.SWTUtil;
import org.eclipse.dltk.internal.ui.util.TableLayoutComposite;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.IInterpreterInstallType;
import org.eclipse.dltk.launching.InterpreterSearcher;
import org.eclipse.dltk.launching.InterpreterStandin;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.dltk.ui.util.PixelConverter;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* A composite that displays installed InterpreterEnvironment's in a table.
* InterpreterEnvironments can be added, removed, edited, and searched for.
* <p>
* This block implements ISelectionProvider - it sends selection change events
* when the checked InterpreterEnvironment in the table changes, or when the
* "use default" button check state changes.
* </p>
*/
public abstract class InterpretersBlock implements
IAddInterpreterDialogRequestor, ISelectionProvider {
/**
* This block's control
*/
private Composite fControl;
/**
* Interpreters being displayed
*/
protected List fInterpreters = new ArrayList();
/**
* The main list control
*/
protected CheckboxTableViewer fInterpreterList;
// Action buttons
private Button fAddButton;
private Button fRemoveButton;
private Button fEditButton;
private Button fCopyButton;
private Button fSearchButton;
// index of column used for sorting
private int fSortColumn = 0;
/**
* Selection listeners (checked InterpreterEnvironment changes)
*/
private ListenerList fSelectionListeners = new ListenerList();
/**
* Previous selection
*/
private ISelection fPrevSelection = new StructuredSelection();
private Table fTable;
/**
* Content provider to show a list of InterpreterEnvironments
*/
class InterpretersContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object input) {
return fInterpreters.toArray();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
}
/**
* Label provider for installed InterpreterEnvironments table.
*/
class InterpreterLabelProvider extends LabelProvider implements
ITableLabelProvider {
/**
* @see ITableLabelProvider#getColumnText(Object, int)
*/
public String getColumnText(Object element, int columnIndex) {
if (element instanceof IInterpreterInstall) {
IInterpreterInstall interp = (IInterpreterInstall) element;
switch (columnIndex) {
case 0:
return interp.getName();
case 1:
return interp.getInterpreterInstallType().getName();
case 2:
return interp.getInstallLocation().toString();
}
}
return element.toString();
}
/**
* @see ITableLabelProvider#getColumnImage(Object, int)
*/
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == 0) {
// TODO: instert interpreter logo here
}
return null;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void addSelectionChangedListener(ISelectionChangedListener listener) {
fSelectionListeners.add(listener);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
public ISelection getSelection() {
return new StructuredSelection(fInterpreterList.getCheckedElements());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
fSelectionListeners.remove(listener);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(ISelection selection) {
if (selection instanceof IStructuredSelection) {
if (!selection.equals(fPrevSelection)) {
fPrevSelection = selection;
Object interp = ((IStructuredSelection) selection)
.getFirstElement();
if (interp == null) {
fInterpreterList.setCheckedElements(new Object[0]);
} else {
fInterpreterList
.setCheckedElements(new Object[] { interp });
fInterpreterList.reveal(interp);
}
fireSelectionChanged();
}
}
}
/**
* Creates this block's control in the given control.
*
* @param ancestor
* containing control
* @param useManageButton
* whether to present a single 'manage...' button to the user
* that opens the installed InterpreterEnvironments pref page for
* InterpreterEnvironment management, or to provide 'add, remove,
* edit, and search' buttons.
*/
public void createControl(Composite ancestor) {
Composite parent = new Composite(ancestor, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 0;
layout.marginWidth = 0;
Font font = ancestor.getFont();
parent.setFont(font);
parent.setLayout(layout);
fControl = parent;
GridData data;
Label tableLabel = new Label(parent, SWT.NONE);
tableLabel.setText(InterpretersMessages.InstalledInterpretersBlock_15);
data = new GridData();
data.horizontalSpan = 2;
tableLabel.setLayoutData(data);
tableLabel.setFont(font);
PixelConverter conv = new PixelConverter(parent);
data = new GridData(GridData.FILL_BOTH);
data.widthHint = conv.convertWidthInCharsToPixels(50);
TableLayoutComposite tblComposite = new TableLayoutComposite(parent,
SWT.NONE);
tblComposite.setLayoutData(data);
fTable = new Table(tblComposite, SWT.CHECK | SWT.BORDER | SWT.MULTI
| SWT.FULL_SELECTION);
data = new GridData(GridData.FILL_BOTH);
data.widthHint = 450;
fTable.setLayoutData(data);
fTable.setFont(font);
fTable.setHeaderVisible(true);
fTable.setLinesVisible(true);
TableColumn column1 = new TableColumn(fTable, SWT.NULL);
column1.setText(InterpretersMessages.InstalledInterpretersBlock_0);
column1.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
sortByName();
}
});
column1.setWidth(conv.convertWidthInCharsToPixels(40));
TableColumn column2 = new TableColumn(fTable, SWT.NULL);
column2.setText(InterpretersMessages.InstalledInterpretersBlock_2);
column2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
sortByType();
}
});
column2.setWidth(conv.convertWidthInCharsToPixels(60));
TableColumn column3 = new TableColumn(fTable, SWT.NULL);
column3.setText(InterpretersMessages.InstalledInterpretersBlock_1);
column3.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
sortByLocation();
}
});
column3.setWidth(conv.convertWidthInCharsToPixels(40));
fInterpreterList = new CheckboxTableViewer(fTable);
fInterpreterList.setLabelProvider(new InterpreterLabelProvider());
fInterpreterList.setContentProvider(new InterpretersContentProvider());
// by default, sort by name
sortByName();
fInterpreterList
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent evt) {
enableButtons();
}
});
fInterpreterList.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
setCheckedInterpreter((IInterpreterInstall) event
.getElement());
} else {
setCheckedInterpreter(null);
}
}
});
fInterpreterList.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent e) {
if (!fInterpreterList.getSelection().isEmpty()) {
editInterpreter();
}
}
});
fTable.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if (event.character == SWT.DEL && event.stateMask == 0) {
if (fRemoveButton.getEnabled())
removeInterpreters();
}
}
});
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);
buttons.setFont(font);
fAddButton = createPushButton(buttons,
InterpretersMessages.InstalledInterpretersBlock_3);
fAddButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
addInterpreter();
}
});
fEditButton = createPushButton(buttons,
InterpretersMessages.InstalledInterpretersBlock_4);
fEditButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
editInterpreter();
}
});
fCopyButton = createPushButton(buttons,
InterpretersMessages.InstalledInterpretersBlock_16);
fCopyButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
copyInterpreter();
}
});
fRemoveButton = createPushButton(buttons,
InterpretersMessages.InstalledInterpretersBlock_5);
fRemoveButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
removeInterpreters();
}
});
// copied from ListDialogField.CreateSeparator()
Label separator = new Label(buttons, SWT.NONE);
separator.setVisible(false);
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
gd.verticalAlignment = GridData.BEGINNING;
gd.heightHint = 4;
separator.setLayoutData(gd);
fSearchButton = createPushButton(buttons,
InterpretersMessages.InstalledInterpretersBlock_6);
fSearchButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
search();
}
});
fillWithWorkspaceInterpreters();
enableButtons();
fAddButton.setEnabled(ScriptRuntime
.getInterpreterInstallTypes(getCurrentNature()).length > 0);
}
/**
* Fire current selection
*/
private void fireSelectionChanged() {
SelectionChangedEvent event = new SelectionChangedEvent(this,
getSelection());
Object[] listeners = fSelectionListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i];
listener.selectionChanged(event);
}
}
/**
* Sorts by Interpreter type, and name within type.
*/
private void sortByType() {
fInterpreterList.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object e1, Object e2) {
if ((e1 instanceof IInterpreterInstall)
&& (e2 instanceof IInterpreterInstall)) {
IInterpreterInstall left = (IInterpreterInstall) e1;
IInterpreterInstall right = (IInterpreterInstall) e2;
String leftType = left.getInterpreterInstallType()
.getName();
String rightType = right.getInterpreterInstallType()
.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;
}
});
fSortColumn = 3;
}
/**
* Sorts by Interpreter name.
*/
private void sortByName() {
fInterpreterList.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object e1, Object e2) {
if ((e1 instanceof IInterpreterInstall)
&& (e2 instanceof IInterpreterInstall)) {
IInterpreterInstall left = (IInterpreterInstall) e1;
IInterpreterInstall right = (IInterpreterInstall) e2;
return left.getName().compareToIgnoreCase(right.getName());
}
return super.compare(viewer, e1, e2);
}
public boolean isSorterProperty(Object element, String property) {
return true;
}
});
fSortColumn = 1;
}
/**
* Sorts by Interpreter location.
*/
private void sortByLocation() {
fInterpreterList.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object e1, Object e2) {
if ((e1 instanceof IInterpreterInstall)
&& (e2 instanceof IInterpreterInstall)) {
IInterpreterInstall left = (IInterpreterInstall) e1;
IInterpreterInstall right = (IInterpreterInstall) e2;
return left.getInstallLocation().toString()
.compareToIgnoreCase(
right.getInstallLocation().toString());
}
return super.compare(viewer, e1, e2);
}
public boolean isSorterProperty(Object element, String property) {
return true;
}
});
fSortColumn = 2;
}
private void enableButtons() {
IStructuredSelection selection = (IStructuredSelection) fInterpreterList
.getSelection();
int selectionCount = selection.size();
fEditButton.setEnabled(selectionCount == 1);
fCopyButton.setEnabled(selectionCount > 0);
if (selectionCount > 0) {
Iterator iterator = selection.iterator();
while (iterator.hasNext()) {
IInterpreterInstall install = (IInterpreterInstall) iterator
.next();
if (isContributed(install)) {
fRemoveButton.setEnabled(false);
return;
}
}
fRemoveButton.setEnabled(true);
} else {
fRemoveButton.setEnabled(false);
}
}
protected Button createPushButton(Composite parent, String label) {
return SWTUtil.createPushButton(parent, label, null);
}
private boolean isContributed(IInterpreterInstall install) {
return ScriptRuntime.isContributedInterpreterInstall(install.getId());
}
/**
* Returns this block's control
*
* @return control
*/
public Control getControl() {
return fControl;
}
/**
* Sets the InterpreterEnvironments to be displayed in this block
*
* @param Interpreters
* InterpreterEnvironments to be displayed
*/
protected void setInterpreters(IInterpreterInstall[] Interpreters) {
fInterpreters.clear();
for (int i = 0; i < Interpreters.length; i++) {
fInterpreters.add(Interpreters[i]);
}
fInterpreterList.setInput(fInterpreters);
fInterpreterList.refresh();
}
/**
* Returns the InterpreterEnvironments currently being displayed in this
* block
*
* @return InterpreterEnvironments currently being displayed in this block
*/
public IInterpreterInstall[] getInterpreters() {
return (IInterpreterInstall[]) fInterpreters
.toArray(new IInterpreterInstall[fInterpreters.size()]);
}
/**
* @see IAddInterpreterDialogRequestor#isDuplicateName(String)
*/
public boolean isDuplicateName(String name) {
for (int i = 0; i < fInterpreters.size(); i++) {
IInterpreterInstall Interpreter = (IInterpreterInstall) fInterpreters
.get(i);
if (Interpreter.getName().equals(name)) {
return true;
}
}
return false;
}
private void removeInterpreters() {
IStructuredSelection selection = (IStructuredSelection) fInterpreterList
.getSelection();
IInterpreterInstall[] Interpreters = new IInterpreterInstall[selection
.size()];
Iterator iter = selection.iterator();
int i = 0;
while (iter.hasNext()) {
Interpreters[i] = (IInterpreterInstall) iter.next();
i++;
}
removeInterpreters(Interpreters);
}
/**
* Removes the given Interpreters from the table.
*
* @param Interpreters
*/
public void removeInterpreters(IInterpreterInstall[] Interpreters) {
IStructuredSelection prev = (IStructuredSelection) getSelection();
for (int i = 0; i < Interpreters.length; i++) {
fInterpreters.remove(Interpreters[i]);
}
fInterpreterList.refresh();
IStructuredSelection curr = (IStructuredSelection) getSelection();
if (!curr.equals(prev)) {
IInterpreterInstall[] installs = getInterpreters();
if (curr.size() == 0 && installs.length == 1) {
// pick a default Interpreter automatically
setSelection(new StructuredSelection(installs[0]));
} else {
fireSelectionChanged();
}
}
}
/**
* Search for installed interpreters in the file system
*/
protected void search() {
// choose a root directory for the search
/*
* DirectoryDialog dialog = new DirectoryDialog(getShell());
* dialog.setMessage(InterpretersMessages.InstalledInterpreterEnvironmentsBlock_9);
* dialog.setText(InterpretersMessages.InstalledInterpreterEnvironmentsBlock_10);
* String path = dialog.open(); if (path == null) { return; }
*/
// ignore installed locations
final Set exstingLocations = new HashSet();
Iterator iter = fInterpreters.iterator();
while (iter.hasNext()) {
exstingLocations.add(((IInterpreterInstall) iter.next())
.getInstallLocation().getAbsoluteFile());
}
// search
final InterpreterSearcher searcher = new InterpreterSearcher();
IRunnableWithProgress r = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
try {
monitor.beginTask(
InterpretersMessages.InstalledInterpretersBlock_11,
IProgressMonitor.UNKNOWN);
searcher.search(getCurrentNature(), exstingLocations, 1,
monitor);
} finally {
monitor.done();
}
}
};
try {
ProgressMonitorDialog progress = new ProgressMonitorDialog(
getShell()) {
protected void createCancelButton(Composite parent) {
super.createCancelButton(parent);
cancel.setText(InterpretersMessages.InterpretersBlock_0);
}
};
progress.run(true, true, r);
} catch (InvocationTargetException e) {
DLTKDebugUIPlugin.log(e);
} catch (InterruptedException e) {
return; // cancelled
}
if (!searcher.hasResults()) {
MessageDialog.openInformation(getShell(),
InterpretersMessages.InstalledInterpretersBlock_12,
InterpretersMessages.InstalledInterpretersBlock_113);
} else {
final File[] locations = searcher.getFoundFiles();
final IInterpreterInstallType[] types = searcher
.getFoundInstallTypes();
for (int i = 0; i < locations.length; ++i) {
final File file = locations[i];
final IInterpreterInstallType type = types[i];
IInterpreterInstall interpreter = new InterpreterStandin(type,
createUniqueId(type));
final String name = file.getName();
String nameCopy = new String(name);
int j = 1;
while (isDuplicateName(nameCopy)) {
nameCopy = name + '(' + (j++) + ')';
}
interpreter.setName(nameCopy);
interpreter.setInstallLocation(file);
interpreterAdded(interpreter);
}
}
}
protected Shell getShell() {
return getControl().getShell();
}
/**
* Sets the checked InterpreterEnvironment, possible <code>null</code>
*
* @param Interpreter
* InterpreterEnvironment or <code>null</code>
*/
public void setCheckedInterpreter(IInterpreterInstall Interpreter) {
if (Interpreter == null) {
setSelection(new StructuredSelection());
} else {
setSelection(new StructuredSelection(Interpreter));
}
}
/**
* Returns the checked Interpreter or <code>null</code> if none.
*
* @return the checked Interpreter or <code>null</code> if none
*/
public IInterpreterInstall getCheckedInterpreter() {
Object[] objects = fInterpreterList.getCheckedElements();
if (objects.length == 0) {
return null;
}
return (IInterpreterInstall) objects[0];
}
/**
* Persist table settings into the give dialog store, prefixed with the
* given key.
*
* @param settings
* dialog store
* @param qualifier
* key qualifier
*/
public void saveColumnSettings(IDialogSettings settings, String qualifier) {
int columnCount = fTable.getColumnCount();
for (int i = 0; i < columnCount; i++) {
settings
.put(
qualifier + ".columnWidth" + i, fTable.getColumn(i).getWidth()); //$NON-NLS-1$
}
settings.put(qualifier + ".sortColumn", fSortColumn); //$NON-NLS-1$
}
/**
* Restore table settings from the given dialog store using the given key.
*
* @param settings
* dialog settings store
* @param qualifier
* key to restore settings from
*/
public void restoreColumnSettings(IDialogSettings settings, String qualifier) {
fInterpreterList.getTable().layout(true);
restoreColumnWidths(settings, qualifier);
try {
fSortColumn = settings.getInt(qualifier + ".sortColumn"); //$NON-NLS-1$
} catch (NumberFormatException e) {
fSortColumn = 1;
}
switch (fSortColumn) {
case 1:
sortByName();
break;
case 2:
sortByLocation();
break;
case 3:
sortByType();
break;
}
}
private void restoreColumnWidths(IDialogSettings settings, String qualifier) {
int columnCount = fTable.getColumnCount();
for (int i = 0; i < columnCount; i++) {
int width = -1;
try {
width = settings.getInt(qualifier + ".columnWidth" + i); //$NON-NLS-1$
} catch (NumberFormatException e) {
}
if (width <= 0) {
fTable.getColumn(i).pack();
} else {
fTable.getColumn(i).setWidth(width);
}
}
}
/**
* Populates the InterpreterEnvironment table with existing
* InterpreterEnvironments defined in the workspace.
*/
protected void fillWithWorkspaceInterpreters() {
// fill with interpreters
List standins = new ArrayList();
IInterpreterInstallType[] types = ScriptRuntime
.getInterpreterInstallTypes(getCurrentNature());
for (int i = 0; i < types.length; i++) {
IInterpreterInstallType type = types[i];
IInterpreterInstall[] installs = type.getInterpreterInstalls();
if (installs != null)
for (int j = 0; j < installs.length; j++) {
IInterpreterInstall install = installs[j];
standins.add(new InterpreterStandin(install));
}
}
setInterpreters((IInterpreterInstall[]) standins
.toArray(new IInterpreterInstall[standins.size()]));
}
public void interpreterAdded(IInterpreterInstall Interpreter) {
fInterpreters.add(Interpreter);
fInterpreterList.refresh();
IInterpreterInstall[] installs = getInterpreters();
if (installs.length == 1) {
// pick a default Interpreter automatically
setSelection(new StructuredSelection(installs[0]));
}
fireSelectionChanged();
}
// Make sure that InterpreterStandin ids are unique if multiple calls to
// System.currentTimeMillis()
// happen very quickly
private static String fgLastUsedID;
/**
* Find a unique Interpreter id. Check existing 'real' Interpreters, as well
* as the last id used for a InterpreterStandin.
*/
protected String createUniqueId(IInterpreterInstallType InterpreterType) {
String id = null;
do {
id = String.valueOf(System.currentTimeMillis());
} while (InterpreterType.findInterpreterInstall(id) != null
|| id.equals(fgLastUsedID));
fgLastUsedID = id;
return id;
}
/**
* Compares the given name against current names and adds the appropriate
* numerical suffix to ensure that it is unique.
*
* @param name
* the name with which to ensure uniqueness
* @return the unique version of the given name
*
*/
protected String generateName(String name) {
if (!isDuplicateName(name)) {
return name;
}
if (name.matches(".*\\(\\d*\\)")) { //$NON-NLS-1$
int start = name.lastIndexOf('(');
int end = name.lastIndexOf(')');
String stringInt = name.substring(start + 1, end);
int numericValue = Integer.parseInt(stringInt);
String newName = name.substring(0, start + 1) + (numericValue + 1)
+ ")"; //$NON-NLS-1$
return generateName(newName);
} else {
return generateName(name + " (1)"); //$NON-NLS-1$
}
}
abstract protected String getCurrentNature();
protected abstract AddScriptInterpreterDialog createInterpreterDialog(
IInterpreterInstall standin);
protected void copyInterpreter() {
IStructuredSelection selection = (IStructuredSelection) fInterpreterList
.getSelection();
Iterator it = selection.iterator();
ArrayList newEntries = new ArrayList();
while (it.hasNext()) {
IInterpreterInstall selectedInterpreter = (IInterpreterInstall) it
.next();
// duplicate & add Interpreter
InterpreterStandin standin = new InterpreterStandin(
selectedInterpreter, createUniqueId(selectedInterpreter
.getInterpreterInstallType()));
standin.setName(generateName(selectedInterpreter.getName()));
AddScriptInterpreterDialog dialog = createInterpreterDialog(standin);
dialog.setTitle(InterpretersMessages.InstalledInterpretersBlock_18);
if (dialog.open() != Window.OK) {
return;
}
newEntries.add(standin);
fInterpreters.add(standin);
}
fInterpreterList.refresh();
fInterpreterList.setSelection(new StructuredSelection(newEntries
.toArray()));
}
/**
* Bring up a dialog that lets the user create a new Interpreter definition.
*/
protected void addInterpreter() {
AddScriptInterpreterDialog dialog = createInterpreterDialog(null);
dialog.setTitle(InterpretersMessages.InstalledInterpretersBlock_7);
if (dialog.open() != Window.OK) {
return;
}
fInterpreterList.refresh();
}
protected void editInterpreter() {
IStructuredSelection selection = (IStructuredSelection) fInterpreterList
.getSelection();
IInterpreterInstall install = (IInterpreterInstall) selection
.getFirstElement();
if (install == null) {
return;
}
AddScriptInterpreterDialog dialog = createInterpreterDialog(install);
dialog.setTitle(InterpretersMessages.InstalledInterpretersBlock_8);
if (dialog.open() != Window.OK) {
return;
}
fInterpreterList.refresh(install);
}
}