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