![]() |
API 0.9.5
|
00001 /* 00002 * CPKeyValueBinding.j 00003 * Foundation 00004 * 00005 * Created by Ross Boucher 2/15/09 00006 * Copyright 280 North, Inc. 00007 * 00008 * Adapted from GNUStep 00009 * Released under the LGPL. 00010 * 00011 * This library is free software; you can redistribute it and/or 00012 * modify it under the terms of the GNU Lesser General Public 00013 * License as published by the Free Software Foundation; either 00014 * version 2.1 of the License, or (at your option) any later version. 00015 * 00016 * This library is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 * Lesser General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU Lesser General Public 00022 * License along with this library; if not, write to the Free Software 00023 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00024 */ 00025 00026 00027 var transformerMap = [CPDictionary dictionary]; 00028 @implementation CPValueTransformer : CPObject 00029 { 00030 id __doxygen__; 00031 } 00032 00033 + (void)initialize 00034 { 00035 if (self !== [CPValueTransformer class]) 00036 return; 00037 00038 [CPValueTransformer setValueTransformer:[[CPNegateBooleanTransformer alloc] init] forName:CPNegateBooleanTransformerName]; 00039 [CPValueTransformer setValueTransformer:[[CPIsNilTransformer alloc] init] forName:CPIsNilTransformerName]; 00040 [CPValueTransformer setValueTransformer:[[CPIsNotNilTransformer alloc] init] forName:CPIsNotNilTransformerName]; 00041 [CPValueTransformer setValueTransformer:[[CPUnarchiveFromDataTransformer alloc] init] forName:CPUnarchiveFromDataTransformerName]; 00042 } 00043 00044 + (void)setValueTransformer:(CPValueTransformer)transformer forName:(CPString)aName 00045 { 00046 [transformerMap setObject:transformer forKey:aName]; 00047 } 00048 00049 + (CPValueTransformer)valueTransformerForName:(CPString)aName 00050 { 00051 return [transformerMap objectForKey:aName]; 00052 } 00053 00054 + (CPArray)valueTransformerNames 00055 { 00056 return [transformerMap allKeys]; 00057 } 00058 00059 + (BOOL)allowsReverseTransformation 00060 { 00061 return NO; 00062 } 00063 00064 + (Class)transformedValueClass 00065 { 00066 return [CPObject class]; 00067 } 00068 00069 - (id)reverseTransformedValue:(id)aValue 00070 { 00071 if (![[self class] allowsReverseTransformation]) 00072 { 00073 [CPException raise:CPInvalidArgumentException reason:(self + " is not reversible.")]; 00074 } 00075 00076 return [self transformedValue:aValue]; 00077 } 00078 00079 - (id)transformedValue:(id)aValue 00080 { 00081 return nil; 00082 } 00083 00084 @end 00085 00086 // built-in transformers 00087 @implementation CPNegateBooleanTransformer : CPValueTransformer 00088 { 00089 id __doxygen__; 00090 } 00091 00092 + (BOOL)allowsReverseTransformation 00093 { 00094 return YES; 00095 } 00096 00097 + (Class)transformedValueClass 00098 { 00099 return [CPNumber class]; 00100 } 00101 00102 - (id)reverseTransformedValue:(id)aValue 00103 { 00104 return ![aValue boolValue]; 00105 } 00106 00107 - (id)transformedValue:(id)aValue 00108 { 00109 return ![aValue boolValue]; 00110 } 00111 00112 @end 00113 @implementation CPIsNilTransformer : CPValueTransformer 00114 { 00115 id __doxygen__; 00116 } 00117 00118 + (BOOL)allowsReverseTransformation 00119 { 00120 return NO; 00121 } 00122 00123 + (Class)transformedValueClass 00124 { 00125 return [CPNumber class]; 00126 } 00127 00128 - (id)transformedValue:(id)aValue 00129 { 00130 return aValue === nil || aValue === undefined; 00131 } 00132 00133 @end 00134 @implementation CPIsNotNilTransformer : CPValueTransformer 00135 { 00136 id __doxygen__; 00137 } 00138 00139 + (BOOL)allowsReverseTransformation 00140 { 00141 return NO; 00142 } 00143 00144 + (Class)transformedValueClass 00145 { 00146 return [CPNumber class]; 00147 } 00148 00149 - (id)transformedValue:(id)aValue 00150 { 00151 return aValue !== nil && aValue !== undefined; 00152 } 00153 00154 @end 00155 @implementation CPUnarchiveFromDataTransformer : CPValueTransformer 00156 { 00157 id __doxygen__; 00158 } 00159 00160 + (BOOL)allowsReverseTransformation 00161 { 00162 return YES; 00163 } 00164 00165 + (Class)transformedValueClass 00166 { 00167 return [CPData class]; 00168 } 00169 00170 - (id)reverseTransformedValue:(id)aValue 00171 { 00172 return [CPKeyedArchiver archivedDataWithRootObject:aValue]; 00173 } 00174 00175 - (id)transformedValue:(id)aValue 00176 { 00177 return [CPKeyedUnarchiver unarchiveObjectWithData:aValue]; 00178 } 00179 00180 @end 00181 00182 CPNegateBooleanTransformerName = @"CPNegateBoolean"; 00183 CPIsNilTransformerName = @"CPIsNil"; 00184 CPIsNotNilTransformerName = @"CPIsNotNil"; 00185 CPUnarchiveFromDataTransformerName = @"CPUnarchiveFromData"; 00186 CPKeyedUnarchiveFromDataTransformerName = @"CPKeyedUnarchiveFromData";