/*******************************************************************************
* Copyright (c) 2012 Sierra Wireless 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
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.local.tab;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.internal.debug.ui.interpreters.AbstractInterpreterComboBlock;
import org.eclipse.dltk.internal.debug.ui.interpreters.IInterpreterComboBlockContext;
import org.eclipse.dltk.internal.debug.ui.interpreters.InterpreterDescriptor;
import org.eclipse.dltk.internal.launching.DLTKLaunchingPlugin;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.ScriptLaunchConfigurationConstants;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.koneki.ldt.debug.ui.internal.Activator;
import org.eclipse.koneki.ldt.ui.SWTUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
/**
* @deprecated not used since lua interpreters is configurable in main
* Tab.(org.eclipse.koneki.ldt.debug.ui.internal.launchconfiguration.local.LuaMainLaunchConfigurationTab).
*/
public class LuaInterpreterTabComboBlock extends AbstractInterpreterComboBlock {
private static final Status OK = new Status(Status.OK, Activator.PLUGIN_ID, "It is all good."); //$NON-NLS-1$
private Composite control;
private Button defaultButton;
private Label defaultInterpreter;
private List<IInterpreterInstall> interpreters = new ArrayList<IInterpreterInstall>();
private Button alternateButton;
private Combo interpretersCombo;
private InterpreterDescriptor defaultInterpreterDescriptor;
private IStatus status;
private ListenerList listeners = new ListenerList();
private boolean isControlCreated = false;
private IInterpreterInstall interpreterInstall;
public LuaInterpreterTabComboBlock(final IInterpreterComboBlockContext context) {
super(context);
}
@Override
public void createControl(final Composite parent) {
final int columns = 3;
final Font parentFont = parent.getFont();
control = new Composite(parent, SWT.NONE);
control.setFont(parentFont);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).applyTo(control);
GridLayoutFactory.swtDefaults().numColumns(columns).applyTo(control);
// Group container
final Group group = new Group(control, SWT.NONE);
group.setFont(parentFont);
group.setText(Messages.LuaInterpreterTabComboBlockRuntimeInterpreterLabel);
GridLayoutFactory.swtDefaults().numColumns(columns).applyTo(group);
GridDataFactory.swtDefaults().span(columns, 1).grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(group);
// Default interpreter
defaultButton = new Button(group, SWT.RADIO);
defaultButton.setFont(parentFont);
defaultButton.setText(Messages.LuaInterpreterTabComboBlockDefaultInterpreterLabel);
defaultInterpreter = new Label(group, SWT.RADIO);
defaultButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
widgetDefaultSelected(e);
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
setUseDefaultInterpreter();
}
});
GridDataFactory.swtDefaults().span(columns - 1, 1).grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(defaultInterpreter);
// Alternate interpreters
alternateButton = new Button(group, SWT.RADIO);
alternateButton.setFont(parentFont);
alternateButton.setText(Messages.LuaInterpreterTabComboBlockAlternateInterpreterLabel);
alternateButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
widgetDefaultSelected(e);
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
setUseAlternateInterpreter();
}
});
interpretersCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
interpretersCombo.setFont(parentFont);
GridDataFactory.swtDefaults().grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(interpretersCombo);
interpretersCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
widgetDefaultSelected(e);
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
setInterpreterInstall(interpreters.get(interpretersCombo.getSelectionIndex()));
refreshInterpreters();
firePropertyChange();
}
});
// Manage interpreters
final Button manageButton = new Button(group, SWT.None);
manageButton.setFont(parentFont);
manageButton.setText(Messages.LuaInterpreterTabComboBlockManageInterpretersButton);
manageButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
widgetDefaultSelected(e);
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
showInterpreterPreferencePage();
refreshInterpreters();
}
});
GridDataFactory.swtDefaults().hint(SWTUtil.getButtonWidthHint(manageButton), -1).applyTo(manageButton);
isControlCreated = true;
}
/**
* @return true is UI elements are created
*/
private boolean isControlCreated() {
return isControlCreated;
}
@Override
public Control getControl() {
return control;
}
@Override
public void setUseDefaultInterpreter() {
if (isControlCreated()) {
defaultInterpreter.setEnabled(true);
defaultButton.setSelection(true);
alternateButton.setSelection(false);
interpretersCombo.setEnabled(false);
firePropertyChange();
}
}
private void setUseAlternateInterpreter() {
if (isControlCreated()) {
defaultButton.setSelection(false);
defaultInterpreter.setEnabled(false);
alternateButton.setSelection(true);
interpretersCombo.setEnabled(true);
firePropertyChange();
}
}
@Override
public IInterpreterInstall getInterpreter() {
if (isDefaultInterpreter() && getDefaultInterpreterDescriptor() != null) {
return getDefaultInterpreterDescriptor().getInterpreter();
}
return interpreterInstall;
}
@Override
protected void setInterpreters(final List<IInterpreterInstall> interpreterList) {
interpreters.clear();
interpreters.addAll(interpreterList);
// Sort by name
Collections.sort(interpreters, new Comparator<IInterpreterInstall>() {
public int compare(IInterpreterInstall o1, IInterpreterInstall o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
// Fill combo list
if (isControlCreated()) {
interpretersCombo.removeAll();
for (final IInterpreterInstall install : interpreters) {
interpretersCombo.add(install.getName());
}
// If there is not already an alternate one selected, Select an interpreter
if (interpretersCombo.getSelectionIndex() == -1 && interpreters.size() > 0) {
// Select previous interpreter if still available
final IInterpreterInstall interpreter = getInterpreter();
if (interpreter != null) {
final int indexOfInterpreter = interpretersCombo.indexOf(interpreter.getName());
interpretersCombo.select(indexOfInterpreter);
} else {
interpretersCombo.select(0);
}
}
}
firePropertyChange();
}
@Override
public void refreshInterpreters() {
// Update interpreters list
fillWithWorkspaceInterpreters();
if (isControlCreated()) {
// Update default interpreter
IInterpreterInstall defaultInterpreterInstall = null;
if (getDefaultInterpreterDescriptor() != null) {
defaultInterpreterInstall = getDefaultInterpreterDescriptor().getInterpreter();
if (defaultInterpreterInstall != null) {
defaultInterpreter.setText(defaultInterpreterInstall.getName());
setStatus(OK);
}
}
// Notice that there is no default interpreter
if (defaultInterpreterInstall == null) {
defaultInterpreter.setText("(undefined)"); //$NON-NLS-1$
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.LuaInterpreterTabComboBlockNoDefaultInterpreter));
}
// Mention that there is no interpreters in list
if (interpretersCombo.getItemCount() < 1) {
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.LuaInterpreterTabComboBlockNoInterpreter));
} else if (isDefaultInterpreter() && interpretersCombo.getSelectionIndex() == -1) {
// Ask user to select its alternative interpreter
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.LuaInterpreterTabComboBlockSelectAnInterpreter));
}
}
// In all cases, check given interpreter
setPath(getInterpreterPath());
firePropertyChange();
}
@Override
public IStatus getStatus() {
return status;
}
private void setStatus(IStatus istatus) {
status = istatus;
}
@Override
public IPath getInterpreterPath() {
if (!isDefaultInterpreter()) {
final IInterpreterInstall interpreter = getInterpreter();
if (interpreter != null) {
return ScriptRuntime.newInterpreterContainerPath(interpreter);
}
return null;
}
return ScriptRuntime.newDefaultInterpreterContainerPath();
}
@Override
public void setDefaultInterpreterDescriptor(final InterpreterDescriptor descriptor) {
defaultInterpreterDescriptor = descriptor;
}
protected InterpreterDescriptor getDefaultInterpreterDescriptor() {
return defaultInterpreterDescriptor;
}
@Override
public boolean isDefaultInterpreter() {
return defaultButton != null && defaultButton.getSelection();
}
@Override
public void refresh() {
setDefaultInterpreterDescriptor(getDefaultInterpreterDescriptor());
}
@Override
public void addPropertyChangeListener(final IPropertyChangeListener listener) {
listeners.add(listener);
}
@Override
public void removePropertyChangeListener(final IPropertyChangeListener listener) {
listeners.remove(listener);
}
private void firePropertyChange() {
final PropertyChangeEvent event = new PropertyChangeEvent(this, PROPERTY_INTERPRETER, null, getInterpreterPath());
for (final Object listener : listeners.getListeners()) {
final IPropertyChangeListener propertyChangeListenerlistener = (IPropertyChangeListener) listener;
propertyChangeListenerlistener.propertyChange(event);
}
}
@Override
public void setPath(final IPath containerPath) {
// Say yes, at first ...
setStatus(OK);
/*
* Check for surprises
*/
// No interpreters
if (interpreters.isEmpty()) {
setStatus(new Status(IStatus.ERROR, DLTKLaunchingPlugin.getUniqueIdentifier(),
ScriptLaunchConfigurationConstants.ERR_NO_DEFAULT_INTERPRETER_INSTALL, Messages.LuaInterpreterTabComboBlockNoInterpreter, null));
}
// If it is path of default interpreter select it
if (ScriptRuntime.newDefaultInterpreterContainerPath().equals(containerPath)) {
setUseDefaultInterpreter();
} else if (containerPath != null) {
/*
* Check given interpreter path
*/
final IEnvironment environment = getContext().getEnvironment();
IInterpreterInstall install = null;
if (environment != null) {
final String natureId = getContext().getNatureId();
final String environmentId = environment.getId();
install = ScriptRuntime.getInterpreterInstall(natureId, environmentId, containerPath);
}
// Is interpreter installed?
if (install != null) {
setInterpreterInstall(install);
selectAlternateInterpreter(install);
} else {
setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.LuaInterpreterTabComboBlockNoInterpreter));
}
}
}
private void setInterpreterInstall(final IInterpreterInstall install) {
interpreterInstall = install;
}
private void selectAlternateInterpreter(final IInterpreterInstall iInstall) {
final int index = interpretersCombo.indexOf(iInstall.getName());
if (index >= 0) {
interpretersCombo.select(index);
}
setUseAlternateInterpreter();
}
}