Revision: 27276
          http://sourceforge.net/p/bibdesk/svn/27276
Author:   hofman
Date:     2022-03-07 15:45:42 +0000 (Mon, 07 Mar 2022)
Log Message:
-----------
Always promise archived pubs, but keep archived data instead of items for 
clipboard and when closing the document

Modified Paths:
--------------
    trunk/bibdesk/BDSKItemPasteboardHelper.m

Modified: trunk/bibdesk/BDSKItemPasteboardHelper.m
===================================================================
--- trunk/bibdesk/BDSKItemPasteboardHelper.m    2022-03-07 10:18:30 UTC (rev 
27275)
+++ trunk/bibdesk/BDSKItemPasteboardHelper.m    2022-03-07 15:45:42 UTC (rev 
27276)
@@ -49,9 +49,6 @@
 
 - (BOOL)pasteboardIsValid:(NSPasteboard *)pboard;
 - (NSMutableArray *)promisedTypesForPasteboard:(NSPasteboard *)pboard;
-- (BDSKDragCopyType)promisedDragCopyTypeForPasteboard:(NSPasteboard *)pboard;
-- (NSString *)promisedBibTeXStringForPasteboard:(NSPasteboard *)pboard;
-- (NSArray *)promisedCiteKeysForPasteboard:(NSPasteboard *)pboard;
 - (void)setPromisedTypes:(NSMutableArray *)types items:(NSArray *)items 
dragCopyType:(BDSKDragCopyType)dragCopyType forPasteboard:(NSPasteboard 
*)pboard;
 - (void)setChangeCountForPasteboard:(NSPasteboard *)pboard;
 - (BOOL)isProviderForPasteboard:(NSPasteboard *)pboard;
@@ -84,26 +81,27 @@
     if (delegate) {
         for (NSString *name in [promisedPboardTypes allKeys]) {
             NSPasteboard *pboard = [NSPasteboard pasteboardWithName:name];
+            if ([self pasteboardIsValid:pboard] == NO) {
+                [self clearPromisedTypesForPasteboard:pboard];
+                continue;
+            }
+            NSMutableDictionary *dict = [promisedPboardTypes 
objectForKey:name];
             if (pboard == nil) continue;
-            NSArray *items = [self promisedItemsForPasteboard:pboard];
+            NSArray *items = [[[dict objectForKey:@"items"] copy] autorelease];
             if (items == nil) continue;
-            if ([[self promisedTypesForPasteboard:pboard] 
containsObject:BDSKPasteboardTypePublications]) {
-                if ([self isProviderForPasteboard:pboard])
-                    [self pasteboard:pboard item:pasteboardItemForType(pboard, 
BDSKPasteboardTypePublications) 
provideDataForType:BDSKPasteboardTypePublications];
-                else
-                    [self removePromisedType:BDSKPasteboardTypePublications 
forPasteboard:pboard];
+            [dict removeObjectForKey:@"items"];
+            NSArray *types = [[[dict objectForKey:@"types"] copy] autorelease];
+            if ([types containsObject:BDSKPasteboardTypePublications]) {
+                [dict setObject:[BibItem archivedPublications:items] 
forKey:@"archivedData"];
             }
-            if ([[self promisedTypesForPasteboard:pboard] count]) {
+            if ([types containsObject:NSPasteboardTypePDF] || [types 
containsObject:NSPasteboardTypeRTF] || [types 
containsObject:NSPasteboardTypeString]) {
                 // the remaining type needs a texTask
                 // get intermediate data so we don't need the delegate and the 
items
                 NSString *bibString = nil;
-                if (items != nil)
-                    bibString = [delegate pasteboardHelper:self 
bibTeXStringForItems:items];
+                bibString = [delegate pasteboardHelper:self 
bibTeXStringForItems:items];
                 if (bibString != nil) {
-                    NSMutableDictionary *dict = [promisedPboardTypes 
objectForKey:[pboard name]];
                     [dict setObject:bibString forKey:@"bibTeXString"];
                     [dict setObject:[items valueForKey:@"citeKey"] 
forKey:@"citeKeys"];
-                    [dict removeObjectForKey:@"items"];
                 } else {
                     [self clearPromisedTypesForPasteboard:pboard];
                 }
@@ -117,12 +115,8 @@
 
 - (void)writeItems:(NSArray *)items textRepresentation:(id)text 
forDragCopyType:(BDSKDragCopyType)dragCopyType toPasteboard:(NSPasteboard 
*)pboard {
     
-    NSMutableArray *types = [NSMutableArray array];
-    BOOL shouldArchive = pboard == [NSPasteboard generalPasteboard];
+    NSMutableArray *types = [NSMutableArray 
arrayWithObjects:BDSKPasteboardTypePublications, nil];
     
-    if (shouldArchive == NO)
-        [types addObject:BDSKPasteboardTypePublications];
-    
     switch (dragCopyType) {
         case BDSKDragCopyPDF:
             [types addObject:NSPasteboardTypePDF];
@@ -142,10 +136,7 @@
     
     BDSKASSERT([promisedPboardTypes objectForKey:[pboard name]] == nil);
     
-    if ([types count])
-        [self setPromisedTypes:types items:items dragCopyType:dragCopyType 
forPasteboard:pboard];
-    else
-        [self removePromisedTypesForPasteboard:pboard];
+    [self setPromisedTypes:types items:items dragCopyType:dragCopyType 
forPasteboard:pboard];
     
     NSPasteboardItem *item = nil;
     BOOL needsWrite = NO;
@@ -160,14 +151,11 @@
     }
     if (text)
         [item setString:text forType:NSPasteboardTypeString];
-    if (shouldArchive)
-        [item setData:[BibItem archivedPublications:items] 
forType:BDSKPasteboardTypePublications];
-    if ([types count])
-        [item setDataProvider:self forTypes:types];
+    [item setDataProvider:self forTypes:types];
     if (needsWrite)
         [pboard writeObjects:[NSArray arrayWithObjects:item, nil]];
-    if ([types count])
-        [self setChangeCountForPasteboard:pboard];
+    // in case the write has changed the changeCount
+    [self setChangeCountForPasteboard:pboard];
 }
 
 #pragma mark NSPasteboardItemDataProvider protocol methods
@@ -184,11 +172,11 @@
     
     NSData *data = nil;
     NSString *string = nil;
-    NSArray *items = [self promisedItemsForPasteboard:pboard];
+    NSMutableDictionary *dict = [promisedPboardTypes objectForKey:[pboard 
name]];
+    NSArray *items = [dict objectForKey:@"items"];
     
     if ([type isEqualToString:BDSKPasteboardTypePublications]) {
-        if (items != nil)
-            data = [BibItem archivedPublications:items];
+        data = items ? [BibItem archivedPublications:items] : [dict 
objectForKey:@"archivedData"];
     } else {
         NSString *bibString = nil;
         NSArray *citeKeys = nil;
@@ -197,11 +185,11 @@
             bibString = [delegate pasteboardHelper:self 
bibTeXStringForItems:items];
             citeKeys = [items valueForKey:@"citeKey"];
         } else {
-            bibString = [self promisedBibTeXStringForPasteboard:pboard];
-            citeKeys = [self promisedCiteKeysForPasteboard:pboard];
+            bibString = [dict objectForKey:@"bibTeXString"];
+            citeKeys = [dict objectForKey:@"citeKeys"];
         }
         if (bibString != nil) {
-            BDSKDragCopyType dragCopyType = [self 
promisedDragCopyTypeForPasteboard:pboard];
+            BDSKDragCopyType dragCopyType = [[dict 
objectForKey:@"dragCopyType"] integerValue];
             BDSKGeneratedType generatedType;
             BDSKTeXTask *texTask = [[BDSKTeXTask alloc] 
initWithFileName:@"bibcopy" synchronous:YES];
             
@@ -259,6 +247,8 @@
         [item setString:string forType:type];
     } else if (data) {
         [item setData:data forType:type];
+        if ([type isEqualToString:BDSKPasteboardTypePublications])
+            [dict removeObjectForKey:@"archivedData"];
     } else {
         [item setData:[NSData data] forType:type];
         NSBeep();
@@ -278,8 +268,8 @@
 }
 
 - (void)clearPromisedTypesForPasteboard:(NSPasteboard *)pboard {
-    for (NSString *type in [[[self promisedTypesForPasteboard:pboard] copy] 
autorelease]) {
-        if ([self isProviderForPasteboard:pboard]) {
+    if ([self isProviderForPasteboard:pboard]) {
+        for (NSString *type in [[[self promisedTypesForPasteboard:pboard] 
copy] autorelease]) {
             @try {
                 // can raise NSPasteboardCommunicationException
                 [pasteboardItemForType(pboard, type) setData:[NSData data] 
forType:type];
@@ -331,29 +321,21 @@
        return [self pasteboardIsValid:pboard] ? [[promisedPboardTypes 
objectForKey:[pboard name]] objectForKey:@"types"] : nil;
 }
 
-- (BDSKDragCopyType)promisedDragCopyTypeForPasteboard:(NSPasteboard *)pboard {
-    return [self pasteboardIsValid:pboard] ? [[[promisedPboardTypes 
objectForKey:[pboard name]] objectForKey:@"dragCopyType"] integerValue] : -1;
-}
-
-- (NSString *)promisedBibTeXStringForPasteboard:(NSPasteboard *)pboard {
-       return [self pasteboardIsValid:pboard] ? [[promisedPboardTypes 
objectForKey:[pboard name]] objectForKey:@"bibTeXString"] : nil;
-}
-
-- (NSArray *)promisedCiteKeysForPasteboard:(NSPasteboard *)pboard {
-       return [self pasteboardIsValid:pboard] ? [[promisedPboardTypes 
objectForKey:[pboard name]] objectForKey:@"citeKeys"] : nil;
-}
-
 - (void)setPromisedTypes:(NSMutableArray *)types items:(NSArray *)items 
dragCopyType:(BDSKDragCopyType)dragCopyType forPasteboard:(NSPasteboard 
*)pboard {
     if ([self pasteboardIsValid:pboard]) {
         NSMutableDictionary *dict = [NSMutableDictionary 
dictionaryWithObjectsAndKeys:types, @"types", [NSNumber 
numberWithInteger:dragCopyType], @"dragCopyType", [NSNumber 
numberWithInteger:[pboard changeCount]], @"changeCount", nil];
-        if ([types containsObject:BDSKPasteboardTypePublications]) {
-            [dict setObject:items forKey:@"items"];
-        } else {
+        if (pboard == [NSPasteboard generalPasteboard]) {
+            // Save intermediate data for the clipboard, as the items may 
change before pasting
             NSString *bibString = [delegate pasteboardHelper:self 
bibTeXStringForItems:items];
             if (bibString != nil) {
                 [dict setObject:bibString forKey:@"bibTeXString"];
                 [dict setObject:[items valueForKey:@"citeKey"] 
forKey:@"citeKeys"];
             }
+            NSData *data = [BibItem archivedPublications:items];
+            if (data != nil)
+                [dict setObject:data forKey:@"archivedData"];
+        } else {
+            [dict setObject:items forKey:@"items"];
         }
         if (promisedPboardTypes == nil) {
             promisedPboardTypes = [[NSMutableDictionary alloc] 
initWithCapacity:2];

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to