/**
*
*/
package org.objectstyle.wolips.eomodeler.editors.qualifier;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.objectstyle.wolips.eomodeler.core.model.qualifier.EOAggregateQualifier;
import org.objectstyle.wolips.eomodeler.core.model.qualifier.EOQualifier;
import org.objectstyle.wolips.eomodeler.core.model.qualifier.EOTruePredicate;
public abstract class AggregateQualifierTypeEditor extends AbstractQualifierTypeEditor implements IQualifierEditorListener {
private List<EOQualifierEditor> _editors;
public AggregateQualifierTypeEditor(Composite parent, int style) {
super(parent, style);
_editors = new LinkedList<EOQualifierEditor>();
GridLayout layout = new GridLayout(1, 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);
}
public void setQualifier(EOQualifier qualifier) {
for (EOQualifierEditor editor : _editors) {
editor.dispose();
}
_editors.clear();
List<EOQualifier> qualifiers;
if (qualifier instanceof EOAggregateQualifier) {
EOAggregateQualifier andQualifier = (EOAggregateQualifier) qualifier;
qualifiers = andQualifier.getQualifiers();
} else {
qualifiers = new LinkedList<EOQualifier>();
qualifiers.add(qualifier);
}
if (qualifiers.size() == 1) {
qualifiers.add(new EOTruePredicate());
}
for (EOQualifier childQualifier : qualifiers) {
EOQualifierEditor childEditor = createEditor();
childEditor.setQualifier(childQualifier);
_editors.add(childEditor);
}
}
public EOQualifier getQualifier() {
List<EOQualifier> qualifiers = new LinkedList<EOQualifier>();
for (EOQualifierEditor editor : _editors) {
EOQualifier childQualifier = editor.getQualifier();
if (childQualifier != null) {
qualifiers.add(childQualifier);
}
}
EOQualifier qualifier;
if (qualifiers.isEmpty()) {
qualifier = null;
} else if (qualifiers.size() == 1) {
qualifier = qualifiers.get(0);
} else {
EOAggregateQualifier aggregateQualifier = createQualifier();
aggregateQualifier.getQualifiers().addAll(qualifiers);
qualifier = aggregateQualifier;
}
return qualifier;
}
protected EOQualifierEditor createEditor() {
EOQualifierEditor childEditor = new EOQualifierEditor(this, SWT.NONE);
childEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
childEditor.setQualifierEditorListener(this);
return childEditor;
}
public void qualifierAddedAbove(EOQualifierEditor editor) {
int index = _editors.indexOf(editor);
EOQualifierEditor newEditor = createEditor();
_editors.add(index, newEditor);
newEditor.moveAbove(editor);
layout(true, true);
getParent().layout(true, true);
}
public void qualifierAddedBelow(EOQualifierEditor editor) {
int index = _editors.indexOf(editor);
EOQualifierEditor newEditor = createEditor();
_editors.add(index + 1, newEditor);
newEditor.moveBelow(editor);
layout(true, true);
getParent().layout(true, true);
}
public void qualifierRemoved(EOQualifierEditor editor) {
_editors.remove(editor);
editor.dispose();
if (_editors.size() == 1) {
IQualifierTypeEditorListener listener = getQualifierTypeEditorListener();
if (listener != null) {
listener.qualifierTypeChanged(this);
}
}
layout(true, true);
getParent().layout(true, true);
}
protected abstract EOAggregateQualifier createQualifier();
}