| /******************************************************************************* |
| * 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 org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.dltk.core.DLTKCore; |
| import org.eclipse.dltk.core.IScriptModel; |
| import org.eclipse.dltk.core.environment.EnvironmentManager; |
| import org.eclipse.dltk.core.environment.IEnvironment; |
| import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin; |
| import org.eclipse.dltk.debug.ui.IDLTKDebugUIConstants; |
| import org.eclipse.dltk.debug.ui.interpreters.InterpretersUpdater; |
| import org.eclipse.dltk.internal.debug.ui.IScriptDebugHelpContextIds; |
| import org.eclipse.dltk.launching.IInterpreterInstall; |
| import org.eclipse.dltk.launching.ScriptRuntime; |
| import org.eclipse.dltk.launching.ScriptRuntime.DefaultInterpreterEntry; |
| import org.eclipse.jface.dialogs.ErrorDialog; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.preference.PreferencePage; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.swt.custom.BusyIndicator; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchPreferencePage; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * The Installed InterpreterEnvironments preference page. |
| */ |
| public abstract class ScriptInterpreterPreferencePage extends PreferencePage |
| implements IWorkbenchPreferencePage { |
| |
| // InterpreterEnvironment Block |
| private InterpretersBlock fInterpretersBlock; |
| |
| public ScriptInterpreterPreferencePage() { |
| super(); |
| |
| // only used when page is shown programatically |
| setTitle(InterpretersMessages.InterpretersPreferencePage_1); |
| |
| setDescription(InterpretersMessages.InterpretersPreferencePage_2); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) |
| */ |
| public void init(IWorkbench workbench) { |
| } |
| |
| public abstract InterpretersBlock createInterpretersBlock(); |
| |
| /** |
| * Find & verify the default interpreter. |
| */ |
| private void initDefaultInterpreter() { |
| IEnvironment[] environments = EnvironmentManager.getEnvironments(); |
| for (int j = 0; j < environments.length; j++) { |
| IInterpreterInstall realDefault = ScriptRuntime |
| .getDefaultInterpreterInstall(new DefaultInterpreterEntry( |
| fInterpretersBlock.getCurrentNature(), |
| environments[j].getId())); |
| |
| boolean verified = false; |
| if (realDefault != null) { |
| IInterpreterInstall[] Interpreters = fInterpretersBlock |
| .getInterpreters(); |
| for (int i = 0; i < Interpreters.length; i++) { |
| IInterpreterInstall fakeInterpreter = Interpreters[i]; |
| if (fakeInterpreter.equals(realDefault)) { |
| verified = true; |
| verifyDefaultInterpreter(fakeInterpreter); |
| break; |
| } |
| } |
| } |
| |
| if (!verified) { |
| if (fInterpretersBlock.getInterpreters().length > 0) |
| setErrorMessage(InterpretersMessages.InterpreterPreferencePage_pleaseSetDefaultInterpreter); |
| else |
| setErrorMessage(InterpretersMessages.InterpreterPreferencePage_addInterpreter); |
| } |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) |
| */ |
| protected Control createContents(Composite ancestor) { |
| initializeDialogUnits(ancestor); |
| |
| noDefaultAndApplyButton(); |
| |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 1; |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| ancestor.setLayout(layout); |
| |
| fInterpretersBlock = createInterpretersBlock(); |
| fInterpretersBlock.createControl(ancestor); |
| Control control = fInterpretersBlock.getControl(); |
| GridData data = new GridData(GridData.FILL_BOTH); |
| data.horizontalSpan = 1; |
| control.setLayoutData(data); |
| |
| fInterpretersBlock.restoreColumnSettings(DLTKDebugUIPlugin.getDefault() |
| .getDialogSettings(), |
| IScriptDebugHelpContextIds.INTERPRETER_PREFERENCE_PAGE); |
| |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(ancestor, |
| IScriptDebugHelpContextIds.INTERPRETER_PREFERENCE_PAGE); |
| initDefaultInterpreter(); |
| fInterpretersBlock |
| .addSelectionChangedListener(new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| IInterpreterInstall[] install = getCurrentDefaultInterpreters(); |
| |
| setErrorMessage(null); |
| if (fInterpretersBlock.getInterpreters().length > 0 |
| && install.length < fInterpretersBlock |
| .getEnvironmentsCount()) |
| setErrorMessage(InterpretersMessages.InterpreterPreferencePage_pleaseSetDefaultInterpreter); |
| else if( fInterpretersBlock.getInterpreters().length == 0) { |
| setErrorMessage(InterpretersMessages.InterpreterPreferencePage_addInterpreter); |
| } |
| } |
| }); |
| applyDialogFont(ancestor); |
| return ancestor; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.preference.IPreferencePage#performOk() |
| */ |
| public boolean performOk() { |
| final boolean[] canceled = new boolean[] { false }; |
| BusyIndicator.showWhile(null, new Runnable() { |
| public void run() { |
| IInterpreterInstall[] defaultInterpreter = getCurrentDefaultInterpreters(); |
| IInterpreterInstall[] interpreters = fInterpretersBlock |
| .getInterpreters(); |
| |
| InterpretersUpdater updater = new InterpretersUpdater(); |
| if (!updater.updateInterpreterSettings(fInterpretersBlock |
| .getCurrentNature(), interpreters, defaultInterpreter)) { |
| canceled[0] = true; |
| } |
| } |
| }); |
| |
| if (canceled[0]) { |
| return false; |
| } |
| |
| // save column widths |
| IDialogSettings settings = DLTKDebugUIPlugin.getDefault() |
| .getDialogSettings(); |
| fInterpretersBlock.saveColumnSettings(settings, |
| IScriptDebugHelpContextIds.INTERPRETER_PREFERENCE_PAGE); |
| |
| return super.performOk(); |
| } |
| |
| protected IScriptModel getScriptModel() { |
| return DLTKCore.create(ResourcesPlugin.getWorkspace().getRoot()); |
| } |
| |
| /** |
| * Verify that the specified Interpreter can be a valid default Interpreter. |
| * This amounts to verifying that all of the Interpreter's library locations |
| * exist on the file system. If this fails, remove the Interpreter from the |
| * table and try to set another default. |
| */ |
| private void verifyDefaultInterpreter(IInterpreterInstall interpreter) { |
| if (interpreter != null) { |
| boolean exist = true; |
| exist = interpreter.getInstallLocation().exists(); |
| |
| // If all library locations exist, check the corresponding entry in |
| // the list, |
| // otherwise remove the Interpreter |
| if (exist) { |
| fInterpretersBlock.setCheckedInterpreter(interpreter); |
| } else { |
| fInterpretersBlock |
| .removeInterpreters(new IInterpreterInstall[] { interpreter }); |
| IInterpreterInstall def = null; |
| def = ScriptRuntime |
| .getDefaultInterpreterInstall(new DefaultInterpreterEntry( |
| fInterpretersBlock.getCurrentNature(), |
| fInterpretersBlock.getCurrentEnvironment() |
| .getId())); |
| if (def == null) { |
| fInterpretersBlock.setCheckedInterpreter(null); |
| } else { |
| fInterpretersBlock.setCheckedInterpreter(def); |
| } |
| ErrorDialog |
| .openError( |
| getControl().getShell(), |
| InterpretersMessages.InterpretersPreferencePage_1, |
| InterpretersMessages.InterpretersPreferencePage_10, |
| new Status( |
| IStatus.ERROR, |
| DLTKDebugUIPlugin.PLUGIN_ID, |
| IDLTKDebugUIConstants.INTERNAL_ERROR, |
| InterpretersMessages.InterpretersPreferencePage_11, |
| null)); // |
| return; |
| } |
| } else { |
| fInterpretersBlock.setCheckedInterpreter(null); |
| } |
| } |
| |
| private IInterpreterInstall[] getCurrentDefaultInterpreters() { |
| return fInterpretersBlock.getCheckedInterpreters(); |
| } |
| |
| } |