/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui;
import Sirius.navigator.ui.status.Status;
import org.xhtmlrenderer.extend.NamespaceHandler;
import org.xhtmlrenderer.simple.extend.XhtmlNamespaceHandler;
import org.xhtmlrenderer.swing.BasicPanel;
import org.xhtmlrenderer.swing.LinkListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import de.cismet.tools.gui.xhtmlrenderer.WebAccessManagerUserAgent;
/**
* An implementation of DescriptionPane which uses Flying Saucer to render XHTML content. The retrieval of XHTML
* documents is done by WebAccessManager. Therefore FLying Saucer is configured to use WebAccessUserAgent which acts as
* an adapter for WebAccessManager. In order to read invalid XHTML documents or HTML documents, Tagsoup is used as
* XMLReader.
*
* @version $Revision$, $Date$
*/
public class DescriptionPaneFS extends DescriptionPane {
//~ Static fields/initializers ---------------------------------------------
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DescriptionPaneFS.class);
//~ Instance fields --------------------------------------------------------
private org.xhtmlrenderer.simple.FSScrollPane fSScrollPane1;
private org.xhtmlrenderer.simple.XHTMLPanel xHTMLPanel1;
private JPopupMenu popupMenu;
private JMenuItem mnuItem_openInExternalBrowser;
private String pageURI;
private NamespaceHandler namespaceHandler;
//~ Constructors -----------------------------------------------------------
/**
* Creates new form DescriptionPane.
*/
public DescriptionPaneFS() {
super();
System.setProperty("xr.load.xml-reader", org.ccil.cowan.tagsoup.Parser.class.getCanonicalName());
// System.setProperty("xr.util-logging.loggingEnabled", "true");
System.setProperty("xr.load.string-interning", "true");
System.setProperty("xr.use.listeners", "true");
initComponents();
namespaceHandler = new XhtmlNamespaceHandler();
xHTMLPanel1.getSharedContext().setUserAgentCallback(new WebAccessManagerUserAgent());
}
//~ Methods ----------------------------------------------------------------
/**
* Initialisation method of Matisse. Initializes visual components added by this subclass.
*/
private void initComponents() {
fSScrollPane1 = new org.xhtmlrenderer.simple.FSScrollPane();
xHTMLPanel1 = new FSXHtmlPanel();
popupMenu = new JPopupMenu();
final LinkListener ll = new LinkListener() {
@Override
public void linkClicked(final BasicPanel panel, final String uri) {
pageURI = panel.getURL().toString();
}
};
((BasicPanel)xHTMLPanel1).addMouseTrackingListener(ll);
fSScrollPane1.setViewportView(xHTMLPanel1);
mnuItem_openInExternalBrowser = new JMenuItem(org.openide.util.NbBundle.getMessage(
DescriptionPaneFS.class,
"DescriptionPaneFS.btn_openInSystemBrowser.text"),
new javax.swing.ImageIcon(
getClass().getResource("/Sirius/navigator/ui/world.png")));
mnuItem_openInExternalBrowser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if ((pageURI != null) && (pageURI.trim().length() > 0)) {
try {
de.cismet.tools.BrowserLauncher.openURL(pageURI);
} catch (Exception ex) {
LOG.error("Couldn't open URI '" + pageURI + "' in external browser.", ex);
}
}
}
});
popupMenu.add(mnuItem_openInExternalBrowser);
xHTMLPanel1.add(popupMenu);
xHTMLPanel1.addMouseListener(new PopupListener(popupMenu));
add(fSScrollPane1, "html");
}
/**
* Loads the given URI and renders the referenced XHTML document. Shows an error page if loading causes an error.
*
* @param page An URI to an XHTML document.
*/
@Override
public void setPageFromURI(final String page) {
if (LOG.isInfoEnabled()) {
LOG.info(org.openide.util.NbBundle.getMessage(
DescriptionPaneFS.class,
"DescriptionPaneFS.setPageFromURI(String).info",
page));
}
try {
if ((page == null) || (page.trim().length() <= 0)) {
startNoDescriptionRenderer();
} else {
pageURI = page;
xHTMLPanel1.setDocument(page);
mnuItem_openInExternalBrowser.setEnabled(true);
}
} catch (Exception e) {
LOG.error(org.openide.util.NbBundle.getMessage(
DescriptionPaneFS.class,
"DescriptionPaneFS.setPageFromURI(String).error",
page),
e); // NOI18N
setPageFromContent(
errorPage,
getClass().getClassLoader().getResource("Sirius/navigator/resource/doc/blank.xhtml").toString());
statusChangeSupport.fireStatusChange(
org.openide.util.NbBundle.getMessage(
DescriptionPaneFS.class,
"DescriptionPaneFS.setPageFromURI(String).error",
page), // NOI18N
Status.MESSAGE_POSITION_3,
Status.ICON_DEACTIVATED,
Status.ICON_ACTIVATED);
}
}
/**
* Renders the given markup.
*
* @param markup XHTML markup to render.
*/
@Override
public void setPageFromContent(final String markup) {
setPageFromContent(markup, "");
}
/**
* Renders the given markup using baseURL as base for relative paths in the markup.
*
* @param markup XHTML markup to render
* @param baseURL Base path for relative paths used in markup
*/
@Override
public void setPageFromContent(final String markup, final String baseURL) {
pageURI = null;
mnuItem_openInExternalBrowser.setEnabled(false);
try {
xHTMLPanel1.setDocumentFromString(markup, baseURL, namespaceHandler);
} catch (Exception e) {
LOG.error(org.openide.util.NbBundle.getMessage(
DescriptionPaneFS.class,
"DescriptionPaneFS.setPageFromContent(String).error"),
e); // NOI18N
statusChangeSupport.fireStatusChange(
org.openide.util.NbBundle.getMessage(
DescriptionPaneFS.class,
"DescriptionPaneFS.setPageFromContent(String).error"), // NOI18N
Status.MESSAGE_POSITION_3,
Status.ICON_DEACTIVATED,
Status.ICON_ACTIVATED);
}
}
}