deweese 2004/11/20 11:27:11 Modified: sources/org/apache/batik/swing JSVGScrollPane.java sources/org/apache/batik/swing/gvt JGVTComponent.java Log: 1) Added a modifid version of George's fix for changing documents to JSVGScrollPane. 2) Fixed 'flashing' with JSVGScrollPane. 3) JSVGScrollPane will now use bbox of geometry if no viewBox is provided. Revision Changes Path 1.7 +98 -103 xml-batik/sources/org/apache/batik/swing/JSVGScrollPane.java Index: JSVGScrollPane.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/JSVGScrollPane.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- JSVGScrollPane.java 18 Aug 2004 07:15:32 -0000 1.6 +++ JSVGScrollPane.java 20 Nov 2004 19:27:10 -0000 1.7 @@ -19,12 +19,9 @@ import java.awt.Rectangle; import java.awt.Dimension; -import java.awt.event.MouseEvent; import java.awt.Component; import java.awt.BorderLayout; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseMotionListener; import java.awt.event.ComponentAdapter; /* import java.awt.event.MouseWheelEvent; @@ -36,6 +33,7 @@ import java.awt.event.ComponentEvent; +import javax.swing.BoundedRangeModel; import javax.swing.JScrollBar; import javax.swing.Box; import javax.swing.JPanel; @@ -44,6 +42,10 @@ import javax.swing.event.ChangeEvent; import org.apache.batik.bridge.ViewBox; +import org.apache.batik.bridge.UpdateManagerListener; +import org.apache.batik.bridge.UpdateManagerEvent; + +import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.swing.gvt.JGVTComponentListener; @@ -84,7 +86,7 @@ protected SBListener hsbListener; protected SBListener vsbListener; - protected Rectangle2D.Float viewBox = null; // SVG Root element viewbox + protected Rectangle2D viewBox = null; // SVG Root element viewbox protected boolean ignoreScrollChange = false; @@ -113,13 +115,9 @@ // listeners hsbListener = createScrollBarListener(false); horizontal.getModel().addChangeListener(hsbListener); - horizontal.addMouseListener(hsbListener); - horizontal.addMouseMotionListener(hsbListener); vsbListener = createScrollBarListener(true); vertical.getModel().addChangeListener(vsbListener); - vertical.addMouseListener(vsbListener); - vertical.addMouseMotionListener(vsbListener); // by default, scrollbars are not visible horizontalPanel.setVisible(false); @@ -139,9 +137,10 @@ // canvas listeners ScrollListener xlistener = new ScrollListener(); - canvas.addJGVTComponentListener(xlistener); this.addComponentListener(xlistener); + canvas.addJGVTComponentListener(xlistener); canvas.addGVTTreeBuilderListener(xlistener); + canvas.addUpdateManagerListener(xlistener); }// JSVGScrollPane() @@ -266,83 +265,56 @@ * 'passes through' click events. It doesn't coalesce as many * events as it should, but it helps * considerably. */ - protected class SBListener extends MouseAdapter - implements ChangeListener, MouseMotionListener + protected class SBListener implements ChangeListener { // 'true' if we are in a drag (versus a click) protected boolean inDrag = false; - // true if we are in a click - protected boolean inClick = false; + protected int startValue; protected boolean isVertical; - int startValue; public SBListener(boolean vertical) { isVertical = vertical; }// SBListener() - - public synchronized void mouseDragged(MouseEvent e) - { - inDrag = true; - AffineTransform at; - if (isVertical) { - int newValue = vertical.getValue(); - at = AffineTransform.getTranslateInstance - (0, startValue-newValue); - } else { - int newValue = horizontal.getValue(); - at = AffineTransform.getTranslateInstance - (startValue-newValue, 0); - } - - canvas.setPaintingTransform(at); - }// mouseDragged() - - - public synchronized void mousePressed(MouseEvent e) - { - // we've pressed the mouse - inClick = true; - if (isVertical) - startValue = vertical.getValue(); - else - startValue = horizontal.getValue(); - }// mousePressed() - - - public synchronized void mouseReleased(MouseEvent e) - { - if(inDrag) { - int newValue; - if (isVertical) newValue = vertical.getValue(); - else newValue = horizontal.getValue(); - - if (newValue != startValue) - setScrollPosition(); // This is the 'end' of a drag - else - canvas.setPaintingTransform(new AffineTransform()); - } - - // reset drag indicator - inDrag = false; - inClick = false; - }// mouseReleased() - - public void mouseMoved(MouseEvent e) - { - // do nothing - }// mouseMoved() - public synchronized void stateChanged(ChangeEvent e) { // only respond to changes if we are NOT being dragged // and ignoreScrollChange is not set - if(!inDrag && !inClick && !ignoreScrollChange) { - //System.out.println(e); - //System.out.println(vertical.getModel()); - //System.out.println(horizontal.getModel()); + if(ignoreScrollChange) return; + + Object src = e.getSource(); + if (!(src instanceof BoundedRangeModel)) + return; + + int val = ((isVertical)?vertical.getValue(): + horizontal.getValue()); + + BoundedRangeModel brm = (BoundedRangeModel)src; + if (brm.getValueIsAdjusting()) { + if (!inDrag) { + inDrag = true; + startValue = val; + } else { + AffineTransform at; + if (isVertical) { + at = AffineTransform.getTranslateInstance + (0, startValue-val); + } else { + at = AffineTransform.getTranslateInstance + (startValue-val, 0); + } + canvas.setPaintingTransform(at); + } + } else { + if (inDrag) { + inDrag = false; + if (val == startValue) { + canvas.setPaintingTransform(new AffineTransform()); + return; + } + } setScrollPosition(); } }// stateChanged() @@ -352,7 +324,8 @@ /** Handle scroll, zoom, and resize events */ protected class ScrollListener extends ComponentAdapter - implements JGVTComponentListener, GVTTreeBuilderListener + implements JGVTComponentListener, GVTTreeBuilderListener, + UpdateManagerListener { protected boolean isReady = false; @@ -370,34 +343,44 @@ }// componentResized() + public void gvtBuildPrepare (GVTTreeBuilderEvent e) { + isReady = false; + } public void gvtBuildCompleted(GVTTreeBuilderEvent e) { isReady = true; + viewBox = null; // new document forget old viewBox if any. resizeScrollBars(); }// gvtRenderingCompleted() + public void updateCompleted(UpdateManagerEvent e) { + if (viewBox == null) { + resizeScrollBars(); + return; + } + + Rectangle2D newview = getViewBoxRect(); + if ((newview.getX() != viewBox.getX()) || + (newview.getY() != viewBox.getY()) || + (newview.getWidth() != viewBox.getWidth()) || + (newview.getHeight() != viewBox.getHeight())) { + viewBox = newview; + resizeScrollBars(); + } + } - public void gvtBuildCancelled(GVTTreeBuilderEvent e) - { - // do nothing - }// gvtRenderingCancelled() - - - public void gvtBuildFailed(GVTTreeBuilderEvent e) - { - // do nothing - }// gvtRenderingFailed() - - public void gvtBuildPrepare(GVTTreeBuilderEvent e) - { - // do nothing - }// gvtRenderingPrepare() - - public void gvtBuildStarted(GVTTreeBuilderEvent e) - { - // do nothing - }// gvtRenderingStarted() - + + public void gvtBuildCancelled(GVTTreeBuilderEvent e) { } + public void gvtBuildFailed (GVTTreeBuilderEvent e) { } + public void gvtBuildStarted (GVTTreeBuilderEvent e) { } + + public void managerStarted (UpdateManagerEvent e) { } + public void managerSuspended(UpdateManagerEvent e) { } + public void managerResumed (UpdateManagerEvent e) { } + public void managerStopped (UpdateManagerEvent e) { } + public void updateStarted (UpdateManagerEvent e) { } + public void updateFailed (UpdateManagerEvent e) { } + }// inner class ScrollListener @@ -502,6 +485,7 @@ horizontalPanel.setVisible(true); vertical.setVisible(true); cornerBox.setVisible(true); + ret.width = minVPW; ret.height = minVPH; } else { @@ -550,21 +534,32 @@ */ protected void checkAndSetViewBoxRect() { if (viewBox != null) return; - SVGDocument doc = canvas.getSVGDocument(); - if (doc == null) return; - SVGSVGElement el = doc.getRootElement(); - if (el == null) return; - String viewBoxStr = el.getAttributeNS - (null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE); - float[] rect = ViewBox.parseViewBoxAttribute(el, viewBoxStr); - viewBox = new Rectangle2D.Float(rect[0], rect[1], rect[2], rect[3]); - + viewBox = getViewBoxRect(); // System.out.println(" ** viewBox rect set: "+viewBox); // System.out.println(" ** doc size: "+ // canvas.getSVGDocumentSize()); }// checkAndSetViewBoxRect() - + + + protected Rectangle2D getViewBoxRect() { + SVGDocument doc = canvas.getSVGDocument(); + if (doc == null) return null; + SVGSVGElement el = doc.getRootElement(); + if (el == null) return null; + + String viewBoxStr = el.getAttributeNS + (null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE); + if (viewBoxStr.length() != 0) { + float[] rect = ViewBox.parseViewBoxAttribute(el, viewBoxStr); + return new Rectangle2D.Float(rect[0], rect[1], + rect[2], rect[3]); + } + GraphicsNode gn = canvas.getGraphicsNode(); + if (gn == null) return null; + + return (Rectangle2D)gn.getBounds().clone(); + } /** * Called when the scale size changes. The scale factor 1.46 +3 -3 xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java Index: JGVTComponent.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java,v retrieving revision 1.45 retrieving revision 1.46 diff -u -r1.45 -r1.46 --- JGVTComponent.java 23 Oct 2004 17:11:03 -0000 1.45 +++ JGVTComponent.java 20 Nov 2004 19:27:10 -0000 1.46 @@ -763,7 +763,6 @@ suspendInteractions = true; if (!progressivePaint && !doubleBufferedRendering) { image = null; - immediateRepaint(); } } @@ -771,7 +770,6 @@ * Called when a rendering started. */ public void gvtRenderingStarted(GVTTreeRendererEvent e) { - paintingTransform = null; if (progressivePaint && !doubleBufferedRendering) { image = e.getImage(); progressivePaintThread = new HaltingThread() { @@ -803,6 +801,7 @@ progressivePaintThread.start(); } if (!doubleBufferedRendering) { + paintingTransform = null; suspendInteractions = false; } } @@ -814,6 +813,7 @@ haltProgressivePaintThread(); if (doubleBufferedRendering) { + paintingTransform = null; suspendInteractions = false; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]