| /******************************************************************************* |
| * Copyright (c) 2000, 2017 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.tcl.internal.debug.ui.interpreters; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.dltk.core.caching.IContentCache; |
| import org.eclipse.dltk.core.environment.IEnvironment; |
| import org.eclipse.dltk.core.environment.IFileHandle; |
| import org.eclipse.dltk.internal.core.ModelManager; |
| import org.eclipse.dltk.internal.debug.ui.interpreters.AbstractInterpreterEnvironmentVariablesBlock; |
| import org.eclipse.dltk.internal.debug.ui.interpreters.AbstractInterpreterLibraryBlock; |
| import org.eclipse.dltk.internal.debug.ui.interpreters.AddScriptInterpreterDialog; |
| import org.eclipse.dltk.internal.debug.ui.interpreters.ExpandableBlock; |
| import org.eclipse.dltk.internal.debug.ui.interpreters.IAddInterpreterDialogRequestor; |
| import org.eclipse.dltk.internal.debug.ui.interpreters.InterpretersMessages; |
| import org.eclipse.dltk.internal.ui.wizards.dialogfields.ComboDialogField; |
| import org.eclipse.dltk.internal.ui.wizards.dialogfields.StringButtonDialogField; |
| import org.eclipse.dltk.launching.EnvironmentVariable; |
| import org.eclipse.dltk.launching.IInterpreterInstall; |
| import org.eclipse.dltk.launching.IInterpreterInstallType; |
| import org.eclipse.dltk.launching.InterpreterStandin; |
| import org.eclipse.dltk.launching.LibraryLocation; |
| import org.eclipse.dltk.tcl.core.TclPackagesManager; |
| import org.eclipse.dltk.tcl.core.packages.TclPackagesPackage; |
| import org.eclipse.dltk.tcl.core.packages.VariableMap; |
| import org.eclipse.dltk.tcl.core.packages.VariableValue; |
| import org.eclipse.dltk.tcl.internal.launching.StatusWithPackages; |
| import org.eclipse.dltk.tcl.internal.ui.GlobalVariableBlock; |
| import org.eclipse.dltk.tcl.ui.manpages.Documentation; |
| import org.eclipse.dltk.tcl.ui.manpages.InterpreterDocumentation; |
| import org.eclipse.dltk.tcl.ui.manpages.ManPageLoader; |
| import org.eclipse.dltk.tcl.ui.manpages.ManpagesFactory; |
| import org.eclipse.dltk.tcl.ui.manpages.ManpagesPackage; |
| import org.eclipse.dltk.tcl.ui.manpages.dialogs.ManPagesConfigurationDialog; |
| import org.eclipse.dltk.utils.PlatformFileUtils; |
| import org.eclipse.emf.common.util.ECollections; |
| import org.eclipse.emf.common.util.EMap; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Shell; |
| |
| public class AddTclInterpreterDialog extends AddScriptInterpreterDialog { |
| public AddTclInterpreterDialog(IAddInterpreterDialogRequestor requestor, Shell shell, |
| IInterpreterInstallType[] interpreterInstallTypes, IInterpreterInstall editedInterpreter) { |
| super(requestor, shell, interpreterInstallTypes, editedInterpreter); |
| } |
| |
| @Override |
| protected AbstractInterpreterLibraryBlock createLibraryBlock(AddScriptInterpreterDialog dialog) { |
| return new TclInterpreterLibraryBlock(dialog); |
| } |
| |
| @Override |
| protected AbstractInterpreterEnvironmentVariablesBlock createEnvironmentVariablesBlock() { |
| return new TclInterpreterEnvironmentVariablesBlock(this); |
| } |
| |
| private GlobalVariableBlock globals; |
| private AvailablePackagesBlock packagesBlock; |
| private ExpandableBlock globalsExpandableNode; |
| private ExpandableBlock libraryExpandableNode; |
| private ExpandableBlock environmentExpandableNode; |
| |
| @Override |
| protected Composite createEnvironmentVariablesBlockParent(Composite parent, int numColumns) { |
| environmentExpandableNode = new ExpandableBlock(parent, 0); |
| environmentExpandableNode |
| .setText(InterpretersMessages.AddScriptInterpreterDialog_interpreterEnvironmentVariables); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = numColumns; |
| environmentExpandableNode.setLayoutData(gd); |
| environmentExpandableNode.setExpanded(true); |
| return environmentExpandableNode.getContent(); |
| } |
| |
| @Override |
| protected Composite createLibraryBlockParent(Composite parent, int numColumns) { |
| libraryExpandableNode = new ExpandableBlock(parent, 0); |
| libraryExpandableNode.setText("Custom library locations (addition to TCLLIBPATH):"); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = numColumns; |
| libraryExpandableNode.setLayoutData(gd); |
| return libraryExpandableNode.getContent(); |
| } |
| |
| private ComboDialogField documentationField; |
| private List<Documentation> documentations; |
| |
| private Documentation findById(String docId) { |
| if (docId != null) { |
| for (Documentation documentation : documentations) { |
| if (docId.equals(documentation.getId())) { |
| return documentation; |
| } |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| protected void createSimpleFields(Composite parent, int numColumns) { |
| super.createSimpleFields(parent, numColumns); |
| documentationField = new ComboDialogField(SWT.BORDER | SWT.READ_ONLY); |
| documentationField.setLabelText("Manual Pages"); |
| loadDocumentations(); |
| documentationField.doFillIntoGrid(parent, numColumns - 1); |
| final Button configureDocumentation = new Button(parent, SWT.PUSH); |
| configureDocumentation.setText("Configure..."); |
| configureDocumentation.setLayoutData(StringButtonDialogField.gridDataForButton(configureDocumentation, 1)); |
| configureDocumentation.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| configureDocumentation(); |
| } |
| }); |
| } |
| |
| protected void configureDocumentation() { |
| final ManPagesConfigurationDialog dialog = new ManPagesConfigurationDialog(getShell()); |
| if (dialog.open() == Window.OK) { |
| final int index = documentationField.getSelectionIndex(); |
| final String docId = index > 0 ? this.documentations.get(index - 1).getId() : null; |
| loadDocumentations(); |
| final Documentation doc = findById(docId); |
| documentationField.selectItem(doc != null ? this.documentations.indexOf(doc) + 1 : 0); |
| } |
| } |
| |
| private void loadDocumentations() { |
| documentations = new ArrayList<>(ManPageLoader.load().getDocumentations()); |
| final String[] names = new String[documentations.size() + 1]; |
| names[0] = documentations.isEmpty() ? "(not configured)" : "(default)"; |
| Collections.sort(documentations, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); |
| for (int i = 0; i < documentations.size(); ++i) { |
| names[i + 1] = documentations.get(i).getName(); |
| } |
| documentationField.setItems(names); |
| } |
| |
| @Override |
| protected void createDialogBlocks(final Composite parent, int numColumns) { |
| super.createDialogBlocks(parent, numColumns); |
| globalsExpandableNode = new ExpandableBlock(parent, 0); |
| globalsExpandableNode.setText(TclInterpreterMessages.AddTclInterpreterDialog_0); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = numColumns; |
| globalsExpandableNode.setLayoutData(gd); |
| globals = new GlobalVariableBlock(this); |
| globals.createControlsIn(globalsExpandableNode.getContent()); |
| globalsExpandableNode.setExpanded(true); |
| // Available packages |
| ExpandableBlock node2 = new ExpandableBlock(parent, 0); |
| node2.setText("Available packages:"); |
| GridData gd2 = new GridData(SWT.FILL, SWT.FILL, true, true); |
| gd2.horizontalSpan = numColumns; |
| node2.setLayoutData(gd2); |
| packagesBlock = new AvailablePackagesBlock(this); |
| packagesBlock.createIn(node2.getContent()); |
| node2.setExpanded(true); |
| } |
| |
| @Override |
| protected void updateValidateInterpreterLocation() { |
| super.updateValidateInterpreterLocation(); |
| IStatus status = getInterpreterLocationStatus(); |
| if (status instanceof StatusWithPackages) { |
| StatusWithPackages swp = (StatusWithPackages) status; |
| packagesBlock.updatePackages(swp.getInterpreter()); |
| } else { |
| // Make it empty if not detected. |
| packagesBlock.updatePackages(null); |
| } |
| } |
| |
| @Override |
| protected void initializeBounds() { |
| super.initializeBounds(); |
| // Resize dialog height |
| Shell shell = getShell(); |
| Point size = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT); |
| Point size2 = shell.getSize(); |
| if (size.y > size2.y) { |
| shell.setSize(size2.x, size.y); |
| } |
| } |
| |
| @Override |
| protected boolean useInterpreterArgs() { |
| return false; |
| } |
| |
| @Override |
| protected boolean isRediscoverSupported() { |
| return false; |
| } |
| |
| @Override |
| protected void okPressed() { |
| super.okPressed(); |
| // Remove all information for packages infrastructure for this |
| // interpreter. |
| IInterpreterInstall install = getLastInterpreterInstall(); |
| if (install != null) { |
| IContentCache coreCache = ModelManager.getModelManager().getCoreCache(); |
| coreCache.clearCacheEntryAttributes(install.getInstallLocation()); |
| TclPackagesManager.removeInterpreterInfo(install); |
| } |
| } |
| |
| @Override |
| protected String getDialogSettingsSectionName() { |
| return "ADD_TCL_SCRIPT_INTERPRETER_DIALOG_SECTION"; //$NON-NLS-1$ |
| } |
| |
| @Override |
| protected void initializeFields(IInterpreterInstall install) { |
| super.initializeFields(install); |
| if (install != null) { |
| final InterpreterDocumentation documentation = (InterpreterDocumentation) install |
| .findExtension(ManpagesPackage.Literals.INTERPRETER_DOCUMENTATION); |
| final String docId = documentation != null ? documentation.getDocumentationId() : null; |
| final Documentation doc = findById(docId); |
| documentationField.selectItem(doc != null ? documentations.indexOf(doc) + 1 : 0); |
| VariableMap variableMap = (VariableMap) install.findExtension(TclPackagesPackage.Literals.VARIABLE_MAP); |
| if (variableMap != null) { |
| globals.setValues(variableMap.getVariables()); |
| } else { |
| globals.setValues(ECollections.<String, VariableValue>emptyEMap()); |
| } |
| } else { |
| documentationField.selectItem(0); |
| globals.setValues(ECollections.<String, VariableValue>emptyEMap()); |
| } |
| |
| // Set initial expanding |
| globalsExpandableNode.setExpanded(!globals.getValues().isEmpty()); |
| environmentExpandableNode.setExpanded(fEnvironmentVariablesBlock.getEnvironmentVariables().length > 0); |
| } |
| |
| @Override |
| protected void setFieldValuesToInterpreter(IInterpreterInstall install) { |
| super.setFieldValuesToInterpreter(install); |
| int index = documentationField.getSelectionIndex(); |
| if (index == 0) { |
| install.replaceExtension(ManpagesPackage.Literals.INTERPRETER_DOCUMENTATION, null); |
| } else { |
| final Documentation doc = documentations.get(index - 1); |
| final InterpreterDocumentation idoc = ManpagesFactory.eINSTANCE.createInterpreterDocumentation(); |
| idoc.setDocumentationId(doc.getId()); |
| install.replaceExtension(ManpagesPackage.Literals.INTERPRETER_DOCUMENTATION, idoc); |
| } |
| final EMap<String, VariableValue> newVars = globals.getValues(); |
| final EMap<String, VariableValue> oldVars = TclPackagesManager.getVariablesEMap(install); |
| if (!GlobalVariableBlock.equalsEMap(newVars, oldVars)) { |
| TclPackagesManager.setVariables(install, newVars); |
| } |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| public InterpreterStandin getInterpreterStandin() { |
| InterpreterStandin standin = new InterpreterStandin(fSelectedInterpreterType, "$fake$"); |
| IEnvironment selectedEnv = getEnvironment(); |
| String locationName = getInterpreterPath(); |
| final IFileHandle file; |
| if (locationName.length() == 0) { |
| file = null; |
| return null; |
| } else { |
| file = PlatformFileUtils.findAbsoluteOrEclipseRelativeFile(selectedEnv, new Path(locationName)); |
| EnvironmentVariable[] environmentVariables = null; |
| if (fEnvironmentVariablesBlock != null) { |
| environmentVariables = fEnvironmentVariablesBlock.getEnvironmentVariables(); |
| } |
| LibraryLocation[] locations = fLibraryBlock.getLibraryLocations(); |
| standin.setInstallLocation(file); |
| standin.setLibraryLocations(locations); |
| standin.setEnvironmentVariables(environmentVariables); |
| } |
| return standin; |
| } |
| } |