Revision: 29248 http://sourceforge.net/p/bibdesk/svn/29248 Author: hofman Date: 2025-04-30 16:30:40 +0000 (Wed, 30 Apr 2025) Log Message: ----------- Support authentication for SRU groups
Modified Paths: -------------- trunk/bibdesk/BDSKSRUGroupServer.h trunk/bibdesk/BDSKSRUGroupServer.m trunk/bibdesk/BDSKSearchGroup.m trunk/bibdesk/BDSKSearchGroupSheetController.h trunk/bibdesk/BDSKSearchGroupSheetController.m trunk/bibdesk/BDSKServerInfo.m trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib Modified: trunk/bibdesk/BDSKSRUGroupServer.h =================================================================== --- trunk/bibdesk/BDSKSRUGroupServer.h 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/BDSKSRUGroupServer.h 2025-04-30 16:30:40 UTC (rev 29248) @@ -56,6 +56,8 @@ NSInteger requestedResults; NSInteger downloadState; NSString *errorMessage; + NSString *user; + NSString *password; } @property (class, nonatomic, readonly) NSArray *supportedRecordSyntaxes; Modified: trunk/bibdesk/BDSKSRUGroupServer.m =================================================================== --- trunk/bibdesk/BDSKSRUGroupServer.m 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/BDSKSRUGroupServer.m 2025-04-30 16:30:40 UTC (rev 29248) @@ -145,11 +145,22 @@ } - (void)startDownloadForRange:(NSRange)range { + if (needsReset) { + NSString *aUser = nil; + NSString *aPassword = nil; + [[self serverInfo] getUsername:&aUser password:&aPassword]; + user = aUser; + password = aPassword; + } NSString *query = [self searchQueryWithRange:range]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[self serverURL]]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-type"]; [request setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]]; + if (user && password) { + NSString *authString = [[[NSString stringWithFormat:@"%@:%@", user, password] dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; + [request setValue:[NSString stringWithFormat:@"Basic %@", authString] forHTTPHeaderField:@"Authorization"]; + } [download cancel]; download = [[BDSKDownloader sharedDownloader] startDataDownloadWithRequest:request delegate:self]; } Modified: trunk/bibdesk/BDSKSearchGroup.m =================================================================== --- trunk/bibdesk/BDSKSearchGroup.m 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/BDSKSearchGroup.m 2025-04-30 16:30:40 UTC (rev 29248) @@ -55,10 +55,10 @@ #import "NSFileManager_BDSKExtensions.h" NSString *BDSKSearchGroupEntrez = @"entrez"; +NSString *BDSKSearchGroupZoom = @"zoom"; NSString *BDSKSearchGroupSRU = @"sru"; -NSString *BDSKSearchGroupZoom = @"zoom"; +NSString *BDSKSearchGroupDBLP = @"dblp"; NSString *BDSKSearchGroupISI = @"isi"; -NSString *BDSKSearchGroupDBLP = @"dblp"; NSString *BDSKSearchGroupURLScheme = @"x-bdsk-search"; @@ -419,15 +419,10 @@ [dictionary setValue:aName ?: aDatabase forKey:@"name"]; [dictionary setValue:aDatabase forKey:@"database"]; [dictionary setValue:aSearchTerm forKey:@"search term"]; - if ([aType isEqualToString:BDSKSearchGroupZoom]) { + if ([aType isEqualToString:BDSKSearchGroupZoom] || [aType isEqualToString:BDSKSearchGroupSRU]) { [dictionary setValue:aHost forKey:@"host"]; [dictionary setValue:aPort forKey:@"port"]; [dictionary setValue:options forKey:@"options"]; - } else if ([aType isEqualToString:BDSKSearchGroupSRU]) { - [dictionary setValue:aHost forKey:@"host"]; - [dictionary setValue:aPort forKey:@"port"]; - if ([options count] > 0) - [dictionary setValue:options forKey:@"options"]; } else if ([aType isEqualToString:BDSKSearchGroupISI] && [options count] > 0) { [dictionary setValue:options forKey:@"options"]; } @@ -442,12 +437,12 @@ serverClass = [BDSKEntrezGroupServer class]; else if ([aType isEqualToString:BDSKSearchGroupZoom]) serverClass = [BDSKZoomGroupServer class]; + else if ([aType isEqualToString:BDSKSearchGroupSRU]) + serverClass = [BDSKSRUGroupServer class]; + else if ([aType isEqualToString:BDSKSearchGroupDBLP]) + serverClass = [BDSKDBLPGroupServer class]; else if ([aType isEqualToString:BDSKSearchGroupISI]) serverClass = [BDSKISIGroupServer class]; - else if ([aType isEqualToString:BDSKSearchGroupDBLP]) - serverClass = [BDSKDBLPGroupServer class]; - else if ([aType isEqualToString:BDSKSearchGroupSRU]) - serverClass = [BDSKSRUGroupServer class]; else BDSKASSERT_NOT_REACHED("unknown search group type"); return [[serverClass alloc] initWithGroup:group serverInfo:info]; Modified: trunk/bibdesk/BDSKSearchGroupSheetController.h =================================================================== --- trunk/bibdesk/BDSKSearchGroupSheetController.h 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/BDSKSearchGroupSheetController.h 2025-04-30 16:30:40 UTC (rev 29248) @@ -113,10 +113,10 @@ @property (nonatomic, getter=isEditable) BOOL editable; @property (nonatomic, getter=isResettable) BOOL resettable; @property (nonatomic, readonly, getter=isZoom) BOOL zoom; +@property (nonatomic, readonly, getter=isSRU) BOOL SRU; @property (nonatomic, readonly, getter=isISI) BOOL ISI; -@property (nonatomic, readonly, getter=isSRU) BOOL SRU; -@property (nonatomic, readonly, getter=isZoomOrISI) BOOL zoomOrISI; @property (nonatomic, readonly, getter=isZoomOrSRU) BOOL zoomOrSRU; +@property (nonatomic, readonly, getter=isZoomOrISI) BOOL zoomOrSRUOrISI; @property (nonatomic, strong) NSString *type; Modified: trunk/bibdesk/BDSKSearchGroupSheetController.m =================================================================== --- trunk/bibdesk/BDSKSearchGroupSheetController.m 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/BDSKSearchGroupSheetController.m 2025-04-30 16:30:40 UTC (rev 29248) @@ -55,13 +55,13 @@ @implementation BDSKSearchGroupSheetController @synthesize serverPopup, nameField, addressField, portField, databaseField, passwordField, userField, syntaxPopup, encodingComboBox, removeDiacriticsButton, liteButton, editButton, addRemoveButton, serverView, revealButton, okButton, cancelButton, bottomConstraint, objectController, custom, editable, resettable; -@dynamic zoom, ISI, SRU, zoomOrISI, zoomOrSRU, typeTag, databases, serverInfo, undoManager; +@dynamic zoom, SRU, ISI, zoomOrSRU, zoomOrSRUOrISI, typeTag, databases, serverInfo, undoManager; + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; if ([@"type" isEqualToString:key]) keyPaths = [keyPaths setByAddingObject:@"serverInfo"]; - else if ([[NSSet setWithObjects:@"typeTag", @"zoom", @"ISI", @"SRU", @"zoomOrISI", @"zoomOrSRU", @"databases", nil] containsObject:key]) + else if ([[NSSet setWithObjects:@"typeTag", @"zoom", @"SRU", @"ISI", @"zoomOrSRU", @"zoomOrSRUOrISI", @"databases", nil] containsObject:key]) keyPaths = [keyPaths setByAddingObject:@"type"]; return keyPaths; } @@ -338,14 +338,14 @@ - (BOOL)isZoom { return [serverInfo isZoom]; } -- (BOOL)isISI { return [serverInfo isISI]; } - - (BOOL)isSRU { return [serverInfo isSRU]; } -- (BOOL)isZoomOrISI { return [serverInfo isZoom] || [serverInfo isISI]; } +- (BOOL)isISI { return [serverInfo isISI]; } - (BOOL)isZoomOrSRU { return [serverInfo isZoom] || [serverInfo isSRU]; } +- (BOOL)isZoomOrSRUOrISI { return [serverInfo isZoom] || [serverInfo isSRU] || [serverInfo isISI]; } + - (BDSKServerInfo *)serverInfo { return serverInfo; } - (void)setServerInfo:(BDSKServerInfo *)info; Modified: trunk/bibdesk/BDSKServerInfo.m =================================================================== --- trunk/bibdesk/BDSKServerInfo.m 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/BDSKServerInfo.m 2025-04-30 16:30:40 UTC (rev 29248) @@ -88,15 +88,14 @@ + (instancetype)defaultServerInfoWithType:(NSString *)aType; { - BOOL isZoom = [aType isEqualToString:BDSKSearchGroupZoom]; - BOOL isSRU = [aType isEqualToString:BDSKSearchGroupSRU]; + BOOL isZoomOrSRU = [aType isEqualToString:BDSKSearchGroupZoom] || [aType isEqualToString:BDSKSearchGroupSRU]; return [[[self class] alloc] initWithType:aType name:DEFAULT_NAME database:DEFAULT_DATABASE - host:isZoom || isSRU ? DEFAULT_HOST : nil - port:isZoom || isSRU ? DEFAULT_PORT : nil - options:isZoom ? @{} : nil]; + host:isZoomOrSRU ? DEFAULT_HOST : nil + port:isZoomOrSRU ? DEFAULT_PORT : nil + options:isZoomOrSRU ? @{} : nil]; } - (instancetype)initWithType:(NSString *)aType name:(NSString *)aName database:(NSString *)aDbase host:(NSString *)aHost port:(NSString *)aPort options:(NSDictionary *)opts; @@ -115,16 +114,12 @@ password = [[opts objectForKey:PASSWORD_KEY] copy]; options = [opts count] > 0 ? [opts mutableCopy] : nil; [options removeObjectForKey:PASSWORD_KEY]; - } else if ([self isZoom]) { + } else if ([self isZoom] || [self isSRU]) { host = [aHost copy]; port = [aPort copy]; password = [[opts objectForKey:PASSWORD_KEY] copy]; options = [opts mutableCopy]; [options removeObjectForKey:PASSWORD_KEY]; - } else if ([self isSRU]) { - host = [aHost copy]; - port = [aPort copy]; - options = [opts count] > 0 ? [opts mutableCopy] : nil; } else { self = nil; } @@ -250,7 +245,7 @@ - (BOOL)isLite { return [[options objectForKey:LITE_KEY] boolValue]; } - (NSDictionary *)options { - return ([self isZoom] || [options count] > 0) ? [options copy] : nil; + return ([self isZoom] || [self isSRU] || [options count] > 0) ? [options copy] : nil; } - (BOOL)isEntrez { return [[self type] isEqualToString:BDSKSearchGroupEntrez]; } @@ -264,18 +259,18 @@ return BDSKServerTypeEntrez; if ([self isZoom]) return BDSKServerTypeZoom; + if ([self isSRU]) + return BDSKServerTypeSRU; + if ([self isDBLP]) + return BDSKServerTypeDBLP; if ([self isISI]) return BDSKServerTypeISI; - if ([self isDBLP]) - return BDSKServerTypeDBLP; - if ([self isSRU]) - return BDSKServerTypeSRU; BDSKASSERT_NOT_REACHED("Unknown search type"); return BDSKServerTypeEntrez; } - (BOOL)getUsername:(NSString **)outUsername password:(NSString **)outPassword { - if ([self isZoom] == NO && [self isISI] == NO) + if ([self isZoom] == NO && [self isSRU] == NO && [self isISI] == NO) return NO; NSString *user = [self username]; if (user == nil) @@ -303,7 +298,7 @@ } - (void)savePasswordInKeychain { - if ([self isZoom] == NO && [self isISI] == NO) + if ([self isZoom] == NO && [self isSRU] == NO && [self isISI] == NO) return; // don't get the password from the keychain [passwordLock lockForReading]; @@ -412,7 +407,7 @@ - (void)setType:(NSString *)newType { if ([type isEqualToString:newType] == NO) { type = newType; - if ([self isZoom]) { + if ([self isZoom] || [self isSRU]) { if (host == nil) [self setHost:DEFAULT_HOST]; if (port == nil) @@ -419,11 +414,6 @@ [self setPort:DEFAULT_PORT]; password = nil; options = [[NSMutableDictionary alloc] init]; - } else if ([self isSRU]) { - if (host == nil) - [self setHost:DEFAULT_HOST]; - if (port == nil) - [self setPort:DEFAULT_PORT]; } else { password = nil; options = nil; Modified: trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib =================================================================== --- trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib 2025-04-30 15:31:47 UTC (rev 29247) +++ trunk/bibdesk/Base.lproj/BDSKSearchGroupSheet.xib 2025-04-30 16:30:40 UTC (rev 29248) @@ -162,15 +162,8 @@ <connections> <accessibilityConnection property="title" destination="200" id="527"/> <binding destination="-2" name="enabled" keyPath="editable" id="463"/> - <binding destination="569" name="value" keyPath="selection.password" id="582"> + <binding destination="-2" name="enabled2" keyPath="zoomOrSRUOrISI" previousBinding="463" id="kfd-LC-U9b"> <dictionary key="options"> - <integer key="NSConditionallySetsEditable" value="0"/> - <string key="NSNullPlaceholder">Password</string> - <integer key="NSValidatesImmediately" value="1"/> - </dictionary> - </binding> - <binding destination="-2" name="enabled2" keyPath="zoomOrISI" previousBinding="463" id="983"> - <dictionary key="options"> <integer key="NSMultipleValuesPlaceholder" value="-1"/> <integer key="NSNoSelectionPlaceholder" value="-1"/> <integer key="NSNotApplicablePlaceholder" value="-1"/> @@ -177,11 +170,18 @@ <integer key="NSNullPlaceholder" value="-1"/> </dictionary> </binding> - <binding destination="-2" name="hidden" keyPath="zoomOrISI" previousBinding="983" id="984"> + <binding destination="-2" name="hidden" keyPath="zoomOrSRUOrISI" previousBinding="kfd-LC-U9b" id="S0U-3a-9WO"> <dictionary key="options"> <string key="NSValueTransformerName">NSNegateBoolean</string> </dictionary> </binding> + <binding destination="569" name="value" keyPath="selection.password" id="582"> + <dictionary key="options"> + <integer key="NSConditionallySetsEditable" value="0"/> + <string key="NSNullPlaceholder">Password</string> + <integer key="NSValidatesImmediately" value="1"/> + </dictionary> + </binding> <outlet property="nextKeyView" destination="250" id="268"/> </connections> </textField> @@ -193,7 +193,7 @@ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> </textFieldCell> <connections> - <binding destination="-2" name="hidden" keyPath="zoomOrISI" id="971"> + <binding destination="-2" name="hidden" keyPath="zoomOrSRUOrISI" id="3Ei-Eq-Hn3"> <dictionary key="options"> <string key="NSValueTransformerName">NSNegateBoolean</string> </dictionary> @@ -240,15 +240,8 @@ <connections> <accessibilityConnection property="title" destination="195" id="526"/> <binding destination="-2" name="enabled" keyPath="editable" id="461"/> - <binding destination="569" name="value" keyPath="selection.username" id="580"> + <binding destination="-2" name="enabled2" keyPath="zoomOrSRUOrISI" previousBinding="461" id="Jeq-bz-OJp"> <dictionary key="options"> - <integer key="NSConditionallySetsEditable" value="0"/> - <string key="NSNullPlaceholder">User Name</string> - <integer key="NSValidatesImmediately" value="1"/> - </dictionary> - </binding> - <binding destination="-2" name="enabled2" keyPath="zoomOrISI" previousBinding="461" id="981"> - <dictionary key="options"> <integer key="NSMultipleValuesPlaceholder" value="-1"/> <integer key="NSNoSelectionPlaceholder" value="-1"/> <integer key="NSNotApplicablePlaceholder" value="-1"/> @@ -255,11 +248,18 @@ <integer key="NSNullPlaceholder" value="-1"/> </dictionary> </binding> - <binding destination="-2" name="hidden" keyPath="zoomOrISI" previousBinding="981" id="982"> + <binding destination="-2" name="hidden" keyPath="zoomOrSRUOrISI" previousBinding="Jeq-bz-OJp" id="5qM-9P-0IQ"> <dictionary key="options"> <string key="NSValueTransformerName">NSNegateBoolean</string> </dictionary> </binding> + <binding destination="569" name="value" keyPath="selection.username" id="580"> + <dictionary key="options"> + <integer key="NSConditionallySetsEditable" value="0"/> + <string key="NSNullPlaceholder">User Name</string> + <integer key="NSValidatesImmediately" value="1"/> + </dictionary> + </binding> <outlet property="nextKeyView" destination="197" id="203"/> </connections> </textField> @@ -344,7 +344,7 @@ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> </textFieldCell> <connections> - <binding destination="-2" name="hidden" keyPath="zoomOrISI" id="972"> + <binding destination="-2" name="hidden" keyPath="zoomOrSRUOrISI" id="9qR-dP-YL2"> <dictionary key="options"> <string key="NSValueTransformerName">NSNegateBoolean</string> </dictionary> @@ -646,8 +646,8 @@ </connections> </comboBox> <button toolTip="Use https" translatesAutoresizingMaskIntoConstraints="NO" id="nTD-tF-zzg"> - <rect key="frame" x="96" y="67" width="58" height="16"/> - <buttonCell key="cell" type="check" title="Secure" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" state="on" inset="2" id="8yH-PP-g6U"> + <rect key="frame" x="96" y="17" width="58" height="16"/> + <buttonCell key="cell" type="check" title="Secure" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" inset="2" id="8yH-PP-g6U"> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <font key="font" metaFont="message" size="11"/> </buttonCell> @@ -660,12 +660,12 @@ <integer key="NSNullPlaceholder" value="-1"/> </dictionary> </binding> - <binding destination="-2" name="enabled" keyPath="editable" id="7lm-7C-ADf"/> <binding destination="-2" name="hidden" keyPath="SRU" previousBinding="Fuf-uY-G8r" id="Mz7-eb-7dl"> <dictionary key="options"> <string key="NSValueTransformerName">NSNegateBoolean</string> </dictionary> </binding> + <binding destination="-2" name="enabled" keyPath="editable" id="7lm-7C-ADf"/> <binding destination="569" name="value" keyPath="selection.secure" id="Woe-P1-njP"/> </connections> </button> @@ -683,7 +683,6 @@ <constraint firstItem="250" firstAttribute="firstBaseline" secondItem="296" secondAttribute="firstBaseline" id="2qw-YB-6Ae"/> <constraint firstItem="194" firstAttribute="leading" secondItem="3BL-J9-tal" secondAttribute="leading" id="3BB-IE-AFV"/> <constraint firstItem="250" firstAttribute="top" secondItem="316" secondAttribute="bottom" constant="8" symbolic="YES" id="3on-5G-TpL"/> - <constraint firstItem="nTD-tF-zzg" firstAttribute="leading" secondItem="3BL-J9-tal" secondAttribute="leading" id="3qP-Bm-ARu"/> <constraint firstAttribute="bottom" secondItem="260" secondAttribute="bottom" constant="8" id="3z6-1F-2WX"/> <constraint firstItem="201" firstAttribute="top" secondItem="194" secondAttribute="bottom" constant="8" symbolic="YES" id="4Zv-6g-ZoO"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="985" secondAttribute="trailing" constant="20" symbolic="YES" id="4l5-LZ-0F0"/> @@ -694,11 +693,11 @@ <constraint firstItem="275" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="189" secondAttribute="leading" constant="32" id="8lq-5S-qhX"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="247" secondAttribute="trailing" constant="20" symbolic="YES" id="8xy-y2-7Ym"/> <constraint firstItem="258" firstAttribute="top" secondItem="250" secondAttribute="bottom" constant="8" symbolic="YES" id="9ip-xN-yVd"/> - <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nTD-tF-zzg" secondAttribute="trailing" constant="20" symbolic="YES" id="9xE-Gs-7Kh"/> <constraint firstItem="316" firstAttribute="leading" secondItem="189" secondAttribute="leading" constant="12" id="Aq1-KC-EzH"/> <constraint firstItem="201" firstAttribute="leading" secondItem="3BL-J9-tal" secondAttribute="leading" id="BId-hK-GcU"/> <constraint firstAttribute="trailing" secondItem="260" secondAttribute="trailing" constant="12" id="BVi-Ww-Jq8"/> <constraint firstItem="305" firstAttribute="firstBaseline" secondItem="304" secondAttribute="firstBaseline" id="BZM-at-pYv"/> + <constraint firstItem="nTD-tF-zzg" firstAttribute="leading" secondItem="303" secondAttribute="leading" id="Bpd-PV-MnA"/> <constraint firstItem="192" firstAttribute="leading" secondItem="190" secondAttribute="trailing" constant="8" symbolic="YES" id="DyR-Qs-7KC"/> <constraint firstItem="190" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="189" secondAttribute="leading" constant="32" id="E0u-Kl-X2F"/> <constraint firstItem="uYk-gJ-82e" firstAttribute="firstBaseline" secondItem="199" secondAttribute="firstBaseline" id="Eb0-nK-vjH"/> @@ -710,6 +709,7 @@ <constraint firstItem="303" firstAttribute="leading" secondItem="304" secondAttribute="trailing" constant="8" symbolic="YES" id="IDj-VH-hv1"/> <constraint firstItem="247" firstAttribute="width" secondItem="250" secondAttribute="width" id="Ivv-WU-XAN"/> <constraint firstItem="316" firstAttribute="top" secondItem="189" secondAttribute="top" constant="4" id="JQx-Np-uyM"/> + <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nTD-tF-zzg" secondAttribute="trailing" constant="20" symbolic="YES" id="JZL-9S-O07"/> <constraint firstItem="194" firstAttribute="top" secondItem="uYk-gJ-82e" secondAttribute="bottom" constant="8" symbolic="YES" id="Lqq-gp-DLz"/> <constraint firstItem="192" firstAttribute="firstBaseline" secondItem="190" secondAttribute="firstBaseline" id="N4D-Zj-4Ed"/> <constraint firstItem="Let-vJ-J5z" firstAttribute="firstBaseline" secondItem="753" secondAttribute="firstBaseline" id="O6h-Dy-rhd"/> @@ -730,7 +730,7 @@ <constraint firstItem="277" firstAttribute="top" secondItem="201" secondAttribute="bottom" constant="8" symbolic="YES" id="Ywb-yl-dZO"/> <constraint firstItem="258" firstAttribute="leading" secondItem="189" secondAttribute="leading" constant="12" id="akZ-6M-6Ke"/> <constraint firstAttribute="trailing" secondItem="258" secondAttribute="trailing" constant="12" id="bcf-zK-Eeb"/> - <constraint firstItem="nTD-tF-zzg" firstAttribute="firstBaseline" secondItem="195" secondAttribute="firstBaseline" id="dMp-mu-0lU"/> + <constraint firstItem="nTD-tF-zzg" firstAttribute="firstBaseline" secondItem="304" secondAttribute="firstBaseline" id="dde-dy-mHp"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="8U9-Rn-xYX" secondAttribute="trailing" constant="20" symbolic="YES" id="esF-2B-ds7"/> <constraint firstItem="8U9-Rn-xYX" firstAttribute="leading" secondItem="RmO-um-4HP" secondAttribute="trailing" constant="8" symbolic="YES" id="f2m-Sw-3hc"/> <constraint firstItem="318" firstAttribute="leading" secondItem="189" secondAttribute="leading" constant="20" symbolic="YES" id="fDF-1D-GZm"/> @@ -769,6 +769,7 @@ </customView> </subviews> <constraints> + <constraint firstAttribute="trailing" secondItem="189" secondAttribute="trailing" id="CZ0-DF-QOP"/> <constraint firstAttribute="bottom" secondItem="189" secondAttribute="bottom" id="CgE-6E-jUn"/> <constraint firstItem="189" firstAttribute="top" secondItem="myG-64-rV4" secondAttribute="top" id="fOM-21-A4b"/> <constraint firstItem="189" firstAttribute="leading" secondItem="myG-64-rV4" secondAttribute="leading" id="g0A-I2-CUf"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Bibdesk-commit mailing list Bibdesk-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-commit