org.xhtmlrenderer.swing.BasicPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of core-renderer Show documentation
Show all versions of core-renderer Show documentation
An XML/XHTML CSS 2.1 Renderer library in pure Java for rendering to PDF, images, and Swing panels.
The newest version!
/*
* {{{ header & license
* Copyright (c) 2004, 2005 Joshua Marinacci
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* }}}
*/
package org.xhtmlrenderer.swing;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.print.PrinterGraphics;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import javax.swing.JOptionPane;
import org.w3c.dom.Document;
import org.xhtmlrenderer.css.style.CalculatedStyle;
import org.xhtmlrenderer.css.style.derived.RectPropertySet;
import org.xhtmlrenderer.event.DocumentListener;
import org.xhtmlrenderer.extend.NamespaceHandler;
import org.xhtmlrenderer.extend.UserAgentCallback;
import org.xhtmlrenderer.layout.Layer;
import org.xhtmlrenderer.layout.SharedContext;
import org.xhtmlrenderer.render.Box;
import org.xhtmlrenderer.render.PageBox;
import org.xhtmlrenderer.render.RenderingContext;
import org.xhtmlrenderer.resource.XMLResource;
import org.xhtmlrenderer.simple.NoNamespaceHandler;
import org.xhtmlrenderer.simple.extend.FormSubmissionListener;
import org.xhtmlrenderer.util.Configuration;
import org.xhtmlrenderer.util.Uu;
import org.xhtmlrenderer.util.XRLog;
import org.xml.sax.InputSource;
/**
* A Swing {@link javax.swing.JPanel} that encloses the Flying Saucer renderer
* for easy integration into Swing applications.
*
* @author Joshua Marinacci
*/
public abstract class BasicPanel extends RootPanel implements FormSubmissionListener {
private static final int PAGE_PAINTING_CLEARANCE_WIDTH = 10;
private static final int PAGE_PAINTING_CLEARANCE_HEIGHT = 10;
private boolean explicitlyOpaque;
private final MouseTracker mouseTracker;
private boolean centeredPagedView;
protected FormSubmissionListener formSubmissionListener;
public BasicPanel() {
this(new NaiveUserAgent());
}
public BasicPanel(UserAgentCallback uac) {
sharedContext = new SharedContext(uac);
mouseTracker = new MouseTracker(this);
formSubmissionListener = new FormSubmissionListener() {
public void submit(String query) {
System.out.println("Form Submitted!");
System.out.println("Data: " + query);
JOptionPane.showMessageDialog(
null,
"Form submit called; check console to see the query string" +
" that would have been submitted.",
"Form Submission",
JOptionPane.INFORMATION_MESSAGE
);
}
};
sharedContext.setFormSubmissionListener(formSubmissionListener);
init();
}
/**
* Adds the specified Document listener to receive Document events from this
* component. If listener l is null, no exception is thrown and no action is
* performed.
*
* @param listener Contains the DocumentListener for DocumentEvent data.
*/
public void addDocumentListener(DocumentListener listener) {
this.documentListeners.put(listener, listener);
}
/**
* Removes the specified Document listener from receive Document events from this
* component. If listener l is null, no exception is thrown and no action is
* performed.
*
* @param listener Contains the DocumentListener to remove.
*/
public void removeDocumentListener(DocumentListener listener) {
this.documentListeners.remove(listener);
}
public void paintComponent(Graphics g) {
if (doc == null) {
paintDefaultBackground(g);
return;
}
// if this is the first time painting this document, then calc layout
Layer root = getRootLayer();
if (root == null || isNeedRelayout()) {
doDocumentLayout(g.create());
root = getRootLayer();
}
setNeedRelayout(false);
if (root == null) {
//Uu.p("dispatching an initial resize event");
//queue.dispatchLayoutEvent(new ReflowEvent(ReflowEvent.CANVAS_RESIZED, this.getSize()));
XRLog.render(Level.FINE, "skipping the actual painting");
} else {
RenderingContext c = newRenderingContext((Graphics2D) g.create());
long start = System.currentTimeMillis();
doRender(c, root);
long end = System.currentTimeMillis();
XRLog.render(Level.FINE, "RENDERING TOOK " + (end - start) + " ms");
}
}
protected void doRender(RenderingContext c, Layer root) {
try {
// paint the normal swing background first
// but only if we aren't printing.
Graphics g = ((Java2DOutputDevice)c.getOutputDevice()).getGraphics();
paintDefaultBackground(g);
if (enclosingScrollPane == null) {
Insets insets = getInsets();
g.translate(insets.left, insets.top);
}
long start = System.currentTimeMillis();
if (!c.isPrint()) {
root.paint(c);
} else {
paintPagedView(c, root);
}
long after = System.currentTimeMillis();
if (Configuration.isTrue("xr.incremental.repaint.print-timing", false)) {
Uu.p("repaint took ms: " + (after - start));
}
} catch (ThreadDeath t) {
throw t;
} catch (Throwable t) {
if (documentListeners.size() > 0) {
fireOnRenderException(t);
} else {
if (t instanceof Error) {
throw (Error)t;
}
if (t instanceof RuntimeException) {
throw (RuntimeException)t;
}
// "Shouldn't" happen
XRLog.exception(t.getMessage(), t);
}
}
}
private void paintDefaultBackground(Graphics g) {
if (!(g instanceof PrinterGraphics) && explicitlyOpaque) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
}
private void paintPagedView(RenderingContext c, Layer root) {
if (root.getLastPage() == null) {
return;
}
final int pagePaintingClearanceWidth = isCenteredPagedView() ?
calcCenteredPageLeftOffset(root.getMaxPageWidth(c, 0)) :
PAGE_PAINTING_CLEARANCE_WIDTH;
root.assignPagePaintingPositions(
c, Layer.PAGED_MODE_SCREEN, PAGE_PAINTING_CLEARANCE_HEIGHT);
setPreferredSize(new Dimension(
root.getMaxPageWidth(c, pagePaintingClearanceWidth),
root.getLastPage().getPaintingBottom() + PAGE_PAINTING_CLEARANCE_HEIGHT));
revalidate();
Graphics2D g = ((Java2DOutputDevice)c.getOutputDevice()).getGraphics();
Shape working = g.getClip();
List pages = root.getPages();
c.setPageCount(pages.size());
for (int i = 0; i < pages.size(); i++) {
PageBox page = (PageBox)pages.get(i);
c.setPage(i, page);
g.setClip(working);
Rectangle overall = page.getScreenPaintingBounds(c, pagePaintingClearanceWidth);
overall.x -= 1;
overall.y -= 1;
overall.width += 1;
overall.height += 1;
Rectangle bounds = new Rectangle(overall);
bounds.width += 1;
bounds.height += 1;
if (working.intersects(bounds)) {
page.paintBackground(c, pagePaintingClearanceWidth, Layer.PAGED_MODE_SCREEN);
page.paintMarginAreas(c, pagePaintingClearanceWidth, Layer.PAGED_MODE_SCREEN);
page.paintBorder(c, pagePaintingClearanceWidth, Layer.PAGED_MODE_SCREEN);
Color old = g.getColor();
g.setColor(Color.BLACK);
g.drawRect(overall.x, overall.y, overall.width, overall.height);
g.setColor(old);
Rectangle content = page.getPagedViewClippingBounds(c, pagePaintingClearanceWidth);
g.clip(content);
int left = pagePaintingClearanceWidth +
page.getMarginBorderPadding(c, CalculatedStyle.LEFT);
int top = page.getPaintingTop()
+ page.getMarginBorderPadding(c, CalculatedStyle.TOP)
- page.getTop();
g.translate(left, top);
root.paint(c);
g.translate(-left, -top);
g.setClip(working);
}
}
g.setClip(working);
}
private int calcCenteredPageLeftOffset(int maxPageWidth) {
return (getWidth() - maxPageWidth) / 2;
}
public void paintPage(Graphics2D g, int pageNo) {
Layer root = getRootLayer();
if (root == null) {
throw new RuntimeException("Document needs layout");
}
if (pageNo < 0 || pageNo >= root.getPages().size()) {
throw new IllegalArgumentException("Page " + pageNo + " is not between 0 " +
"and " + root.getPages().size());
}
RenderingContext c = newRenderingContext(g);
PageBox page = (PageBox)root.getPages().get(pageNo);
c.setPageCount(root.getPages().size());
c.setPage(pageNo, page);
page.paintBackground(c, 0, Layer.PAGED_MODE_PRINT);
page.paintMarginAreas(c, 0, Layer.PAGED_MODE_PRINT);
page.paintBorder(c, 0, Layer.PAGED_MODE_PRINT);
Shape working = g.getClip();
Rectangle content = page.getPrintClippingBounds(c);
g.clip(content);
int top = -page.getPaintingTop() +
page.getMarginBorderPadding(c, CalculatedStyle.TOP);
int left = page.getMarginBorderPadding(c, CalculatedStyle.LEFT);
g.translate(left, top);
root.paint(c);
g.translate(-left, -top);
g.setClip(working);
}
public void assignPagePrintPositions(Graphics2D g) {
RenderingContext c = newRenderingContext(g);
getRootLayer().assignPagePaintingPositions(c, Layer.PAGED_MODE_PRINT);
}
public void printTree() {
printTree(getRootBox(), "");
}
private void printTree(Box box, String tab) {
XRLog.layout(Level.FINEST, tab + "Box = " + box);
Iterator it = box.getChildIterator();
while (it.hasNext()) {
Box bx = (Box) it.next();
printTree(bx, tab + " ");
}
}
/**
* Sets the layout attribute of the BasicPanel object
* Overrides the method to do nothing, since you shouldn't have a
* LayoutManager on an FS panel.
*
* @param l The new layout value
*/
public void setLayout(LayoutManager l) {
}
public void setSharedContext(SharedContext ctx) {
this.sharedContext = ctx;
}
public void setSize(Dimension d) {
XRLog.layout(Level.FINEST, "set size called");
super.setSize(d);
/* CLEAN: do we need this?
if (doc != null && body_box != null) {
if(body_box.width != d.width)
RenderQueue.getInstance().dispatchLayoutEvent(new ReflowEvent(ReflowEvent.CANVAS_RESIZED, d));
//don't need the below, surely
//else if(body_box.height != d.height)
// RenderQueue.getInstance().dispatchRepaintEvent(new ReflowEvent(ReflowEvent.CANVAS_RESIZED, d));
} */
}
/*
=========== set document utility methods =============== */
public void setDocument(InputStream stream, String url, NamespaceHandler nsh) {
Document dom = XMLResource.load(stream).getDocument();
setDocument(dom, url, nsh);
}
public void setDocumentFromString(String content, String url, NamespaceHandler nsh) {
InputSource is = new InputSource(new BufferedReader(new StringReader(content)));
Document dom = XMLResource.load(is).getDocument();
setDocument(dom, url, nsh);
}
public void setDocument(Document doc, String url) {
setDocument(doc, url, new NoNamespaceHandler());
}
public void setDocument(String url) {
setDocument(loadDocument(url), url, new NoNamespaceHandler());
}
public void setDocument(String url, NamespaceHandler nsh) {
setDocument(loadDocument(url), url, nsh);
}
// TODO: should throw more specific exception (PWW 25/07/2006)
protected void setDocument(InputStream stream, String url)
throws Exception {
setDocument(stream, url, new NoNamespaceHandler());
}
/**
* Sets the new current document, where the new document
* is located relative, e.g using a relative URL.
*
* @param filename The new document to load
*/
protected void setDocumentRelative(String filename) {
String url = getSharedContext().getUac().resolveURI(filename);
if (isAnchorInCurrentDocument(filename)) {
String id = getAnchorId(filename);
Box box = getSharedContext().getBoxById(id);
if (box != null) {
Point pt;
if (box.getStyle().isInline()) {
pt = new Point(box.getAbsX(), box.getAbsY());
} else {
RectPropertySet margin = box.getMargin(getLayoutContext());
pt = new Point(
box.getAbsX() + (int)margin.left(),
box.getAbsY() + (int)margin.top());
}
scrollTo(pt);
return;
}
}
Document dom = loadDocument(url);
setDocument(dom, url);
}
/**
* Reloads the document using the same base URL and namespace handler. Reloading will pick up changes to styles
* within the document.
*
* @param URI A URI for the Document to load, for example, file.toURL().toExternalForm().
*/
public void reloadDocument(String URI) {
reloadDocument(loadDocument(URI));
}
/**
* Reloads the document using the same base URL and namespace handler. Reloading will pick up changes to styles
* within the document.
*
* @param doc The document to reload.
*/
public void reloadDocument(Document doc) {
if (this.doc == null) {
XRLog.render("Reload called on BasicPanel, but there is no document set on the panel yet.");
return;
}
;
this.doc = doc;
setDocument(this.doc, getSharedContext().getBaseURL(), getSharedContext().getNamespaceHandler());
}
public URL getURL() {
URL base = null;
try {
base = new URL(getSharedContext().getUac().getBaseURL());
} catch (MalformedURLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return base;
}
public Document getDocument() {
return doc;
}
/**
* Returns the title as reported by the NamespaceHandler assigned to the SharedContext in this panel. For an HTML
* document, this will be the contents of /html/head/title.
*
* @return the document title, or "" if the namespace handler cannot find a title, or if there is no current document
* in the panel.
*/
public String getDocumentTitle() {
return doc == null ? "" : getSharedContext().getNamespaceHandler().getDocumentTitle(doc);
}
protected Document loadDocument(final String uri) {
XMLResource xmlResource = sharedContext.getUac().getXMLResource(uri);
return xmlResource.getDocument();
}
/* ====== hover and active utility methods
========= */
public boolean isHover(org.w3c.dom.Element e) {
if (e == hovered_element) {
return true;
}
return false;
}
public boolean isActive(org.w3c.dom.Element e) {
if (e == active_element) {
return true;
}
return false;
}
public boolean isFocus(org.w3c.dom.Element e) {
if (e == focus_element) {
return true;
}
return false;
}
/**
* Returns whether the background of this BasicPanel
will
* be painted when it is rendered.
*
* @return true
if the background of this
* BasicPanel
will be painted, false
if it
* will not.
*/
public boolean isOpaque() {
checkOpacityMethodClient();
return explicitlyOpaque;
}
/**
* Specifies whether the background of this BasicPanel
will
* be painted when it is rendered.
*
* @param opaque true
if the background of this
* BasicPanel
should be painted, false
if it
* should not.
*/
public void setOpaque(boolean opaque) {
checkOpacityMethodClient();
explicitlyOpaque = opaque;
}
/**
* Checks that the calling method of the method that calls this method is not in this class
* and throws a RuntimeException if it was. This is used to ensure that parts of this class that
* use the opacity to indicate something other than whether the background is painted do not
* interfere with the user's intentions regarding the background painting.
*
* @throws IllegalStateException if the method that called this method was itself called by a
* method in this same class.
*/
private void checkOpacityMethodClient() {
StackTraceElement[] stackTrace = new Throwable().getStackTrace();
if (stackTrace.length > 2) {
String callingClassName = stackTrace[2].getClassName();
if (BasicPanel.class.getName().equals(callingClassName))
throw new IllegalStateException("BasicPanel should not use its own opacity methods. Use " +
"super.isOpaque()/setOpaque() instead.");
}
}
public SharedContext getSharedContext() {
return sharedContext;
}
public Rectangle getFixedRectangle() {
if (enclosingScrollPane != null) {
return enclosingScrollPane.getViewportBorderBounds();
} else {
Dimension dim = getSize();
return new Rectangle(0, 0, dim.width, dim.height);
}
}
private boolean isAnchorInCurrentDocument(String str) {
return str.charAt(0) == '#';
}
private String getAnchorId(String url) {
return url.substring(1, url.length());
}
/**
* Scroll the panel to make the specified point be on screen. Typically
* this will scroll the screen down to the y component of the point.
*/
public void scrollTo(Point pt) {
if (this.enclosingScrollPane != null) {
this.enclosingScrollPane.getVerticalScrollBar().setValue(pt.y);
}
}
public boolean isInteractive() {
return this.getSharedContext().isInteractive();
}
public void setInteractive(boolean interactive) {
this.getSharedContext().setInteractive(interactive);
}
public void addMouseTrackingListener(FSMouseListener l) {
mouseTracker.addListener(l);
}
public void removeMouseTrackingListener(FSMouseListener l) {
mouseTracker.removeListener(l);
}
public List getMouseTrackingListeners() {
return mouseTracker.getListeners();
}
protected void resetMouseTracker() {
mouseTracker.reset();
}
public boolean isCenteredPagedView() {
return centeredPagedView;
}
public void setCenteredPagedView(boolean centeredPagedView) {
this.centeredPagedView = centeredPagedView;
}
public void submit(String url) {
formSubmissionListener.submit(url);
}
public void setFormSubmissionListener(FormSubmissionListener fsl) {
this.formSubmissionListener =fsl;
sharedContext.setFormSubmissionListener(formSubmissionListener);
}
}
/*
*
* $Log$
* Revision 1.124 2009/05/15 16:12:54 pdoubleya
* Field can be local
*
* Revision 1.123 2009/05/08 12:22:26 pdoubleya
* Merge Vianney's SWT branch to trunk. Passes regress.verify and browser still works :).
*
* Revision 1.119 2008/03/30 16:35:20 pdoubleya
* Issue #231: allow for centered page box in preview mode.
*
* Revision 1.118 2008/02/28 19:35:30 pdoubleya
* On printing, not updating the total page count, required because this is not otherwise available in the rendering context we create for each page
*
* Revision 1.117 2007/11/21 23:59:12 peterbrant
* Always paint default background even if there is no document (report from Richard Bair)
*
* Revision 1.116 2007/10/13 12:04:09 pdoubleya
* Applied patch to fix NPE reported by email https://xhtmlrenderer.dev.java.net/servlets/ReadMsg?listName=users&msgNo=724 with patch proposed by Pete in that thread.
*
* Revision 1.115 2007/08/24 22:49:15 peterbrant
* Add method to retrieve all FSMouseListener objects attached to a panel
*
* Revision 1.114 2007/08/19 22:22:50 peterbrant
* Merge R8pbrant changes to HEAD
*
* Revision 1.112.2.5 2007/08/13 22:32:10 peterbrant
* Rename doLayout() to doDocumentLayout() to avoid confusion with AWT's doLayout()
*
* Revision 1.112.2.4 2007/08/07 17:57:03 peterbrant
* Implement page level backgrounds
*
* Revision 1.112.2.3 2007/08/07 17:06:31 peterbrant
* Implement named pages / Implement page-break-before/after: left/right / Experiment with efficient selection
*
* Revision 1.112.2.2 2007/07/11 22:48:31 peterbrant
* Further progress on running headers and footers
*
* Revision 1.112.2.1 2007/07/09 22:18:04 peterbrant
* Begin work on running headers and footers and named pages
*
* Revision 1.112 2007/06/11 22:30:15 peterbrant
* Minor cleanup to LayoutContext / Start adding infrastructure to support better table pagination
*
* Revision 1.111 2007/05/24 13:22:38 peterbrant
* Optimize and clean up hover and link listeners
*
* Patch from Sean Bright
*
* Revision 1.110 2007/05/21 21:58:48 peterbrant
* More cleanup (remove experimental threading code)
*
* Revision 1.109 2007/04/03 13:12:07 peterbrant
* Add notification interface for layout and render exceptions / Minor clean up (remove obsolete body expand hack, remove unused API, method name improvements)
*
* Revision 1.108 2007/02/22 15:30:43 peterbrant
* Internal links should be able to target block boxes too (plus other minor cleanup)
*
* Revision 1.107 2007/02/07 16:33:29 peterbrant
* Initial commit of rewritten table support and associated refactorings
*
* Revision 1.106 2006/08/29 17:29:14 peterbrant
* Make Style object a thing of the past
*
* Revision 1.105 2006/08/27 00:37:06 peterbrant
* Initial commit of (initial) R7 work
*
* Revision 1.104 2006/08/03 14:12:36 pdoubleya
* Interactivity flag now belongs to shared context, should not be a private field anymore.
*
* Revision 1.103 2006/07/26 18:12:15 pdoubleya
* Add removeDocListener and setDocFromString.
*
* Revision 1.102 2006/04/07 14:48:31 peterbrant
* Fix page border in print mode (vs. paged screen mode)
*
* Revision 1.101 2006/04/07 07:30:56 pdoubleya
* Store reference to loaded XMLResource. Removed commented code. Javadoc.
*
* Revision 1.100 2006/02/22 02:20:19 peterbrant
* Links and hover work again
*
* Revision 1.99 2006/02/05 00:33:59 peterbrant
* Draw fixed layers on every page
*
* Revision 1.98 2006/02/03 23:57:55 peterbrant
* Implement counter(page) and counter(pages) / Bug fixes to alignment calculation
*
* Revision 1.97 2006/02/01 01:30:14 peterbrant
* Initial commit of PDF work
*
* Revision 1.96 2006/01/11 22:21:20 peterbrant
* Fixes to print vs. print preview displays
*
* Revision 1.95 2006/01/04 19:50:17 peterbrant
* More pagination bug fixes / Implement simple pagination for tables
*
* Revision 1.94 2006/01/03 23:54:30 peterbrant
* Fix page clip region checking
*
* Revision 1.93 2006/01/03 17:04:52 peterbrant
* Many pagination bug fixes / Add ability to position absolute boxes in margin area
*
* Revision 1.92 2006/01/02 20:58:22 peterbrant
* Fix NPE
*
* Revision 1.91 2006/01/01 03:15:13 peterbrant
* Fix position of rectangle around page in paged view
*
* Revision 1.90 2006/01/01 02:38:21 peterbrant
* Merge more pagination work / Various minor cleanups
*
* Revision 1.89 2005/12/28 00:50:54 peterbrant
* Continue ripping out first try at pagination / Minor method name refactoring
*
* Revision 1.88 2005/12/21 02:36:30 peterbrant
* - Calculate absolute positions incrementally (prep work for pagination)
* - Light cleanup
* - Fix bug where floats nested in floats could cause the outer float to be positioned in the wrong place
*
* Revision 1.87 2005/12/07 20:34:47 peterbrant
* Remove unused fields/methods from RenderingContext / Paint line content using absolute coords (preparation for relative inline layers)
*
* Revision 1.86 2005/11/25 16:57:23 peterbrant
* Initial commit of inline content refactoring
*
* Revision 1.85 2005/11/09 18:41:28 peterbrant
* Fixes to vertical margin collapsing in the presence of floats / Paint floats as
* layers
*
* Revision 1.84 2005/11/08 20:03:59 peterbrant
* Further progress on painting order / improved positioning implementation
*
* Revision 1.83 2005/11/05 03:30:03 peterbrant
* Start work on painting order and improved positioning implementation
*
* Revision 1.82 2005/11/03 18:02:02 peterbrant
* Flush stylesheets on a RootPanel.setDocument()
*
* Revision 1.81 2005/10/27 00:09:07 tobega
* Sorted out Context into RenderingContext and LayoutContext
*
* Revision 1.80 2005/10/26 17:01:44 peterbrant
* Allow the "use threads" config property to be set on individual instances of
* XHTMLPanel.
*
* Revision 1.79 2005/10/23 22:16:44 tobega
* Preparation for StackingContext rendering
*
* Revision 1.78 2005/10/21 19:54:20 pdoubleya
* changed logging statements to use XRLog and FINE.
*
* Revision 1.77 2005/10/21 19:36:42 peterbrant
* Paint first time through if sync mode
*
* Revision 1.76 2005/10/20 22:51:39 peterbrant
* Add non-threaded rendering mode
*
* Revision 1.75 2005/10/18 20:57:07 tobega
* Patch from Peter Brant
*
* Revision 1.74 2005/10/16 23:57:20 tobega
* Starting experiment with flat representation of render tree
*
* Revision 1.73 2005/10/15 23:39:18 tobega
* patch from Peter Brant
*
* Revision 1.72 2005/10/08 17:40:22 tobega
* Patch from Peter Brant
*
* Revision 1.71 2005/10/02 21:30:00 tobega
* Fixed a lot of concurrency (and other) issues from incremental rendering. Also some house-cleaning.
*
* Revision 1.70 2005/09/29 21:34:05 joshy
* minor updates to a lot of files. pulling in more incremental rendering code.
* fixed another resize bug
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.69 2005/09/28 20:13:26 joshy
* re-enabled body height hack
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.68 2005/09/28 05:17:09 tobega
* don't layout on resize if doc is null
*
* Revision 1.67 2005/09/28 00:33:31 joshy
* more minor cleanups
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.66 2005/09/28 00:25:16 joshy
* a bit more cleanup
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.65 2005/09/28 00:03:29 joshy
* removed cruft from BasicPanel
* turned of incremental layout and lazy images by default
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.64 2005/09/27 23:48:40 joshy
* first merge of basicpanel reworking and incremental layout. more to come.
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.63 2005/09/26 22:40:22 tobega
* Applied patch from Peter Brant concerning margin collapsing
*
* Revision 1.62 2005/07/21 16:10:42 joshy
* added hack to expand the body. fix for bug 96
*
* Revision 1.61 2005/07/18 21:21:20 joshy
* fix for #82
*
* Revision 1.60 2005/07/15 23:39:49 joshy
* updates to try to fix the resize issue
*
* Revision 1.59 2005/07/07 22:13:52 tobega
* cleanup
*
* Revision 1.58 2005/07/07 21:56:45 tobega
* Added patches from Changshin Lee
*
* Revision 1.57 2005/07/02 07:26:59 joshy
* better support for jumping to anchor tags
* also some testing for the resize issue
* need to investigate making the history remember document position.
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.56 2005/06/25 19:27:47 tobega
* UAC now supplies Resources
*
* Revision 1.55 2005/06/22 23:48:46 tobega
* Refactored the css package to allow a clean separation from the core.
*
* Revision 1.54 2005/06/19 23:31:33 joshy
* stop layout support
* clear bug fixes
* mouse busy cursor support
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.53 2005/06/16 12:59:24 pdoubleya
* Cleaned up support for reloading documents.
*
* Revision 1.52 2005/06/16 11:29:13 pdoubleya
* First cut support for reload page, flushes inline stylesheets.
*
* Revision 1.51 2005/06/16 07:24:52 tobega
* Fixed background image bug.
* Caching images in browser.
* Enhanced LinkListener.
* Some house-cleaning, playing with Idea's code inspection utility.
*
* Revision 1.50 2005/06/15 11:59:17 pdoubleya
* Added dynamic layout message.
*
* Revision 1.49 2005/06/15 11:53:46 tobega
* Changed UserAgentCallback to getInputStream instead of getReader. Fixed up some consequences of previous change.
*
* Revision 1.48 2005/06/15 10:56:15 tobega
* cleaned up a bit of URL mess, centralizing URI-resolution and loading to UserAgentCallback
*
* Revision 1.47 2005/06/09 22:34:57 joshy
* This makes the hover listener be added to the xhtml panel by default.
* Also improves the box searching code by testing if the parent of the deepest
* box is hoverable in the case where the deepest box is not.
*
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.46 2005/06/01 21:36:44 tobega
* Got image scaling working, and did some refactoring along the way
*
* Revision 1.45 2005/05/13 15:23:56 tobega
* Done refactoring box borders, margin and padding. Hover is working again.
*
* Revision 1.44 2005/05/09 20:11:30 tobega
* Improved the bfc hack for top level document
*
* Revision 1.43 2005/05/08 13:02:41 tobega
* Fixed a bug whereby styles could get lost for inline elements, notably if root element was inline. Did a few other things which probably has no importance at this moment, e.g. refactored out some unused stuff.
*
* Revision 1.42 2005/04/22 17:12:50 joshy
* fixed hover breaking with absolute blocks
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.41 2005/04/21 22:34:57 tobega
* Fixed an instability in rendering arbitrary xml (added default style to start off with)
*
* Revision 1.40 2005/02/05 17:20:10 pdoubleya
* Use XMLResource for loading XML.
*
* Revision 1.39 2005/02/05 11:33:49 pdoubleya
* Load pages directly from XMLResource.
*
* Revision 1.38 2005/02/03 23:02:31 pdoubleya
* Uses ResourceProvider for loading files.
*
* Revision 1.37 2005/01/31 22:54:14 pdoubleya
* Adjusted calcs for findBox and findElementBox.
*
* Revision 1.36 2005/01/29 20:17:42 pdoubleya
* Updated panels to support page up/down properly, and formatted/cleaned.
*
* Revision 1.35 2005/01/25 14:45:54 pdoubleya
* Added support for IdentValue mapping on property declarations. On both CascadedStyle and PropertyDeclaration you can now request the value as an IdentValue, for object-object comparisons. Updated 99% of references that used to get the string value of PD to return the IdentValue instead; remaining cases are for pseudo-elements where the PD content needs to be manipulated as a String.
*
* Revision 1.34 2005/01/16 18:50:06 tobega
* Re-introduced caching of styles, which make hamlet and alice scroll nicely again. Background painting still slow though.
*
* Revision 1.33 2005/01/10 01:58:37 tobega
* Simplified (and hopefully improved) handling of vertical-align. Added support for line-height. As always, provoked a few bugs in the process.
*
* Revision 1.32 2005/01/08 15:56:55 tobega
* Further work on extensibility interfaces. Documented it - see website.
*
* Revision 1.31 2005/01/08 11:55:18 tobega
* Started massaging the extension interfaces
*
* Revision 1.30 2005/01/07 12:42:08 tobega
* Hacked improved support for custom components (read forms). Creates trouble with the image demo. Anyway, components work and are usually in the right place.
*
* Revision 1.29 2005/01/06 21:54:33 tobega
* Text decoration now handled in rendering only
*
* Revision 1.28 2005/01/05 01:10:16 tobega
* Went wild with code analysis tool. removed unused stuff. Lucky we have CVS...
*
* Revision 1.27 2005/01/03 00:35:03 tobega
* Cleaned out old forms code
*
* Revision 1.26 2005/01/02 12:22:20 tobega
* Cleaned out old layout code
*
* Revision 1.25 2005/01/02 09:32:41 tobega
* Now using mostly static methods for layout
*
* Revision 1.24 2005/01/02 01:00:09 tobega
* Started sketching in code for handling replaced elements in the NamespaceHandler
*
* Revision 1.23 2005/01/01 08:09:21 tobega
* Now using entirely static methods for render. Need to implement table. Need to clean.
*
* Revision 1.22 2004/12/29 10:39:35 tobega
* Separated current state Context into LayoutContext and the rest into SharedContext.
*
* Revision 1.21 2004/12/29 07:35:39 tobega
* Prepared for cloned Context instances by encapsulating fields
*
* Revision 1.20 2004/12/28 01:48:24 tobega
* More cleaning. Magically, the financial report demo is starting to look reasonable, without any effort being put on it.
*
* Revision 1.19 2004/12/27 07:43:33 tobega
* Cleaned out border from box, it can be gotten from current style. Is it maybe needed for dynamic stuff?
*
* Revision 1.18 2004/12/22 05:32:57 tobega
* Hover is working
*
* Revision 1.17 2004/12/14 01:56:23 joshy
* fixed layout width bugs
* fixed extra border on document bug
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.16 2004/12/14 00:32:21 tobega
* Cleaned and fixed line breaking. Renamed BodyContent to DomToplevelNode
*
* Revision 1.15 2004/12/12 03:33:02 tobega
* Renamed x and u to avoid confusing IDE. But that got cvs in a twist. See if this does it
*
* Revision 1.14 2004/12/11 18:18:11 tobega
* Still broken, won't even compile at the moment. Working hard to fix it, though. Replace the StyleReference interface with our only concrete implementation, it was a bother changing in two places all the time.
*
* Revision 1.13 2004/12/09 18:00:06 joshy
* fixed hover bugs
* fixed li's not being blocks bug
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.12 2004/12/09 00:11:52 tobega
* Almost ready for Content-based inline generation.
*
* Revision 1.11 2004/12/06 02:52:22 tobega
* re-inserted reference to Class Xx, which IntelliJ thought was unused
*
* Revision 1.10 2004/12/06 00:19:15 tobega
* Worked on handling :before and :after. Got sidetracked by BasicPanel causing layout to be done twice: solved. If solution causes problems, check BasicPanel.setSize
*
* Revision 1.9 2004/11/30 20:28:28 joshy
* support for multiple floats on a single line.
*
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.8 2004/11/29 23:28:11 joshy
* updated the javadocs
* added media methods to RenderingContext
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.7 2004/11/23 21:19:22 joshy
* added support for loading a document from an InputStream
* (for cases where you don't have a Document or URL)
*
* - j
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.6 2004/11/23 18:38:48 joshy
* removed isPrinting() method from rendering context because it's
* not needed. the panel can detect printing by checking for
* instanceof PrinterGraphics
*
* -j
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.5 2004/11/22 21:34:04 joshy
* created new whitespace handler.
* new whitespace routines only work if you set a special property. it's
* off by default.
*
* turned off fractional font metrics
*
* fixed some bugs in Uu and Xx
*
* - j
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.4 2004/11/16 15:38:44 joshy
* removed background printing which speeds it up considerably
* added boolean in conf to turn off backgrounds for testing
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.3 2004/11/16 10:30:20 pdoubleya
* Changed to use XRLog for logging.
* Ran code formatter.
* Marked blocks needed to CLEAN.
*
* Revision 1.2 2004/11/16 10:14:11 pdoubleya
* Was not importing util.Xx, so was assuming that Xx was a member variable in the superclass. Added import.
*
* Revision 1.1 2004/11/16 07:25:13 tobega
* Renamed HTMLPanel to BasicPanel
*
* Revision 1.33 2004/11/14 21:33:49 joshy
* new font rendering interface support
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.32 2004/11/12 20:54:08 joshy
* fixed bug where setOpaque would become false for a page with fixed content and then never
* become true again on another normal page
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.31 2004/11/12 18:51:01 joshy
* fixed repainting issue for background-attachment: fixed
* added static util methods and get minimum size to graphics 2d renderer
* added test for graphics 2d renderer
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.30 2004/11/12 17:05:25 joshy
* support for fixed positioning
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.29 2004/11/12 02:54:38 joshy
* removed more dead code
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.28 2004/11/12 02:50:59 joshy
* finished moving base url
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.27 2004/11/12 02:23:59 joshy
* added new APIs for rendering context, xhtmlpanel, and graphics2drenderer.
* initial support for font mapping additions
*
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.26 2004/11/12 01:42:26 tobega
* oops
*
* Revision 1.25 2004/11/12 01:39:07 tobega
* no message
*
* Revision 1.24 2004/11/12 00:20:31 tobega
* Set up the HoverListener to work properly. Colors are changing!
*
* Revision 1.23 2004/11/10 14:34:21 joshy
* more hover support
*
* Revision 1.22 2004/11/10 04:46:12 tobega
* no message
*
* Revision 1.21 2004/11/07 23:24:19 joshy
* added menu item to generate diffs
* added diffs for multi-colored borders and inline borders
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.20 2004/11/05 23:59:10 tobega
* "New" matching and styling
*
* Revision 1.19 2004/11/04 21:51:17 tobega
* Preparation for new matching/styling code
*
* Revision 1.18 2004/11/03 23:54:34 joshy
* added hamlet and tables to the browser
* more support for absolute layout
* added absolute layout unit tests
* removed more dead code and moved code into layout factory
*
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.17 2004/11/01 14:24:19 joshy
* added a boolean for turning off threading
* fixed the diff tests
* removed some dead code
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.16 2004/10/28 14:18:23 joshy
* cleaned up the htmlpanel and made more of the variables protected
* fixed the bug where the body is too small for the viewport
* fixed the bug where the screen isn't re-laid out when the window is resized
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.15 2004/10/28 13:46:33 joshy
* removed dead code
* moved code about specific elements to the layout factory (link and br)
* fixed form rendering bug
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.14 2004/10/27 13:39:57 joshy
* moved more rendering code out of the layouts
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.13 2004/10/27 13:17:02 joshy
* beginning to split out rendering code
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.12 2004/10/27 04:08:44 joshy
* removed debugging code
*
* Revision 1.11 2004/10/26 00:13:14 joshy
* added threaded layout support to the BasicPanel
*
*
* Issue number:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.10 2004/10/23 13:51:54 pdoubleya
* Re-formatted using JavaStyle tool.
* Cleaned imports to resolve wildcards except for common packages (java.io, java.util, etc).
* Added CVS log comments at bottom.
*
* Revision 1.9 2004/10/18 12:12:26 pdoubleya
* Changed to use XRLog for logging.
*
* Revision 1.8 2004/10/14 15:45:22 pdoubleya
* Reformatted.
*
* Revision 1.7 2004/10/14 15:43:32 pdoubleya
* Reads location of default.CSS from configuration file.
*
*
*/