41 @
typedef CPTextFieldBezelStyle
67 if (owner && domElement != inputElement.parentNode)
70 var ownerWindow = [owner window];
72 if (!resigning && [ownerWindow isKeyWindow])
79 if ([owner _isWithinUsablePlatformRect])
84 var previousScrollingOrigin = [owner _scrollToVisibleRectAndReturnPreviousOrigin];
88 [owner _restorePreviousScrollingOrigin:previousScrollingOrigin];
95 @deref(didBlurRef) = YES;
102 @deref(ownerRef) = nil;
134 BOOL _willBecomeFirstResponderByClick;
135 BOOL _invokedByUserEvent;
137 BOOL _drawsBackground;
139 CPColor _textFieldBackgroundColor;
144 id <CPTextFieldDelegate> _delegate;
145 unsigned _implementedDelegateMethods;
148 CPTextFieldBezelStyle _bezelStyle;
150 BOOL _usesSingleLineMode;
155 + (Class)_binderClassForBinding:(
CPString)aBinding
158 return [_CPTextFieldValueBinder class];
160 return [_CPTextFieldPatternValueBinder class];
164 return [
super _binderClassForBinding:aBinding];
174 var textField = [[
self alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
176 [textField setTheme:aTheme];
177 [textField setStringValue:aStringValue];
178 [textField setPlaceholderString:aPlaceholder];
179 [textField setBordered:YES];
180 [textField setBezeled:YES];
181 [textField setEditable:YES];
183 [textField sizeToFit];
195 var textField = [[
CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, aWidth, 29.0)];
197 [textField setTheme:aTheme];
198 [textField setStringValue:aStringValue];
199 [textField setPlaceholderString:aPlaceholder];
200 [textField setBezelStyle:CPTextFieldRoundedBezel];
201 [textField setBordered:YES];
202 [textField setBezeled:YES];
203 [textField setEditable:YES];
205 [textField sizeToFit];
217 var textField = [[
self alloc] init];
219 [textField setStringValue:aTitle];
220 [textField sizeToFit];
233 @"bezel-inset": CGInsetMakeZero(),
234 @"content-inset": CGInsetMake(1.0, 0.0, 0.0, 0.0),
241 #pragma mark Control Size 243 - (void)setControlSize:(CPControlSize)aControlSize
247 if ([
self isBezeled])
248 [
self _sizeToControlSize];
255 - (DOMElement)_inputElement
333 [CPTextFieldInputOwner keyUp:cappEvent];
351 else if (_usesSingleLineMode)
360 - (id)initWithFrame:(CGRect)aFrame
377 #pragma mark Controlling Editability and Selectability 383 - (void)setEditable:(BOOL)shouldBeEditable
385 if (_isEditable === shouldBeEditable)
388 _isEditable = shouldBeEditable;
390 if (shouldBeEditable)
400 [[
self window] makeFirstResponder:nil];
402 if (shouldBeEditable)
420 - (void)setEnabled:(BOOL)shouldBeEnabled
425 if (!shouldBeEnabled && [[
self window] firstResponder] ===
self)
433 - (void)setSelectable:(BOOL)aFlag
435 _isSelectable = aFlag;
443 return _isSelectable;
450 - (void)setSecure:(BOOL)aFlag
468 - (void)setBezeled:(BOOL)shouldBeBezeled
481 return [
self hasThemeState:CPThemeStateBezeled];
488 - (void)setBezelStyle:(CPTextFieldBezelStyle)aBezelStyle
501 - (CPTextFieldBezelStyle)bezelStyle
513 - (void)setBordered:(BOOL)shouldBeBordered
515 if (shouldBeBordered)
526 return [
self hasThemeState:CPThemeStateBordered];
533 - (void)setDrawsBackground:(BOOL)shouldDrawBackground
535 if (_drawsBackground == shouldDrawBackground)
538 _drawsBackground = shouldDrawBackground;
547 - (BOOL)drawsBackground
549 return _drawsBackground;
556 - (void)setTextFieldBackgroundColor:(
CPColor)aColor
558 if (_textFieldBackgroundColor == aColor)
561 _textFieldBackgroundColor = aColor;
572 return _textFieldBackgroundColor;
576 - (void)_setUsesSingleLineMode:(BOOL)aFlag
578 _usesSingleLineMode = aFlag;
582 - (void)_setWraps:(BOOL)aFlag
588 - (void)_setScrolls:(BOOL)aFlag
594 - (BOOL)acceptsFirstResponder
600 - (BOOL)becomeFirstResponder
602 if (![
self isEnabled] || ![super becomeFirstResponder])
606 [
self _setObserveWindowKeyNotifications:YES];
610 if ([[
self window] isKeyWindow] && [
self isEditable])
611 return [
self _becomeFirstKeyResponder];
624 - (BOOL)_becomeFirstKeyResponder
628 if (![
self _isWithinUsablePlatformRect])
633 if (![
self isEditable])
638 [
self _updatePlaceholderState];
647 [
self _setCSSStyleForInputElement];
649 var element = [
self _inputElement];
650 element.value = _stringValue;
651 _DOMElement.appendChild(element);
655 if (document.attachEvent)
668 if (CPTextFieldInputOwner !== self)
672 var previousScrollingOrigin = [
self _scrollToVisibleRectAndReturnPreviousOrigin];
676 [
self _restorePreviousScrollingOrigin:previousScrollingOrigin];
679 if (!_willBecomeFirstResponderByClick)
681 [
self _selectText:self immediately:YES];
685 var point = CGPointMake([
self convertPointFromBase:[[CPApp currentEvent] locationInWindow]].x - [
self currentValueForThemeAttribute:@"content-inset"].left, 0),
691 _willBecomeFirstResponderByClick = NO;
705 - (void)_setEnableCSSSelection:(BOOL)shouldEnable
712 _DOMElement.style[CPBrowserStyleProperty(@"user-select")] = shouldEnable ?
@"text" :
@"none";
720 - (void)_setCSSStyleForInputElement
724 var element = [
self _inputElement],
725 font = [
self currentValueForThemeAttribute:@"font"],
728 verticalAlign = [
self currentValueForThemeAttribute:"vertical-alignment"],
729 left = CGRectGetMinX(contentRect);
735 switch (verticalAlign)
738 var topPoint = CGRectGetMinY(contentRect) +
"px";
742 var topPoint = (CGRectGetMidY(contentRect) - (lineHeight / 2)) +
"px";
746 var topPoint = (CGRectGetMaxY(contentRect) - lineHeight) +
"px";
750 var topPoint = CGRectGetMinY(contentRect) +
"px";
755 element.style.color = [[
self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder] cssString];
757 element.style.color = [[
self valueForThemeAttribute:@"text-color" inState:CPThemeStateEditing] cssString];
759 switch ([
self alignment])
762 element.style.textAlign =
"center";
766 element.style.textAlign =
"right";
770 element.style.textAlign =
"";
774 element.style.textAlign =
"left";
777 var isTextArea = element.nodeName.toUpperCase() ==
"TEXTAREA";
779 element.style.zIndex = 1000;
780 element.style.top = topPoint;
781 element.style.lineHeight = ROUND(lineHeight) +
"px";
782 element.style.height = isTextArea ? CGRectGetHeight(contentRect) +
"px" : ROUND(lineHeight) +
"px";;
783 element.style.width = CGRectGetWidth(contentRect) +
"px";
784 element.style.left = left +
"px";
785 element.style.verticalAlign =
"top";
786 element.style.cursor =
"auto";
790 element.style.whiteSpace = _wraps ?
"pre" :
"nowrap";
796 - (BOOL)resignFirstResponder
802 var element = [
self _inputElement],
803 newValue = element.value,
806 if (newValue !== _stringValue)
808 [
self _setStringValue:newValue];
813 if ([
self _valueIsValid:newValue] === NO)
816 var previousScrollingOrigin = [
self _scrollToVisibleRectAndReturnPreviousOrigin];
820 [
self _restorePreviousScrollingOrigin:previousScrollingOrigin];
828 [
self _setObserveWindowKeyNotifications:NO];
830 if ([[
self window] isKeyWindow])
831 [
self _resignFirstKeyResponder];
835 if ([
self isEditable])
839 if ([
self sendsActionOnEndEditing])
848 - (void)_resignFirstKeyResponder
855 _willBecomeFirstResponderByClick = NO;
857 [
self _updatePlaceholderState];
862 var element = [
self _inputElement];
875 if (element.parentNode == _DOMElement)
876 element.parentNode.removeChild(element);
880 if (document.attachEvent)
892 - (void)_setObserveWindowKeyNotifications:(BOOL)shouldObserve
906 - (void)_removeObservers
911 [
super _removeObservers];
912 [
self _setObserveWindowKeyNotifications:NO];
915 - (void)_addObservers
920 [
super _addObservers];
922 if ([[
self window] firstResponder] ===
self)
923 [
self _setObserveWindowKeyNotifications:YES];
928 if (![[
self window] isKeyWindow])
929 [
self _resignFirstKeyResponder];
934 if (!([
self isEnabled] && [
self isEditable]))
939 if ([wind isKeyWindow] && [wind firstResponder] ===
self)
940 if (![
self _becomeFirstKeyResponder])
941 [wind makeFirstResponder:nil];
944 - (BOOL)_valueIsValid:(
CPString)aValue
950 if ([
self _setStringValue:aValue isNewValue:NO errorDescription:@ref(error)] === NO)
952 var acceptInvalidValue = NO;
955 acceptInvalidValue = [_delegate control:self didFailToFormatString:aValue errorDescription:error];
957 if (acceptInvalidValue === NO)
970 - (BOOL)needsPanelToBecomeKey
996 [
super mouseMoved:anEvent];
997 [
self _updateCursorForEvent:anEvent];
1003 if ([
self isEditable] && [
self isEnabled])
1005 _willBecomeFirstResponderByClick = YES;
1008 else if ([
self isSelectable])
1010 [
self _setEnableCSSSelection:YES];
1011 if (document.attachEvent)
1022 return [[
self nextResponder] mouseDown:anEvent];
1027 if (![
self isEnabled] || !([
self isSelectable] || [
self isEditable]))
1028 [[
self nextResponder] mouseUp:anEvent];
1029 else if ([
self isSelectable])
1031 if (document.attachEvent)
1042 if ([[
CPApp currentEvent] clickCount] === 3)
1054 if ([
self menuForEvent:anEvent] || [[
self nextResponder] isKindOfClass:
CPView])
1062 if (![
self isEnabled] || !([
self isSelectable] || [
self isEditable]))
1063 [[
self nextResponder] mouseDragged:anEvent];
1064 else if ([
self isSelectable])
1070 if (!([
self isEnabled] && [
self isEditable]))
1074 var newValue = [
self _inputElement].value;
1076 if (newValue !== _stringValue)
1078 [
self _setStringValue:newValue];
1088 if (!([
self isEnabled] && [
self isEditable]))
1099 _invokedByUserEvent = !!anEvent._DOMEvent;
1100 [
self interpretKeyEvents:[anEvent]];
1101 _invokedByUserEvent = NO;
1115 - (void)doCommandBySelector:(
SEL)aSelector
1117 if ([
self respondsToSelector:aSelector])
1118 [
self performSelector:aSelector];
1121 - (void)insertNewline:(
id)sender
1123 if (!([
self isEnabled] && [
self isEditable]))
1126 var newValue = [
self _inputElement].value;
1128 if (newValue !== _stringValue)
1130 [
self _setStringValue:newValue];
1134 if ([
self _valueIsValid:_stringValue])
1149 if (![
self action] || [
self sendAction:[
self action] to:[
self target]])
1158 - (void)insertNewlineIgnoringFieldEditor:(
id)sender
1160 [
self _insertCharacterIgnoringFieldEditor:CPNewlineCharacter];
1163 - (void)insertTabIgnoringFieldEditor:(
id)sender
1165 [
self _insertCharacterIgnoringFieldEditor:CPTabCharacter];
1168 - (void)_insertCharacterIgnoringFieldEditor:(
CPString)aCharacter
1170 if (!([
self isEnabled] && [
self isEditable]))
1175 var oldValue = _stringValue,
1177 element = [
self _inputElement];
1182 element.value = [element.value stringByReplacingCharactersInRange:[
self selectedRange] withString:aCharacter];
1184 [
self _setStringValue:element.value];
1187 if (oldValue !== _stringValue)
1198 if ([note
object] !=
self)
1202 [_delegate controlTextDidBlur:note];
1210 if ([note
object] !==
self)
1214 [_delegate controlTextDidFocus:note];
1221 if ([note
object] !==
self)
1224 [
self _continuouslyReverseSetBinding];
1227 [_delegate controlTextDidChange:note];
1235 if ([note
object] !=
self)
1247 if ([note
object] !=
self)
1253 [_delegate controlTextDidEndEditing:note];
1256 - (void)_updateCursorForEvent:(
CPEvent)anEvent
1258 var
frame = CGRectMakeCopy([
self frame]),
1259 contentInset = [
self currentValueForThemeAttribute:@"content-inset"];
1263 if ([
self isEnabled] && ([
self isSelectable] || [
self isEditable]) && CGRectContainsPoint(frame, [anEvent locationInWindow]))
1266 self._DOMElement.style.cursor =
"text";
1272 self._DOMElement.style.cursor =
"default";
1289 - (BOOL)_setStringValue:(
CPString)aValue
1291 return [
self _setStringValue:aValue isNewValue:YES errorDescription:nil];
1298 - (BOOL)_setStringValue:(
CPString)aValue isNewValue:(BOOL)isNewValue errorDescription:(CPStringRef)anError
1300 _stringValue = aValue;
1302 var objectValue = aValue,
1310 if ([formatter getObjectValue:@ref(
object) forString:aValue errorDescription:anError])
1311 objectValue =
object;
1314 objectValue = undefined;
1318 isNewValue |= objectValue !== [
super objectValue];
1323 [
self willChangeValueForKey:@"objectValue"];
1325 [
self _updatePlaceholderState];
1326 [
self didChangeValueForKey:@"objectValue"];
1332 - (void)setObjectValue:(
id)aValue
1334 [
self _setObjectValue:aValue useFormatter:YES];
1337 - (void)_setObjectValue:(
id)aValue useFormatter:(BOOL)useFormatter
1343 if (useFormatter && formatter)
1346 var formattedString = [
self hasThemeState:CPThemeStateEditing] ? [formatter editingStringForObjectValue:aValue] : [formatter stringForObjectValue:aValue];
1348 if (formattedString === nil)
1354 if ([formatter getObjectValue:@ref(value) forString:
@"" errorDescription:nil] === NO)
1358 _stringValue = (value === nil || value === undefined) ?
@"" : String(value);
1361 _stringValue = formattedString;
1369 [
self _inputElement].value = _stringValue;
1373 [
self _updatePlaceholderState];
1376 - (void)_updatePlaceholderState
1378 if (!_stringValue || _stringValue.
length === 0)
1390 if (_placeholderString === aStringValue)
1393 _placeholderString = aStringValue;
1408 return _placeholderString;
1436 - (CGSize)_minimumFrameSize
1439 contentInset = [
self currentValueForThemeAttribute:@"content-inset"],
1440 minSize = [
self currentValueForThemeAttribute:@"min-size"],
1441 maxSize = [
self currentValueForThemeAttribute:@"max-size"],
1443 text = (_stringValue ||
@" "),
1444 textSize = CGSizeMakeCopy(frameSize),
1445 font = [
self currentValueForThemeAttribute:@"font"];
1447 textSize.width -= contentInset.left + contentInset.right;
1448 textSize.height -= contentInset.top + contentInset.bottom;
1450 if (frameSize.width !== 0 &&
1451 ![
self isBezeled] &&
1454 textSize = [text sizeWithFont:font inWidth:textSize.width];
1458 textSize = [text sizeWithFont:font];
1461 textSize.width += 1;
1465 textSize.height += 1;
1467 frameSize.height = textSize.height + contentInset.top + contentInset.bottom;
1469 if ([
self isBezeled])
1471 frameSize.height = MAX(frameSize.height, minSize.height);
1473 if (maxSize.width > 0.0)
1474 frameSize.width = MIN(frameSize.width, maxSize.width);
1476 if (maxSize.height > 0.0)
1477 frameSize.height = MIN(frameSize.height, maxSize.height);
1480 frameSize.width = textSize.width + contentInset.left + contentInset.right;
1482 frameSize.width = MAX(frameSize.width, minSize.width);
1490 - (void)selectText:(
id)sender
1492 [
self _selectText:sender immediately:NO];
1495 - (void)_selectText:(
id)sender immediately:(BOOL)immediately
1498 if ([
self isEditable] || [
self isSelectable])
1500 var wind = [
self window];
1503 if ([
self isEditable])
1505 var element = [
self _inputElement];
1507 if ([wind firstResponder] ===
self)
1514 else if (wind !== nil && [wind makeFirstResponder:
self])
1515 [
self _selectText:sender immediately:immediately];
1524 if (wind !== nil && [wind firstResponder] !==
self)
1525 [wind makeFirstResponder:self];
1531 - (void)copy:(
id)sender
1534 var stringToCopy = nil;
1536 if ([
self isEditable])
1540 if (selectedRange.length < 1)
1543 stringToCopy = [_stringValue substringWithRange:selectedRange];
1556 [pasteboard declareTypes:[CPStringPboardType] owner:nil];
1557 [pasteboard setString:stringToCopy forType:CPStringPboardType];
1566 - (void)cut:(
id)sender
1568 if (![
self isEnabled])
1573 if (![
self isEditable])
1576 if (![[
CPApp currentEvent] _platformIsEffectingCutOrPaste])
1591 - (void)paste:(
id)sender
1593 if (!([
self isEnabled] && [
self isEditable]))
1596 if (![[
CPApp currentEvent] _platformIsEffectingCutOrPaste])
1606 pasteString = [pasteboard stringForType:CPStringPboardType],
1607 newValue = [_stringValue stringByReplacingCharactersInRange:selectedRange withString:pasteString];
1611 [
self setSelectedRange:CPMakeRange(selectedRange.location + pasteString.length, 0)];
1624 - (CPRange)selectedRange
1628 if ([[
self window] firstResponder] !==
self)
1636 var inputElement = [
self _inputElement],
1637 selectionStart = inputElement.selectionStart,
1638 selectionEnd = inputElement.selectionEnd;
1640 if ([selectionStart isKindOfClass:
CPNumber])
1641 return CPMakeRange(selectionStart, selectionEnd - selectionStart);
1644 var theDocument = inputElement.ownerDocument || inputElement.document,
1645 selectionRange = theDocument.selection.createRange(),
1646 range = inputElement.createTextRange();
1648 if (range.inRange(selectionRange))
1650 range.setEndPoint(
'EndToStart', selectionRange);
1651 return CPMakeRange(range.text.length, selectionRange.text.length);
1664 - (void)setSelectedRange:(CPRange)aRange
1666 if (![[
self window] firstResponder] ===
self)
1671 if (![
self isEditable])
1679 [contentView setSelectedRange:aRange];
1684 var inputElement = [
self _inputElement];
1688 if ([inputElement.selectionStart isKindOfClass:
CPNumber])
1690 inputElement.selectionStart = aRange.location;
1691 inputElement.selectionEnd =
CPMaxRange(aRange);
1696 var theDocument = inputElement.ownerDocument || inputElement.document,
1697 existingRange = theDocument.selection.createRange(),
1698 range = inputElement.createTextRange();
1700 if (range.inRange(existingRange))
1702 range.collapse(
true);
1703 range.move(
'character', aRange.location);
1704 range.moveEnd(
'character', aRange.length);
1716 - (void)selectAll:(
id)sender
1721 - (void)deleteBackward:(
id)sender
1723 if (!([
self isEnabled] && [
self isEditable]))
1728 if (selectedRange.length === 0)
1730 if (selectedRange.location < 1)
1734 selectedRange.location -= 1;
1735 selectedRange.length += 1;
1738 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1741 - (void)delete:(
id)sender
1743 if (!([
self isEnabled] && [
self isEditable]))
1749 if (selectedRange.length < 1)
1752 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1755 - (void)deleteForward:(
id)sender
1757 if (!([
self isEnabled] && [
self isEditable]))
1762 if (selectedRange.length === 0)
1764 if (selectedRange.location >= _stringValue.
length)
1768 selectedRange.length += 1;
1771 [
self _replaceCharactersInRange:selectedRange withCharacters:@""];
1774 - (void)_replaceCharactersInRange:(CPRange)range withCharacters:(
CPString)characters
1776 var newValue = [_stringValue stringByReplacingCharactersInRange:range withString:characters];
1778 if (_invokedByUserEvent)
1780 [
self _setStringValue:newValue];
1784 [
self _setObjectValue:newValue useFormatter:NO];
1796 #pragma mark Setting the Delegate 1800 if (_delegate === aDelegate)
1803 _delegate = aDelegate;
1804 _implementedDelegateMethods = 0;
1806 if ([_delegate respondsToSelector:
@selector(control:didFailToFormatString:errorDescription:)])
1809 if ([_delegate respondsToSelector:
@selector(controlTextDidBeginEditing:)])
1812 if ([_delegate respondsToSelector:
@selector(controlTextDidChange:)])
1815 if ([_delegate respondsToSelector:
@selector(controlTextDidEndEditing:)])
1818 if ([_delegate respondsToSelector:
@selector(controlTextDidFocus:)])
1821 if ([_delegate respondsToSelector:
@selector(controlTextDidBlur:)])
1830 - (CGRect)contentRectForBounds:(CGRect)bounds
1832 var contentInset = [
self currentValueForThemeAttribute:@"content-inset"];
1834 return CGRectInsetByInset(
bounds, contentInset);
1837 - (CGRect)bezelRectForBounds:(CGRect)bounds
1839 var bezelInset = [
self currentValueForThemeAttribute:@"bezel-inset"];
1841 return CGRectInsetByInset(
bounds, bezelInset);
1846 if (aName ===
"bezel-view")
1849 else if (aName ===
"content-view")
1857 if (aName ===
"bezel-view")
1859 var view = [[
CPView alloc] initWithFrame:CGRectMakeZero()];
1861 [view setHitTests:NO];
1867 var view = [[_CPImageAndTextView alloc] initWithFrame:CGRectMakeZero()];
1869 [view setHitTests:NO];
1877 - (void)layoutSubviews
1884 [bezelView setBackgroundColor:[
self currentValueForThemeAttribute:@"bezel-color"]];
1892 [contentView setHidden:(_stringValue && _stringValue.length > 0) && [
self hasThemeState:CPThemeStateEditing]];
1900 string = _stringValue;
1902 if ([
self isSecure])
1906 [contentView setText:string];
1908 [contentView setTextColor:[
self currentValueForThemeAttribute:@"text-color"]];
1909 [contentView setFont:[
self currentValueForThemeAttribute:@"font"]];
1910 [contentView setAlignment:[
self currentValueForThemeAttribute:@"alignment"]];
1911 [contentView setVerticalAlignment:[
self currentValueForThemeAttribute:@"vertical-alignment"]];
1912 [contentView setLineBreakMode:[
self currentValueForThemeAttribute:@"line-break-mode"]];
1913 [contentView setTextShadowColor:[
self currentValueForThemeAttribute:@"text-shadow-color"]];
1914 [contentView setTextShadowOffset:[
self currentValueForThemeAttribute:@"text-shadow-offset"]];
1918 [
self _setCSSStyleForInputElement];
1921 - (void)takeValueFromKeyPath:(
CPString)aKeyPath ofObjects:(CPArray)objects
1923 var count = objects.
length,
1924 value = [objects[0] valueForKeyPath:aKeyPath];
1930 if (value !== [objects[count] valueForKeyPath:aKeyPath])
1937 #pragma mark Overrides 1947 var placeholderColor = [
self valueForThemeAttribute:@"text-color" inState:CPTextFieldStatePlaceholder];
1957 if ([[
self window] firstResponder] ===
self)
1958 [
self _resignFirstKeyResponder];
1961 - (void)viewDidUnhide
1965 if ([
self isEditable] && [[
self window] firstResponder] ===
self)
1966 [
self _becomeFirstKeyResponder];
1969 - (BOOL)validateUserInterfaceItem:(
id )anItem
1971 var theAction = [anItem action];
1973 if (![
self isEditable] && (theAction ==
@selector(cut:) || theAction ==
@selector(paste:) || theAction ==
@selector(
delete:)))
1977 if (![
self isEditable])
1980 if (theAction ==
@selector(copy:) || theAction ==
@selector(cut:) || theAction ==
@selector(
delete:))
1986 #pragma mark Private 1988 - (BOOL)_isWithinUsablePlatformRect
1993 var wind = [
self window];
2000 previousContentViewBoundsOrigin;
2003 var previousScrollingOrigin = [
self _scrollToVisibleRectAndReturnPreviousOrigin];
2006 usableRect = [[wind platformWindow] usableContentFrame];
2008 frame.origin = [wind convertBaseToGlobal:frame.origin];
2011 [
self _restorePreviousScrollingOrigin:previousScrollingOrigin];
2013 return (CGRectGetMinX(frame) >= CGRectGetMinX(usableRect) &&
2014 CGRectGetMaxX(frame) <= CGRectGetMaxX(usableRect) &&
2015 CGRectGetMinY(frame) >= CGRectGetMinY(usableRect) &&
2016 CGRectGetMaxY(frame) <= CGRectGetMaxY(usableRect));
2022 - (CGPoint)_scrollToVisibleRectAndReturnPreviousOrigin
2025 previousContentViewBoundsOrigin;
2030 previousContentViewBoundsOrigin = CGPointMakeCopy([[scrollView contentView] boundsOrigin]);
2032 if (![[
self superview] scrollRectToVisible:[
self frame]])
2033 previousContentViewBoundsOrigin = nil;
2036 return previousContentViewBoundsOrigin;
2042 - (void)_restorePreviousScrollingOrigin:(CGPoint)scrollingOrigin
2044 if (scrollingOrigin)
2088 [
self setEditable:[aCoder decodeBoolForKey:CPTextFieldIsEditableKey]];
2089 [
self setSelectable:[aCoder decodeBoolForKey:CPTextFieldIsSelectableKey]];
2095 [
self setLineBreakMode:[aCoder decodeIntForKey:CPTextFieldLineBreakModeKey]];
2096 [
self setAlignment:[aCoder decodeIntForKey:CPTextFieldAlignmentKey]];
2100 [
self _setUsesSingleLineMode:[aCoder decodeBoolForKey:CPTextFieldUsesSingleLineMode]];
2101 [
self _setWraps:[aCoder decodeBoolForKey:CPTextFieldWraps]];
2102 [
self _setScrolls:[aCoder decodeBoolForKey:CPTextFieldScrolls]];
2116 [aCoder encodeBool:_isEditable forKey:CPTextFieldIsEditableKey];
2117 [aCoder encodeBool:_isSelectable forKey:CPTextFieldIsSelectableKey];
2119 [aCoder encodeBool:_drawsBackground forKey:CPTextFieldDrawsBackgroundKey];
2121 [aCoder encodeObject:_textFieldBackgroundColor forKey:CPTextFieldBackgroundColorKey];
2123 [aCoder encodeInt:[
self lineBreakMode] forKey:CPTextFieldLineBreakModeKey];
2124 [aCoder encodeInt:[
self alignment] forKey:CPTextFieldAlignmentKey];
2126 [aCoder encodeObject:_placeholderString forKey:CPTextFieldPlaceholderStringKey];
2128 [aCoder encodeBool:_usesSingleLineMode forKey:CPTextFieldUsesSingleLineMode];
2129 [aCoder encodeBool:_wraps forKey:CPTextFieldWraps];
2130 [aCoder encodeBool:_scrolls forKey:CPTextFieldScrolls];
2134 @implementation _CPTextFieldValueBinder :
CPBinder 2141 [
super _updatePlaceholdersWithOptions:options];
2143 [
self _setPlaceholder:@"Multiple Values" forMarker:CPMultipleValuesMarker isDefault:YES];
2144 [
self _setPlaceholder:@"No Selection" forMarker:CPNoSelectionMarker isDefault:YES];
2145 [
self _setPlaceholder:@"Not Applicable" forMarker:CPNotApplicableMarker isDefault:YES];
2146 [
self _setPlaceholder:@"" forMarker:CPNullMarker isDefault:YES];
2149 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
2151 [_source setPlaceholderString:aValue];
2152 [_source setObjectValue:nil];
2155 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
2157 if (!aValue || (aValue.isa && [aValue isMemberOfClass:
CPNull]))
2158 [_source setPlaceholderString:[
self _placeholderForMarker:
CPNullMarker]];
2160 [_source setObjectValue:aValue];
2163 - (void)reverseSetValueFor:(
CPString)aBinding
2165 var destination = [_info objectForKey:CPObservedObjectKey],
2166 keyPath = [_info objectForKey:CPObservedKeyPathKey],
2167 options = [_info objectForKey:CPOptionsKey],
2168 newValue = [
self valueForBinding:aBinding],
2169 value = [destination valueForKeyPath:keyPath];
2174 newValue = [
self reverseTransformValue:newValue withOptions:options];
2176 [
self suppressSpecificNotificationFromObject:destination keyPath:keyPath];
2177 [destination setValue:newValue forKeyPath:keyPath];
2178 [
self unsuppressSpecificNotificationFromObject:destination keyPath:keyPath];
2187 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
2189 [_source setPlaceholderString:aValue];
2190 [_source setObjectValue:nil];
2193 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
2195 if (!aValue || (aValue.isa && [aValue isMemberOfClass:
CPNull]))
2196 [_source setPlaceholderString:[
self _placeholderForMarker:
CPNullMarker]];
2198 [_source setObjectValue:aValue];
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 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
CPTextFieldStatePlaceholder
void removeObserver:name:object:(id anObserver, [name] CPString aNotificationName, [object] id anObject)
var CPTexFieldCurrentCSSSelectableField
var CPTextFieldDrawsBackgroundKey
void setTextFieldBackgroundColor:(CPColor aColor)
var CPTextFieldBackgroundColorKey
CPPlatformWindow platformWindow()
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)