in taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/workflow/RenderedResultComponent.java [273:439]
public void updateResult() {
if (recognisedRenderersForMimeType == null)
recognisedRenderersForMimeType = new ArrayList<>();
if (otherRenderers == null)
otherRenderers = new ArrayList<>();
// Enable the combo box
renderersComboBox.setEnabled(true);
/*
* Update the 'save result' buttons appropriately as the result node had
* changed
*/
for (int i = 0; i < saveButtonsPanel.getComponents().length; i++) {
JButton saveButton = (JButton) saveButtonsPanel.getComponent(i);
SaveIndividualResultSPI action = (SaveIndividualResultSPI) saveButton
.getAction();
// Update the action with the new result reference
action.setResultReference(path);
saveButton.setEnabled(true);
}
if (DataBundles.isValue(path) || DataBundles.isReference(path)) {
// Enable refresh button
refreshButton.setEnabled(true);
List<String> mediaTypes;
MediaTypeDetector detector = rendererRegistry.getMimeTypeDetector();
try {
if (DataBundles.isReference(path)) {
mediaTypes = detector.guessMediaTypes(DataBundles.getReference(path));
} else {
mediaTypes = detector.guessMediaTypes(path);
}
} catch (IOException e) {
logger.warn("Can't detect media type of " + path, e);
mediaTypes = Collections.emptyList();
}
for (String mediaType : mediaTypes) {
List<Renderer> renderersList = rendererRegistry.getRenderersForMimeType(mediaType);
for (Renderer renderer : renderersList)
if (!recognisedRenderersForMimeType.contains(renderer))
recognisedRenderersForMimeType.add(renderer);
}
// if there are no renderers then force text/plain
if (recognisedRenderersForMimeType.isEmpty())
recognisedRenderersForMimeType = rendererRegistry
.getRenderersForMimeType("text/plain");
/*
* Add all other available renderers that are not recognised to be
* able to handle the MIME type of the result
*/
otherRenderers = new ArrayList<>(rendererRegistry.getRenderers());
otherRenderers.removeAll(recognisedRenderersForMimeType);
mimeList = new String[recognisedRenderersForMimeType.size()
+ otherRenderers.size()];
rendererList = new ArrayList<>();
/*
* First add the ones that can handle the MIME type of the result
* item
*/
for (int i = 0; i < recognisedRenderersForMimeType.size(); i++) {
mimeList[i] = recognisedRenderersForMimeType.get(i).getType();
rendererList.add(recognisedRenderersForMimeType.get(i));
}
// Then add the other renderers just in case
for (int i = 0; i < otherRenderers.size(); i++) {
mimeList[recognisedRenderersForMimeType.size() + i] = otherRenderers.get(i)
.getType();
rendererList.add(otherRenderers.get(i));
}
renderersComboBox.setModel(new DefaultComboBoxModel<String>(mimeList));
if (mimeList.length > 0) {
int index = 0;
// Find the index of the current MIME type for this output port.
for (int i = 0; i < mimeList.length; i++)
if (mimeList[i].equals(lastUsedMIMEtype)) {
index = i;
break;
}
int previousindex = renderersComboBox.getSelectedIndex();
renderersComboBox.setSelectedIndex(index);
/*
* force rendering as setSelectedIndex will not fire an
* itemstatechanged event if previousindex == index and we still
* need render the result as we may have switched from a
* different result item in a result list but the renderer index
* stayed the same
*/
if (previousindex == index)
renderResult(); // draw the rendered result component
}
} else if (DataBundles.isError(path)) {
// Disable refresh button
refreshButton.setEnabled(false);
// Hide wrap text check box - only works for actual data
wrapTextCheckBox.setVisible(false);
// Reset the renderers as we have an error item
recognisedRenderersForMimeType = null;
otherRenderers = null;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Error Trace");
try {
ErrorDocument errorDocument = DataBundles.getError(path);
try {
buildErrorDocumentTree(root, errorDocument);
} catch (IOException e) {
logger.warn("Error building error document tree", e);
}
} catch (IOException e) {
logger.warn("Error getting the error document", e);
}
JTree errorTree = new JTree(root);
errorTree.setCellRenderer(new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
Component renderer = null;
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
Object userObject = treeNode.getUserObject();
if (userObject instanceof ErrorDocument)
renderer = renderErrorDocument(tree, selected,
expanded, leaf, row, hasFocus,
(ErrorDocument) userObject);
}
if (renderer == null)
renderer = super.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
if (renderer instanceof JLabel) {
JLabel label = (JLabel) renderer;
label.setIcon(null);
}
return renderer;
}
private Component renderErrorDocument(JTree tree,
boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus, ErrorDocument errorDocument) {
return super.getTreeCellRendererComponent(tree, "<html>"
+ escapeHtml(errorDocument.getMessage())
+ "</html>", selected, expanded, leaf, row,
hasFocus);
}
});
renderersComboBox.setModel(new DefaultComboBoxModel<>(
new String[] { ERROR_DOCUMENT }));
renderedResultPanel.removeAll();
renderedResultPanel.add(errorTree, CENTER);
repaint();
}
}