/******************************************************************************* * 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 v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ 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.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.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 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$ } /** * 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 IPreferenceStore getPreferenceStore() { return 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 timeoutEditor = new IntegerFieldEditor( UIPreferences.REMOTE_CONNECTION_TIMEOUT, UIText.RemoteConnectionPreferencePage_TimeoutLabel, remoteConnectionsGroup); timeoutEditor.getLabelControl(remoteConnectionsGroup).setToolTipText( UIText.RemoteConnectionPreferencePage_ZeroValueTooltip); addField(timeoutEditor); 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.REFESH_INDEX_INTERVAL, UIText.RefreshPreferencesPage_RefreshIndexInterval, repoChangeScannerGroup); intervalField.getLabelControl(repoChangeScannerGroup).setToolTipText( UIText.RefreshPreferencesPage_RefreshIndexIntervalTooltip); addField(intervalField); addField(new BooleanFieldEditor(UIPreferences.REFESH_ON_INDEX_CHANGE, UIText.RefreshPreferencesPage_RefreshWhenIndexChange, repoChangeScannerGroup) { @Override public int getNumberOfControls() { return 2; } }); addField(new BooleanFieldEditor(UIPreferences.REFESH_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); } 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; } } }