Java tutorial
/* * 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; } }