deweese 2005/03/05 11:31:09 Modified: sources/org/apache/batik/gvt/renderer StrokingTextPainter.java sources/org/apache/batik/gvt/text ConcreteTextSelector.java sources/org/apache/batik/swing/gvt JGVTComponent.java TextSelectionManager.java Log: 1) Rationalized Text Selection code. Copy to clipboard is now done by JGVTComponent only if 'unix style' text selection is requested (default). Revision Changes Path 1.55 +4 -4 xml-batik/sources/org/apache/batik/gvt/renderer/StrokingTextPainter.java Index: StrokingTextPainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/StrokingTextPainter.java,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- StrokingTextPainter.java 15 Dec 2004 10:50:30 -0000 1.54 +++ StrokingTextPainter.java 5 Mar 2005 19:31:09 -0000 1.55 @@ -1446,7 +1446,7 @@ public Mark selectLast(TextNode node) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); - TextHit textHit = new TextHit(aci.getEndIndex(), false); + TextHit textHit = new TextHit(aci.getEndIndex()-1, false); return new BasicTextPainter.BasicMark(node, textHit); } @@ -1469,8 +1469,8 @@ start = (BasicTextPainter.BasicMark) startMark; finish = (BasicTextPainter.BasicMark) finishMark; } catch (ClassCastException cce) { - throw new - Error("This Mark was not instantiated by this TextPainter class!"); + throw new Error + ("This Mark was not instantiated by this TextPainter class!"); } TextNode textNode = start.getTextNode(); 1.21 +1 -44 xml-batik/sources/org/apache/batik/gvt/text/ConcreteTextSelector.java Index: ConcreteTextSelector.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/ConcreteTextSelector.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- ConcreteTextSelector.java 18 Aug 2004 07:14:40 -0000 1.20 +++ ConcreteTextSelector.java 5 Mar 2005 19:31:09 -0000 1.21 @@ -121,7 +121,6 @@ Shape shape = node.getHighlightShape(); dispatchSelectionEvent(new SelectionEvent (selection, SelectionEvent.SELECTION_DONE, shape)); - copyToClipboard(selection); } public void clearSelection() { @@ -129,7 +128,6 @@ return; dispatchSelectionEvent(new SelectionEvent (null, SelectionEvent.SELECTION_CLEARED, null)); - // copyToClipboard(null); selectionNode = null; } @@ -207,7 +205,6 @@ new SelectionEvent(oldSelection, SelectionEvent.SELECTION_DONE, newShape)); - copyToClipboard(oldSelection); } else if (isSelectContinueGesture(evt)) { @@ -235,7 +232,6 @@ .addTreeGraphicsNodeChangeListener(this); } selectionNode = source; - ((Selectable) source).selectAll(p.getX(), p.getY()); Object oldSelection = getSelection(); Shape newShape = @@ -244,7 +240,6 @@ new SelectionEvent(oldSelection, SelectionEvent.SELECTION_DONE, newShape)); - copyToClipboard(oldSelection); } } } @@ -341,44 +336,6 @@ } } - private void copyToClipboard(final Object o) { - // - // HACK: getSystemClipboard sometimes deadlocks on linux when called - // from the AWT Thread. The Thread creation prevents that. - // - new Thread() { - public void run() { - // first see if we can access the clipboard - SecurityManager securityManager = System.getSecurityManager(); - boolean canAccessClipboard = true; - if (securityManager != null) { - try { - securityManager.checkSystemClipboardAccess(); - } catch (SecurityException e) { - canAccessClipboard = false; - } - } - if (canAccessClipboard) { - String label = ""; - if (o instanceof CharacterIterator) { - CharacterIterator iter = (CharacterIterator) o; - char[] cbuff = new char[iter.getEndIndex()-iter.getBeginIndex()]; - if (cbuff.length > 0) { - cbuff[0] = iter.first(); - } - for (int i=1; i<cbuff.length;++i) { - cbuff[i] = iter.next(); - } - label = new String(cbuff); - } - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection selection = new StringSelection(label); - clipboard.setContents(selection, selection); - } - } - }.start(); - } - private void report(GraphicsNodeEvent evt, String message) { GraphicsNode source = evt.getGraphicsNode(); String label = "(non-text node)"; 1.50 +95 -2 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.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- JGVTComponent.java 20 Feb 2005 21:59:10 -0000 1.49 +++ JGVTComponent.java 5 Mar 2005 19:31:09 -0000 1.50 @@ -25,7 +25,10 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; +import java.awt.Toolkit; import java.awt.Shape; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.InputEvent; @@ -37,6 +40,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.image.BufferedImage; +import java.text.CharacterIterator; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; @@ -46,6 +50,8 @@ import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.gvt.event.AWTEventDispatcher; +import org.apache.batik.gvt.event.SelectionAdapter; +import org.apache.batik.gvt.event.SelectionEvent; import org.apache.batik.gvt.renderer.ConcreteImageRendererFactory; import org.apache.batik.gvt.renderer.ImageRenderer; import org.apache.batik.gvt.renderer.ImageRendererFactory; @@ -174,6 +180,14 @@ protected boolean selectableText; /** + * Whether the JGVTComponent should adhere to 'Unix' text + * selection semantics where as soon as text is selected it + * is copied to the clipboard. If users want Mac/Windows + * behaviour they need to handle selections them selves. + */ + protected boolean useUnixTextSelection = true; + + /** * Whether to suspend interactions. */ protected boolean suspendInteractions; @@ -221,15 +235,42 @@ } + /** + * Turn off all 'interactor' objects (pan, zoom, etc) if + * 'b' is true, turn them on if 'b' is false. + */ public void setDisableInteractions(boolean b) { disableInteractions = b; } + /** + * Returns true if all 'interactor' objects + * (pan, zoom, etc) are disabled. + */ public boolean getDisableInteractions() { return disableInteractions; } /** + * If 'b' is true text selections will copied to + * the clipboard immediately. If 'b' is false + * then nothing will be done when selections are + * made (the application is responsable for copying + * the selection in response to user actions). + */ + public void setUseUnixTextSelection(boolean b) { + useUnixTextSelection = b; + } + + /** + * Returns true if the canvas will copy selections + * to the clipboard when they are completed. + */ + public void getUseUnixTextSelection(boolean b) { + useUnixTextSelection = b; + } + + /** * Returns the interactor list. */ public List getInteractors() { @@ -318,6 +359,8 @@ eventDispatcher = new AWTEventDispatcher(); if (selectableText) { textSelectionManager = createTextSelectionManager(); + textSelectionManager.addSelectionListener + (new UnixTextSelectionListener()); } } } @@ -336,7 +379,9 @@ //////////////////////////////////////////////////////////////////////// /** - * Returns the current Text selection manager for the Component. + * Returns the current Text selection manager for the Component. + * Users can register with this to be notifed of changes in + * the text selection. */ public TextSelectionManager getTextSelectionManager() { return textSelectionManager; @@ -1160,4 +1205,52 @@ } } } + + protected class UnixTextSelectionListener + extends SelectionAdapter { + + public void selectionDone(SelectionEvent evt) { + if (!useUnixTextSelection) return; + + Object o = evt.getSelection(); + if (!(o instanceof CharacterIterator)) + return; + CharacterIterator iter = (CharacterIterator) o; + + // first see if we can access the clipboard + SecurityManager securityManager; + securityManager = System.getSecurityManager(); + if (securityManager != null) { + try { + securityManager.checkSystemClipboardAccess(); + } catch (SecurityException e) { + return; // Can't access clipboard. + } + } + + int sz = iter.getEndIndex()-iter.getBeginIndex(); + if (sz == 0) return; + + char[] cbuff = new char[sz]; + cbuff[0] = iter.first(); + for (int i=1; i<cbuff.length;++i) { + cbuff[i] = iter.next(); + } + final String strSel = new String(cbuff); + // HACK: getSystemClipboard sometimes deadlocks on + // linux when called from the AWT Thread. The Thread + // creation prevents that. + new Thread() { + public void run() { + Clipboard cb; + cb = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection sel; + sel = new StringSelection(strSel); + cb.setContents(sel, sel); + } + }.start(); + } + } + + } 1.25 +15 -1 xml-batik/sources/org/apache/batik/swing/gvt/TextSelectionManager.java Index: TextSelectionManager.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/TextSelectionManager.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- TextSelectionManager.java 22 Feb 2005 09:13:03 -0000 1.24 +++ TextSelectionManager.java 5 Mar 2005 19:31:09 -0000 1.25 @@ -100,6 +100,11 @@ protected boolean xorMode = false; /** + * The current selection or null if there is none. + */ + Object selection = null; + + /** * Creates a new TextSelectionManager. */ public TextSelectionManager(JGVTComponent comp, @@ -190,6 +195,13 @@ } /** + * Returns the current text selection or null if there is none. + */ + public Object getSelection() { + return selection; + } + + /** * Sets the selected text */ public void setSelection(Mark start, Mark end) { @@ -265,6 +277,7 @@ protected class TextSelectionListener implements SelectionListener { public void selectionDone(SelectionEvent e) { selectionChanged(e); + selection = e.getSelection(); } public void selectionCleared(SelectionEvent e) { selectionStarted(e); @@ -275,6 +288,7 @@ selectionHighlight = null; component.repaint(r); } + selection = null; } public void selectionChanged(SelectionEvent e) { Rectangle r = null;
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]