1 18 package org.apache.batik.svggen; 19 20 import java.awt.Component ; 21 import java.awt.Rectangle ; 22 23 import javax.swing.AbstractButton ; 24 import javax.swing.JComboBox ; 25 import javax.swing.JComponent ; 26 import javax.swing.JMenuBar ; 27 import javax.swing.JPopupMenu ; 28 import javax.swing.JProgressBar ; 29 import javax.swing.JScrollBar ; 30 import javax.swing.JToolBar ; 31 import javax.swing.UIManager ; 32 import javax.swing.border.Border ; 33 import javax.swing.plaf.ComponentUI ; 34 35 import org.w3c.dom.Element ; 36 37 44 public abstract class SwingSVGPrettyPrint implements SVGSyntax { 45 46 52 public static void print(JComponent cmp, SVGGraphics2D svgGen) { 53 if ((cmp instanceof JComboBox ) || (cmp instanceof JScrollBar )) { 54 printHack(cmp, svgGen); 57 return; 58 } 59 60 SVGGraphics2D g = (SVGGraphics2D)svgGen.create(); 62 g.setColor(cmp.getForeground()); 63 g.setFont(cmp.getFont()); 64 Element topLevelGroup = g.getTopLevelGroup(); 65 66 if ((cmp.getWidth() <= 0) || (cmp.getHeight() <= 0)) 68 return; 69 70 Rectangle clipRect = g.getClipBounds(); 71 if (clipRect == null) 72 g.setClip(0, 0, cmp.getWidth(), cmp.getHeight()); 73 74 paintComponent(cmp, g); 75 paintBorder(cmp, g); 76 paintChildren(cmp, g); 77 78 Element cmpGroup = g.getTopLevelGroup(); 80 cmpGroup.setAttributeNS(null, "id", 81 svgGen.getGeneratorContext().idGenerator. 82 generateID(cmp.getClass().getName())); 83 84 topLevelGroup.appendChild(cmpGroup); 85 svgGen.setTopLevelGroup(topLevelGroup); 86 } 87 88 92 private static void printHack(JComponent cmp, SVGGraphics2D svgGen) { 93 SVGGraphics2D g = (SVGGraphics2D)svgGen.create(); 95 g.setColor(cmp.getForeground()); 96 g.setFont(cmp.getFont()); 97 Element topLevelGroup = g.getTopLevelGroup(); 98 99 if ((cmp.getWidth() <= 0) || (cmp.getHeight() <= 0)) 101 return; 102 103 Rectangle clipRect = g.getClipBounds(); 104 if (clipRect == null) { 105 g.setClip(0, 0, cmp.getWidth(), cmp.getHeight()); 106 } 107 108 cmp.paint(g); 109 110 Element cmpGroup = g.getTopLevelGroup(); 112 cmpGroup.setAttributeNS(null, "id", 113 svgGen.getGeneratorContext().idGenerator. 114 generateID(cmp.getClass().getName())); 115 116 topLevelGroup.appendChild(cmpGroup); 117 svgGen.setTopLevelGroup(topLevelGroup); 118 } 119 120 121 private static void paintComponent(JComponent cmp, SVGGraphics2D svgGen){ 122 ComponentUI ui = UIManager.getUI(cmp); 123 if(ui != null){ 124 ui.installUI(cmp); 125 ui.update(svgGen, cmp); 126 } 127 } 128 129 135 private static void paintBorder(JComponent cmp, SVGGraphics2D svgGen){ 136 Border border = cmp.getBorder(); 137 if(border != null){ 138 if( (cmp instanceof AbstractButton ) 139 || 140 (cmp instanceof JPopupMenu ) 141 || 142 (cmp instanceof JToolBar ) 143 || 144 (cmp instanceof JMenuBar ) 145 || 146 (cmp instanceof JProgressBar ) ){ 147 if( ((cmp instanceof AbstractButton ) && ((AbstractButton )cmp).isBorderPainted()) 148 || 149 ((cmp instanceof JPopupMenu ) && ((JPopupMenu )cmp).isBorderPainted()) 150 || 151 ((cmp instanceof JToolBar ) && ((JToolBar )cmp).isBorderPainted()) 152 || 153 ((cmp instanceof JMenuBar ) && ((JMenuBar )cmp).isBorderPainted()) 154 || 155 ((cmp instanceof JProgressBar ) && ((JProgressBar )cmp).isBorderPainted() )) 156 border.paintBorder(cmp, svgGen, 0, 0, cmp.getWidth(), cmp.getHeight()); 157 } else { 158 border.paintBorder(cmp, svgGen, 0, 0, cmp.getWidth(), cmp.getHeight()); 159 } 160 } 161 } 162 163 private static void paintChildren(JComponent cmp, SVGGraphics2D svgGen){ 164 int i = cmp.getComponentCount() - 1; 165 boolean isJComponent = false; 166 Rectangle tmpRect = new Rectangle (); 167 168 for(; i>=0; i--){ 169 Component comp = cmp.getComponent(i); 170 171 if(comp != null && JComponent.isLightweightComponent(comp) && 172 (comp.isVisible() == true)) { 173 Rectangle cr = null; 174 isJComponent = (comp instanceof JComponent ); 175 176 if(isJComponent) { 177 cr = tmpRect; 178 ((JComponent )comp).getBounds(cr); 179 } else { 180 cr = comp.getBounds(); 181 } 182 183 boolean hitClip = 184 svgGen.hitClip(cr.x, cr.y, cr.width, cr.height); 185 186 if (hitClip) { 187 SVGGraphics2D cg = (SVGGraphics2D)svgGen.create(cr.x, cr.y, cr.width, cr.height); 188 cg.setColor(comp.getForeground()); 189 cg.setFont(comp.getFont()); 190 if(comp instanceof JComponent ) 191 print((JComponent )comp, cg); 192 else{ 193 comp.paint(cg); 194 } 195 } 196 } 197 } 198 } 199 } 200 | Popular Tags |