/*
GNU GENERAL LICENSE
Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General License for more details.
You should have received a copy of the GNU General Public
along with this program. If not, see <http://www.gnu.org/licenses/>.
Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it
*/
/*
* Created on Oct 22, 2005
*/
package org.lobobrowser.html.test;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Frame;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.lobobrowser.html.HtmlRendererContext;
import org.lobobrowser.html.gui.HtmlPanel;
import org.lobobrowser.html.gui.SelectionChangeEvent;
import org.lobobrowser.html.gui.SelectionChangeListener;
import org.lobobrowser.http.UserAgentContext;
/**
* A Swing frame that can be used to test the Cobra HTML rendering engine.
*/
public class TestFrame extends JFrame {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The Constant logger. */
private static final Logger logger = LogManager.getLogger(TestFrame.class);
/** The rcontext. */
private final SimpleHtmlRendererContext rcontext;
/** The address field. */
private final JTextField addressField;
/**
* Instantiates a new test frame.
*
* @throws HeadlessException
* the headless exception
*/
public TestFrame() throws HeadlessException {
this("");
}
/**
* Instantiates a new test frame.
*
* @param title
* the title
* @throws HeadlessException
* the headless exception
*/
public TestFrame(String title) throws HeadlessException {
super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = this.getContentPane();
contentPane.setLayout(new BorderLayout());
JPanel topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BorderLayout());
final JTextField textField = new JTextField();
this.addressField = textField;
JButton button = new JButton("Parse & Render");
final JTabbedPane tabbedPane = new JTabbedPane();
final JTree tree = new JTree();
final JScrollPane scrollPane = new JScrollPane(tree);
contentPane.add(topPanel, BorderLayout.NORTH);
contentPane.add(bottomPanel, BorderLayout.CENTER);
topPanel.add(new JLabel("URL: "), BorderLayout.WEST);
topPanel.add(textField, BorderLayout.CENTER);
topPanel.add(button, BorderLayout.EAST);
bottomPanel.add(tabbedPane, BorderLayout.CENTER);
final HtmlPanel panel = new HtmlPanel();
panel.addSelectionChangeListener(new SelectionChangeListener() {
@Override
public void selectionChanged(SelectionChangeEvent event) {
if (logger.isInfoEnabled()) {
logger.info("selectionChanged(): selection node: " + panel.getSelectionNode());
}
}
});
UserAgentContext ucontext = new SimpleUserAgentContext();
this.rcontext = new LocalHtmlRendererContext(panel, ucontext);
final JTextArea textArea = new JTextArea();
textArea.setEditable(false);
final JScrollPane textAreaSp = new JScrollPane(textArea);
tabbedPane.addTab("HTML", panel);
tabbedPane.addTab("Tree", scrollPane);
tabbedPane.addTab("Source", textAreaSp);
tabbedPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Component component = tabbedPane.getSelectedComponent();
if (component == scrollPane) {
tree.setModel(new NodeTreeModel(panel.getRootNode()));
} else if (component == textAreaSp) {
textArea.setText(rcontext.getSourceCode());
}
}
});
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
process(textField.getText());
}
});
}
/**
* Gets the html renderer context.
*
* @return the html renderer context
*/
public HtmlRendererContext getHtmlRendererContext() {
return this.rcontext;
}
/**
* Navigate.
*
* @param uri
* the uri
*/
public void navigate(String uri) {
this.addressField.setText(uri);
this.process(uri);
}
/**
* Process.
*
* @param uri
* the uri
*/
private void process(String uri) {
try {
URL url;
try {
url = new URL(uri);
} catch (MalformedURLException mfu) {
int idx = uri.indexOf(':');
if ((idx == -1) || (idx == 1)) {
// try file
url = new URL("file:" + uri);
} else {
throw mfu;
}
}
// Call SimpleHtmlRendererContext.navigate()
// which implements incremental rendering.
this.rcontext.navigate(url, null);
} catch (Exception err) {
logger.log(Level.ERROR, "Error trying to load URI=[" + uri + "].", err);
}
}
/**
* The Class LocalHtmlRendererContext.
*/
private class LocalHtmlRendererContext extends SimpleHtmlRendererContext {
/**
* Instantiates a new local html renderer context.
*
* @param contextComponent
* the context component
* @param ucontext
* the ucontext
*/
public LocalHtmlRendererContext(HtmlPanel contextComponent, UserAgentContext ucontext) {
super(contextComponent, ucontext);
}
/*
* (non-Javadoc)
*
* @see
* org.lobobrowser.html.test.SimpleHtmlRendererContext#open(java.net.
* URL, java.lang.String, java.lang.String, boolean)
*/
@Override
public HtmlRendererContext open(URL url, String windowName, String windowFeatures, boolean replace) {
TestFrame frame = new TestFrame("Cobra Test Tool");
frame.setSize(600, 400);
frame.setExtendedState(Frame.NORMAL);
frame.setVisible(true);
HtmlRendererContext ctx = frame.getHtmlRendererContext();
ctx.setOpener(this);
frame.navigate(url.toExternalForm());
return ctx;
}
}
}