29 @protocol CPTextFieldDelegate <CPControlTextEditingDelegate>
41 @
typedef CPTextFieldBezelStyle
67 if (owner && domElement != inputElement.parentNode)
70 var ownerWindow = [owner window];
72 if (!resigning && [ownerWindow isKeyWindow] && [ownerWindow firstResponder] === owner)
81 [ownerWindow makeFirstResponder:nil];
85 @deref(didBlurRef) = YES;
92 @deref(ownerRef) = nil;
124 BOOL _willBecomeFirstResponderByClick;
125 BOOL _invokedByUserEvent;
127 BOOL _drawsBackground;
129 CPColor _textFieldBackgroundColor;
134 id <CPTextFieldDelegate> _delegate;
135 unsigned _implementedDelegateMethods;
138 CPTextFieldBezelStyle _bezelStyle;
140 BOOL _usesSingleLineMode;
145 + (Class)_binderClassForBinding:(
CPString)aBinding
148 return [_CPTextFieldValueBinder class];
150 return [_CPTextFieldPatternValueBinder class];
154 return [
super _binderClassForBinding:aBinding];
164 var textField = [[
self alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
166 [textField setTheme:aTheme];
167 [textField setStringValue:aStringValue];
168 [textField setPlaceholderString:aPlaceholder];
169 [textField setBordered:YES];
170 [textField setBezeled:YES];
171 [textField setEditable:YES];
173 [textField sizeToFit];
185 var textField = [[
CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
187 [textField setTheme:aTheme];
188 [textField setStringValue:aStringValue];
189 [textField setPlaceholderString:aPlaceholder];
190 [textField setBezelStyle:CPTextFieldRoundedBezel];
191 [textField setBordered:YES];
192 [textField setBezeled:YES];
193 [textField setEditable:YES];
195 [textField sizeToFit];
207 var textField = [[
self alloc] init];
209 [textField setStringValue:aTitle];
210 [textField sizeToFit];
223 @"bezel-inset": CGInsetMakeZero(),
224 @"content-inset": CGInsetMake(1.0, 0.0, 0.0, 0.0),
231 #pragma mark Control Size 233 - (void)setControlSize:(CPControlSize)aControlSize
237 if ([
self isBezeled])
238 [
self _sizeToControlSize];
245 - (DOMElement)_inputElement
323 [CPTextFieldInputOwner keyUp:cappEvent];
341 else if (_usesSingleLineMode)
350 - (id)initWithFrame:(CGRect)aFrame
367 #pragma mark Controlling Editability and Selectability 373 - (void)setEditable:(BOOL)shouldBeEditable
375 if (_isEditable === shouldBeEditable)
378 _isEditable = shouldBeEditable;
380 if (shouldBeEditable)
390 [[
self window] makeFirstResponder:nil];
392 if (shouldBeEditable)
412 - (void)setEnabled:(BOOL)shouldBeEnabled
417 if (!shouldBeEnabled && [[
self window] firstResponder] ===
self)
427 - (void)setSelectable:(BOOL)aFlag
429 _isSelectable = aFlag;
439 return _isSelectable;
446 - (void)setSecure:(BOOL)aFlag
464 - (void)setBezeled:(BOOL)shouldBeBezeled
477 return [
self hasThemeState:CPThemeStateBezeled];
484 - (void)setBezelStyle:(CPTextFieldBezelStyle)aBezelStyle
497 - (CPTextFieldBezelStyle)bezelStyle
509 - (void)setBordered:(BOOL)shouldBeBordered
511 if (shouldBeBordered)
522 return [
self hasThemeState:CPThemeStateBordered];
529 - (void)setDrawsBackground:(BOOL)shouldDrawBackground
531 if (_drawsBackground == shouldDrawBackground)
534 _drawsBackground = shouldDrawBackground;
543 - (BOOL)drawsBackground
545 return _drawsBackground;
552 - (void)setTextFieldBackgroundColor:(
CPColor)aColor
554 if (_textFieldBackgroundColor == aColor)
557 _textFieldBackgroundColor = aColor;
568 return _textFieldBackgroundColor;
572 - (void)_setUsesSingleLineMode:(BOOL)aFlag
574 _usesSingleLineMode = aFlag;
578 - (void)_setWraps:(BOOL)aFlag
584 - (void)_setScrolls:(BOOL)aFlag
590 - (BOOL)acceptsFirstResponder
596 - (BOOL)becomeFirstResponder
598 if (![
self isEnabled] || ![super becomeFirstResponder])
602 [
self _setObserveWindowKeyNotifications:YES];
606 if ([[
self window] isKeyWindow] && [
self isEditable])
607 return [
self _becomeFirstKeyResponder];
620 - (BOOL)_becomeFirstKeyResponder
624 if (![
self _isWithinUsablePlatformRect])
629 if (![
self isEditable])
634 [
self _updatePlaceholderState];
643 [
self _setCSSStyleForInputElement];
645 var element = [
self _inputElement];
646 element.value = _stringValue;
647 _DOMElement.appendChild(element);
651 if (document.attachEvent)
664 if (CPTextFieldInputOwner !== self)
668 var previousScrollingOrigin = [
self _scrollToVisibleRectAndReturnPreviousOrigin];
672 [
self _restorePreviousScrollingOrigin:previousScrollingOrigin];
675 if (!_willBecomeFirstResponderByClick)
677 [
self _selectText:self immediately:YES];
681 var point = CGPointMake([
self convertPointFromBase:[[CPApp currentEvent] locationInWindow]].x - [
self currentValueForThemeAttribute:@"content-inset"].left, 0),
687 _willBecomeFirstResponderByClick = NO;
701 - (void)_setEnableCSSSelection:(BOOL)shouldEnable
708 _DOMElement.style[CPBrowserStyleProperty(@"user-select")] = shouldEnable ?
@"text" :
@"none";
716 - (void)_setCSSStyleForInputElement
720 var element = [
self _inputElement],
721 font = [
self currentValueForThemeAttribute:@"font"],
724 verticalAlign = [
self currentValueForThemeAttribute:"vertical-alignment"],
725 left = CGRectGetMinX(contentRect);
731 switch (verticalAlign)
734 var topPoint = CGRectGetMinY(contentRect) +
"px";
738 var topPoint = (CGRectGetMidY(contentRect) - (lineHeight / 2)) +
"px";
742 var topPoint = (CGRectGetMaxY(contentRect) - lineHeight) +
"px";
746 var topPoint = CGRectGetMinY(contentRect) +
"px";
751 element.style.color = [[
self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder] cssString];
753 element.style.color = [[
self valueForThemeAttribute:@"text-color" inState:CPThemeStateEditing] cssString];
755 switch ([
self alignment])
758 element.style.textAlign =
"center";
762 element.style.textAlign =
"right";
766 element.style.textAlign =
"";
770 element.style.textAlign =
"left";
773 var isTextArea = element.nodeName.toUpperCase() ==
"TEXTAREA";
775 element.style.zIndex = 1000;
776 element.style.top = topPoint;
777 element.style.lineHeight = ROUND(lineHeight) +
"px";
778 element.style.height = isTextArea ? CGRectGetHeight(contentRect) +
"px" : ROUND(lineHeight) +
"px";;
779 element.style.width = CGRectGetWidth(contentRect) +
"px";
780 element.style.left = left +
"px";
781 element.style.verticalAlign =
"top";
782 element.style.cursor =
"auto";
786 element.style.whiteSpace = _wraps ?
"pre" :
"nowrap";
792 - (BOOL)resignFirstResponder
798 var element = [
self _inputElement],
799 newValue = element.value,
802 if (newValue !== _stringValue)
804 [
self _setStringValue:newValue];
809 if ([
self _valueIsValid:newValue] === NO)
812 var previousScrollingOrigin = [
self _scrollToVisibleRectAndReturnPreviousOrigin];
816 [
self _restorePreviousScrollingOrigin:previousScrollingOrigin];
824 [
self _setObserveWindowKeyNotifications:NO];
826 if ([[
self window] isKeyWindow])
827 [
self _resignFirstKeyResponder];
831 if ([
self isEditable])
835 if ([
self sendsActionOnEndEditing])
844 - (void)_resignFirstKeyResponder
851 _willBecomeFirstResponderByClick = NO;
853 [
self _updatePlaceholderState];
858 var element = [
self _inputElement];
871 if (element.parentNode == _DOMElement)
872 element.parentNode.removeChild(element);
876 if (document.attachEvent)
888 - (void)_setObserveWindowKeyNotifications:(BOOL)shouldObserve
902 - (void)_removeObservers
907 [
super _removeObservers];
908 [
self _setObserveWindowKeyNotifications:NO];
911 - (void)_addObservers
916 [
super _addObservers];
918 if ([[
self window] firstResponder] ===
self)
919 [
self _setObserveWindowKeyNotifications:YES];
924 if (![[
self window] isKeyWindow])
925 [
self _resignFirstKeyResponder];
930 if (!([
self isEnabled] && [
self isEditable]))
935 if ([wind isKeyWindow] && [wind firstResponder] ===
self)
936 if (![
self _becomeFirstKeyResponder])
937 [wind makeFirstResponder:nil];
940 - (BOOL)_valueIsValid:(
CPString)aValue
946 if ([
self _setStringValue:aValue isNewValue:NO errorDescription:@ref(error)] === NO)
948 var acceptInvalidValue = NO;
951 acceptInvalidValue = [_delegate control:self didFailToFormatString:aValue errorDescription:error];
953 if (acceptInvalidValue === NO)
966 - (BOOL)needsPanelToBecomeKey
992 if (![
self isEnabled])
993 return [[
self nextResponder] mouseDown:anEvent];
996 if ([
self isEditable] && [
self isEnabled])
998 _willBecomeFirstResponderByClick = YES;
1001 else if ([
self isSelectable])
1003 [
self _setEnableCSSSelection:YES];
1004 if (document.attachEvent)
1015 return [[
self nextResponder] mouseDown:anEvent];
1020 if (![
self isEnabled] || !([
self isSelectable] || [
self isEditable]))
1021 [[
self nextResponder] mouseUp:anEvent];
1022 else if ([
self isSelectable])
1024 if (document.attachEvent)
1035 if ([[
CPApp currentEvent] clickCount] === 3)
1047 if ([
self menuForEvent:anEvent] || [[
self nextResponder] isKindOfClass:
CPView])
1055 if (![
self isEnabled] || !([
self isSelectable] || [
self isEditable]))
1056 [[
self nextResponder] mouseDragged:anEvent];
1057 else if ([
self isSelectable])
1063 if (!([
self isEnabled] && [
self isEditable]))
1067 var newValue = [
self _inputElement].value;
1069 if (newValue !== _stringValue)
1071 [
self _setStringValue:newValue];
1081 if (!([
self isEnabled] && [
self isEditable]))
1092 _invokedByUserEvent = !!anEvent._DOMEvent;
1093 [
self interpretKeyEvents:[anEvent]];
1094 _invokedByUserEvent = NO;
1108 - (void)doCommandBySelector:(
SEL)aSelector
1110 if ([
self respondsToSelector:aSelector])
1111 [
self performSelector:aSelector];
1114 - (void)insertNewline:(
id)sender
1116 if (!([
self isEnabled] && [
self isEditable]))
1119 var newValue = [
self _inputElement].value;
1121 if (newValue !== _stringValue)
1123 [
self _setStringValue:newValue];
1127 if ([
self _valueIsValid:_stringValue])
1142 if (![
self action] || [
self sendAction:[
self action] to:[
self target]])
1151 - (void)insertNewlineIgnoringFieldEditor:(
id)sender
1153 [
self _insertCharacterIgnoringFieldEditor:CPNewlineCharacter];
1156 - (void)insertTabIgnoringFieldEditor:(
id)sender
1158 [
self _insertCharacterIgnoringFieldEditor:CPTabCharacter];
1161 - (void)_insertCharacterIgnoringFieldEditor:(
CPString)aCharacter
1163 if (!([
self isEnabled] && [
self isEditable]))
1168 var oldValue = _stringValue,
1170 element = [
self _inputElement];
1175 element.value = [element.value stringByReplacingCharactersInRange:[
self selectedRange] withString:aCharacter];
1177 [
self _setStringValue:element.value];
1180 if (oldValue !== _stringValue)
1191 if ([note
object] !=
self)
1195 [_delegate controlTextDidBlur:note];
1203 if ([note
object] !==
self)
1207 [_delegate controlTextDidFocus:note];
1214 if ([note
object] !==
self)
1217 [
self _continuouslyReverseSetBinding];
1220 [_delegate controlTextDidChange:note];
1228 if ([note
object] !=
self)
1240 if ([note
object] !=
self)
1246 [_delegate controlTextDidEndEditing:note];
1261 - (BOOL)_setStringValue:(
CPString)aValue
1263 return [
self _setStringValue:aValue isNewValue:YES errorDescription:nil];
1270 - (BOOL)_setStringValue:(
CPString)aValue isNewValue:(BOOL)isNewValue errorDescription:(CPStringRef)anError
1272 _stringValue = aValue;
1274 var objectValue = aValue,
1282 if ([formatter getObjectValue:@ref(
object) forString:aValue errorDescription:anError])
1283 objectValue =
object;
1286 objectValue = undefined;
1290 isNewValue |= objectValue !== [
super objectValue];
1295 [
self willChangeValueForKey:@"objectValue"];
1297 [
self _updatePlaceholderState];
1298 [
self didChangeValueForKey:@"objectValue"];
1304 - (void)setObjectValue:(
id)aValue
1306 [
self _setObjectValue:aValue useFormatter:YES];
1309 - (void)_setObjectValue:(
id)aValue useFormatter:(BOOL)useFormatter
1315 if (useFormatter && formatter)
1318 var formattedString = [
self hasThemeState:CPThemeStateEditing] ? [formatter editingStringForObjectValue:aValue] : [formatter stringForObjectValue:aValue];
1320 if (formattedString === nil)
1326 if ([formatter getObjectValue:@ref(value) forString:
@"" errorDescription:nil] === NO)
1330 _stringValue = (value === nil || value === undefined) ?
@"" : String(value);
1333 _stringValue = formattedString;
1341 [
self _inputElement].value = _stringValue;
1345 [
self _updatePlaceholderState];
1348 - (void)_updatePlaceholderState
1350 if (!_stringValue || _stringValue.
length === 0)
1362 if (_placeholderString === aStringValue)
1365 _placeholderString = aStringValue;
1380 return _placeholderString;
1408 - (CGSize)_minimumFrameSize
1411 contentInset = [
self currentValueForThemeAttribute:@"content-inset"],
1412 minSize = [
self currentValueForThemeAttribute:@"min-size"],
1413 maxSize = [
self currentValueForThemeAttribute:@"max-size"],
1415 text = (_stringValue ||
@" "),
1416 textSize = CGSizeMakeCopy(frameSize),
1417 font = [
self currentValueForThemeAttribute:@"font"];
1419 textSize.width -= contentInset.left + contentInset.right;
1420 textSize.height -= contentInset.top + contentInset.bottom;
1422 if (frameSize.width !== 0 &&
1423 ![
self isBezeled] &&
1426 textSize = [text sizeWithFont:font inWidth:textSize.width];
1430 textSize = [text sizeWithFont:font];
1433 textSize.width += 1;
1437 textSize.height += 1;
1439 frameSize.height = textSize.height + contentInset.top + contentInset.bottom;
1441 if ([
self isBezeled])
1443 frameSize.height = MAX(frameSize.height, minSize.height);
1445 if (maxSize.width > 0.0)
1446 frameSize.width = MIN(frameSize.width, maxSize.width);
1448 if (maxSize.height > 0.0)
1449 frameSize.height = MIN(frameSize.height, maxSize.height);
1452 frameSize.width = textSize.width + contentInset.left + contentInset.right;
1454 frameSize.width = MAX(frameSize.width, minSize.width);
1462 - (void)selectText:(
id)sender
1464 [
self _selectText:sender immediately:NO];
1467 - (void)_selectText:(
id)sender immediately:(BOOL)immediately
1470 if ([
self isEditable] || [
self isSelectable])
1472 var wind = [
self window];
1475 if ([
self isEditable])
1477 var element = [
self _inputElement];
1479 if ([wind firstResponder] ===
self)
1486 else if (wind !== nil && [wind makeFirstResponder:
self])
1487 [
self _selectText:sender immediately:immediately];
1496 if (wind !== nil && [wind firstResponder] !==
self)
1497 [wind makeFirstResponder:self];
1503 - (void)copy:(
id)sender
1506 var stringToCopy = nil;
1508 if ([
self isEditable])
1512 if (selectedRange.length < 1)
1515 stringToCopy = [_stringValue substringWithRange:selectedRange];
1528 [pasteboard declareTypes:[CPStringPboardType] owner:nil];
1529 [pasteboard setString:stringToCopy forType:CPStringPboardType];
1538 - (void)cut:(
id)sender
1540 if (![
self isEnabled])
1545 if (![
self isEditable])
1548 if (![[
CPApp currentEvent] _platformIsEffectingCutOrPaste])
1563 - (void)paste:(
id)sender
1565 if (!([
self isEnabled] && [
self isEditable]))
1568 if (![[
CPApp currentEvent] _platformIsEffectingCutOrPaste])
1578 pasteString = [pasteboard stringForType:CPStringPboardType],
1579 newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:pasteString];
1583 [
self setSelectedRange:CPMakeRange(selectedRange.location + pasteString.length, 0)];
1596 - (CPRange)selectedRange
1600 if ([[
self window] firstResponder] !==
self)
1608 var inputElement = [
self _inputElement],
1609 selectionStart = inputElement.selectionStart,
1610 selectionEnd = inputElement.selectionEnd;
1612 if ([selectionStart isKindOfClass:
CPNumber])
1613 return CPMakeRange(selectionStart, selectionEnd - selectionStart);
1616 var theDocument = inputElement.ownerDocument || inputElement.document,
1617 selectionRange = theDocument.selection.createRange(),
1618 range = inputElement.createTextRange();
1620 if (range.inRange(selectionRange))
1622 range.setEndPoint(
'EndToStart', selectionRange);
1623 return CPMakeRange(range.text.length, selectionRange.text.length);
1636 - (void)setSelectedRange:(CPRange)aRange
1638 if (![[
self window] firstResponder] ===
self)
1643 if (![
self isEditable])
1651 [contentView setSelectedRange:aRange];
1656 var inputElement = [
self _inputElement];
1660 if ([inputElement.selectionStart isKindOfClass:
CPNumber])
1662 inputElement.selectionStart = aRange.location;
1663 inputElement.selectionEnd =
CPMaxRange(aRange);
1668 var theDocument = inputElement.ownerDocument || inputElement.document,
1669 existingRange = theDocument.selection.createRange(),
1670 range = inputElement.createTextRange();
1672 if (range.inRange(existingRange))
1674 range.collapse(
true);
1675 range.move(
'character', aRange.location);
1676 range.moveEnd(
'character', aRange.length);
1688 - (void)selectAll:(
id)sender
1693 - (void)deleteBackward:(
id)sender
1695 if (!([
self isEnabled] && [
self isEditable]))
1700 if (selectedRange.length === 0)
1702 if (selectedRange.location < 1)
1706 selectedRange.location -= 1;
1707 selectedRange.length += 1;
1710 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1713 - (void)delete:(
id)sender
1715 if (!([
self isEnabled] && [
self isEditable]))
1721 if (selectedRange.length < 1)
1724 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1727 - (void)deleteForward:(
id)sender
1729 if (!([
self isEnabled] && [
self isEditable]))
1734 if (selectedRange.length === 0)
1736 if (selectedRange.location >= _stringValue.
length)
1740 selectedRange.length += 1;
1743 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1746 - (void)_replaceCharactersInRange:(CPRange)range withCharacters:(
CPString)characters
1748 var newValue = [_stringValue stringByReplacingCharactersInRange:range withString:characters];
1750 if (_invokedByUserEvent)
1752 [
self _setStringValue:newValue];
1756 [
self _setObjectValue:newValue useFormatter:NO];
1768 #pragma mark Setting the Delegate 1770 - (void)setDelegate:(
id <CPTextFieldDelegate>)aDelegate
1772 if (_delegate === aDelegate)
1775 _delegate = aDelegate;
1776 _implementedDelegateMethods = 0;
1778 if ([_delegate respondsToSelector:
@selector(control:didFailToFormatString:errorDescription:)])
1781 if ([_delegate respondsToSelector:
@selector(controlTextDidBeginEditing:)])
1784 if ([_delegate respondsToSelector:
@selector(controlTextDidChange:)])
1787 if ([_delegate respondsToSelector:
@selector(controlTextDidEndEditing:)])
1790 if ([_delegate respondsToSelector:
@selector(controlTextDidFocus:)])
1793 if ([_delegate respondsToSelector:
@selector(controlTextDidBlur:)])
1802 - (CGRect)contentRectForBounds:(CGRect)bounds
1804 var contentInset = [
self currentValueForThemeAttribute:@"content-inset"];
1806 return CGRectInsetByInset(
bounds, contentInset);
1809 - (CGRect)bezelRectForBounds:(CGRect)bounds
1811 var bezelInset = [
self currentValueForThemeAttribute:@"bezel-inset"];
1813 return CGRectInsetByInset(
bounds, bezelInset);
1818 if (aName ===
"bezel-view")
1821 else if (aName ===
"content-view")
1829 if (aName ===
"bezel-view")
1831 var view = [[
CPView alloc] initWithFrame:CGRectMakeZero()];
1833 [view setHitTests:NO];
1839 var view = [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()];
1841 [view setHitTests:NO];
1849 - (void)layoutSubviews
1856 [bezelView setBackgroundColor:[
self currentValueForThemeAttribute:@"bezel-color"]];
1864 [contentView setHidden:(_stringValue && _stringValue.length > 0) && [
self hasThemeState:CPThemeStateEditing]];
1872 string = _stringValue;
1874 if ([
self isSecure])
1878 [contentView setText:string];
1880 [contentView setTextColor:[
self currentValueForThemeAttribute:@"text-color"]];
1881 [contentView setFont:[
self currentValueForThemeAttribute:@"font"]];
1882 [contentView setAlignment:[
self currentValueForThemeAttribute:@"alignment"]];
1883 [contentView setVerticalAlignment:[
self currentValueForThemeAttribute:@"vertical-alignment"]];
1884 [contentView setLineBreakMode:[
self currentValueForThemeAttribute:@"line-break-mode"]];
1885 [contentView setTextShadowColor:[
self currentValueForThemeAttribute:@"text-shadow-color"]];
1886 [contentView setTextShadowOffset:[
self currentValueForThemeAttribute:@"text-shadow-offset"]];
1890 [
self _setCSSStyleForInputElement];
1893 - (void)takeValueFromKeyPath:(
CPString)aKeyPath ofObjects:(CPArray)objects
1895 var count = objects.
length,
1896 value = [objects[0] valueForKeyPath:aKeyPath];
1902 if (value !== [objects[count] valueForKeyPath:aKeyPath])
1909 #pragma mark Overrides 1919 var placeholderColor = [
self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder];
1929 if ([[
self window] firstResponder] ===
self)
1930 [
self _resignFirstKeyResponder];
1933 - (void)viewDidUnhide
1937 if ([
self isEditable] && [[
self window] firstResponder] ===
self)
1938 [
self _becomeFirstKeyResponder];
1941 - (BOOL)validateUserInterfaceItem:(
id )anItem
1943 var theAction = [anItem action];
1945 if (![
self isEditable] && (theAction ==
@selector(cut:) || theAction ==
@selector(paste:) || theAction ==
@selector(
delete:)))
1949 if (![
self isEditable])
1952 if (theAction ==
@selector(copy:) || theAction ==
@selector(cut:) || theAction ==
@selector(
delete:))
1958 #pragma mark Private 1960 - (BOOL)_isWithinUsablePlatformRect
1965 var wind = [
self window];
1972 previousContentViewBoundsOrigin;
1975 var previousScrollingOrigin = [
self _scrollToVisibleRectAndReturnPreviousOrigin];
1978 usableRect = [[wind platformWindow] usableContentFrame];
1980 frame.origin = [wind convertBaseToGlobal:frame.origin];
1983 [
self _restorePreviousScrollingOrigin:previousScrollingOrigin];
1985 return (CGRectGetMinX(frame) >= CGRectGetMinX(usableRect) &&
1986 CGRectGetMaxX(frame) <= CGRectGetMaxX(usableRect) &&
1987 CGRectGetMinY(frame) >= CGRectGetMinY(usableRect) &&
1988 CGRectGetMaxY(frame) <= CGRectGetMaxY(usableRect));
1994 - (CGPoint)_scrollToVisibleRectAndReturnPreviousOrigin
1997 previousContentViewBoundsOrigin;
2002 previousContentViewBoundsOrigin = CGPointMakeCopy([[scrollView contentView] boundsOrigin]);
2004 if (![[
self superview] scrollRectToVisible:[
self frame]])
2005 previousContentViewBoundsOrigin = nil;
2008 return previousContentViewBoundsOrigin;
2014 - (void)_restorePreviousScrollingOrigin:(CGPoint)scrollingOrigin
2016 if (scrollingOrigin)
2060 [
self setEditable:[aCoder decodeBoolForKey:CPTextFieldIsEditableKey]];
2061 [
self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]];
2067 [
self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]];
2068 [
self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]];
2072 [
self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]];
2073 [
self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]];
2074 [
self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]];
2088 [aCoder encodeBool:_isEditable forKey:CPTextFieldIsEditableKey];
2089 [aCoder encodeBool:_isSelectable forKey:CPTextFieldIsSelectableKey];
2091 [aCoder encodeBool:_drawsBackground forKey:CPTextFieldDrawsBackgroundKey];
2093 [aCoder encodeObject:_textFieldBackgroundColor forKey:CPTextFieldBackgroundColorKey];
2095 [aCoder encodeInt:[
self lineBreakMode] forKey:CPTextFieldLineBreakModeKey];
2096 [aCoder encodeInt:[
self alignment] forKey:CPTextFieldAlignmentKey];
2098 [aCoder encodeObject:_placeholderString forKey:CPTextFieldPlaceholderStringKey];
2100 [aCoder encodeBool:_usesSingleLineMode forKey:CPTextFieldUsesSingleLineMode];
2101 [aCoder encodeBool:_wraps forKey:CPTextFieldWraps];
2102 [aCoder encodeBool:_scrolls forKey:CPTextFieldScrolls];
2106 @implementation _CPTextFieldValueBinder :
CPBinder 2113 [
super _updatePlaceholdersWithOptions:options];
2115 [
self _setPlaceholder:@"Multiple Values" forMarker:CPMultipleValuesMarker isDefault:YES];
2116 [
self _setPlaceholder:@"No Selection" forMarker:CPNoSelectionMarker isDefault:YES];
2117 [
self _setPlaceholder:@"Not Applicable" forMarker:CPNotApplicableMarker isDefault:YES];
2118 [
self _setPlaceholder:@"" forMarker:CPNullMarker isDefault:YES];
2121 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
2123 [_source setPlaceholderString:aValue];
2124 [_source setObjectValue:nil];
2127 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
2129 if (!aValue || (aValue.isa && [aValue isMemberOfClass:
CPNull]))
2130 [_source setPlaceholderString:[
self _placeholderForMarker:
CPNullMarker]];
2132 [_source setObjectValue:aValue];
2135 - (void)reverseSetValueFor:(
CPString)aBinding
2137 var destination = [_info objectForKey:CPObservedObjectKey],
2138 keyPath = [_info objectForKey:CPObservedKeyPathKey],
2139 options = [_info objectForKey:CPOptionsKey],
2140 newValue = [
self valueForBinding:aBinding],
2141 value = [destination valueForKeyPath:keyPath];
2146 newValue = [
self reverseTransformValue:newValue withOptions:options];
2148 [
self suppressSpecificNotificationFromObject:destination keyPath:keyPath];
2149 [destination setValue:newValue forKeyPath:keyPath];
2150 [
self unsuppressSpecificNotificationFromObject:destination keyPath:keyPath];
2159 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
2161 [_source setPlaceholderString:aValue];
2162 [_source setObjectValue:nil];
2165 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
2167 if (!aValue || (aValue.isa && [aValue isMemberOfClass:
CPNull]))
2168 [_source setPlaceholderString:[
self _placeholderForMarker:
CPNullMarker]];
2170 [_source setObjectValue:aValue];
2177 - (void)updateTrackingAreas
2181 if ([
self isEnabled] && (_isEditable || _isSelectable))
2183 var myBounds = CGRectMakeCopy([
self bounds]),
2184 contentInset = [
self currentValueForThemeAttribute:@"content-inset"];
2187 options:CPTrackingMouseEnteredAndExited | CPTrackingCursorUpdate | CPTrackingActiveInKeyWindow
CPEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:(CPEventType anEventType, [location] CGPoint aPoint, [modifierFlags] unsigned int modifierFlags, [timestamp] CPTimeInterval aTimestamp, [windowNumber] int aWindowNumber, [context] CPGraphicsContext aGraphicsContext, [characters] CPString characters, [charactersIgnoringModifiers] CPString unmodCharacters, [isARepeat] BOOL repeatKey, [keyCode] unsigned short code)
BOOL makeFirstResponder:(CPResponder aResponder)
void setDrawsBackground:(BOOL shouldDrawBackground)
var CPTextFieldDOMStandardInputElement
CGRect convertRectToBase:(CGRect aRect)
void postNotification:(CPNotification aNotification)
var CPTextFieldIsBorderedKey
var CPTextFieldIsBezeledKey
float defaultLineHeightForFont()
var CPTextFieldAlignmentKey
void textDidChange:(CPNotification note)
BOOL setThemeState:(ThemeState aState)
var CPTextFieldTextDidChangeValue
void selectText:(id sender)
void setValue:forThemeAttribute:inState:(id aValue, [forThemeAttribute] CPString aName, [inState] ThemeState aState)
An object representation of nil.
var CPTextFieldCachedSelectStartFunction
void setSelectedRange:(CPRange aRange)
var CPTextFieldDelegate_controlTextDidBeginEditing_
The main run loop for the application.
var CPTextFieldDelegate_controlTextDidEndEditing_
CPTextField labelWithTitle:theme:(CPString aTitle, [theme] CPTheme aTheme)
void addObserver:selector:name:object:(id anObserver, [selector] SEL aSelector, [name] CPString aNotificationName, [object] id anObject)
void setLineBreakMode:(CPLineBreakMode mode)
var CPTextFieldInputOwner
CPResponder firstResponder()
void textDidChange:(CPNotification note)
var CPTextFieldDelegate_controlTextDidBlur_
var CPTextFieldInputFunction
function CPTextFieldHandleBlur(anEvent, ownerRef)
CPInputOnInputEventFeature
void selectAll:(id sender)
CPLineBreakByCharWrapping
CPTextField textFieldWithStringValue:placeholder:width:theme:(CPString aStringValue, [placeholder] CPString aPlaceholder, [width] float aWidth, [theme] CPTheme aTheme)
void textDidBeginEditing:(CPNotification note)
void textDidEndEditing:(CPNotification note)
id initWithFrame:(CGRect aFrame)
CPTextFieldDidBlurNotification
void deleteBackward:(id sender)
void setControlSize:(CPControlSize aControlSize)
void setEnabled:(BOOL isEnabled)
void setValue:forThemeAttribute:(id aValue, [forThemeAttribute] CPString aName)
CPTextFieldBezelStyle CPTextFieldSquareBezel
CPNotificationCenter defaultCenter()
A mutable key-value pair collection.
CPScrollView enclosingScrollView()
void rightMouseDown:(CPEvent anEvent)
var CPTextFieldIsSelectableKey
CPRunLoop currentRunLoop()
void setEditable:(BOOL shouldBeEditable)
void textDidBlur:(CPNotification note)
CGPoint convertPointFromBase:(CGPoint aPoint)
var CPTextFieldCachedDragFunction
CPView createEphemeralSubviewNamed:(CPString aViewName)
id initWithName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
void setPlaceholderString:(CPString aStringValue)
function CPMaxRange(aRange)
An immutable string (collection of characters).
CPAltEnterTextAreaFeature
if(CPFeatureIsCompatible(CPHTMLCanvasFeature))
var CPTextFieldInputIsActive
BOOL sendAction:to:(SEL anAction, [to] id anObject)
function CPFeatureIsCompatible(aFeature)
id initWithCoder:(CPCoder aCoder)
var CPTextFieldBezelStyleKey
void performBlock:argument:order:modes:(Function aBlock, [argument] id anArgument, [order] int anOrder, [modes] CPArray modes)
BOOL acceptsFirstResponder()
void textDidBeginEditing:(CPNotification note)
void setTextColor:(CPColor aColor)
var CPTextFieldDOMPasswordInputElement
CGRect contentRectForBounds:(CGRect bounds)
void setNeedsDisplay:(BOOL aFlag)
var CPTextFieldPlaceholderStringKey
void setObjectValue:(id anObject)
var CPTextFieldDelegate_controlTextDidChange_
CPTextAlignment alignment()
var CPSecureTextFieldCharacter
CGRect bezelRectForBounds:(CGRect bounds)
CPVerticalTextAlignment CPTopVerticalTextAlignment
var secureStringForString
void setStringValue:(CPString aString)
A notification that can be posted to a CPNotificationCenter.
CPTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:(CPTimeInterval seconds, [target] id aTarget, [selector] SEL aSelector, [userInfo] id userInfo, [repeats] BOOL shouldRepeat)
CPDate limitDateForMode:(CPString aMode)
var CPTextFieldIsEditableKey
CPBottomVerticalTextAlignment
var CPTextFieldDOMCurrentElement
A timer object that can send a message after the given time interval.
void setBoundsOrigin:(CGPoint aPoint)
Defines methods for use when archiving & restoring (enc/decoding).
void setAlignment:(CPTextAlignment alignment)
BOOL unsetThemeState:(ThemeState aState)
Sends messages (CPNotification) between objects.
CPNotification notificationWithName:object:userInfo:(CPString aNotificationName, [object] id anObject, [userInfo] CPDictionary aUserInfo)
CPString placeholderString()
void addTrackingArea:(CPTrackingArea trackingArea)
void setSelectable:(BOOL aFlag)
CPLineBreakMode lineBreakMode()
CPTimeInterval currentTimestamp()
var CPTextFieldDelegate_controlTextDidFocus_
var CPTextFieldLineBreakModeKey
var CPTextFieldBlurHandler
void textDidEndEditing:(CPNotification note)
CPTextField roundedTextFieldWithStringValue:placeholder:width:theme:(CPString aStringValue, [placeholder] CPString aPlaceholder, [width] float aWidth, [theme] CPTheme aTheme)
var CPTextFieldInputDidBlur
CPLineBreakMode CPLineBreakByWordWrapping
void setFrameSize:(CGSize aSize)
var CPTextFieldUsesSingleLineMode
var CPTextFieldDOMTextAreaElement
CPDisplayPatternValueBinding
void updateTrackingAreas()
CPTextFieldStatePlaceholder
void removeObserver:name:object:(id anObserver, [name] CPString aNotificationName, [object] id anObject)
var CPTexFieldCurrentCSSSelectableField
var CPTextFieldDrawsBackgroundKey
void setTextFieldBackgroundColor:(CPColor aColor)
var CPTextFieldBackgroundColorKey
CPTrackingArea initWithRect:options:owner:userInfo:(CGRect aRect, [options] CPTrackingAreaOptions options, [owner] id owner, [userInfo] CPDictionary userInfo)
CPPlatformWindow platformWindow()
void removeAllTrackingAreas()
CPTextFieldDidFocusNotification
var CPTextFieldInputResigning
A bridged object to native Javascript numbers.
void encodeWithCoder:(CPCoder aCoder)
void textDidFocus:(CPNotification note)
CPRange function CPMakeRange(location, length)
function CPTextFieldBlurFunction(anEvent, owner, domElement, inputElement, resigning, didBlurRef)
var CPTextFieldDelegate_control_didFailToFormatString_errorDescription_
CPView layoutEphemeralSubviewNamed:positioned:relativeToEphemeralSubviewNamed:(CPString aViewName, [positioned] CPWindowOrderingMode anOrderingMode, [relativeToEphemeralSubviewNamed] CPString relativeToViewName)
CPCenterVerticalTextAlignment
CGRect rectForEphemeralSubviewNamed:(CPString aViewName)