/* * 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; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.teiid.core.designer.util.I18nUtil; import org.teiid.designer.query.sql.lang.ICompoundCriteria; import org.teiid.designer.query.sql.lang.ICriteria; import org.teiid.designer.query.sql.lang.ILanguageObject; import org.teiid.designer.query.sql.lang.INotCriteria; import org.teiid.designer.query.sql.lang.IPredicateCriteria; import org.teiid.designer.transformation.ui.builder.actions.AndCriteriaAction; import org.teiid.designer.transformation.ui.builder.actions.NotCriteriaAction; import org.teiid.designer.transformation.ui.builder.actions.OrCriteriaAction; import org.teiid.designer.transformation.ui.builder.criteria.CriteriaEditor; import org.teiid.query.ui.builder.model.CriteriaEditorModel; /** * CriteriaBuilder * * @since 8.0 */ public class CriteriaBuilder extends AbstractLanguageObjectBuilder { private static final String PREFIX = I18nUtil.getPropertyPrefix(CriteriaBuilder.class); private IAction andAction; private IAction notAction; private IAction orAction; private CriteriaEditor editor; public CriteriaBuilder( Shell theShell ) { super(theShell, Util.getString(PREFIX + "title")); //$NON-NLS-1$ setSizeRelativeToScreen(80, 80); setCenterOnDisplay(true); } /** * @see org.teiid.designer.transformation.ui.builder.AbstractLanguageObjectBuilder#createTreeButtons(org.eclipse.swt.widgets.Composite) */ @Override protected void createTreeButtons( Composite theParent ) { super.createTreeButtons(theParent); // add the AndCriteriaAction Runnable andRunner = new Runnable() { @Override public void run() { handleAndSelected(); } }; andAction = new AndCriteriaAction(theParent, andRunner); // add the OrCriteriaAction Runnable orRunner = new Runnable() { @Override public void run() { handleOrSelected(); } }; orAction = new OrCriteriaAction(theParent, orRunner); // add the NotCriteriaAction Runnable notRunner = new Runnable() { @Override public void run() { handleNotSelected(); } }; notAction = new NotCriteriaAction(theParent, notRunner); } @Override protected void fillContextMenu( IMenuManager theMenuMgr ) { super.fillContextMenu(theMenuMgr); theMenuMgr.add(andAction); theMenuMgr.add(orAction); theMenuMgr.add(notAction); } /** * @see org.teiid.designer.transformation.ui.builder.AbstractLanguageObjectBuilder#createEditorDetails(org.eclipse.swt.widgets.Composite) */ @Override protected ILanguageObjectEditor createEditor( Composite theParent ) { editor = new CriteriaEditor(theParent, new CriteriaEditorModel()); // needs to be done after construction because buttons aren't created yet getButton(IDialogConstants.OK_ID).setToolTipText(Util.getString(PREFIX + "okButton.tip")); //$NON-NLS-1$ getButton(IDialogConstants.CANCEL_ID).setToolTipText(Util.getString(PREFIX + "cancelButton.tip")); //$NON-NLS-1$ return editor; } /** * @see org.teiid.designer.transformation.ui.builder.AbstractLanguageObjectBuilder#getTitle() */ @Override public String getTitle() { return Util.getString(PREFIX + "title"); //$NON-NLS-1$ } void handleAndSelected() { getTreeViewer().addUndefinedAndCriteria(); } void handleNotSelected() { getTreeViewer().modifyNotCriteriaStatus(); } void handleOrSelected() { getTreeViewer().addUndefinedOrCriteria(); } /** * @see org.teiid.designer.transformation.ui.builder.AbstractLanguageObjectBuilder#setEditorLanguageObject(org.teiid.query.sql.LanguageObject) */ @Override protected void setEditorLanguageObject( ILanguageObject theEditorLangObj ) { if (theEditorLangObj instanceof ICompoundCriteria) { getEditor().clear(); } else if (theEditorLangObj instanceof INotCriteria) { setEditorLanguageObject(((INotCriteria)theEditorLangObj).getCriteria()); } else { getEditor().setLanguageObject(theEditorLangObj); } } /** * @see org.teiid.designer.transformation.ui.builder.AbstractLanguageObjectBuilder#setEnabledStatus() */ @Override protected void setEnabledStatus() { super.setEnabledStatus(); Object selectedObj = getTreeViewer().getSelectedObject(); // use the object currently in the editor setEnabledStatus((selectedObj instanceof ILanguageObject) ? (ILanguageObject)selectedObj : null); } private void setEnabledStatus( ILanguageObject theLangObj ) { if (getTreeViewer().isUndefined(theLangObj)) { andAction.setEnabled(false); orAction.setEnabled(false); notAction.setEnabled(false); // Must enable the editor, else cannot define an object editor.setEnabled(true); } else { boolean enableEditor = true; if (theLangObj instanceof IPredicateCriteria) { andAction.setEnabled(true); orAction.setEnabled(true); notAction.setEnabled(true); } else if (theLangObj instanceof ICompoundCriteria) { // if an undefined node already exists don't allow another one ICompoundCriteria crit = (ICompoundCriteria)theLangObj; notAction.setEnabled(true); if (!getTreeViewer().hasUndefinedChild(theLangObj)) { if (crit.getOperator() == ICompoundCriteria.AND) { andAction.setEnabled(true); orAction.setEnabled(false); } else { andAction.setEnabled(false); orAction.setEnabled(true); } } else { andAction.setEnabled(false); orAction.setEnabled(false); } // editor.clear(); enableEditor = false; } else if (theLangObj instanceof INotCriteria) { INotCriteria notCrit = (INotCriteria)theLangObj; ICriteria subCrit = notCrit.getCriteria(); setEnabledStatus(subCrit); return; } else { andAction.setEnabled(false); orAction.setEnabled(false); notAction.setEnabled(false); enableEditor = false; } editor.setEnabled(enableEditor); this.btnReset.setEnabled(enableEditor); this.btnSet.setEnabled(enableEditor); } } }