23 #import "../Foundation/Ref.h"
35 var CPTextFieldDOMInputElement = nil,
36 CPTextFieldDOMPasswordInputElement = nil,
37 CPTextFieldDOMStandardInputElement = nil,
38 CPTextFieldInputOwner = nil,
39 CPTextFieldTextDidChangeValue = nil,
40 CPTextFieldInputResigning = NO,
41 CPTextFieldInputDidBlur = NO,
42 CPTextFieldInputIsActive = NO,
43 CPTextFieldCachedSelectStartFunction = nil,
44 CPTextFieldCachedDragFunction = nil,
45 CPTextFieldBlurHandler = nil,
46 CPTextFieldInputFunction = nil;
55 if (owner && domElement != inputElement.parentNode)
58 if (!resigning && [[owner window] isKeyWindow])
63 window.setTimeout(
function()
70 AT_DEREF(didBlurRef, YES);
77 AT_DEREF(ownerRef, nil);
109 BOOL _willBecomeFirstResponderByClick;
111 BOOL _drawsBackground;
113 CPColor _textFieldBackgroundColor;
121 CPTextFieldBezelStyle _bezelStyle;
123 CPControlSize _controlSize;
133 var textField = [[
self alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
135 [textField setTheme:aTheme];
136 [textField setStringValue:aStringValue];
137 [textField setPlaceholderString:aPlaceholder];
138 [textField setBordered:YES];
139 [textField setBezeled:YES];
140 [textField setEditable:YES];
142 [textField sizeToFit];
154 var textField = [[
CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
156 [textField setTheme:aTheme];
157 [textField setStringValue:aStringValue];
158 [textField setPlaceholderString:aPlaceholder];
159 [textField setBezelStyle:CPTextFieldRoundedBezel];
160 [textField setBordered:YES];
161 [textField setBezeled:YES];
162 [textField setEditable:YES];
164 [textField sizeToFit];
176 var textField = [[
self alloc] init];
178 [textField setStringValue:aTitle];
179 [textField sizeToFit];
189 + (Class)_binderClassForBinding:(
CPString)theBinding
192 return [_CPTextFieldValueBinder class];
194 return [
super _binderClassForBinding:theBinding];
197 + (id)themeAttributes
200 forKeys:[@"bezel-inset", @"content-inset", @"bezel-color"]];
205 - (DOMElement)_inputElement
207 if (!CPTextFieldDOMInputElement)
209 CPTextFieldDOMInputElement = document.createElement(
"input");
210 CPTextFieldDOMInputElement.style.position =
"absolute";
211 CPTextFieldDOMInputElement.style.border =
"0px";
212 CPTextFieldDOMInputElement.style.padding =
"0px";
213 CPTextFieldDOMInputElement.style.margin =
"0px";
214 CPTextFieldDOMInputElement.style.whiteSpace =
"pre";
215 CPTextFieldDOMInputElement.style.background =
"transparent";
216 CPTextFieldDOMInputElement.style.outline =
"none";
218 CPTextFieldBlurHandler =
function(anEvent)
222 CPTextFieldInputOwner,
223 CPTextFieldInputOwner._DOMElement,
224 CPTextFieldDOMInputElement,
225 CPTextFieldInputResigning,
226 AT_REF(CPTextFieldInputDidBlur));
231 CPTextFieldInputFunction =
function(anEvent)
233 if (!CPTextFieldInputOwner)
247 [CPTextFieldInputOwner keyUp:cappEvent];
252 CPTextFieldDOMInputElement.oninput = CPTextFieldInputFunction;
256 CPTextFieldDOMInputElement.onblur = CPTextFieldBlurHandler;
258 CPTextFieldDOMStandardInputElement = CPTextFieldDOMInputElement;
264 CPTextFieldDOMInputElement.type =
"password";
266 CPTextFieldDOMInputElement.type =
"text";
268 return CPTextFieldDOMInputElement;
273 if (!CPTextFieldDOMPasswordInputElement)
275 CPTextFieldDOMPasswordInputElement = document.createElement(
"input");
276 CPTextFieldDOMPasswordInputElement.style.position =
"absolute";
277 CPTextFieldDOMPasswordInputElement.style.border =
"0px";
278 CPTextFieldDOMPasswordInputElement.style.padding =
"0px";
279 CPTextFieldDOMPasswordInputElement.style.margin =
"0px";
280 CPTextFieldDOMPasswordInputElement.style.whiteSpace =
"pre";
281 CPTextFieldDOMPasswordInputElement.style.background =
"transparent";
282 CPTextFieldDOMPasswordInputElement.style.outline =
"none";
283 CPTextFieldDOMPasswordInputElement.type =
"password";
285 CPTextFieldDOMPasswordInputElement.onblur = CPTextFieldBlurHandler;
288 CPTextFieldDOMInputElement = CPTextFieldDOMPasswordInputElement;
292 CPTextFieldDOMInputElement = CPTextFieldDOMStandardInputElement;
295 return CPTextFieldDOMInputElement;
299 - (id)initWithFrame:(CGRect)aFrame
316 #pragma mark Controlling Editability and Selectability
322 - (void)setEditable:(BOOL)shouldBeEditable
324 if (_isEditable === shouldBeEditable)
327 _isEditable = shouldBeEditable;
329 if (shouldBeEditable)
338 if (!shouldBeEditable && [[
self window] firstResponder] ===
self)
354 - (void)setEnabled:(BOOL)shouldBeEnabled
359 if (!shouldBeEnabled && [[
self window] firstResponder] ===
self)
367 - (void)setSelectable:(BOOL)aFlag
369 _isSelectable = aFlag;
377 return _isSelectable;
384 - (void)setSecure:(BOOL)aFlag
402 - (void)setBezeled:(BOOL)shouldBeBezeled
422 - (void)setBezelStyle:(CPTextFieldBezelStyle)aBezelStyle
435 - (CPTextFieldBezelStyle)bezelStyle
447 - (void)setBordered:(BOOL)shouldBeBordered
449 if (shouldBeBordered)
467 - (void)setDrawsBackground:(BOOL)shouldDrawBackground
469 if (_drawsBackground == shouldDrawBackground)
472 _drawsBackground = shouldDrawBackground;
481 - (BOOL)drawsBackground
483 return _drawsBackground;
490 - (void)setTextFieldBackgroundColor:(
CPColor)aColor
492 if (_textFieldBackgroundColor == aColor)
495 _textFieldBackgroundColor = aColor;
506 return _textFieldBackgroundColor;
510 - (BOOL)acceptsFirstResponder
516 - (BOOL)becomeFirstResponder
519 [
self _setObserveWindowKeyNotifications:YES];
523 if ([[
self window] isKeyWindow])
524 [
self _becomeFirstKeyResponder];
534 - (void)_becomeFirstKeyResponder
536 [
self setThemeState:CPThemeStateEditing];
538 [
self _updatePlaceholderState];
540 [
self setNeedsLayout];
542 _stringValue = [
self stringValue];
546 var element = [
self _inputElement],
547 font = [
self currentValueForThemeAttribute:@"font"],
548 lineHeight = [font defaultLineHeightForFont];
550 element.value = _stringValue;
551 element.style.color = [[
self currentValueForThemeAttribute:@"text-color"] cssString];
554 element.style.font = [font cssString];
556 element.style.zIndex = 1000;
558 switch ([
self alignment])
564 default: element.style.textAlign =
"left";
567 var contentRect = [
self contentRectForBounds:[
self bounds]],
568 verticalAlign = [
self currentValueForThemeAttribute:"vertical-alignment"];
570 switch (verticalAlign)
573 var topPoint = _CGRectGetMinY(contentRect) + "px";
577 var topPoint = (_CGRectGetMidY(contentRect) - (lineHeight / 2)) + "px";
581 var topPoint = (_CGRectGetMaxY(contentRect) - lineHeight) + "px";
585 var topPoint = _CGRectGetMinY(contentRect) + "px";
589 element.style.top = topPoint;
590 var left = _CGRectGetMinX(contentRect);
596 element.style.left = left + "px";
597 element.style.width = _CGRectGetWidth(contentRect) + "px";
598 element.style.height = ROUND(lineHeight) + "px";
599 element.style.lineHeight = ROUND(lineHeight) + "px";
600 element.style.verticalAlign =
"top";
601 element.style.cursor =
"auto";
603 _DOMElement.appendChild(element);
607 element.style.font = [font cssString];
609 [[[
self window] platformWindow] _propagateCurrentDOMEvent:YES];
611 CPTextFieldInputIsActive = YES;
613 if (document.attachEvent)
615 CPTextFieldCachedSelectStartFunction = [[
self window] platformWindow]._DOMBodyElement.onselectstart;
616 CPTextFieldCachedDragFunction = [[
self window] platformWindow]._DOMBodyElement.ondrag;
618 [[
self window] platformWindow]._DOMBodyElement.ondrag =
function () {};
619 [[
self window] platformWindow]._DOMBodyElement.onselectstart =
function () {};
622 CPTextFieldInputOwner =
self;
624 window.setTimeout(
function()
629 if (CPTextFieldInputOwner !==
self)
635 if (!_willBecomeFirstResponderByClick)
636 [
self _selectText:self immediately:YES];
638 _willBecomeFirstResponderByClick = NO;
647 - (BOOL)resignFirstResponder
651 var element = [
self _inputElement],
652 newValue = element.value,
655 if (newValue !== _stringValue)
657 [
self _setStringValue:newValue];
662 if ([
self _valueIsValid:newValue] === NO)
671 [
self _setObserveWindowKeyNotifications:NO];
673 [
self _resignFirstKeyResponder];
678 if ([
self sendsActionOnEndEditing])
686 - (void)_resignFirstKeyResponder
688 [
self unsetThemeState:CPThemeStateEditing];
691 _stringValue = [
self stringValue];
693 _willBecomeFirstResponderByClick = NO;
695 [
self _updatePlaceholderState];
696 [
self setNeedsLayout];
700 var element = [
self _inputElement];
702 CPTextFieldInputResigning = YES;
704 if (CPTextFieldInputIsActive)
707 if (!CPTextFieldInputDidBlur)
708 CPTextFieldBlurHandler();
710 CPTextFieldInputDidBlur = NO;
711 CPTextFieldInputResigning = NO;
713 if (element.parentNode == _DOMElement)
714 element.parentNode.removeChild(element);
716 CPTextFieldInputIsActive = NO;
718 if (document.attachEvent)
720 [[
self window] platformWindow]._DOMBodyElement.ondrag = CPTextFieldCachedDragFunction;
721 [[
self window] platformWindow]._DOMBodyElement.onselectstart = CPTextFieldCachedSelectStartFunction;
723 CPTextFieldCachedSelectStartFunction = nil;
724 CPTextFieldCachedDragFunction = nil;
730 - (void)_setObserveWindowKeyNotifications:(BOOL)shouldObserve
746 if (![[
self window] isKeyWindow])
747 [
self _resignFirstKeyResponder];
752 if ([[
self window] isKeyWindow] && [[
self window] firstResponder] ===
self)
753 [
self _becomeFirstKeyResponder];
756 - (BOOL)_valueIsValid:(
CPString)aValue
762 if ([
self _setStringValue:aValue isNewValue:NO errorDescription:AT_REF(error)] === NO)
764 var acceptInvalidValue = NO;
766 if ([_delegate respondsToSelector:
@selector(control:didFailToFormatString:errorDescription:)])
767 acceptInvalidValue = [_delegate control:self didFailToFormatString:aValue errorDescription:error];
769 if (acceptInvalidValue === NO)
781 - (BOOL)needsPanelToBecomeKey
789 if ([
self isEditable] && [
self isEnabled])
791 _willBecomeFirstResponderByClick = YES;
794 else if ([
self isSelectable])
796 if (document.attachEvent)
798 CPTextFieldCachedSelectStartFunction = [[
self window]
platformWindow]._DOMBodyElement.onselectstart;
812 if (![
self isSelectable] && (![
self isEditable] || ![
self isEnabled]))
813 [[
self nextResponder] mouseUp:anEvent];
814 else if ([
self isSelectable])
816 if (document.attachEvent)
819 [[
self window]
platformWindow]._DOMBodyElement.onselectstart = CPTextFieldCachedSelectStartFunction;
821 CPTextFieldCachedSelectStartFunction = nil
822 CPTextFieldCachedDragFunction = nil;
830 if (![
self isSelectable] && (![
self isEditable] || ![
self isEnabled]))
831 [[
self nextResponder] mouseDragged:anEvent];
832 else if ([
self isSelectable])
840 var newValue = [
self _inputElement].value;
842 if (newValue !== _stringValue)
844 [
self _setStringValue:newValue];
882 - (void)doCommandBySelector:(
SEL)aSelector
884 if ([
self respondsToSelector:aSelector])
888 - (void)insertNewline:(
id)sender
890 var newValue = [
self _inputElement].value;
892 if (newValue !== _stringValue)
894 [
self _setStringValue:newValue];
897 if ([
self _valueIsValid:_stringValue])
912 if (![
self action] || [
self sendAction:[
self action] to:[
self target]])
921 - (void)insertNewlineIgnoringFieldEditor:(
id)sender
923 [
self _insertCharacterIgnoringFieldEditor:CPNewlineCharacter];
926 - (void)insertTabIgnoringFieldEditor:(
id)sender
928 [
self _insertCharacterIgnoringFieldEditor:CPTabCharacter];
931 - (void)_insertCharacterIgnoringFieldEditor:(
CPString)aCharacter
935 var oldValue = _stringValue,
936 range = [
self selectedRange],
937 element = [
self _inputElement];
939 element.value = [element.value stringByReplacingCharactersInRange:[
self selectedRange] withString:aCharacter];
940 [
self _setStringValue:element.value];
943 if (oldValue !== _stringValue)
960 if ([note
object] !=
self)
969 if ([note
object] !=
self)
977 if ([note
object] !==
self)
980 [
self _continuouslyReverseSetBinding];
998 - (BOOL)_setStringValue:(
CPString)aValue
1000 return [
self _setStringValue:aValue isNewValue:YES errorDescription:nil];
1008 - (BOOL)_setStringValue:(
CPString)aValue isNewValue:(BOOL)isNewValue errorDescription:(CPStringRef)anError
1010 _stringValue = aValue;
1012 var objectValue = aValue,
1013 formatter = [
self formatter],
1020 if ([formatter getObjectValue:AT_REF(
object) forString:aValue errorDescription:anError])
1021 objectValue =
object;
1024 objectValue = undefined;
1028 isNewValue |= objectValue !== [
super objectValue];
1033 [
self willChangeValueForKey:@"objectValue"];
1034 [
super setObjectValue:objectValue];
1035 [
self _updatePlaceholderState];
1036 [
self didChangeValueForKey:@"objectValue"];
1042 - (void)setObjectValue:(
id)aValue
1051 var formattedString = [
self hasThemeState:CPThemeStateEditing] ? [formatter editingStringForObjectValue:aValue] : [formatter stringForObjectValue:aValue];
1053 if (formattedString === nil)
1059 if ([formatter getObjectValue:AT_REF(value) forString:
@"" errorDescription:nil] === NO)
1070 if (CPTextFieldInputOwner ===
self || [[
self window] firstResponder] ===
self)
1071 [
self _inputElement].value = _stringValue;
1075 [
self _updatePlaceholderState];
1078 - (void)_updatePlaceholderState
1080 if ((!_stringValue || _stringValue.
length === 0) && ![
self hasThemeState:CPThemeStateEditing])
1083 [
self unsetThemeState:CPTextFieldStatePlaceholder];
1092 if (_placeholderString === aStringValue)
1095 _placeholderString = aStringValue;
1110 return _placeholderString;
1138 - (CGSize)_minimumFrameSize
1140 var frameSize = [
self frameSize],
1141 contentInset = [
self currentValueForThemeAttribute:@"content-inset"],
1142 minSize = [
self currentValueForThemeAttribute:@"min-size"],
1143 maxSize = [
self currentValueForThemeAttribute:@"max-size"],
1144 lineBreakMode = [
self lineBreakMode],
1145 text = (_stringValue ||
@" "),
1146 textSize = _CGSizeMakeCopy(frameSize),
1147 font = [
self currentValueForThemeAttribute:@"font"];
1149 textSize.width -= contentInset.left + contentInset.right;
1150 textSize.height -= contentInset.top + contentInset.bottom;
1152 if (frameSize.width !== 0 &&
1153 ![
self isBezeled] &&
1156 textSize = [text sizeWithFont:font inWidth:textSize.width];
1160 textSize = [text sizeWithFont:font];
1163 textSize.width += 1;
1167 textSize.height += 1;
1169 frameSize.height = textSize.height + contentInset.top + contentInset.bottom;
1171 if ([
self isBezeled])
1173 frameSize.height = MAX(frameSize.height, minSize.height);
1175 if (maxSize.width > 0.0)
1176 frameSize.width = MIN(frameSize.width, maxSize.width);
1178 if (maxSize.height > 0.0)
1179 frameSize.height = MIN(frameSize.height, maxSize.height);
1182 frameSize.width = textSize.width + contentInset.left + contentInset.right;
1184 frameSize.width = MAX(frameSize.width, minSize.width);
1192 - (void)selectText:(
id)sender
1194 [
self _selectText:sender immediately:NO];
1197 - (void)_selectText:(
id)sender immediately:(BOOL)immediately
1200 if (([
self isEditable] || [
self isSelectable]))
1202 var wind = [
self window];
1205 var element = [
self _inputElement];
1207 if ([wind firstResponder] ===
self)
1212 window.setTimeout(
function() { element.select(); }, 0);
1214 else if (wind !== nil && [wind makeFirstResponder:
self])
1215 [
self _selectText:sender immediately:immediately];
1219 if (wind !== nil && [wind firstResponder] !==
self)
1220 [wind makeFirstResponder:self];
1226 - (void)copy:(
id)sender
1232 if (selectedRange.length < 1)
1236 stringForPasting = [_stringValue substringWithRange:selectedRange];
1238 [pasteboard declareTypes:[CPStringPboardType] owner:nil];
1239 [pasteboard setString:stringForPasting forType:CPStringPboardType];
1243 - (void)cut:(
id)sender
1252 [
CPTimer scheduledTimerWithTimeInterval:0.0 target:
self selector:
@selector(keyUp:) userInfo:nil repeats:NO];
1255 - (void)paste:(
id)sender
1267 pasteString = [pasteboard stringForType:CPStringPboardType],
1268 newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:pasteString];
1271 [
self setSelectedRange:CPMakeRange(selectedRange.location + pasteString.length, 0)];
1275 [
CPTimer scheduledTimerWithTimeInterval:0.0 target:
self selector:
@selector(keyUp:) userInfo:nil repeats:NO];
1278 - (CPRange)selectedRange
1280 if ([[
self window] firstResponder] !==
self)
1288 var inputElement = [
self _inputElement],
1289 selectionStart = inputElement.selectionStart,
1290 selectionEnd = inputElement.selectionEnd;
1292 if ([selectionStart isKindOfClass:
CPNumber])
1293 return CPMakeRange(selectionStart, selectionEnd - selectionStart);
1296 var theDocument = inputElement.ownerDocument || inputElement.document,
1297 selectionRange = theDocument.selection.createRange(),
1298 range = inputElement.createTextRange();
1300 if (range.inRange(selectionRange))
1302 range.setEndPoint(
'EndToStart', selectionRange);
1303 return CPMakeRange(range.text.length, selectionRange.text.length);
1316 - (void)setSelectedRange:(CPRange)aRange
1318 if (![[
self window] firstResponder] ===
self)
1323 var inputElement = [
self _inputElement];
1327 if ([inputElement.selectionStart isKindOfClass:
CPNumber])
1329 inputElement.selectionStart = aRange.location;
1330 inputElement.selectionEnd = CPMaxRange(aRange);
1335 var theDocument = inputElement.ownerDocument || inputElement.document,
1336 existingRange = theDocument.selection.createRange(),
1337 range = inputElement.createTextRange();
1339 if (range.inRange(existingRange))
1341 range.collapse(
true);
1342 range.move(
'character', aRange.location);
1343 range.moveEnd(
'character', aRange.length);
1355 - (void)selectAll:(
id)sender
1360 - (void)deleteBackward:(
id)sender
1364 if (selectedRange.length < 2)
1367 selectedRange.location += 1;
1368 selectedRange.length -= 1;
1370 var newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:""];
1376 #pragma mark Setting the Delegate
1378 - (void)setDelegate:(
id)aDelegate
1385 [defaultCenter removeObserver:_delegate name:CPControlTextDidBeginEditingNotification object:self];
1386 [defaultCenter removeObserver:_delegate name:CPControlTextDidChangeNotification object:self];
1387 [defaultCenter removeObserver:_delegate name:CPControlTextDidEndEditingNotification object:self];
1388 [defaultCenter removeObserver:_delegate name:CPTextFieldDidFocusNotification object:self];
1389 [defaultCenter removeObserver:_delegate name:CPTextFieldDidBlurNotification object:self];
1392 _delegate = aDelegate;
1394 if ([_delegate respondsToSelector:
@selector(controlTextDidBeginEditing:)])
1396 addObserver:_delegate
1397 selector:@selector(controlTextDidBeginEditing:)
1398 name:CPControlTextDidBeginEditingNotification
1401 if ([_delegate respondsToSelector:
@selector(controlTextDidChange:)])
1403 addObserver:_delegate
1404 selector:@selector(controlTextDidChange:)
1405 name:CPControlTextDidChangeNotification
1409 if ([_delegate respondsToSelector:
@selector(controlTextDidEndEditing:)])
1411 addObserver:_delegate
1412 selector:@selector(controlTextDidEndEditing:)
1413 name:CPControlTextDidEndEditingNotification
1416 if ([_delegate respondsToSelector:
@selector(controlTextDidFocus:)])
1418 addObserver:_delegate
1419 selector:@selector(controlTextDidFocus:)
1420 name:CPTextFieldDidFocusNotification
1423 if ([_delegate respondsToSelector:
@selector(controlTextDidBlur:)])
1425 addObserver:_delegate
1426 selector:@selector(controlTextDidBlur:)
1427 name:CPTextFieldDidBlurNotification
1436 - (CGRect)contentRectForBounds:(CGRect)bounds
1440 return _CGRectInsetByInset(bounds, contentInset);
1443 - (CGRect)bezelRectForBounds:(CGRect)bounds
1447 return _CGRectInsetByInset(bounds, bezelInset);
1452 if (aName ===
"bezel-view")
1455 else if (aName ===
"content-view")
1463 if (aName ===
"bezel-view")
1465 var view = [[
CPView alloc] initWithFrame:_CGRectMakeZero()];
1467 [view setHitTests:NO];
1473 var view = [[_CPImageAndTextView alloc] initWithFrame:_CGRectMakeZero()];
1475 [view setHitTests:NO];
1483 - (void)layoutSubviews
1498 [contentView setHidden:[
self hasThemeState:CPThemeStateEditing]];
1506 string = _stringValue;
1508 if ([
self isSecure])
1512 [contentView setText:string];
1526 var count = objects.length,
1533 if (value !== [objects[count] valueForKeyPath:aKeyPath])
1576 [
self setEditable:[aCoder decodeBoolForKey:CPTextFieldIsEditableKey]];
1577 [
self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]];
1583 [
self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]];
1584 [
self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]];
1600 [aCoder encodeBool:_isEditable forKey:CPTextFieldIsEditableKey];
1601 [aCoder encodeBool:_isSelectable forKey:CPTextFieldIsSelectableKey];
1603 [aCoder encodeBool:_drawsBackground forKey:CPTextFieldDrawsBackgroundKey];
1605 [aCoder encodeObject:_textFieldBackgroundColor forKey:CPTextFieldBackgroundColorKey];
1607 [aCoder encodeInt:[
self lineBreakMode] forKey:CPTextFieldLineBreakModeKey];
1608 [aCoder encodeInt:[
self alignment] forKey:CPTextFieldAlignmentKey];
1610 [aCoder encodeObject:_placeholderString forKey:CPTextFieldPlaceholderStringKey];
1614 @implementation _CPTextFieldValueBinder :
CPBinder
1619 - (void)_updatePlaceholdersWithOptions:(
CPDictionary)options
1621 [
super _updatePlaceholdersWithOptions:options];
1623 [
self _setPlaceholder:@"Multiple Values" forMarker:CPMultipleValuesMarker isDefault:YES];
1624 [
self _setPlaceholder:@"No Selection" forMarker:CPNoSelectionMarker isDefault:YES];
1625 [
self _setPlaceholder:@"Not Applicable" forMarker:CPNotApplicableMarker isDefault:YES];
1626 [
self _setPlaceholder:@"" forMarker:CPNullMarker isDefault:YES];
1629 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
1631 [_source setPlaceholderString:aValue];
1632 [_source setObjectValue:nil];
1635 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
1637 [_source setObjectValue:aValue];