Revision: 27226
          http://sourceforge.net/p/bibdesk/svn/27226
Author:   hofman
Date:     2022-01-16 16:51:22 +0000 (Sun, 16 Jan 2022)
Log Message:
-----------
Always set the receiver specifier of the download command to the publication

Modified Paths:
--------------
    trunk/bibdesk/BDSKDownloadCommand.h
    trunk/bibdesk/BDSKDownloadCommand.m

Modified: trunk/bibdesk/BDSKDownloadCommand.h
===================================================================
--- trunk/bibdesk/BDSKDownloadCommand.h 2022-01-16 16:48:35 UTC (rev 27225)
+++ trunk/bibdesk/BDSKDownloadCommand.h 2022-01-16 16:51:22 UTC (rev 27226)
@@ -38,5 +38,8 @@
 
 #import <Cocoa/Cocoa.h>
 
-@interface BDSKDownloadCommand : NSScriptCommand
+@interface BDSKDownloadCommand : NSScriptCommand {
+    NSScriptObjectSpecifier *keySpecifier;
+}
+@property (nonatomic, readonly) NSScriptObjectSpecifier *keySpecifier;
 @end

Modified: trunk/bibdesk/BDSKDownloadCommand.m
===================================================================
--- trunk/bibdesk/BDSKDownloadCommand.m 2022-01-16 16:48:35 UTC (rev 27225)
+++ trunk/bibdesk/BDSKDownloadCommand.m 2022-01-16 16:51:22 UTC (rev 27226)
@@ -46,70 +46,94 @@
 
 @implementation BDSKDownloadCommand
 
+@synthesize keySpecifier;
+
+- (void)dealloc {
+    BDSKDESTROY(keySpecifier);
+    [super dealloc];
+}
+
+- (void)setReceiversSpecifier:(NSScriptObjectSpecifier *)receiversSpecifier {
+    if ([[receiversSpecifier key] isEqualToString:@""]) {
+        // this is an 'item i of linked files' specifier
+        // -indicesOfObjectsByEvaluatingWithContainer:count: does not work here
+        // transform to an index specifier for the element
+        if ([receiversSpecifier isKindOfClass:[NSIndexSpecifier class]] &&
+            [[receiversSpecifier containerSpecifier] 
isKindOfClass:[NSPropertySpecifier class]]) {
+            NSPropertySpecifier *spec = (NSPropertySpecifier 
*)[receiversSpecifier containerSpecifier];
+            receiversSpecifier = [[[NSIndexSpecifier alloc] 
initWithContainerClassDescription:[spec containerClassDescription] 
containerSpecifier:[spec containerSpecifier] key:[spec key] 
index:[(NSIndexSpecifier *)receiversSpecifier index]] autorelease];
+        } else {
+            [self setScriptErrorNumber:NSArgumentsWrongScriptError];
+            [self setScriptErrorString:@"Do not understand receiver 
specifier."];
+        }
+    }
+    if ([[[receiversSpecifier keyClassDescription] className] 
isEqualToString:@"publication"]) {
+        [super setReceiversSpecifier:receiversSpecifier];
+    } else {
+        [super setReceiversSpecifier:[receiversSpecifier containerSpecifier]];
+        keySpecifier = [receiversSpecifier retain];
+    }
+}
+
 - (id)performDefaultImplementation {
-    NSScriptObjectSpecifier *receiverSpec = [self receiversSpecifier];
-    NSString *receiverClass = [[receiverSpec keyClassDescription] className];
+    NSScriptObjectSpecifier *keySpec = [self keySpecifier];
+    NSString *keyClass = [[keySpec keyClassDescription] className];
     NSDictionary *params = [self evaluatedArguments];
     BOOL replace = [[params objectForKey:@"replace"] boolValue];
-    BibItem *pub = nil;
+    BibItem *pub = [self evaluatedReceivers];
     NSString *field = nil;
     NSInteger start = 0, end = 0;
     NSMutableIndexSet *indexes = nil;
     NSArray *linkedURLs = nil;
     
-    if ([receiverClass isEqualToString:@"publication"]) {
-        pub = [self evaluatedReceivers];
+    if (pub == nil) {
+        [self setScriptErrorNumber:NSRequiredArgumentsMissingScriptError];
+        [self setScriptErrorString:@"Could not find a publication for which to 
download."];
+        return nil;
+    }
+    if ([pub isKindOfClass:[BibItem class]] == NO) {
+        [self setScriptErrorNumber:NSArgumentsWrongScriptError];
+        [self setScriptErrorString:@"Receiver is not a publication."];
+        return nil;
+    }
+    
+    if (keySpec == nil) {
         if ([[NSUserDefaults standardUserDefaults] 
boolForKey:BDSKUseLocalUrlAndUrlKey])
             field = BDSKUrlString;
         else
             field = BDSKRemoteURLString;
-    } else if ([receiverClass isEqualToString:@"field"]) {
-        pub = [[receiverSpec containerSpecifier] objectsByEvaluatingSpecifier];
-        field = [[(NSNameSpecifier *)receiverSpec name] fieldName];
+    } else if ([keyClass isEqualToString:@"field"]) {
+        field = [[(NSNameSpecifier *)keySpec name] fieldName];
         if ([field isRemoteURLField] == NO) {
             [self setScriptErrorNumber:NSArgumentsWrongScriptError];
             [self setScriptErrorString:@"Field must be a remote URL field."];
             return nil;
         }
-    } else if ([receiverClass isEqualToString:@"linked URL"]) {
+    } else if ([keyClass isEqualToString:@"linked URL"]) {
         field = BDSKRemoteURLString;
-        if ([[receiverSpec key] isEqualToString:@""]) {
-            // this is an 'item i of linked URL' specifier
-            // -indicesOfObjectsByEvaluatingWithContainer:count: does not work 
here
-            if ([receiverSpec isKindOfClass:[NSIndexSpecifier class]] == NO ||
-                [[receiverSpec containerSpecifier] 
isKindOfClass:[NSPropertySpecifier class]] == NO) {
-                [self setScriptErrorNumber:NSArgumentsWrongScriptError];
-                [self setScriptErrorString:@"Do not understand linked URL 
specifier."];
-                return nil;
-            }
-            pub = [[[receiverSpec containerSpecifier] containerSpecifier] 
objectsByEvaluatingSpecifier];
-            end = start = [(NSIndexSpecifier *)receiverSpec index];
+        // NSPropertySpecifier, NSIndexSpecifier, NSRangeSpecifier, 
NSMiddleSpecifier, NSWhoseSpecifier
+        NSInteger i, count = -2;
+        NSInteger *indices = [keySpec 
indicesOfObjectsByEvaluatingWithContainer:pub count:&count];
+        if (count < -1) {
+            [self setScriptErrorNumber:NSArgumentsWrongScriptError];
+            [self setScriptErrorString:@"Do not understand linked URL 
specifier."];
+            return nil;
+        }
+        if (count == 0) {
+            return nil;
+        } else if (count == -1) {
+            start = 0;
+            end = -1;
         } else {
-            pub = [[receiverSpec containerSpecifier] 
objectsByEvaluatingSpecifier];
-            // NSPropertySpecifier, NSIndexSpecifier, NSRangeSpecifier, 
NSMiddleSpecifier, NSWhoseSpecifier
-            NSInteger i, count = -2;
-            NSInteger *indices = [receiverSpec 
indicesOfObjectsByEvaluatingWithContainer:pub count:&count];
-            if (count < -1) {
-                [self setScriptErrorNumber:NSArgumentsWrongScriptError];
-                [self setScriptErrorString:@"Do not understand linked URL 
specifier."];
-                return nil;
-            }
-            if (count == 0) {
-                return nil;
-            } else if (count == -1) {
-                start = 0;
-                end = -1;
-            } else {
-                end = start = indices[0];
-                for (i = 1; i < count; i++) {
-                    if (indices[i] = end + 1) {
-                        end++;
-                    } else {
-                        // not a single range, use an index set, start/end 
only holds the first range
-                        if (indexes == nil)
-                            indexes = [NSMutableIndexSet 
indexSetWithIndexesInRange:NSMakeRange(start, end + 1 - start)];
-                        [indexes addIndex:indices[i]];
-                    }
+            end = start = indices[0];
+            for (i = 1; i < count; i++) {
+                if (indices[i] = end + 1) {
+                    end++;
+                } else {
+                    // not a single range, use an index set, start/end only 
holds the first range
+                    if (indexes == nil)
+                        indexes = [NSMutableIndexSet 
indexSetWithIndexesInRange:NSMakeRange(start, end + 1 - start)];
+                    [indexes addIndex:indices[i]];
                 }
             }
         }
@@ -116,21 +140,10 @@
     } else {
         [self setScriptErrorNumber:NSArgumentsWrongScriptError];
         [self setScriptErrorString:@"Receiver should be a publication, field, 
or linked URL(s)."];
-        [self setScriptErrorOffendingObjectDescriptor:[receiverSpec 
descriptor]];
+        [self setScriptErrorOffendingObjectDescriptor:[keySpec descriptor]];
         return nil;
     }
     
-    if (pub == nil) {
-        [self setScriptErrorNumber:NSRequiredArgumentsMissingScriptError];
-        [self setScriptErrorString:@"Could not find a publication for which to 
download."];
-        return nil;
-    }
-    if ([pub isKindOfClass:[BibItem class]] == NO) {
-        [self setScriptErrorNumber:NSArgumentsWrongScriptError];
-        [self setScriptErrorString:@"Receiver is not a publication."];
-        return nil;
-    }
-    
     BibDocument *doc = (BibDocument *)[pub owner];
 
     if ([doc isDocument] == NO) {

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