⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsleditor.java

📁 jboss规则引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -