aboutsummaryrefslogtreecommitdiff
path: root/AppKit/GTMNSImage+SearchCache.m
blob: 21f2ce86d5717469ef5bc459beeff7f788d8bf5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//
//  GTMNSImage+SearchCache.m
//
//  Finds NSImages using a variety of techniques
//
//  Copyright 2009 Google Inc.
//
//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
//  use this file except in compliance with the License.  You may obtain a copy
//  of the License at
// 
//  http://www.apache.org/licenses/LICENSE-2.0
// 
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
//  License for the specific language governing permissions and limitations under
//  the License.
//

#import "GTMNSImage+SearchCache.h"
#import "GTMDefines.h"

@implementation NSImage (GTMNSImageSearchCache)
+ (NSImage *)gtm_imageWithPath:(NSString *)path {
  return [[[NSImage alloc] initWithContentsOfFile:path] autorelease];
}

+ (NSImage *)gtm_imageNamed:(NSString *)name {
  return [self gtm_imageNamed:name forBundle:nil];
}

+ (NSImage *)gtm_imageNamed:(NSString *)name forBundle:(NSBundle *)bundle {
  NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
  NSImage *image = nil;
  
  // Check our specified bundle first
  if (!image) {
    NSString *path = [bundle pathForImageResource:name];
    if (path) image = [self gtm_imageWithPath:path];
  }
  
  // Check the main bundle and the existing NSImage namespace
  if (!image) {
    image = [NSImage imageNamed:name];
  }
  
  // Search for an image with that path
  if (!image && ([name isAbsolutePath] || [name hasPrefix:@"~"])) {
    NSString *path = [name stringByStandardizingPath];
    if ([[NSFileManager defaultManager]
          fileExistsAtPath:path]) {
      image = [self gtm_imageWithPath:path];
      if (!image) {
        image = [workspace iconForFile:path]; 
      }
    }
  }  
  // Search for a matching bundle id
  if (!image) {
    NSString *path = [workspace absolutePathForAppBundleWithIdentifier:name];
    if (path) image = [workspace iconForFile:path]; ;
  }
  
  // Search for a file .extension or 'TYPE'
  // TODO(alcor): This ALWAYS returns an image for items with ' or . as prefix
  // We might not want this
  if ([name hasPrefix:@"'"] || [name hasPrefix:@"."]) {
    image = [workspace iconForFileType:name];
  }
  
  // Search for a UTI
  if ([name rangeOfString:@"."].location != NSNotFound) {    
    NSDictionary *dict
      = GTMCFAutorelease(UTTypeCopyDeclaration((CFStringRef)name));
    NSURL *url
      = GTMCFAutorelease(UTTypeCopyDeclaringBundleURL((CFStringRef)name));
    NSString *iconName = [dict objectForKey:(NSString *)kUTTypeIconFileKey];
    
    if (url && name) {
      NSString *path
        = [[NSBundle bundleWithPath:[url path]] pathForImageResource:iconName];
      if (path)
        image = [[[NSImage alloc] initWithContentsOfFile:path] autorelease];
    }
  }
  
  return image;
}
@end