org.apache.opennlp.caseditor.namefinder.NameFinderViewPage.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.opennlp.caseditor.namefinder.NameFinderViewPage.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

package org.apache.opennlp.caseditor.namefinder;

import org.apache.opennlp.caseditor.ConfirmAnnotationAction;
import org.apache.opennlp.caseditor.OpenPreferenceDialog;
import org.apache.opennlp.caseditor.PotentialAnnotation;
import org.apache.opennlp.caseditor.PotentialAnnotationComperator;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.caseditor.CasEditorPlugin;
import org.apache.uima.caseditor.Images;
import org.apache.uima.caseditor.editor.AnnotationEditor;
import org.apache.uima.caseditor.editor.ICasDocument;
import org.apache.uima.caseditor.editor.ICasEditor;
import org.apache.uima.caseditor.editor.ICasEditorInputListener;
import org.apache.uima.caseditor.editor.util.AnnotationSelection;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.part.Page;
import org.eclipse.ui.part.PageBook;

// TODO: Selected entities should be highlighted in the annotation editor!
//       How can that be done? Should we simply create feature structures, which are not added to the index!?         

// TODO: There should be a way to display error messages in this view, e.g.
//       when no names are detected. -> give an indication what could be wrong!
class NameFinderViewPage extends Page implements ISelectionListener {

    private static final String QUICK_ANNOTATE_ACTION_ID = "QuickAnnotate";

    private NameFinderView nameFinderView;

    private ICasEditor editor;

    private PageBook book;

    private Text messageText;
    private TableViewer entityList;

    NameFinderViewPage(NameFinderView nameFinderView, ICasEditor editor, ICasDocument document) {
        this.nameFinderView = nameFinderView;
        this.editor = editor;

        IPreferenceStore store = editor.getCasDocumentProvider()
                .getTypeSystemPreferenceStore(editor.getEditorInput());
        NameFinderPreferenceInitializer.initializeDefaultPreferences(store);
    }

    public void createControl(Composite parent) {

        book = new PageBook(parent, SWT.NONE);

        messageText = new Text(book, SWT.WRAP | SWT.READ_ONLY);
        messageText.setText("Loading name finder models ...");

        entityList = new TableViewer(book, SWT.NONE);

        Table entityTable = entityList.getTable();
        entityTable.setHeaderVisible(true);
        entityTable.setLinesVisible(true);

        TableViewerColumn confidenceViewerColumn = new TableViewerColumn(entityList, SWT.NONE);
        TableColumn confidenceColumn = confidenceViewerColumn.getColumn();
        confidenceColumn.setText("%");
        confidenceColumn.setWidth(40);

        TableViewerColumn entityViewerColumn = new TableViewerColumn(entityList, SWT.NONE);
        TableColumn entityColumn = entityViewerColumn.getColumn();
        entityColumn.setText("Entity");
        entityColumn.setWidth(135);

        TableViewerColumn typeViewerColumn = new TableViewerColumn(entityList, SWT.NONE);
        TableColumn typeColumn = typeViewerColumn.getColumn();
        typeColumn.setText("Type");
        typeColumn.setWidth(40);

        entityList.setLabelProvider(new PotentialEntityAnnotationLabelProvider());
        entityList.setContentProvider(new EntityContentProvider(this, (AnnotationEditor) editor, entityList));
        getSite().setSelectionProvider(entityList);

        entityList.setComparator(new PotentialAnnotationComperator());

        entityList.setInput(editor.getDocument());

        getSite().setSelectionProvider(entityList);

        entityList.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                StructuredSelection selection = (StructuredSelection) event.getSelection();

                // There are two types of entities, confirmed and un-confirmed.
                // Confirmed entities are linked with the according annotation and
                // are selected through the entity lists selection provider.

                // Unconfirmed entities are not selected, but the span they are covering
                // is highlighted and revealed in the Annotation Editor.

                if (!selection.isEmpty()) {
                    PotentialAnnotation entity = (PotentialAnnotation) selection.getFirstElement();

                    if (editor instanceof AnnotationEditor) {
                        ((AnnotationEditor) editor).selectAndReveal(entity.getBeginIndex(),
                                entity.getEndIndex() - entity.getBeginIndex());
                    }
                }
            }
        });

        // Display the messageLabel after start up
        book.showPage(messageText);

        getSite().getPage().addSelectionListener(this);
    }

    public void selectionChanged(IWorkbenchPart part, ISelection selection) {

        boolean isForeignSelection = !(part instanceof NameFinderView
                && ((NameFinderView) part).getCurrentPage() == this);

        if (isForeignSelection) {
            if (selection instanceof StructuredSelection) {
                AnnotationSelection annotations = new AnnotationSelection((StructuredSelection) selection);

                if (!annotations.isEmpty()) {
                    AnnotationFS firstAnnotation = annotations.getFirst();

                    // If that annotation exist, then match it.
                    // Bug: Need to check the type also ...
                    PotentialAnnotation entity = new PotentialAnnotation(firstAnnotation.getBegin(),
                            firstAnnotation.getEnd(), firstAnnotation.getCoveredText(), null,
                            firstAnnotation.getType().getName());

                    ISelection tableSelection = new StructuredSelection(entity);
                    entityList.setSelection(tableSelection, true);
                }
            }
        }
    }

    public Control getControl() {
        return book;
    }

    public void setFocus() {
        getControl().setFocus();
    }

    void setMessage(String message) {

        if (message != null) {
            messageText.setText(message);
            book.showPage(messageText);
        } else {
            messageText.setText("");
            book.showPage(entityList.getControl());
        }
    }

    @Override
    public void setActionBars(IActionBars actionBars) {
        super.setActionBars(actionBars);

        // TODO: We need a confirm icon

        IToolBarManager toolBarManager = actionBars.getToolBarManager();

        BaseSelectionListenerAction confirmAction = new ConfirmAnnotationAction(entityList, editor);
        confirmAction.setActionDefinitionId(QUICK_ANNOTATE_ACTION_ID);
        actionBars.setGlobalActionHandler(QUICK_ANNOTATE_ACTION_ID, confirmAction);
        getSite().getSelectionProvider().addSelectionChangedListener(confirmAction); // need also to unregister!!!!

        toolBarManager.add(confirmAction);

        // TODO: Create a preference action
        // Open a dialog like already done for the annotation styles
        // Provide the preference store to this dialog
        // Provide a type system to this preference store

        IAction action = new OpenPreferenceDialog(getSite().getShell(), editor);

        action.setImageDescriptor(CasEditorPlugin.getTaeImageDescriptor(Images.MODEL_PROCESSOR_FOLDER));

        toolBarManager.add(action);

        // TODO:
        // How to make an action which changes the selection in the editor? Must be possible to make
        // it large smaller on both sides, like the actions we already have, but not for an annotation!
        // Key short cuts
        // alt + left/right key for right annotation side
        // ctrl + left/right key for left annotation side

    }

    boolean isActive() {
        IWorkbenchPart activePart = getSite().getPage().getActivePart();

        return nameFinderView == activePart;
    }
}