/** * Returns the next GraphicsNode that matches the specified string or null if any. * * @param text the text to match */ protected GraphicsNode getNext(String text) { if (walker == null && gvtRoot != null) { walker = new GVTTreeWalker(gvtRoot); } GraphicsNode gn = walker.getCurrentGraphicsNode(); int index = match(gn, text, currentIndex + text.length()); if (index >= 0) { currentIndex = index; } else { currentIndex = 0; gn = walker.nextGraphicsNode(); while (gn != null && ((currentIndex = match(gn, text, currentIndex)) < 0)) { currentIndex = 0; gn = walker.nextGraphicsNode(); } } return gn; }
/** Shows the current selected <tt>TextNode</tt>. */ protected void showSelectedGraphicsNode() { GraphicsNode gn = walker.getCurrentGraphicsNode(); if (!(gn instanceof TextNode)) { return; } TextNode textNode = (TextNode) gn; // mark the selection of the substring found String text = textNode.getText(); String pattern = search.getText(); if (!caseSensitive.isSelected()) { text = text.toLowerCase(); pattern = pattern.toLowerCase(); } int end = text.indexOf(pattern, currentIndex); AttributedCharacterIterator aci = textNode.getAttributedCharacterIterator(); aci.first(); for (int i = 0; i < end; ++i) { aci.next(); } Mark startMark = textNode.getMarkerForChar(aci.getIndex(), true); for (int i = 0; i < pattern.length() - 1; ++i) { aci.next(); } Mark endMark = textNode.getMarkerForChar(aci.getIndex(), false); svgCanvas.select(startMark, endMark); // zoom on the TextNode if needed if (highlightButton.isSelected()) { return; } // get the highlight shape in GVT root (global) coordinate sytem Shape s = textNode.getHighlightShape(); AffineTransform at; if (highlightCenterZoomButton.isSelected()) { at = svgCanvas.getInitialTransform(); } else { at = svgCanvas.getRenderingTransform(); } // get the bounds of the highlight shape in the canvas coordinate system Rectangle2D gnb = at.createTransformedShape(s).getBounds(); Dimension canvasSize = svgCanvas.getSize(); // translate the highlight region to (0, 0) in the canvas coordinate // system AffineTransform Tx = AffineTransform.getTranslateInstance( -gnb.getX() - gnb.getWidth() / 2, -gnb.getY() - gnb.getHeight() / 2); if (highlightCenterZoomButton.isSelected()) { // zoom on the highlight shape such as the shape takes x% of the // canvas size double sx = canvasSize.width / gnb.getWidth(); double sy = canvasSize.height / gnb.getHeight(); double scale = Math.min(sx, sy) / 8; if (scale > 1) { Tx.preConcatenate(AffineTransform.getScaleInstance(scale, scale)); } } Tx.preConcatenate( AffineTransform.getTranslateInstance(canvasSize.width / 2, canvasSize.height / 2)); // take into account the initial transform AffineTransform newRT = new AffineTransform(at); newRT.preConcatenate(Tx); // change the rendering transform svgCanvas.setRenderingTransform(newRT); }