package org.jbehave.eclipse.preferences;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.ControlEnableState;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
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.ui.IWorkbench;
import org.eclipse.ui.dialogs.PropertyPage;
import org.jbehave.eclipse.Activator;
import org.osgi.service.prefs.BackingStoreException;
public class LoggerPreferencePage extends PropertyPage implements org.eclipse.ui.IWorkbenchPreferencePage {
private IProject project;
private Button enableProjectSpecific;
private LoggerPreferences prefs;
private ControlEnableState blockEnableState;
private LoggerEntriesComposite loggerEntriesComposite;
/**
* Create the property page.
*/
public LoggerPreferencePage() {
setTitle("Configure the Logger levels");
setDescription("Configure the level threshold of the loggers");
}
/**
* Create contents of the property page.
* @param parent
*/
@Override
public Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(2, false));
if (isProjectPreferencePage()) {
enableProjectSpecific = new Button(container, SWT.CHECK);
enableProjectSpecific.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
enableProjectSpecific.setText("Enable project specific settings");
enableProjectSpecific.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
adjustProjectSpecificState();
}
public void widgetDefaultSelected(SelectionEvent event) {
adjustProjectSpecificState();
}
});
}
loggerEntriesComposite = new LoggerEntriesComposite(container, SWT.NONE);
loggerEntriesComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
reload();
updatePageWithPrefs();
return container;
}
public void init(IWorkbench workbench) {
}
@Override
public void setElement(final IAdaptable element) {
project = (IProject) element.getAdapter(IResource.class);
super.setElement(element);
}
private boolean isProjectPreferencePage() {
return project != null;
}
@Override
protected void contributeButtons(Composite parent) {
((GridLayout) parent.getLayout()).numColumns++;
int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
Button defaultsButton = new Button(parent, SWT.PUSH);
defaultsButton.setText("Reload");
Dialog.applyDialogFont(defaultsButton);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
Point minButtonSize = defaultsButton.computeSize(SWT.DEFAULT,
SWT.DEFAULT, true);
data.widthHint = Math.max(widthHint, minButtonSize.x);
defaultsButton.setLayoutData(data);
defaultsButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
performReload();
}
});
super.contributeButtons(parent);
}
@Override
public boolean performOk() {
try {
updatePrefsWithPage();
if (isProjectPreferencePage()
&& !enableProjectSpecific.getSelection()) {
prefs.removeAllSpecificSettings();
} else {
prefs.store();
}
} catch (final BackingStoreException e) {
Activator.logError("Failed to store ClassScanner preferences", e);
}
return super.performOk();
}
@Override
protected void performDefaults() {
try {
prefs.removeAllSpecificSettings();
} catch (BackingStoreException e) {
Activator.logError("Failed to remove specific settings", e);
}
reload();
updatePageWithPrefs();
super.performDefaults();
}
protected void performReload () {
reload();
updatePageWithPrefs();
super.performDefaults();
}
private void reload() {
if (project == null) {
prefs = new LoggerPreferences();
} else {
prefs = new LoggerPreferences(project);
}
try {
prefs.load();
} catch (BackingStoreException e) {
Activator.logError("Failed to load preferences", e);
}
}
private void updatePrefsWithPage() {
if (isProjectPreferencePage()) {
boolean isProjectSpecific = enableProjectSpecific.getSelection();
prefs.setUseProjectSettings(isProjectSpecific);
}
}
private void updatePageWithPrefs() {
loggerEntriesComposite.setInput(prefs);
if (isProjectPreferencePage()) {
enableProjectSpecific.setSelection(prefs.isUseProjectSettings());
adjustProjectSpecificState();
}
}
private void adjustProjectSpecificState() {
boolean useProjectSpecificSettings = enableProjectSpecific.getSelection();
if (useProjectSpecificSettings) {
if (blockEnableState != null) {
blockEnableState.restore();
blockEnableState = null;
}
} else {
if (blockEnableState == null) {
blockEnableState = ControlEnableState.disable(loggerEntriesComposite);
}
}
}
}