00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import <Foundation/CPObject.j>
00024 @import <Foundation/CPArray.j>
00025 @import <Foundation/CPDictionary.j>
00026 @import <Foundation/CPPropertyListSerialization.j>
00027
00028
00029 CPGeneralPboard = @"CPGeneralPboard";
00030 CPFontPboard = @"CPFontPboard";
00031 CPRulerPboard = @"CPRulerPboard";
00032 CPFindPboard = @"CPFindPboard";
00033 CPDragPboard = @"CPDragPboard";
00034
00035 CPColorPboardType = @"CPColorPboardType";
00036 CPFilenamesPboardType = @"CPFilenamesPboardType";
00037 CPFontPboardType = @"CPFontPboardType";
00038 CPHTMLPboardType = @"CPHTMLPboardType";
00039 CPStringPboardType = @"CPStringPboardType";
00040 CPURLPboardType = @"CPURLPboardType";
00041 CPImagePboardType = @"CPImagePboardType";
00042
00043 var CPPasteboards = nil;
00044
00049 @implementation CPPasteboard : CPObject
00050 {
00051 CPArray _types;
00052 CPDictionary _owners;
00053 CPDictionary _provided;
00054
00055 unsigned _changeCount;
00056 CPString _stateUID;
00057 }
00058
00059
00060
00061
00062 + (void)initialize
00063 {
00064 if (self != [CPPasteboard class])
00065 return;
00066
00067 [self setVersion:1.0];
00068
00069 CPPasteboards = [CPDictionary dictionary];
00070 }
00071
00075 + (id)generalPasteboard
00076 {
00077 return [CPPasteboard pasteboardWithName:CPGeneralPboard];
00078 }
00079
00085 + (id)pasteboardWithName:(CPString)aName
00086 {
00087 var pasteboard = [CPPasteboards objectForKey:aName];
00088
00089 if (pasteboard)
00090 return pasteboard;
00091
00092 pasteboard = [[CPPasteboard alloc] _initWithName:aName];
00093 [CPPasteboards setObject:pasteboard forKey:aName];
00094
00095 return pasteboard;
00096 }
00097
00098
00099 - (id)_initWithName:(CPString)aName
00100 {
00101 self = [super init];
00102
00103 if (self)
00104 {
00105 _name = aName;
00106 _types = [];
00107
00108 _owners = [CPDictionary dictionary];
00109 _provided = [CPDictionary dictionary];
00110
00111 _changeCount = 0;
00112 }
00113
00114 return self;
00115 }
00116
00123 - (unsigned)addTypes:(CPArray)types owner:(id)anOwner
00124 {
00125 var i = 0,
00126 count = types.length;
00127
00128 for (; i < count; ++i)
00129 {
00130 var type = types[i];
00131
00132 if(![_owners objectForKey:type])
00133 {
00134 [_types addObject:type];
00135 [_provided removeObjectForKey:type];
00136 }
00137
00138 [_owners setObject:anOwner forKey:type];
00139 }
00140
00141 return ++_changeCount;
00142 }
00143
00150 - (unsigned)declareTypes:(CPArray)types owner:(id)anOwner
00151 {
00152 [_types setArray:types];
00153
00154 _owners = [CPDictionary dictionary];
00155 _provided = [CPDictionary dictionary];
00156
00157 var count = _types.length;
00158
00159 while (count--)
00160 [_owners setObject:anOwner forKey:_types[count]];
00161
00162 return ++_changeCount;
00163 }
00164
00171 - (BOOL)setData:(CPData)aData forType:(CPString)aType
00172 {
00173 [_provided setObject:aData forKey:aType];
00174
00175 return YES;
00176 }
00177
00184 - (BOOL)setPropertyList:(id)aPropertyList forType:(CPString)aType
00185 {
00186 return [self setData:[CPPropertyListSerialization dataFromPropertyList:aPropertyList format:CPPropertyListXMLFormat_v1_0 errorDescription:nil] forType:aType];
00187 }
00188
00195 - (void)setString:(CPString)aString forType:(CPString)aType
00196 {
00197 return [self setPropertyList:aString forType:aType];
00198 }
00199
00200
00207 - (CPString)availableTypeFromArray:(CPArray)anArray
00208 {
00209 return [_types firstObjectCommonWithArray:anArray];
00210 }
00211
00215 - (CPArray)types
00216 {
00217 return _types;
00218 }
00219
00220
00224 - (unsigned)changeCount
00225 {
00226 return _changeCount;
00227 }
00228
00234 - (CPData)dataForType:(CPString)aType
00235 {
00236 var data = [_provided objectForKey:aType];
00237
00238 if (data)
00239 return data;
00240
00241 var owner = [_owners objectForKey:aType];
00242
00243 if (owner)
00244 {
00245 [owner pasteboard:self provideDataForType:aType];
00246
00247 ++_changeCount;
00248
00249 return [_provided objectForKey:aType];
00250 }
00251
00252 return nil;
00253 }
00254
00260 - (id)propertyListForType:(CPString)aType
00261 {
00262 var data = [self dataForType:aType];
00263
00264 if (data)
00265 return [CPPropertyListSerialization propertyListFromData:data format:CPPropertyListXMLFormat_v1_0 errorDescription:nil];
00266
00267 return nil;
00268 }
00269
00275 - (CPString)stringForType:(CPString)aType
00276 {
00277 return [self propertyListForType:aType];
00278 }
00279
00280
00281 - (CPString)_generateStateUID
00282 {
00283 var bits = 32;
00284
00285 _stateUID = @"";
00286
00287 while (bits--)
00288 _stateUID += FLOOR(RAND() * 16.0).toString(16).toUpperCase();
00289
00290 return _stateUID;
00291 }
00292
00293
00294 - (CPString)_stateUID
00295 {
00296 return _stateUID;
00297 }
00298
00299 @end