/AppKit/Cib/_CPCibCustomResource.j

http://github.com/cacaodev/cappuccino · Unknown · 224 lines · 181 code · 43 blank · 0 comment · 0 complexity · 941a2c25b939323d9363d3999a931829 MD5 · raw file

  1. /*
  2. * _CPCibCustomResource.j
  3. * AppKit
  4. *
  5. * Portions based on NSCustomResource.m (01/08/2009) in Cocotron (http://www.cocotron.org/)
  6. * Copyright (c) 2006-2007 Christopher J. W. Lloyd
  7. *
  8. * Created by Francisco Tolmasky.
  9. * Copyright 2009, 280 North, Inc.
  10. *
  11. * This library is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU Lesser General Public
  13. * License as published by the Free Software Foundation; either
  14. * version 2.1 of the License, or (at your option) any later version.
  15. *
  16. * This library is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public
  22. * License along with this library; if not, write to the Free Software
  23. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  24. */
  25. @import <Foundation/CPObject.j>
  26. @import <Foundation/CPString.j>
  27. @import "CPCompatibility.j"
  28. @import "CPImage.j"
  29. @import "CPTheme.j"
  30. @class CPButtonBar
  31. @class CPView
  32. var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey",
  33. _CPCibCustomResourceResourceNameKey = @"_CPCibCustomResourceResourceNameKey",
  34. _CPCibCustomResourcePropertiesKey = @"_CPCibCustomResourcePropertiesKey",
  35. _CPCibCustomResourceTemplateImageMap = nil;
  36. @implementation _CPCibCustomResource : CPObject
  37. {
  38. CPString _className;
  39. CPString _resourceName;
  40. CPDictionary _properties;
  41. CPBundle _bundle;
  42. }
  43. + (void)initialize
  44. {
  45. if (self !== [_CPCibCustomResource class])
  46. return;
  47. _CPCibCustomResourceTemplateImageMap = @{
  48. "CPAddTemplate": "button-image-plus",
  49. "CPRemoveTemplate": "button-image-minus"
  50. };
  51. }
  52. + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize
  53. {
  54. return [[self alloc] initWithClassName:@"CPImage" resourceName:aResourceName properties:@{ @"size": aSize }];
  55. }
  56. + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize bundleClass:(CPString)aBundleClass
  57. {
  58. return [[self alloc] initWithClassName:@"CPImage" resourceName:aResourceName properties:@{ @"size": aSize, @"bundleClass": aBundleClass }];
  59. }
  60. - (id)initWithClassName:(CPString)aClassName resourceName:(CPString)aResourceName properties:(CPDictionary)properties
  61. {
  62. self = [super init];
  63. if (self)
  64. {
  65. _className = aClassName;
  66. _resourceName = aResourceName;
  67. _properties = properties;
  68. _bundle = nil;
  69. }
  70. return self;
  71. }
  72. - (id)initWithCoder:(CPCoder)aCoder
  73. {
  74. self = [super init];
  75. if (self)
  76. {
  77. _className = [aCoder decodeObjectForKey:_CPCibCustomResourceClassNameKey];
  78. _resourceName = [aCoder decodeObjectForKey:_CPCibCustomResourceResourceNameKey];
  79. _properties = [aCoder decodeObjectForKey:_CPCibCustomResourcePropertiesKey];
  80. _bundle = nil;
  81. }
  82. return self;
  83. }
  84. - (void)encodeWithCoder:(CPCoder)aCoder
  85. {
  86. [aCoder encodeObject:_className forKey:_CPCibCustomResourceClassNameKey];
  87. [aCoder encodeObject:_resourceName forKey:_CPCibCustomResourceResourceNameKey];
  88. [aCoder encodeObject:_properties forKey:_CPCibCustomResourcePropertiesKey];
  89. }
  90. - (id)awakeAfterUsingCoder:(CPCoder)aCoder
  91. {
  92. if ([aCoder respondsToSelector:@selector(bundle)] &&
  93. (![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources]))
  94. if (_className === @"CPImage")
  95. {
  96. var templateImage = [_CPCibCustomResourceTemplateImageMap objectForKey:_resourceName];
  97. if (templateImage)
  98. return [[CPTheme defaultTheme] valueForAttributeWithName:templateImage forClass:[CPButtonBar class]];
  99. else
  100. return [self imageFromCoder:aCoder];
  101. }
  102. return self;
  103. }
  104. @end
  105. @implementation _CPCibCustomResource (CPImage)
  106. - (CPBundle)imageBundleWithCoder:(CPCoder)aCoder
  107. {
  108. if (_bundle)
  109. return _bundle;
  110. var bundleIdentifier = [_properties valueForKey:@"bundleIdentifier"];
  111. if (bundleIdentifier)
  112. _bundle = [CPBundle bundleWithIdentifier:bundleIdentifier];
  113. else
  114. {
  115. var bundleClass = [_properties valueForKey:@"bundleClass"];
  116. if (bundleClass)
  117. {
  118. bundleClass = CPClassFromString(bundleClass);
  119. if (bundleClass)
  120. _bundle = [CPBundle bundleForClass:bundleClass];
  121. }
  122. }
  123. if (!_bundle)
  124. {
  125. var framework = [_properties valueForKey:@"framework"];
  126. if (framework)
  127. {
  128. // Get AppKit and hope the framework is in the same directory
  129. var appKit = [CPBundle bundleForClass:[CPView class]],
  130. url = [[appKit bundleURL] URLByDeletingLastPathComponent];
  131. url = [CPURL URLWithString:framework relativeToURL:url];
  132. _bundle = [CPBundle bundleWithURL:url];
  133. }
  134. }
  135. if (!_bundle)
  136. {
  137. if (aCoder)
  138. _bundle = [aCoder bundle];
  139. else
  140. _bundle = [CPBundle mainBundle];
  141. }
  142. return _bundle;
  143. }
  144. - (CPImage)imageFromCoder:(CPCoder)aCoder
  145. {
  146. return [[CPImage alloc] initWithContentsOfFile:[[self imageBundleWithCoder:aCoder] pathForResource:_resourceName] size:[_properties valueForKey:@"size"]];
  147. }
  148. - (CPString)filename
  149. {
  150. return [[self imageBundleWithCoder:nil] pathForResource:_resourceName];
  151. }
  152. - (CGSize)size
  153. {
  154. return [_properties objectForKey:@"size"];
  155. }
  156. - (BOOL)isSingleImage
  157. {
  158. return YES;
  159. }
  160. - (BOOL)isThreePartImage
  161. {
  162. return NO;
  163. }
  164. - (BOOL)isNinePartImage
  165. {
  166. return NO;
  167. }
  168. - (unsigned)loadStatus
  169. {
  170. return CPImageLoadStatusCompleted;
  171. }
  172. - (id)delegate
  173. {
  174. return nil;
  175. }
  176. - (CPString)description
  177. {
  178. var image = [self imageFromCoder:nil];
  179. return [image description];
  180. }
  181. @end