Revision: 27783
http://sourceforge.net/p/bibdesk/svn/27783
Author: hofman
Date: 2022-08-10 08:56:31 +0000 (Wed, 10 Aug 2022)
Log Message:
-----------
Cache favicons from visited webpages and use them for favicons, history, and
bookmarks. Save to disk between launches.
Modified Paths:
--------------
trunk/bibdesk/BDSKAppController.m
trunk/bibdesk/BDSKBookmark.m
trunk/bibdesk/BDSKWebGroupViewController.m
trunk/bibdesk/BDSKWebView.h
trunk/bibdesk/BDSKWebView.m
trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
Added Paths:
-----------
trunk/bibdesk/BDSKWebIconDatabase.h
trunk/bibdesk/BDSKWebIconDatabase.m
Modified: trunk/bibdesk/BDSKAppController.m
===================================================================
--- trunk/bibdesk/BDSKAppController.m 2022-08-09 11:16:27 UTC (rev 27782)
+++ trunk/bibdesk/BDSKAppController.m 2022-08-10 08:56:31 UTC (rev 27783)
@@ -76,6 +76,7 @@
#import "BDSKGroupsArray.h"
#import "BDSKWebGroup.h"
#import "BDSKWebGroupViewController.h"
+#import "BDSKWebIconDatabase.h"
#import "BDSKTask.h"
#import "BDSKRadioTransformer.h"
#import <Sparkle/Sparkle.h>
@@ -599,7 +600,7 @@
}
NSMenuItem *item = [menu addItemWithTitle:title
action:@selector(openBookmark:) keyEquivalent:@""];
[item setRepresentedObject:[NSURL URLWithString:[historyItem
URLString]]];
- [item setImageAndSize:[NSImage imageNamed:@"Bookmark"]];
+ [item setImageAndSize:[[BDSKWebIconDatabase sharedDatabase]
iconForURLString:[historyItem URLString]] ?: [NSImage imageNamed:@"Bookmark"]];
}
}
Modified: trunk/bibdesk/BDSKBookmark.m
===================================================================
--- trunk/bibdesk/BDSKBookmark.m 2022-08-09 11:16:27 UTC (rev 27782)
+++ trunk/bibdesk/BDSKBookmark.m 2022-08-10 08:56:31 UTC (rev 27783)
@@ -40,6 +40,7 @@
#import "NSImage_BDSKExtensions.h"
#import "BDSKRuntime.h"
#import "NSError_BDSKExtensions.h"
+#import "BDSKWebIconDatabase.h"
#define CHILDREN_KEY @"Children"
#define TITLE_KEY @"Title"
@@ -320,7 +321,7 @@
[[NSGraphicsContext currentContext]
setImageInterpolation:NSImageInterpolationDefault];
}];
}
- return icon;
+ return [[BDSKWebIconDatabase sharedDatabase] iconForURLString:[[self URL]
absoluteString]] ?: icon;
}
- (NSString *)URLDescription {
Modified: trunk/bibdesk/BDSKWebGroupViewController.m
===================================================================
--- trunk/bibdesk/BDSKWebGroupViewController.m 2022-08-09 11:16:27 UTC (rev
27782)
+++ trunk/bibdesk/BDSKWebGroupViewController.m 2022-08-10 08:56:31 UTC (rev
27783)
@@ -51,6 +51,7 @@
#import "NSString_BDSKExtensions.h"
#import "NSURL_BDSKExtensions.h"
#import "NSPasteboard_BDSKExtensions.h"
+#import "BDSKWebIconDatabase.h"
#define MAX_HISTORY 50
#define BACK_SEGMENT_INDEX 0
@@ -205,7 +206,7 @@
title = [url isFileURL] ? [[url path] lastPathComponent] : [[url
absoluteString] stringByRemovingPercentEncoding];
}
NSMenuItem *menuItem = [menu addItemWithTitle:title
action:@selector(goBackForwardInHistory:) keyEquivalent:@""];
- [menuItem setImageAndSize:[BDSKWebView faviconForURLString:[item
URLString]] ?: [item icon]];
+ [menuItem setImageAndSize:[[BDSKWebIconDatabase sharedDatabase]
iconForURLString:[item URLString]] ?: [item icon]];
[menuItem setTarget:self];
[menuItem setRepresentedObject:item];
}
Added: trunk/bibdesk/BDSKWebIconDatabase.h
===================================================================
--- trunk/bibdesk/BDSKWebIconDatabase.h (rev 0)
+++ trunk/bibdesk/BDSKWebIconDatabase.h 2022-08-10 08:56:31 UTC (rev 27783)
@@ -0,0 +1,56 @@
+//
+// BDSKWebIconDatabase.h
+// BibDesk
+//
+// Created by Christiaan Hofman on 10/08/2022.
+/*
+ This software is Copyright (c) 2022
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface BDSKWebIconDatabase : NSObject {
+ NSMutableDictionary *iconURLs;
+ NSMutableDictionary *icons;
+ NSMutableDictionary *recentIcons;
+ NSMutableDictionary *cachedIcons;
+}
+
++ (BDSKWebIconDatabase *)sharedDatabase;
+
+- (NSImage *)iconForURLString:(NSString *)pageURLString;
+- (NSImage *)recentIconForURLString:(NSString *)aURLString;
+
+- (void)setIcon:(NSImage *)icon withData:(NSData *)data
fromURLString:(NSString *)iconURLString forURLString:(NSString *)pageURLString;
+
+@end
Added: trunk/bibdesk/BDSKWebIconDatabase.m
===================================================================
--- trunk/bibdesk/BDSKWebIconDatabase.m (rev 0)
+++ trunk/bibdesk/BDSKWebIconDatabase.m 2022-08-10 08:56:31 UTC (rev 27783)
@@ -0,0 +1,135 @@
+//
+// BDSKWebIconDatabase.m
+// BibDesk
+//
+// Created by Christiaan Hofman on 10/08/2022.
+/*
+ This software is Copyright (c) 2022
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "BDSKWebIconDatabase.h"
+#import "NSFileManager_BDSKExtensions.h"
+
+
+@interface BDSKWebIconDatabase ()
+- (NSURL *)webIconDatabaseURL;
+- (void)handleApplicationWillTerminate:(NSNotification *)notification;
+@end
+
+@implementation BDSKWebIconDatabase
+
++ (BDSKWebIconDatabase *)sharedDatabase {
+ if (RUNNING_BEFORE(10_13))
+ return nil;
+ static BDSKWebIconDatabase *sharedDatabase = nil;
+ if (sharedDatabase == nil)
+ sharedDatabase = [[self alloc] init];
+ return sharedDatabase;
+}
+
+- (id)init {
+ self = [super init];
+ if (self) {
+ NSURL *dbURL = [self webIconDatabaseURL];
+ NSData *dbData = [NSData dataWithContentsOfURL:dbURL options:0
error:NULL];
+ NSDictionary *dict = nil;
+ if (dbData)
+ dict = [NSPropertyListSerialization propertyListWithData:dbData
options:NSPropertyListMutableContainers format:NULL error:NULL];
+ icons = [[NSMutableDictionary alloc] initWithDictionary:[dict
objectForKey:@"icons"]];
+ iconURLs = [[NSMutableDictionary alloc] initWithDictionary:[dict
objectForKey:@"iconURLs"]];
+ recentIcons = [[NSMutableDictionary alloc] init];
+ cachedIcons = [[NSMutableDictionary alloc] init];
+ [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleApplicationWillTerminate:)
name:NSApplicationWillTerminateNotification object:nil];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ BDSKDESTROY(iconURLs);
+ BDSKDESTROY(icons);
+ BDSKDESTROY(recentIcons);
+ BDSKDESTROY(cachedIcons);
+ [super dealloc];
+}
+
+- (NSImage *)iconForURLString:(NSString *)pageURLString {
+ if ([NSString isEmptyString:pageURLString])
+ return nil;
+ NSImage *icon = [recentIcons objectForKey:pageURLString];
+ if (icon)
+ return icon;
+ NSString *iconURLString = [iconURLs objectForKey:pageURLString];
+ if (iconURLString == nil)
+ return nil;
+ icon = [cachedIcons objectForKey:iconURLString];
+ if (icon)
+ return icon;
+ NSData *data = [icons objectForKey:iconURLString];
+ if (data == nil)
+ return nil;
+ if ((icon = [[[NSImage alloc] initWithData:data] autorelease]))
+ [cachedIcons setObject:icon forKey:iconURLString];
+ return icon;
+}
+
+- (NSImage *)recentIconForURLString:(NSString *)aURLString {
+ if ([NSString isEmptyString:aURLString])
+ return nil;
+ return [recentIcons objectForKey:aURLString];
+}
+
+- (void)setIcon:(NSImage *)icon withData:(NSData *)data
fromURLString:(NSString *)iconURLString forURLString:(NSString *)pageURLString {
+ if ([NSString isEmptyString:pageURLString])
+ return;
+ [recentIcons setObject:icon forKey:pageURLString];
+ [iconURLs setObject:iconURLString forKey:pageURLString];
+ if (data) {
+ [recentIcons setObject:icon forKey:iconURLString];
+ [cachedIcons removeObjectForKey:iconURLString];
+ [icons setObject:data forKey:iconURLString];
+ }
+}
+
+- (NSURL *)webIconDatabaseURL {
+ return [[[NSFileManager defaultManager] applicationSupportDirectoryURL]
URLByAppendingPathComponent:@"WebIcons.plist"];
+}
+
+- (void)handleApplicationWillTerminate:(NSNotification *)notification {
+ if (icons == nil || iconURLs == nil || [recentIcons count] == 0)
+ return;
+ NSURL *dbURL = [self webIconDatabaseURL];
+ NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:iconURLs,
@"iconURLs", icons, @"icons", @"1.0", @"version", nil];
+ NSData *data = [NSPropertyListSerialization dataWithPropertyList:dict
format:NSPropertyListBinaryFormat_v1_0 options:0 error:NULL];
+ [data writeToURL:dbURL atomically:YES];
+}
+
+@end
Modified: trunk/bibdesk/BDSKWebView.h
===================================================================
--- trunk/bibdesk/BDSKWebView.h 2022-08-09 11:16:27 UTC (rev 27782)
+++ trunk/bibdesk/BDSKWebView.h 2022-08-10 08:56:31 UTC (rev 27783)
@@ -66,8 +66,6 @@
- (IBAction)addBookmark:(id)sender;
- (IBAction)saveSource:(id)sender;
-+ (NSImage *)faviconForURLString:(NSString *)URLString;
-
@end
#pragma mark -
Modified: trunk/bibdesk/BDSKWebView.m
===================================================================
--- trunk/bibdesk/BDSKWebView.m 2022-08-09 11:16:27 UTC (rev 27782)
+++ trunk/bibdesk/BDSKWebView.m 2022-08-10 08:56:31 UTC (rev 27783)
@@ -49,6 +49,7 @@
#import "BDSKRuntime.h"
#import "DOMNode_BDSKExtensions.h"
#import "BDSKDownloader.h"
+#import "BDSKWebIconDatabase.h"
@interface BDSKWebDelegate : NSObject <WebFrameLoadDelegate,
WebPolicyDelegate, WebUIDelegate, WebEditingDelegate> {
@@ -75,6 +76,7 @@
#pragma mark -
@interface BDSKWebView () <BDSKDownloaderDelegate>
+- (void)setFavicon:(NSImage *)icon;
- (void)retrieveFavicon;
- (void)clearFavicon;
@end
@@ -83,8 +85,6 @@
@dynamic delegate, navigationDelegate, URL;
-static NSMutableDictionary *webIcons;
-
- (id)initWithFrame:(NSRect)frameRect frameName:(NSString *)frameName
groupName:(NSString *)groupName {
self = [super initWithFrame:frameRect frameName:frameName
groupName:@"BibDeskWebGroup"];
if (self) {
@@ -204,15 +204,19 @@
#pragma mark Favicon
+- (void)setFavicon:(NSImage *)icon {
+ if (icon != favicon) {
+ [favicon release];
+ favicon = [icon retain];
+ }
+ if ([[self frameLoadDelegate]
respondsToSelector:@selector(webView:didReceiveIcon:forFrame:)])
+ [[self frameLoadDelegate] webView:self didReceiveIcon:favicon
forFrame:[self mainFrame]];
+}
+
- (void)retrieveFavicon {
- NSImage *icon = [[self class] faviconForURLString:[self mainFrameURL]];
+ NSImage *icon = [[BDSKWebIconDatabase sharedDatabase]
recentIconForURLString:[self mainFrameURL]];
if (icon) {
- if (icon != favicon) {
- [favicon release];
- favicon = [icon retain];
- }
- if ([[self frameLoadDelegate]
respondsToSelector:@selector(webView:didReceiveIcon:forFrame:)])
- [[self frameLoadDelegate] webView:self didReceiveIcon:favicon
forFrame:[self mainFrame]];
+ [self setFavicon:icon];
return;
}
@@ -269,8 +273,16 @@
[faviconDownload cancel];
[faviconDownload release];
}
- NSURLRequest *request = [NSURLRequest requestWithURL:faviconURL];
- faviconDownload = [[[BDSKDownloader sharedDownloader]
startDataDownloadWithRequest:request delegate:self] retain];
+
+ // different pages from the same site can have the same favicon
+ icon = [[BDSKWebIconDatabase sharedDatabase]
recentIconForURLString:[faviconURL absoluteString]];
+ if (icon) {
+ [[BDSKWebIconDatabase sharedDatabase] setIcon:icon withData:nil
fromURLString:[faviconURL absoluteString] forURLString:[self mainFrameURL]];
+ [self setFavicon:icon];
+ } else {
+ NSURLRequest *request = [NSURLRequest requestWithURL:faviconURL];
+ faviconDownload = [[[BDSKDownloader sharedDownloader]
startDataDownloadWithRequest:request delegate:self] retain];
+ }
}
- (void)clearFavicon {
@@ -289,16 +301,14 @@
return;
}
if (data) {
- [favicon release];
- favicon = [[NSImage alloc] initWithData:data];
+ NSImage *icon = [[NSImage alloc] initWithData:data];
+ if (icon) {
+ [self setFavicon:icon];
+ [[BDSKWebIconDatabase sharedDatabase] setIcon:icon withData:data
fromURLString:[[[download response] URL] absoluteString]
+ forURLString:[self mainFrameURL]];
+ [icon release];
+ }
[data release];
- if (favicon) {
- if (webIcons == nil)
- webIcons = [[NSMutableDictionary alloc] init];
- [webIcons setObject:favicon forKey:[self mainFrameURL]];
- if ([[self frameLoadDelegate]
respondsToSelector:@selector(webView:didReceiveIcon:forFrame:)])
- [[self frameLoadDelegate] webView:self didReceiveIcon:favicon
forFrame:[self mainFrame]];
- }
}
}
@@ -305,15 +315,9 @@
- (NSImage *)mainFrameIcon {
if (RUNNING_BEFORE(10_13))
return [super mainFrameIcon];
- return favicon ?: [[self class] faviconForURLString:[self mainFrameURL]]
?: [NSImage imageNamed:@"Bookmark"];
+ return favicon ?: [[BDSKWebIconDatabase sharedDatabase]
iconForURLString:[self mainFrameURL]] ?: [NSImage imageNamed:@"Bookmark"];
}
-+ (NSImage *)faviconForURLString:(NSString *)URLString {
- if ([NSString isEmptyString:URLString])
- return nil;
- return [webIcons objectForKey:URLString];
-}
-
@end
#pragma mark -
Modified: trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
===================================================================
--- trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj 2022-08-09 11:16:27 UTC
(rev 27782)
+++ trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj 2022-08-10 08:56:31 UTC
(rev 27783)
@@ -133,6 +133,8 @@
CE280D6D16C6CB8700344CC8 /* BDSKSaveAccessoryView.xib in
Resources */ = {isa = PBXBuildFile; fileRef = CE280D6C16C6CB8700344CC8 /*
BDSKSaveAccessoryView.xib */; };
CE28346509176CA3006B4C63 /* BDSKGradientView.m in Sources */ =
{isa = PBXBuildFile; fileRef = F9706DE409102DF500526FC8 /* BDSKGradientView.m
*/; };
CE2837420917D31D006B4C63 /* BDSKEdgeView.m in Sources */ = {isa
= PBXBuildFile; fileRef = CE2837400917D31D006B4C63 /* BDSKEdgeView.m */; };
+ CE2885AC28A3A87200B49F11 /* BDSKWebIconDatabase.h in Headers */
= {isa = PBXBuildFile; fileRef = CE2885AA28A3A87200B49F11 /*
BDSKWebIconDatabase.h */; };
+ CE2885AD28A3A87200B49F11 /* BDSKWebIconDatabase.m in Sources */
= {isa = PBXBuildFile; fileRef = CE2885AB28A3A87200B49F11 /*
BDSKWebIconDatabase.m */; };
CE2941050A7F8F2900A46D05 /* ReadMe.rtf in Resources */ = {isa =
PBXBuildFile; fileRef = CE2941040A7F8F2900A46D05 /* ReadMe.rtf */; };
CE2A09B22245997A00A8F31C /* BDSKACMDLParser.h in Headers */ =
{isa = PBXBuildFile; fileRef = 45DB3E470CAADFC3001EACDA /* BDSKACMDLParser.h
*/; };
CE2A09B32245997A00A8F31C /* BDSKAddCommand.h in Headers */ =
{isa = PBXBuildFile; fileRef = CE3011A00D5CC41C00C0B7FA /* BDSKAddCommand.h */;
};
@@ -1398,6 +1400,8 @@
CE280D4616C6C51600344CC8 /* BDSKSaveAccessoryViewController.m
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = BDSKSaveAccessoryViewController.m; sourceTree =
"<group>"; };
CE28373F0917D31D006B4C63 /* BDSKEdgeView.h */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path =
BDSKEdgeView.h; sourceTree = "<group>"; };
CE2837400917D31D006B4C63 /* BDSKEdgeView.m */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path
= BDSKEdgeView.m; sourceTree = "<group>"; };
+ CE2885AA28A3A87200B49F11 /* BDSKWebIconDatabase.h */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
BDSKWebIconDatabase.h; sourceTree = "<group>"; };
+ CE2885AB28A3A87200B49F11 /* BDSKWebIconDatabase.m */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
BDSKWebIconDatabase.m; sourceTree = "<group>"; };
CE2AF1A926BAD4E100B4279A /* BDSKGroupParentCell.h */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
BDSKGroupParentCell.h; sourceTree = "<group>"; };
CE2AF1AA26BAD4E100B4279A /* BDSKGroupParentCell.m */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
BDSKGroupParentCell.m; sourceTree = "<group>"; };
CE2BB58F0E0BE0EA0090E848 /* PDFKit.framework */ = {isa =
PBXFileReference; lastKnownFileType = wrapper.framework; name =
PDFKit.framework; path =
/System/Library/Frameworks/Quartz.framework/Frameworks/PDFKit.framework;
sourceTree = "<absolute>"; };
@@ -2853,6 +2857,7 @@
F9022C980758038000C3F701 /* BDSKTypeManager.m
*/,
F9022CA30758038000C3F701 /*
BDSKTypeSelectHelper.m */,
3DAEA2EC07703F6000AF111A /* BDSKUndoManager.m
*/,
+ CE2885AB28A3A87200B49F11 /*
BDSKWebIconDatabase.m */,
);
name = Managers;
sourceTree = "<group>";
@@ -3434,6 +3439,7 @@
CE38FEFC0D4E7EC700D0A886 /* BDSKVersionNumber.h
*/,
4575382A0B70170D00C0E49B /* BDSKWebGroup.h */,
4575382C0B70170D00C0E49B /*
BDSKWebGroupViewController.h */,
+ CE2885AA28A3A87200B49F11 /*
BDSKWebIconDatabase.h */,
F9E069B40981A03B00AEFBE7 /*
BDSKWebOfScienceParser.h */,
CE3A254D0B75FF09006B64D3 /* BDSKWebParser.h */,
CEF7F42412743BCC00B20881 /* BDSKWebView.h */,
@@ -3898,6 +3904,7 @@
CE2A0A8722459A3100A8F31C /*
BDSKTemplateObjectProxy.h in Headers */,
CEE882B926697C0500574E12 /*
BDSKControlTableCellView.h in Headers */,
CE2A09B52245997A00A8F31C /*
BDSKAddressTextFieldCell.h in Headers */,
+ CE2885AC28A3A87200B49F11 /*
BDSKWebIconDatabase.h in Headers */,
CE2A0A41224599F600A8F31C /*
BDSKPreferenceController.h in Headers */,
CE2A09EC224599DB00A8F31C /*
BDSKEditorTextView.h in Headers */,
CE2A09EB224599DB00A8F31C /*
BDSKEditorTextField.h in Headers */,
@@ -4587,6 +4594,7 @@
F9022C84075802E300C3F701 /* BibItem.m in
Sources */,
F9022C86075802E300C3F701 /*
BDSKPersonController.m in Sources */,
F9022C87075802E300C3F701 /* BibPref_AutoFile.m
in Sources */,
+ CE2885AD28A3A87200B49F11 /*
BDSKWebIconDatabase.m in Sources */,
CEEBC98D20D7F6E60008F2B7 /* BDSKInfo.m in
Sources */,
F9022C88075802E300C3F701 /* BibPref_CiteKey.m
in Sources */,
CE8F75BB239D3F7F00511336 /* BDSKPRISMParser.m
in Sources */,
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