mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-09-11 05:07:13 +00:00
Compare commits
90
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a61db69dea | ||
|
|
90640b824c | ||
|
|
f974955d4b | ||
|
|
252144950a | ||
|
|
0781a4153e | ||
|
|
17e49c458e | ||
|
|
8ec1325aff | ||
|
|
7fbe571e04 | ||
|
|
b0051603da | ||
|
|
947b116c06 | ||
|
|
095858d3d5 | ||
|
|
2b1b1ea33b | ||
|
|
1bed7e7108 | ||
|
|
bd1f64bfde | ||
|
|
d27e333941 | ||
|
|
c2bf47eca2 | ||
|
|
60fd129bd9 | ||
|
|
77955f4e2b | ||
|
|
d4f9e7cba4 | ||
|
|
db1bf80cd4 | ||
|
|
2ea24ed2dc | ||
|
|
abfb23d931 | ||
|
|
868480ada5 | ||
|
|
8a39561ddb | ||
|
|
27584544d9 | ||
|
|
8902acba04 | ||
|
|
9b9380c18e | ||
|
|
3992ca71c6 | ||
|
|
3a04bb2957 | ||
|
|
1c3300b066 | ||
|
|
b443cb806a | ||
|
|
adbc420e0f | ||
|
|
e95648ca16 | ||
|
|
d0d66227cb | ||
|
|
9d57d02eb5 | ||
|
|
bc93b3f6c7 | ||
|
|
63b57b886e | ||
|
|
10f6c8e8f6 | ||
|
|
7b3136dae3 | ||
|
|
b7ee0fe44d | ||
|
|
0150271e67 | ||
|
|
e23ba0852b | ||
|
|
7cae90f8f9 | ||
|
|
9e1d09909e | ||
|
|
306f2c987c | ||
|
|
42200ce567 | ||
|
|
79cd71d2ab | ||
|
|
081cf61e68 | ||
|
|
ed0fd87646 | ||
|
|
4136953752 | ||
|
|
e70430057e | ||
|
|
8498e28b70 | ||
|
|
7ad24efe4f | ||
|
|
a055d6d97e | ||
|
|
23ed09a84e | ||
|
|
8e6119000d | ||
|
|
1db154ac5b | ||
|
|
7ab833495f | ||
|
|
60a33b9592 | ||
|
|
7429687932 | ||
|
|
fe04cfbe1f | ||
|
|
d57f5427fb | ||
|
|
6537a44c02 | ||
|
|
f8cc2eb670 | ||
|
|
c83b4bf3af | ||
|
|
5c5d2e47a9 | ||
|
|
9e20f209bf | ||
|
|
ce5c6d9b96 | ||
|
|
c166a20b89 | ||
|
|
1cbf927684 | ||
|
|
9fdfc4025a | ||
|
|
4958b4c47b | ||
|
|
fedb24c2f3 | ||
|
|
e61a2a296e | ||
|
|
0e87659093 | ||
|
|
eb990b6d4f | ||
|
|
12ea224f21 | ||
|
|
98260630ac | ||
|
|
ba7fa38924 | ||
|
|
744bbd15d7 | ||
|
|
61f683b2e3 | ||
|
|
49521b44fb | ||
|
|
f76404ef5e | ||
|
|
4df0b7c940 | ||
|
|
6cd2c96152 | ||
|
|
106e21b79c | ||
|
|
970dc912cb | ||
|
|
6f84440bcd | ||
|
|
4f69d82a4e | ||
|
|
b85e44098b |
@@ -83,7 +83,8 @@ CPCanvasParentDrawErrorsOnMovementBug = 1 << 0;
|
|||||||
var USER_AGENT = "",
|
var USER_AGENT = "",
|
||||||
PLATFORM_ENGINE = CPUnknownBrowserEngine,
|
PLATFORM_ENGINE = CPUnknownBrowserEngine,
|
||||||
PLATFORM_FEATURES = 0,
|
PLATFORM_FEATURES = 0,
|
||||||
PLATFORM_BUGS = 0;
|
PLATFORM_BUGS = 0,
|
||||||
|
PLATFORM_STYLE_JS_PROPERTIES = {};
|
||||||
|
|
||||||
// default these features to true
|
// default these features to true
|
||||||
|
|
||||||
@@ -273,3 +274,87 @@ else
|
|||||||
CPUndoKeyEquivalentModifierMask = CPControlKeyMask;
|
CPUndoKeyEquivalentModifierMask = CPControlKeyMask;
|
||||||
CPRedoKeyEquivalentModifierMask = CPControlKeyMask;
|
CPRedoKeyEquivalentModifierMask = CPControlKeyMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return the properly prefixed JS property for the given name. E.g. in a webkit browser,
|
||||||
|
CPBrowserStyleProperty('transition') -> WebkitTransition
|
||||||
|
|
||||||
|
While technically not a style property, style related event handler names are also supported.
|
||||||
|
CPBrowserStyleProperty('transitionend') -> 'webkitTransitionEnd'
|
||||||
|
|
||||||
|
CSS is only available in platform(dom), so don't rely too heavily on it.
|
||||||
|
*/
|
||||||
|
function CPBrowserStyleProperty(aProperty)
|
||||||
|
{
|
||||||
|
var lowerProperty = aProperty.toLowerCase();
|
||||||
|
|
||||||
|
if (PLATFORM_STYLE_JS_PROPERTIES[lowerProperty] === undefined)
|
||||||
|
{
|
||||||
|
var r = nil;
|
||||||
|
|
||||||
|
#if PLATFORM(DOM)
|
||||||
|
var testElement = document.createElement('div');
|
||||||
|
|
||||||
|
switch (lowerProperty)
|
||||||
|
{
|
||||||
|
case 'transitionend':
|
||||||
|
var candidates = {
|
||||||
|
'WebkitTransition' : 'webkitTransitionEnd',
|
||||||
|
'MozTransition' : 'transitionend',
|
||||||
|
'OTransition' : 'oTransitionEnd',
|
||||||
|
'msTransition' : 'MSTransitionEnd',
|
||||||
|
'transition' : 'transitionend'
|
||||||
|
};
|
||||||
|
|
||||||
|
r = candidates[PLATFORM_STYLE_JS_PROPERTIES['transition']] || nil;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
var prefixes = ["Webkit", "Moz", "O", "ms"],
|
||||||
|
capProperty = [aProperty capitalizedString];
|
||||||
|
|
||||||
|
for (var i = 0; i < prefixes.length; i++)
|
||||||
|
{
|
||||||
|
if (prefixes[i] + capProperty in testElement.style)
|
||||||
|
{
|
||||||
|
r = prefixes[i] + capProperty;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!r && lowerProperty in testElement.style)
|
||||||
|
r = lowerProperty;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PLATFORM_STYLE_JS_PROPERTIES[lowerProperty] = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLATFORM_STYLE_JS_PROPERTIES[lowerProperty];
|
||||||
|
}
|
||||||
|
|
||||||
|
function CPBrowserCSSProperty(aProperty)
|
||||||
|
{
|
||||||
|
var browserProperty = CPBrowserStyleProperty(aProperty);
|
||||||
|
|
||||||
|
if (!browserProperty)
|
||||||
|
return nil;
|
||||||
|
|
||||||
|
var prefixes = {
|
||||||
|
'Webkit': '-webkit-',
|
||||||
|
'Moz': '-moz-',
|
||||||
|
'O': '-o-',
|
||||||
|
'ms': '-ms-'
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var prefix in prefixes)
|
||||||
|
{
|
||||||
|
if (browserProperty.substring(0, prefix.length) == prefix)
|
||||||
|
{
|
||||||
|
return prefixes[prefix] + browserProperty.substring(prefix.length).toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return browserProperty.toLowerCase();
|
||||||
|
}
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ var CPScrollerStyleGlobal = CPScrollerStyleOverlay,
|
|||||||
|
|
||||||
@param aStyle the scroller style to set all scroller views to use (CPScrollerStyleLegacy or CPScrollerStyleOverlay)
|
@param aStyle the scroller style to set all scroller views to use (CPScrollerStyleLegacy or CPScrollerStyleOverlay)
|
||||||
*/
|
*/
|
||||||
+ (int)setGlobalScrollerStyle:(int)aStyle
|
+ (void)setGlobalScrollerStyle:(int)aStyle
|
||||||
{
|
{
|
||||||
CPScrollerStyleGlobal = aStyle;
|
CPScrollerStyleGlobal = aStyle;
|
||||||
[[CPNotificationCenter defaultCenter] postNotificationName:CPScrollerStyleGlobalChangeNotification object:nil];
|
[[CPNotificationCenter defaultCenter] postNotificationName:CPScrollerStyleGlobalChangeNotification object:nil];
|
||||||
|
|||||||
+25
-16
@@ -88,9 +88,6 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
|
|||||||
_box = [[CPBox alloc] initWithFrame:[self bounds]];
|
_box = [[CPBox alloc] initWithFrame:[self bounds]];
|
||||||
[self setBackgroundColor:[CPColor colorWithCalibratedWhite:0.95 alpha:1.0]];
|
[self setBackgroundColor:[CPColor colorWithCalibratedWhite:0.95 alpha:1.0]];
|
||||||
|
|
||||||
[_box setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
|
||||||
[_tabs setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin];
|
|
||||||
|
|
||||||
[self addSubview:_box];
|
[self addSubview:_box];
|
||||||
[self addSubview:_tabs];
|
[self addSubview:_tabs];
|
||||||
}
|
}
|
||||||
@@ -343,21 +340,9 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
|
|||||||
_type = aTabViewType;
|
_type = aTabViewType;
|
||||||
|
|
||||||
if (_type !== CPTopTabsBezelBorder && _type !== CPBottomTabsBezelBorder)
|
if (_type !== CPTopTabsBezelBorder && _type !== CPBottomTabsBezelBorder)
|
||||||
{
|
|
||||||
[_box setFrame:[self bounds]];
|
|
||||||
[_tabs removeFromSuperview];
|
[_tabs removeFromSuperview];
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
var aFrame = [self frame],
|
|
||||||
segmentedHeight = _CGRectGetHeight([_tabs frame]),
|
|
||||||
origin = _type === CPTopTabsBezelBorder ? segmentedHeight / 2 : 0;
|
|
||||||
|
|
||||||
[_box setFrame:_CGRectMake(0, origin, _CGRectGetWidth(aFrame),
|
|
||||||
_CGRectGetHeight(aFrame) - segmentedHeight / 2)];
|
|
||||||
|
|
||||||
[self addSubview:_tabs];
|
[self addSubview:_tabs];
|
||||||
}
|
|
||||||
|
|
||||||
switch (_type)
|
switch (_type)
|
||||||
{
|
{
|
||||||
@@ -373,6 +358,29 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
|
|||||||
[_box setBorderType:CPNoBorder];
|
[_box setBorderType:CPNoBorder];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self setNeedsLayout];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)layoutSubviews
|
||||||
|
{
|
||||||
|
// Even if CPTabView's autoresizesSubviews is NO, _tabs and _box has to be laid out.
|
||||||
|
// This means we can't rely on autoresize masks.
|
||||||
|
if (_type !== CPTopTabsBezelBorder && _type !== CPBottomTabsBezelBorder)
|
||||||
|
{
|
||||||
|
[_box setFrame:[self bounds]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var aFrame = [self frame],
|
||||||
|
segmentedHeight = _CGRectGetHeight([_tabs frame]),
|
||||||
|
origin = _type === CPTopTabsBezelBorder ? segmentedHeight / 2 : 0;
|
||||||
|
|
||||||
|
[_box setFrame:_CGRectMake(0, origin, _CGRectGetWidth(aFrame),
|
||||||
|
_CGRectGetHeight(aFrame) - segmentedHeight / 2)];
|
||||||
|
|
||||||
|
[self _repositionTabs];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -497,7 +505,6 @@ var CPTabViewItemsKey = "CPTabViewItemsKey",
|
|||||||
[_items makeObjectsPerformSelector:@selector(_setTabView:) withObject:self];
|
[_items makeObjectsPerformSelector:@selector(_setTabView:) withObject:self];
|
||||||
|
|
||||||
[self _updateItems];
|
[self _updateItems];
|
||||||
[self _repositionTabs];
|
|
||||||
|
|
||||||
[self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]];
|
[self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]];
|
||||||
|
|
||||||
@@ -506,6 +513,8 @@ var CPTabViewItemsKey = "CPTabViewItemsKey",
|
|||||||
[self selectTabViewItem:selected];
|
[self selectTabViewItem:selected];
|
||||||
|
|
||||||
[self setTabViewType:[aCoder decodeIntForKey:CPTabViewTypeKey]];
|
[self setTabViewType:[aCoder decodeIntForKey:CPTabViewTypeKey]];
|
||||||
|
|
||||||
|
[self setNeedsLayout];
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
|||||||
@@ -308,6 +308,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
|
|||||||
if (shouldBeEditable)
|
if (shouldBeEditable)
|
||||||
_isSelectable = YES;
|
_isSelectable = YES;
|
||||||
|
|
||||||
|
if (_isEditable)
|
||||||
|
[self setThemeState:CPThemeStateEditable];
|
||||||
|
else
|
||||||
|
[self unsetThemeState:CPThemeStateEditable];
|
||||||
|
|
||||||
// We only allow first responder status if the field is editable and enabled.
|
// We only allow first responder status if the field is editable and enabled.
|
||||||
if (!shouldBeEditable && [[self window] firstResponder] === self)
|
if (!shouldBeEditable && [[self window] firstResponder] === self)
|
||||||
[[self window] makeFirstResponder:nil];
|
[[self window] makeFirstResponder:nil];
|
||||||
|
|||||||
+39
-1
@@ -570,6 +570,7 @@ var CPScrollDestinationNone = 0,
|
|||||||
[newToken setTokenField:self];
|
[newToken setTokenField:self];
|
||||||
[newToken setRepresentedObject:tokenObject];
|
[newToken setRepresentedObject:tokenObject];
|
||||||
[newToken setStringValue:tokenValue];
|
[newToken setStringValue:tokenValue];
|
||||||
|
[newToken setEditable:[self isEditable]];
|
||||||
[contentView addSubview:newToken];
|
[contentView addSubview:newToken];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -615,6 +616,13 @@ var CPScrollDestinationNone = 0,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)setEditable:(BOOL)shouldBeEditable
|
||||||
|
{
|
||||||
|
[super setEditable:shouldBeEditable];
|
||||||
|
|
||||||
|
[[self _tokens] makeObjectsPerformSelector:@selector(setEditable:) withObject:shouldBeEditable];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)sendAction:(SEL)anAction to:(id)anObject
|
- (void)sendAction:(SEL)anAction to:(id)anObject
|
||||||
{
|
{
|
||||||
_shouldNotifyTarget = NO;
|
_shouldNotifyTarget = NO;
|
||||||
@@ -1331,6 +1339,34 @@ var CPScrollDestinationNone = 0,
|
|||||||
_representedObject = representedObject;
|
_representedObject = representedObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)setEditable:(BOOL)shouldBeEditable
|
||||||
|
{
|
||||||
|
[super setEditable:shouldBeEditable];
|
||||||
|
[self setNeedsLayout];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)setThemeState:(CPThemeState)aState
|
||||||
|
{
|
||||||
|
var r = [super setThemeState:aState];
|
||||||
|
|
||||||
|
// Share hover state with the delete button.
|
||||||
|
if (r && aState === CPThemeStateHovered)
|
||||||
|
[_deleteButton setThemeState:aState];
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)unsetThemeState:(CPThemeState)aState
|
||||||
|
{
|
||||||
|
var r = [super unsetThemeState:aState];
|
||||||
|
|
||||||
|
// Share hover state with the delete button.
|
||||||
|
if (r && aState === CPThemeStateHovered)
|
||||||
|
[_deleteButton unsetThemeState:aState];
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
- (CGSize)_minimumFrameSize
|
- (CGSize)_minimumFrameSize
|
||||||
{
|
{
|
||||||
var size = _CGSizeMakeZero(),
|
var size = _CGSizeMakeZero(),
|
||||||
@@ -1356,6 +1392,7 @@ var CPScrollDestinationNone = 0,
|
|||||||
{
|
{
|
||||||
[_deleteButton setTarget:self];
|
[_deleteButton setTarget:self];
|
||||||
[_deleteButton setAction:@selector(_delete:)];
|
[_deleteButton setAction:@selector(_delete:)];
|
||||||
|
[_deleteButton setEnabled:[self isEditable]];
|
||||||
|
|
||||||
var frame = [bezelView frame],
|
var frame = [bezelView frame],
|
||||||
buttonOffset = [_deleteButton currentValueForThemeAttribute:@"offset"],
|
buttonOffset = [_deleteButton currentValueForThemeAttribute:@"offset"],
|
||||||
@@ -1377,7 +1414,8 @@ var CPScrollDestinationNone = 0,
|
|||||||
|
|
||||||
- (void)_delete:(id)sender
|
- (void)_delete:(id)sender
|
||||||
{
|
{
|
||||||
[_tokenField _deleteToken:self];
|
if ([self isEditable])
|
||||||
|
[_tokenField _deleteToken:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -1089,7 +1089,7 @@ var themedButtonValues = nil,
|
|||||||
[@"text-color", textHighlightedColor, CPThemeStateHighlighted],
|
[@"text-color", textHighlightedColor, CPThemeStateHighlighted],
|
||||||
|
|
||||||
[@"bezel-inset", CGInsetMakeZero(), CPThemeStateBezeled],
|
[@"bezel-inset", CGInsetMakeZero(), CPThemeStateBezeled],
|
||||||
[@"content-inset", CGInsetMake(2.0, 22.0, 2.0, 15.0), CPThemeStateBezeled],
|
[@"content-inset", CGInsetMake(2.0, 20.0, 2.0, 20.0), CPThemeStateBezeled],
|
||||||
|
|
||||||
// Minimum height == maximum height since tokens are fixed height.
|
// Minimum height == maximum height since tokens are fixed height.
|
||||||
[@"min-size", CGSizeMake(0.0, 19.0)],
|
[@"min-size", CGSizeMake(0.0, 19.0)],
|
||||||
@@ -1112,16 +1112,17 @@ var themedButtonValues = nil,
|
|||||||
|
|
||||||
themeValues =
|
themeValues =
|
||||||
[
|
[
|
||||||
[@"bezel-color", bezelColor, CPThemeStateBordered],
|
[@"bezel-color", bezelColor, CPThemeStateBordered | CPThemeStateHovered],
|
||||||
[@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted],
|
[@"bezel-color", [bezelColor colorWithAlphaComponent:0], CPThemeStateBordered | CPThemeStateDisabled],
|
||||||
|
[@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted],
|
||||||
|
|
||||||
[@"min-size", CGSizeMake(8.0, 8.0)],
|
[@"min-size", CGSizeMake(8.0, 8.0)],
|
||||||
[@"max-size", CGSizeMake(8.0, 8.0)],
|
[@"max-size", CGSizeMake(8.0, 8.0)],
|
||||||
|
|
||||||
[@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered],
|
[@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered],
|
||||||
[@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted],
|
[@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted],
|
||||||
|
|
||||||
[@"offset", CGPointMake(17, 6), CPThemeStateBordered]
|
[@"offset", CGPointMake(17, 6), CPThemeStateBordered]
|
||||||
];
|
];
|
||||||
|
|
||||||
[self registerThemeValues:themeValues forView:button];
|
[self registerThemeValues:themeValues forView:button];
|
||||||
|
|||||||
+22
-21
@@ -134,7 +134,7 @@ var _CPAttachedWindow_attachedWindowShouldClose_ = 1 << 0,
|
|||||||
[self setMovableByWindowBackground:YES];
|
[self setMovableByWindowBackground:YES];
|
||||||
[self setHasShadow:NO];
|
[self setHasShadow:NO];
|
||||||
|
|
||||||
[self setCSS3Property:@"TransitionProperty" value:@"-webkit-transform, opacity"];
|
[self setCSS3Property:@"TransitionProperty" value:CPBrowserCSSProperty('transform') + @", opacity"];
|
||||||
|
|
||||||
[_windowView setNeedsDisplay:YES];
|
[_windowView setNeedsDisplay:YES];
|
||||||
}
|
}
|
||||||
@@ -350,25 +350,18 @@ var _CPAttachedWindow_attachedWindowShouldClose_ = 1 << 0,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! @ignore */
|
/*! @ignore */
|
||||||
- (void)setCSS3Property:(CPString)property value:(CPString)value
|
- (void)setCSS3Property:(CPString)aProperty value:(CPString)value
|
||||||
{
|
{
|
||||||
_DOMElement.style['webkit' + property] = value;
|
var browserProperty = CPBrowserStyleProperty(aProperty);
|
||||||
|
|
||||||
// Support other browsers here eventually
|
if (browserProperty)
|
||||||
|
_DOMElement.style[browserProperty] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! @ignore */
|
/*! @ignore */
|
||||||
- (BOOL)browserSupportsAnimation
|
- (BOOL)browserSupportsAnimation
|
||||||
{
|
{
|
||||||
return typeof(_DOMElement.style.webkitTransition) !== "undefined";
|
return CPBrowserStyleProperty('transition') && CPBrowserStyleProperty('transitionend');
|
||||||
|
|
||||||
/*
|
|
||||||
No others browsers supported yet.
|
|
||||||
|
|
||||||
typeof(_DOMElement.style.MozTransition) !== "undefined" ||
|
|
||||||
typeof(_DOMElement.style.MsTransition) !== "undefined" ||
|
|
||||||
typeof(_DOMElement.style.OTransition) !== "undefined";
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
@@ -388,6 +381,14 @@ var _CPAttachedWindow_attachedWindowShouldClose_ = 1 << 0,
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark Overrides
|
#pragma mark Overrides
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Attached windows, such as pop overs, can usually become the key window.
|
||||||
|
*/
|
||||||
|
- (BOOL)canBecomeKeyWindow
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Called when the window is losing focus.
|
Called when the window is losing focus.
|
||||||
*/
|
*/
|
||||||
@@ -452,28 +453,28 @@ var _CPAttachedWindow_attachedWindowShouldClose_ = 1 << 0,
|
|||||||
|
|
||||||
// Set up the pop-out transition
|
// Set up the pop-out transition
|
||||||
[self setCSS3Property:@"Transform" value:@"scale(1.1)"];
|
[self setCSS3Property:@"Transform" value:@"scale(1.1)"];
|
||||||
[self setCSS3Property:@"Transition" value:@"-webkit-transform 200ms ease-in"];
|
[self setCSS3Property:@"Transition" value:CPBrowserCSSProperty('transform') + @" 200ms ease-in"];
|
||||||
|
|
||||||
var transitionEndFunction = function()
|
var transitionEndFunction = function()
|
||||||
{
|
{
|
||||||
_DOMElement.removeEventListener("webkitTransitionEnd", transitionEndFunction, YES);
|
_DOMElement.removeEventListener(CPBrowserStyleProperty('transitionend'), transitionEndFunction, YES);
|
||||||
|
|
||||||
// Now set up the pop-in to normal size transition.
|
// Now set up the pop-in to normal size transition.
|
||||||
// Because we are watching the -webkit-transform, it will occur now.
|
// Because we are watching the -webkit-transform, it will occur now.
|
||||||
[self setCSS3Property:@"Transform" value:@"scale(1)"];
|
[self setCSS3Property:@"Transform" value:@"scale(1)"];
|
||||||
[self setCSS3Property:@"Transition" value:@"-webkit-transform 50ms linear"];
|
[self setCSS3Property:@"Transition" value:CPBrowserCSSProperty('transform') + @" 50ms linear"];
|
||||||
|
|
||||||
var transitionCompleteFunction = function()
|
var transitionCompleteFunction = function()
|
||||||
{
|
{
|
||||||
_DOMElement.removeEventListener("webkitTransitionEnd", transitionCompleteFunction, YES);
|
_DOMElement.removeEventListener(CPBrowserStyleProperty('transitionend'), transitionCompleteFunction, YES);
|
||||||
if (_implementedDelegateMethods & _CPAttachedWindow_attachedWindowDidShow_)
|
if (_implementedDelegateMethods & _CPAttachedWindow_attachedWindowDidShow_)
|
||||||
[_delegate attachedWindowDidShow:self];
|
[_delegate attachedWindowDidShow:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
_DOMElement.addEventListener("webkitTransitionEnd", transitionCompleteFunction, YES);
|
_DOMElement.addEventListener(CPBrowserStyleProperty('transitionend'), transitionCompleteFunction, YES);
|
||||||
};
|
};
|
||||||
|
|
||||||
_DOMElement.addEventListener("webkitTransitionEnd", transitionEndFunction, YES);
|
_DOMElement.addEventListener(CPBrowserStyleProperty('transitionend'), transitionEndFunction, YES);
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -506,11 +507,11 @@ var _CPAttachedWindow_attachedWindowShouldClose_ = 1 << 0,
|
|||||||
|
|
||||||
var transitionEndFunction = function()
|
var transitionEndFunction = function()
|
||||||
{
|
{
|
||||||
_DOMElement.removeEventListener("webkitTransitionEnd", transitionEndFunction, YES);
|
_DOMElement.removeEventListener(CPBrowserStyleProperty("transitionend"), transitionEndFunction, YES);
|
||||||
[self _close];
|
[self _close];
|
||||||
};
|
};
|
||||||
|
|
||||||
_DOMElement.addEventListener("webkitTransitionEnd", transitionEndFunction, YES);
|
_DOMElement.addEventListener(CPBrowserStyleProperty("transitionend"), transitionEndFunction, YES);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ var _CPAutocompleteMenuMaximumHeight = 307;
|
|||||||
[_menuWindow setLevel:CPPopUpMenuWindowLevel];
|
[_menuWindow setLevel:CPPopUpMenuWindowLevel];
|
||||||
[_menuWindow setHasShadow:YES];
|
[_menuWindow setHasShadow:YES];
|
||||||
[_menuWindow setShadowStyle:CPMenuWindowShadowStyle];
|
[_menuWindow setShadowStyle:CPMenuWindowShadowStyle];
|
||||||
[_menuWindow setAcceptsMouseMovedEvents:NO];
|
[_menuWindow setAcceptsMouseMovedEvents:YES];
|
||||||
[_menuWindow setBackgroundColor:[_CPMenuWindow backgroundColorForBackgroundStyle:_CPMenuWindowPopUpBackgroundStyle]];
|
[_menuWindow setBackgroundColor:[_CPMenuWindow backgroundColorForBackgroundStyle:_CPMenuWindowPopUpBackgroundStyle]];
|
||||||
|
|
||||||
var contentView = [_menuWindow contentView];
|
var contentView = [_menuWindow contentView];
|
||||||
|
|||||||
@@ -254,6 +254,9 @@ var _CPTimerBridgeTimer = function(codeOrFunction, aDelay, shouldRepeat, functio
|
|||||||
theFunction = function() { codeOrFunction.apply(window, functionArgs); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
|
theFunction = function() { codeOrFunction.apply(window, functionArgs); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A call such as setTimeout(f) is technically invalid but browsers seem to treat it as setTimeout(f, 0), so so will we.
|
||||||
|
aDelay = aDelay | 0.0;
|
||||||
|
|
||||||
CPTimersForTimeoutIDs[timeoutID] = [CPTimer scheduledTimerWithTimeInterval:aDelay / 1000 callback:theFunction repeats:shouldRepeat];
|
CPTimersForTimeoutIDs[timeoutID] = [CPTimer scheduledTimerWithTimeInterval:aDelay / 1000 callback:theFunction repeats:shouldRepeat];
|
||||||
|
|
||||||
return timeoutID;
|
return timeoutID;
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ function environmentFlags()
|
|||||||
|
|
||||||
var SHRINKSAFE = require("minify/shrinksafe");
|
var SHRINKSAFE = require("minify/shrinksafe");
|
||||||
function compressor(code) {
|
function compressor(code) {
|
||||||
return SHRINKSAFE.compress(code, { charset : "UTF-16", useServer : true });
|
return SHRINKSAFE.compress(code, { charset : "UTF-8", useServer : true });
|
||||||
}
|
}
|
||||||
|
|
||||||
function gcc(inputFilePath, outputFilePath, flags, compress)
|
function gcc(inputFilePath, outputFilePath, flags, compress)
|
||||||
|
|||||||
@@ -11,15 +11,18 @@
|
|||||||
|
|
||||||
|
|
||||||
@implementation AppController : CPObject
|
@implementation AppController : CPObject
|
||||||
|
{
|
||||||
|
CPTabView tabView1;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
- (void)applicationDidFinishLaunching:(CPNotification)aNotification
|
||||||
{
|
{
|
||||||
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
|
var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
|
||||||
contentView = [theWindow contentView];
|
contentView = [theWindow contentView];
|
||||||
|
|
||||||
var tabView = [[CPTabView alloc] initWithFrame:CGRectMake(50,50,400,400)];
|
tabView1 = [[CPTabView alloc] initWithFrame:CGRectMake(50,50,400,400)];
|
||||||
[tabView setTabViewType:CPNoTabsBezelBorder];
|
[tabView1 setTabViewType:CPNoTabsBezelBorder];
|
||||||
[tabView setTabViewType:CPTopTabsBezelBorder];
|
[tabView1 setTabViewType:CPTopTabsBezelBorder];
|
||||||
|
|
||||||
var tabs = [
|
var tabs = [
|
||||||
"First Tab", "a label",
|
"First Tab", "a label",
|
||||||
@@ -39,14 +42,27 @@
|
|||||||
var item = [[CPTabViewItem alloc] initWithIdentifier:tabs[i]];
|
var item = [[CPTabViewItem alloc] initWithIdentifier:tabs[i]];
|
||||||
[item setView:view];
|
[item setView:view];
|
||||||
[item setLabel:tabs[i]];
|
[item setLabel:tabs[i]];
|
||||||
[tabView addTabViewItem:item];
|
[tabView1 addTabViewItem:item];
|
||||||
}
|
}
|
||||||
|
|
||||||
[contentView addSubview:tabView];
|
[contentView addSubview:tabView1];
|
||||||
|
|
||||||
[tabView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
[tabView1 setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
|
||||||
|
|
||||||
|
var toggleButton = [CPButton buttonWithTitle:@"Cycle Tab View Type"];
|
||||||
|
[toggleButton setAction:@selector(switchTabType:)];
|
||||||
|
[toggleButton setTarget:self];
|
||||||
|
[toggleButton sizeToFit];
|
||||||
|
[toggleButton setFrameOrigin:CGPointMake(CGRectGetWidth([contentView frame]) - CGRectGetWidth([toggleButton frame]) - 15, 15)];
|
||||||
|
[toggleButton setAutoresizingMask:CPViewMinXMargin | CPViewMaxYMargin];
|
||||||
|
[contentView addSubview:toggleButton];
|
||||||
|
|
||||||
[theWindow orderFront:self];
|
[theWindow orderFront:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (@action)switchTabType:(id)sender
|
||||||
|
{
|
||||||
|
[tabView1 setTabViewType:[tabView1 tabViewType] < CPNoTabsNoBorder ? [tabView1 tabViewType] + 1 : CPTopTabsBezelBorder];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -87,6 +87,11 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad
|
|||||||
// Delegate must be set before objectValue
|
// Delegate must be set before objectValue
|
||||||
[tokenFieldD setDelegate:self];
|
[tokenFieldD setDelegate:self];
|
||||||
|
|
||||||
|
var tokenFieldDEditable = [CPCheckBox checkBoxWithTitle:"Editable"];
|
||||||
|
[tokenFieldDEditable setFrame:CGRectMake(525, CGRectGetMinY([tokenFieldD frame]), 200, 30)];
|
||||||
|
[tokenFieldDEditable bind:CPValueBinding toObject:tokenFieldD withKeyPath:@"editable" options:nil];
|
||||||
|
[contentView addSubview:tokenFieldDEditable];
|
||||||
|
|
||||||
allPersons = [
|
allPersons = [
|
||||||
[Person personWithFirstName:@"Luc" lastName:@"Vauvillier"],
|
[Person personWithFirstName:@"Luc" lastName:@"Vauvillier"],
|
||||||
[Person personWithFirstName:@"John" lastName:@"Doe"],
|
[Person personWithFirstName:@"John" lastName:@"Doe"],
|
||||||
|
|||||||
Reference in New Issue
Block a user