blob: 0a9d7253da3ce66a350c54134d4b0249c6ee1107 [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.taeconfigurator.editors.ui;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.collection.CasConsumerDescription;
import org.apache.uima.resource.PearSpecifier;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.URISpecifier;
import org.apache.uima.resource.metadata.ConfigurationParameter;
import org.apache.uima.resource.metadata.Import;
import org.apache.uima.resource.metadata.NameValuePair;
import org.apache.uima.taeconfigurator.TAEConfiguratorPlugin;
import org.apache.uima.taeconfigurator.editors.MultiPageEditor;
import org.apache.uima.taeconfigurator.editors.ui.dialogs.AddRemoteServiceDialog;
import org.apache.uima.taeconfigurator.editors.ui.dialogs.FindComponentDialog;
import org.apache.uima.taeconfigurator.editors.ui.dialogs.PickTaeForTypesDialog;
import org.apache.uima.taeconfigurator.files.MultiResourceSelectionDialogWithFlowOption;
import org.apache.uima.taeconfigurator.model.FlowNodes;
import org.apache.uima.util.XMLizable;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.forms.IManagedForm;
public class AggregateSection extends AbstractSection {
private Table filesTable;
private Button addButton;
private Button addRemoteButton;
private Button findAnalysisEngineButton;
private Button removeButton;
private Button addToFlowButton;
private Button removeFromFlowButton;
public Button getRemoveFromFlowButton() {
return removeFromFlowButton;
}
private boolean bDisableToolTipHelp = false;
/**
* Creates a section for aggregate specifiers to add their delegates
*
* @param editor
* backpointer to the main multipage editor
* @param parent
* the Composite where this section lives
*/
public AggregateSection(MultiPageEditor aEditor, Composite parent) {
super(aEditor, parent, "Component Engines",
"The following engines are included in this aggregate.");
}
/*
* Called by the page constructor after all sections are created, to initialize them.
* (non-Javadoc)
*
* @see org.eclipse.ui.forms.IFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
*/
public void initialize(IManagedForm form) {
super.initialize(form);
Composite sectionClient = new2ColumnComposite(this.getSection());
// Table Container has table and buttons on bottom
Composite tableContainer = newComposite(sectionClient);
enableBorders(tableContainer);
toolkit.paintBordersFor(tableContainer);
filesTable = newTable(tableContainer, SWT.FULL_SELECTION, 150);
filesTable.setHeaderVisible(true);
newTableColumn(filesTable, 50, SWT.LEFT, "Delegate");
newTableColumn(filesTable, 75, SWT.LEFT, "Key Name");
// This little code fragment is an attempt to get the right sizing for the buttons
// Was wrong on Mac platforms
// Word below is the longer of the two words in the button container
Button tempForSize = toolkit.createButton(tableContainer, "Remove", SWT.PUSH);
Point p = tempForSize.computeSize(SWT.DEFAULT, SWT.DEFAULT);
tempForSize.dispose();
Composite bottomButtonContainer = newButtonContainer(tableContainer, HORIZONTAL_BUTTONS, 3* p.x);
addButton = newPushButton(bottomButtonContainer, S_ADD,
"Click here to add a locally defined AE or CAS Consumer delegate", ENABLED);
removeButton = newPushButton(bottomButtonContainer, "Remove",
"Click here to remove the selected item", ENABLED);
Composite sideButtonContainer = newButtonContainer(sectionClient, VERTICAL_BUTTONS, 80);
// this next just serves as a spacer
spacer(sideButtonContainer);
spacer(sideButtonContainer);
addToFlowButton = newPushButton(sideButtonContainer, ">>",
"Click here to add the selected item to the flow", !ENABLED);
removeFromFlowButton = newPushButton(sideButtonContainer, "<<",
"Click here to remove the selected item from the flow", !ENABLED);
spacer(sideButtonContainer);
addRemoteButton = newPushButton(sideButtonContainer, "AddRemote",
"Click here to add a Remote Analysis Engine", ENABLED);
findAnalysisEngineButton = newPushButton(sideButtonContainer, "Find AE",
"Click here to search for an Analysis Engine", ENABLED);
addButton.setSize(removeButton.getSize());
filesTable.addListener(SWT.MouseDown, this);
filesTable.addListener(SWT.MouseHover, this);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.forms.IFormPart#refresh()
*/
public void refresh() {
super.refresh();
// if annotator is primitive - page should be disabled
if (!isAggregate()) {
filesTable.removeAll();
getSection().setText("Not Used");
getSection().setDescription("This section is only applicable for Aggregate descriptors.");
} else {
getSection().setText("Component Engines");
getSection().setDescription("The following engines are included in this aggregate.");
// these can be changed by direct editing of source
Map delegates = getDelegateAnalysisEngineSpecifiersWithImports();
// first clear list
// (we do this carefully to preserve order)
String[] priorOrderedKeys = new String[filesTable.getItemCount()];
for (int i = 0; i < priorOrderedKeys.length; i++) {
priorOrderedKeys[i] = filesTable.getItem(i).getText(1);
}
filesTable.removeAll();
// get delegate keys
HashSet keys = new HashSet();
if (delegates != null) {
keys.addAll(delegates.keySet());
}
// first add keys that we know about in order as we knew it
for (int i = 0; i < priorOrderedKeys.length; i++) {
if (keys.contains(priorOrderedKeys[i])) {
Object o = delegates.get(priorOrderedKeys[i]);
if (o instanceof Import)
addFile(o, priorOrderedKeys[i]);
keys.remove(priorOrderedKeys[i]);
}
}
Iterator itKeys = keys.iterator();
// add what's left to list
while (itKeys.hasNext()) {
String key = (String) itKeys.next();
Object o = delegates.get(key);
if (o instanceof Import)
addFile(o, key);
}
packTable(filesTable);
}
enable();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event) {
if (event.widget == addButton)
handleAdd();
else if (event.widget == removeButton
|| (event.type == SWT.KeyUp && event.character == SWT.DEL))
handleRemove();
else if (event.widget == addToFlowButton)
handleAddToFlow();
else if (event.widget == removeFromFlowButton)
handleRemoveFromFlow();
else if (event.widget == addRemoteButton)
handleAddRemote();
else if (event.widget == findAnalysisEngineButton)
handleFindAnalysisEngine();
// actions on table
else if (event.widget == filesTable) {
if (event.type == SWT.Selection) {
// if no delegate is selected disable edit and remove
boolean bEnableButtons = (filesTable.getSelectionCount() > 0);
removeButton.setEnabled(bEnableButtons);
addToFlowButton.setEnabled(bEnableButtons);
} else if (event.type == SWT.MouseDown &&
(event.button == 3 ||
// this is for Macintosh - they just have one button
(event.button == 1 && (0 != (event.stateMask & SWT.CTRL))))) {
handleTableContextMenuRequest(event);
} else if (event.type == SWT.MouseHover && !bDisableToolTipHelp) {
handleTableHoverHelp(event);
}
// Don't need this. Next mouse hover kills tool tip anyway
// else if (event.type == SWT.MouseMove) {
// filesTable.setToolTipText("");
// }
}
}
private void handleAdd() {
MultiResourceSelectionDialogWithFlowOption dialog = new MultiResourceSelectionDialogWithFlowOption(
getSection().getShell(), editor.getFile().getProject().getParent(),
"Component Engine Selection", editor.getFile().getLocation(), editor);
dialog.setTitle("Component Engine Selection");
dialog.setMessage("Select one or more component engines from the workspace:");
if (Window.CANCEL == dialog.open()) {
return;
}
Object[] files = dialog.getResult();
if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i++) {
FileAndShortName fsn = new FileAndShortName(files[i]);
produceKeyAddDelegate(fsn.shortName, fsn.fileName, dialog.getAutoAddToFlow(),
dialog.isImportByName);
}
}
}
private void produceKeyAddDelegate(String shortName, String fullPathFileName, boolean addToFlow,
boolean isImportByName) {
boolean bSuccess = false;
// key is shortName plus a suffix if needed to make it unique.
// The set of existing keys is obtained from the model,
// not from the GUI table (as was the case in earlier design)
String keyName = produceUniqueComponentKey(shortName);
if (null != keyName) {
bSuccess = addDelegate(fullPathFileName, shortName, keyName, isImportByName);
if (bSuccess) {
editor.addDirtyTypeName("<Aggregate>"); // force running jcasgen
refresh(); // refresh every time to capture the order of items added
if (addToFlow) {
addNodeToFlow(keyName);
}
}
}
}
private void handleRemove() {
// get the keyName to remove
int nSelectionIndex = filesTable.getSelectionIndex();
String key = filesTable.getItem(nSelectionIndex).getText(1);
// if delegate is still on flow list warn that it may be removed
if (editor.getAggregatePage().getFlowSection().containsNode(key)) {
String sCascadeDeleteTitle = "Cascade delete warning";
String sCascadeDeleteMessage = "This will cause a cascading deletion of an associated input, output, index, or type priority. Ok to continue?";
boolean bContinue = MessageDialog.openConfirm(getSection().getShell(), sCascadeDeleteTitle,
sCascadeDeleteMessage);
if (!bContinue) {
return;
}
}
ResourceSpecifier delegate = (ResourceSpecifier) editor.getResolvedDelegates().get(key);
// remove the selected delegate from delegate list
Map delegatesWithImport = editor.getAeDescription()
.getDelegateAnalysisEngineSpecifiersWithImports();
Object savedDelegate1 = delegatesWithImport.get(key);
delegatesWithImport.remove(key);
Object savedDelegate2 = getDelegateAnalysisEngineSpecifiersWithImports().get(key);
getDelegateAnalysisEngineSpecifiersWithImports().remove(key);
// update the model: flow lists: remove the item from the flow list
// This has to be done before validation - otherwise get validation error.
// Support undo
FlowNodes flow = new FlowNodes(getAnalysisEngineMetaData().getFlowConstraints());
String[] savedFlowNodes = flow.getFlow();
if (null == savedFlowNodes)
savedFlowNodes = stringArray0;
// item may be in the flow 0, 1 or more times
List nodes = new ArrayList(savedFlowNodes.length);
for (int i = 0; i < savedFlowNodes.length; i++) {
String flowNode = savedFlowNodes[i];
if (!flowNode.equals(key)) {
nodes.add(flowNode);
}
}
flow.setFlow((String[]) nodes.toArray(stringArray0));
if (!isValidAggregateChange()) {
getDelegateAnalysisEngineSpecifiersWithImports().put(key, savedDelegate2);
delegatesWithImport.put(key, savedDelegate1);
flow.setFlow(savedFlowNodes);
return;
}
Map typeNameHash = editor.allTypes.get();
boolean bInputsChanged = !editor.validateInputs(typeNameHash);
boolean bOutputsChanged = !editor.validateOutputs(typeNameHash);
if (bInputsChanged || bOutputsChanged) {
String msg = "Some of the following are no longer valid and have been deleted (or appropriately altered): \n\n";
if (bInputsChanged) {
msg += "Inputs \n";
}
if (bOutputsChanged) {
msg += "Outputs \n";
}
Utility.popMessage("Capabilities Changed", msg, MessageDialog.INFORMATION);
}
SofaMapSection.removeSofaMappings(key, delegate, editor);
editor.getAggregatePage().getFlowSection().refresh();
if (filesTable.getItemCount() > nSelectionIndex) {
filesTable.setSelection(nSelectionIndex);
filesTable.setFocus();
enable();
}
refresh();
finishAggregateChangeAction();
// remove still must handle removal of parameters and param settings
// removed delegate (if params dont appear elsewhere)
}
private void handleAddToFlow() {
String node = filesTable.getSelection()[0].getText(1);
addNodeToFlow(node);
getTable().setSelection(-1);
enable();
Table flowList = editor.getAggregatePage().getFlowSection().getFlowList();
flowList.setSelection(flowList.getItemCount() - 1);
editor.getAggregatePage().getFlowSection().enable();
flowList.setFocus();
}
/**
* @param node
*/
private void addNodeToFlow(String node) {
FlowSection fs = editor.getAggregatePage().getFlowSection();
fs.addNode(node);
// fs.refresh(); // the fs.addNode does a refresh
}
private void handleRemoveFromFlow() {
FlowSection fs = editor.getAggregatePage().getFlowSection();
String selectedKey = fs.getFlowList().getSelection()[0].getText();
fs.handleRemove();
for (int i = 0; i < getTable().getItemCount(); i++) {
String thisKey = getTable().getItem(i).getText(1);
if (selectedKey.equals(thisKey)) {
getTable().setSelection(i);
enable();
getTable().setFocus();
break;
}
}
}
private final static String REMOTE_TEMPLATE = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
+ "<uriSpecifier xmlns=\"http://uima.apache.org/resourceSpecifier\">\n"
+ " <resourceType>{0}</resourceType>\n" + // AnalysisEngine CasConsumer
" <uri>{1}</uri> \n" + // sURI
" <protocol>{2}</protocol>\n" + // SOAP or Vinci
" <timeout>{3}</timeout>" + " {4}" + // <parameters> for VNS </parameters>
"\n</uriSpecifier>";
private void handleAddRemote() {
String sDescriptorPath = editor.getFile().getParent().getLocation().toString() + '/';
AddRemoteServiceDialog dialog = new AddRemoteServiceDialog(this, sDescriptorPath);
dialog.open();
if (dialog.getReturnCode() == InputDialog.CANCEL)
return;
String sServiceType = dialog.getSelectedServiceTypeName();
if (sServiceType != null && !sServiceType.equals("SOAP") && !sServiceType.equals("Vinci")) {
return;
}
String sURI = dialog.getSelectedUri();
String sKey = dialog.getSelectedKey();
if (!isNewKey(sKey)) {
Utility.popMessage("Duplicate Key", "You have specified a duplicate key. Please try again.",
MessageDialog.ERROR);
return;
}
PrintWriter printWriter = setupToPrintFile(dialog.genFilePath);
if (null != printWriter) {
String vnsHostPort = "";
if (dialog.vnsHost.length() > 0) {
vnsHostPort = MessageFormat.format(" <parameter name=\"VNS_HOST\" value=\"{0}\"/>\n",
new Object[] { dialog.vnsHost });
}
if (dialog.vnsPort.length() > 0) {
vnsHostPort += MessageFormat.format(" <parameter name=\"VNS_PORT\" value=\"{0}\"/>\n",
new Object[] { dialog.vnsPort });
}
if (vnsHostPort.length() > 0)
vnsHostPort = "\n <parameters>" + vnsHostPort + " </parameters>";
printWriter.println(MessageFormat.format(REMOTE_TEMPLATE, new Object[] { dialog.aeOrCc, sURI,
sServiceType, dialog.timeout, vnsHostPort }));
printWriter.close();
boolean bSuccess = addDelegate(dialog.genFilePath, sKey, sKey, dialog.isImportByName);
if (bSuccess) {
boolean bAutoAddToFlow = dialog.getAutoAddToFlow();
if (bAutoAddToFlow) {
addNodeToFlow(sKey);
}
refresh();
}
}
}
private static final String[] delegateComponentStringHeadersLC = new String[] {
"<analysisenginedescription", "<casconsumerdescription", "<taedescription" };
private void handleFindAnalysisEngine() {
FindComponentDialog dialog1 = new FindComponentDialog(
this,
"Find an Analysis Engine (AE), CAS Consumer, or Remote Service Descriptor",
"Specify a name pattern and/or additional constraints, and then push the Search button",
delegateComponentStringHeadersLC);
if (Window.CANCEL == dialog1.open())
return;
List matchingDelegateComponentDescriptors = dialog1.getMatchingDelegateComponentDescriptors();
List matchingDelegateComponentDescriptions = dialog1.getMatchingDelegateComponentDescriptions();
if (matchingDelegateComponentDescriptors.size() == 0) {
Utility.popMessage("No matching Delegate Components",
"There are no Delegate Components matching your search criteria.",
MessageDialog.ERROR);
return;
}
PickTaeForTypesDialog dialog2 = new PickTaeForTypesDialog(this, editor.getFile().getName(),
matchingDelegateComponentDescriptors, matchingDelegateComponentDescriptions);
if (Window.CANCEL == dialog2.open())
return;
String[] selectedDelegateComponentDescriptors = dialog2
.getSelectedDelegateComponentDescriptors();
if (selectedDelegateComponentDescriptors == null
|| selectedDelegateComponentDescriptors.length == 0) {
return;
}
for (int i = 0; i < selectedDelegateComponentDescriptors.length; i++) {
String fileName = selectedDelegateComponentDescriptors[i].replace('\\', '/');
int nLastSlashLoc = fileName.lastIndexOf('/');
String shortName;
if (nLastSlashLoc == -1) {
shortName = fileName;
} else {
shortName = fileName.substring(nLastSlashLoc + 1);
}
produceKeyAddDelegate(shortName, editor.getFullPathFromDescriptorRelativePath(fileName),
// dialog2.getAutoAddToFlow(),
true, dialog2.isImportByName);
}
finishAggregateChangeAction();
}
private void handleTableContextMenuRequest(Event event) {
TableItem item = filesTable.getItem(new Point(event.x, event.y));
if (null == item) {
return;
}
String thisKey = item.getText(1);
Import imp = (Import) getDelegateAnalysisEngineSpecifiersWithImports().get(thisKey);
bDisableToolTipHelp = true;
requestPopUpOverImport(imp, filesTable, event);
bDisableToolTipHelp = false;
}
private void handleTableHoverHelp(Event event) {
TableItem item = filesTable.getItem(new Point(event.x, event.y));
String sDesc = "";
if (null != item) {
Map dels = editor.getResolvedDelegates();
if (null != dels) {
sDesc = getDescriptionForDescriptor(item.getText(0), (ResourceSpecifier) dels.get(item
.getText(1)));
}
}
filesTable.setToolTipText(sDesc);
}
private boolean addDelegate(String fileName, String shortName, String keyName,
boolean isImportByName) {
Import imp;
Map delegatesWithImport = getDelegateAnalysisEngineSpecifiersWithImports();
// if the delegate is not a remote, read / parse it and add ae to
// the delegate hash map
// -- also add the import
// If it is a remote - try and get it's metadata (we can if it is running)
// first: create import, needed in both cases
imp = createImport(fileName, isImportByName);
// read the content and merge into our model
XMLizable inputDescription = readImport(imp, fileName, isImportByName);
if (null == inputDescription)
return false;
if (!(inputDescription instanceof AnalysisEngineDescription)
&& !(inputDescription instanceof CasConsumerDescription)
&& !(inputDescription instanceof URISpecifier)
&& !(inputDescription instanceof PearSpecifier)) {
Utility
.popMessage(
"Invalid kind of descriptor",
MessageFormat
.format(
"Operation cancelled: The descriptor ''{0}'' being added is not an Analysis Engine or a CAS Consumer or a Remote Service.",
new Object[] { maybeShortenFileName(fileName) }),
MessageDialog.ERROR);
return false;
}
editor.getResolvedDelegates().put(keyName, inputDescription);
delegatesWithImport.put(keyName, imp);
// before adding the import, see if the merge type system is OK
if (!isValidAggregateChange()) {
// revert
editor.getResolvedDelegates().remove(keyName);
delegatesWithImport.remove(keyName);
return false;
}
finishAggregateChangeAction();
return true;
}
private boolean isNewKey(String keyName) {
for (int i = 0; i < filesTable.getItemCount(); i++) {
if (filesTable.getItem(i).getText(1).equals(keyName)) {
return false;
}
}
return true;
}
public void addParametersForDelegate(AnalysisEngineDescription tae) {
ConfigurationParameter[] candidateNewParams = tae.getAnalysisEngineMetaData()
.getConfigurationParameterDeclarations().getConfigurationParameters();
NameValuePair[] candidateSettings = tae.getAnalysisEngineMetaData()
.getConfigurationParameterSettings().getParameterSettings();
ConfigurationParameter[] oldParams = getAnalysisEngineMetaData()
.getConfigurationParameterDeclarations().getConfigurationParameters();
NameValuePair[] oldSettings = getAnalysisEngineMetaData().getConfigurationParameterSettings()
.getParameterSettings();
if (candidateNewParams == null || candidateNewParams.length == 0) {
return;
}
if (oldParams == null || oldParams.length == 0) {
getAnalysisEngineMetaData().getConfigurationParameterDeclarations()
.setConfigurationParameters(candidateNewParams);
getAnalysisEngineMetaData().getConfigurationParameterSettings().setParameterSettings(
candidateSettings);
} else {
// first do parameters
Vector newParams = new Vector();
for (int i = 0; i < candidateNewParams.length; i++) {
boolean bNew = true;
for (int j = 0; j < oldParams.length; j++) {
if (candidateNewParams[i].getName().equals(oldParams[j].getName())
&& candidateNewParams[i].getType().equals(oldParams[j].getType())) {
bNew = false;
}
}
if (bNew) {
newParams.add(candidateNewParams[i]);
}
}
ConfigurationParameter[] newPlusOldParams = new ConfigurationParameter[oldParams.length
+ newParams.size()];
for (int i = 0; i < oldParams.length; i++) {
newPlusOldParams[i] = oldParams[i];
}
for (int i = 0; i < newParams.size(); i++) {
newPlusOldParams[oldParams.length + i] = (ConfigurationParameter) newParams.elementAt(i);
}
getAnalysisEngineMetaData().getConfigurationParameterDeclarations()
.setConfigurationParameters(newPlusOldParams);
// next do settings
Vector newSettings = new Vector();
if (candidateSettings != null) {
for (int i = 0; i < candidateSettings.length; i++) {
boolean bNew = true;
for (int j = 0; j < oldSettings.length; j++) {
if (candidateSettings[i].getName().equals(oldSettings[j].getName())) {
bNew = false;
}
}
if (bNew) {
newSettings.add(candidateSettings[i]);
}
}
}
NameValuePair[] newPlusOldSettings = new NameValuePair[oldSettings.length
+ newSettings.size()];
for (int i = 0; i < oldSettings.length; i++) {
newPlusOldSettings[i] = oldSettings[i];
}
for (int i = 0; i < newSettings.size(); i++) {
newPlusOldSettings[oldSettings.length + i] = (NameValuePair) newSettings.elementAt(i);
}
getAnalysisEngineMetaData().getConfigurationParameterSettings().setParameterSettings(
newPlusOldSettings);
}
}
public void enable() {
boolean isPrimitive = isPrimitive();
boolean bEnable = (filesTable.getSelectionIndex() > -1);
addButton.setEnabled(!isPrimitive);
addRemoteButton.setEnabled(!isPrimitive);
findAnalysisEngineButton.setEnabled(!isPrimitive);
removeButton.setEnabled(bEnable);
addToFlowButton.setEnabled(bEnable);
}
/**
* adds a tableItem to the table
*
* @param fileName
* @param keyName
*/
private void addFile(Object o, String keyName) {
Import impItem = (Import) o;
String fileName = impItem.getLocation();
if (null == fileName || (0 == fileName.length()))
fileName = impItem.getName();
// create new TableItem
TableItem item = new TableItem(filesTable, SWT.NONE);
item.setImage(TAEConfiguratorPlugin.getImage(TAEConfiguratorPlugin.IMAGE_ANNOTATOR));
item.setText(0, fileName);
item.setText(1, keyName);
}
public Table getTable() {
return filesTable;
}
}