/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.transformation.ui.builder.criteria; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.teiid.core.designer.util.I18nUtil; import org.teiid.designer.query.sql.lang.ICriteria; import org.teiid.designer.transformation.ui.builder.AbstractCompositeLanguageObjectEditor; import org.teiid.designer.transformation.ui.builder.ILanguageObjectEditor; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.util.WidgetUtil; import org.teiid.query.ui.builder.model.CompositeLanguageObjectEditorModel; import org.teiid.query.ui.builder.model.CriteriaEditorModel; import org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener; import org.teiid.query.ui.builder.model.LanguageObjectEditorModelEvent; /** * CriteriaEditor * * @since 8.0 */ public class CriteriaEditor extends AbstractCompositeLanguageObjectEditor { private static final String PREFIX = I18nUtil.getPropertyPrefix(CriteriaEditor.class); private ViewController controller; private IPredicateCriteriaTypeEditor defaultEditor; private Map leftControls; private StackLayout leftStack; CriteriaEditorModel model; private Map rightControls; private StackLayout rightStack; private Map typeEditorMap; private Combo cbxOperator; private Composite leftEditorContent; private Composite rightEditorContent; private Composite pnlLeft; private Composite pnlRight; public CriteriaEditor( Composite theParent, CriteriaEditorModel theModel ) { super(theParent, ICriteria.class, theModel); model = theModel; controller = new ViewController(); model.addModelListener(controller); // fill combo with operators from model cbxOperator.setItems(model.getOperators()); // start the controller controller.initialize(); } /** * @see org.teiid.designer.transformation.ui.builder.AbstractCompositeLanguageObjectEditor#createEditors(org.eclipse.swt.widgets.Composite) */ @Override protected List createEditors( Composite theParent ) { typeEditorMap = new HashMap(); leftControls = new HashMap(); leftStack = new StackLayout(); rightControls = new HashMap(); rightStack = new StackLayout(); final SashForm editorSplitter = WidgetFactory.createSplitter(theParent, SWT.HORIZONTAL); leftEditorContent = WidgetFactory.createPanel(editorSplitter, SWT.NONE, GridData.FILL_BOTH, 1, 1); pnlLeft = new Composite(leftEditorContent, SWT.NONE); pnlLeft.setLayoutData(new GridData(GridData.FILL_BOTH)); pnlLeft.setLayout(leftStack); rightEditorContent = WidgetFactory.createPanel(editorSplitter, SWT.NONE, GridData.FILL_BOTH, 1, 2); cbxOperator = WidgetFactory.createCombo(rightEditorContent, SWT.BORDER | SWT.READ_ONLY); cbxOperator.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent theEvent ) { handleOperatorSelected(); } }); pnlRight = new Composite(rightEditorContent, SWT.NONE); pnlRight.setLayoutData(new GridData(GridData.FILL_BOTH)); pnlRight.setLayout(rightStack); CriteriaEditorModel model = (CriteriaEditorModel)getModel(); IPredicateCriteriaTypeEditor[] criteriaEditors = new IPredicateCriteriaTypeEditor[] { new CompareCriteriaEditor(theParent, model.getCompareCriteriaEditorModel()), new IsNullCriteriaEditor(theParent, model.getIsNullCriteriaEditorModel()), new MatchCriteriaEditor(theParent, model.getMatchCriteriaEditorModel()), new SetCriteriaEditor(theParent, model.getSetCriteriaEditorModel())}; for (int i = 0; i < criteriaEditors.length; i++) { Class criteriaType = criteriaEditors[i].getEditorType(); typeEditorMap.put(criteriaType, criteriaEditors[i]); // create left UI and cache it Control leftControl = criteriaEditors[i].createLeftComponent(pnlLeft); if (leftControl == null) { leftControl = new Composite(pnlLeft, SWT.NONE); } leftControls.put(criteriaType, leftControl); // create right UI Control rightControl = criteriaEditors[i].createRightComponent(pnlRight); if (rightControl == null) { rightControl = new Composite(pnlRight, SWT.NONE); } rightControls.put(criteriaType, rightControl); if (i == 0) { defaultEditor = criteriaEditors[i]; } } return Arrays.asList(criteriaEditors); } void displayModelChangeUi() { Class criteriaType = model.getCurrentModel().getModelType(); // change left panel if necessary Control control = (Control)leftControls.get(criteriaType); if (control != leftStack.topControl) { leftStack.topControl = control; pnlLeft.layout(); } // change right panel if necessary control = (Control)rightControls.get(criteriaType); if (control != rightStack.topControl) { rightStack.topControl = control; pnlRight.layout(); } setCurrentEditor((ILanguageObjectEditor)typeEditorMap.get(criteriaType)); } void displayOperatorUi() { String operator = model.getOperator(); cbxOperator.setText(operator); } /** * @see org.teiid.designer.transformation.ui.builder.AbstractCompositeLanguageObjectEditor#getDefaultEditor() */ @Override protected ILanguageObjectEditor getDefaultEditor() { return defaultEditor; } /** * @see org.teiid.designer.transformation.ui.builder.ILanguageObjectEditor#getTitle() */ @Override public String getTitle() { return Util.getString(PREFIX + "title"); //$NON-NLS-1$ } /** * @see org.teiid.designer.transformation.ui.builder.ILanguageObjectEditor#getToolTipText() */ @Override public String getToolTipText() { return Util.getString(PREFIX + "tip"); //$NON-NLS-1$ } void handleOperatorSelected() { model.setOperator(cbxOperator.getText()); cbxOperator.setToolTipText(getCurrentEditor().getToolTipText()); } @Override public void setEnabled( boolean theEnableFlag ) { super.setEnabled(theEnableFlag); if (theEnableFlag) { WidgetUtil.enable(leftEditorContent); WidgetUtil.enable(rightEditorContent); } else { WidgetUtil.disable(leftEditorContent); WidgetUtil.disable(rightEditorContent); } } /** * The <code>ViewController</code> class is a view controller for the <code>ConstantEditor</code>. */ class ViewController implements ILanguageObjectEditorModelListener { public void initialize() { // get first operator and criteria editor to show Display.getDefault().asyncExec(new Runnable() { @Override public void run() { modelChanged(new LanguageObjectEditorModelEvent(model, CompositeLanguageObjectEditorModel.MODEL_CHANGE)); } }); } /** * @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener#modelChanged(org.teiid.query.ui.builder.model.LanguageObjectEditorModelEvent) */ @Override public void modelChanged( LanguageObjectEditorModelEvent theEvent ) { String type = theEvent.getType(); if (type.equals(LanguageObjectEditorModelEvent.SAVED)) { modelChanged(new LanguageObjectEditorModelEvent(model, CompositeLanguageObjectEditorModel.MODEL_CHANGE)); } else if (type.equals(CriteriaEditorModel.OPERATOR)) { displayOperatorUi(); } else if (type.equals(CompositeLanguageObjectEditorModel.MODEL_CHANGE)) { displayModelChangeUi(); displayOperatorUi(); } } } }