Files
cappuccino/Tools/nib2cib/NSCustomResource.j
T
Aparajita Fishman d6f1c2bc57 Fixed: attempting to use an unsupported built in image in IB would generate an error, but not explain why.
Previously, attempting to use an unsupported built in image such as NSActionTemplate would generate an error message that said, "The image “NSActionTemplate” cannot be found." This would lead the user to think that there was something wrong with nib2cib, instead of understanding that only certain built in images are supported (currently NSAddTemplate and NSRemoveTemplate).

With this commit, an attempt to use an unsupported built in image (where built in is assumed to be any name that matches /^NS[A-Z][A-Za-z]+$/) results in the error message "The built in image “<name>” is not supported."
2013-08-12 15:18:07 -04:00

137 lines
4.3 KiB
Plaintext

/*
* NSCustomResource.j
* nib2cib
*
* Portions based on NSCustomResource.m (01/08/2009) in Cocotron (http://www.cocotron.org/)
* Copyright (c) 2006-2007 Christopher J. W. Lloyd
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <AppKit/_CPCibCustomResource.j>
@import "Nib2CibException.j"
@global CP_NSMapClassName
var FILE = require("file"),
imageSize = require("cappuccino/imagesize").imagesize,
supportedTemplateImages = [
"NSAddTemplate",
"NSRemoveTemplate"
];
@implementation _CPCibCustomResource (NSCoding)
- (id)NS_initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_className = CP_NSMapClassName([aCoder decodeObjectForKey:@"NSClassName"]);
_resourceName = [aCoder decodeObjectForKey:@"NSResourceName"];
var size = CGSizeMakeZero(),
framework = @"",
bundleIdentifier = @"";
if (_resourceName == "NSSwitch")
return nil;
else if (/^NS[A-Z][A-Za-z]+$/.test(_resourceName))
{
if (supportedTemplateImages.indexOf(_resourceName) >= 0)
{
// Defer resolving this path until runtime.
_resourceName = _resourceName.replace("NS", "CP");
}
else
[CPException raise:Nib2CibException format:@"The built in image “%@” is not supported.", _resourceName];
}
else
{
var match = /^(.+)@(.+)$/.exec(_resourceName);
if (match)
{
_resourceName = match[1];
framework = match[2];
}
var resourceInfo = [aCoder resourceInfoForName:_resourceName inFramework:framework];
if (!resourceInfo)
CPLog.warn("Resource \"" + _resourceName + "\" not found in the Resources directories");
else
{
size = imageSize(FILE.canonical(resourceInfo.path)) || CGSizeMakeZero();
framework = resourceInfo.framework;
}
// Account for the fact that an extension may have been inferred.
if (resourceInfo && resourceInfo.path)
{
// Include subdirectories in the name
match = /^.+\/Resources\/(.+)$/.exec(resourceInfo.path)
_resourceName = match[1];
}
}
if (resourceInfo && resourceInfo.path && resourceInfo.framework)
{
var frameworkPath = FILE.dirname(FILE.dirname(resourceInfo.path)),
bundle = [CPBundle bundleWithPath:frameworkPath];
[bundle loadWithDelegate:nil];
bundleIdentifier = [bundle bundleIdentifier] || @"";
}
_properties = @{ @"size":size, @"bundleIdentifier":bundleIdentifier, @"framework":framework };
CPLog.debug(" Resource: %s\n Framework: %s%s\n Path: %s\n Size: %d x %d",
_resourceName,
framework ? framework : "<none>",
bundleIdentifier ? " (" + bundleIdentifier + ")" :
framework ? " (<no bundle identifier>)" : "",
resourceInfo ? FILE.canonical(resourceInfo.path) : "",
size.width,
size.height);
}
return self;
}
@end
@implementation NSCustomResource : _CPCibCustomResource
{
}
- (id)initWithCoder:(CPCoder)aCoder
{
return [self NS_initWithCoder:aCoder];
}
- (Class)classForKeyedArchiver
{
return [_CPCibCustomResource class];
}
@end