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