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 CPImagesPboardType = @"CPImagesPboardType";
00042 CPVideosPboardType = @"CPVideosPboardType";
00043
00044
00045 CPImagePboardType = @"CPImagePboardType";
00046
00047 var CPPasteboards = nil;
00048
00055 @implementation CPPasteboard : CPObject
00056 {
00057 CPArray _types;
00058 CPDictionary _owners;
00059 CPDictionary _provided;
00060
00061 unsigned _changeCount;
00062 CPString _stateUID;
00063 }
00064
00065
00066
00067
00068 + (void)initialize
00069 {
00070 if (self != [CPPasteboard class])
00071 return;
00072
00073 [self setVersion:1.0];
00074
00075 CPPasteboards = [CPDictionary dictionary];
00076 }
00077
00081 + (id)generalPasteboard
00082 {
00083 return [CPPasteboard pasteboardWithName:CPGeneralPboard];
00084 }
00085
00091 + (id)pasteboardWithName:(CPString)aName
00092 {
00093 var pasteboard = [CPPasteboards objectForKey:aName];
00094
00095 if (pasteboard)
00096 return pasteboard;
00097
00098 pasteboard = [[CPPasteboard alloc] _initWithName:aName];
00099 [CPPasteboards setObject:pasteboard forKey:aName];
00100
00101 return pasteboard;
00102 }
00103
00104
00105 - (id)_initWithName:(CPString)aName
00106 {
00107 self = [super init];
00108
00109 if (self)
00110 {
00111 _name = aName;
00112 _types = [];
00113
00114 _owners = [CPDictionary dictionary];
00115 _provided = [CPDictionary dictionary];
00116
00117 _changeCount = 0;
00118 }
00119
00120 return self;
00121 }
00122
00129 - (unsigned)addTypes:(CPArray)types owner:(id)anOwner
00130 {
00131 var i = 0,
00132 count = types.length;
00133
00134 for (; i < count; ++i)
00135 {
00136 var type = types[i];
00137
00138 if(![_owners objectForKey:type])
00139 {
00140 [_types addObject:type];
00141 [_provided removeObjectForKey:type];
00142 }
00143
00144 [_owners setObject:anOwner forKey:type];
00145 }
00146
00147 return ++_changeCount;
00148 }
00149
00156 - (unsigned)declareTypes:(CPArray)types owner:(id)anOwner
00157 {
00158 [_types setArray:types];
00159
00160 _owners = [CPDictionary dictionary];
00161 _provided = [CPDictionary dictionary];
00162
00163 var count = _types.length;
00164
00165 while (count--)
00166 [_owners setObject:anOwner forKey:_types[count]];
00167
00168 return ++_changeCount;
00169 }
00170
00177 - (BOOL)setData:(CPData)aData forType:(CPString)aType
00178 {
00179 [_provided setObject:aData forKey:aType];
00180
00181 return YES;
00182 }
00183
00190 - (BOOL)setPropertyList:(id)aPropertyList forType:(CPString)aType
00191 {
00192 return [self setData:[CPPropertyListSerialization dataFromPropertyList:aPropertyList format:CPPropertyListXMLFormat_v1_0 errorDescription:nil] forType:aType];
00193 }
00194
00201 - (void)setString:(CPString)aString forType:(CPString)aType
00202 {
00203 return [self setPropertyList:aString forType:aType];
00204 }
00205
00206
00213 - (CPString)availableTypeFromArray:(CPArray)anArray
00214 {
00215 return [_types firstObjectCommonWithArray:anArray];
00216 }
00217
00221 - (CPArray)types
00222 {
00223 return _types;
00224 }
00225
00226
00230 - (unsigned)changeCount
00231 {
00232 return _changeCount;
00233 }
00234
00240 - (CPData)dataForType:(CPString)aType
00241 {
00242 var data = [_provided objectForKey:aType];
00243
00244 if (data)
00245 return data;
00246
00247 var owner = [_owners objectForKey:aType];
00248
00249 if (owner)
00250 {
00251 [owner pasteboard:self provideDataForType:aType];
00252
00253 ++_changeCount;
00254
00255 return [_provided objectForKey:aType];
00256 }
00257
00258 return nil;
00259 }
00260
00266 - (id)propertyListForType:(CPString)aType
00267 {
00268 var data = [self dataForType:aType];
00269
00270 if (data)
00271 return [CPPropertyListSerialization propertyListFromData:data format:CPPropertyListXMLFormat_v1_0 errorDescription:nil];
00272
00273 return nil;
00274 }
00275
00281 - (CPString)stringForType:(CPString)aType
00282 {
00283 return [self propertyListForType:aType];
00284 }
00285
00286
00287 - (CPString)_generateStateUID
00288 {
00289 var bits = 32;
00290
00291 _stateUID = @"";
00292
00293 while (bits--)
00294 _stateUID += FLOOR(RAND() * 16.0).toString(16).toUpperCase();
00295
00296 return _stateUID;
00297 }
00298
00299
00300 - (CPString)_stateUID
00301 {
00302 return _stateUID;
00303 }
00304
00305 @end