/*******************************************************************************
* Copyright (c) 2016 Bruno Medeiros and other Contributors.
* 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package com.googlecode.goclipse.ui.preferences;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import com.googlecode.goclipse.core.GoToolPreferences;
import com.googlecode.goclipse.ui.editor.actions.GoFmtEditorOperation;
import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.operations.ToolchainPreferences;
import melnorme.lang.ide.ui.preferences.AbstractToolLocationGroup;
import melnorme.lang.ide.ui.preferences.common.PreferencesPageContext;
import melnorme.lang.ide.ui.preferences.pages.DownloadToolTextField;
import melnorme.lang.ide.ui.preferences.pages.LanguageToolsBlock;
import melnorme.lang.ide.ui.utils.ControlUtils;
import melnorme.lang.ide.ui.utils.operations.BasicUIOperation;
import melnorme.util.swt.SWTFactoryUtil;
import melnorme.util.swt.components.IDisableableWidget;
import melnorme.util.swt.components.fields.ButtonTextField;
import melnorme.util.swt.components.fields.CheckBoxField;
import melnorme.util.swt.components.fields.EnablementButtonTextField2;
import melnorme.util.swt.components.fields.FileTextField;
import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.misc.Location;
public class GoToolsConfigBlock extends LanguageToolsBlock {
public GoToolsConfigBlock(PreferencesPageContext prefContext) {
super(prefContext, LangCore.get().languageServerHandler().getLanguageToolPathValidator());
addChildWidget(new GoGuruGroup());
addChildWidget(new GoDefGroup());
addChildWidget(new GoFmtGroup());
}
@Override
protected EngineToolGroup init_createEngineToolGroup() {
return new EngineToolGroup() {
@Override
protected ButtonTextField initToolLocationField() {
return new DownloadToolTextField() {
@Override
protected BasicUIOperation getDownloadButtonHandler() {
return new Start_GoInstallJob_Operation("Download gocode", "Downloading gocode...",
this,
"github.com/nsf/gocode",
"gocode") {
};
}
};
}
};
}
public class GoGuruGroup extends AbstractToolLocationGroup {
public GoGuruGroup() {
super("guru");
bindFieldToDerivedPreference(toolLocationField, GoToolPreferences.GO_GURU_Path);
}
@Override
protected BasicUIOperation do_getDownloadButtonHandler(DownloadToolTextField toolLocationField) {
return new Start_GoInstallJob_Operation("Download guru", "Downloading guru...",
toolLocationField,
"golang.org/x/tools/cmd/guru",
"guru") {
};
}
};
public class GoDefGroup extends AbstractToolLocationGroup {
public GoDefGroup() {
super("godef");
bindFieldToDerivedPreference(toolLocationField, GoToolPreferences.GODEF_Path);
}
@Override
protected BasicUIOperation do_getDownloadButtonHandler(DownloadToolTextField toolLocationField) {
return new Start_GoInstallJob_Operation("Download godef", "Downloading godef...",
toolLocationField,
"github.com/rogpeppe/godef",
"godef") {
};
}
};
public class GoFmtGroup extends EnablementButtonTextField2 {
protected final CheckBoxField formatOnSaveField;
public GoFmtGroup() {
super("gofmt:", "Use default location (from Go installation).");
prefContext.bindToPreference(asEffectiveValueProperty(), GoToolPreferences.GOFMT_Path.getPreference());
buttonTextField.addFieldValidator2(GoToolPreferences.GOFMT_Path.getValidator());
this.formatOnSaveField = new CheckBoxField("Format automatically on editor save.");
this.addChildWidget(formatOnSaveField);
prefContext.bindToPreference(this.formatOnSaveField, ToolchainPreferences.FORMAT_ON_SAVE);
}
@Override
protected ButtonTextField init_createButtonTextField() {
return new ButtonTextField("Executable:", FileTextField.DEFAULT_BUTTON_LABEL) {
@Override
protected String getNewValueFromButtonSelection() throws OperationCancellation {
return ControlUtils.openFileDialog(getFieldValue(), button.getShell());
}
};
}
@Override
protected String getDefaultFieldValue() throws CommonException {
Location rootLoc = Location.create(LangCore.settings().SDK_LOCATION.getGlobalPreference().get());
return GoFmtEditorOperation.getGofmtLocationFromGoRoot(rootLoc).toPathString();
}
@Override
protected void updateChildrenEnablement() {
for (IDisableableWidget childWidget : getChildWidgets()) {
if(childWidget == enablementField || childWidget == formatOnSaveField) {
continue;
}
childWidget.setEnabled(!isUseDefault());
}
}
}
@Override
protected void createContents(Composite topControl) {
SWTFactoryUtil.createLabel(topControl, SWT.NONE, "Note: if you've made any changes "
+ "in the Go SDK preferences, \n"
+ "make sure you press \"Apply\" in that page before using the `Download...` button.",
createSubComponentDefaultGridData());
super.createContents(topControl);
}
}