42 @
typedef CPTextFieldBezelStyle
68 if (owner && domElement != inputElement.parentNode)
71 var ownerWindow = [owner window];
73 if (!resigning && [ownerWindow isKeyWindow])
80 if ([owner _isWithinUsablePlatformRect])
82 window.setTimeout(
function()
90 @deref(didBlurRef) = YES;
97 @deref(ownerRef) = nil;
129 BOOL _willBecomeFirstResponderByClick;
130 BOOL _invokedByUserEvent;
132 BOOL _drawsBackground;
134 CPColor _textFieldBackgroundColor;
139 id <CPTextFieldDelegate> _delegate;
140 unsigned _implementedDelegateMethods;
143 CPTextFieldBezelStyle _bezelStyle;
145 BOOL _usesSingleLineMode;
150 + (Class)_binderClassForBinding:(
CPString)aBinding
153 return [_CPTextFieldValueBinder class];
155 return [_CPTextFieldPatternValueBinder class];
159 return [
super _binderClassForBinding:aBinding];
169 var textField = [[
self alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
171 [textField setTheme:aTheme];
172 [textField setStringValue:aStringValue];
173 [textField setPlaceholderString:aPlaceholder];
174 [textField setBordered:YES];
175 [textField setBezeled:YES];
176 [textField setEditable:YES];
178 [textField sizeToFit];
190 var textField = [[
CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
192 [textField setTheme:aTheme];
193 [textField setStringValue:aStringValue];
194 [textField setPlaceholderString:aPlaceholder];
195 [textField setBezelStyle:CPTextFieldRoundedBezel];
196 [textField setBordered:YES];
197 [textField setBezeled:YES];
198 [textField setEditable:YES];
200 [textField sizeToFit];
212 var textField = [[
self alloc] init];
214 [textField setStringValue:aTitle];
215 [textField sizeToFit];
228 @"bezel-inset": CGInsetMakeZero(),
229 @"content-inset": CGInsetMake(1.0, 0.0, 0.0, 0.0),
236 #pragma mark Control Size
238 - (void)setControlSize:(CPControlSize)aControlSize
242 if ([
self isBezeled])
243 [
self _sizeToControlSize];
250 - (DOMElement)_inputElement
328 [CPTextFieldInputOwner keyUp:cappEvent];
346 else if (_usesSingleLineMode)
355 - (id)initWithFrame:(CGRect)aFrame
372 #pragma mark Controlling Editability and Selectability
378 - (void)setEditable:(BOOL)shouldBeEditable
380 if (_isEditable === shouldBeEditable)
383 _isEditable = shouldBeEditable;
385 if (shouldBeEditable)
395 [[
self window] makeFirstResponder:nil];
397 if (shouldBeEditable)
415 - (void)setEnabled:(BOOL)shouldBeEnabled
420 if (!shouldBeEnabled && [[
self window] firstResponder] ===
self)
428 - (void)setSelectable:(BOOL)aFlag
430 _isSelectable = aFlag;
438 return _isSelectable;
445 - (void)setSecure:(BOOL)aFlag
463 - (void)setBezeled:(BOOL)shouldBeBezeled
483 - (void)setBezelStyle:(CPTextFieldBezelStyle)aBezelStyle
496 - (CPTextFieldBezelStyle)bezelStyle
508 - (void)setBordered:(BOOL)shouldBeBordered
510 if (shouldBeBordered)
528 - (void)setDrawsBackground:(BOOL)shouldDrawBackground
530 if (_drawsBackground == shouldDrawBackground)
533 _drawsBackground = shouldDrawBackground;
542 - (BOOL)drawsBackground
544 return _drawsBackground;
551 - (void)setTextFieldBackgroundColor:(
CPColor)aColor
553 if (_textFieldBackgroundColor == aColor)
556 _textFieldBackgroundColor = aColor;
567 return _textFieldBackgroundColor;
571 - (void)_setUsesSingleLineMode:(BOOL)aFlag
573 _usesSingleLineMode = aFlag;
577 - (void)_setWraps:(BOOL)aFlag
583 - (void)_setScrolls:(BOOL)aFlag
589 - (BOOL)acceptsFirstResponder
595 - (BOOL)becomeFirstResponder
597 if (![
self isEnabled] || ![super becomeFirstResponder])
601 [
self _setObserveWindowKeyNotifications:YES];
605 if ([[
self window] isKeyWindow] && [
self isEditable])
606 return [
self _becomeFirstKeyResponder];
619 - (BOOL)_becomeFirstKeyResponder
623 if (![
self _isWithinUsablePlatformRect])
628 if (![
self isEditable])
631 [
self setThemeState:CPThemeStateEditing];
633 [
self _updatePlaceholderState];
635 [
self setNeedsLayout];
637 _stringValue = [
self stringValue];
641 [
self _setCSSStyleForInputElement];
643 var element = [
self _inputElement];
644 element.value = _stringValue;
645 _DOMElement.appendChild(element);
649 if (document.attachEvent)
654 [[
self window] platformWindow]._DOMBodyElement.ondrag =
function () {};
655 [[
self window] platformWindow]._DOMBodyElement.onselectstart =
function () {};
660 window.setTimeout(
function()
671 if (!_willBecomeFirstResponderByClick)
672 [
self _selectText:self immediately:YES];
674 _willBecomeFirstResponderByClick = NO;
688 - (void)_setCSSStyleForInputElement
692 var element = [
self _inputElement],
693 font = [
self currentValueForThemeAttribute:@"font"],
694 lineHeight = [font defaultLineHeightForFont],
695 contentRect = [
self contentRectForBounds:[
self bounds]],
696 verticalAlign = [
self currentValueForThemeAttribute:"vertical-alignment"],
697 left = CGRectGetMinX(contentRect);
703 switch (verticalAlign)
706 var topPoint = CGRectGetMinY(contentRect) + "px";
710 var topPoint = (CGRectGetMidY(contentRect) - (lineHeight / 2)) + "px";
714 var topPoint = (CGRectGetMaxY(contentRect) - lineHeight) + "px";
718 var topPoint = CGRectGetMinY(contentRect) + "px";
723 element.style.color = [[
self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder] cssString];
725 element.style.color = [[
self valueForThemeAttribute:@"text-color" inState:CPThemeStateEditing] cssString];
727 switch ([
self alignment])
730 element.style.textAlign =
"center";
734 element.style.textAlign =
"right";
738 element.style.textAlign =
"left";
741 var isTextArea = element.nodeName.toUpperCase() ==
"TEXTAREA";
743 element.style.zIndex = 1000;
744 element.style.top = topPoint;
745 element.style.lineHeight = ROUND(lineHeight) + "px";
746 element.style.height = isTextArea ? CGRectGetHeight(contentRect) + "px" : ROUND(lineHeight) + "px";;
747 element.style.width = CGRectGetWidth(contentRect) + "px";
748 element.style.left = left + "px";
749 element.style.verticalAlign =
"top";
750 element.style.cursor =
"auto";
751 element.style.font = [font cssString];
754 element.style.whiteSpace = _wraps ?
"pre" :
"nowrap";
760 - (BOOL)resignFirstResponder
766 var element = [
self _inputElement],
767 newValue = element.value,
770 if (newValue !== _stringValue)
772 [
self _setStringValue:newValue];
777 if ([
self _valueIsValid:newValue] === NO)
786 [
self _setObserveWindowKeyNotifications:NO];
788 [
self _resignFirstKeyResponder];
791 if ([
self isEditable])
795 if ([
self sendsActionOnEndEditing])
804 - (void)_resignFirstKeyResponder
806 [
self unsetThemeState:CPThemeStateEditing];
809 _stringValue = [
self stringValue];
811 _willBecomeFirstResponderByClick = NO;
813 [
self _updatePlaceholderState];
814 [
self setNeedsLayout];
818 var element = [
self _inputElement];
831 if (element.parentNode == _DOMElement)
832 element.parentNode.removeChild(element);
836 if (document.attachEvent)
848 - (void)_setObserveWindowKeyNotifications:(BOOL)shouldObserve
862 - (void)_removeObservers
867 [
super _removeObservers];
868 [
self _setObserveWindowKeyNotifications:NO];
871 - (void)_addObservers
876 [
super _addObservers];
878 if ([[
self window] firstResponder] ===
self)
879 [
self _setObserveWindowKeyNotifications:YES];
884 if (![[
self window] isKeyWindow])
885 [
self _resignFirstKeyResponder];
890 if (!([
self isEnabled] && [
self isEditable]))
893 var wind = [
self window];
895 if ([wind isKeyWindow] && [wind firstResponder] ===
self)
896 if (![
self _becomeFirstKeyResponder])
897 [wind makeFirstResponder:nil];
900 - (BOOL)_valueIsValid:(
CPString)aValue
906 if ([
self _setStringValue:aValue isNewValue:NO errorDescription:@ref(error)] === NO)
908 var acceptInvalidValue = NO;
911 acceptInvalidValue = [_delegate control:self didFailToFormatString:aValue errorDescription:error];
913 if (acceptInvalidValue === NO)
926 - (BOOL)needsPanelToBecomeKey
953 [
self _updateCursorForEvent:anEvent];
959 if ([
self isEditable] && [
self isEnabled])
961 _willBecomeFirstResponderByClick = YES;
964 else if ([
self isSelectable])
966 if (document.attachEvent)
982 if (![
self isEnabled] || !([
self isSelectable] || [
self isEditable]))
983 [[
self nextResponder] mouseUp:anEvent];
984 else if ([
self isSelectable])
986 if (document.attachEvent)
997 if ([[
CPApp currentEvent] clickCount] === 3)
1009 if (![
self isEnabled] || !([
self isSelectable] || [
self isEditable]))
1010 [[
self nextResponder] mouseDragged:anEvent];
1011 else if ([
self isSelectable])
1017 if (!([
self isEnabled] && [
self isEditable]))
1021 var newValue = [
self _inputElement].value;
1023 if (newValue !== _stringValue)
1025 [
self _setStringValue:newValue];
1035 if (!([
self isEnabled] && [
self isEditable]))
1046 _invokedByUserEvent = !!anEvent._DOMEvent;
1048 _invokedByUserEvent = NO;
1062 - (void)doCommandBySelector:(
SEL)aSelector
1064 if ([
self respondsToSelector:aSelector])
1068 - (void)insertNewline:(
id)sender
1070 if (!([
self isEnabled] && [
self isEditable]))
1073 var newValue = [
self _inputElement].value;
1075 if (newValue !== _stringValue)
1077 [
self _setStringValue:newValue];
1081 if ([
self _valueIsValid:_stringValue])
1096 if (![
self action] || [
self sendAction:[
self action] to:[
self target]])
1105 - (void)insertNewlineIgnoringFieldEditor:(
id)sender
1107 [
self _insertCharacterIgnoringFieldEditor:CPNewlineCharacter];
1110 - (void)insertTabIgnoringFieldEditor:(
id)sender
1112 [
self _insertCharacterIgnoringFieldEditor:CPTabCharacter];
1115 - (void)_insertCharacterIgnoringFieldEditor:(
CPString)aCharacter
1117 if (!([
self isEnabled] && [
self isEditable]))
1122 var oldValue = _stringValue,
1123 range = [
self selectedRange],
1124 element = [
self _inputElement];
1129 element.value = [element.value stringByReplacingCharactersInRange:[
self selectedRange] withString:aCharacter];
1131 [
self _setStringValue:element.value];
1134 if (oldValue !== _stringValue)
1145 if ([note
object] !=
self)
1149 [_delegate controlTextDidBlur:note];
1157 if ([note
object] !=
self)
1161 [_delegate controlTextDidFocus:note];
1168 if ([note
object] !==
self)
1171 [
self _continuouslyReverseSetBinding];
1174 [_delegate controlTextDidChange:note];
1182 if ([note
object] !=
self)
1194 if ([note
object] !=
self)
1200 [_delegate controlTextDidEndEditing:note];
1203 - (void)_updateCursorForEvent:(
CPEvent)anEvent
1205 var
frame = CGRectMakeCopy([
self frame]),
1206 contentInset = [
self currentValueForThemeAttribute:@"content-inset"];
1208 frame = [[
self superview] convertRectToBase:CGRectInsetByInset(frame, contentInset)];
1210 if ([
self isEnabled] && ([
self isSelectable] || [
self isEditable]) && CGRectContainsPoint(frame, [anEvent locationInWindow]))
1213 self._DOMElement.style.cursor =
"text";
1219 self._DOMElement.style.cursor =
"default";
1236 - (BOOL)_setStringValue:(
CPString)aValue
1238 return [
self _setStringValue:aValue isNewValue:YES errorDescription:nil];
1245 - (BOOL)_setStringValue:(
CPString)aValue isNewValue:(BOOL)isNewValue errorDescription:(CPStringRef)anError
1247 _stringValue = aValue;
1249 var objectValue = aValue,
1250 formatter = [
self formatter],
1257 if ([formatter getObjectValue:@ref(
object) forString:aValue errorDescription:anError])
1258 objectValue = object;
1261 objectValue = undefined;
1265 isNewValue |= objectValue !== [
super objectValue];
1270 [
self willChangeValueForKey:@"objectValue"];
1271 [
super setObjectValue:objectValue];
1272 [
self _updatePlaceholderState];
1273 [
self didChangeValueForKey:@"objectValue"];
1279 - (void)setObjectValue:(
id)aValue
1281 [
self _setObjectValue:aValue useFormatter:YES];
1284 - (void)_setObjectValue:(
id)aValue useFormatter:(BOOL)useFormatter
1286 [
super setObjectValue:aValue];
1288 var formatter = [
self formatter];
1290 if (useFormatter && formatter)
1293 var formattedString = [
self hasThemeState:CPThemeStateEditing] ? [formatter editingStringForObjectValue:aValue] : [formatter stringForObjectValue:aValue];
1295 if (formattedString === nil)
1301 if ([formatter getObjectValue:@ref(value) forString:
@"" errorDescription:nil] === NO)
1304 [
super setObjectValue:value];
1305 _stringValue = (value === nil || value === undefined) ?
@"" : String(value);
1308 _stringValue = formattedString;
1311 _stringValue = [
self stringValue];
1315 if ((
CPTextFieldInputOwner ===
self || [[
self window] firstResponder] ===
self) && [[
self window] isKeyWindow])
1316 [
self _inputElement].value = _stringValue;
1320 [
self _updatePlaceholderState];
1323 - (void)_updatePlaceholderState
1325 if (!_stringValue || _stringValue.
length === 0)
1326 [
self setThemeState:CPTextFieldStatePlaceholder];
1328 [
self unsetThemeState:CPTextFieldStatePlaceholder];
1337 if (_placeholderString === aStringValue)
1340 _placeholderString = aStringValue;
1355 return _placeholderString;
1383 - (CGSize)_minimumFrameSize
1385 var frameSize = [
self frameSize],
1386 contentInset = [
self currentValueForThemeAttribute:@"content-inset"],
1387 minSize = [
self currentValueForThemeAttribute:@"min-size"],
1388 maxSize = [
self currentValueForThemeAttribute:@"max-size"],
1389 lineBreakMode = [
self lineBreakMode],
1390 text = (_stringValue ||
@" "),
1391 textSize = CGSizeMakeCopy(frameSize),
1392 font = [
self currentValueForThemeAttribute:@"font"];
1394 textSize.width -= contentInset.left + contentInset.right;
1395 textSize.height -= contentInset.top + contentInset.bottom;
1397 if (frameSize.width !== 0 &&
1398 ![
self isBezeled] &&
1401 textSize = [text sizeWithFont:font inWidth:textSize.width];
1405 textSize = [text sizeWithFont:font];
1408 textSize.width += 1;
1412 textSize.height += 1;
1414 frameSize.height = textSize.height + contentInset.top + contentInset.bottom;
1416 if ([
self isBezeled])
1418 frameSize.height = MAX(frameSize.height, minSize.height);
1420 if (maxSize.width > 0.0)
1421 frameSize.width = MIN(frameSize.width, maxSize.width);
1423 if (maxSize.height > 0.0)
1424 frameSize.height = MIN(frameSize.height, maxSize.height);
1427 frameSize.width = textSize.width + contentInset.left + contentInset.right;
1429 frameSize.width = MAX(frameSize.width, minSize.width);
1437 - (void)selectText:(
id)sender
1439 [
self _selectText:sender immediately:NO];
1442 - (void)_selectText:(
id)sender immediately:(BOOL)immediately
1445 if ([
self isEditable] || [
self isSelectable])
1447 var wind = [
self window];
1450 if ([
self isEditable])
1452 var element = [
self _inputElement];
1454 if ([wind firstResponder] ===
self)
1459 window.setTimeout(
function() { element.select(); }, 0);
1461 else if (wind !== nil && [wind makeFirstResponder:
self])
1462 [
self _selectText:sender immediately:immediately];
1466 [
self setSelectedRange:CPMakeRange(0, _stringValue.length)];
1471 if (wind !== nil && [wind firstResponder] !==
self)
1472 [wind makeFirstResponder:self];
1478 - (void)copy:(
id)sender
1481 var stringToCopy = nil;
1483 if ([
self isEditable])
1487 if (selectedRange.length < 1)
1490 stringToCopy = [_stringValue substringWithRange:selectedRange];
1503 [pasteboard declareTypes:[CPStringPboardType] owner:nil];
1504 [pasteboard setString:stringToCopy forType:CPStringPboardType];
1513 - (void)cut:(
id)sender
1515 if (![
self isEnabled])
1520 if (![
self isEditable])
1523 if (![[
CPApp currentEvent] _platformIsEffectingCutOrPaste])
1534 [
CPTimer scheduledTimerWithTimeInterval:0.0 target:
self selector:
@selector(keyUp:) userInfo:nil repeats:NO];
1538 - (void)paste:(
id)sender
1540 if (!([
self isEnabled] && [
self isEditable]))
1543 if (![[
CPApp currentEvent] _platformIsEffectingCutOrPaste])
1553 pasteString = [pasteboard stringForType:CPStringPboardType],
1554 newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:pasteString];
1558 [
self setSelectedRange:CPMakeRange(selectedRange.location + pasteString.length, 0)];
1567 [
CPTimer scheduledTimerWithTimeInterval:0.0 target:
self selector:
@selector(keyUp:) userInfo:nil repeats:NO];
1571 - (CPRange)selectedRange
1575 if ([[
self window] firstResponder] !==
self)
1583 var inputElement = [
self _inputElement],
1584 selectionStart = inputElement.selectionStart,
1585 selectionEnd = inputElement.selectionEnd;
1587 if ([selectionStart isKindOfClass:
CPNumber])
1588 return CPMakeRange(selectionStart, selectionEnd - selectionStart);
1591 var theDocument = inputElement.ownerDocument || inputElement.document,
1592 selectionRange = theDocument.selection.createRange(),
1593 range = inputElement.createTextRange();
1595 if (range.inRange(selectionRange))
1597 range.setEndPoint(
'EndToStart', selectionRange);
1598 return CPMakeRange(range.text.length, selectionRange.text.length);
1611 - (void)setSelectedRange:(CPRange)aRange
1613 if (![[
self window] firstResponder] ===
self)
1618 if (![
self isEditable])
1626 [contentView setSelectedRange:aRange];
1631 var inputElement = [
self _inputElement];
1635 if ([inputElement.selectionStart isKindOfClass:
CPNumber])
1637 inputElement.selectionStart = aRange.location;
1638 inputElement.selectionEnd =
CPMaxRange(aRange);
1643 var theDocument = inputElement.ownerDocument || inputElement.document,
1644 existingRange = theDocument.selection.createRange(),
1645 range = inputElement.createTextRange();
1647 if (range.inRange(existingRange))
1649 range.collapse(
true);
1650 range.move(
'character', aRange.location);
1651 range.moveEnd(
'character', aRange.length);
1663 - (void)selectAll:(
id)sender
1668 - (void)deleteBackward:(
id)sender
1670 if (!([
self isEnabled] && [
self isEditable]))
1675 if (selectedRange.length === 0)
1677 if (selectedRange.location < 1)
1681 selectedRange.location -= 1;
1682 selectedRange.length += 1;
1685 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1688 - (void)delete:(
id)sender
1690 if (!([
self isEnabled] && [
self isEditable]))
1696 if (selectedRange.length < 1)
1699 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1702 - (void)deleteForward:(
id)sender
1704 if (!([
self isEnabled] && [
self isEditable]))
1709 if (selectedRange.length === 0)
1711 if (selectedRange.location >= _stringValue.
length)
1715 selectedRange.length += 1;
1718 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1721 - (void)_replaceCharactersInRange:(CPRange)range withCharacters:(
CPString)characters
1723 var newValue = [_stringValue stringByReplacingCharactersInRange:range withString:characters];
1725 if (_invokedByUserEvent)
1727 [
self _setStringValue:newValue];
1731 [
self _setObjectValue:newValue useFormatter:NO];
1732 [
self setSelectedRange:CPMakeRange(range.location, 0)];
1736 [[[
self window] platformWindow] _propagateCurrentDOMEvent:NO];
1743 #pragma mark Setting the Delegate
1747 if (_delegate === aDelegate)
1750 _delegate = aDelegate;
1751 _implementedDelegateMethods = 0;
1753 if ([_delegate respondsToSelector:
@selector(control:didFailToFormatString:errorDescription:)])
1756 if ([_delegate respondsToSelector:
@selector(controlTextDidBeginEditing:)])
1759 if ([_delegate respondsToSelector:
@selector(controlTextDidChange:)])
1762 if ([_delegate respondsToSelector:
@selector(controlTextDidEndEditing:)])
1765 if ([_delegate respondsToSelector:
@selector(controlTextDidFocus:)])
1768 if ([_delegate respondsToSelector:
@selector(controlTextDidBlur:)])
1777 - (CGRect)contentRectForBounds:(CGRect)bounds
1781 return CGRectInsetByInset(bounds, contentInset);
1784 - (CGRect)bezelRectForBounds:(CGRect)bounds
1788 return CGRectInsetByInset(bounds, bezelInset);
1793 if (aName ===
"bezel-view")
1796 else if (aName ===
"content-view")
1804 if (aName ===
"bezel-view")
1806 var view = [[
CPView alloc] initWithFrame:CGRectMakeZero()];
1808 [view setHitTests:NO];
1814 var view = [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()];
1816 [view setHitTests:NO];
1824 - (void)layoutSubviews
1839 [contentView setHidden:(_stringValue && _stringValue.length > 0) && [
self hasThemeState:CPThemeStateEditing]];
1847 string = _stringValue;
1849 if ([
self isSecure])
1853 [contentView setText:string];
1865 [
self _setCSSStyleForInputElement];
1868 - (void)takeValueFromKeyPath:(
CPString)aKeyPath ofObjects:(CPArray)objects
1870 var count = objects.
length,
1871 value = [objects[0] valueForKeyPath:aKeyPath];
1877 if (value !== [objects[count] valueForKeyPath:aKeyPath])
1884 #pragma mark Overrides
1904 if ([[
self window] firstResponder] ===
self)
1905 [
self _resignFirstKeyResponder];
1908 - (void)viewDidUnhide
1912 if ([
self isEditable] && [[
self window] firstResponder] ===
self)
1913 [
self _becomeFirstKeyResponder];
1916 - (BOOL)validateUserInterfaceItem:(
id )anItem
1918 var theAction = [anItem action];
1920 if (![
self isEditable] && (theAction ==
@selector(cut:) || theAction ==
@selector(paste:) || theAction ==
@selector(
delete:)))
1924 if (![
self isEditable])
1927 if (theAction ==
@selector(copy:) || theAction ==
@selector(cut:) || theAction ==
@selector(
delete:))
1933 #pragma mark Private
1935 - (BOOL)_isWithinUsablePlatformRect
1940 var wind = [
self window];
1946 var
frame = [
self convertRectToBase:[
self contentRectForBounds:[
self bounds]]],
1947 usableRect = [[wind platformWindow] usableContentFrame];
1949 frame.origin = [wind convertBaseToGlobal:frame.origin];
1951 return (CGRectGetMinX(frame) >= CGRectGetMinX(usableRect) &&
1952 CGRectGetMaxX(frame) <= CGRectGetMaxX(usableRect) &&
1953 CGRectGetMinY(frame) >= CGRectGetMinY(usableRect) &&
1954 CGRectGetMaxY(frame) <= CGRectGetMaxY(usableRect));
1997 [
self setEditable:[aCoder decodeBoolForKey:CPTextFieldIsEditableKey]];
1998 [
self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]];
2004 [
self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]];
2005 [
self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]];
2009 [
self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]];
2010 [
self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]];
2011 [
self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]];
2025 [aCoder encodeBool:_isEditable forKey:CPTextFieldIsEditableKey];
2026 [aCoder encodeBool:_isSelectable forKey:CPTextFieldIsSelectableKey];
2028 [aCoder encodeBool:_drawsBackground forKey:CPTextFieldDrawsBackgroundKey];
2030 [aCoder encodeObject:_textFieldBackgroundColor forKey:CPTextFieldBackgroundColorKey];
2032 [aCoder encodeInt:[
self lineBreakMode] forKey:CPTextFieldLineBreakModeKey];
2033 [aCoder encodeInt:[
self alignment] forKey:CPTextFieldAlignmentKey];
2035 [aCoder encodeObject:_placeholderString forKey:CPTextFieldPlaceholderStringKey];
2037 [aCoder encodeBool:_usesSingleLineMode forKey:CPTextFieldUsesSingleLineMode];
2038 [aCoder encodeBool:_wraps forKey:CPTextFieldWraps];
2039 [aCoder encodeBool:_scrolls forKey:CPTextFieldScrolls];
2043 @implementation _CPTextFieldValueBinder :
CPBinder
2050 [
super _updatePlaceholdersWithOptions:options];
2052 [
self _setPlaceholder:@"Multiple Values" forMarker:CPMultipleValuesMarker isDefault:YES];
2053 [
self _setPlaceholder:@"No Selection" forMarker:CPNoSelectionMarker isDefault:YES];
2054 [
self _setPlaceholder:@"Not Applicable" forMarker:CPNotApplicableMarker isDefault:YES];
2055 [
self _setPlaceholder:@"" forMarker:CPNullMarker isDefault:YES];
2058 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
2060 [_source setPlaceholderString:aValue];
2061 [_source setObjectValue:nil];
2064 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
2066 if (!aValue || (aValue.isa && [aValue isMemberOfClass:
CPNull]))
2067 [_source setPlaceholderString:[
self _placeholderForMarker:CPNullMarker]];
2069 [_source setObjectValue:aValue];
2072 - (void)reverseSetValueFor:(
CPString)aBinding
2074 var destination = [_info objectForKey:CPObservedObjectKey],
2075 keyPath = [_info objectForKey:CPObservedKeyPathKey],
2076 options = [_info objectForKey:CPOptionsKey],
2077 newValue = [
self valueForBinding:aBinding],
2078 value = [destination valueForKeyPath:keyPath];
2082 newValue = [
self reverseTransformValue:newValue withOptions:options];
2084 [
self suppressSpecificNotificationFromObject:destination keyPath:keyPath];
2085 [destination setValue:newValue forKeyPath:keyPath];
2086 [
self unsuppressSpecificNotificationFromObject:destination keyPath:keyPath];
2095 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
2097 [_source setPlaceholderString:aValue];
2098 [_source setObjectValue:nil];
2101 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
2103 if (!aValue || (aValue.isa && [aValue isMemberOfClass:
CPNull]))
2104 [_source setPlaceholderString:[
self _placeholderForMarker:CPNullMarker]];
2106 [_source setObjectValue:aValue];