001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package javax.swing.plaf.basic;
019:
020: import java.awt.Container;
021: import java.awt.Graphics;
022: import java.awt.Rectangle;
023: import java.awt.Shape;
024: import java.io.Reader;
025: import java.io.StringReader;
026:
027: import javax.swing.JComponent;
028: import javax.swing.text.AttributeSet;
029: import javax.swing.text.BadLocationException;
030: import javax.swing.text.Document;
031: import javax.swing.text.Element;
032: import javax.swing.text.Position;
033: import javax.swing.text.View;
034: import javax.swing.text.ViewFactory;
035: import javax.swing.text.Position.Bias;
036: import javax.swing.text.html.HTMLEditorKit;
037:
038: public class BasicHTML {
039:
040: public static final String documentBaseKey = "html.base"; //$NON-NLS-1
041:
042: public static final String propertyKey = "html"; //$NON-NLS-1
043:
044: /**
045: * Used to detect HTML strings in {@link #isHTMLString(String)}.
046: */
047: private static final String detectString = "<html"; //$NON-NLS-1
048:
049: public static void updateRenderer(JComponent c, String text) {
050: c.putClientProperty(propertyKey,
051: (isHTMLString(text) ? createHTMLView(c, text) : null));
052: }
053:
054: public static boolean isHTMLString(String s) {
055: // Maybe s.trim() would be useful but RI doesn't do it.
056: return ((s != null) && s.toLowerCase().startsWith(detectString));
057: }
058:
059: public static View createHTMLView(JComponent c, String html) {
060: return new Renderer(c, html);
061: }
062:
063: /**
064: * Renderer is a RootView for the views obtained from html string.
065: */
066: static class Renderer extends View {
067:
068: /**
069: * JComponent that uses this Renderer to draw itself
070: */
071: private final JComponent component;
072:
073: /**
074: * Son view is a view that do all the job. But it haven't reference to
075: * factory and styles
076: */
077: private final View son;
078:
079: /**
080: * The factory obtained from HTMLEditorKit
081: */
082: private final ViewFactory factory;
083:
084: Renderer(JComponent component, String html) {
085:
086: super (null);
087: this .component = component;
088:
089: HTMLEditorKit kit = new HTMLEditorKit();
090: Document doc = kit.createDefaultDocument();
091: Reader r = new StringReader(html);
092:
093: try {
094: kit.read(r, doc, 0);
095: } catch (Throwable e) {
096: // Ignored for now. Need to be tested
097: }
098:
099: factory = kit.getViewFactory();
100: son = factory.create(doc.getDefaultRootElement());
101: son.setParent(this );
102: }
103:
104: @Override
105: public AttributeSet getAttributes() {
106: return null;
107: }
108:
109: @Override
110: public float getPreferredSpan(int axis) {
111: return son.getPreferredSpan(axis);
112: }
113:
114: @Override
115: public void preferenceChanged(View child, boolean width,
116: boolean height) {
117: component.repaint();
118: }
119:
120: @Override
121: public void paint(Graphics g, Shape allocation) {
122: Rectangle rect = allocation.getBounds();
123: son.setSize(rect.width, rect.height);
124: son.paint(g, allocation);
125: }
126:
127: @Override
128: public int getViewCount() {
129: return 1;
130: }
131:
132: @Override
133: public View getView(int i) {
134: return son;
135: }
136:
137: @Override
138: public int viewToModel(float x, float y, Shape a,
139: Position.Bias[] bias) {
140: return son.viewToModel(x, y, a, bias);
141: }
142:
143: @Override
144: public Element getElement() {
145: return son.getElement();
146: }
147:
148: @Override
149: public Container getContainer() {
150: return component;
151: }
152:
153: @Override
154: public ViewFactory getViewFactory() {
155: return factory;
156: }
157:
158: @Override
159: public Shape modelToView(int pos, Shape shape, Bias bias)
160: throws BadLocationException {
161: return son.modelToView(pos, shape, bias);
162: }
163:
164: }
165:
166: }
|