API 0.9.5
Foundation/CPValueTransformer.j
Go to the documentation of this file.
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";
 All Classes Files Functions Variables Defines