/** * 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 java.util.List; import org.drools.eclipse.DroolsEclipsePlugin; import org.drools.ide.common.client.modeldriven.DropDownData; 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.ConnectiveConstraint; import org.drools.ide.common.client.modeldriven.brl.FactPattern; import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; public class ConstraintValueEditor { private Composite composite; private BaseSingleFieldConstraint constraint; private FormToolkit toolkit; private RuleModeller modeller; private boolean numericValue; private FactPattern pattern; public ConstraintValueEditor(Composite composite, BaseSingleFieldConstraint constraint, FormToolkit toolkit, RuleModeller modeller, String numericType /* e.g. is "Numeric" */) { this( composite, constraint, toolkit, modeller, numericType, null ); } public ConstraintValueEditor(Composite parent, BaseSingleFieldConstraint c, FormToolkit toolkit, RuleModeller modeller, String type, FactPattern pattern) { this.pattern = pattern; this.composite = parent; this.constraint = c; this.toolkit = toolkit; this.modeller = modeller; if ( SuggestionCompletionEngine.TYPE_NUMERIC.equals( type ) ) { this.numericValue = true; } create(); } private void create() { if ( constraint.getConstraintValueType() == BaseSingleFieldConstraint.TYPE_UNDEFINED ) { ImageHyperlink link = addImage( composite, "icons/edit.gif" ); link.setToolTipText( "Choose value editor type" ); link.addHyperlinkListener( new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { RuleDialog popup = new ValueEditorTypeSelectionDialog( composite.getShell(), toolkit, modeller, constraint ); popup.open(); } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } } ); GridData gd = new GridData( GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING ); gd.horizontalSpan = 2; link.setLayoutData( gd ); } else { switch ( constraint.getConstraintValueType() ) { case BaseSingleFieldConstraint.TYPE_LITERAL : literalValueEditor( composite, constraint, new GridData( GridData.FILL_HORIZONTAL ) ); break; case BaseSingleFieldConstraint.TYPE_RET_VALUE : addImage( composite, "icons/function_assets.gif" ); formulaValueEditor( composite, constraint, new GridData( GridData.FILL_HORIZONTAL ) ); break; case BaseSingleFieldConstraint.TYPE_VARIABLE : variableEditor( composite, constraint, new GridData( GridData.FILL_HORIZONTAL ) ); break; default : break; } } } private void literalValueEditor(Composite parent, final BaseSingleFieldConstraint c, GridData gd) { String fieldName = null; if (c instanceof SingleFieldConstraint) { fieldName = ((SingleFieldConstraint) c).getFieldName(); } else if (c instanceof ConnectiveConstraint) { fieldName = ((ConnectiveConstraint) c).fieldName; } String fieldType = null; if (c instanceof SingleFieldConstraint) { fieldType = ((SingleFieldConstraint) c).getFieldType(); } else if (c instanceof ConnectiveConstraint) { fieldType = ((ConnectiveConstraint) c).fieldType; } DropDownData enums = null; boolean found = false; if ( fieldType.equals( SuggestionCompletionEngine.TYPE_BOOLEAN )) { enums = DropDownData.create(new String[]{"true", "false"}); }else { enums = modeller.getSuggestionCompletionEngine().getEnums( pattern, fieldName ); } if ( enums != null && enums.fixedList.length > 0 ) { String[] list = enums.fixedList; final Combo combo = new Combo( parent, SWT.DROP_DOWN | SWT.READ_ONLY ); for ( int i = 0; i < list.length; i++ ) { String e = list[i]; String[] split = null; boolean s = false; if ( e.indexOf( '=' ) > 0 ) { split = e.split( "=" ); e = split[1]; combo.add( e.trim() ); combo.setData( e.trim(), split[0].trim() ); s = true; } else { combo.add( e ); } if ( e.equals( c.getValue() ) || (s && split[0].trim().equals( c.getValue() )) ) { combo.select( i ); found = true; } } if ( !found && c.getValue() != null ) { combo.add( c.getValue() ); combo.select( combo.getItemCount() - 1 ); } combo.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { String item = combo.getItem( combo.getSelectionIndex() ); if ( combo.getData( item ) != null ) { item = (String) combo.getData( item ); } c.setValue(item); modeller.reloadLhs(); modeller.setDirty( true ); } } ); gd.horizontalSpan = 2; gd.grabExcessHorizontalSpace = true; gd.minimumWidth = 100; combo.setLayoutData( gd ); } else { final Text box = toolkit.createText( parent, "" ); if ( c.getValue() != null ) { box.setText( c.getValue() ); } gd.horizontalSpan = 2; gd.grabExcessHorizontalSpace = true; gd.minimumWidth = 100; box.setLayoutData( gd ); box.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { c.setValue(box.getText()); modeller.setDirty( true ); } } ); if ( this.numericValue ) { box.addKeyListener( new KeyListener() { public void keyPressed(KeyEvent e) { if ( Character.isLetter( e.character ) ) { e.doit = false; } } public void keyReleased(KeyEvent e) { } } ); } } } private void formulaValueEditor(Composite parent, final BaseSingleFieldConstraint c, GridData gd) { final Text box = toolkit.createText( parent, "" ); if ( c.getValue() != null ) { box.setText( c.getValue() ); } gd.grabExcessHorizontalSpace = true; gd.minimumWidth = 100; box.setLayoutData( gd ); box.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { c.setValue(box.getText()); modeller.setDirty( true ); } } ); } private void variableEditor(Composite composite, final BaseSingleFieldConstraint c, GridData gd) { List vars = modeller.getModel().getBoundVariablesInScope( c ); final Combo combo = new Combo( composite, SWT.READ_ONLY ); gd.horizontalSpan = 2; combo.setLayoutData( gd ); if ( c.getValue() == null ) { combo.add( "Choose ..." ); } int idx = 0; for ( int i = 0; i < vars.size(); i++ ) { String var = (String) vars.get( i ); if ( c.getValue() != null && c.getValue().equals( var ) ) { idx = i; } combo.add( var ); } combo.select( idx ); combo.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { c.setValue(combo.getText()); } } ); } public ImageHyperlink addImage(Composite parent, String fileName) { ImageHyperlink imageHyperlink = toolkit.createImageHyperlink( parent, 0 ); ImageDescriptor imageDescriptor = DroolsEclipsePlugin.getImageDescriptor( fileName ); imageHyperlink.setImage( imageDescriptor.createImage() ); return imageHyperlink; } }