blob: 02bc3dfd16c3d6dec8d4cccde1cc26af203339de [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* Copyright (C) 2010, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
* Copyright (C) 2013, Dariusz Luksza <dariusz.luksza@gmail.com>
* Copyright (C) 2016, 2017 Thomas Wolf <thomas.wolf@paranor.ch>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.egit.ui.internal.preferences;
import java.io.File;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.egit.core.GitCorePreferences;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.DirectoryFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.window.Window;
import org.eclipse.jgit.util.LfsFactory;
import org.eclipse.jgit.util.LfsFactory.LfsInstallCommand;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
/** Root preference page for the all of our workspace preferences. */
public class GitPreferenceRoot extends DoublePreferencesPreferencePage
implements IWorkbenchPreferencePage {
private final static int GROUP_SPAN = 3;
private final static String[][] MERGE_MODE_NAMES_AND_VALUES = new String[3][2];
private final static String[][] SSH_CLIENT_NAMES_AND_VALUES = new String[2][2];
private final static String[][] HTTP_CLIENT_NAMES_AND_VALUES = new String[2][2];
private final static boolean HAS_DEBUG_UI = hasDebugUiBundle();
static {
MERGE_MODE_NAMES_AND_VALUES[0][0] = UIText.GitPreferenceRoot_MergeMode_0_Label;
MERGE_MODE_NAMES_AND_VALUES[0][1] = "0";//$NON-NLS-1$
MERGE_MODE_NAMES_AND_VALUES[1][0] = UIText.GitPreferenceRoot_MergeMode_1_Label;
MERGE_MODE_NAMES_AND_VALUES[1][1] = "1";//$NON-NLS-1$
MERGE_MODE_NAMES_AND_VALUES[2][0] = UIText.GitPreferenceRoot_MergeMode_2_Label;
MERGE_MODE_NAMES_AND_VALUES[2][1] = "2"; //$NON-NLS-1$
SSH_CLIENT_NAMES_AND_VALUES[0][0] = UIText.GitPreferenceRoot_SshClient_Jsch_Label;
SSH_CLIENT_NAMES_AND_VALUES[0][1] = "jsch"; //$NON-NLS-1$
SSH_CLIENT_NAMES_AND_VALUES[1][0] = UIText.GitPreferenceRoot_SshClient_Apache_Label;
SSH_CLIENT_NAMES_AND_VALUES[1][1] = "apache"; //$NON-NLS-1$
HTTP_CLIENT_NAMES_AND_VALUES[0][0] = UIText.GitPreferenceRoot_HttpClient_Jdk_Label;
HTTP_CLIENT_NAMES_AND_VALUES[0][1] = "jdk"; //$NON-NLS-1$
HTTP_CLIENT_NAMES_AND_VALUES[1][0] = UIText.GitPreferenceRoot_HttpClient_Apache_Label;
HTTP_CLIENT_NAMES_AND_VALUES[1][1] = "apache"; //$NON-NLS-1$
}
/**
* The default constructor
*/
public GitPreferenceRoot() {
super(FLAT);
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return Activator.getDefault().getPreferenceStore();
}
@Override
protected IPreferenceStore doGetSecondaryPreferenceStore() {
return new ScopedPreferenceStore(InstanceScope.INSTANCE,
org.eclipse.egit.core.Activator.getPluginId());
}
@Override
public void init(final IWorkbench workbench) {
// Nothing to do
}
@Override
protected void createFieldEditors() {
Composite main = getFieldEditorParent();
GridLayoutFactory.swtDefaults().margins(0, 0).applyTo(main);
Group cloningGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
cloningGroup.setText(UIText.GitPreferenceRoot_CloningRepoGroupHeader);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(cloningGroup);
DirectoryFieldEditor editor = new DirectoryFieldEditor(
GitCorePreferences.core_defaultRepositoryDir,
UIText.GitPreferenceRoot_DefaultRepoFolderLabel, cloningGroup) {
/** The own control is the variableButton */
private static final int NUMBER_OF_OWN_CONTROLS = 1;
@Override
public void setPreferenceStore(IPreferenceStore store) {
super.setPreferenceStore(
store == null ? null : getSecondaryPreferenceStore());
}
@Override
protected boolean doCheckState() {
String fileName = getTextControl().getText();
fileName = fileName.trim();
if (fileName.length() == 0 && isEmptyStringAllowed())
return true;
IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
String substitutedFileName;
try {
substitutedFileName = manager.performStringSubstitution(fileName);
} catch (CoreException e) {
// It's apparently invalid
return false;
}
File file = new File(substitutedFileName);
// other than the super implementation, we don't
// require the file to exist
return !file.exists() || file.isDirectory();
}
@Override
public int getNumberOfControls() {
return super.getNumberOfControls() + NUMBER_OF_OWN_CONTROLS;
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, numColumns - NUMBER_OF_OWN_CONTROLS);
}
@Override
protected void adjustForNumColumns(int numColumns) {
super.adjustForNumColumns(numColumns - NUMBER_OF_OWN_CONTROLS);
}
@Override
protected void createControl(Composite parent) {
// setting validate strategy using the setter method is too late
super.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
super.createControl(parent);
if (HAS_DEBUG_UI)
addVariablesButton(parent);
}
private void addVariablesButton(Composite parent) {
Button variableButton = new Button(parent, SWT.PUSH);
variableButton.setText(UIText.GitPreferenceRoot_DefaultRepoFolderVariableButton);
variableButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
org.eclipse.debug.ui.StringVariableSelectionDialog dialog = new org.eclipse.debug.ui.StringVariableSelectionDialog(
getShell());
int returnCode = dialog.open();
if (returnCode == Window.OK)
setStringValue(dialog.getVariableExpression());
}
});
}
};
updateMargins(cloningGroup);
editor.setEmptyStringAllowed(false);
editor.getLabelControl(cloningGroup).setToolTipText(
UIText.GitPreferenceRoot_DefaultRepoFolderTooltip);
addField(editor);
Group remoteConnectionsGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(remoteConnectionsGroup);
remoteConnectionsGroup
.setText(UIText.GitPreferenceRoot_RemoteConnectionsGroupHeader);
IntegerFieldEditor pullEditor = new IntegerFieldEditor(
GitCorePreferences.core_maxPullThreadsCount,
UIText.GitPreferenceRoot_MaxPullThreadsCount,
remoteConnectionsGroup) {
@Override
public void setPreferenceStore(IPreferenceStore store) {
super.setPreferenceStore(
store == null ? null : getSecondaryPreferenceStore());
}
};
pullEditor.getLabelControl(remoteConnectionsGroup).setToolTipText(
UIText.GitPreferenceRoot_MaxPullThreadsCountTooltip);
addField(pullEditor);
IntegerFieldEditor timeoutEditor = new IntegerFieldEditor(
GitCorePreferences.core_remoteConnectionTimeout,
UIText.RemoteConnectionPreferencePage_TimeoutLabel,
remoteConnectionsGroup) {
@Override
public void setPreferenceStore(IPreferenceStore store) {
super.setPreferenceStore(
store == null ? null : getSecondaryPreferenceStore());
}
};
timeoutEditor.getLabelControl(remoteConnectionsGroup).setToolTipText(
UIText.RemoteConnectionPreferencePage_ZeroValueTooltip);
addField(timeoutEditor);
ComboFieldEditor sshClient = new ComboFieldEditor(
GitCorePreferences.core_sshClient,
UIText.RemoteConnectionPreferencePage_SshClientLabel,
SSH_CLIENT_NAMES_AND_VALUES, remoteConnectionsGroup) {
@Override
public void setPreferenceStore(IPreferenceStore store) {
super.setPreferenceStore(
store == null ? null : getSecondaryPreferenceStore());
}
};
addField(sshClient);
ComboFieldEditor httpClient = new ComboFieldEditor(
GitCorePreferences.core_httpClient,
UIText.RemoteConnectionPreferencePage_HttpClientLabel,
HTTP_CLIENT_NAMES_AND_VALUES, remoteConnectionsGroup) {
@Override
public void setPreferenceStore(IPreferenceStore store) {
super.setPreferenceStore(
store == null ? null : getSecondaryPreferenceStore());
}
};
addField(httpClient);
updateMargins(remoteConnectionsGroup);
Group repoChangeScannerGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(repoChangeScannerGroup);
repoChangeScannerGroup
.setText(UIText.GitPreferenceRoot_RepoChangeScannerGroupHeader);
IntegerFieldEditor intervalField = new IntegerFieldEditor(
UIPreferences.REFRESH_INDEX_INTERVAL,
UIText.RefreshPreferencesPage_RefreshIndexInterval,
repoChangeScannerGroup);
intervalField.getLabelControl(repoChangeScannerGroup).setToolTipText(
UIText.RefreshPreferencesPage_RefreshIndexIntervalTooltip);
addField(intervalField);
addField(new BooleanFieldEditor(UIPreferences.REFRESH_ON_INDEX_CHANGE,
UIText.RefreshPreferencesPage_RefreshWhenIndexChange,
repoChangeScannerGroup) {
@Override
public int getNumberOfControls() {
return 2;
}
});
addField(new BooleanFieldEditor(UIPreferences.REFRESH_ONLY_WHEN_ACTIVE,
UIText.RefreshPreferencesPage_RefreshOnlyWhenActive,
repoChangeScannerGroup) {
@Override
public int getNumberOfControls() {
return 2;
}
});
updateMargins(repoChangeScannerGroup);
Group mergeGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(mergeGroup);
mergeGroup.setText(UIText.GitPreferenceRoot_MergeGroupHeader);
ComboFieldEditor mergeMode = new ComboFieldEditor(
UIPreferences.MERGE_MODE,
UIText.GitPreferenceRoot_MergeModeLabel,
MERGE_MODE_NAMES_AND_VALUES, mergeGroup);
mergeMode.getLabelControl(mergeGroup).setToolTipText(
UIText.GitPreferenceRoot_MergeModeTooltip);
addField(mergeMode);
updateMargins(mergeGroup);
Group blameGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(blameGroup);
blameGroup.setText(UIText.GitPreferenceRoot_BlameGroupHeader);
addField(new BooleanFieldEditor(UIPreferences.BLAME_IGNORE_WHITESPACE,
UIText.GitPreferenceRoot_BlameIgnoreWhitespaceLabel, blameGroup));
updateMargins(blameGroup);
Group secureGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(secureGroup);
secureGroup.setText(UIText.GitPreferenceRoot_SecureStoreGroupLabel);
addField(new BooleanFieldEditor(UIPreferences.CLONE_WIZARD_STORE_SECURESTORE,
UIText.GitPreferenceRoot_SecureStoreUseByDefault, secureGroup));
updateMargins(secureGroup);
boolean lfsAvailable = LfsFactory.getInstance().isAvailable()
&& LfsFactory.getInstance().getInstallCommand() != null;
Group lfsGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
GridLayoutFactory.fillDefaults().applyTo(lfsGroup);
GridDataFactory.fillDefaults().grab(true, false).span(GROUP_SPAN, 1)
.applyTo(lfsGroup);
lfsGroup.setText(
lfsAvailable ? UIText.GitPreferenceRoot_lfsSupportCaption : UIText.GitPreferenceRoot_lfsSupportCaptionNotAvailable);
Button lfsEnable = new Button(lfsGroup, SWT.PUSH);
lfsEnable.setEnabled(lfsAvailable);
lfsEnable.setText(UIText.GitPreferenceRoot_lfsSupportInstall);
lfsEnable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// enable LFS support for user.
LfsInstallCommand cmd = LfsFactory.getInstance()
.getInstallCommand();
try {
if (cmd != null) {
cmd.call();
MessageDialog.openInformation(getShell(),
UIText.GitPreferenceRoot_lfsSupportSuccessTitle,
UIText.GitPreferenceRoot_lfsSupportSuccessMessage);
}
} catch (Exception ex) {
Activator.handleError(
UIText.ConfigurationChecker_installLfsCannotInstall,
ex, true);
}
}
});
updateMargins(lfsGroup);
}
private void updateMargins(Group group) {
// make sure there is some room between the group border
// and the controls in the group
GridLayout layout = (GridLayout) group.getLayout();
layout.marginWidth = 5;
layout.marginHeight = 5;
}
private static final boolean hasDebugUiBundle() {
try {
return Class
.forName("org.eclipse.debug.ui.StringVariableSelectionDialog") != null; //$NON-NLS-1$
} catch (ClassNotFoundException e) {
return false;
}
}
}