/*******************************************************************************
* Copyright (c) 2013, 2017 Red Hat Inc. and others.
* 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:
* Neil Guzman - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.createrepo.preference;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
import org.eclipse.linuxtools.internal.rpm.createrepo.Activator;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoPreferenceConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoChecksums;
import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoCompressionTypes;
import org.eclipse.linuxtools.internal.rpm.createrepo.Messages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.dialogs.PreferencesUtil;
/**
* Project property page for configuring the delta options for a repository.
*/
public class CreaterepoGeneralPropertyPage extends CreaterepoPropertyPage {
private static final String linkTags = "<a>{0}</a>"; //$NON-NLS-1$
private Button btnProjectSettings;
private Link lnWorkspaceSettings;
private Group generalGroup;
private BooleanFieldEditor bfeIncludeChecksum;
private BooleanFieldEditor bfeSQLDB;
private BooleanFieldEditor bfeIgnoreSymlinks;
private BooleanFieldEditor bfePrettyXML;
private IntegerFieldEditor ifeSpawns;
private Group updatesGroup;
private BooleanFieldEditor bfeSameFilename;
private Label lblCheckTs;
private Group changelogGroup;
private IntegerFieldEditor ifeChangelogLimit;
private Composite checksumsContainer;
private RadioGroupFieldEditor rgfeChecksums;
private Composite compressContainer;
private RadioGroupFieldEditor rgfeCompressionTypes;
/**
* Default Constructor. Sets the description of the property page.
*/
public CreaterepoGeneralPropertyPage() {
super(Messages.CreaterepoPreferencePage_description);
}
@Override
protected Composite addContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
GridData layoutData = new GridData();
composite.setLayout(layout);
// TODO: use BooleanFieldEditor and get it to layout properly
// with the link (lnWorkspaceSettings)
btnProjectSettings = new Button(composite, SWT.CHECK);
btnProjectSettings.addListener(SWT.Selection, event -> toggleEnabled());
layoutData = new GridData();
layoutData.horizontalAlignment = GridData.BEGINNING;
layoutData.horizontalAlignment = GridData.FILL;
layoutData.grabExcessHorizontalSpace = true;
btnProjectSettings.setText(Messages.CreaterepoGeneralPropertyPage_projectSettings);
btnProjectSettings.setLayoutData(layoutData);
btnProjectSettings.setSelection(Activator.getDefault().getPreferenceStore()
.getBoolean(CreaterepoPreferenceConstants.PREF_GENERAL_ENABLED));
btnProjectSettings.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> checkState()));
lnWorkspaceSettings = new Link(composite, SWT.NONE);
layoutData = new GridData();
layoutData.horizontalAlignment = SWT.END;
lnWorkspaceSettings.setLayoutData(layoutData);
lnWorkspaceSettings.setText(NLS.bind(linkTags, Messages.CreaterepoGeneralPropertyPage_workspaceSettings));
lnWorkspaceSettings.setFont(parent.getFont());
lnWorkspaceSettings.addListener(SWT.Selection, event -> {
PreferenceDialog preferenceDialog = PreferencesUtil.createPreferenceDialogOn(getShell(),
CREATEREPO_PREFERENCE_ID, new String[] {CREATEREPO_PREFERENCE_ID}, null);
preferenceDialog.open();
});
// general group
generalGroup = new Group(composite, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout(2, false);
generalGroup.setLayout(layout);
generalGroup.setText(Messages.CreaterepoPreferencePage_generalGroupLabel);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).span(2,1).applyTo(generalGroup);
// generate unique metadata filenames
bfeIncludeChecksum = new BooleanFieldEditor(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME,
Messages.CreaterepoPreferencePage_booleanChecksumName, generalGroup);
bfeIncludeChecksum.fillIntoGrid(generalGroup, 2);
bfeIncludeChecksum.setPreferenceStore(preferenceStore);
bfeIncludeChecksum.setPropertyChangeListener(this);
bfeIncludeChecksum.load();
// generate sqlite databases
bfeSQLDB = new BooleanFieldEditor(CreaterepoPreferenceConstants.PREF_GENERATE_DB,
Messages.CreaterepoPreferencePage_booleanGenerateSQLDB, generalGroup);
bfeSQLDB.fillIntoGrid(generalGroup, 2);
bfeSQLDB.setPreferenceStore(preferenceStore);
bfeSQLDB.setPropertyChangeListener(this);
bfeSQLDB.load();
// ignore symlinks for packages
bfeIgnoreSymlinks = new BooleanFieldEditor(CreaterepoPreferenceConstants.PREF_IGNORE_SYMLINKS,
Messages.CreaterepoPreferencePage_booleanIgnoreSymlinks, generalGroup);
bfeIgnoreSymlinks.fillIntoGrid(generalGroup, 2);
bfeIgnoreSymlinks.setPreferenceStore(preferenceStore);
bfeIgnoreSymlinks.setPropertyChangeListener(this);
bfeIgnoreSymlinks.load();
// output files in pretty xml format
bfePrettyXML = new BooleanFieldEditor(CreaterepoPreferenceConstants.PREF_PRETTY_XML,
Messages.CreaterepoPreferencePage_booleanPrettyXML, generalGroup);
bfePrettyXML.fillIntoGrid(generalGroup, 2);
bfePrettyXML.setPreferenceStore(preferenceStore);
bfePrettyXML.setPropertyChangeListener(this);
bfePrettyXML.load();
// number of workers
ifeSpawns = new IntegerFieldEditor(CreaterepoPreferenceConstants.PREF_WORKERS,
Messages.CreaterepoPreferencePage_numWorkers, generalGroup);
ifeSpawns.fillIntoGrid(generalGroup, 2);
// more than 128 is alot. limiting. (createrepo warning)
ifeSpawns.setValidRange(0, 128);
ifeSpawns.setPreferenceStore(preferenceStore);
ifeSpawns.setPropertyChangeListener(this);
ifeSpawns.load();
updateGroupSpacing(generalGroup);
// updates group
updatesGroup = new Group(composite, SWT.SHADOW_ETCHED_IN);
updatesGroup.setText(Messages.CreaterepoPreferencePage_updateGroupLabel);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).span(2, 1).hint(10, SWT.DEFAULT).applyTo(updatesGroup);
// don't generate repo metadata, if their timestamps are newer than its rpms
bfeSameFilename = new BooleanFieldEditor(CreaterepoPreferenceConstants.PREF_CHECK_TS,
Messages.CreaterepoPreferencePage_booleanCheckTS, updatesGroup);
bfeSameFilename.fillIntoGrid(updatesGroup, 2);
bfeSameFilename.setPreferenceStore(preferenceStore);
bfeSameFilename.setPropertyChangeListener(this);
bfeSameFilename.load();
// note of caution
lblCheckTs = new Label(updatesGroup, SWT.WRAP);
lblCheckTs.setText(Messages.CreaterepoPreferencePage_checkTSNote);
layoutData = new GridData();
layoutData.widthHint = 130;
layoutData.horizontalAlignment = SWT.FILL;
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalIndent = 5;
lblCheckTs.setLayoutData(layoutData);
updateGroupSpacing(updatesGroup);
// changelog group
changelogGroup = new Group(composite, SWT.SHADOW_ETCHED_IN);
changelogGroup.setText(Messages.CreaterepoPreferencePage_changelogGroupLabel);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).span(2, 1).hint(10, SWT.DEFAULT).applyTo(changelogGroup);
// don't generate repo metadata, if their timestamps are newer than its rpms
ifeChangelogLimit = new IntegerFieldEditor(CreaterepoPreferenceConstants.PREF_CHANGELOG_LIMIT,
Messages.CreaterepoPreferencePage_numChangelogLimit, changelogGroup);
ifeChangelogLimit.fillIntoGrid(changelogGroup, 2);
ifeChangelogLimit.setValidRange(0, Integer.MAX_VALUE);
ifeChangelogLimit.setPreferenceStore(preferenceStore);
ifeChangelogLimit.setPropertyChangeListener(this);
ifeChangelogLimit.load();
updateGroupSpacing(changelogGroup);
checksumsContainer = new Composite(composite, SWT.NONE);
checksumsContainer.setLayout(new GridLayout());
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).indent(0, 20).grab(true, false).applyTo(checksumsContainer);
// available checksums
rgfeChecksums = new RadioGroupFieldEditor(CreaterepoPreferenceConstants.PREF_CHECKSUM,
Messages.CreaterepoPreferencePage_checksumGroupLabel, 1, new String[][]{
{ICreaterepoChecksums.SHA1, ICreaterepoChecksums.SHA1},
{ICreaterepoChecksums.MD5, ICreaterepoChecksums.MD5},
{ICreaterepoChecksums.SHA256, ICreaterepoChecksums.SHA256},
{ICreaterepoChecksums.SHA512, ICreaterepoChecksums.SHA512}
}, checksumsContainer, true);
rgfeChecksums.setPreferenceStore(preferenceStore);
rgfeChecksums.setPropertyChangeListener(this);
rgfeChecksums.load();
compressContainer = new Composite(composite, SWT.NONE);
compressContainer.setLayout(new GridLayout());
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).indent(0, 20).grab(true, false).applyTo(compressContainer);
// available compression types
rgfeCompressionTypes = new RadioGroupFieldEditor(CreaterepoPreferenceConstants.PREF_COMPRESSION_TYPE,
Messages.CreaterepoPreferencePage_compressionGroupLabel, 1, new String[][]{
{ICreaterepoCompressionTypes.COMPAT, ICreaterepoCompressionTypes.COMPAT},
{ICreaterepoCompressionTypes.XZ, ICreaterepoCompressionTypes.XZ},
{ICreaterepoCompressionTypes.GZ, ICreaterepoCompressionTypes.GZ},
{ICreaterepoCompressionTypes.BZ2, ICreaterepoCompressionTypes.BZ2}
}, compressContainer, true);
rgfeCompressionTypes.setPreferenceStore(preferenceStore);
rgfeCompressionTypes.setPropertyChangeListener(this);
rgfeCompressionTypes.load();
toggleEnabled();
return composite;
}
@Override
public void performDefaults() {
// load the defaults UI
btnProjectSettings.setSelection(Activator.getDefault().getPreferenceStore()
.getDefaultBoolean(CreaterepoPreferenceConstants.PREF_GENERAL_ENABLED));
bfeIncludeChecksum.loadDefault();
bfeSQLDB.loadDefault();
bfeIgnoreSymlinks.loadDefault();
bfePrettyXML.loadDefault();
ifeSpawns.loadDefault();
rgfeChecksums.loadDefault();
bfeSameFilename.loadDefault();
ifeChangelogLimit.loadDefault();
rgfeChecksums.loadDefault();
rgfeCompressionTypes.loadDefault();
// set the defaults preferences
Activator.getDefault().getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_GENERAL_ENABLED);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_GENERATE_DB);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_IGNORE_SYMLINKS);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_PRETTY_XML);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_WORKERS);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_CHECK_TS);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_CHANGELOG_LIMIT);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_CHECKSUM);
getPreferenceStore().setToDefault(CreaterepoPreferenceConstants.PREF_COMPRESSION_TYPE);
toggleEnabled();
}
@Override
public boolean performOk() {
// only save when using project specific settings
if (btnProjectSettings.getSelection()) {
Activator.getDefault().getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_GENERAL_ENABLED,
true);
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME,
bfeIncludeChecksum.getBooleanValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_GENERATE_DB,
bfeSQLDB.getBooleanValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_IGNORE_SYMLINKS,
bfeIgnoreSymlinks.getBooleanValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_PRETTY_XML,
bfePrettyXML.getBooleanValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_WORKERS,
ifeSpawns.getIntValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_CHECK_TS,
bfeSameFilename.getBooleanValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_CHANGELOG_LIMIT,
ifeChangelogLimit.getIntValue());
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_CHECKSUM,
getSelectedRadioButton(rgfeChecksums.getRadioBoxControl(checksumsContainer),
rgfeChecksums.getPreferenceName()));
getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_COMPRESSION_TYPE,
getSelectedRadioButton(rgfeCompressionTypes.getRadioBoxControl(compressContainer),
rgfeCompressionTypes.getPreferenceName()));
} else {
Activator.getDefault().getPreferenceStore().setValue(CreaterepoPreferenceConstants.PREF_GENERAL_ENABLED,
false);
}
return true;
}
/**
* Helper method to get the selected radio button from the radio button list.
* The default value of the preference key will be returned if nothing was found to be
* selected.
*
* @param radioBoxControl The radio button list.
* @param preferenceKey The preference key to get the default from.
* @return The selected radio button or the default value if nothing selected.
*/
private String getSelectedRadioButton(Composite radioBoxControl, String preferenceKey) {
String defaultValue = getPreferenceStore().getDefaultString(preferenceKey);
Control[] children = radioBoxControl.getChildren();
if (children.length > 0) {
for (Control control : children) {
Button radioButton = (Button) control;
if (radioButton.getSelection()) {
return radioButton.getText();
}
}
}
return defaultValue;
}
@Override
protected void checkState() {
// if enable project specific settings is false, then allow performOk
if (!btnProjectSettings.getSelection()) {
setErrorMessage(null);
setValid(true);
// if the spawns are invalid, disable performOk
} else if (!ifeSpawns.isValid()) {
setErrorMessage(ifeSpawns.getErrorMessage());
setValid(false);
} else if (!ifeChangelogLimit.isValid()) {
setErrorMessage(ifeChangelogLimit.getErrorMessage());
setValid(false);
// otherwise, allow performOk
} else {
setErrorMessage(null);
setValid(true);
}
toggleEnabled();
}
/**
* If "Enable project specific settings" is true, so will
* the options below it. The workspace settings link will be opposite
* to what value the checkbox is.
*/
private void toggleEnabled() {
boolean enabled = btnProjectSettings.getSelection();
lnWorkspaceSettings.setEnabled(!enabled);
bfeIncludeChecksum.setEnabled(enabled, generalGroup);
bfeSQLDB.setEnabled(enabled, generalGroup);
bfeIgnoreSymlinks.setEnabled(enabled, generalGroup);
bfePrettyXML.setEnabled(enabled, generalGroup);
ifeSpawns.setEnabled(enabled, generalGroup);
rgfeChecksums.setEnabled(enabled, generalGroup);
bfeSameFilename.setEnabled(enabled, updatesGroup);
ifeChangelogLimit.setEnabled(enabled, changelogGroup);
rgfeChecksums.setEnabled(enabled, checksumsContainer);
rgfeCompressionTypes.setEnabled(enabled, compressContainer);
lblCheckTs.setEnabled(enabled);
}
}