00001
00002 @implementation BKThemeTemplate : CPObject
00003 {
00004 CPString _name;
00005 CPString _description;
00006 }
00007
00008 - (id)initWithCoder:(CPCoder)aCoder
00009 {
00010 self = [super init];
00011
00012 if (self)
00013 {
00014 _name = [aCoder decodeObjectForKey:@"BKThemeTemplateName"];
00015 _description = [aCoder decodeObjectForKey:@"BKThemeTemplateDescription"];
00016 }
00017
00018 return self;
00019 }
00020
00021 - (void)encodeWithCoder:(CPCoder)aCoder
00022 {
00023 [aCoder encodeObject:_name forKey:@"BKThemeTemplateName"];
00024 [aCoder encodeObject:_description forKey:@"BKThemeTemplateDescription"];
00025 }
00026
00027 @end
00028
00029 @implementation BKThemeObjectTemplate : CPView
00030 {
00031 CPString _label;
00032 id _themedObject;
00033 }
00034
00035 - (id)initWithCoder:(CPCoder)aCoder
00036 {
00037 self = [super init];
00038
00039 if (self)
00040 {
00041 _label = [aCoder decodeObjectForKey:@"BKThemeObjectTemplateLabel"];
00042 _themedObject = [aCoder decodeObjectForKey:@"BKThemeObjectTemplateThemedObject"];
00043 }
00044
00045 return self;
00046 }
00047
00048 - (void)encodeWithCoder:(CPCoder)aCoder
00049 {
00050 [aCoder encodeObject:_label forKey:@"BKThemeObjectTemplateLabel"];
00051 [aCoder encodeObject:_themedObject forKey:@"BKThemeObjectTemplateThemedObject"];
00052 }
00053
00054 @end
00055
00056 function BKThemeDescriptorClasses()
00057 {
00058
00059 var themeDescriptorClasses = [];
00060
00061 for (candidate in window)
00062 {
00063 var theClass = objj_getClass(candidate),
00064 theClassName = class_getName(theClass),
00065 index = theClassName.indexOf("ThemeDescriptor");
00066
00067 if ((index >= 0) && (index === theClassName.length - "ThemeDescriptor".length))
00068 themeDescriptorClasses.push(theClass);
00069 }
00070
00071 return themeDescriptorClasses;
00072 }
00073
00074 function BKThemeObjectTemplatesForClass(aClass)
00075 {
00076 var templates = [],
00077 methods = class_copyMethodList(aClass.isa),
00078 count = [methods count];
00079
00080 while (count--)
00081 {
00082 var method = methods[count],
00083 selector = method_getName(method);
00084
00085 if (selector.indexOf("themed") === 0)
00086 {
00087 var impl = method_getImplementation(method),
00088 object = impl(aClass, selector);
00089
00090 if (object)
00091 {
00092 var template = [[BKThemeObjectTemplate alloc] init];
00093
00094 [template setValue:object forKey:@"themedObject"];
00095 [template setValue:BKLabelFromIdentifier(selector) forKey:@"label"];
00096
00097 [templates addObject:template];
00098 }
00099 }
00100 }
00101
00102 return templates;
00103 }
00104
00105 function BKLabelFromIdentifier(anIdentifier)
00106 {
00107 var string = anIdentifier.substr("themed".length);
00108 index = 0,
00109 count = string.length,
00110 label = "",
00111 lastCapital = null,
00112 isLeadingCapital = YES;
00113
00114 for (; index < count; ++index)
00115 {
00116 var character = string.charAt(index),
00117 isCapital = /^[A-Z]/.test(character);
00118
00119 if (isCapital)
00120 {
00121 if (!isLeadingCapital)
00122 {
00123 if (lastCapital === null)
00124 label += ' ' + character.toLowerCase();
00125 else
00126 label += character;
00127 }
00128
00129 lastCapital = character;
00130 }
00131 else
00132 {
00133 if (isLeadingCapital && lastCapital !== null)
00134 label += lastCapital;
00135
00136 label += character;
00137
00138 lastCapital = null;
00139 isLeadingCapital = NO;
00140 }
00141 }
00142
00143 return label;
00144 }
00145