📄 dsleditor.java
字号:
package org.drools.ide.dsl.editor;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.drools.ide.DroolsIDEPlugin;
import org.drools.ide.builder.IDroolsModelMarker;
import org.drools.lang.dsl.template.MappingError;
import org.drools.lang.dsl.template.NLMappingItem;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;
/**
* This is the tablular DSL configuration editor.
* @author Michael Neale
*/
public class DSLEditor extends EditorPart {
private Table table;
private TableViewer tableViewer;
private NLGrammarModel model; //this is the model that does all the work (from drools-compiler)
private boolean dirty = false; //editing or deleting will make it dirty
private Text exprText; //for language expression
private Text mappingText; //for target rule expression
private Text descriptionText; //just a comment field
public void doSave(IProgressMonitor monitor) {
FileEditorInput input = (FileEditorInput) getEditorInput();
File outputFile = input.getFile().getLocation().toFile();
saveFile( monitor,
outputFile, input );
}
private void saveFile(IProgressMonitor monitor,
File outputFile, FileEditorInput input) {
try {
validate( input );
FileWriter writer = new FileWriter(outputFile);
model.save( writer );
makeClean();
writer.close();
input.getFile().getProject().refreshLocal(IResource.DEPTH_INFINITE, monitor);
} catch ( IOException e ) {
throw new IllegalStateException("Unable to save DSL configuration file. (IOException: " + e.getMessage() + ")");
} catch ( CoreException e ) {
throw new IllegalStateException("Unable to resync workbench after DSL save. (CoreException: " + e.getMessage() + ")");
}
}
private void validate(FileEditorInput input) {
removeProblemsFor( input.getFile() );
List errs = new ArrayList();
for ( Iterator iter = model.getMappings().iterator(); iter.hasNext(); ) {
NLMappingItem item = (NLMappingItem) iter.next();
errs.addAll( model.validateMapping( item ) );
}
if (errs.size() > 0) {
for ( Iterator iter = errs.iterator(); iter.hasNext(); ) {
MappingError mapEr = (MappingError) iter.next();
createMarker( input.getFile(), mapEr.getMessage() + " From [" + mapEr.getTemplateText() + "]", -1 );
}
}
}
private void createMarker(final IResource res, final String message, final int lineNumber) {
try {
IWorkspaceRunnable r= new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IMarker marker = res
.createMarker(IDroolsModelMarker.DROOLS_MODEL_PROBLEM_MARKER);
marker.setAttribute(IMarker.MESSAGE, message);
marker.setAttribute(IMarker.SEVERITY,
IMarker.SEVERITY_WARNING);
marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
}
};
res.getWorkspace().run(r, null, IWorkspace.AVOID_UPDATE, null);
} catch (CoreException e) {
DroolsIDEPlugin.log(e);
}
}
private void removeProblemsFor(IResource resource) {
try {
if (resource != null && resource.exists()) {
resource.deleteMarkers(
IDroolsModelMarker.DROOLS_MODEL_PROBLEM_MARKER, false,
IResource.DEPTH_INFINITE);
}
} catch (CoreException e) {
DroolsIDEPlugin.log(e);
}
}
void makeClean() {
this.dirty = false;
firePropertyChange( PROP_DIRTY );
}
public void doSaveAs() {
// TODO Implement this.
}
public void init(IEditorSite site,
IEditorInput editorInput) throws PartInitException {
FileEditorInput input = (FileEditorInput)editorInput;
setSite(site);
setInput(editorInput);
setVisibleName( input );
try {
InputStream stream = input.getFile().getContents();
model = new NLGrammarModel();
model.load( new InputStreamReader(stream) );
stream.close();
} catch ( CoreException e ) {
throw new IllegalStateException("Unable to load DSL configuration file. (CoreException: " + e.getMessage() + ")");
} catch ( IOException e ) {
throw new IllegalStateException("Unabel to close stream fo DSL config file. (IOException: " + e.getMessage() + ")");
}
}
private void setVisibleName(FileEditorInput input) {
setPartName( input.getFile().getName() );
setContentDescription( "Editing Domain specific language: [" + input.getFile().getFullPath().toString() + "]");
}
public boolean isDirty() {
return dirty;
}
/**
* Sets the dirty flag, and notifies the workbench.
*/
void makeDirty() {
dirty = true;
firePropertyChange( PROP_DIRTY );
}
public boolean isSaveAsAllowed() {
// TODO implement SaveAs
return false;
}
public void createPartControl(Composite parent) {
GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
parent.setLayoutData (gridData);
// Set numColumns to 3 in the overall grid
GridLayout layout = new GridLayout(3, false);
layout.marginWidth = 4;
parent.setLayout (layout);
//create the overall desc field (comments).
createDescriptionField( parent );
// create the table
createTable( parent );
// Create and setup the TableViewer
createTableViewer();
//set up the table "binding" with the model
tableViewer.setContentProvider(new DSLContentProvider(tableViewer, model));
tableViewer.setLabelProvider(new DSLLabelProvider());
refreshModel();
//setup the fields below the table
createExpressionViewField( parent );
createEditButton( parent );
createMappingViewField( parent );
createDeleteButton( parent );
createAddButton( parent );
//listeners on the table...
createTableListeners();
}
/**
* Setup table listeners for GUI events.
*/
private void createTableListeners() {
//setup views into current selected
table.addSelectionListener( new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
populate();
}
public void widgetDefaultSelected(SelectionEvent e) {
populate();
}
private void populate() {
NLMappingItem selected = getCurrentSelected();
exprText.setText( selected.getNaturalTemplate() );
mappingText.setText( selected.getTargetTemplate() );
}
});
//double click support
table.addMouseListener( new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
showEditPopup();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -