Removed outdated processor results rendering .. no longer used as rendering is done through DataBundles
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/commit/f3a2ba94 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/tree/f3a2ba94 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/diff/f3a2ba94 Branch: refs/heads/master Commit: f3a2ba94e8cc57670fa865db64598259edda4b38 Parents: 5d00187 Author: Stian Soiland-Reyes <[email protected]> Authored: Fri Aug 19 12:26:41 2016 +0100 Committer: Stian Soiland-Reyes <[email protected]> Committed: Fri Oct 21 09:17:18 2016 +0200 ---------------------------------------------------------------------- .../processor/ProcessorPortResultsViewTab.java | 225 ------- .../RenderedProcessorResultComponent.java | 581 ------------------- 2 files changed, 806 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f3a2ba94/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorPortResultsViewTab.java ---------------------------------------------------------------------- diff --git a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorPortResultsViewTab.java b/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorPortResultsViewTab.java deleted file mode 100644 index 43a85df..0000000 --- a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorPortResultsViewTab.java +++ /dev/null @@ -1,225 +0,0 @@ -package org.apache.taverna.workbench.views.results.processor; -/* - * 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. - */ - -import static java.awt.BorderLayout.CENTER; -import static java.awt.BorderLayout.NORTH; -import static java.awt.BorderLayout.WEST; -import static org.apache.taverna.workbench.views.results.processor.ProcessorResultTreeNode.ProcessorResultTreeNodeState.RESULT_REFERENCE; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreeModel; -import javax.swing.tree.TreePath; - -import org.apache.taverna.renderers.RendererRegistry; -import org.apache.taverna.workbench.views.results.processor.FilteredProcessorValueTreeModel.FilterType; -import org.apache.taverna.workbench.views.results.saveactions.SaveIndividualResultSPI; - -/** - * A tab containing result tree for an input or output port of a processor - * and a panel with rendered result - * of the currently selected node in the tree. - * - * @author Alex Nenadic - * - */ -@SuppressWarnings("serial") -public class ProcessorPortResultsViewTab extends JPanel{ - /** Rendered result component */ - private RenderedProcessorResultComponent renderedResultComponent; - private boolean isOutputPortTab = true; - private JTree resultsTree; - private String portName; - /** Panel holding the results tree*/ - private JPanel treePanel; - /** - * Split pane holding the result tree panel on the left and rendering - * component on the right - */ - private JSplitPane splitPanel; - private JComboBox<FilterType> filterChoiceBox; - private FilteredProcessorValueTreeModel filteredTreeModel; - - private final RendererRegistry rendererRegistry; - private final List<SaveIndividualResultSPI> saveActions; - - public ProcessorPortResultsViewTab(String portName, RendererRegistry rendererRegistry, List<SaveIndividualResultSPI> saveActions) { - this.portName = portName; - this.rendererRegistry = rendererRegistry; - this.saveActions = saveActions; - initComponents(); - } - - private void initComponents() { - setLayout(new BorderLayout()); - - /* - * Split pane containing a tree with results from an output port for the - * selected enactment and rendered result component for rendering an - * individual result currently selected from the results tree. - */ - splitPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); - - /* - * Results tree (containing T2References to all individual results for - * this port) - */ - //resultsTree = new JTree(); // initially tree is empty - will be set when user selects a particular enactment - - // Component for rendering individual results - renderedResultComponent = new RenderedProcessorResultComponent( - rendererRegistry, saveActions); - - treePanel = new JPanel(); - treePanel.setLayout(new BorderLayout()); - treePanel.add(new JLabel("Click to view values"), NORTH); - treePanel.add(new JScrollPane(resultsTree), CENTER); - splitPanel.setTopComponent(treePanel); - splitPanel.setBottomComponent(renderedResultComponent); - splitPanel.setDividerLocation(400); - - // Add all to main panel - add(splitPanel, CENTER); - } - - public void setIsOutputPortTab(boolean isOutputPortTab) { - this.isOutputPortTab = isOutputPortTab; - } - - public boolean getIsOutputPortTab() { - return this.isOutputPortTab; - } - - private List<TreePath> expandedPaths = new ArrayList<TreePath>(); - private TreePath selectionPath = null; - - private void rememberPaths() { - expandedPaths.clear(); - for (Enumeration<?> e = resultsTree - .getExpandedDescendants(new TreePath(filteredTreeModel - .getRoot())); (e != null) && e.hasMoreElements();) - expandedPaths.add((TreePath) e.nextElement()); - selectionPath = resultsTree.getSelectionPath(); - } - - private void reinstatePaths() { - for (TreePath path : expandedPaths) - if (filteredTreeModel.isShown((DefaultMutableTreeNode) path - .getLastPathComponent())) - resultsTree.expandPath(path); - if (selectionPath != null) { - if (filteredTreeModel - .isShown((DefaultMutableTreeNode) selectionPath - .getLastPathComponent())) - resultsTree.setSelectionPath(selectionPath); - else { - resultsTree.clearSelection(); - renderedResultComponent.clearResult(); - } - } - } - - private void updateTree() { - filteredTreeModel = (FilteredProcessorValueTreeModel) resultsTree - .getModel(); - filteredTreeModel.setFilter((FilterType) filterChoiceBox.getSelectedItem()); - rememberPaths(); - filteredTreeModel.reload(); - resultsTree.setModel(filteredTreeModel); - reinstatePaths(); - } - - public void setResultsTree(JTree tree) { - resultsTree = tree; - - treePanel.removeAll(); - treePanel = new JPanel(new BorderLayout()); - if (tree == null) { - splitPanel.setVisible(false); - revalidate(); - return; - } - - TreeModel treeModel = tree.getModel(); - int childCount = treeModel.getChildCount(treeModel.getRoot()); - if (childCount == 0) { - splitPanel.setVisible(false); - revalidate(); - return; - } - - splitPanel.setTopComponent(treePanel); - splitPanel.setBottomComponent(renderedResultComponent); - splitPanel.setVisible(true); - - JPanel treeSubPanel = new JPanel(); - treeSubPanel.setLayout(new BorderLayout()); - treeSubPanel.add(new JLabel("Click in tree to"), WEST); - filterChoiceBox = new JComboBox<>(new FilterType[] { FilterType.ALL, - FilterType.RESULTS, FilterType.ERRORS }); - filterChoiceBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - updateTree(); - } - }); - treeSubPanel.add(filterChoiceBox); - treePanel.add(treeSubPanel, NORTH); - treePanel.add(new JScrollPane(resultsTree), CENTER); - splitPanel.setTopComponent(treePanel); - - if (childCount == 1) { - Object child = treeModel.getChild(treeModel.getRoot(), 0); - ProcessorResultTreeNode node = (ProcessorResultTreeNode) child; - if (node.getState() == RESULT_REFERENCE) - if (treeModel.getChildCount(child) == 0) { - TreePath path = new TreePath(new Object[] { - treeModel.getRoot(), child }); - tree.setSelectionPath(path); - splitPanel.setTopComponent(new JPanel()); - splitPanel.setDividerLocation(0); - } - } - - revalidate(); - } - - public void setPortName(String portName) { - this.portName = portName; - } - - public String getPortName() { - return portName; - } - - public RenderedProcessorResultComponent getRenderedResultComponent() { - return renderedResultComponent; - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f3a2ba94/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/RenderedProcessorResultComponent.java ---------------------------------------------------------------------- diff --git a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/RenderedProcessorResultComponent.java b/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/RenderedProcessorResultComponent.java deleted file mode 100644 index 76196e6..0000000 --- a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/RenderedProcessorResultComponent.java +++ /dev/null @@ -1,581 +0,0 @@ -package org.apache.taverna.workbench.views.results.processor; -/* - * 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. - */ - -import static java.awt.BorderLayout.CENTER; -import static java.awt.BorderLayout.NORTH; -import static java.awt.event.ItemEvent.SELECTED; -import static javax.swing.BoxLayout.LINE_AXIS; -import static javax.swing.SwingUtilities.invokeLater; -import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; -import static org.apache.taverna.workbench.icons.WorkbenchIcons.refreshIcon; -import static org.apache.taverna.workbench.views.results.processor.ProcessorResultTreeNode.ProcessorResultTreeNodeState.RESULT_REFERENCE; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.swing.BoxLayout; -import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTree; -import javax.swing.ListCellRenderer; -import javax.swing.border.EmptyBorder; -import javax.swing.border.EtchedBorder; -import javax.swing.text.JTextComponent; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; - -import org.apache.log4j.Logger; -import org.apache.taverna.databundle.DataBundles; -import org.apache.taverna.databundle.ErrorDocument; -import org.apache.taverna.lang.ui.DialogTextArea; -import org.apache.taverna.renderers.Renderer; -import org.apache.taverna.renderers.RendererException; -import org.apache.taverna.renderers.RendererRegistry; -import org.apache.taverna.renderers.RendererUtils; -import org.apache.taverna.scufl2.api.port.OutputWorkflowPort; -import org.apache.taverna.workbench.views.results.saveactions.SaveIndividualResultSPI; -import org.apache.tika.detect.DefaultDetector; -import org.apache.tika.detect.Detector; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.mime.MediaType; - -import eu.medsea.mimeutil.MimeType; - -/** - * Creates a component that renders an individual result from an output port. - * The component can render the result according to the renderers existing for - * the output port's MIME type or display an error document. - * - * @author Ian Dunlop - * @author Alex Nenadic - */ -@SuppressWarnings("serial") -public class RenderedProcessorResultComponent extends JPanel { - private static final String WRAP_TEXT = "Wrap text"; - private static final String ERROR_DOCUMENT = "Error Document"; - private static Logger logger = Logger - .getLogger(RenderedProcessorResultComponent.class); - - /** Panel containing rendered result */ - private JPanel renderedResultPanel; - /** Combo box containing possible result types */ - private JComboBox<String> renderersComboBox; - /** - * Button to refresh (re-render) the result, especially needed for large - * results that are not rendered or are partially rendered and the user - * wished to re-render them - */ - private JButton refreshButton; - /** - * Preferred result type renderers (the ones recognised to be able to handle - * the result's MIME type) - */ - private List<Renderer> recognisedRenderersForMimeType; - /** - * All other result type renderers (the ones not recognised to be able to - * handle the result's MIME type) In case user wants to use them. - */ - private List<Renderer> otherRenderers; - /** Renderers' registry */ - private final RendererRegistry rendererRegistry; - /** - * List of all MIME strings from all available renderers to be used for - * renderersComboBox. Those that come from recognisedRenderersForMimeType - * are the preferred ones. Those from otherRenderers will be greyed-out in - * the combobox list but could still be used. - */ - private String[] mimeList; - /** - * List of all available renderers but ordered to match the corresponding - * MIME type strings in mimeList: first the preferred renderers from - * recognisedRenderersForMimeType then the ones from otherRenderers. - */ - private ArrayList<Renderer> rendererList; - /** - * Remember the MIME type of the last used renderer; use "text/plain" by - * default until user changes it - then use that one for all result items of - * the port (in case result contains a list). "text/plain" will always be - * added to the mimeList. - */ - private String lastUsedMIMEtype = "text/plain"; - // text renderer will always be available - /** If result is "text/plain" - provide possibility to wrap wide text */ - private JCheckBox wrapTextCheckBox; - /** Reference to the object being displayed (contained in the tree node) */ - private Path path; - /** Currently selected node from the ResultViewComponent, if any. */ - private ProcessorResultTreeNode node = null; - /** - * In case the node can be rendered as "text/plain", map the hash code of - * the node to the wrap text check box selection value for that node (that - * remembers if user wanted the text wrapped or not). We are using hash code - * as using node's user object might be too large. - */ - private Map<Integer, Boolean> nodeToWrapSelection = new HashMap<>(); - /** List of all output ports - needs to be passed to 'save result' actions. */ - List<? extends OutputWorkflowPort> dataflowOutputPorts = null; - /** Panel containing all 'save results' buttons */ - JPanel saveButtonsPanel = null; - - /** - * Creates the component. - */ - public RenderedProcessorResultComponent(RendererRegistry rendererRegistry, - List<SaveIndividualResultSPI> saveActions) { - this.rendererRegistry = rendererRegistry; - setLayout(new BorderLayout()); - setBorder(new EtchedBorder()); - - // Results type combo box - renderersComboBox = new JComboBox<>(); - renderersComboBox.setModel(new DefaultComboBoxModel<String>()); // initially empty - - renderersComboBox.setRenderer(new ColorCellRenderer()); - renderersComboBox.setEditable(false); - renderersComboBox.setEnabled(false); // initially disabled - - // Set the new listener - listen for changes in the currently selected renderer - renderersComboBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange() == SELECTED - && !ERROR_DOCUMENT.equals(e.getItem())) - // render the result using the newly selected renderer - renderResult(); - } - }); - - JPanel resultsTypePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); - resultsTypePanel.add(new JLabel("Value type")); - resultsTypePanel.add(renderersComboBox); - - // Refresh (re-render) button - refreshButton = new JButton("Refresh", refreshIcon); - refreshButton.setEnabled(false); - refreshButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - renderResult(); - refreshButton.getParent().requestFocusInWindow(); - /* - * so that the button does not stay focused after it is clicked - * on and did its action - */ - } - }); - resultsTypePanel.add(refreshButton); - - // Check box for wrapping text if result is of type "text/plain" - wrapTextCheckBox = new JCheckBox(WRAP_TEXT); - wrapTextCheckBox.setVisible(false); - wrapTextCheckBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - // Should have only one child component holding the rendered result - // Check for empty just as well - if (renderedResultPanel.getComponents().length == 0) - return; - if (renderedResultPanel.getComponent(0) instanceof DialogTextArea) { - nodeToWrapSelection.put(node.hashCode(), - e.getStateChange() == SELECTED); - renderResult(); - } - } - }); - - resultsTypePanel.add(wrapTextCheckBox); - // 'Save result' buttons panel - saveButtonsPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); - for (SaveIndividualResultSPI action : saveActions) { - action.setResultReference(null); - final JButton saveButton = new JButton(action.getAction()); - saveButton.setEnabled(false); - saveButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - saveButton.getParent().requestFocusInWindow(); - /* - * so that the button does not stay focused after it is - * clicked on and did its action - */ - } - }); - saveButtonsPanel.add(saveButton); - } - - // Top panel contains result type combobox and various save buttons - JPanel topPanel = new JPanel(); - topPanel.setLayout(new BoxLayout(topPanel, LINE_AXIS)); - topPanel.add(resultsTypePanel); - topPanel.add(saveButtonsPanel); - - // Rendered results panel - initially empty - renderedResultPanel = new JPanel(new BorderLayout()); - renderedResultPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); - - // Add all components - add(topPanel, NORTH); - add(new JScrollPane(renderedResultPanel), CENTER); - } - - /** - * Sets the tree node this components renders the results for, and update - * the rendered results panel. - */ - public void setNode(final ProcessorResultTreeNode node) { - this.node = node; - invokeLater(new Runnable() { - @Override - public void run() { - if (node.isState(RESULT_REFERENCE)) - updateResult(); - else - clearResult(); - } - }); - } - - /** - * Update the component based on the node selected from the - * ResultViewComponent tree. - */ - public void updateResult() { - if (recognisedRenderersForMimeType == null) - recognisedRenderersForMimeType = new ArrayList<>(); - if (otherRenderers == null) - otherRenderers = new ArrayList<>(); - - ProcessorResultTreeNode result = (ProcessorResultTreeNode) node; - - // Reference to the result data - path = result.getReference(); - - // 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<MimeType> mimeTypes = new ArrayList<>(); - try (InputStream inputstream = RendererUtils.getInputStream(path)) { - mimeTypes.addAll(getMimeTypes(inputstream)); - } catch (IOException e) { - logger.warn("Error getting mimetype", e); - } - - if (mimeTypes.isEmpty()) { - // If MIME types is empty - add "plain/text" MIME type - mimeTypes.add(new MimeType("text/plain")); - } else if (mimeTypes.size() == 1 - && mimeTypes.get(0).toString().equals("chemical/x-fasta")) { - /* - * If MIME type is recognised as "chemical/x-fasta" only then - * this might be an error from MIME magic (i.e., sometimes it - * recognises stuff that is not "chemical/x-fasta" as - * "chemical/x-fasta" and then Seq Vista renderer is used that - * causes errors) - make sure we also add the renderers for - * "text/plain" and "text/xml" as it is most probably just - * normal xml text and push the "chemical/x-fasta" to the bottom - * of the list. - */ - mimeTypes.add(0, new MimeType("text/plain")); - mimeTypes.add(1, new MimeType("text/xml")); - } - - for (MimeType mimeType : mimeTypes) - for (Renderer renderer : rendererRegistry - .getRenderersForMimeType(mimeType.toString())) - 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 = 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<>(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); - - @SuppressWarnings("unused") - ErrorDocument errorDocument; - try { - errorDocument = DataBundles.getError(path); - } catch (IOException e) { - logger.warn("Error getting the error document", e); - } - - // Reset the renderers as we have an error item - recognisedRenderersForMimeType = null; - otherRenderers = null; - - DefaultMutableTreeNode root = new DefaultMutableTreeNode( - "Error Trace"); - - // TODO handle error documents - // ResultsUtils.buildErrorDocumentTree(root, errorDocument, referenceService); - - 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) { - Object userObject = ((DefaultMutableTreeNode) value) - .getUserObject(); - if (userObject instanceof ErrorDocument) - renderer = getErrorDocumentRenderer(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 getErrorDocumentRenderer(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(); - } - } - - private MediaType getMimeTypes(InputStream inputstream) throws IOException { - Detector detector = new DefaultDetector(DefaultDetector.class.getClassLoader()); - Metadata metadata = new Metadata(); - // TODO: propagate relevant metadata - MediaType x = detector.detect(inputstream, metadata); - return x; - } - - /** - * Renders the result panel using the last used renderer. - */ - public void renderResult() { - if (ERROR_DOCUMENT.equals(renderersComboBox.getSelectedItem())) { - // skip error documents - do not (re)render - return; - } - - int selectedIndex = renderersComboBox.getSelectedIndex(); - if (mimeList != null && selectedIndex >= 0) { - Renderer renderer = rendererList.get(selectedIndex); - - if (renderer.getType().equals("Text")){ // if the result is "text/plain" - /* - * We use node's hash code as the key in the nodeToWrapCheckBox - * map as node's user object may be too large - */ - if (nodeToWrapSelection.get(node.hashCode()) == null) { - // initially not selected - nodeToWrapSelection.put(node.hashCode(), false); - } - wrapTextCheckBox.setSelected(nodeToWrapSelection.get(node.hashCode())); - wrapTextCheckBox.setVisible(true); - } else { - wrapTextCheckBox.setVisible(false); - } - - // Remember the last used renderer - use it for all result items of this port - //currentRendererIndex = selectedIndex; - lastUsedMIMEtype = mimeList[selectedIndex]; - - JComponent component; - try { - component = renderer.getComponent(path); - if (component instanceof DialogTextArea - && wrapTextCheckBox.isSelected()) - ((JTextArea) component).setLineWrap(wrapTextCheckBox - .isSelected()); - if (component instanceof JTextComponent) - ((JTextComponent) component).setEditable(false); - else if (component instanceof JTree) - ((JTree) component).setEditable(false); - } catch (RendererException ex) {// maybe this should be Exception - /* - * show the user that something unexpected has happened but - * continue - */ - component = new DialogTextArea( - "Could not render using renderer type " - + renderer.getClass() - + "\nPlease try with a different renderer" - + " if available and consult log" - + " for details of problem"); - ((DialogTextArea) component).setEditable(false); - logger.warn("Couln not render using " + renderer.getClass(), ex); - } - renderedResultPanel.removeAll(); - renderedResultPanel.add(component, CENTER); - repaint(); - revalidate(); - } - } - - /** - * Clears the result panel. - */ - public void clearResult() { - refreshButton.setEnabled(false); - renderedResultPanel.removeAll(); - - // Update the 'save result' buttons appropriately - for (int i = 0; i < saveButtonsPanel.getComponents().length; i++) { - JButton saveButton = (JButton) saveButtonsPanel.getComponent(i); - SaveIndividualResultSPI action = (SaveIndividualResultSPI) (saveButton - .getAction()); - // Update the action - action.setResultReference(null); - saveButton.setEnabled(false); - } - - renderersComboBox.setModel(new DefaultComboBoxModel<String>()); - renderersComboBox.setEnabled(false); - - revalidate(); - repaint(); - } - - class ColorCellRenderer implements ListCellRenderer<Object> { - protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer(); - - @Override - public Component getListCellRendererComponent(JList<?> list, Object value, - int index, boolean isSelected, boolean cellHasFocus) { - JLabel renderer = (JLabel) defaultRenderer - .getListCellRendererComponent(list, value, index, - isSelected, cellHasFocus); - - if (value instanceof Color) - renderer.setBackground((Color) value); - - if (recognisedRenderersForMimeType == null) // error occurred - return renderer; - - if (value != null && index >= recognisedRenderersForMimeType.size()) - // one of the non-preferred renderers - show it in grey - renderer.setForeground(Color.GRAY); - - return renderer; - } - } -}
