00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import "CPControl.j"
00024 @import "CPStringDrawing.j"
00025
00026 #include "Platform/Platform.h"
00027 #include "Platform/DOM/CPDOMDisplayServer.h"
00028
00029
00030
00031
00032
00033
00034 CPLineBreakByWordWrapping = 0;
00035
00036
00037
00038
00039 CPLineBreakByCharWrapping = 1;
00040
00041
00042
00043
00044 CPLineBreakByClipping = 2;
00045
00046
00047
00048
00049 CPLineBreakByTruncatingHead = 3;
00050
00051
00052
00053
00054 CPLineBreakByTruncatingTail = 4;
00055
00056
00057
00058
00059 CPLineBreakByTruncatingMiddle = 5;
00060
00061
00062
00063
00064
00065
00066 CPTextFieldSquareBezel = 0;
00067
00068
00069
00070
00071
00072 CPTextFieldRoundedBezel = 1;
00073
00074 var TOP_PADDING = 4.0,
00075 BOTTOM_PADDING = 3.0;
00076 HORIZONTAL_PADDING = 3.0;
00077
00078 #if PLATFORM(DOM)
00079 var CPTextFieldDOMInputElement = nil;
00080 #endif
00081
00082 var _CPTextFieldSquareBezelColor = nil,
00083 _CPTextFieldRoundedBezelColor = nil;
00084
00085 @implementation CPString (CPTextFieldAdditions)
00086
00090 - (CPString)string
00091 {
00092 return self;
00093 }
00094
00095 @end
00096
00100 @implementation CPTextField : CPControl
00101 {
00102 BOOL _isEditable;
00103 BOOL _isSelectable;
00104
00105 BOOL _isBordered;
00106 BOOL _isBezeled;
00107 CPTextFieldBezelStyle _bezelStyle;
00108 BOOL _drawsBackground;
00109
00110 CPLineBreakMode _lineBreakMode;
00111 CPColor _textFieldBackgroundColor;
00112
00113 id _placeholderString;
00114
00115 id _delegate;
00116
00117 CPString _textDidChangeValue;
00118
00119 #if PLATFORM(DOM)
00120 DOMElement _DOMTextElement;
00121 #endif
00122 }
00123
00124
00125 #if PLATFORM(DOM)
00126 + (DOMElement)_inputElement
00127 {
00128 if (!CPTextFieldDOMInputElement)
00129 {
00130 CPTextFieldDOMInputElement = document.createElement("input");
00131 CPTextFieldDOMInputElement.style.position = "absolute";
00132 CPTextFieldDOMInputElement.style.top = "0px";
00133 CPTextFieldDOMInputElement.style.left = "0px";
00134 CPTextFieldDOMInputElement.style.width = "100%"
00135 CPTextFieldDOMInputElement.style.height = "100%";
00136 CPTextFieldDOMInputElement.style.border = "0px";
00137 CPTextFieldDOMInputElement.style.padding = "0px";
00138 CPTextFieldDOMInputElement.style.whiteSpace = "pre";
00139 CPTextFieldDOMInputElement.style.background = "transparent";
00140 CPTextFieldDOMInputElement.style.outline = "none";
00141 CPTextFieldDOMInputElement.style.paddingLeft = HORIZONTAL_PADDING - 1.0 + "px";
00142 CPTextFieldDOMInputElement.style.paddingTop = TOP_PADDING - 2.0 + "px";
00143 }
00144
00145 return CPTextFieldDOMInputElement;
00146 }
00147 #endif
00148
00149 - (id)initWithFrame:(CGRect)aFrame
00150 {
00151 self = [super initWithFrame:aFrame];
00152
00153 if (self)
00154 {
00155 _value = "";
00156 _placeholderString = "";
00157
00158 _sendActionOn = CPKeyUpMask | CPKeyDownMask;
00159
00160 #if PLATFORM(DOM)
00161 _DOMTextElement = document.createElement("div");
00162 _DOMTextElement.style.position = "absolute";
00163 _DOMTextElement.style.top = TOP_PADDING + "px";
00164 _DOMTextElement.style.left = HORIZONTAL_PADDING + "px";
00165 _DOMTextElement.style.width = MAX(0.0, CGRectGetWidth(aFrame) - 2.0 * HORIZONTAL_PADDING) + "px";
00166 _DOMTextElement.style.height = MAX(0.0, CGRectGetHeight(aFrame) - TOP_PADDING - BOTTOM_PADDING) + "px";
00167 _DOMTextElement.style.whiteSpace = "pre";
00168 _DOMTextElement.style.cursor = "default";
00169 _DOMTextElement.style.zIndex = 100;
00170
00171 _DOMElement.appendChild(_DOMTextElement);
00172 #endif
00173 [self setAlignment:CPLeftTextAlignment];
00174 }
00175
00176 return self;
00177 }
00178
00179 - (void)setDelegate:(id)aDelegate
00180 {
00181 var center = [CPNotificationCenter defaultCenter];
00182
00183
00184 if (_delegate)
00185 {
00186 [center removeObserver:_delegate name:CPControlTextDidBeginEditingNotification object:self];
00187 [center removeObserver:_delegate name:CPControlTextDidChangeNotification object:self];
00188 [center removeObserver:_delegate name:CPControlTextDidEndEditingNotification object:self];
00189 }
00190
00191 _delegate = aDelegate;
00192
00193 if ([_delegate respondsToSelector:@selector(controlTextDidBeginEditing:)])
00194 [center addObserver:_delegate selector:@selector(controlTextDidBeginEditing:) name:CPControlTextDidBeginEditingNotification object:self];
00195 if ([_delegate respondsToSelector:@selector(controlTextDidChange:)])
00196 [center addObserver:_delegate selector:@selector(controlTextDidChange:) name:CPControlTextDidChangeNotification object:self];
00197 if ([_delegate respondsToSelector:@selector(controlTextDidEndEditing:)])
00198 [center addObserver:_delegate selector:@selector(controlTextDidEndEditing:) name:CPControlTextDidEndEditingNotification object:self];
00199
00200 }
00201
00202 - (id)delegate
00203 {
00204 return _delegate;
00205 }
00206
00207
00212 - (void)setBezeled:(BOOL)shouldBeBezeled
00213 {
00214 if (_isBezeled == shouldBeBezeled)
00215 return;
00216
00217 _isBezeled = shouldBeBezeled;
00218
00219 [self _updateBackground];
00220 }
00221
00225 - (BOOL)isBezeled
00226 {
00227 return _isBezeled;
00228 }
00229
00234 - (void)setBezelStyle:(CPTextFieldBezelStyle)aBezelStyle
00235 {
00236 if (_bezelStyle == aBezelStyle)
00237 return;
00238
00239 _bezelStyle = aBezelStyle;
00240
00241 [self _updateBackground];
00242 }
00243
00247 - (CPTextFieldBezelStyle)bezelStyle
00248 {
00249 return _bezelStyle;
00250 }
00251
00256 - (void)setBordered:(BOOL)shouldBeBordered
00257 {
00258 if (_isBordered == shouldBeBordered)
00259 return;
00260
00261 _isBordered = shouldBeBordered;
00262
00263 [self _updateBackground];
00264 }
00265
00269 - (BOOL)isBordered
00270 {
00271 return _isBordered;
00272 }
00273
00278 - (void)setDrawsBackground:(BOOL)shouldDrawBackground
00279 {
00280 if (_drawsBackground == shouldDrawBackground)
00281 return;
00282
00283 _drawsBackground = shouldDrawBackground;
00284
00285 [self _updateBackground];
00286 }
00287
00291 - (BOOL)drawsBackground
00292 {
00293 return _drawsBackground;
00294 }
00295
00300 - (void)setTextFieldBackgroundColor:(BOOL)aColor
00301 {
00302 if (_textFieldBackgroundColor == aColor)
00303 return;
00304
00305 _textFieldBackgroundColor = aColor;
00306
00307 [self _updateBackground];
00308 }
00309
00313 - (BOOL)textFieldBackgroundColor
00314 {
00315 return _textFieldBackgroundColor;
00316 }
00317
00318
00319 - (void)_updateBackground
00320 {
00321 if (_isBezeled)
00322 {
00323 if (_bezelStyle == CPTextFieldSquareBezel)
00324 {
00325 if (!_CPTextFieldSquareBezelColor)
00326 {
00327 var bundle = [CPBundle bundleForClass:[CPTextField class]];
00328
00329 _CPTextFieldSquareBezelColor = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices:
00330 [
00331 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare0.png"] size:CGSizeMake(2.0, 3.0)],
00332 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare1.png"] size:CGSizeMake(1.0, 3.0)],
00333 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare2.png"] size:CGSizeMake(2.0, 3.0)],
00334 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare3.png"] size:CGSizeMake(2.0, 1.0)],
00335 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare4.png"] size:CGSizeMake(1.0, 1.0)],
00336 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare5.png"] size:CGSizeMake(2.0, 1.0)],
00337 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare6.png"] size:CGSizeMake(2.0, 2.0)],
00338 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare7.png"] size:CGSizeMake(1.0, 2.0)],
00339 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelSquare8.png"] size:CGSizeMake(2.0, 2.0)]
00340 ]]];
00341 }
00342 [self setBackgroundColor:_CPTextFieldSquareBezelColor];
00343 }
00344 else if (_bezelStyle == CPTextFieldRoundedBezel)
00345 {
00346 if (!_CPTextFieldRoundedBezelColor)
00347 {
00348 var bundle = [CPBundle bundleForClass:[CPTextField class]];
00349
00350 _CPTextFieldRoundedBezelColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
00351 [
00352 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelRounded0.png"] size:CGSizeMake(12.0, 22.0)],
00353 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelRounded1.png"] size:CGSizeMake(16.0, 22.0)],
00354 [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:"CPTextField/CPTextFieldBezelRounded2.png"] size:CGSizeMake(12.0, 22.0)]
00355 ] isVertical:NO]];
00356 }
00357 [self setBackgroundColor:_CPTextFieldRoundedBezelColor];
00358 }
00359 }
00360 else
00361 {
00362 if (_drawsBackground)
00363 [self setBackgroundColor:_textFieldBackgroundColor];
00364 else
00365 [self setBackgroundColor:nil];
00366
00367
00368
00369 }
00370 }
00371
00372
00373 - (BOOL)acceptsFirstResponder
00374 {
00375 return _isEditable;
00376 }
00377
00378
00379 - (BOOL)becomeFirstResponder
00380 {
00381 var string = [self stringValue];
00382
00383 [self setStringValue:""];
00384
00385 #if PLATFORM(DOM)
00386 var element = [[self class] _inputElement];
00387
00388 element.value = string;
00389 element.style.color = _DOMElement.style.color;
00390 element.style.font = _DOMElement.style.font;
00391 element.style.zIndex = 1000;
00392 element.style.width = CGRectGetWidth([self bounds]) - 3.0 + "px";
00393 element.style.marginTop = "0px";
00394
00395
00396
00397
00398 _DOMElement.appendChild(element);
00399 window.setTimeout(function() { element.focus(); }, 0.0);
00400
00401 element.onblur = function ()
00402 {
00403 [self setObjectValue:element.value];
00404 [self sendAction:[self action] to:[self target]];
00405 [[self window] makeFirstResponder:nil];
00406 [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
00407 };
00408
00409
00410
00411
00412 element.onkeydown = function(aDOMEvent)
00413 {
00414
00415
00416 _textDidChangeValue = [self stringValue];
00417 [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
00418 return true;
00419 }
00420
00421 element.onkeypress = function(aDOMEvent)
00422 {
00423 aDOMEvent = aDOMEvent || window.event;
00424
00425 if (aDOMEvent.keyCode == 13)
00426 {
00427 if (aDOMEvent.preventDefault)
00428 aDOMEvent.preventDefault();
00429 if (aDOMEvent.stopPropagation)
00430 aDOMEvent.stopPropagation();
00431 aDOMEvent.cancelBubble = true;
00432
00433 element.blur();
00434 }
00435 [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
00436 };
00437
00438
00439 element.onkeyup = function(aDOMEvent)
00440 {
00441
00442 if ([self stringValue] != _textDidChangeValue)
00443 {
00444 _textDidChangeValue = [self stringValue];
00445
00446
00447 [self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]];
00448 }
00449 [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
00450 };
00451
00452
00453 if ([string lowercaseString] == [[self placeholderString] lowercaseString])
00454 [self setStringValue:""];
00455
00456
00457 [self textDidBeginEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]];
00458
00459 [[CPDOMWindowBridge sharedDOMWindowBridge] _propagateCurrentDOMEvent:YES];
00460 #endif
00461
00462 return YES;
00463 }
00464
00465
00466 - (BOOL)resignFirstResponder
00467 {
00468 #if PLATFORM(DOM)
00469 var element = [[self class] _inputElement];
00470
00471
00472 element.onkeyup = nil;
00473 element.onkeydown = nil;
00474 element.onkeypress = nil;
00475
00476 _DOMElement.removeChild(element);
00477 [self setStringValue:element.value];
00478
00479
00480 if (!_value)
00481 [self setStringValue:[self placeholderString]];
00482
00483 #endif
00484
00485 [self textDidEndEditing:[CPNotification notificationWithName:CPControlTextDidBeginEditingNotification object:self userInfo:nil]];
00486
00487 return YES;
00488 }
00489
00490 - (void)mouseUp:(CPEvent)anEvent
00491 {
00492 if (_isEditable && [[self window] firstResponder] == self)
00493 return;
00494
00495 [super mouseUp:anEvent];
00496 }
00497
00501 - (void)setEditable:(BOOL)shouldBeEditable
00502 {
00503 _isEditable = shouldBeEditable;
00504 }
00505
00509 - (BOOL)isEditable
00510 {
00511 return _isEditable;
00512 }
00513
00514 - (void)setFrameSize:(CGSize)aSize
00515 {
00516 [super setFrameSize:aSize];
00517
00518 #if PLATFORM(DOM)
00519 CPDOMDisplayServerSetStyleSize(_DOMTextElement, _frame.size.width - 2.0 * HORIZONTAL_PADDING, _frame.size.height - TOP_PADDING - BOTTOM_PADDING);
00520 #endif
00521 }
00522
00526 - (BOOL)isSelectable
00527 {
00528 return _isSelectable;
00529 }
00530
00535 - (void)setSelectable:(BOOL)aFlag
00536 {
00537 _isSelectable = aFlag;
00538 }
00539
00544 - (void)setAlignment:(CPTextAlignment)anAlignment
00545 {
00546 if ([self alignment] == anAlignment)
00547 return;
00548
00549 [super setAlignment:anAlignment];
00550
00551 #if PLATFORM(DOM)
00552 switch ([self alignment])
00553 {
00554 case CPLeftTextAlignment: _DOMTextElement.style.textAlign = "left";
00555 break;
00556 case CPRightTextAlignment: _DOMTextElement.style.textAlign = "right";
00557 break;
00558 case CPCenterTextAlignment: _DOMTextElement.style.textAlign = "center";
00559 break;
00560 case CPJustifiedTextAlignment: _DOMTextElement.style.textAlign = "justify";
00561 break;
00562 case CPNaturalTextAlignment: _DOMTextElement.style.textAlign = "";
00563 break;
00564 }
00565 #endif
00566 }
00567
00572 - (void)setLineBreakMode:(CPLineBreakMode)aLineBreakMode
00573 {
00574 _lineBreakMode = aLineBreakMode;
00575
00576 #if PLATFORM(DOM)
00577 switch (aLineBreakMode)
00578 {
00579 case CPLineBreakByTruncatingTail: _DOMTextElement.style.textOverflow = "ellipsis";
00580 _DOMTextElement.style.whiteSpace = "nowrap";
00581 _DOMTextElement.style.overflow = "hidden";
00582
00583 if (document.attachEvent)
00584 _DOMTextElement.style.wordWrap = "normal";
00585
00586 break;
00587
00588 case CPLineBreakByWordWrapping: if (document.attachEvent)
00589 {
00590 _DOMTextElement.style.whiteSpace = "pre";
00591 _DOMTextElement.style.wordWrap = "break-word";
00592 }
00593 else
00594 {
00595 _DOMTextElement.style.whiteSpace = "-o-pre-wrap";
00596 _DOMTextElement.style.whiteSpace = "-pre-wrap";
00597 _DOMTextElement.style.whiteSpace = "-moz-pre-wrap";
00598 _DOMTextElement.style.whiteSpace = "pre-wrap";
00599 }
00600
00601 _DOMTextElement.style.overflow = "hidden";
00602 _DOMTextElement.style.textOverflow = "clip";
00603
00604 break;
00605 }
00606 #endif
00607 }
00608
00612 - (id)objectValue
00613 {
00614
00615 #if PLATFORM(DOM)
00616 if ([[self window] firstResponder] == self)
00617 return [[self class] _inputElement].value;
00618 #endif
00619
00620 if ([super objectValue] == [self placeholderString])
00621 return "";
00622
00623 return [super objectValue];
00624 }
00625
00626
00627
00628
00629 - (void)setObjectValue:(id)aValue
00630 {
00631 [super setObjectValue:aValue];
00632
00633 #if PLATFORM(DOM)
00634 var displayString = "";
00635
00636 if (aValue && [aValue respondsToSelector:@selector(string)])
00637 displayString = [aValue string];
00638 else if (aValue)
00639 displayString += aValue;
00640
00641 if ([[self window] firstResponder] == self)
00642 [[self class] _inputElement].value = displayString;
00643
00644 if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature))
00645 _DOMTextElement.innerText = displayString;
00646 else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature))
00647 _DOMTextElement.textContent = displayString;
00648 #endif
00649 }
00650
00654 - (CPString)placeholderString
00655 {
00656 return _placeholderString;
00657 }
00658
00663 -(void)setPlaceholderString:(CPString)aStringValue
00664 {
00665 _placeholderString = aStringValue;
00666
00667
00668 if (!_value)
00669 [self setStringValue:aStringValue];
00670 }
00671
00675 - (void)sizeToFit
00676 {
00677 #if PLATFORM(DOM)
00678 var size = [(_value || " ") sizeWithFont:[self font]];
00679
00680 [self setFrameSize:CGSizeMake(size.width + 2 * HORIZONTAL_PADDING, size.height + TOP_PADDING + BOTTOM_PADDING)];
00681 #endif
00682 }
00683
00687 - (void)selectText:(id)sender
00688 {
00689 #if PLATFORM(DOM)
00690 var element = [[self class] _inputElement];
00691
00692 if (element.parentNode == _DOMElement && ([self isEditable] || [self isSelectable]))
00693 element.select();
00694 #endif
00695 }
00696
00697
00698
00699 @end
00700
00701 var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey",
00702 CPTextFieldIsSelectableKey = "CPTextFieldIsSelectableKey",
00703 CPTextFieldIsBorderedKey = "CPTextFieldIsBorderedKey",
00704 CPTextFieldIsBezeledKey = "CPTextFieldIsBezeledKey",
00705 CPTextFieldBezelStyleKey = "CPTextFieldBezelStyleKey",
00706 CPTextFieldDrawsBackgroundKey = "CPTextFieldDrawsBackgroundKey",
00707 CPTextFieldLineBreakModeKey = "CPTextFieldLineBreakModeKey",
00708 CPTextFieldBackgroundColorKey = "CPTextFieldBackgroundColorKey",
00709 CPTextFieldPlaceholderStringKey = "CPTextFieldPlaceholderStringKey";
00710
00711 @implementation CPTextField (CPCoding)
00712
00718 - (id)initWithCoder:(CPCoder)aCoder
00719 {
00720 #if PLATFORM(DOM)
00721 _DOMTextElement = document.createElement("div");
00722 #endif
00723
00724 self = [super initWithCoder:aCoder];
00725
00726 if (self)
00727 {
00728 #if PLATFORM(DOM)
00729 var bounds = [self bounds];
00730 _DOMTextElement.style.position = "absolute";
00731 _DOMTextElement.style.top = TOP_PADDING + "px";
00732 _DOMTextElement.style.left = HORIZONTAL_PADDING + "px";
00733 _DOMTextElement.style.width = MAX(0.0, CGRectGetWidth(bounds) - 2.0 * HORIZONTAL_PADDING) + "px";
00734 _DOMTextElement.style.height = MAX(0.0, CGRectGetHeight(bounds) - TOP_PADDING - BOTTOM_PADDING) + "px";
00735 _DOMTextElement.style.whiteSpace = "pre";
00736 _DOMTextElement.style.cursor = "default";
00737
00738 _DOMElement.appendChild(_DOMTextElement);
00739 #endif
00740
00741 [self setEditable:[aCoder decodeBoolForKey:CPTextFieldIsEditableKey]];
00742 [self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]];
00743
00744 [self setBordered:[aCoder decodeBoolForKey:CPTextFieldIsBorderedKey]];
00745 [self setBezeled:[aCoder decodeBoolForKey:CPTextFieldIsBezeledKey]];
00746 [self setBezelStyle:[aCoder decodeIntForKey:CPTextFieldBezelStyleKey]];
00747 [self setDrawsBackground:[aCoder decodeBoolForKey:CPTextFieldDrawsBackgroundKey]];
00748
00749 [self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]];
00750 [self setTextFieldBackgroundColor:[aCoder decodeObjectForKey:CPTextFieldBackgroundColorKey]];
00751
00752 [self setPlaceholderString:[aCoder decodeObjectForKey:CPTextFieldPlaceholderStringKey]];
00753 }
00754
00755 return self;
00756 }
00757
00762 - (void)encodeWithCoder:(CPCoder)aCoder
00763 {
00764 [super encodeWithCoder:aCoder];
00765
00766 [aCoder encodeBool:_isEditable forKey:CPTextFieldIsEditableKey];
00767 [aCoder encodeBool:_isSelectable forKey:CPTextFieldIsSelectableKey];
00768
00769 [aCoder encodeBool:_isBordered forKey:CPTextFieldIsBorderedKey];
00770 [aCoder encodeBool:_isBezeled forKey:CPTextFieldIsBezeledKey];
00771 [aCoder encodeInt:_bezelStyle forKey:CPTextFieldBezelStyleKey];
00772 [aCoder encodeBool:_drawsBackground forKey:CPTextFieldDrawsBackgroundKey];
00773
00774 [aCoder encodeInt:_lineBreakMode forKey:CPTextFieldLineBreakModeKey];
00775 [aCoder encodeObject:_textFieldBackgroundColor forKey:CPTextFieldBackgroundColorKey];
00776
00777 [aCoder encodeObject:_placeholderString forKey:CPTextFieldPlaceholderStringKey];
00778 }
00779
00780 @end