import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import javax.swing.event.HyperlinkEvent.EventType;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.StyleSheet;
import jalview.jbgui.*;
import jalview.ws.WSClientI;
/**
- * Base class for web service client thread and gui
+ * Base class for web service client thread and gui TODO: create StAX parser to
+ * extract html body content reliably when preparing html formatted job statuses
*
* @author $author$
* @version $Revision$
*/
-public class WebserviceInfo extends GWebserviceInfo
+public class WebserviceInfo extends GWebserviceInfo implements
+ HyperlinkListener
{
/** Job is Queued */
private boolean viewResultsImmediatly = true;
/**
- * Get
- * @param flag to indicate if results will be shown in a new window as soon as they are available.
+ * Get
+ *
+ * @param flag
+ * to indicate if results will be shown in a new window as soon as
+ * they are available.
*/
public boolean isViewResultsImmediatly()
{
/**
* Set
- * @param flag to indicate if results will be shown in a new window as soon as they are available.
+ *
+ * @param flag
+ * to indicate if results will be shown in a new window as soon as
+ * they are available.
*/
public void setViewResultsImmediatly(boolean viewResultsImmediatly)
{
this.viewResultsImmediatly = viewResultsImmediatly;
}
+ private StyleSheet getStyleSheet(HTMLEditorKit editorKit)
+ {
+
+ // Copied blatantly from
+ // http://www.velocityreviews.com/forums/t132265-string-into-htmldocument.html
+ StyleSheet myStyleSheet = new StyleSheet();
+
+ myStyleSheet.addStyleSheet(editorKit.getStyleSheet());
+
+ editorKit.setStyleSheet(myStyleSheet);
+
+ /*
+ * Set the style sheet rules here by reading them from the constants
+ * interface.
+ */
+ /*
+ * for (int ix=0; ix<CSS_RULES.length; ix++) {
+ *
+ * myStyleSheet.addRule(CSS_RULES[ix]);
+ *
+ * }
+ */
+ return myStyleSheet;
+
+ }
+
// tabbed or not
public synchronized int addJobPane()
{
JScrollPane jobpane = new JScrollPane();
- JTextArea progressText = new JTextArea();
- progressText.setFont(new java.awt.Font("Verdana", 0, 10));
- progressText.setBorder(null);
- progressText.setEditable(false);
- progressText.setText("WS Job");
- progressText.setLineWrap(true);
- progressText.setWrapStyleWord(true);
+ JComponent _progressText;
+ if (renderAsHtml)
+ {
+ JEditorPane progressText = new JEditorPane("text/html", "");
+ progressText.addHyperlinkListener(this);
+ _progressText = progressText;
+ // progressText.setFont(new java.awt.Font("Verdana", 0, 10));
+ // progressText.setBorder(null);
+ progressText.setEditable(false);
+ /*
+ * HTMLEditorKit myEditorKit = new HTMLEditorKit();
+ *
+ * StyleSheet myStyleSheet = getStyleSheet(myEditorKit);
+ *
+ * HTMLDocument tipDocument = (HTMLDocument)
+ * (myEditorKit.createDefaultDocument());
+ *
+ * progressText.setDocument(tipDocument);
+ */progressText.setText("<html><h1>WS Job</h1></html>");
+ }
+ else
+ {
+ JTextArea progressText = new JTextArea();
+ _progressText = progressText;
+
+ progressText.setFont(new java.awt.Font("Verdana", 0, 10));
+ progressText.setBorder(null);
+ progressText.setEditable(false);
+ progressText.setText("WS Job");
+ progressText.setLineWrap(true);
+ progressText.setWrapStyleWord(true);
+ }
jobpane.setName("JobPane");
- jobpane.getViewport().add(progressText, null);
+ jobpane.getViewport().add(_progressText, null);
jobpane.setBorder(null);
if (jobPanes == null)
{
{
addJobPane();
}
- return ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
- .getComponent(0)).getText();
+ if (renderAsHtml)
+ {
+ return ((JEditorPane) ((JScrollPane) jobPanes.get(which))
+ .getViewport().getComponent(0)).getText();
+ }
+ else
+ {
+ return ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).getText();
+ }
}
/**
{
addJobPane();
}
- ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
- .getComponent(0)).setText(text);
+ if (renderAsHtml)
+ {
+ ((JEditorPane) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).setText(ensureHtmlTagged(text));
+ }
+ else
+ {
+ ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).setText(text);
+ }
+ }
+
+ /**
+ * extract content from <body> content </body>
+ *
+ * @param text
+ * @param leaveFirst
+ * - set to leave the initial html tag intact
+ * @param leaveLast
+ * - set to leave the final html tag intact
+ * @return
+ */
+ private String getHtmlFragment(String text, boolean leaveFirst,
+ boolean leaveLast)
+ {
+ if (text == null)
+ {
+ return null;
+ }
+ String lowertxt = text.toLowerCase();
+ int htmlpos = leaveFirst ? -1 : lowertxt.indexOf("<body");
+
+ int htmlend = leaveLast ? -1 : lowertxt.indexOf("</body");
+ int htmlpose = lowertxt.indexOf(">", htmlpos), htmlende = lowertxt
+ .indexOf(">", htmlend);
+ if (htmlend == -1 && htmlpos == -1)
+ {
+ return text;
+ }
+ if (htmlend > -1)
+ {
+ return text.substring((htmlpos == -1 ? 0 : htmlpose + 1), htmlend);
+ }
+ return text.substring(htmlpos == -1 ? 0 : htmlpose + 1);
+ }
+
+ /**
+ * very simple routine for adding/ensuring html tags are present in text.
+ *
+ * @param text
+ * @return properly html tag enclosed text
+ */
+ private String ensureHtmlTagged(String text)
+ {
+ if (text == null)
+ {
+ return "";
+ }
+ String lowertxt = text.toLowerCase();
+ int htmlpos = lowertxt.indexOf("<body");
+ int htmlend = lowertxt.indexOf("</body");
+ int doctype = lowertxt.indexOf("<!doctype");
+ int xmltype = lowertxt.indexOf("<?xml");
+ if (htmlend == -1)
+ {
+ text = text + "</body></html>";
+ }
+ if (htmlpos > -1)
+ {
+ if ((doctype > -1 && htmlpos > doctype)
+ || (xmltype > -1 && htmlpos > xmltype))
+ {
+ text = "<html><head></head><body>\n" + text.substring(htmlpos - 1);
+ }
+ }
+ else
+ {
+ text = "<html><head></head><body>\n" + text;
+ }
+ if (text.indexOf("<meta") > -1)
+ {
+ System.err.println("HTML COntent: \n" + text
+ + "<< END HTML CONTENT\n");
+
+ }
+ return text;
}
/**
{
addJobPane();
}
- ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
- .getComponent(0)).append(text);
+ if (renderAsHtml)
+ {
+ String txt = getHtmlFragment(
+ ((JEditorPane) ((JScrollPane) jobPanes.get(which))
+ .getViewport().getComponent(0)).getText(), true,
+ false);
+ ((JEditorPane) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).setText(ensureHtmlTagged(txt
+ + getHtmlFragment(text, false, true)));
+ }
+ else
+ {
+ ((JTextArea) ((JScrollPane) jobPanes.get(which)).getViewport()
+ .getComponent(0)).append(text);
+ }
}
/**
g1.drawImage(offscreen, 0, 0, this);
}
}
+
+ boolean renderAsHtml = false;
+
+ public void setRenderAsHtml(boolean b)
+ {
+ renderAsHtml = b;
+ }
+
+ public void hyperlinkUpdate(HyperlinkEvent e)
+ {
+ if (e.getEventType() == EventType.ACTIVATED)
+ {
+ try
+ {
+ final String url = e.getURL().toString();
+ Desktop.showUrl(url);
+ } catch (Exception x)
+ {
+ // ignore any exceptions due to dud links.
+ }
+
+ }
+ }
}