/* * $Id$ * * SARL is an general-purpose agent programming language. * More details on http://www.sarl.io * * Copyright (C) 2014-2017 the original authors or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.sarl.eclipse.preferences; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.common.base.Strings; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.jdt.internal.debug.ui.jres.JREMessages; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.launching.PropertyChangeEvent; import org.eclipse.jdt.ui.ISharedImages; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.BaseLabelProvider; 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.ITableColorProvider; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; 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.Color; 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.Display; 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.osgi.framework.Bundle; import org.osgi.framework.Version; import io.sarl.eclipse.runtime.ISREInstall; import io.sarl.eclipse.runtime.ISREInstallChangedListener; import io.sarl.eclipse.runtime.SARLRuntime; import io.sarl.eclipse.util.Utilities; import io.sarl.eclipse.wizards.sreinstall.AddSREInstallWizard; import io.sarl.eclipse.wizards.sreinstall.EditSREInstallWizard; /** Preference page for the SARL runtime environments. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ @SuppressWarnings({"checkstyle:classfanoutcomplexity", "checkstyle:classdataabstractioncoupling", "checkstyle:methodcount"}) public class SREsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ISelectionProvider { /** * ID for the page. */ public static final String ID = "io.sarl.eclipse.preferences.SREsPreferencePage"; //$NON-NLS-1$ private static final int WRAP_WIDTH = 300; private static final int WIDTH_HINT = 350; private static final int HEIGHT_HINT = 250; private static final int DEFAULT_WIDTH = 117; private Table sreTable; private CheckboxTableViewer sresList; private final InstallListener installListener = new InstallListener(); /** * SREs being displayed. */ private final List<ISREInstall> sreArray = new ArrayList<>(); /** * Selection listeners (default SRE changes). */ private final ListenerList<ISelectionChangedListener> selectionListeners = new ListenerList<>(); /** * Previous selection. */ private ISelection prevSelection = new StructuredSelection(); // Action buttons private Button addButton; private Button removeButton; private Button editButton; private Button copyButton; private Button resetButton; private Column sortColumn = Column.NAME; /** * Constructor. */ public SREsPreferencePage() { // } /** Refresh the UI list of SRE. * */ protected void refreshSREListUI() { // Refreshes the SRE listing after a SRE install notification, might not // happen on the UI thread. final Display display = Display.getDefault(); if (display.getThread().equals(Thread.currentThread())) { if (!this.sresList.isBusy()) { this.sresList.refresh(); } } else { display.syncExec(new Runnable() { @SuppressWarnings("synthetic-access") @Override public void run() { if (!SREsPreferencePage.this.sresList.isBusy()) { SREsPreferencePage.this.sresList.refresh(); } } }); } } /** Set the error message from the given exception. * * @param exception - the exception to log. */ public void setErrorMessage(Throwable exception) { if (exception != null) { String message = exception.getLocalizedMessage(); if (Strings.isNullOrEmpty(message)) { message = exception.getMessage(); } if (Strings.isNullOrEmpty(message)) { message = MessageFormat.format(Messages.SREsPreferencePage_9, exception.getClass().getName()); } setErrorMessage(message); } } @Override public void init(IWorkbench workbench) { // } @Override protected Control createContents(Composite parent) { initializeDialogUnits(parent); noDefaultAndApplyButton(); final GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.marginHeight = 2; layout.marginWidth = 2; parent.setLayout(layout); SWTFactory.createWrapLabel(parent, Messages.SREsPreferencePage_0, 1, WRAP_WIDTH); SWTFactory.createVerticalSpacer(parent, 1); SWTFactory.createWrapLabel(parent, Messages.SREsPreferencePage_1, 1, WRAP_WIDTH); final Font font = parent.getFont(); final Composite listComposite = SWTFactory.createComposite(parent, font, 2, 1, GridData.FILL_BOTH); this.sreTable = new Table(listComposite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION); final GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = HEIGHT_HINT; gd.widthHint = WIDTH_HINT; this.sreTable.setLayoutData(gd); this.sreTable.setFont(font); this.sreTable.setHeaderVisible(true); this.sreTable.setLinesVisible(true); TableColumn column = new TableColumn(this.sreTable, SWT.NULL); column.setText(Messages.SREsPreferencePage_2); column.addSelectionListener(new SelectionAdapter() { @SuppressWarnings("synthetic-access") @Override public void widgetSelected(SelectionEvent event) { sortByName(); SREsPreferencePage.this.sresList.refresh(true); } }); column.setWidth(DEFAULT_WIDTH); column = new TableColumn(this.sreTable, SWT.NULL); column.setText(Messages.SREsPreferencePage_3); column.addSelectionListener(new SelectionAdapter() { @SuppressWarnings("synthetic-access") @Override public void widgetSelected(SelectionEvent event) { sortByLocation(); SREsPreferencePage.this.sresList.refresh(true); } }); column.setWidth(DEFAULT_WIDTH); this.sresList = new CheckboxTableViewer(this.sreTable); this.sresList.setLabelProvider(new SRELabelProvider()); this.sresList.setContentProvider(new SREsContentProvider()); this.sresList.setUseHashlookup(true); this.sresList.addSelectionChangedListener(new ISelectionChangedListener() { @SuppressWarnings("synthetic-access") @Override public void selectionChanged(SelectionChangedEvent evt) { enableButtons(); } }); this.sresList.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { if (event.getChecked()) { setDefaultSRE((ISREInstall) event.getElement()); } else { setDefaultSRE(null); } } }); this.sresList.addDoubleClickListener(new IDoubleClickListener() { @SuppressWarnings("synthetic-access") @Override public void doubleClick(DoubleClickEvent event) { if (!SREsPreferencePage.this.sresList.getSelection().isEmpty()) { editSRE(); } } }); this.sreTable.addKeyListener(new KeyAdapter() { @SuppressWarnings("synthetic-access") @Override public void keyPressed(KeyEvent event) { if (event.character == SWT.DEL && event.stateMask == 0) { if (SREsPreferencePage.this.removeButton.isEnabled()) { removeSREs(); } } } }); final Composite buttons = SWTFactory.createComposite(listComposite, font, 1, 1, GridData.VERTICAL_ALIGN_BEGINNING, 0, 0); this.addButton = SWTFactory.createPushButton(buttons, Messages.SREsPreferencePage_4, null); this.addButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event evt) { addSRE(); } }); this.editButton = SWTFactory.createPushButton(buttons, Messages.SREsPreferencePage_5, null); this.editButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event evt) { editSRE(); } }); this.copyButton = SWTFactory.createPushButton(buttons, Messages.SREsPreferencePage_6, null); this.copyButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event evt) { copySRE(); } }); this.removeButton = SWTFactory.createPushButton(buttons, Messages.SREsPreferencePage_7, null); this.removeButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event evt) { removeSREs(); } }); this.resetButton = SWTFactory.createPushButton(buttons, Messages.SREsPreferencePage_10, null); this.resetButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event evt) { resetSREs(); } }); SWTFactory.createVerticalSpacer(listComposite, 1); // Populates the SRE table with existing SREs defined in the workspace. final ISREInstall[] sres = SARLRuntime.getSREInstalls(); for (final ISREInstall sre : sres) { sre.revalidate(); } setSREs(sres); setDefaultSRE(SARLRuntime.getDefaultSREInstall()); // by default, sort by name restoreColumnSettings(JavaPlugin.getDefault().getDialogSettings()); enableButtons(); SARLRuntime.addSREInstallChangedListener(this.installListener); applyDialogFont(parent); return parent; } /** * Sets the SREs to be displayed in this block. * * @param sres - SREs to be displayed */ protected void setSREs(ISREInstall[] sres) { this.sreArray.clear(); for (final ISREInstall sre : sres) { this.sreArray.add(sre); } this.sresList.setInput(this.sreArray); refreshSREListUI(); updateUI(); } /** * Returns the SREs currently being displayed in this block. * * @return the SREs currently being displayed in this block */ public ISREInstall[] getSREs() { return this.sreArray.toArray(new ISREInstall[this.sreArray.size()]); } private boolean isDuplicateName(String name) { final String sreName = Strings.nullToEmpty(name); for (final ISREInstall sre : this.sreArray) { if (sreName.equals(sre.getName())) { return true; } } return false; } private boolean isDuplicateId(String id) { final String normalizedId = Strings.nullToEmpty(id); for (final ISREInstall sre : this.sreArray) { if (normalizedId.equals(sre.getId())) { return true; } } return false; } private String createUniqueIdentifier() { String id = SARLRuntime.createUniqueIdentifier(); while (isDuplicateId(id)) { id = SARLRuntime.createUniqueIdentifier(); } 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. */ public String createUniqueName(String name) { if (!isDuplicateName(name)) { return name; } if (name.matches(".*\\(\\d*\\)")) { //$NON-NLS-1$ final int start = name.lastIndexOf('('); final int end = name.lastIndexOf(')'); final String stringInt = name.substring(start + 1, end); final int numericValue = Integer.parseInt(stringInt); final String newName = name.substring(0, start + 1) + (numericValue + 1) + ")"; //$NON-NLS-1$ return createUniqueName(newName); } return createUniqueName(name + " (1)"); //$NON-NLS-1$ } /** Add a SRE. */ protected void addSRE() { final AddSREInstallWizard wizard = new AddSREInstallWizard( createUniqueIdentifier(), this.sreArray.toArray(new ISREInstall[this.sreArray.size()])); final WizardDialog dialog = new WizardDialog(getShell(), wizard); if (dialog.open() == Window.OK) { final ISREInstall result = wizard.getCreatedSRE(); if (result != null) { this.sreArray.add(result); //refresh from model refreshSREListUI(); this.sresList.setSelection(new StructuredSelection(result)); //ensure labels are updated if (!this.sresList.isBusy()) { this.sresList.refresh(true); } updateUI(); // Autoselect the default SRE if (getDefaultSRE() == null) { setDefaultSRE(result); } } } } /** Edit the selected SRE. */ protected void editSRE() { final IStructuredSelection selection = (IStructuredSelection) this.sresList.getSelection(); final ISREInstall sre = (ISREInstall) selection.getFirstElement(); if (sre == null) { return; } final EditSREInstallWizard wizard = new EditSREInstallWizard( sre, this.sreArray.toArray(new ISREInstall[this.sreArray.size()])); final WizardDialog dialog = new WizardDialog(getShell(), wizard); if (dialog.open() == Window.OK) { this.sresList.setSelection(new StructuredSelection(sre)); this.sresList.refresh(true); updateUI(); } } /** Copy the selected SRE. */ @SuppressWarnings("unchecked") protected void copySRE() { final IStructuredSelection selection = (IStructuredSelection) this.sresList.getSelection(); final Iterator<ISREInstall> it = selection.iterator(); final List<ISREInstall> newEntries = new ArrayList<>(); while (it.hasNext()) { final ISREInstall selectedSRE = it.next(); final ISREInstall copy = selectedSRE.copy(createUniqueIdentifier()); copy.setName(createUniqueName(selectedSRE.getName())); final EditSREInstallWizard wizard = new EditSREInstallWizard( copy, this.sreArray.toArray(new ISREInstall[this.sreArray.size()])); final WizardDialog dialog = new WizardDialog(getShell(), wizard); final int dlgResult = dialog.open(); if (dlgResult == Window.OK) { newEntries.add(copy); } else { assert dlgResult == Window.CANCEL; // Canceling one wizard should cancel all subsequent wizards break; } } if (!newEntries.isEmpty()) { this.sreArray.addAll(newEntries); refreshSREListUI(); this.sresList.setSelection(new StructuredSelection(newEntries.toArray())); } else { this.sresList.setSelection(selection); } this.sresList.refresh(true); updateUI(); } /** Remove the selected SREs. */ @SuppressWarnings("unchecked") protected void removeSREs() { final IStructuredSelection selection = (IStructuredSelection) this.sresList.getSelection(); final ISREInstall[] vms = new ISREInstall[selection.size()]; final Iterator<ISREInstall> iter = selection.iterator(); int i = 0; while (iter.hasNext()) { vms[i] = iter.next(); i++; } removeSREs(vms); } /** * Removes the given SREs from the table. * * @param sres - the SREs to remove. */ @SuppressWarnings("checkstyle:npathcomplexity") public void removeSREs(ISREInstall... sres) { final ISREInstall defaultSRE = getDefaultSRE(); final String defaultId = defaultSRE == null ? null : defaultSRE.getId(); int defaultIndex = -1; if (defaultId != null) { for (int i = 0; defaultIndex == -1 && i < this.sreTable.getItemCount(); ++i) { if (defaultId.equals( ((ISREInstall) this.sreTable.getItem(i).getData()).getId())) { defaultIndex = i; } } } final String normedDefaultId = Strings.nullToEmpty(defaultId); boolean defaultIsRemoved = false; for (final ISREInstall sre : sres) { if (this.sreArray.remove(sre) && sre.getId().equals(normedDefaultId)) { defaultIsRemoved = true; } } refreshSREListUI(); // Update the default SRE if (defaultIsRemoved) { if (this.sreTable.getItemCount() == 0) { setSelection(null); } else { if (defaultIndex < 0) { defaultIndex = 0; } else if (defaultIndex >= this.sreTable.getItemCount()) { defaultIndex = this.sreTable.getItemCount() - 1; } setSelection(new StructuredSelection( this.sreTable.getItem(defaultIndex).getData())); } } this.sresList.refresh(true); if (defaultIsRemoved) { fireDefaultSREChanged(); } updateUI(); } /** Reset the list of the SREs to the platform elements. */ protected void resetSREs() { try { SARLRuntime.reset(); } catch (CoreException e) { setErrorMessage(e); } } private boolean verifyValidity(ISREInstall sre, boolean errorMessages) { if (!sre.getValidity().isOK()) { if (errorMessages) { setErrorMessage(MessageFormat.format( io.sarl.eclipse.launching.dialog.Messages.RuntimeEnvironmentTab_5, sre.getName())); } return false; } // Check the SARL version. final Bundle bundle = Platform.getBundle("io.sarl.lang"); //$NON-NLS-1$ if (bundle != null) { final Version sarlVersion = bundle.getVersion(); final Version minVersion = Utilities.parseVersion(sre.getMinimalSARLVersion()); final Version maxVersion = Utilities.parseVersion(sre.getMaximalSARLVersion()); final int cmp = Utilities.compareVersionToRange(sarlVersion, minVersion, maxVersion); if (cmp < 0) { if (errorMessages) { setErrorMessage(MessageFormat.format( io.sarl.eclipse.runtime.Messages.AbstractSREInstall_0, sarlVersion.toString(), minVersion.toString())); } return false; } else if (cmp > 0) { if (errorMessages) { setErrorMessage(MessageFormat.format( io.sarl.eclipse.runtime.Messages.AbstractSREInstall_1, sarlVersion.toString(), maxVersion.toString())); } return false; } } return true; } @Override public boolean isValid() { setMessage(null); setErrorMessage((String) null); if (this.sreArray.isEmpty()) { setMessage(io.sarl.eclipse.launching.dialog.Messages.RuntimeEnvironmentTab_7); } else { final ISREInstall defaultSRE = getDefaultSRE(); if (defaultSRE == null) { setErrorMessage(Messages.SREsPreferencePage_8); return false; } if (!verifyValidity(defaultSRE, true)) { return false; } } return super.isValid(); } @Override protected void performDefaults() { super.performDefaults(); } @Override public boolean performOk() { final boolean[] canceled = new boolean[] {false}; BusyIndicator.showWhile(null, new Runnable() { @Override public void run() { final ISREInstall defaultSRE = getDefaultSRE(); final ISREInstall[] sres = getSREs(); final NullProgressMonitor monitor = new NullProgressMonitor(); try { SARLRuntime.setSREInstalls(sres, monitor); SARLRuntime.setDefaultSREInstall(defaultSRE, monitor, false); SARLRuntime.saveSREConfiguration(monitor); canceled[0] = monitor.isCanceled(); } catch (CoreException e) { setErrorMessage(e); canceled[0] = true; } } }); if (canceled[0]) { return false; } // save column widths final IDialogSettings settings = JavaPlugin.getDefault().getDialogSettings(); final int columnCount = this.sreTable.getColumnCount(); for (int i = 0; i < columnCount; i++) { settings.put(ID + ".columnWidth" + i, //$NON-NLS-1$ this.sreTable.getColumn(i).getWidth()); } settings.put(ID + ".sortColumn", this.sortColumn.name()); //$NON-NLS-1$ return super.performOk(); } /** * Restores the column widths from dialog settings. * * @param settings - the settings to read. */ private void restoreColumnWidths(IDialogSettings settings) { final int columnCount = this.sreTable.getColumnCount(); for (int i = 0; i < columnCount; i++) { int width = -1; try { width = settings.getInt(ID + ".columnWidth" + i); //$NON-NLS-1$ } catch (NumberFormatException exception) { // } if ((width <= 0) || (i == this.sreTable.getColumnCount() - 1)) { this.sreTable.getColumn(i).pack(); } else { this.sreTable.getColumn(i).setWidth(width); } } } /** * Restore table settings from the given dialog store using the * given key. * * @param settings - dialog settings store */ private void restoreColumnSettings(IDialogSettings settings) { this.sresList.getTable().layout(true); restoreColumnWidths(settings); this.sortColumn = Column.NAME; try { final String columnName = settings.get(ID + ".sortColumn"); //$NON-NLS-1$ if (!Strings.isNullOrEmpty(columnName)) { this.sortColumn = Column.valueOf(columnName); if (this.sortColumn == null) { this.sortColumn = Column.NAME; } } } catch (Throwable exception) { // } switch (this.sortColumn) { case NAME: sortByName(); break; case LOCATION: sortByLocation(); break; default: } } @Override public void dispose() { SARLRuntime.removeSREInstallChangedListener(this.installListener); super.dispose(); } /** * Sets the default SRE, possible <code>null</code>. * * @param sre - the SRE or <code>null</code> */ public void setDefaultSRE(ISREInstall sre) { if (sre == null) { setSelection(new StructuredSelection()); } else { setSelection(new StructuredSelection(sre)); } } private void updateUI() { if (getContainer() != null) { getContainer().updateButtons(); } updateApplyButton(); } @Override public void setSelection(ISelection selection) { if (selection instanceof IStructuredSelection && !selection.equals(this.prevSelection)) { this.prevSelection = selection; final Object sre = ((IStructuredSelection) selection).getFirstElement(); if (sre == null) { this.sresList.setCheckedElements(new Object[0]); updateUI(); } else { this.sresList.setCheckedElements(new Object[]{sre}); this.sresList.reveal(sre); updateUI(); } this.sresList.refresh(true); fireDefaultSREChanged(); updateUI(); } } @Override public ISelection getSelection() { return new StructuredSelection(this.sresList.getCheckedElements()); } private void fireDefaultSREChanged() { final SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection()); final Object[] listeners = this.selectionListeners.getListeners(); for (int i = 0; i < listeners.length; i++) { final ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i]; listener.selectionChanged(event); } } @Override public void addSelectionChangedListener(ISelectionChangedListener listener) { this.selectionListeners.add(listener); } @Override public void removeSelectionChangedListener(ISelectionChangedListener listener) { this.selectionListeners.remove(listener); } /** * Returns the default SRE or <code>null</code> if none. * * @return the default SRE or <code>null</code> if none */ public ISREInstall getDefaultSRE() { final Object[] objects = this.sresList.getCheckedElements(); if (objects.length == 0) { return null; } return (ISREInstall) objects[0]; } /** * Enables the buttons based on selected items counts in the viewer. */ @SuppressWarnings("unchecked") private void enableButtons() { final IStructuredSelection selection = (IStructuredSelection) this.sresList.getSelection(); final int selectionCount = selection.size(); this.editButton.setEnabled(selectionCount == 1); this.copyButton.setEnabled(selectionCount > 0); if (selectionCount > 0 && selectionCount <= this.sresList.getTable().getItemCount()) { final Iterator<ISREInstall> iterator = selection.iterator(); while (iterator.hasNext()) { final ISREInstall install = iterator.next(); if (SARLRuntime.isPlatformSRE(install)) { this.removeButton.setEnabled(false); return; } } this.removeButton.setEnabled(true); } else { this.removeButton.setEnabled(false); } } /** * Sorts by SRE name. */ private void sortByName() { this.sresList.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object e1, Object e2) { if ((e1 instanceof ISREInstall) && (e2 instanceof ISREInstall)) { final ISREInstall left = (ISREInstall) e1; final ISREInstall right = (ISREInstall) e2; return left.getName().compareToIgnoreCase(right.getName()); } return super.compare(viewer, e1, e2); } @Override public boolean isSorterProperty(Object element, String property) { return true; } }); this.sortColumn = Column.NAME; } /** * Sorts by VM location. */ private void sortByLocation() { this.sresList.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object e1, Object e2) { if ((e1 instanceof ISREInstall) && (e2 instanceof ISREInstall)) { final ISREInstall left = (ISREInstall) e1; final ISREInstall right = (ISREInstall) e2; return left.getLocation().compareToIgnoreCase(right.getLocation()); } return super.compare(viewer, e1, e2); } @Override public boolean isSorterProperty(Object element, String property) { return true; } }); this.sortColumn = Column.LOCATION; } /** * Label provider for installed SREs table. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ private class SRELabelProvider extends BaseLabelProvider implements ITableLabelProvider, ITableColorProvider, ITableFontProvider { /** Construct the provider of labels. */ SRELabelProvider() { // } @Override public Font getFont(Object element, int columnIndex) { return null; } @SuppressWarnings("synthetic-access") private boolean isValid(Object element) { if (element instanceof ISREInstall) { final ISREInstall sre = (ISREInstall) element; return verifyValidity(sre, false); } return true; } @Override public Color getForeground(Object element, int columnIndex) { if (isValid(element)) { return getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND); } return getControl().getDisplay().getSystemColor(SWT.COLOR_RED); } @Override public Color getBackground(Object element, int columnIndex) { return getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); } @Override public Image getColumnImage(Object element, int columnIndex) { if (columnIndex == 0) { return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY); } return null; } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof ISREInstall) { final ISREInstall sre = (ISREInstall) element; switch (columnIndex) { case 0: if (getDefaultSRE() == element) { return MessageFormat.format( JREMessages.InstalledJREsBlock_7, sre.getName()); } return sre.getName(); case 1: return sre.getLocation(); default: } } return element == null ? "" : element.toString(); //$NON-NLS-1$ } } /** * Content provider to show a list of JREs. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ private class SREsContentProvider implements IStructuredContentProvider { /** Construct a provider of JREs' list. */ SREsContentProvider() { // } @SuppressWarnings("synthetic-access") @Override public Object[] getElements(Object input) { return SREsPreferencePage.this.sreArray.toArray(); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // } @Override public void dispose() { // } } // class SREsContentProvider /** Listener of changes in the components that display the installed SREs. * * <p>This listener refresh the preference page according to the change in the table. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ private class InstallListener implements ISREInstallChangedListener { /** Construct the listener. */ InstallListener() { // } @SuppressWarnings("synthetic-access") @Override public void sreAdded(ISREInstall sre) { if (!SREsPreferencePage.this.sreArray.contains(sre)) { SREsPreferencePage.this.sreArray.add(sre); refreshSREListUI(); } } @SuppressWarnings("synthetic-access") @Override public void sreRemoved(ISREInstall sre) { if (SREsPreferencePage.this.sreArray.contains(sre)) { SREsPreferencePage.this.sreArray.remove(sre); refreshSREListUI(); } } @SuppressWarnings("synthetic-access") @Override public void sreChanged(PropertyChangeEvent event) { if (ISREInstallChangedListener.PROPERTY_NAME.equals(event.getProperty())) { final ISREInstall sre = (ISREInstall) event.getSource(); if (SREsPreferencePage.this.sreArray.contains(sre)) { refreshSREListUI(); } } } @Override public void defaultSREInstallChanged(ISREInstall previous, ISREInstall current) { setDefaultSRE(current); } } /** Definition of the columns in the table of the installed SREs. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ private enum Column { /** Name column. */ NAME, /** Location column. */ LOCATION; } }