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
00051 @implementation CPPasteboard : CPObject
00052 {
00053 CPArray _types;
00054 CPDictionary _owners;
00055 CPDictionary _provided;
00056
00057 unsigned _changeCount;
00058 CPString _stateUID;
00059 }
00060
00061
00062
00063
00064 + (void)initialize
00065 {
00066 if (self != [CPPasteboard class])
00067 return;
00068
00069 [self setVersion:1.0];
00070
00071 CPPasteboards = [CPDictionary dictionary];
00072 }
00073
00077 + (id)generalPasteboard
00078 {
00079 return [CPPasteboard pasteboardWithName:CPGeneralPboard];
00080 }
00081
00087 + (id)pasteboardWithName:(CPString)aName
00088 {
00089 var pasteboard = [CPPasteboards objectForKey:aName];
00090
00091 if (pasteboard)
00092 return pasteboard;
00093
00094 pasteboard = [[CPPasteboard alloc] _initWithName:aName];
00095 [CPPasteboards setObject:pasteboard forKey:aName];
00096
00097 return pasteboard;
00098 }
00099
00100
00101 - (id)_initWithName:(CPString)aName
00102 {
00103 self = [super init];
00104
00105 if (self)
00106 {
00107 _name = aName;
00108 _types = [];
00109
00110 _owners = [CPDictionary dictionary];
00111 _provided = [CPDictionary dictionary];
00112
00113 _changeCount = 0;
00114 }
00115
00116 return self;
00117 }
00118
00125 - (unsigned)addTypes:(CPArray)types owner:(id)anOwner
00126 {
00127 var i = 0,
00128 count = types.length;
00129
00130 for (; i < count; ++i)
00131 {
00132 var type = types[i];
00133
00134 if(![_owners objectForKey:type])
00135 {
00136 [_types addObject:type];
00137 [_provided removeObjectForKey:type];
00138 }
00139
00140 [_owners setObject:anOwner forKey:type];
00141 }
00142
00143 return ++_changeCount;
00144 }
00145
00152 - (unsigned)declareTypes:(CPArray)types owner:(id)anOwner
00153 {
00154 [_types setArray:types];
00155
00156 _owners = [CPDictionary dictionary];
00157 _provided = [CPDictionary dictionary];
00158
00159 var count = _types.length;
00160
00161 while (count--)
00162 [_owners setObject:anOwner forKey:_types[count]];
00163
00164 return ++_changeCount;
00165 }
00166
00173 - (BOOL)setData:(CPData)aData forType:(CPString)aType
00174 {
00175 [_provided setObject:aData forKey:aType];
00176
00177 return YES;
00178 }
00179
00186 - (BOOL)setPropertyList:(id)aPropertyList forType:(CPString)aType
00187 {
00188 return [self setData:[CPPropertyListSerialization dataFromPropertyList:aPropertyList format:CPPropertyListXMLFormat_v1_0 errorDescription:nil] forType:aType];
00189 }
00190
00197 - (void)setString:(CPString)aString forType:(CPString)aType
00198 {
00199 return [self setPropertyList:aString forType:aType];
00200 }
00201
00202
00209 - (CPString)availableTypeFromArray:(CPArray)anArray
00210 {
00211 return [_types firstObjectCommonWithArray:anArray];
00212 }
00213
00217 - (CPArray)types
00218 {
00219 return _types;
00220 }
00221
00222
00226 - (unsigned)changeCount
00227 {
00228 return _changeCount;
00229 }
00230
00236 - (CPData)dataForType:(CPString)aType
00237 {
00238 var data = [_provided objectForKey:aType];
00239
00240 if (data)
00241 return data;
00242
00243 var owner = [_owners objectForKey:aType];
00244
00245 if (owner)
00246 {
00247 [owner pasteboard:self provideDataForType:aType];
00248
00249 ++_changeCount;
00250
00251 return [_provided objectForKey:aType];
00252 }
00253
00254 return nil;
00255 }
00256
00262 - (id)propertyListForType:(CPString)aType
00263 {
00264 var data = [self dataForType:aType];
00265
00266 if (data)
00267 return [CPPropertyListSerialization propertyListFromData:data format:CPPropertyListXMLFormat_v1_0 errorDescription:nil];
00268
00269 return nil;
00270 }
00271
00277 - (CPString)stringForType:(CPString)aType
00278 {
00279 return [self propertyListForType:aType];
00280 }
00281
00282
00283 - (CPString)_generateStateUID
00284 {
00285 var bits = 32;
00286
00287 _stateUID = @"";
00288
00289 while (bits--)
00290 _stateUID += FLOOR(RAND() * 16.0).toString(16).toUpperCase();
00291
00292 return _stateUID;
00293 }
00294
00295
00296 - (CPString)_stateUID
00297 {
00298 return _stateUID;
00299 }
00300
00301 @end