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

Reply via email to