提交 0ca485cd 编写于 作者: P pchelko

7124253: [macosx] Flavor change notification not coming

Reviewed-by: anthony, serb
上级 1899df4f
......@@ -25,8 +25,10 @@
package sun.lwawt.macosx;
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.IOException;
import java.io.NotSerializableException;
import java.util.*;
import sun.awt.datatransfer.*;
......@@ -65,12 +67,10 @@ public class CClipboard extends SunClipboard {
long[] formatArray = dataTransferer.getFormatsForTransferableAsArray(contents, flavorMap);
declareTypes(formatArray, this);
Map<Long, DataFlavor> formatMap = DataTransferer.getInstance().getFormatsForTransferable(contents, flavorMap);
for (Iterator<Long> iter = formatMap.keySet().iterator(); iter.hasNext(); ) {
Long lFormat = iter.next();
long format = lFormat.longValue();
DataFlavor flavor = formatMap.get(lFormat);
Map<Long, DataFlavor> formatMap = dataTransferer.getFormatsForTransferable(contents, flavorMap);
for (Map.Entry<Long, DataFlavor> entry : formatMap.entrySet()) {
long format = entry.getKey();
DataFlavor flavor = entry.getValue();
try {
byte[] bytes = DataTransferer.getInstance().translateTransferable(contents, flavor, format);
......@@ -80,17 +80,27 @@ public class CClipboard extends SunClipboard {
// javaJVMLocalObjectMimeType failed to serialize.
// May remove this if-check when 5078787 is fixed.
if (!(flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType) &&
e instanceof java.io.NotSerializableException)) {
e instanceof NotSerializableException)) {
e.printStackTrace();
}
}
}
notifyChanged();
}
private void lostSelectionOwnershipImpl() {
private void notifyLostOwnership() {
lostOwnershipImpl();
}
private static void notifyChanged() {
CClipboard clipboard = (CClipboard) Toolkit.getDefaultToolkit().getSystemClipboard();
if (!clipboard.areFlavorListenersRegistered()) {
return;
}
clipboard.checkChange(clipboard.getClipboardFormats());
}
protected native long[] getClipboardFormats();
protected native byte[] getClipboardData(long format) throws IOException;
......
......@@ -43,6 +43,4 @@
- (NSArray *) javaGetTypes;
- (NSData *) javaGetDataForType:(NSString *)inFormat;
- (void) pasteboardChangedOwner:(NSPasteboard *)sender;
@end
......@@ -91,7 +91,9 @@ static CClipboard *sClipboard = nil;
{
if (sClipboard == nil) {
sClipboard = [[CClipboard alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:sClipboard selector: @selector(checkPasteboard:) name: NSApplicationDidBecomeActiveNotification object: nil];
[[NSNotificationCenter defaultCenter] addObserver:sClipboard selector: @selector(checkPasteboard:)
name: NSApplicationDidBecomeActiveNotification
object: nil];
}
return sClipboard;
......@@ -110,8 +112,6 @@ static CClipboard *sClipboard = nil;
- (void) javaDeclareTypes:(NSArray *)inTypes withOwner:(jobject)inClipboard jniEnv:(JNIEnv *)inEnv {
//NSLog(@"CClipboard javaDeclareTypes %@ withOwner", inTypes);
@synchronized(self) {
if (inClipboard != NULL) {
if (fClipboardOwner != NULL) {
......@@ -126,8 +126,6 @@ static CClipboard *sClipboard = nil;
- (void) _nativeDeclareTypes:(NSArray *)inTypes {
AWT_ASSERT_APPKIT_THREAD;
//NSLog(@"CClipboard _nativeDeclareTypes %@ withOwner", inTypes);
fChangeCount = [[NSPasteboard generalPasteboard] declareTypes:inTypes owner:self];
}
......@@ -136,8 +134,6 @@ static CClipboard *sClipboard = nil;
NSMutableArray *args = [NSMutableArray arrayWithCapacity:1];
[ThreadUtilities performOnMainThread:@selector(_nativeGetTypes:) on:self withObject:args waitUntilDone:YES];
//NSLog(@"CClipboard getTypes returns %@", [args lastObject]);
return [args lastObject];
}
......@@ -145,8 +141,6 @@ static CClipboard *sClipboard = nil;
AWT_ASSERT_APPKIT_THREAD;
[args addObject:[[NSPasteboard generalPasteboard] types]];
//NSLog(@"CClipboard getTypes returns %@", [args lastObject]);
}
- (void) javaSetData:(NSData *)inData forType:(NSString *) inFormat {
......@@ -154,25 +148,18 @@ static CClipboard *sClipboard = nil;
CClipboardUpdate *newUpdate = [[CClipboardUpdate alloc] initWithData:inData withFormat:inFormat];
[ThreadUtilities performOnMainThread:@selector(_nativeSetData:) on:self withObject:newUpdate waitUntilDone:YES];
[newUpdate release];
//NSLog(@"CClipboard javaSetData forType %@", inFormat);
}
- (void) _nativeSetData:(CClipboardUpdate *)newUpdate {
AWT_ASSERT_APPKIT_THREAD;
[[NSPasteboard generalPasteboard] setData:[newUpdate data] forType:[newUpdate format]];
//NSLog(@"CClipboard _nativeSetData setData %@", [newUpdate data]);
//NSLog(@"CClipboard _nativeSetData forType %@", [newUpdate format]);
}
- (NSData *) javaGetDataForType:(NSString *) inFormat {
NSMutableArray *args = [NSMutableArray arrayWithObject:inFormat];
[ThreadUtilities performOnMainThread:@selector(_nativeGetDataForType:) on:self withObject:args waitUntilDone:YES];
//NSLog(@"CClipboard javaGetDataForType %@ returns an NSData", inFormat);
return [args lastObject];
}
......@@ -183,15 +170,11 @@ static CClipboard *sClipboard = nil;
if (returnValue) [args replaceObjectAtIndex:0 withObject:returnValue];
else [args removeLastObject];
//NSLog(@"CClipboard _nativeGetDataForType");
}
- (void) checkPasteboard:(id)application {
AWT_ASSERT_APPKIT_THREAD;
//NSLog(@"CClipboard checkPasteboard oldCount %d newCount %d newTypes %@", fChangeCount, [[NSPasteboard generalPasteboard] changeCount], [[NSPasteboard generalPasteboard] types]);
// This is called via NSApplicationDidBecomeActiveNotification.
// If the change count on the general pasteboard is different than when we set it
......@@ -199,27 +182,23 @@ static CClipboard *sClipboard = nil;
NSInteger newChangeCount = [[NSPasteboard generalPasteboard] changeCount];
if (fChangeCount != newChangeCount) {
fChangeCount = newChangeCount;
[self pasteboardChangedOwner:[NSPasteboard generalPasteboard]];
}
}
- (void)pasteboardChangedOwner:(NSPasteboard *)sender; {
AWT_ASSERT_APPKIT_THREAD;
static JNF_CLASS_CACHE(jc_CClipboard, "sun/lwawt/macosx/CClipboard");
static JNF_MEMBER_CACHE(jm_lostOwnership, jc_CClipboard, "lostSelectionOwnershipImpl", "()V");
//NSLog(@"CClipboard pasteboardChangedOwner");
// If we have a Java pasteboard owner, tell it that it doesn't own the pasteboard anymore.
@synchronized(self) {
if (fClipboardOwner) {
JNIEnv *env = [ThreadUtilities getJNIEnv];
JNFCallVoidMethod(env, fClipboardOwner, jm_lostOwnership); // AWT_THREADING Safe (event)
JNFDeleteGlobalRef(env, fClipboardOwner);
fClipboardOwner = NULL;
fChangeCount = newChangeCount;
// Notify that the content might be changed
static JNF_CLASS_CACHE(jc_CClipboard, "sun/lwawt/macosx/CClipboard");
static JNF_STATIC_MEMBER_CACHE(jm_contentChanged, jc_CClipboard, "notifyChanged", "()V");
JNIEnv *env = [ThreadUtilities getJNIEnv];
JNFCallStaticVoidMethod(env, jm_contentChanged);
// If we have a Java pasteboard owner, tell it that it doesn't own the pasteboard anymore.
static JNF_MEMBER_CACHE(jm_lostOwnership, jc_CClipboard, "notifyLostOwnership", "()V");
@synchronized(self) {
if (fClipboardOwner) {
JNIEnv *env = [ThreadUtilities getJNIEnv];
JNFCallVoidMethod(env, fClipboardOwner, jm_lostOwnership); // AWT_THREADING Safe (event)
JNFDeleteGlobalRef(env, fClipboardOwner);
fClipboardOwner = NULL;
}
}
}
}
......@@ -265,9 +244,6 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CClipboard_setData
}
JNF_COCOA_ENTER(env);
//NSLog(@"Java_sun_lwawt_macosx_CClipboard_setData");
jint nBytes = (*env)->GetArrayLength(env, inBytes);
jbyte *rawBytes = (*env)->GetPrimitiveArrayCritical(env, inBytes, NULL);
NSData *bytesAsData = [NSData dataWithBytes:rawBytes length:nBytes];
......@@ -288,8 +264,6 @@ JNIEXPORT jlongArray JNICALL Java_sun_lwawt_macosx_CClipboard_getClipboardFormat
jlongArray returnValue = NULL;
JNF_COCOA_ENTER(env);
//NSLog(@"Java_sun_lwawt_macosx_CClipboard_getClipboardFormats");
NSArray *dataTypes = [[CClipboard sharedClipboard] javaGetTypes];
NSUInteger nFormats = [dataTypes count];
NSUInteger knownFormats = 0;
......@@ -346,8 +320,6 @@ JNIEXPORT jbyteArray JNICALL Java_sun_lwawt_macosx_CClipboard_getClipboardData
// a byte array back to Java. CDataTransferer will do that if necessary.
JNF_COCOA_ENTER(env);
//NSLog(@"Java_sun_lwawt_macosx_CClipboard_getClipboardData");
NSString *formatAsString = formatForIndex(format);
NSData *clipData = [[CClipboard sharedClipboard] javaGetDataForType:formatAsString];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册