WinWorkstation.st
changeset 3496 bc0065e67f3f
parent 3495 6b755cf873f2
child 3497 2d43fa327c07
--- a/WinWorkstation.st	Sat Sep 15 15:40:17 2001 +0200
+++ b/WinWorkstation.st	Sat Sep 15 16:02:16 2001 +0200
@@ -12625,12 +12625,13 @@
 %{
     HANDLE hClip;
     HANDLE hData;
-    OBJ s;
-    unsigned char *src, *p;
-    int n, len, realLen;
 
     /* check for format CF_TEXT */
     if (IsClipboardFormatAvailable(CF_TEXT)) {
+        OBJ s;
+        unsigned char *src, *p;
+        int n, len, realLen;
+
 	hClip = OpenClipboard(NULL);
 	if (hClip) {
 	    hData = GetClipboardData(CF_TEXT);
@@ -12667,6 +12668,48 @@
 	    RETURN(s);
 	}
     }
+
+    if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
+        OBJ s;
+        WIDECHAR *w_src, *w_p;
+        int n, len, realLen;
+
+	hClip = OpenClipboard(NULL);
+	if (hClip) {
+	    hData = GetClipboardData(CF_UNICODETEXT);
+	    w_src = GlobalLock(hData);
+	    len = w_src ? wstrlen(w_src) : 0;
+
+	    /* see how much we really need (when CRLF is replaced by LF) */
+	    for (realLen = 0, n=len, w_p=w_src; n; ) {
+		WIDECHAR w_ch;
+
+		w_ch = *w_p++; n--; realLen++;
+		if (w_ch == 0x0D) {
+		    if (n && (*w_p == 0x0A)) {
+			w_p++; n--;
+		    }
+		}
+	    }
+	    s = __MKBYTEARRAY(realLen * 2);
+	    for (n=0, w_p=__stringVal(s); len; ) {
+		WIDECHAR w_ch;
+
+		*w_p = w_ch = *w_src++;
+		len--;
+		if (len && (w_ch == 0x0D) && (*w_src == 0x0A)) {
+		    *w_p = 0x0A;
+		    w_src++;
+		    len--;
+		}
+		w_p++;
+	    }
+	    GlobalUnlock(hData);
+	    CloseClipboard();
+	    __qClass(s) = @global(UnicodeString);
+	    RETURN(s);
+	}
+    }
     RETURN(nil);
 %}
 !
@@ -13835,6 +13878,6 @@
 !WinWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.187 2001-09-15 13:40:17 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.188 2001-09-15 14:02:16 cg Exp $'
 ! !
 WinWorkstation initialize!