/*******************************************************************************
* Copyright (C) 2010, 2013 Robin Stocker <robin@nibor.org> and others.
* Copyright (C) 2015 SAP SE (Christian Georgi <christian.georgi@sap.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 org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.egit.core.GitCorePreferences;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.PluginPreferenceInitializer;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.UIUtils;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
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.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;
/** Preferences for committing with commit dialog/staging view. */
public class CommittingPreferencePage extends DoublePreferencesPreferencePage
implements IWorkbenchPreferencePage {
private BooleanFieldEditor useStagingView;
private BooleanFieldEditor autoStage;
private Button warnCheckbox;
private Group buildProblemsGroup;
private ComboFieldEditor warnCombo;
private Button blockCheckbox;
private ComboFieldEditor blockCombo;
private Group generalGroup;
/** */
public CommittingPreferencePage() {
super(GRID);
setTitle(UIText.CommittingPreferencePage_title);
}
@Override
public void init(IWorkbench workbench) {
// Nothing to do
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return Activator.getDefault().getPreferenceStore();
}
@Override
protected IPreferenceStore doGetSecondaryPreferenceStore() {
return new ScopedPreferenceStore(InstanceScope.INSTANCE,
org.eclipse.egit.core.Activator.getPluginId());
}
@Override
protected void createFieldEditors() {
Composite main = getFieldEditorParent();
generalGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
generalGroup.setText(UIText.CommittingPreferencePage_general);
GridDataFactory.fillDefaults().grab(true, false).span(3, 1)
.applyTo(generalGroup);
useStagingView = new BooleanFieldEditor(
UIPreferences.ALWAYS_USE_STAGING_VIEW,
UIText.CommittingPreferencePage_AlwaysUseStagingView,
generalGroup);
addField(useStagingView);
autoStage = new BooleanFieldEditor(UIPreferences.AUTO_STAGE_ON_COMMIT,
UIText.CommittingPreferencePage_AutoStageOnCommit,
generalGroup);
GridDataFactory.fillDefaults().indent(UIUtils.getControlIndent(), 0)
.applyTo(autoStage.getDescriptionControl(generalGroup));
addField(autoStage);
autoStage.setEnabled(getPreferenceStore()
.getBoolean(UIPreferences.ALWAYS_USE_STAGING_VIEW),
generalGroup);
BooleanFieldEditor includeUntracked = new BooleanFieldEditor(
UIPreferences.COMMIT_DIALOG_INCLUDE_UNTRACKED,
UIText.CommittingPreferencePage_includeUntrackedFiles,
generalGroup);
includeUntracked.getDescriptionControl(generalGroup).setToolTipText(
UIText.CommittingPreferencePage_includeUntrackedFilesTooltip);
addField(includeUntracked);
BooleanFieldEditor autoStageDeletion = new BooleanFieldEditor(
GitCorePreferences.core_autoStageDeletion,
UIText.CommittingPreferencePage_autoStageDeletion,
generalGroup) {
@Override
public IPreferenceStore getPreferenceStore() {
return getSecondaryPreferenceStore();
}
};
addField(autoStageDeletion);
BooleanFieldEditor autoStageMoves = new BooleanFieldEditor(
GitCorePreferences.core_autoStageMoves,
UIText.CommittingPreferencePage_autoStageMoves, generalGroup) {
@Override
public IPreferenceStore getPreferenceStore() {
return getSecondaryPreferenceStore();
}
};
addField(autoStageMoves);
IntegerFieldEditor historySize = new IntegerFieldEditor(
UIPreferences.COMMIT_DIALOG_HISTORY_SIZE,
UIText.CommittingPreferencePage_commitMessageHistory,
generalGroup);
addField(historySize);
updateMargins(generalGroup);
Group formattingGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
formattingGroup.setText(UIText.CommittingPreferencePage_formatting);
GridDataFactory.fillDefaults().grab(true, false).span(3, 1)
.applyTo(formattingGroup);
BooleanFieldEditor hardWrap = new BooleanFieldEditor(
UIPreferences.COMMIT_DIALOG_HARD_WRAP_MESSAGE,
UIText.CommittingPreferencePage_hardWrapMessage, formattingGroup);
hardWrap.getDescriptionControl(formattingGroup).setToolTipText(
UIText.CommittingPreferencePage_hardWrapMessageTooltip);
addField(hardWrap);
BooleanFieldEditor secondLineCheck = new BooleanFieldEditor(
UIPreferences.COMMIT_DIALOG_WARN_ABOUT_MESSAGE_SECOND_LINE,
UIText.CommittingPreferencePage_warnAboutCommitMessageSecondLine,
formattingGroup);
addField(secondLineCheck);
updateMargins(formattingGroup);
Group footersGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
footersGroup.setText(UIText.CommittingPreferencePage_footers);
GridDataFactory.fillDefaults().grab(true, false).span(3, 1)
.applyTo(footersGroup);
BooleanFieldEditor signedOffBy = new BooleanFieldEditor(
UIPreferences.COMMIT_DIALOG_SIGNED_OFF_BY,
UIText.CommittingPreferencePage_signedOffBy,
footersGroup);
signedOffBy
.getDescriptionControl(footersGroup)
.setToolTipText(
UIText.CommittingPreferencePage_signedOffByTooltip);
addField(signedOffBy);
updateMargins(footersGroup);
buildProblemsGroup = createGroup(main, 1);
buildProblemsGroup.setText(
UIText.CommittingPreferencePage_WarnBeforeCommittingTitle);
GridDataFactory.fillDefaults().grab(true, false).span(3, 1)
.applyTo(buildProblemsGroup);
warnCheckbox = createCheckBox(buildProblemsGroup,
UIText.CommittingPreferencePage_CheckBeforeCommitting);
((GridData) warnCheckbox.getLayoutData()).horizontalSpan = 3;
warnCheckbox.setSelection(doGetPreferenceStore()
.getBoolean(UIPreferences.WARN_BEFORE_COMMITTING));
warnCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleWarnCheckboxSelection(warnCheckbox.getSelection());
}
});
warnCombo = new ComboFieldEditor(UIPreferences.WARN_BEFORE_COMMITTING_LEVEL,
UIText.CommittingPreferencePage_WarnBeforeCommitting,
new String[][] {
{ UIText.CommittingPreferencePage_WarnBlock_Errors,
PluginPreferenceInitializer.COMMITTING_PREFERENCE_PAGE_WARN_BLOCK_ERRORS },
{ UIText.CommittingPreferencePage_WarnBlock_WarningsAndErrors,
PluginPreferenceInitializer.COMMITTING_PREFERENCE_PAGE_WARN_BLOCK_WARNINGS_AND_ERRORS } },
buildProblemsGroup);
addField(warnCombo);
blockCheckbox = createCheckBox(buildProblemsGroup,
UIText.CommittingPreferencePage_BlockCommit);
((GridData) blockCheckbox.getLayoutData()).horizontalSpan = 3;
blockCheckbox.setSelection(
doGetPreferenceStore().getBoolean(UIPreferences.BLOCK_COMMIT));
blockCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleBlockCheckboxSelection(blockCheckbox.getSelection());
}
});
blockCombo = new ComboFieldEditor(UIPreferences.BLOCK_COMMIT_LEVEL,
UIText.CommittingPreferencePage_BlockCommitCombo,
new String[][] {
{ UIText.CommittingPreferencePage_WarnBlock_Errors,
PluginPreferenceInitializer.COMMITTING_PREFERENCE_PAGE_WARN_BLOCK_ERRORS },
{ UIText.CommittingPreferencePage_WarnBlock_WarningsAndErrors,
PluginPreferenceInitializer.COMMITTING_PREFERENCE_PAGE_WARN_BLOCK_WARNINGS_AND_ERRORS } },
buildProblemsGroup);
addField(blockCombo);
handleWarnCheckboxSelection(warnCheckbox.getSelection());
handleBlockCheckboxSelection(blockCheckbox.getSelection());
updateMargins(buildProblemsGroup);
}
@Override
protected void initialize() {
super.initialize();
useStagingView.setPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (FieldEditor.VALUE.equals(event.getProperty())) {
autoStage.setEnabled(
((Boolean) event.getNewValue()).booleanValue(),
generalGroup);
}
}
});
}
@Override
protected void performDefaults() {
super.performDefaults();
// We don't get property changed events when the default values are
// restored...
autoStage.setEnabled(
getPreferenceStore().getDefaultBoolean(
UIPreferences.ALWAYS_USE_STAGING_VIEW),
generalGroup);
}
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 Button createCheckBox(Composite group, String label) {
Button button = new Button(group, SWT.CHECK | SWT.LEFT);
button.setText(label);
GridData data = new GridData(GridData.FILL);
data.verticalAlignment = GridData.CENTER;
data.horizontalAlignment = GridData.FILL;
button.setLayoutData(data);
return button;
}
private void handleBlockCheckboxSelection(boolean selection) {
blockCombo.setEnabled(selection, buildProblemsGroup);
}
private void handleWarnCheckboxSelection(boolean selection) {
warnCombo.setEnabled(selection, buildProblemsGroup);
blockCheckbox.setEnabled(selection);
blockCombo.setEnabled(selection, buildProblemsGroup);
}
@Override
public boolean performOk() {
getPreferenceStore().setValue(UIPreferences.WARN_BEFORE_COMMITTING,
warnCheckbox.getSelection());
getPreferenceStore().setValue(UIPreferences.BLOCK_COMMIT,
blockCheckbox.getSelection());
return super.performOk();
}
private Group createGroup(Composite parent, int numColumns) {
Group group = new Group(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = numColumns;
group.setLayout(layout);
GridData data = new GridData(SWT.FILL);
data.horizontalIndent = 0;
data.verticalAlignment = SWT.FILL;
data.horizontalAlignment = SWT.END;
data.grabExcessHorizontalSpace = true;
group.setLayoutData(data);
return group;
}
}