/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.server.nodejs.internal.ui.preferences; import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import tern.eclipse.ide.server.nodejs.core.IDENodejsProcessHelper; import tern.eclipse.ide.server.nodejs.core.INodejsInstall; import tern.eclipse.ide.server.nodejs.core.TernNodejsCorePlugin; import tern.eclipse.ide.server.nodejs.internal.ui.TernNodejsUIMessages; import tern.eclipse.ide.ui.preferences.FileComboFieldEditor; /** * Node.js configuration editor. * */ public class NodeJSConfigEditor { private ComboFieldEditor nodeJSInstallField; private FileComboFieldEditor nativeNodePath; private Label nodePathTitle; private Text nodePath; public NodeJSConfigEditor(Composite parent, String nodeJSInstallPreferenceName, String nodeJSPathPrefrenceName) { this.nodeJSInstallField = createNodeJSInstall(parent, nodeJSInstallPreferenceName); this.nativeNodePath = createNativeNodePath(parent, nodeJSPathPrefrenceName); createNodePathInfo(parent); } private ComboFieldEditor createNodeJSInstall(final Composite parent, String nodeJSInstallPreferenceName) { // Node js install path String[][] data = createNodeInstalls(); return new ComboFieldEditor(nodeJSInstallPreferenceName, TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSInstall, data, parent) { @Override protected void fireValueChanged(String property, Object oldValue, Object newValue) { INodejsInstall install = TernNodejsCorePlugin.getNodejsInstallManager() .findNodejsInstall(newValue.toString()); if (install == null || install.isNative()) { nativeNodePath.setEnabled(true, parent); String defaultPath = IDENodejsProcessHelper.getNodejsPath(); nativeNodePath.setStringValue(defaultPath); nodePath.setText(defaultPath); } else { nativeNodePath.setEnabled(false, parent); nodePath.setText(install.getPath().getAbsolutePath()); } super.fireValueChanged(property, oldValue, newValue); } }; } public static String[][] createNodeInstalls() { INodejsInstall[] installs = TernNodejsCorePlugin.getNodejsInstallManager().getNodejsInstalls(); String[][] data = new String[installs.length + 1][2]; data[0][0] = TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSInstall_emptyValue; data[0][1] = ""; //$NON-NLS-1$ for (int i = 0; i < installs.length; i++) { data[i + 1][0] = installs[i].getName(); data[i + 1][1] = installs[i].getId(); } return data; } private FileComboFieldEditor createNativeNodePath(Composite parent, String nodeJSPathPrefrenceName) { // Node.js path String[] defaultPaths = IDENodejsProcessHelper.getDefaultNodejsPaths(); return new FileComboFieldEditor(nodeJSPathPrefrenceName, TernNodejsUIMessages.TernNodejsPreferencesPage_nativeNodeJSPath, defaultPaths, parent) { @Override protected void fireValueChanged(String property, Object oldValue, Object newValue) { nodePath.setText(newValue.toString()); super.fireValueChanged(property, oldValue, newValue); } }; } private void createNodePathInfo(Composite parent) { // Node path label nodePathTitle = new Label(parent, SWT.NONE); nodePathTitle.setText(TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSPath); GridData gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); nodePathTitle.setLayoutData(gridData); nodePath = new Text(parent, SWT.WRAP | SWT.READ_ONLY); nodePath.setText(""); //$NON-NLS-1$ gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 2; gridData.widthHint = 200; nodePath.setLayoutData(gridData); } public ComboFieldEditor getNodeJSInstallField() { return nodeJSInstallField; } public FileComboFieldEditor getNativeNodePath() { return nativeNodePath; } public void setEnabled(boolean enabled, Composite parent) { nodeJSInstallField.setEnabled(enabled, parent); nodePathTitle.setEnabled(enabled); nativeNodePath.setEnabled(enabled, parent); nodePath.setEnabled(enabled); } public void updateNodePath(INodejsInstall install, boolean isRemote, Composite parent) { // update node path if (install != null) { if (install.isNative()) { nodePath.setText(nativeNodePath.getStringValue()); } else { nodePath.setText(install.getPath().getAbsolutePath()); } } // update enable native node path nativeNodePath.setEnabled(!isRemote && install != null && install.isNative(), parent); } }