package org.objectstyle.wolips.bindings.preferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
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.IWorkbenchPreferencePage;
import org.objectstyle.wolips.bindings.Activator;
import org.objectstyle.wolips.bindings.wod.BindingValidationRule;
import org.objectstyle.wolips.core.CorePlugin;
import org.objectstyle.wolips.preferences.TableViewerSupport;
/**
* The preference page to add / edit / remove BindingValidationRules.
*
* @author Naoki Takezoe
* @see tk.eclipse.plugin.htmleditor.tasktag.IBindingValidationRuleDetector
* @see tk.eclipse.plugin.htmleditor.tasktag.BindingValidationRule
* @see tk.eclipse.plugin.htmleditor.HTMLProjectBuilder
*/
public class BindingValidationRulePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private TableViewer _viewer;
private List<BindingValidationRule> _model = new ArrayList<BindingValidationRule>();
private List<BindingValidationRule> _oldModel = new ArrayList<BindingValidationRule>();
public BindingValidationRulePreferencePage() {
setTitle("Binding Validation Rules");
setDescription("Binding validation rules let you specify the regex for components and the regexes for valid binding values on those components. For instance, component .*\\.MDT.* and binding value ^localizer\\..* would say that any component with MDT in its name that uses a binding value starting with 'localizer\\.' automatically validates.");
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return Activator.getDefault().getPreferenceStore();
}
@Override
protected Control createContents(Composite parent) {
TableViewerSupport support = new TableViewerSupport(_model, parent) {
@Override
protected void initTableViewer(TableViewer viewer) {
Table table = viewer.getTable();
TableColumn col1 = new TableColumn(table, SWT.LEFT);
col1.setText("Component Regex");
col1.setWidth(150);
TableColumn col2 = new TableColumn(table, SWT.LEFT);
col2.setText("Valid Binding Regex");
col2.setWidth(150);
}
@Override
protected Object doAdd() {
BindingValidationRuleDialog dialog = new BindingValidationRuleDialog(getShell());
if (dialog.open() == Window.OK) {
return dialog.getBindingValidationRule();
}
return null;
}
@Override
protected void doEdit(Object obj) {
BindingValidationRule bindingValidationRule = (BindingValidationRule) obj;
BindingValidationRuleDialog dialog = new BindingValidationRuleDialog(getShell(), bindingValidationRule);
if (dialog.open() == Window.OK) {
BindingValidationRule newElement = dialog.getBindingValidationRule();
bindingValidationRule.setTypeRegex(newElement.getTypeRegex());
bindingValidationRule.setValidBindingRegex(newElement.getValidBindingRegex());
}
}
@Override
protected ITableLabelProvider createLabelProvider() {
return new ITableLabelProvider() {
public Image getColumnImage(Object _tagShortcut, int columnIndex) {
return null;
}
public String getColumnText(Object bindingValidationRule, int columnIndex) {
switch (columnIndex) {
case 0:
return ((BindingValidationRule) bindingValidationRule).getTypeRegex();
case 1:
return ((BindingValidationRule) bindingValidationRule).getValidBindingRegex();
default:
return bindingValidationRule.toString();
}
}
public void addListener(ILabelProviderListener listener) {
// DO NOTHING
}
public void dispose() {
// DO NOTHING
}
public boolean isLabelProperty(Object bindingValidationRule, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
// DO NOTHING
}
};
}
};
_viewer = support.getTableViewer();
_model.addAll(BindingValidationRule.fromPreferenceString(getPreferenceStore().getString(PreferenceConstants.BINDING_VALIDATION_RULES_KEY)));
syncModels();
_viewer.refresh();
return support.getControl();
}
@Override
protected void performDefaults() {
_model.clear();
_model.addAll(BindingValidationRule.fromPreferenceString(getPreferenceStore().getDefaultString(PreferenceConstants.BINDING_VALIDATION_RULES_KEY)));
_viewer.refresh();
processChange();
}
@Override
public boolean performOk() {
getPreferenceStore().setValue(PreferenceConstants.BINDING_VALIDATION_RULES_KEY, BindingValidationRule.toPreferenceString(_model));
processChange();
CorePlugin.getDefault().savePluginPreferences();
return true;
}
private void syncModels() {
try {
_oldModel.clear();
for (int i = 0; i < _model.size(); i++) {
_oldModel.add(_model.get(i).clone());
}
}
catch (Exception ex) {
CorePlugin.getDefault().log(ex);
}
}
public void init(IWorkbench workbench) {
// DO NOTHING
}
private void processChange() {
if (BindingValidationRule.hasChange(_oldModel, _model)) {
syncModels();
// try {
// IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
// IProject[] projects = root.getProjects();
// for (int i = 0; i < projects.length; i++) {
// IProjectAdapter wolipsProjectAdaptor = (IProjectAdapter) projects[i].getAdapter(IProjectAdapter.class);
// if (wolipsProjectAdaptor != null) {
// projects[i].build(IncrementalProjectBuilder.CLEAN_BUILD, new NullProgressMonitor());
// }
// }
// }
// catch (Exception ex) {
// Activator.getDefault().log(ex);
// }
}
}
/**
* The dialog to add / edit BindingValidationRules.
*/
private class BindingValidationRuleDialog extends Dialog {
private Text _typeRegex;
private Text _validBindingRegex;
private BindingValidationRule _bindingValidationRule;
public BindingValidationRuleDialog(Shell parentShell) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
public BindingValidationRuleDialog(Shell parentShell, BindingValidationRule bindingValidationRule) {
super(parentShell);
_bindingValidationRule = bindingValidationRule;
}
@Override
protected Point getInitialSize() {
Point size = super.getInitialSize();
size.x = 300;
return size;
}
@Override
protected Control createDialogArea(Composite parent) {
getShell().setText("Tag Shortcut");
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setLayout(new GridLayout(2, false));
Label label = new Label(composite, SWT.NULL);
label.setText("Component Regex");
_typeRegex = new Text(composite, SWT.BORDER);
if (_bindingValidationRule != null) {
_typeRegex.setText(_bindingValidationRule.getTypeRegex());
}
_typeRegex.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
label = new Label(composite, SWT.NULL);
label.setText("Valid Binding Regex");
_validBindingRegex = new Text(composite, SWT.BORDER);
if (_bindingValidationRule != null) {
_validBindingRegex.setText(_bindingValidationRule.getValidBindingRegex());
}
_validBindingRegex.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return composite;
}
@Override
protected void okPressed() {
if (_typeRegex.getText().length() == 0) {
MessageDialog.openError(getParentShell(), "Component Regex Required", "You must set a component regex.");
return;
}
if (_validBindingRegex.getText().length() == 0) {
MessageDialog.openError(getParentShell(), "Valid Binding Regex Required", "You must set a valid binding regex.");
return;
}
String typeRegex = _typeRegex.getText();
String validBindingRegex = _validBindingRegex.getText();
_bindingValidationRule = new BindingValidationRule(typeRegex, validBindingRegex);
super.okPressed();
}
public BindingValidationRule getBindingValidationRule() {
return _bindingValidationRule;
}
}
}