Revision: 24028
http://sourceforge.net/p/bibdesk/svn/24028
Author: hofman
Date: 2019-07-15 15:28:46 +0000 (Mon, 15 Jul 2019)
Log Message:
-----------
use properties for BibItem
Modified Paths:
--------------
trunk/bibdesk/BibItem.h
trunk/bibdesk/BibItem.m
Modified: trunk/bibdesk/BibItem.h
===================================================================
--- trunk/bibdesk/BibItem.h 2019-07-15 14:54:18 UTC (rev 24027)
+++ trunk/bibdesk/BibItem.h 2019-07-15 15:28:46 UTC (rev 24028)
@@ -135,14 +135,14 @@
- (BOOL)migrateFilesWithRemoveOptions:(BDSKRemoveFieldsOption)removeMask
numberOfAddedFiles:(NSInteger *)numberOfAddedFiles
numberOfRemovedFields:(NSInteger *)numberOfRemovedFields error:(NSError
**)outError;
-- (NSArray *)localFiles;
-- (NSArray *)existingLocalFiles;
-- (NSArray *)remoteURLs;
+@property (nonatomic, readonly) NSArray *localFiles;
+@property (nonatomic, readonly) NSArray *existingLocalFiles;
+@property (nonatomic, readonly) NSArray *remoteURLs;
-- (NSArray *)downloads;
+@property (nonatomic, readonly) NSArray *downloads;
-- (NSArray *)usedMacros;
-- (NSArray *)usedLocalMacros;
+@property (nonatomic, readonly) NSArray *usedMacros;
+@property (nonatomic, readonly) NSArray *usedLocalMacros;
- (NSURL *)suggestedURLForLinkedFile:(BDSKLinkedFile *)file;
- (BOOL)canSetURLForLinkedFile:(BDSKLinkedFile *)file;
@@ -188,16 +188,12 @@
*/
- (void)dealloc;
-- (id<BDSKOwner>)owner;
-- (void)setOwner:(id<BDSKOwner>)newOwner;
+@property (nonatomic, assign) id<BDSKOwner> owner;
-- (BDSKMacroResolver *)macroResolver;
-- (void)setMacroResolver:(BDSKMacroResolver *)newMacroResolver;
+@property (nonatomic, retain) BDSKMacroResolver *macroResolver;
-- (NSUndoManager *)undoManager;
+@property (nonatomic, readonly) NSUndoManager *undoManager;
-- (NSString *)description;
-
//
----------------------------------------------------------------------------------------
// comparisons
//
----------------------------------------------------------------------------------------
@@ -208,16 +204,15 @@
- (BOOL)isIdenticalToItem:(BibItem *)aBI;
// accessors for fileorder
-- (NSNumber *)fileOrder;
-- (void)setFileOrder:(NSNumber *)newOrder;
+@property (nonatomic, retain) NSNumber *fileOrder;
/* Methods for handling people objects (BibAuthors) which may be any people
type (Author, Editor, etc.)
*/
- (void)rebuildPeopleIfNeeded;
-- (NSSet *)allPeople;
+@property (nonatomic, readonly) NSSet *allPeople;
- (NSArray *)peopleArrayForField:(NSString *)field;
- (NSArray *)peopleArrayForField:(NSString *)field inherit:(BOOL)inherit;
-- (NSDictionary *)people;
+@property (nonatomic, readonly) NSDictionary *people;
- (NSDictionary *)peopleInheriting:(BOOL)inherit;
/*!
@@ -235,7 +230,7 @@
@discussion (discussion)
*/
-- (NSInteger)numberOfAuthors;
+@property (nonatomic, readonly) NSInteger numberOfAuthors;
/*!
@method numberOfAuthorsInheriting:
@@ -252,7 +247,7 @@
@discussion (discussion)
*/
-- (NSArray *)pubAuthors;
+@property (nonatomic, readonly) NSArray *pubAuthors;
/*!
@method pubAuthorsInheriting:
@@ -269,7 +264,7 @@
@discussion (comprehensive description)
@result (description)
*/
-- (NSString *)pubAuthorsForDisplay;
+@property (nonatomic, readonly) NSString *pubAuthorsForDisplay;
/*!
@method authorAtIndex:
@@ -290,10 +285,10 @@
*/
- (BibAuthor *)authorAtIndex:(NSUInteger)index inherit:(BOOL)inherit;
-- (BibAuthor *)firstAuthor;
-- (BibAuthor *)secondAuthor;
-- (BibAuthor *)thirdAuthor;
-- (BibAuthor *)lastAuthor;
+@property (nonatomic, readonly) BibAuthor *firstAuthor;
+@property (nonatomic, readonly) BibAuthor *secondAuthor;
+@property (nonatomic, readonly) BibAuthor *thirdAuthor;
+@property (nonatomic, readonly) BibAuthor *lastAuthor;
/*!
@method bibTeXAuthorString
@@ -301,7 +296,7 @@
@discussion (discussion)
*/
-- (NSString *)bibTeXAuthorString;
+@property (nonatomic, readonly) NSString *bibTeXAuthorString;
/*!
@method bibTeXAuthorStringNormalized:
@@ -341,7 +336,7 @@
@discussion (discussion)
*/
-- (NSInteger)numberOfAuthorsOrEditors;
+@property (nonatomic, readonly) NSInteger numberOfAuthorsOrEditors;
/*!
@method numberOfAuthorsOrEditorsInheriting:
@@ -358,7 +353,7 @@
@discussion (discussion)
*/
-- (NSArray *)pubAuthorsOrEditors;
+@property (nonatomic, readonly) NSArray *pubAuthorsOrEditors;
/*!
@method pubAuthorsOrEditorsInheriting:
@@ -370,20 +365,12 @@
- (NSArray *)pubAuthorsOrEditorsInheriting:(BOOL)inherit;
/*!
- @method lastAuthorOrEditor
- @abstract Returns last object of pubAuthorsOrEditors.
- @discussion (comprehensive description)
- @result (description)
-*/
-- (BibAuthor *)lastAuthorOrEditor;
-
-/*!
@method pubAuthorsOreditorsForDisplay
@abstract Returns authors or editors in a string form, according to the
user's display preferences.
@discussion (comprehensive description)
@result (description)
*/
-- (NSString *)pubAuthorsOrEditorsForDisplay;
+@property (nonatomic, readonly) NSString *pubAuthorsOrEditorsForDisplay;
/*!
@method authorOrEditorAtIndex:
@@ -404,10 +391,10 @@
*/
- (BibAuthor *)authorOrEditorAtIndex:(NSUInteger)index inherit:(BOOL)inherit;
-- (BibAuthor *)firstAuthorOrEditor;
-- (BibAuthor *)secondAuthorOrEditor;
-- (BibAuthor *)thirdAuthorOrEditor;
-- (BibAuthor *)lastAuthorOrEditor;
+@property (nonatomic, readonly) BibAuthor *firstAuthorOrEditor;
+@property (nonatomic, readonly) BibAuthor *secondAuthorOrEditor;
+@property (nonatomic, readonly) BibAuthor *thirdAuthorOrEditor;
+@property (nonatomic, readonly) BibAuthor *lastAuthorOrEditor;
/*!
@method crossrefParent
@@ -415,7 +402,7 @@
@discussion (discussion)
*/
-- (BibItem *)crossrefParent;
+@property (nonatomic, readonly) BibItem *crossrefParent;
/*!
@method title
@@ -423,7 +410,7 @@
@discussion (discussion)
*/
-- (NSString *)title;
+@property (nonatomic, readonly) NSString *title;
/*!
@method displayTitle
@@ -431,7 +418,7 @@
@discussion (discussion)
*/
-- (NSString *)displayTitle;
+@property (nonatomic, readonly) NSString *displayTitle;
/*!
@method container
@@ -439,7 +426,7 @@
@discussion (discussion)
*/
-- (NSString *)container;
+@property (nonatomic, readonly) NSString *container;
/*!
@method date
@@ -447,7 +434,7 @@
@discussion (discussion)
*/
-- (NSDate *)date;
+@property (nonatomic, readonly) NSDate *date;
/*!
@method dateInheriting:
@@ -458,16 +445,10 @@
*/
- (NSDate *)dateInheriting:(BOOL)inherit;
-- (NSDate *)dateAdded;
-- (NSDate *)dateModified;
+@property (nonatomic, readonly) NSDate *dateAdded;
+@property (nonatomic, readonly) NSDate *dateModified;
/*!
- @method setPubType:
- @abstract Basic setter for the publication type, calls
setType:withModdate: with the current date.
- @discussion -
-*/
-- (void)setPubType:(NSString *)newType;
-/*!
@method setPubType:withModDate:
@abstract Basic setter for the publication type, with undo. Sets up
the fields if necessary.
@discussion -
@@ -478,7 +459,7 @@
@abstract Returns the publication type.
@discussion -
*/
-- (NSString *)pubType;
+@property (nonatomic, retain) NSString *pubType;
/*!
@method rating
@@ -485,19 +466,10 @@
@abstract The value of the rating field as an integer.
@discussion (comprehensive description)
*/
-- (NSUInteger)rating;
+@property (nonatomic) NSUInteger rating;
-/*!
- @method setRating:
- @abstract Sets the rating field.
- @discussion (comprehensive description)
- @param rating The new value for the rating.
-*/
-- (void)setRating:(NSUInteger)rating;
+@property (nonatomic, retain) NSColor *color;
-- (NSColor *)color;
-- (void)setColor:(NSColor *)label;
-
/*!
@method setField:toRatingValue:
@abstract Sets an integer-type field value 0--5
@@ -596,19 +568,12 @@
- (id)displayValueOfField:(NSString *)field;
/*!
- @method setHasBeenEdited:
- @abstract Must be set to YES if the BibItem has been edited externally.
- @discussion (comprehensive description)
- @param yn (description)
-*/
-- (void)setHasBeenEdited:(BOOL)yn;
-/*!
@method hasBeenEdited
@abstract Returns YES if the BibItem has been edited (type or metadata
changed) externally.
@discussion (comprehensive description)
@result (description)
*/
-- (BOOL)hasBeenEdited;
+@property (nonatomic) BOOL hasBeenEdited;
/*!
@method suggestedCiteKey
@@ -616,17 +581,18 @@
@discussion Returns a suggested cite key based on the cite key format and
the receivers publication data.
@result The suggested cite key string
*/
-- (NSString *)suggestedCiteKey;
+@property (nonatomic, readonly) NSString *suggestedCiteKey;
- (BOOL)isValidCiteKey:(NSString *)proposedCiteKey;
-- (BOOL)hasEmptyOrDefaultCiteKey;
+@property (nonatomic, readonly) BOOL hasEmptyOrDefaultCiteKey;
+
/*
@method canGenerateAndSetCiteKey
@abstract Returns a boolean indicating whether all fields required for the
generated cite key are set and whether the item needs a cite key (checks
hasEmptyOrDefaultCiteKey).
@discussion -
*/
-- (BOOL)canGenerateAndSetCiteKey;
+@property (nonatomic, readonly) BOOL canGenerateAndSetCiteKey;
/*
@method canSetCrossref:
@@ -645,13 +611,6 @@
- (NSInteger)canSetCiteKey:(NSString *)aCiteKey;
/*!
- @method setCiteKey:
- @abstract basic setter for the cite key, with notification and undo
and current modified date.
- @discussion -
-*/
-- (void)setCiteKey:(NSString *)newCiteKey;
-
-/*!
@method setCiteKey:withModDate:
@abstract basic setter for the cite key, with notification and undo.
@discussion -
@@ -663,17 +622,10 @@
@abstract returns the cite key, sets a suggested cite key if
undefined.
@discussion -
*/
-- (NSString *)citeKey;
+@property (nonatomic, retain) NSString *citeKey;
-- (NSDictionary *)pubFields;
+@property (nonatomic, copy) NSDictionary *pubFields;
-/*!
- @method setPubFields
- @abstract setter for the dictionary of fields, with notification and
undo.
- @discussion -
-*/
-- (void)setPubFields: (NSDictionary *)newFields;
-
- (void)setField: (NSString *)key toValue: (NSString *)value;
- (void)setField: (NSString *)key toValue: (NSString *)value
withModDate:(NSDate *)date;
@@ -698,7 +650,7 @@
*/
- (NSString *)valueOfField: (NSString *)key inherit: (BOOL)inherit;
-- (NSArray *)allFieldNames;
+@property (nonatomic, readonly) NSArray *allFieldNames;
/*!
@method matchesSubstring:inField:
@@ -709,9 +661,9 @@
*/
- (BOOL)matchesSubstring:(NSString *)substring inField:(NSString *)field;
-- (NSDictionary *)searchIndexInfo;
+@property (nonatomic, readonly) NSDictionary *searchIndexInfo;
- (NSDictionary *)metadataCacheInfoForUpdate:(BOOL)update;
-- (id)completionObject;
+@property (nonatomic, readonly) id completionObject;
- (BOOL)matchesString:(NSString *)searchterm;
/*!
@@ -718,25 +670,25 @@
@method bibTeXString
@abstract returns the bibtex source for this bib item. Is TeXified based
on default preferences for the application.
*/
-- (NSString *)bibTeXString;
+@property (nonatomic, readonly) NSString *bibTeXString;
- (NSString *)bibTeXStringWithOptions:(BDSKBibTeXOption)options;
- (NSData *)bibTeXDataWithOptions:(BDSKBibTeXOption)options
relativeToPath:(NSString *)basePath encoding:(NSStringEncoding)encoding
error:(NSError **)outError;
-- (NSString *)RISStringValue;
+@property (nonatomic, readonly) NSString *RISStringValue;
-- (NSXMLElement *)MODSXMLValue;
-- (NSXMLElement *)endNoteXMLValue;
-- (NSXMLElement *)wordXMLValue;
+@property (nonatomic, readonly) NSXMLElement *MODSXMLValue;
+@property (nonatomic, readonly) NSXMLElement *endNoteXMLValue;
+@property (nonatomic, readonly) NSXMLElement *wordXMLValue;
-- (NSString *)RSSStringValue;
+@property (nonatomic, readonly) NSString *RSSStringValue;
/*!
@method allFieldsString
@abstract returns the value of each of the fields concatenated into a
single string.
*/
-- (NSString *)allFieldsString;
+@property (nonatomic, readonly) NSString *allFieldsString;
- (NSString *)stringValueUsingTemplate:(BDSKTemplate *)template;
- (NSAttributedString *)attributedStringValueUsingTemplate:(BDSKTemplate
*)template;
@@ -743,23 +695,23 @@
- (void)prepareForTemplateParsing;
- (void)cleanupAfterTemplateParsing;
-- (id)requiredFields;
-- (id)optionalFields;
-- (id)defaultFields;
-- (id)allFields;
-- (BDSKFieldCollection *)fields;
-- (BDSKFieldCollection *)urls;
-- (BDSKFieldCollection *)persons;
-- (id)authors;
-- (id)editors;
-- (id)authorsOrEditors;
-- (NSInteger)itemIndex;
-- (void)setItemIndex:(NSInteger)index;
-- (NSDate *)currentDate;
-- (NSString *)textSkimNotes;
-- (NSAttributedString *)richTextSkimNotes;
-- (NSAttributedString *)linkedText;
+@property (nonatomic, readonly) id requiredFields;
+@property (nonatomic, readonly) id optionalFields;
+@property (nonatomic, readonly) id defaultFields;
+@property (nonatomic, readonly) id allFields;
+@property (nonatomic, readonly) BDSKFieldCollection *fields;
+@property (nonatomic, readonly) BDSKFieldCollection *urls;
+@property (nonatomic, readonly) BDSKFieldCollection *persons;
+@property (nonatomic, readonly) id authors;
+@property (nonatomic, readonly) id editors;
+@property (nonatomic, readonly) id authorsOrEditors;
+@property (nonatomic) NSInteger itemIndex;
+@property (nonatomic, readonly) NSDate *currentDate;
+@property (nonatomic, readonly) NSString *textSkimNotes;
+@property (nonatomic, readonly) NSAttributedString *richTextSkimNotes;
+@property (nonatomic, readonly) NSAttributedString *linkedText;
+
/*!
@method URLForField:
@abstract Returns a valid URL for the field (either a file URL or
internet URL) or nil.
@@ -775,7 +727,7 @@
@discussion (comprehensive description)
@result (description)
*/
-- (NSURL *)remoteURL;
+@property (nonatomic, readonly) NSURL *remoteURL;
/*!
@method remoteURLForField:
@@ -793,7 +745,7 @@
@discussion (comprehensive description)
@result (description)
*/
-- (NSURL *)localURL;
+@property (nonatomic, readonly) NSURL *localURL;
/*!
@method localUrlPath
@@ -801,7 +753,7 @@
@discussion -
@result a complete path with no tildes, or nil if an error occurred.
*/
-- (NSString *)localUrlPath;
+@property (nonatomic, readonly) NSString *localUrlPath;
/*!
@method imageForURLField:
@@ -817,7 +769,7 @@
- (void)setField:(NSString *)field toURLValue:(NSURL *)aURL;
-- (BDSKFieldCollection *)URLFields;
+@property (nonatomic, readonly) BDSKFieldCollection *URLFields;
- (NSString *)fieldValueForFileURL:(NSURL *)aURL withFormat:(NSInteger)format;
@@ -838,16 +790,16 @@
- (BDSKFieldAction)replaceGroup:(BDSKCategoryGroup *)group
withGroup:(BDSKCategoryGroup *)newGroup
handleInherited:(BDSKFieldAction)operation;
- (void)invalidateGroupNames;
-- (BOOL)isImported;
-- (void)setImported:(BOOL)flag;
+@property (nonatomic, getter=isImported) BOOL imported;
-- (NSURL *)identifierURL;
-- (void)setSearchScore:(CGFloat)val;
-- (CGFloat)searchScore;
-- (NSString *)skimNotesForLocalURL;
+@property (nonatomic, readonly) NSURL *identifierURL;
-- (NSURL *)bdskURL;
+@property (nonatomic) CGFloat searchScore;
+@property (nonatomic, readonly) NSString *skimNotesForLocalURL;
+
+@property (nonatomic, readonly) NSURL *bdskURL;
+
- (void)resetGroupsAndPeople;
@end
Modified: trunk/bibdesk/BibItem.m
===================================================================
--- trunk/bibdesk/BibItem.m 2019-07-15 14:54:18 UTC (rev 24027)
+++ trunk/bibdesk/BibItem.m 2019-07-15 15:28:46 UTC (rev 24028)
@@ -194,6 +194,9 @@
@implementation BibItem
+@synthesize owner, macroResolver, downloads, fileOrder, identifierURL,
dateAdded, dateModified, pubType, citeKey, hasBeenEdited, pubFields,
searchScore, imported, itemIndex=currentIndex;
+@dynamic undoManager, localFiles, existingLocalFiles, remoteURLs, usedMacros,
usedLocalMacros, allPeople, people, numberOfAuthors, pubAuthors,
pubAuthorsForDisplay, firstAuthor, secondAuthor, thirdAuthor, lastAuthor,
bibTeXAuthorString, numberOfAuthorsOrEditors, pubAuthorsOrEditors,
pubAuthorsOrEditorsForDisplay, firstAuthorOrEditor, secondAuthorOrEditor,
thirdAuthorOrEditor, lastAuthorOrEditor, crossrefParent, title, displayTitle,
container, date, rating, color, suggestedCiteKey, hasEmptyOrDefaultCiteKey,
canGenerateAndSetCiteKey, allFieldNames, searchIndexInfo, completionObject,
bibTeXString, RISStringValue, MODSXMLValue, endNoteXMLValue, wordXMLValue,
RSSStringValue, allFieldsString, requiredFields, optionalFields, defaultFields,
allFields, fields, urls, persons, authors, editors, authorsOrEditors,
currentDate, textSkimNotes, richTextSkimNotes, linkedText, remoteURL, localURL,
localUrlPath, URLFields, skimNotesForLocalURL, bdskURL;
+
+ (void)initialize
{
BDSKINITIALIZE;
@@ -602,10 +605,6 @@
#pragma mark Document
-- (id<BDSKOwner>)owner {
- return owner;
-}
-
- (void)setOwner:(id<BDSKOwner>)newOwner {
if (owner != newOwner) {
if (owner && newOwner == nil && [downloads count] > 0) {
@@ -622,10 +621,6 @@
}
}
-- (BDSKMacroResolver *)macroResolver {
- return macroResolver;
-}
-
- (void)setMacroResolver:(BDSKMacroResolver *)newMacroResolver {
if (macroResolver != newMacroResolver) {
BDSKASSERT(macroResolver == nil);
@@ -638,23 +633,6 @@
return [owner undoManager];
}
-// accessors for fileorder
-- (NSNumber *)fileOrder{
- return fileOrder;
-}
-
-- (void)setFileOrder:(NSNumber *)newOrder{
- if(fileOrder != newOrder){
- [fileOrder release];
- fileOrder = [newOrder retain];
- }
-}
-
-// a per-session identifier that is used to track this item in SearchKit
indexes
-- (NSURL *)identifierURL {
- return identifierURL;
-}
-
#pragma mark -
#pragma mark Generic person handling code
@@ -994,14 +972,6 @@
return pubDate;
}
-- (NSDate *)dateAdded {
- return dateAdded;
-}
-
-- (NSDate *)dateModified {
- return dateModified;
-}
-
- (void)setPubType:(NSString *)newType{
[self setPubType:[newType entryType] withModDate:[NSDate date]];
}
@@ -1036,10 +1006,6 @@
userInfo:notifInfo];
}
-- (NSString *)pubType{
- return pubType;
-}
-
- (NSUInteger)rating{
NSArray *ratingFields = [[NSUserDefaults standardUserDefaults]
stringArrayForKey:BDSKRatingFieldsKey];
NSString *field = [ratingFields containsObject:BDSKRatingString] ?
BDSKRatingString : [ratingFields firstObject];
@@ -1064,14 +1030,6 @@
[self setField:BDSKColorString toValue:[aColor fourByteStringValue]];
}
-- (void)setHasBeenEdited:(BOOL)flag{
- hasBeenEdited = flag;
-}
-
-- (BOOL)hasBeenEdited{
- return hasBeenEdited;
-}
-
- (void)setCiteKey:(NSString *)newCiteKey{
[self setCiteKey:newCiteKey withModDate:[NSDate date]];
}
@@ -1102,10 +1060,6 @@
userInfo:notifInfo];
}
-- (NSString *)citeKey{
- return citeKey;
-}
-
- (NSString *)suggestedCiteKey
{
NSString *suggestion = [self citeKey];
@@ -1199,15 +1153,11 @@
#pragma mark Pub Fields
-- (NSDictionary *)pubFields{
- return pubFields;
-}
-
- (NSArray *)allFieldNames{
return [pubFields allKeys];
}
-- (void)setPubFields: (NSDictionary *)newFields{
+- (void)setPubFields:(NSDictionary *)newFields{
NSDictionary *oldFields = [self pubFields];
if(NO == [newFields isEqualToDictionary:oldFields]){
[[[self undoManager] prepareWithInvocationTarget:self]
setPubFields:oldFields];
@@ -1520,9 +1470,6 @@
#pragma mark Search support
-- (void)setSearchScore:(CGFloat)val { searchScore = val; }
-- (CGFloat)searchScore { return searchScore; }
-
- (NSString *)skimNotesForLocalURL{
NSMutableString *string = [NSMutableString string];
NSURL *fileURL;
@@ -2548,10 +2495,6 @@
return [[self persons] valueForKey:[self numberOfAuthors] ?
BDSKAuthorString : BDSKEditorString];
}
-- (void)setItemIndex:(NSInteger)idx{ currentIndex = idx; }
-
-- (NSInteger)itemIndex{ return currentIndex; }
-
- (NSDate *)currentDate{ return [NSDate date]; }
- (NSString *)textSkimNotes {
@@ -3196,8 +3139,6 @@
#pragma mark Download
-- (NSArray *)downloads { return downloads; }
-
- (void)itemDownloadDidUpdate:(BDSKItemDownload *)download {
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:download
forKey:BDSKItemDownloadKey];
[[NSNotificationCenter defaultCenter]
postNotificationName:BDSKItemDownloadUpdatedNotification object:self
userInfo:userInfo];
@@ -3657,16 +3598,6 @@
[groups removeAllObjects];
}
-- (BOOL)isImported{
- return isImported;
-}
-
-- (void)setImported:(BOOL)flag{
- if (isImported != flag) {
- isImported = flag;
- }
-}
-
- (NSURL *)bdskURL {
return [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@",
BDSKBibItemURLScheme, [[self citeKey]
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
}
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