/**
* Copyright (c) 2013-2016 Angelo ZERR and Genuitec LLC.
* 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
* Piotr Tomiak <piotr@genuitec.com> - support for tern.js debugging
*/
package tern.eclipse.ide.server.nodejs.internal.ui.preferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import tern.eclipse.ide.core.TernCorePlugin;
import tern.eclipse.ide.server.nodejs.core.INodejsInstall;
import tern.eclipse.ide.server.nodejs.core.TernNodejsCoreConstants;
import tern.eclipse.ide.server.nodejs.core.TernNodejsCorePlugin;
import tern.eclipse.ide.server.nodejs.internal.ui.TernNodejsUIMessages;
import tern.eclipse.ide.ui.ImageResource;
import tern.eclipse.ide.ui.preferences.FileComboFieldEditor;
import tern.eclipse.ide.ui.preferences.TernRepositoryFieldEditor;
import tern.utils.StringUtils;
/**
* Tern Node.js preferences page.
*
*/
public class TernNodejsPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
private Button remoteAccessButton;
private IntegerFieldEditor remotePortField;
private Button directAccessButton;
private IntegerFieldEditor timeoutField;
private IntegerFieldEditor testNumberField;
private BooleanFieldEditor persistentField;
private DebuggerFieldEditor debuggerField;
private NodeJSConfigEditor nodeJSConfigEditor;
private IWorkbench workbench;
private TernRepositoryFieldEditor ternRepositoryField;
public TernNodejsPreferencesPage() {
super(GRID);
setDescription(TernNodejsUIMessages.TernNodejsPreferencesPage_desc);
setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_LOGO));
}
@Override
protected void createFieldEditors() {
boolean isRemote = getPreferenceStore().getBoolean(TernNodejsCoreConstants.NODEJS_REMOTE_ACCESS);
createRemoteAccessContent(getFieldEditorParent(), isRemote);
createSeparator(getFieldEditorParent());
createDirectAccessContent(getFieldEditorParent(), !isRemote);
updateEnabled(isRemote);
}
private void createRemoteAccessContent(Composite parent, boolean isRemote) {
remoteAccessButton = addRadioButton(parent, TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSRemoteAccess,
isRemote);
remoteAccessButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateEnabled(true);
}
});
// Remote port field
remotePortField = new IntegerFieldEditor(TernNodejsCoreConstants.NODEJS_REMOTE_PORT,
TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSRemotePort, parent);
addField(remotePortField);
}
private void createDirectAccessContent(final Composite parent, boolean isDirect) {
directAccessButton = addRadioButton(parent, TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSDirectAccess,
isDirect);
directAccessButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateEnabled(false);
}
});
// Start timeout field
timeoutField = new IntegerFieldEditor(TernNodejsCoreConstants.NODEJS_TIMEOUT,
TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSTimeout, parent);
addField(timeoutField);
// Start timeout field
testNumberField = new IntegerFieldEditor(TernNodejsCoreConstants.NODEJS_TEST_NUMBER,
TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSTestNumber, parent);
addField(testNumberField);
// Persistent (not auto-shutdown)
persistentField = new BooleanFieldEditor(TernNodejsCoreConstants.NODEJS_PERSISTENT,
TernNodejsUIMessages.TernNodejsPreferencesPage_nodeJSPersistent, parent);
addField(persistentField);
// Debugger setup
debuggerField = new DebuggerFieldEditor(TernNodejsCoreConstants.NODEJS_DEBUGGER,
TernNodejsUIMessages.TernNodejsPreferencesPage_debugger_label, parent) {
@Override
protected void updateComboBoxEnablement(Composite parent, boolean enabled) {
super.updateComboBoxEnablement(parent, enabled);
ternRepositoryField.setEnabled(enabled, parent);
}
};
addField(debuggerField);
// Repository setup
ternRepositoryField = new TernRepositoryFieldEditor(TernNodejsCoreConstants.NODEJS_TERN_REPOSITORY,
TernNodejsUIMessages.TernNodejsPreferencesPage_ternRepository_label, parent, workbench);
addField(ternRepositoryField);
GridData gd = new GridData();
gd.horizontalIndent = 25;
ternRepositoryField.getLabelControl(parent).setLayoutData(gd);
// debugger wiki
Link debuggerWikiLink = debuggerField.createWikiLink(parent, SWT.NONE);
gd = new GridData(SWT.FILL, SWT.FILL, false, false, 5, 1);
gd.horizontalIndent = 25;
debuggerWikiLink.setLayoutData(gd);
// Node configuration panel
nodeJSConfigEditor = new NodeJSConfigEditor(parent, TernNodejsCoreConstants.NODEJS_INSTALL,
TernNodejsCoreConstants.NODEJS_PATH);
ComboFieldEditor nodeJSInstallField = nodeJSConfigEditor.getNodeJSInstallField();
addField(nodeJSInstallField);
FileComboFieldEditor nativeNodePath = nodeJSConfigEditor.getNativeNodePath();
addField(nativeNodePath);
}
private void createSeparator(Composite parent) {
Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 4;
separator.setLayoutData(gd);
}
private Button addRadioButton(Composite parent, String label, boolean selected) {
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 4;
Button button = new Button(parent, SWT.RADIO);
button.setText(label);
button.setLayoutData(gd);
button.setSelection(selected);
return button;
}
private void updateEnabled(boolean isRemote) {
Composite parent = getFieldEditorParent();
remotePortField.setEnabled(isRemote, parent);
timeoutField.setEnabled(!isRemote, parent);
testNumberField.setEnabled(!isRemote, parent);
persistentField.setEnabled(!isRemote, parent);
debuggerField.setEnabled(!isRemote, parent);
ternRepositoryField.setEnabled(debuggerField.isCheckboxSelected(), parent);
nodeJSConfigEditor.setEnabled(!isRemote, parent);
}
@Override
protected void initialize() {
super.initialize();
// Update enable/disable of the nodejs path field.
boolean isRemote = getPreferenceStore().getBoolean(TernNodejsCoreConstants.NODEJS_REMOTE_ACCESS);
nodeJSConfigEditor.updateNodePath(getNodejsInstall(false), isRemote, getFieldEditorParent());
}
@Override
public void init(IWorkbench workbench) {
this.workbench = workbench;
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return new ScopedPreferenceStore(InstanceScope.INSTANCE, TernNodejsCorePlugin.PLUGIN_ID);
}
@Override
public boolean performOk() {
boolean result = super.performOk();
IPreferenceStore store = getPreferenceStore();
store.setValue(TernNodejsCoreConstants.NODEJS_REMOTE_ACCESS, remoteAccessButton.getSelection());
TernCorePlugin.getTernServerTypeManager().fireServerPreferencesChanged(null);
return result;
}
@Override
protected void performDefaults() {
super.performDefaults();
boolean isRemote = getPreferenceStore().getDefaultBoolean(TernNodejsCoreConstants.NODEJS_REMOTE_ACCESS);
nodeJSConfigEditor.updateNodePath(getNodejsInstall(true), isRemote, getFieldEditorParent());
remoteAccessButton.setSelection(isRemote);
directAccessButton.setSelection(!isRemote);
updateEnabled(isRemote);
}
private INodejsInstall getNodejsInstall(boolean defaultValue) {
INodejsInstall install = null;
String installId = defaultValue
? super.getPreferenceStore().getDefaultString(TernNodejsCoreConstants.NODEJS_INSTALL)
: super.getPreferenceStore().getString(TernNodejsCoreConstants.NODEJS_INSTALL);
if (!StringUtils.isEmpty(installId)) {
install = TernNodejsCorePlugin.getNodejsInstallManager().findNodejsInstall(installId);
}
return install;
}
}