de.dfki.iui.mmds.sdk.editors.grammar_rules.EntityEditorPart.java Source code

Java tutorial

Introduction

Here is the source code for de.dfki.iui.mmds.sdk.editors.grammar_rules.EntityEditorPart.java

Source

/*******************************************************************************
 * The Creative Commons CC-BY-NC 4.0 License
 * http://creativecommons.org/licenses/by-nc/4.0/legalcode
 *
 * Creative Commons (CC) by DFKI GmbH
 * - Vanessa Hahn <Vanessa.Hahn@dfki.de>
 * - Robert Nesselrath <rnesselrath@gmail.com>
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 *******************************************************************************/
package de.dfki.iui.mmds.sdk.editors.grammar_rules;

import java.util.List;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.widgets.Section;

import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.Entity;
import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.EntityType;
import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.Grammar_rulesPackage;
import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.PhraseValuePair;
import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.Rule;
import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.Ruleset;
import de.dfki.iui.mmds.sdk.editors.grammar_rules.ContentListComposite.COLUMN_TYPE;
import de.dfki.iui.mmds.sdk.editors.grammar_rules.validators.ABNFValidator;

/**
 * this is the EditorPart where similar logic applies like for the Editor Part
 * for the EntityRules. For more detailed documentation please refer to the
 * UtteranceEditorPart.class
 * 
 * @author Evica Ilieva, Robert Neelrath
 * 
 */
public class EntityEditorPart extends AbstractGrammarEditorPart {

    protected Rule selectedRule;
    protected List<PhraseValuePair> selectedPhrase;
    protected ContentListComposite entitiesComposite;
    protected ContentListComposite phraseMappingComposite;
    protected EObjectTreeViewerComposite treeViewerComposite;

    public EntityEditorPart(Ruleset ruleset, RulesEditor editor) {
        super(ruleset, editor, "Entity Editor");
    }

    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);
        cb = new Clipboard(Display.getDefault());
        setPartName("Entity Rules");
        // getSite().setSelectionProvider(entityTableViewer);
    }

    @Override
    public void createPartControl(Composite parent) {
        super.createPartControl(parent);

        // sash form is used to split the main form into two parts
        SashForm sashForm = new SashForm(frmNewForm.getBody(), SWT.NONE);
        formToolkit.adapt(sashForm);
        formToolkit.paintBordersFor(sashForm);

        Section sctnNewSection = formToolkit.createSection(sashForm, Section.DESCRIPTION | Section.TITLE_BAR);
        sctnNewSection.setText("Entity Rules");
        sctnNewSection.setExpanded(true);
        sctnNewSection.setDescription("Create or edit new Rules here");

        entitiesComposite = new ContentListComposite(sctnNewSection, SWT.NONE,
                Grammar_rulesPackage.eINSTANCE.getRuleset_Rules(), Grammar_rulesPackage.eINSTANCE.getEntity(),
                editor, cb);
        formToolkit.adapt(entitiesComposite);
        sctnNewSection.setClient(entitiesComposite);
        final TableViewer entityTableViewer = entitiesComposite.getTableViewer();

        // the first column where the name of the Rule can be viewed and edited
        entitiesComposite.addColumn(getString("_UI_Rule_name_feature"), COLUMN_TYPE.RULENAME);

        // the second column where the user can enable or disable the rule
        entitiesComposite.addColumn(getString("_UI_Rule_enabled_feature"), COLUMN_TYPE.ENABLED);

        // the third column where the type is set
        entitiesComposite.addColumn(getString("_UI_EntityRule_type_feature"), COLUMN_TYPE.TYPE);

        entityTableViewer.setColumnProperties(new String[] { "0", "1", "2" });

        entityTableViewer.setCellModifier(new ICellModifier() {

            @Override
            public boolean canModify(Object element, String property) {
                return true;
            }

            @Override
            public Object getValue(Object element, String property) {
                Object result = null;
                Entity rule = (Entity) element;
                switch (property) {
                case "0":
                    if (rule.getName() == null) {
                        result = "";
                    } else {
                        result = rule.getName() + "";
                    }
                    break;
                case "1":
                    result = new Boolean(rule.isEnabled());
                    break;
                case "2":
                    result = true;
                    if (rule.getType().equals(EntityType.DYNAMIC)) {
                        result = false;
                    }
                    break;
                }
                return result;
            }

            @Override
            public void modify(Object element, String property, Object value) {
                TableItem item = (TableItem) element;
                Entity oldValue = (Entity) item.getData();
                EAttribute feature = null;
                switch (property) {
                case "0":
                    feature = Grammar_rulesPackage.eINSTANCE.getRule_Name();
                    break;
                case "1":
                    feature = Grammar_rulesPackage.eINSTANCE.getRule_Enabled();
                    break;
                case "2":
                    feature = Grammar_rulesPackage.eINSTANCE.getEntity_Type();

                    if ((Boolean) value) {
                        value = "static";
                    } else {
                        value = "dynamic";
                    }
                    break;
                }
                if (oldValue.getName() != null) {
                    if ((property.equals("0") && !oldValue.getName().equals(value)) || property.equals("1")
                            || property.equals("2")) {
                        if (value.equals("static")) {
                            editor.getEditingDomain().getCommandStack().execute(SetCommand
                                    .create(editor.getEditingDomain(), item.getData(), feature, EntityType.STATIC));
                        } else if (value.equals("dynamic")) {
                            editor.getEditingDomain().getCommandStack().execute(SetCommand.create(
                                    editor.getEditingDomain(), item.getData(), feature, EntityType.DYNAMIC));
                        } else {
                            editor.getEditingDomain().getCommandStack().execute(
                                    SetCommand.create(editor.getEditingDomain(), item.getData(), feature, value));
                        }
                    }
                } else {
                    editor.getEditingDomain().getCommandStack()
                            .execute(SetCommand.create(editor.getEditingDomain(), item.getData(), feature, value));
                }
            }

        });

        entityTableViewer.setCellEditors(new CellEditor[] { new TextCellEditor(entityTableViewer.getTable()),
                new CheckboxCellEditor(entityTableViewer.getTable()),
                new CheckboxCellEditor(entityTableViewer.getTable()) });

        entityTableViewer.setInput(ruleset);

        entityTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            // This ensures that we handle selections correctly, i.e. for each
            // selected entity rule a corresponding PhraseValue Pair is
            // shown in the detail view

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) entityTableViewer.getSelection();
                if (selection != null && selection.size() == 1) {
                    setSelectedRule((Rule) selection.getFirstElement());
                    if (selectedRule != null) {
                        editor.setCurrentViewer(entityTableViewer);
                    }
                } else {
                    setSelectedRule(null);
                }

            }
        });

        Composite rightSide = new Composite(sashForm, SWT.NONE);
        formToolkit.adapt(rightSide);
        formToolkit.paintBordersFor(rightSide);
        rightSide.setLayout(new FillLayout(SWT.HORIZONTAL));

        SashForm sashForm_1 = new SashForm(rightSide, SWT.VERTICAL);
        formToolkit.adapt(sashForm_1);
        formToolkit.paintBordersFor(sashForm_1);

        final Section sctnNewSection_1 = formToolkit.createSection(sashForm_1, Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnNewSection_1);
        sctnNewSection_1.setText("Phrase Value Pairs");
        sctnNewSection_1.setExpanded(true);

        phraseMappingComposite = new ContentListComposite(sctnNewSection_1, SWT.NONE,
                Grammar_rulesPackage.eINSTANCE.getEntity_Entries(),
                Grammar_rulesPackage.eINSTANCE.getPhraseValuePair(), editor, cb);
        formToolkit.adapt(phraseMappingComposite);
        sctnNewSection_1.setClient(phraseMappingComposite);

        // phrase Column
        phraseMappingComposite.addColumn(getString("_UI_PhraseMapping_name_feature"), COLUMN_TYPE.RULENAME);

        // value Column
        phraseMappingComposite.addColumn(getString("_UI_PhraseValue_name_feature"), COLUMN_TYPE.RULENAME);

        phraseMappingComposite.getTableViewer().setColumnProperties(new String[] { "0", "1" });

        phraseMappingComposite.getTableViewer().setCellModifier(new ICellModifier() {

            @Override
            public boolean canModify(Object element, String property) {
                return true;
            }

            @Override
            public Object getValue(Object element, String property) {
                String result = "";
                PhraseValuePair pv = (PhraseValuePair) element;
                switch (property) {
                case "0":
                    if (pv.getPhrase() == null) {
                        result = "";
                    } else {
                        result = pv.getPhrase();
                    }
                    break;
                case "1":
                    if (pv.getValue() == null) {
                        result = "";
                    } else {
                        result = pv.getValue();
                    }
                    break;
                }
                return result;
            }

            @Override
            public void modify(Object element, String property, Object value) {
                TableItem item = (TableItem) element;
                PhraseValuePair pvOld = (PhraseValuePair) item.getData();
                EAttribute feature = null;
                String newString = (String) value;
                switch (property) {
                case "0":
                    feature = Grammar_rulesPackage.eINSTANCE.getPhraseValuePair_Phrase();
                    break;
                case "1":
                    feature = Grammar_rulesPackage.eINSTANCE.getPhraseValuePair_Value();
                    break;
                }
                if (!newString.equals(pvOld)) {
                    editor.getEditingDomain().getCommandStack()
                            .execute(SetCommand.create(editor.getEditingDomain(), item.getData(), feature, value));
                }
            }
        });

        phraseMappingComposite.getTableViewer().setCellEditors(
                new CellEditor[] { new TextCellEditor(phraseMappingComposite.getTableViewer().getTable()),
                        new TextCellEditor(phraseMappingComposite.getTableViewer().getTable()) });

        phraseMappingComposite.getTableViewer().addSelectionChangedListener(new ISelectionChangedListener() {
            // This ensures that we handle selections correctly, i.e.
            // for each
            // selected entity rule a corresponding PhraseValue Pair is
            // shown in
            // the detail view
            //
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) entityTableViewer.getSelection();
                if (selection != null) {
                    editor.setCurrentViewer(phraseMappingComposite.getTableViewer());
                }

            }
        });

        final Label errorLabel = formToolkit.createLabel(sctnNewSection_1, "", SWT.NONE);
        sctnNewSection_1.setTextClient(errorLabel);
        errorLabel.setForeground(
                getEditorSite().getWorkbenchWindow().getWorkbench().getDisplay().getSystemColor(SWT.COLOR_RED));

        CellEditor[] test = phraseMappingComposite.getTableViewer().getCellEditors();
        final CellEditor e = test[0];
        if (e instanceof TextCellEditor) {
            e.setValidator(new ABNFValidator());
            e.addListener(new ICellEditorListener() {
                @Override
                public void applyEditorValue() {
                    setErrorMessage(null);
                }

                @Override
                public void cancelEditor() {
                    setErrorMessage(null);
                }

                @Override
                public void editorValueChanged(boolean oldValidState, boolean newValidState) {
                    setErrorMessage(e.getErrorMessage());
                }

                private void setErrorMessage(String errorMessage) {
                    if (errorMessage != null) {
                        System.out.println(errorMessage);
                        errorLabel.setText(errorMessage);
                        sctnNewSection_1.layout();
                    } else {
                        errorLabel.setText("");
                        sctnNewSection_1.layout();
                    }
                }
            });
        }

        Section sctnNewSection_2 = formToolkit.createSection(sashForm_1, Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnNewSection_2);
        sctnNewSection_2.setText("Interpretation");
        sctnNewSection_2.setExpanded(true);

        treeViewerComposite = new EObjectTreeViewerComposite(sctnNewSection_2, SWT.NONE, editor, entitiesComposite);
        formToolkit.adapt(treeViewerComposite);
        formToolkit.paintBordersFor(treeViewerComposite);
        sctnNewSection_2.setClient(treeViewerComposite);

        sashForm_1.setWeights(new int[] { 1, 1 });
        sashForm.setWeights(new int[] { 1, 1 });
        setSelectedRule(null);

    }

    @Override
    public void setFocus() {
        editor.setCurrentViewer(entitiesComposite.getTableViewer());
    }

    protected void setSelectedRule(Rule rule) {
        selectedRule = rule;
        phraseMappingComposite.getTableViewer().setInput(rule);
        treeViewerComposite.getTreeViewer().setInput(rule);
        boolean enabled = rule != null;
        phraseMappingComposite.setEnabled(enabled);
        treeViewerComposite.getTreeViewer().getTree().setEnabled(enabled);
        treeViewerComposite.getTreeViewer().expandAll();
    }
}