| /******************************************************************************* |
| * 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; |
| } |
| } |
| } |