package org.jbehave.eclipse.preferences;
import java.util.Locale;
import org.apache.commons.lang.ArrayUtils;
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.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.dialogs.PropertyPage;
import org.jbehave.core.configuration.Keywords;
import org.jbehave.core.i18n.LocalizedKeywords;
import org.jbehave.eclipse.Activator;
import org.jbehave.eclipse.Keyword;
import org.jbehave.eclipse.KeywordImages;
import org.jbehave.eclipse.util.LocaleUtils;
import org.osgi.service.prefs.BackingStoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProjectPreferencePage extends PropertyPage implements
org.eclipse.ui.IWorkbenchPreferencePage {
private Logger logger = LoggerFactory
.getLogger(ProjectPreferencePage.class);
//
private Combo languageCombo;
private Locale[] locales = { Locale.ENGLISH, Locale.ENGLISH };
private Table table;
private TableViewer localizedKeywords;
private IProject project;
private Button enableProjectSpecific;
private ProjectPreferences prefs;
private ControlEnableState blockEnableState;
private Composite projectComposite;
private Text parameterPrefixText;
/**
* Create the preference page.
*/
public ProjectPreferencePage() {
}
/**
* Create contents of the preference page.
*
* @param parent
*/
@Override
public Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(1, false));
if (isProjectPreferencePage()) {
enableProjectSpecific = new Button(container, SWT.CHECK);
enableProjectSpecific.setLayoutData(new GridData(SWT.LEFT,
SWT.CENTER, false, false, 1, 1));
enableProjectSpecific.setText("Enable project specific settings");
enableProjectSpecific.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
adjustProjectSpecificState();
}
public void widgetDefaultSelected(SelectionEvent event) {
adjustProjectSpecificState();
}
});
}
projectComposite = new Composite(container, SWT.NONE);
projectComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true, 1, 1));
projectComposite.setLayout(new GridLayout(2, false));
Label lblParameterPrefix = new Label(projectComposite, SWT.NONE);
lblParameterPrefix.setSize(87, 14);
lblParameterPrefix.setText("Parameter prefix");
parameterPrefixText = new Text(projectComposite, SWT.NONE | SWT.BORDER);
parameterPrefixText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
false, false, 1, 1));
parameterPrefixText.setSize(100, 22);
Label lblStoryLanguage = new Label(projectComposite, SWT.NONE);
lblStoryLanguage.setSize(87, 14);
lblStoryLanguage.setText("Story Language");
languageCombo = new Combo(projectComposite, SWT.READ_ONLY);
languageCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
false, 1, 1));
languageCombo.setSize(279, 22);
languageCombo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
public void widgetSelected(SelectionEvent event) {
int selectionIndex = languageCombo.getSelectionIndex();
setLanguage(languageCombo.getItem(selectionIndex));
}
});
new Label(projectComposite, SWT.NONE);
new Label(projectComposite, SWT.NONE);
localizedKeywords = new TableViewer(projectComposite,
SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.FULL_SELECTION | SWT.BORDER);
localizedKeywords.setColumnProperties(new String[] { "English",
"Selected" });
localizedKeywords
.setContentProvider(ArrayContentProvider.getInstance());
localizedKeywords.setLabelProvider(new KeywordTableLabelProvider(
Activator.getDefault().getKeywordImages()));
localizedKeywords.setInput(Keyword.values());
table = localizedKeywords.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
table.setSize(371, 289);
table.setHeaderVisible(true);
table.setLinesVisible(true);
// English column serves as reference
TableColumn columnEn = new TableColumn(table, SWT.LEFT);
columnEn.setText("English");
columnEn.setWidth(150);
// selected locale column
TableColumn columnSel = new TableColumn(table, SWT.LEFT);
columnSel.setText("Selected");
columnSel.setWidth(250);
reload();
updatePageWithPrefs();
return container;
}
@Override
public void setElement(final IAdaptable element) {
project = (IProject) element.getAdapter(IResource.class);
super.setElement(element);
}
private boolean isProjectPreferencePage() {
return project != null;
}
private void setLanguage(String language) {
this.locales[1] = LocaleUtils.createLocaleFromCode(language,
Locale.ENGLISH);
this.localizedKeywords.refresh(true);
}
/**
* Initialize the preference page.
*/
public void init(IWorkbench workbench) {
// Initialize the preference page
}
protected void storePrefs() {
try {
updatePrefsWithPage();
if (isProjectPreferencePage()
&& !enableProjectSpecific.getSelection()) {
prefs.removeAllSpecificSettings();
}
prefs.store();
} catch (final BackingStoreException e) {
Activator.logError("Failed to store preferences", e);
}
}
@Override
public boolean performOk() {
storePrefs();
reload();
updatePageWithPrefs();
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();
}
private void reload() {
if (project == null) {
prefs = new ProjectPreferences();
} else {
prefs = new ProjectPreferences(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);
}
prefs.setParameterPrefix(parameterPrefixText.getText());
prefs.setStoryLanguage(locales[1].toString());
logger.debug(
"Updating prefs with story language <{}> and parameter prefix <{}>",
prefs.getStoryLanguage(), prefs.getParameterPrefix());
}
private void updatePageWithPrefs() {
parameterPrefixText.setText(prefs.getParameterPrefix());
String[] langs = prefs.availableStoryLanguages();
String selectedLanguage = prefs.getStoryLanguage();
languageCombo.setItems(langs);
languageCombo.select(ArrayUtils.indexOf(langs, selectedLanguage));
setLanguage(selectedLanguage);
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(projectComposite);
}
}
}
private class KeywordTableLabelProvider extends LabelProvider implements
ITableLabelProvider {
private KeywordImages keywordImages;
public KeywordTableLabelProvider(KeywordImages keywordImages) {
this.keywordImages = keywordImages;
}
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == 0) {
return keywordImages.getImageFor((Keyword) element);
}
return null;
}
public String getColumnText(Object element, int columnIndex) {
return ((Keyword) element).asString(keywordsFor(columnIndex));
}
}
private Keywords keywordsFor(int columnIndex) {
return new LocalizedKeywords(locales[columnIndex]);
}
}