280north / cappuccino

Web Application Framework in JavaScript and Objective-J

This URL has Read+Write access

cappuccino / Tools / nib2cib / NSClassSwapper.j
3f27fca5 » tolmasky 2009-06-04 Added support for custom cl... 1 var NSClassSwapperClassNames = {},
2 NSClassSwapperOriginalClassNames = {};
3
4 var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey",
5 _CPCibClassSwapperOriginalClassNameKey = @"_CPCibClassSwapperOriginalClassNameKey";
6
7 @implementation NSClassSwapper : _CPCibClassSwapper
8 {
9 }
10
11 + (id)swapperClassForClassName:(CPString)aClassName originalClassName:(CPString)anOriginalClassName
12 {
13 var swapperClassName = "$NSClassSwapper_" + aClassName + "_" + anOriginalClassName;
14 swapperClass = objj_lookUpClass(swapperClassName);
15
16 if (!swapperClass)
17 {
18 var originalClass = objj_lookUpClass(anOriginalClassName);
19
20 swapperClass = objj_allocateClassPair(originalClass, swapperClassName);
21
22 objj_registerClassPair(swapperClass);
23
c42fb68d » tolmasky 2009-06-05 Made class swapping more ro... 24 class_addMethod(swapperClass, @selector(initWithCoder:), function(self, _cmd, aCoder)
3f27fca5 » tolmasky 2009-06-04 Added support for custom cl... 25 {
26 self = objj_msgSendSuper({super_class:originalClass, receiver:self}, _cmd, aCoder);
27
28 if (self)
29 {
30 var UID = [self UID];
31
32 NSClassSwapperClassNames[UID] = aClassName;
33 NSClassSwapperOriginalClassNames[UID] = anOriginalClassName;
34 }
35
36 return self;
37 }, "");
38
c42fb68d » tolmasky 2009-06-05 Made class swapping more ro... 39 class_addMethod(swapperClass, @selector(classForKeyedArchiver), function(self, _cmd)
3f27fca5 » tolmasky 2009-06-04 Added support for custom cl... 40 {
41 return [_CPCibClassSwapper class];
42 }, "");
43
44 class_addMethod(swapperClass, @selector(encodeWithCoder:), function(self, _cmd, aCoder)
45 {
46 objj_msgSendSuper({super_class:originalClass, receiver:self}, _cmd, aCoder);
47
48 // FIXME: map class name as well?
49 [aCoder encodeObject:aClassName forKey:_CPCibClassSwapperClassNameKey];
50 [aCoder encodeObject:CP_NSMapClassName(anOriginalClassName) forKey:_CPCibClassSwapperOriginalClassNameKey];
51 }, "");
c42fb68d » tolmasky 2009-06-05 Made class swapping more ro... 52 }
3f27fca5 » tolmasky 2009-06-04 Added support for custom cl... 53
54 return swapperClass;
55 }
56
57 + (id)allocWithCoder:(CPCoder)aCoder
58 {
59 var className = [aCoder decodeObjectForKey:@"NSClassName"],
60 originalClassName = [aCoder decodeObjectForKey:@"NSOriginalClassName"];
61
62 return [[self swapperClassForClassName:className originalClassName:originalClassName] alloc];
63 }
64
65 @end
66