package org.objectstyle.wolips.eomodeler.editors.qualifier;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
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.objectstyle.wolips.eomodeler.core.model.qualifier.EOAggregateQualifier;
import org.objectstyle.wolips.eomodeler.core.model.qualifier.EOQualifier;
public class EOQualifierEditor extends Composite implements IQualifierTypeEditorListener {
private ComboViewer _typeCombo;
private Composite _typeEditorContainer;
private Button _removeButton;
private Button _addButton;
private IQualifierType _qualifierType;
private AbstractQualifierTypeEditor _typeEditor;
private boolean _settingQualifier;
private IQualifierType[] _qualifierTypes = new IQualifierType[] { new ExpressionQualifierType(), new SelectKeyQualifierType(), new KeyValueQualifierType(), new AndQualifierType(), new OrQualifierType(), new NotQualifierType() };
private IQualifierEditorListener _listener;
public EOQualifierEditor(Composite parent, int style) {
super(parent, style);
GridLayout layout = new GridLayout(4, false);
layout.marginLeft = 0;
layout.marginRight = 0;
layout.marginWidth = 0;
layout.marginTop = 0;
layout.marginBottom = 0;
layout.marginHeight = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
setLayout(layout);
_typeCombo = new ComboViewer(this, SWT.READ_ONLY);
_typeCombo.add(_qualifierTypes);
_typeCombo.addSelectionChangedListener(new TypeSelectionHandler());
_typeCombo.getCombo().setLayoutData(new GridData());
_typeEditorContainer = new Composite(this, SWT.NONE);
_typeEditorContainer.setLayout(new FillLayout(SWT.HORIZONTAL));
_typeEditorContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
public void setQualifierEditorListener(IQualifierEditorListener listener) {
_listener = listener;
}
public IQualifierEditorListener getQualifierEditorListener() {
return _listener;
}
protected void createButtons() {
_removeButton = new Button(this, SWT.PUSH);
_removeButton.setText("-");
_removeButton.setLayoutData(new GridData());
_removeButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
IQualifierEditorListener listener = getQualifierEditorListener();
if (listener != null) {
listener.qualifierRemoved(EOQualifierEditor.this);
}
}
});
_addButton = new Button(this, SWT.PUSH);
_addButton.setText("+");
_addButton.setLayoutData(new GridData());
_addButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
IQualifierEditorListener listener = getQualifierEditorListener();
if (listener != null) {
listener.qualifierAddedBelow(EOQualifierEditor.this);
}
}
});
}
public EOQualifier getQualifier() {
return (_typeEditor == null) ? null : _typeEditor.getQualifier();
}
public void setQualifier(EOQualifier qualifier) {
IQualifierType matchingQualifierType = null;
for (IQualifierType qualifierType : _qualifierTypes) {
if (!(qualifierType instanceof ExpressionQualifierType) && qualifierType.isTypeFor(qualifier)) {
matchingQualifierType = qualifierType;
}
}
if (matchingQualifierType == null) {
for (IQualifierType qualifierType : _qualifierTypes) {
if (qualifierType instanceof ExpressionQualifierType) {
matchingQualifierType = qualifierType;
}
}
}
_settingQualifier = true;
try {
_typeCombo.setSelection(new StructuredSelection(matchingQualifierType));
_typeEditor.setQualifier(qualifier);
refreshQualifierTypes();
} finally {
_settingQualifier = false;
}
}
protected void typeChanged() {
IStructuredSelection selection = (IStructuredSelection) _typeCombo.getSelection();
IQualifierType selectedQualifierType = (IQualifierType) selection.getFirstElement();
if (selectedQualifierType != null && _qualifierType != selectedQualifierType) {
EOQualifier previousQualifier = getQualifier();
if (_typeEditor != null) {
_typeEditor.dispose();
_typeEditor = null;
}
_qualifierType = selectedQualifierType;
if (_qualifierType != null) {
_typeEditor = _qualifierType.createEditor(_typeEditorContainer);
_typeEditor.setQualifierTypeEditorListener(this);
// _typeEditor.setLayoutData(new
// GridData(GridData.FILL_HORIZONTAL));
}
if (!_settingQualifier) {
_typeEditor.setQualifier(previousQualifier);
refreshQualifierTypes();
}
}
// layout(true, true);
getParent().layout(true, true);
}
protected void refreshQualifierTypes() {
// IStructuredSelection selection = (IStructuredSelection)
// _typeCombo.getSelection();
// IQualifierType selectedQualifierType = (IQualifierType)
// selection.getFirstElement();
EOQualifier qualifier = _typeEditor.getQualifier();
for (IQualifierType qualifierType : _qualifierTypes) {
qualifierType.setQualifier(qualifier);
_typeCombo.refresh(qualifierType);
}
boolean buttonsVisible = !(qualifier instanceof EOAggregateQualifier);
if (!buttonsVisible) {
if (_addButton != null) {
_addButton.dispose();
_addButton = null;
}
if (_removeButton != null) {
_removeButton.dispose();
_removeButton = null;
}
((GridLayout) getLayout()).numColumns = 2;
} else {
((GridLayout) getLayout()).numColumns = 4;
createButtons();
}
layout();
}
public void qualifierTypeChanged(AbstractQualifierTypeEditor editor) {
setQualifier(getQualifier());
}
protected class TypeSelectionHandler implements ISelectionChangedListener {
public void selectionChanged(SelectionChangedEvent event) {
EOQualifierEditor.this.typeChanged();
}
}
}