org.drools.guvnor.client.ruleeditor.DSLRuleEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.drools.guvnor.client.ruleeditor.DSLRuleEditor.java

Source

package org.drools.guvnor.client.ruleeditor;

/*
 * Copyright 2005 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.
 */

import org.drools.guvnor.client.common.DirtyableComposite;
import org.drools.guvnor.client.common.ImageButton;
import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
import org.drools.guvnor.client.modeldriven.brl.DSLSentence;
import org.drools.guvnor.client.packages.SuggestionCompletionCache;
import org.drools.guvnor.client.rpc.RuleAsset;
import org.drools.guvnor.client.rpc.RuleContentText;

import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * This is a textual rule editor, which provides DSL content assistance. This is
 * similar (but simpler) to the IDE based one.
 *
 * @author michael neale
 */

public class DSLRuleEditor extends DirtyableComposite {

    private TextArea text;
    final private RuleContentText data;
    private DSLSentence[] conditions;
    private DSLSentence[] actions;

    public DSLRuleEditor(RuleAsset asset, RuleViewer viewer) {
        this(asset);
    }

    public DSLRuleEditor(RuleAsset asset) {

        RuleContentText cont = (RuleContentText) asset.content;

        this.data = cont;
        text = new TextArea();
        text.setWidth("100%");
        //        text.setHeight( "100%" );
        text.setVisibleLines(16);
        text.setText(data.content);
        text.setTitle("Hint: press control+space for popup assistance, or use one of the icons to the right.");

        SuggestionCompletionEngine eng = SuggestionCompletionCache.getInstance()
                .getEngineFromCache(asset.metaData.packageName);
        this.actions = eng.actionDSLSentences;
        this.conditions = eng.conditionDSLSentences;

        text.setStyleName("dsl-text-Editor");

        FlexTable layout = new FlexTable();
        layout.setWidget(0, 0, text);

        text.addChangeListener(new ChangeListener() {
            public void onChange(Widget w) {
                data.content = text.getText();
                makeDirty();
            }
        });

        text.addKeyboardListener(new KeyboardListenerAdapter() {
            public void onKeyDown(Widget arg0, char arg1, int arg2) {
                if (arg1 == ' ' && arg2 == MODIFIER_CTRL) {
                    showInTextOptions();
                }

                if (arg1 == KEY_TAB) {
                    insertText("\t");
                    text.setCursorPos(text.getCursorPos() + 1);
                    text.cancelKey();
                }
            }
        });

        VerticalPanel vert = new VerticalPanel();

        Image lhsOptions = new ImageButton("images/new_dsl_pattern.gif");
        final String msg = "Add a new condition";
        lhsOptions.setTitle(msg);
        lhsOptions.addClickListener(new ClickListener() {
            public void onClick(Widget w) {
                showSuggestions(conditions);
            }
        });

        Image rhsOptions = new ImageButton("images/new_dsl_action.gif");
        final String msg2 = "Add an action";
        rhsOptions.setTitle(msg2);
        rhsOptions.addClickListener(new ClickListener() {
            public void onClick(Widget w) {
                showSuggestions(actions);
            }
        });

        vert.add(lhsOptions);
        vert.add(rhsOptions);

        layout.setWidget(0, 1, vert);

        layout.getCellFormatter().setWidth(0, 0, "95%");
        layout.getFlexCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT,
                HasVerticalAlignment.ALIGN_TOP);
        layout.getCellFormatter().setWidth(0, 1, "5%");
        layout.getFlexCellFormatter().setAlignment(0, 1, HasHorizontalAlignment.ALIGN_CENTER,
                HasVerticalAlignment.ALIGN_MIDDLE);

        layout.setWidth("100%");
        layout.setHeight("100%");

        initWidget(layout);
    }

    protected void showInTextOptions() {
        String prev = text.getText().substring(0, this.text.getCursorPos());
        if (prev.indexOf("then") > -1) {
            showSuggestions(this.actions);
        } else {
            showSuggestions(this.conditions);
        }
    }

    private void showSuggestions(DSLSentence[] items) {
        ChoiceList choice = new ChoiceList(items, this);
        choice.setPopupPosition(text.getAbsoluteLeft() + 20, text.getAbsoluteTop() + 20);
        choice.show();
    }

    void insertText(String ins) {
        int i = text.getCursorPos();
        String left = text.getText().substring(0, i);
        String right = text.getText().substring(i, text.getText().length());
        text.setText(left + ins + right);
        this.data.content = text.getText();
    }

}