blob: df3058af81dff40ab2e2587f331341c95c1feccd [file] [log] [blame]
/*
* 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.uima.ruta.cde.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.uima.ruta.addons.RutaAddonsPlugin;
import org.apache.uima.ruta.cde.IRutaConstraint;
import org.apache.uima.ruta.cde.RutaGEConstraint;
import org.apache.uima.ruta.cde.RutaRuleListConstraint;
import org.apache.uima.ruta.cde.SimpleRutaRuleConstraint;
import org.apache.uima.ruta.cde.utils.CDEComparatorFactory;
import org.apache.uima.ruta.cde.utils.ConstraintData;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IMemento;
public class ConstraintSelectComposite extends Composite implements ISelectionChangedListener {
private Clipboard clipboard;
private Button constraintButtonRuta;
private Button constraintButtonRutaList;
private Button constraintButconJava;
private Button constraintRemoveButton;
private Button constraintButtonTMComplex;
private Button exportConstraintsButton;
private ConstraintSelectTableLabelProvider labelProvider;
private ConstraintSelectTableContentProvider contentProvider;
private HashMap<String, Image> images;
private Table table;
private TableColumn tc0;
private TableColumn tc1;
private TableColumn tc2;
private TableViewer tableViewer;
private TableEditor editor;
private List<ConstraintData> constraintList;
private int EDITABLECOLUMN = 1;
private CDEComparatorFactory comparatorFactory;
public ConstraintSelectComposite(Composite parent, int style) {
super(parent, style);
initGui();
clipboard = new Clipboard(parent.getDisplay());
comparatorFactory = new CDEComparatorFactory();
}
public void initGui() {
constraintList = new ArrayList<ConstraintData>();
this.setLayout(new FormLayout());
// Simple Constraint Button
constraintButtonRuta = new Button(this, SWT.PUSH | SWT.CENTER);
FormData ConstraintButtonTMData = new FormData();
ConstraintButtonTMData.width = 25;
ConstraintButtonTMData.height = 25;
ConstraintButtonTMData.top = new FormAttachment(0, 10);
ConstraintButtonTMData.right = new FormAttachment(100, -5);
constraintButtonRuta.setLayoutData(ConstraintButtonTMData);
Image folderIcon = getImage("add");
constraintButtonRuta.setImage(folderIcon);
constraintButtonRuta.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
ConstraintDialog cdialog = new ConstraintDialog(getShell());
cdialog.create();
if (cdialog.open() == Window.OK) {
SimpleRutaRuleConstraint newConstraint = new SimpleRutaRuleConstraint(cdialog.getRule(),
cdialog.getDescription());
ConstraintData newConstraintData = new ConstraintData(newConstraint);
constraintList.add(newConstraintData);
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
}
});
// ListConstraint Button
constraintButtonRutaList = new Button(this, SWT.PUSH | SWT.CENTER);
FormData ConstraintButtonTMListData = new FormData();
ConstraintButtonTMListData.width = 25;
ConstraintButtonTMListData.height = 25;
ConstraintButtonTMListData.top = new FormAttachment(constraintButtonRuta, 10);
ConstraintButtonTMListData.right = new FormAttachment(100, -5);
constraintButtonRutaList.setLayoutData(ConstraintButtonTMListData);
Image addListIcon = getImage("scriptAdd");
constraintButtonRutaList.setImage(addListIcon);
constraintButtonRutaList.setToolTipText("Add a list of SimpleRutaConstraints");
constraintButtonRutaList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
ConstraintDialog cdialog = new ConstraintDialog(getShell());
cdialog.create();
if (cdialog.open() == Window.OK) {
RutaRuleListConstraint newConstraint = new RutaRuleListConstraint(cdialog.getRule(),
cdialog.getDescription());
ConstraintData newConstraintData = new ConstraintData(newConstraint);
constraintList.add(newConstraintData);
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
}
});
// Complex Constraint Button now used for GEConstraints
constraintButtonTMComplex = new Button(this, SWT.PUSH | SWT.CENTER);
FormData ConstraintButtonTMComplexData = new FormData();
ConstraintButtonTMComplexData.width = 25;
ConstraintButtonTMComplexData.height = 25;
ConstraintButtonTMComplexData.top = new FormAttachment(constraintButtonRutaList, 10);
ConstraintButtonTMComplexData.right = new FormAttachment(100, -5);
constraintButtonTMComplex.setLayoutData(ConstraintButtonTMComplexData);
Image addTableIcon = getImage("tmAdd");
constraintButtonTMComplex.setImage(addTableIcon);
constraintButtonTMComplex.setToolTipText("Add an Annotation-Distribution Constraint");
constraintButtonTMComplex.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
ConstraintDialog cdialog = new ConstraintDialog(getShell());
cdialog.create();
if (cdialog.open() == Window.OK) {
RutaGEConstraint newConstraint = new RutaGEConstraint(cdialog.getRule(), cdialog
.getDescription());
ConstraintData newConstraintData = new ConstraintData(newConstraint);
constraintList.add(newConstraintData);
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
}
});
// Constraint Edit Button
constraintButconJava = new Button(this, SWT.PUSH | SWT.CENTER);
FormData ConstraintButtonJavaData = new FormData();
ConstraintButtonJavaData.width = 25;
ConstraintButtonJavaData.height = 25;
ConstraintButtonJavaData.top = new FormAttachment(constraintButtonTMComplex, 10);
ConstraintButtonJavaData.right = new FormAttachment(100, -5);
constraintButconJava.setLayoutData(ConstraintButtonJavaData);
Image addJavaIcon = getImage("cupAdd");
constraintButconJava.setImage(addJavaIcon);
constraintButconJava.setToolTipText("Add Java Constraint");
constraintRemoveButton = new Button(this, SWT.PUSH | SWT.CENTER);
FormData ConstraintRemoveData = new FormData();
ConstraintRemoveData.width = 25;
ConstraintRemoveData.height = 25;
ConstraintRemoveData.top = new FormAttachment(constraintButconJava, 10);
ConstraintRemoveData.right = new FormAttachment(100, -5);
constraintRemoveButton.setLayoutData(ConstraintRemoveData);
Image addRemoveIcon = getImage("delete");
constraintRemoveButton.setImage(addRemoveIcon);
constraintRemoveButton.setToolTipText("Remove Selected Constraints");
constraintRemoveButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int[] indices = table.getSelectionIndices();
for (int i = indices.length - 1; i >= 0; i--) {
constraintList.remove(indices[i]);
}
tableViewer.setSelection(new StructuredSelection());
editor.getEditor().dispose();
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
});
tableViewer = new TableViewer(this, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.FULL_SELECTION);
contentProvider = new ConstraintSelectTableContentProvider();
labelProvider = new ConstraintSelectTableLabelProvider();
tableViewer.setContentProvider(contentProvider);
tableViewer.setLabelProvider(labelProvider);
table = tableViewer.getTable();
FormData tableFormData = new FormData();
tableFormData.top = new FormAttachment(0, 10);
tableFormData.left = new FormAttachment(0, 10);
tableFormData.right = new FormAttachment(constraintButtonRuta, -10);
tableFormData.bottom = new FormAttachment(100, 0);
table.setLayoutData(tableFormData);
table.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
// if (((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'c')) {
// String output = "";
// TableItem[] items = table.getSelection();
// for (TableItem item : items) {
// ConstraintData data = (ConstraintData) item.getData();
// output = output + data.getConstraint().getData() + "\n";
// }
// clipboard.setContents(new Object[] { output },
// new Transfer[] { TextTransfer.getInstance() });
// }
}
public void keyReleased(KeyEvent arg0) {
}
});
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
if (selection.isEmpty()) {
return;
}
Object element = selection.getFirstElement();
if (element instanceof ConstraintData) {
ConstraintData data = (ConstraintData) element;
IRutaConstraint constraint = data.getConstraint();
if (constraint instanceof SimpleRutaRuleConstraint) {
ConstraintDialog cdialog = new ConstraintDialog(getShell());
cdialog.create((SimpleRutaRuleConstraint) constraint);
if (cdialog.open() == Window.OK) {
SimpleRutaRuleConstraint newConstraint = new SimpleRutaRuleConstraint(cdialog
.getRule(), cdialog.getDescription());
data.setConstraint(newConstraint);
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
}
if (constraint instanceof RutaRuleListConstraint) {
ConstraintDialog cdialog = new ConstraintDialog(getShell());
cdialog.create((RutaRuleListConstraint) constraint);
if (cdialog.open() == Window.OK) {
RutaRuleListConstraint newConstraint = new RutaRuleListConstraint(cdialog.getRule(),
cdialog.getDescription());
data.setConstraint(newConstraint);
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
}
if (constraint instanceof RutaGEConstraint) {
ConstraintDialog cdialog = new ConstraintDialog(getShell());
cdialog.create((RutaGEConstraint) constraint);
if (cdialog.open() == Window.OK) {
RutaGEConstraint newConstraint = new RutaGEConstraint(cdialog.getRule(), cdialog
.getDescription());
data.setConstraint(newConstraint);
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
}
}
// /...
}
});
tc1 = new TableColumn(table, SWT.LEFT);
tc1.setText("Constraint");
tc1.setWidth(300);
tc1.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
Comparator comparator = comparatorFactory.getComparator(tc1);
Collections.sort(constraintList, comparator);
if (editor.getEditor() != null) {
editor.getEditor().dispose();
}
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
});
tc2 = new TableColumn(table, SWT.LEFT);
tc2.setText("Weight");
tc2.setWidth(50);
tc2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
Comparator comparator = comparatorFactory.getComparator(tc2);
Collections.sort(constraintList, comparator);
if (editor.getEditor() != null) {
editor.getEditor().dispose();
}
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
});
editor = new TableEditor(table);
// The editor must have the same size as the cell and must
// not be any smaller than 50 pixels.
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.minimumWidth = 50;
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// Clean up any previous editor control
Control oldEditor = editor.getEditor();
if (oldEditor != null)
oldEditor.dispose();
// Identify the selected row
TableItem item = (TableItem) e.item;
if (item == null)
return;
// The control that will be the editor must be a child of the
// Table
Spinner newEditor = new Spinner(table, SWT.NONE);
if (item.getData() instanceof ConstraintData) {
ConstraintData data = (ConstraintData) item.getData();
newEditor.setSelection(data.getWeight());
}
newEditor.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (editor.getItem().isDisposed()) {
return;
}
Spinner spinner = (Spinner) editor.getEditor();
int newWeight = spinner.getSelection();
TableItem item = editor.getItem();
if (item.getData() instanceof ConstraintData) {
ConstraintData data = (ConstraintData) item.getData();
data.setWeight(newWeight);
}
tableViewer.refresh();
}
});
newEditor.setFocus();
editor.setEditor(newEditor, item, EDITABLECOLUMN);
}
});
// Resize columns to match input
// for (int i = 0, n = table.getColumnCount(); i < n; i++) {
// table.getColumn(i).pack();
// }
table.setHeaderVisible(true);
table.setLinesVisible(true);
tableViewer.refresh();
this.layout();
}
public void selectionChanged(SelectionChangedEvent arg0) {
// TODO Auto-generated method stub
}
private void initImages() {
images = new HashMap<String, Image>();
ImageDescriptor desc;
Image image;
String name;
desc = RutaAddonsPlugin.getImageDescriptor("/icons/10563.add_as_source_folder.gif");
image = desc.createImage();
name = "addAsSourceFolder";
images.put(name, image);
desc = RutaAddonsPlugin.getImageDescriptor("/icons/cup_add.png");
image = desc.createImage();
name = "cupAdd";
images.put(name, image);
desc = RutaAddonsPlugin.getImageDescriptor("/icons/delete.png");
image = desc.createImage();
name = "delete";
images.put(name, image);
desc = RutaAddonsPlugin.getImageDescriptor("/icons/script_add.png");
image = desc.createImage();
name = "scriptAdd";
images.put(name, image);
desc = RutaAddonsPlugin.getImageDescriptor("/icons/ruta_obj_add.png");
image = desc.createImage();
name = "tmAdd";
images.put(name, image);
desc = RutaAddonsPlugin.getImageDescriptor("/icons/add.png");
image = desc.createImage();
name = "add";
images.put(name, image);
desc = RutaAddonsPlugin.getImageDescriptor("/icons/folder_page.png");
image = desc.createImage();
name = "export";
images.put(name, image);
}
public Image getImage(String name) {
if (images == null) {
initImages();
}
return images.get(name);
}
public List<ConstraintData> getConstraintList() {
return this.constraintList;
}
public TableViewer getViewer() {
return tableViewer;
}
public void saveState(IMemento memento) {
for (ConstraintData constraintData : constraintList) {
if (constraintData.getConstraint() instanceof SimpleRutaRuleConstraint) {
IMemento currentMemento = memento.createChild("constraint", "SimpleRutaConstraint");
SimpleRutaRuleConstraint constraint = (SimpleRutaRuleConstraint) constraintData
.getConstraint();
currentMemento.createChild("Data", constraint.getData());
currentMemento.createChild("Description", constraint.getDescription());
currentMemento.createChild("Weight", "" + constraintData.getWeight());
}
if (constraintData.getConstraint() instanceof RutaRuleListConstraint) {
IMemento currentMemento = memento.createChild("constraint", "ListRutaConstraint");
RutaRuleListConstraint constraint = (RutaRuleListConstraint) constraintData.getConstraint();
currentMemento.createChild("Data", constraint.getData());
currentMemento.createChild("Description", constraint.getDescription());
currentMemento.createChild("Weight", "" + constraintData.getWeight());
}
if (constraintData.getConstraint() instanceof RutaGEConstraint) {
IMemento currentMemento = memento.createChild("constraint", "GEConstraint");
RutaGEConstraint constraint = (RutaGEConstraint) constraintData.getConstraint();
currentMemento.createChild("Data", constraint.getData());
currentMemento.createChild("Description", constraint.getDescription());
currentMemento.createChild("Weight", "" + constraintData.getWeight());
}
}
}
public void restoreState(IMemento memento) {
for (IMemento constraintMemento : memento.getChildren("constraint")) {
if (constraintMemento.getID().equals("SimpleRutaConstraint")) {
String rule = constraintMemento.getChild("Data").getID();
String description = constraintMemento.getChild("Description").getID();
SimpleRutaRuleConstraint constraint = new SimpleRutaRuleConstraint(rule, description);
ConstraintData data = new ConstraintData(constraint);
String weightString = constraintMemento.getChild("Weight").getID();
if (!StringUtils.isBlank(weightString)) {
data.setWeight(Integer.parseInt(weightString));
}
constraintList.add(data);
}
if (constraintMemento.getID().equals("ListRutaConstraint")) {
String rule = constraintMemento.getChild("Data").getID();
String description = constraintMemento.getChild("Description").getID();
RutaRuleListConstraint constraint = new RutaRuleListConstraint(rule, description);
ConstraintData data = new ConstraintData(constraint);
String weightString = constraintMemento.getChild("Weight").getID();
if (!StringUtils.isBlank(weightString)) {
data.setWeight(Integer.parseInt(weightString));
}
constraintList.add(data);
}
if (constraintMemento.getID().equals("GEConstraint")) {
String rule = constraintMemento.getChild("Data").getID();
String description = constraintMemento.getChild("Description").getID();
RutaGEConstraint constraint = new RutaGEConstraint(rule, description);
ConstraintData data = new ConstraintData(constraint);
String weightString = constraintMemento.getChild("Weight").getID();
if (!StringUtils.isBlank(weightString)) {
data.setWeight(Integer.parseInt(weightString));
}
constraintList.add(data);
}
}
tableViewer.setInput(constraintList);
tableViewer.refresh();
}
public static Image createImage(String path) {
return RutaAddonsPlugin.getImageDescriptor(path).createImage();
}
public void setConstraints(List<ConstraintData> constraints) {
this.constraintList = constraints;
}
}