/**
* 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.
*/
/*
* Created on 11-jan-2005
*
*/
package org.drools.eclipse.wizard.rule;
import java.io.IOException;
import java.io.InputStream;
import org.drools.eclipse.DroolsEclipsePlugin;
import org.eclipse.jface.viewers.IStructuredSelection;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.IDE;
/**
* A page to create a new .drl package/package file.
* There is only one page for this wizard, its very simple.
*
* Enhancements may be made to allow configuration of semantic languages, DSLs (locate a DSL) and other
* package level options.
*
* @author Michael Neale
* @author <a href="mailto:kris_verlaenen@hotmail.com">kris verlaenen </a>
*/
public class NewRulePackagePage extends WizardNewFileCreationPage {
private static final int TYPE_RULE = 1;
private static final int TYPE_PACKAGE = 0;
private IWorkbench workbench;
private Combo ruleFileType;
private Button expander;
private Button function;
private Text packageName;
public NewRulePackagePage(IWorkbench workbench, IStructuredSelection selection) {
super("createDRLFilePage", selection);
setTitle("New Rules File");
setDescription("Create a new rules file (drl)");
this.workbench = workbench;
}
protected void createAdvancedControls(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.numColumns = 2;
container.setLayout( layout );
setControl( container );
//setup the controls.
createType( container );
createDSL( container );
createFunctions( container );
createPackageName( container );
super.createAdvancedControls( parent );
}
protected boolean validatePage() {
return super.validatePage() && validate();
}
private void createPackageName(Composite container) {
//package name
Label pack = new Label(container, SWT.NONE);
pack.setText( "Rule package name:" );
pack.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_END) );
pack.setFont( this.getFont() );
packageName = new Text(container, SWT.BORDER);
packageName.setLayoutData( new GridData(GridData.FILL_HORIZONTAL) );
packageName.setToolTipText( "Rules require a namespace." );
packageName.setFont( this.getFont() );
packageName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
setPageComplete(validatePage());
}
});
}
private void createFunctions(Composite container) {
//function
Label func = new Label(container, SWT.NONE);
func.setText( "Use functions:" );
func.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_END) );
func.setFont( this.getFont() );
function = new Button(container, SWT.CHECK);
function.setSelection( false );
function.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING) );
function.setToolTipText( "Functions are methods you embed in your rule source." );
}
private void createDSL(Composite container) {
//expander
Label exp = new Label(container, SWT.NONE);
exp.setText( "Use a DSL:" );
exp.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_END) );
exp.setFont( this.getFont() );
expander = new Button(container, SWT.CHECK);
expander.setSelection( false );
expander.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING) );
expander.setToolTipText( "Domain Specific Language: allows you to create your own domain specific languages\n for use in rules." );
}
private void createType(Composite container) {
//type
Label type = new Label(container, SWT.NONE);
type.setText( "Type of rule resource:" );
type.setFont( this.getFont() );
type.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_END) );
ruleFileType = new Combo( container,
SWT.READ_ONLY);
ruleFileType.add( "New DRL (rule package)", TYPE_PACKAGE );
ruleFileType.add( "New Rule (individual rule)", TYPE_RULE );
ruleFileType.select( 0 );
ruleFileType.setLayoutData( new GridData(GridData.FILL_HORIZONTAL) );
ruleFileType.setFont( this.getFont() );
}
public boolean finish() {
if (!validate()) {
return false;
}
String fileName = getFileName();
String extension = expander.getSelection() ? ".dslr" : ".drl";
if (!fileName.endsWith(extension)) {
setFileName(fileName + extension);
}
org.eclipse.core.resources.IFile newFile = createNewFile();
if (newFile == null)
return false;
try {
IWorkbenchWindow dwindow = workbench.getActiveWorkbenchWindow();
org.eclipse.ui.IWorkbenchPage page = dwindow.getActivePage();
if (page != null)
IDE.openEditor(page, newFile, true);
} catch (PartInitException e) {
DroolsEclipsePlugin.log(e);
return false;
}
return true;
}
private boolean validate() {
if (this.packageName.getText() == null || packageName.getText().equals( "" )) {
setErrorMessage( "You must provide a rule package name" );
return false;
} else {
return true;
}
}
protected InputStream getInitialContents() {
try {
DRLGenerator gen = new DRLGenerator();
if (this.ruleFileType.getSelectionIndex() == TYPE_RULE) {
InputStream template = getTemplate("org/drools/eclipse/wizard/rule/new_rule.drl.template");
return gen.generateRule( this.packageName.getText(),
template );
} else {
InputStream template = getTemplate("org/drools/eclipse/wizard/rule/new_package.drl.template");
return gen.generatePackage( this.packageName.getText(),
function.getSelection(),
expander.getSelection(),
template );
}
} catch (IOException e) {
return null;
} catch (NullPointerException e) {
return null;
}
}
private InputStream getTemplate(String templatePath) throws IOException {
return DroolsEclipsePlugin.getDefault().getBundle().getResource(templatePath).openStream();
}
}