/** * 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.FactPattern; import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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; public class AssignFieldVariableDialog extends RuleDialog { private final FormToolkit toolkit; private RuleModeller modeller; private SingleFieldConstraint con; private final FactPattern pattern; public AssignFieldVariableDialog(Shell parent, FormToolkit toolkit, RuleModeller modeller, SingleFieldConstraint con, FactPattern pattern) { super( parent, "Bind the field called [" + con.getFieldName() + "] to a variable.", "Type the variable name and hit the button." ); this.toolkit = toolkit; this.modeller = modeller; this.con = con; this.pattern = pattern; } protected Control createDialogArea(final Composite parent) { Composite composite = (Composite) super.createDialogArea( parent ); GridLayout l = new GridLayout(); l.numColumns = 5; l.marginBottom = 0; l.marginHeight = 0; l.marginLeft = 0; l.marginRight = 0; l.marginTop = 0; l.marginWidth = 0; composite.setLayout( l ); createVariableBindingRow( composite ); createSubfieldConstraintRow( composite ); toolkit.paintBordersFor( composite ); return composite; } private void createSubfieldConstraintRow(final Composite composite) { SuggestionCompletionEngine engine = modeller.getSuggestionCompletionEngine(); String[] fields = engine.getFieldCompletions( con.getFieldType() ); if ( fields == null || fields.length <= 0 ) { return; } createLabel( composite, "Add a restriction on a subfield" ); final Combo combo = new Combo( composite, SWT.DROP_DOWN | SWT.READ_ONLY ); combo.add( "..." ); for ( int i = 0; i < fields.length; i++ ) { String field = fields[i]; combo.add( field ); combo.setData( field, engine.getFieldType( con.getFieldType() + "." + field ) ); } combo.select( 0 ); combo.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { String fName = combo.getText(); if ( combo.getSelectionIndex() == 0 ) { return; } pattern.addConstraint( new SingleFieldConstraint( fName, ((String) combo.getData( fName )), con ) ); modeller.setDirty( true ); modeller.reloadLhs(); close(); } } ); } private void createVariableBindingRow(Composite composite) { createLabel( composite, "Variable name" ); final Text variableText = toolkit.createText( composite, "" ); if ( con.getFieldBinding() != null ) { variableText.setText( con.getFieldBinding() ); } GridData gd = new GridData( GridData.FILL_HORIZONTAL ); gd.horizontalSpan = 3; variableText.setLayoutData( gd ); Button varButton = toolkit.createButton( composite, "Set", SWT.PUSH ); varButton.addListener( SWT.Selection, new Listener() { public void handleEvent(Event event) { con.setFieldBinding(variableText.getText()); modeller.reloadLhs(); modeller.setDirty( true ); close(); } } ); } }