/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.eclipse.rulebuilder.ui; import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine; import org.drools.ide.common.client.modeldriven.brl.BaseSingleFieldConstraint; import org.drools.ide.common.client.modeldriven.brl.CompositeFieldConstraint; import org.drools.ide.common.client.modeldriven.brl.FactPattern; import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; /** * Adding a new constraint for a field of a FactPattern * * @author Anton Arhipov * @author Ahti Kitsik * */ public class AddNewFieldConstraintDialog extends RuleDialog { private final FormToolkit toolkit; private RuleModeller modeller; private FactPattern pattern; private boolean isNested; public AddNewFieldConstraintDialog(Shell parent, FormToolkit toolkit, RuleModeller modeller, FactPattern pattern, boolean isNested) { super( parent, "Update constraints", "Pick the values from combos and confirm the selection." ); this.toolkit = toolkit; this.modeller = modeller; this.pattern = pattern; this.isNested = isNested; } protected Control createDialogArea(final Composite parent) { Composite composite = (Composite) super.createDialogArea( parent ); GridLayout l = new GridLayout(); l.numColumns = 3; l.marginBottom = 0; l.marginHeight = 0; l.marginLeft = 0; l.marginRight = 0; l.marginTop = 0; l.marginWidth = 0; composite.setLayout( l ); GridData gd = new GridData( GridData.FILL_HORIZONTAL ); gd.horizontalSpan = 2; createFieldRestrictionCombo( composite, gd ); createMultipleRestrictionCombo( composite, gd ); createFormulaRow( composite, gd ); if ( !isNested ) { createVariableBindingRow( composite ); } toolkit.paintBordersFor( composite ); return composite; } private void createMultipleRestrictionCombo(Composite composite, GridData gd) { createLabel( composite, "Multiple field constriant" ); final Combo composites = new Combo( composite, SWT.READ_ONLY ); composites.setLayoutData( gd ); composites.add( "..." ); composites.add( "All of (And)" ); composites.add( "Any of (Or)" ); composites.setData( "All of (And)", CompositeFieldConstraint.COMPOSITE_TYPE_AND ); composites.setData( "Any of (Or)", CompositeFieldConstraint.COMPOSITE_TYPE_OR ); composites.select( 0 ); composites.addListener( SWT.Selection, new Listener() { public void handleEvent(Event event) { if ( composites.getSelectionIndex() == 0 ) { return; } CompositeFieldConstraint comp = new CompositeFieldConstraint(); comp.compositeJunctionType = (String) composites.getData( composites.getText() ); pattern.addConstraint( comp ); modeller.reloadLhs(); //TODO:review, perhaps should be another order of these calls modeller.setDirty( true ); close(); } } ); } private void createFieldRestrictionCombo(Composite composite, GridData gd) { createLabel( composite, "Add a restriction on a field" ); SuggestionCompletionEngine engine = getCompletion(); String[] fieldCompletitions = engine.getFieldCompletions( pattern.factType ); final Combo fieldsCombo = new Combo( composite, SWT.READ_ONLY ); fieldsCombo.setLayoutData( gd ); fieldsCombo.add( "..." ); for ( int i = 0; i < fieldCompletitions.length; i++ ) { String field = fieldCompletitions[i]; fieldsCombo.add( field ); fieldsCombo.setData( field, engine.getFieldType( pattern.factType + "." + field ) ); } fieldsCombo.select( 0 ); fieldsCombo.addListener( SWT.Selection, new Listener() { public void handleEvent(Event event) { if ( fieldsCombo.getSelectionIndex() == 0 ) { return; } SingleFieldConstraint constraint = new SingleFieldConstraint(); constraint.setFieldName(fieldsCombo.getText()); constraint.setFieldType((String) fieldsCombo.getData( fieldsCombo.getText() )); pattern.addConstraint( constraint ); modeller.setDirty( true ); modeller.reloadLhs(); close(); } } ); } private void createFormulaRow(Composite composite, GridData gd) { createLabel( composite, "Add a new formula style expression" ); Button formulaButton = toolkit.createButton( composite, "New formula", SWT.PUSH ); formulaButton.addListener( SWT.Selection, new Listener() { public void handleEvent(Event event) { SingleFieldConstraint con = new SingleFieldConstraint(); con.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE); pattern.addConstraint( con ); modeller.setDirty( true ); modeller.reloadLhs(); close(); } } ); formulaButton.setLayoutData( gd ); } private void createVariableBindingRow(Composite composite) { createLabel( composite, "Variable name" ); final Text variableText = createText( composite, "" ); if ( pattern.boundName != null ) { variableText.setText( pattern.boundName ); } Button varButton = toolkit.createButton( composite, "Set", SWT.PUSH ); varButton.addListener( SWT.Selection, new Listener() { public void handleEvent(Event event) { pattern.boundName = variableText.getText(); modeller.reloadLhs(); modeller.setDirty( true ); close(); } } ); } private SuggestionCompletionEngine getCompletion() { return modeller.getSuggestionCompletionEngine(); } }