/**
* 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.dsl.editor;
import org.drools.lang.dsl.DSLMappingEntry;
import org.drools.lang.dsl.DSLMappingEntry.Section;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* This provides an editor for mapping language mappings.
* This is preferable to in place editing, as it fits the usage pattern of read lots,
* edit little.
*
* This is a simple popup modal dialog.
*
* @author Michael Neale
*/
public class MappingEditor extends TitleAreaDialog {
private static final int SCOPE_KEYWORD = 0;
private static final int SCOPE_WHEN = 1;
private static final int SCOPE_THEN = 2;
private static final int SCOPE_ALL = 3;
private static final String SCOPE_STR_KEYWORD = "keyword";
private static final String SCOPE_STR_WHEN = "condition";
private static final String SCOPE_STR_THEN = "consequence";
private static final String SCOPE_STR_ALL = "*";
private Text exprText;
private Text mappingText;
private Text objText;
private Combo scopeCombo;
private boolean cancelled;
private DSLMappingEntry model;
protected MappingEditor(Shell parent) {
super( parent );
}
/**
* Pass in a NLMapping item for display/edits.
* Changes will be applied to this object only if the user clicks OK.
*/
public void setNLMappingItem(DSLMappingEntry item) {
model = item;
setSection( model.getSection() );
exprText.setText( model.getMappingKey() == null ? "" : model.getMappingKey() );
mappingText.setText( model.getMappingValue() == null ? "" : model.getMappingValue() );
objText.setText( model.getMetaData().getMetaData() == null ? "" : model.getMetaData().getMetaData() );
}
private void setSection(Section section) {
if ( section == DSLMappingEntry.CONDITION ) {
scopeCombo.select( SCOPE_WHEN );
} else if ( section == DSLMappingEntry.CONSEQUENCE ) {
scopeCombo.select( SCOPE_THEN );
} else if ( section == DSLMappingEntry.ANY ) {
scopeCombo.select( SCOPE_ALL );
} else if ( section == DSLMappingEntry.KEYWORD ) {
scopeCombo.select( SCOPE_KEYWORD );
} else {
throw new IllegalArgumentException( "Unknown scope type: " + section );
}
}
private Section getSection(String sectionStr) {
DSLMappingEntry.Section section = DSLMappingEntry.ANY;
if ( SCOPE_STR_KEYWORD.equals( sectionStr ) ) {
section = DSLMappingEntry.KEYWORD;
} else if ( SCOPE_STR_WHEN.equals( sectionStr ) ) {
section = DSLMappingEntry.CONDITION;
} else if ( SCOPE_STR_THEN.equals( sectionStr ) ) {
section = DSLMappingEntry.CONSEQUENCE;
}
return section;
}
protected void cancelPressed() {
this.cancelled = true;
super.cancelPressed();
}
protected void okPressed() {
this.cancelled = false;
this.model.setMappingKey( this.exprText.getText() );
this.model.setMappingValue( this.mappingText.getText() );
this.model.setSection( this.getSection( this.scopeCombo.getText() ) );
this.model.setMetaData( new DSLMappingEntry.DefaultDSLEntryMetaData( this.objText.getText() ) );
super.okPressed();
}
/** This will tell if the user cancelled the edit */
public boolean isCancelled() {
return cancelled;
}
protected Control createDialogArea(Composite parent) {
//set the overall layout
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 10;
gridLayout.verticalSpacing = 10;
gridLayout.marginWidth = 10;
gridLayout.numColumns = 2;
parent.setLayout( gridLayout );
//setup fields
createExpressionField( parent );
createMappingField( parent );
createObjectField( parent );
createScopeField( parent );
// create the top level composite wrapper
Composite composite = new Composite( parent,
SWT.NONE );
GridLayout layout = new GridLayout();
layout.marginHeight = 10;
layout.marginWidth = 10;
layout.verticalSpacing = 10;
composite.setLayout( layout );
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
composite.setFont( parent.getFont() );
return composite;
}
private void createMappingField(Composite parent) {
Label mappingLbl = new Label( parent,
SWT.NONE );
mappingLbl.setText( "Rule mapping:" );
mappingLbl.setFont( parent.getFont() );
mappingLbl.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_END ) );
mappingText = new Text( parent,
SWT.BORDER );
GridData data = new GridData();
data.widthHint = 450;
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
mappingText.setLayoutData( data );
mappingText.setToolTipText( "Enter the rule language mapping that the \nlanguage item will be translated to." + " Use the named variables (holes) \nthat you specify in the language expression above." );
}
private void createExpressionField(Composite parent) {
Label exprLbl = new Label( parent,
SWT.NONE );
exprLbl.setText( "Language expression:" );
exprLbl.setFont( parent.getFont() );
exprLbl.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_END ) );
exprText = new Text( parent,
SWT.BORDER );
GridData data = new GridData();
data.widthHint = 450;
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
exprText.setLayoutData( data );
exprText.setToolTipText( "Enter the language expression that you want to use in a rule.\n" + "Use curly brackets to mark 'holes' where the values will be extracted\n" + "from in the rule source. " + "Such as: Person has a name of {name} \n"
+ "This will then parse the rule source to extract the data out of \n" + "the place where {name} would appear." );
}
private void createObjectField(Composite parent) {
Label objectLbl = new Label( parent,
SWT.NONE );
objectLbl.setText( "Object:" );
objectLbl.setFont( parent.getFont() );
objectLbl.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_END ) );
objText = new Text( parent,
SWT.BORDER );
GridData data = new GridData();
data.widthHint = 450;
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
objText.setLayoutData( data );
objText.setToolTipText( "Enter the name of the object." );
}
private void createScopeField(Composite parent) {
//type
Label scopeLbl = new Label( parent,
SWT.NONE );
scopeLbl.setText( "Scope:" );
scopeLbl.setFont( parent.getFont() );
scopeLbl.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_END ) );
scopeCombo = new Combo( parent,
SWT.READ_ONLY );
scopeCombo.add( SCOPE_STR_KEYWORD,
SCOPE_KEYWORD );
scopeCombo.add( SCOPE_STR_WHEN,
SCOPE_WHEN );
scopeCombo.add( SCOPE_STR_THEN,
SCOPE_THEN );
scopeCombo.add( SCOPE_STR_ALL,
SCOPE_ALL );
scopeCombo.select( SCOPE_ALL ); //the default
scopeCombo.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ) );
scopeCombo.setFont( parent.getFont() );
scopeCombo.setToolTipText( "This specifies what part of the rule the expression applies. Indicating '*' means global." );
}
}