/** * 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.eclipse.rulebuilder.modeldriven.HumanReadable; import org.drools.ide.common.client.modeldriven.DropDownData; import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine; import org.drools.ide.common.client.modeldriven.brl.ActionFieldValue; import org.drools.ide.common.client.modeldriven.brl.ActionInsertFact; import org.drools.ide.common.client.modeldriven.brl.ActionInsertLogicalFact; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; 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; /** * * * @author Anton Arhipov * @author Ahti Kitsik * */ public class ActionInsertFactWidget extends Widget { private final ActionInsertFact fact; public ActionInsertFactWidget(FormToolkit toolkit, Composite parent, RuleModeller mod, ActionInsertFact fact, int index) { super( parent, toolkit, mod, index ); this.fact = fact; GridLayout l = new GridLayout(); l.numColumns = 4; l.marginBottom = 0; l.marginHeight = 0; l.marginLeft = 0; l.marginRight = 0; l.marginTop = 0; l.marginWidth = 0; l.verticalSpacing = 0; parent.setLayout( l ); create(); } private void create() { String assertType = "assert"; if ( fact instanceof ActionInsertLogicalFact ) { assertType = "assertLogical"; } toolkit.createLabel( parent, HumanReadable.getActionDisplayName( assertType ) + " " + this.fact.factType ); addDeleteRHSAction(); addMoreOptionsAction(); Composite constraintComposite = toolkit.createComposite( parent ); GridLayout constraintLayout = new GridLayout(); constraintLayout.numColumns = 3; constraintComposite.setLayout( constraintLayout ); createConstraintRows( constraintComposite ); toolkit.paintBordersFor( constraintComposite ); } private void addMoreOptionsAction() { final Shell shell = new Shell( Display.getCurrent() ); ImageHyperlink link = addImage( parent, "icons/new_item.gif" ); link.addHyperlinkListener( new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { RuleDialog popup = new AddNewInsertedFactFieldDialog( shell, getModeller(), fact ); popup.open(); } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } } ); link.setToolTipText( "Add another field to this so you can set its value" ); } private void createConstraintRows(Composite constraintComposite) { for ( int row = 0; row < fact.fieldValues.length; row++ ) { ActionFieldValue val = fact.fieldValues[row]; toolkit.createLabel( constraintComposite, val.field ); valueEditor( constraintComposite, val ); addRemoveFieldAction( constraintComposite, row ); } } private void addRemoveFieldAction(Composite constraintComposite, final int row) { ImageHyperlink delLink = addImage( constraintComposite, "icons/delete_item_small.gif" ); delLink.setToolTipText( "Remove this field action" ); delLink.addHyperlinkListener( new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { MessageBox dialog = new MessageBox( Display.getCurrent().getActiveShell(), SWT.YES | SWT.NO | SWT.ICON_WARNING ); dialog.setMessage( "Remove this item?" ); dialog.setText( "Remove this item?" ); if ( dialog.open() == SWT.YES ) { fact.removeField( row ); getModeller().setDirty( true ); getModeller().reloadRhs(); } } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } } ); } private void valueEditor(Composite parent, final ActionFieldValue val) { String fieldName = val.field; DropDownData enums = modeller.getSuggestionCompletionEngine().getEnums( fact.factType, fact.fieldValues, val.field ); boolean found = false; 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]; combo.add( e ); if ( e.equals( val.value ) ) { combo.select( i ); found = true; } } if ( !found && val.value != null ) { combo.add( val.value ); combo.select( combo.getItemCount() - 1 ); } combo.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { val.value = combo.getItem( combo.getSelectionIndex() ); modeller.reloadRhs(); modeller.setDirty( true ); } } ); } else { final Text box = toolkit.createText( parent, "" ); if ( val.value != null ) { box.setText( val.value ); } GridData gd = new GridData( GridData.FILL_HORIZONTAL ); gd.grabExcessHorizontalSpace = true; gd.minimumWidth = 100; box.setLayoutData( gd ); box.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { getModeller().setDirty( true ); val.value = box.getText(); } } ); if ( val.type.equals( SuggestionCompletionEngine.TYPE_NUMERIC ) ) { new NumericKeyFilter( box ); } } } public SuggestionCompletionEngine getCompletion() { return getModeller().getSuggestionCompletionEngine(); } }