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

Java tutorial

Introduction

Here is the source code for de.dfki.iui.mmds.sdk.editors.grammar_rules.SemanticMappingEditorPart.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 org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edit.command.ReplaceCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
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.widgets.Composite;
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.Grammar_rulesPackage;
import de.dfki.iui.mmds.core.model.speech_recognition.grammar_rules.PhraseMapping;
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.core.model.speech_recognition.grammar_rules.SemanticMapping;
import de.dfki.iui.mmds.sdk.editors.grammar_rules.ContentListComposite.COLUMN_TYPE;

/**
 * This is the EditorPart where the SemanticMApping rules can be edited. Similar
 * logic applies like for the Editor Part for the UtteranceRules. For more
 * detailed documentation please refer to the UtteranceEditorPart.class
 * 
 * @author Evica Ilieva & Robert Neelrath
 * 
 */
public class SemanticMappingEditorPart extends AbstractGrammarEditorPart {

    protected SemanticMapping selectedSemanticMapping;
    protected PhraseMapping selectedPhraseMapping;
    protected ContentListComposite rulesComposite;
    protected ContentListComposite phraseMappingComposite;
    protected ContentListComposite phraseComposite;
    protected EObjectTreeViewerComposite ruleTreeViewerComposite;
    protected EObjectTreeViewerComposite pmTreeViewerComposite;

    public SemanticMappingEditorPart(Ruleset ruleset, RulesEditor editor) {
        super(ruleset, editor, "Semanting Mappings Editor");
    }

    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        super.init(site, input);
        setPartName("Semantic Mapping Rules");
    }

    @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);

        SashForm sashForm_2 = new SashForm(sashForm, SWT.VERTICAL);
        formToolkit.adapt(sashForm_2);
        formToolkit.paintBordersFor(sashForm_2);

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

        rulesComposite = new ContentListComposite(sctnNewSection, SWT.NONE,
                Grammar_rulesPackage.eINSTANCE.getRuleset_Rules(),
                Grammar_rulesPackage.eINSTANCE.getSemanticMapping(), editor, cb);
        formToolkit.adapt(rulesComposite);
        sctnNewSection.setClient(rulesComposite);
        final TableViewer rulesTableViewer = rulesComposite.getTableViewer();

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

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

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

        rulesTableViewer.setCellModifier(new ICellModifier() {

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

            @Override
            public Object getValue(Object element, String property) {
                Object result = null;
                Rule rule = (Rule) element;
                switch (property) {
                case "0":
                    if (rule.getName() == null) {
                        result = "";
                    } else {
                        result = rule.getName() + "";
                    }
                    break;
                case "1":
                    result = new Boolean(rule.isEnabled());
                    break;
                }
                return result;
            }

            @Override
            public void modify(Object element, String property, Object value) {
                TableItem item = (TableItem) element;
                Rule oldValue = (Rule) 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;
                }
                if (oldValue.getName() != null) {
                    if ((property.equals("0") && !oldValue.getName().equals(value)) || property.equals("1")) {
                        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));
                }
            }
        });

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

        rulesTableViewer.setInput(ruleset);

        rulesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) rulesTableViewer.getSelection();
                if (selection != null && selection.size() == 1) {
                    setSelectedSemanticMapping((SemanticMapping) selection.getFirstElement());
                    editor.setCurrentViewer(rulesTableViewer);
                } else {
                    setSelectedSemanticMapping(null);
                }
            }
        });

        Section sctnSemanticMappingInterpretation = formToolkit.createSection(sashForm_2,
                Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnSemanticMappingInterpretation);
        sctnSemanticMappingInterpretation.setText("Semantic Mapping Interpretation");
        sctnSemanticMappingInterpretation.setExpanded(true);

        ruleTreeViewerComposite = new EObjectTreeViewerComposite(sctnSemanticMappingInterpretation, SWT.NONE,
                editor, rulesComposite);
        formToolkit.adapt(ruleTreeViewerComposite);
        formToolkit.paintBordersFor(ruleTreeViewerComposite);
        sctnSemanticMappingInterpretation.setClient(ruleTreeViewerComposite);

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

        SashForm sashForm_3 = new SashForm(sashForm_1, SWT.NONE);
        formToolkit.adapt(sashForm_3);
        formToolkit.paintBordersFor(sashForm_3);

        Section sctnPhraseMappings = formToolkit.createSection(sashForm_3, Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnPhraseMappings);
        sctnPhraseMappings.setText("Phrase Mappings");
        sctnPhraseMappings.setExpanded(true);

        phraseMappingComposite = new ContentListComposite(sctnPhraseMappings, SWT.NONE,
                Grammar_rulesPackage.eINSTANCE.getSemanticMapping_PhraseMappings(),
                Grammar_rulesPackage.eINSTANCE.getPhraseMapping(), editor, cb);

        final TableViewer phraseMappingTableViewer = phraseMappingComposite.getTableViewer();

        formToolkit.adapt(phraseMappingComposite);
        sctnPhraseMappings.setClient(phraseMappingComposite);

        // name Column
        phraseMappingComposite.addColumn("Description", COLUMN_TYPE.RULENAME);

        phraseMappingTableViewer.setColumnProperties(new String[] { "0" });

        phraseMappingTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            // This ensures that we handle selections correctly.
            //
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) phraseMappingTableViewer.getSelection();
                if (selection != null && selection.size() == 1) {
                    setSelectedPhraseMapping((PhraseMapping) selection.getFirstElement());
                    editor.setCurrentViewer(phraseMappingTableViewer);
                } else {
                    setSelectedPhraseMapping(null);
                }
            }
        });

        // cell modifier for changing the phrases in the table
        phraseMappingTableViewer.setCellModifier(new ICellModifier() {

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

            @Override
            public Object getValue(Object element, String property) {
                Object result = null;
                PhraseMapping selectedPhraseM = (PhraseMapping) element;
                if (selectedPhraseM != null) {
                    if (selectedPhraseM.getDescription() == null) {
                        result = "";
                    } else {
                        result = selectedPhraseM.getDescription() + "";
                    }
                }
                return result;
            }

            @Override
            public void modify(Object element, String property, Object value) {
                TableItem item = (TableItem) element;
                PhraseMapping oldPhraseM = (PhraseMapping) item.getData();
                EAttribute feature = Grammar_rulesPackage.eINSTANCE.getPhraseMapping_Description();
                if (oldPhraseM.getDescription() == null || !oldPhraseM.getDescription().equals(value)) {
                    editor.getEditingDomain().getCommandStack()
                            .execute(SetCommand.create(editor.getEditingDomain(), oldPhraseM, feature, value));
                }
            }
        });

        phraseMappingTableViewer
                .setCellEditors(new CellEditor[] { new TextCellEditor(phraseMappingTableViewer.getTable()) });

        final Section sctnNewSection_1 = formToolkit.createSection(sashForm_3, Section.TWISTIE | Section.TITLE_BAR);
        formToolkit.paintBordersFor(sctnNewSection_1);
        sctnNewSection_1.setText("Phrases");
        sctnNewSection_1.setExpanded(true);

        phraseComposite = new ContentListComposite(sctnNewSection_1, SWT.NONE,
                Grammar_rulesPackage.eINSTANCE.getPhraseMapping_Phrases(), EcorePackage.eINSTANCE.getEString(),
                editor, cb);
        formToolkit.adapt(phraseComposite);
        sctnNewSection_1.setClient(phraseComposite);
        TableViewer phraseTableViewer = phraseComposite.getTableViewer();

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

        phraseTableViewer.setColumnProperties(new String[] { "0" });

        phraseTableViewer.setCellModifier(new ICellModifier() {

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

            @Override
            public Object getValue(Object element, String property) {
                return element;
            }

            @Override
            public void modify(Object element, String property, Object value) {
                TableItem item = (TableItem) element;
                String oldValue = (String) item.getData();
                EAttribute feature = Grammar_rulesPackage.eINSTANCE.getPhraseMapping_Phrases();
                String newString = (String) value;
                if (oldValue == null || !oldValue.equals(newString)) {
                    // execute a replace command where the oldPhrase is
                    // updated with a new Phrase
                    for (String phrase : selectedPhraseMapping.getPhrases()) {
                        if (phrase.equals(newString)) {
                            errorLabel.setText("Phrases must be unique");
                            sctnNewSection_1.layout();
                            return;
                        }
                    }
                    ReplaceCommand cmd = new ReplaceCommand(editor.getEditingDomain(), selectedPhraseMapping,
                            feature, oldValue, newString);

                    editor.getEditingDomain().getCommandStack().execute(cmd);
                }
            }
        });

        phraseTableViewer.setCellEditors(new CellEditor[] { new TextCellEditor(phraseTableViewer.getTable()) });
        errorLabel = formToolkit.createLabel(sctnNewSection_1, "", SWT.NONE);
        sctnNewSection_1.setTextClient(errorLabel);
        errorLabel.setForeground(
                getEditorSite().getWorkbenchWindow().getWorkbench().getDisplay().getSystemColor(SWT.COLOR_RED));

        sashForm_3.setWeights(new int[] { 124, 159 });

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

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

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

        setSelectedSemanticMapping(null);
    }

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

    protected void setSelectedSemanticMapping(SemanticMapping sm) {
        selectedSemanticMapping = sm;
        phraseMappingComposite.getTableViewer().setInput(sm);
        setSelectedPhraseMapping(null);
        ruleTreeViewerComposite.getTreeViewer().setInput(sm);
        boolean enabled = sm != null;
        phraseMappingComposite.setEnabled(enabled);
        ruleTreeViewerComposite.getTreeViewer().getTree().setEnabled(enabled);
    }

    protected void setSelectedPhraseMapping(PhraseMapping pm) {
        selectedPhraseMapping = pm;
        phraseComposite.getTableViewer().setInput(pm);
        pmTreeViewerComposite.getTreeViewer().setInput(pm);
        boolean enabled = pm != null;
        phraseComposite.setEnabled(enabled);
        pmTreeViewerComposite.getTreeViewer().getTree().setEnabled(enabled);
    }
}