[Webfunds-commits] java/webfunds/utils ClipboardHelper.java
    Jeroen C. van Gelderen 
    gelderen@cypherpunks.ai
    Wed, 14 Mar 2001 13:44:32 -0400 (AST)
    
    
  
gelderen    01/03/14 13:44:32
  Added:       webfunds/utils ClipboardHelper.java
  Log:
  Initial version.
Revision  Changes    Path
1.1                  java/webfunds/utils/ClipboardHelper.java
Index: ClipboardHelper.java
===================================================================
/* $Id: ClipboardHelper.java,v 1.1 2001/03/14 17:44:32 gelderen Exp $
 *
 * Copyright (c) Systemics Inc. 2001 on behalf of
 * the WebFunds Development Team.  All Rights Reserved.
 */
package webfunds.utils;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
/**
 * Helper class for Java Clipboard related functionality. 
 *
 * The Java clipboard implementation always expects LF line endings and
 * blindly adds extra CRs on Windows, even when the text already has CR/LF
 * line endings. This class helps convert text in a platform encoding to
 * text with UNIX line endings so that the Clipboard can then reconvert to
 * platform line endings. Thanks Sun!
 *
 * @version $Revision: 1.1 $
 * @author  Jeroen C. van Gelderen (gelderen@systemics.com)
 */
public final class ClipboardHelper {
    private static final Clipboard clip;
    /**
     * char[] containing the platform-specific sequence of line ending
     * characters. This is not final in order for the tests to work.
     */
    private static char[] NEWLINECHARS =
        System.getProperty("line.separator").toCharArray();
    static {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        clip = toolkit.getSystemClipboard();
    }
    /**
     * Put the given text (which must have platform line endings!) on the
     * clipboard.
     */
    public static void setClipboardText(String text) {
        String unixText = toUnixText(text);
        StringSelection sel = new StringSelection(unixText);
        clip.setContents(sel, null);
    }
    /**
     * Convert the given text from platform line endings to UNIX line endings.
     *
     * Currently only CR, LF and CR/LF are handled correctly and mixed line
     * endings are not detected.
     */
    public static String toUnixText(String text) {
        StringBuffer buf = new StringBuffer( text.length() );
        boolean lineFeedPending = false;
        for(int i=0; i < text.length(); i++) {
            char c = text.charAt(i);
            if( lineFeedPending && (c != '\n') )
                buf.append('\n');
            lineFeedPending = (c == '\r');
            if( !lineFeedPending )
                buf.append(c);
        }
        if( lineFeedPending )
            buf.append('\n');
        return buf.toString();
    }
// Test
//............................................................................
    public static void main(String[] argv) {
        NEWLINECHARS = "\n".toCharArray();
        String unixText = makeText("\n");
        if( !unixText.equals( toUnixText(unixText) ) )
            throw new RuntimeException("unixText != unixText");
        NEWLINECHARS = "\r\n".toCharArray();
        String dosText = makeText("\r\n");
        if( !unixText.equals( toUnixText(dosText) ) )
            throw new RuntimeException("unixText != dosText");
        NEWLINECHARS = "\r".toCharArray();
        String macText = makeText("\r");
        if( !unixText.equals( toUnixText(macText) ) )
            throw new RuntimeException("unixText != macText");
        /*
XXX: we need a scanner in order to handle this correctly
        NEWLINECHARS = "\r\r".toCharArray();
        String weirdText = makeText("\r\r");
        if( !unixText.equals( toUnixText(weirdText) ) )
            throw new RuntimeException("unixText != weirdText");
        */
        System.out.println("Test completed successfully!");
        System.exit(0);
    }
    private static String makeText(String lineFeed) {
        return lineFeed +
               "line1" + lineFeed +
               "line2" + lineFeed +
               lineFeed +
               "line3" + lineFeed + lineFeed;
    }
}