mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 21:17:03 +00:00
("cappuccino-body"). This let's external libraries, esp. flash ones, add things to the body without
Cappuccino getting rid of them as soon as the page loads.
Closes #421.
275 lines
6.5 KiB
Plaintext
Executable File
275 lines
6.5 KiB
Plaintext
Executable File
/*
|
|
Testing browsers:
|
|
WebKit r50235 (Safari 4.0.3+)
|
|
FireFox 3.5
|
|
Opera 10.0.0
|
|
|
|
Implemented class methods:
|
|
Webkit : All
|
|
IE : All
|
|
FireFox Win : All
|
|
FireFox Mac : All except closedHandCursor disappearingItemCursor // Firefox mac does not support url cursors
|
|
Opera : All except resizeLeftRightCursor resizeUpDownCursor operationNotAllowedCursor dragCopyCursor dragLinkCursor contextualMenuCursor openHandCursor closedHandCursor disappearingItemCursor // Opera does not support url cursors so these won't work with images
|
|
*/
|
|
|
|
#include "Platform/Platform.h"
|
|
|
|
var currentCursor = nil,
|
|
cursorStack = [],
|
|
cursors = {},
|
|
cursorURLFormat = nil;
|
|
|
|
@implementation CPCursor : CPObject
|
|
{
|
|
CPString _cssString;
|
|
BOOL _isSetOnMouseEntered @accessors(readwrite, getter=isSetOnMouseEntered, setter=setOnMouseEntered:);
|
|
BOOL _isSetOnMouseExited @accessors(readwrite, getter=isSetOnMouseExited, setter=setOnMouseExited:);
|
|
}
|
|
|
|
+ (CPCursor)currentCursor
|
|
{
|
|
return currentCursor;
|
|
}
|
|
|
|
- (id)initWithCSSString:(CPString)aString
|
|
{
|
|
if (self = [super init])
|
|
_cssString = aString;
|
|
|
|
return self;
|
|
}
|
|
|
|
+ (CPCursor)cursorWithCSSString:(CPString)cssString
|
|
{
|
|
var cursor = cursors[cssString];
|
|
|
|
if (typeof cursor == 'undefined')
|
|
{
|
|
cursor = [[CPCursor alloc] initWithCSSString:cssString];
|
|
cursors[cssString] = cursor;
|
|
}
|
|
|
|
return cursor;
|
|
}
|
|
|
|
+ (CPCursor)cursorWithImageNamed:(CPString)imageName
|
|
{
|
|
if (!cursorURLFormat)
|
|
{
|
|
cursorURLFormat = @"url(" + [[CPBundle bundleForClass:self] resourcePath] + @"/CPCursor/%@.cur)";
|
|
|
|
if (CPBrowserIsEngine(CPGeckoBrowserEngine))
|
|
cursorURLFormat += ", default";
|
|
}
|
|
|
|
var url = [CPString stringWithFormat:cursorURLFormat, imageName];
|
|
|
|
return [[CPCursor alloc] initWithCSSString:url];
|
|
}
|
|
|
|
- (CPString)_cssString
|
|
{
|
|
return _cssString;
|
|
}
|
|
|
|
+ (CPCursor)arrowCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"default"]; // WebKit | FF | opera | IE
|
|
}
|
|
|
|
+ (CPCursor)crosshairCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"crosshair"]; // WebKit | FF | opera | IE
|
|
}
|
|
|
|
+ (CPCursor)IBeamCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"text"]; // WebKit | FF | opera | IE
|
|
}
|
|
|
|
+ (CPCursor)pointingHandCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"pointer"]; // WebKit | FF | opera | IE
|
|
}
|
|
|
|
+ (CPCursor)resizeDownCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:"s-resize"]; // WebKit | FF | opera
|
|
}
|
|
|
|
+ (CPCursor)resizeUpCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:@"n-resize"]; // WebKit | FF | opera
|
|
}
|
|
|
|
+ (CPCursor)resizeLeftCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:@"w-resize"]; // WebKit | FF | opera
|
|
}
|
|
|
|
+ (CPCursor)resizeRightCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:@"e-resize"]; // WebKit | FF | opera
|
|
}
|
|
|
|
+ (CPCursor)resizeLeftRightCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"col-resize"]; // WebKit | FF | IE
|
|
}
|
|
|
|
+ (CPCursor)resizeUpDownCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"row-resize"]; // WebKit | FF | IE
|
|
}
|
|
|
|
+ (CPCursor)operationNotAllowedCursor
|
|
{
|
|
return [CPCursor cursorWithCSSString:@"not-allowed"]; // WebKit | FF | IE
|
|
}
|
|
|
|
+ (CPCursor)dragCopyCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:@"copy"]; // WebKit | FF
|
|
}
|
|
|
|
+ (CPCursor)dragLinkCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:@"alias"]; // WebKit | FF
|
|
}
|
|
|
|
+ (CPCursor)contextualMenuCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
|
|
|
|
return [CPCursor cursorWithCSSString:@"context-menu"]; // WebKit | FF Mac . Not impl FF Win.
|
|
}
|
|
|
|
+ (CPCursor)openHandCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPWebKitBrowserEngine))
|
|
return [CPCursor cursorWithCSSString:@"-webkit-grab"];
|
|
else if (CPBrowserIsEngine(CPGeckoBrowserEngine) || CPBrowserIsEngine(CPOperaBrowserEngine))
|
|
return [CPCursor cursorWithCSSString:@"move"];
|
|
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit only. move in FFMac|Opera
|
|
}
|
|
|
|
+ (CPCursor)closedHandCursor
|
|
{
|
|
if (CPBrowserIsEngine(CPWebKitBrowserEngine))
|
|
return [CPCursor cursorWithCSSString:@"-webkit-grabbing"];
|
|
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit only
|
|
}
|
|
|
|
+ (CPCursor)disappearingItemCursor
|
|
{
|
|
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // None
|
|
}
|
|
|
|
+ (void)hide
|
|
{
|
|
[self _setCursorCSS:"none"]; // Not supported in IE
|
|
}
|
|
|
|
+ (void)unhide
|
|
{
|
|
[self _setCursorCSS:[currentCursor _cssString]]
|
|
}
|
|
|
|
+ (void)setHiddenUntilMouseMoves:(BOOL)flag
|
|
{
|
|
if (flag)
|
|
[CPCursor hide];
|
|
else
|
|
[CPCursor unhide];
|
|
}
|
|
|
|
- (id)initWithImage:(CPImage)image hotSpot:(CPPoint)hotSpot
|
|
{
|
|
return [self initWithCSSString:"url(" + [image filename] + ")"];
|
|
}
|
|
|
|
- (void)mouseEntered:(CPEvent)event
|
|
{
|
|
}
|
|
|
|
- (void)mouseExited:(CPEvent)event
|
|
{
|
|
}
|
|
|
|
- (void)set
|
|
{
|
|
currentCursor = self;
|
|
|
|
#if PLATFORM(DOM)
|
|
[[self class] _setCursorCSS:_cssString];
|
|
#endif
|
|
|
|
}
|
|
|
|
+ (void)_setCursorCSS:(CPString)aString
|
|
{
|
|
#if PLATFORM(DOM)
|
|
[CPPlatformWindow primaryPlatformWindow]._DOMBodyElement.style.cursor = aString;
|
|
|
|
var platformWindows = [[CPPlatformWindow visiblePlatformWindows] allObjects];
|
|
for (var i = 0, count = [platformWindows count]; i < count; i++)
|
|
platformWindows[i]._DOMBodyElement.style.cursor = aString;
|
|
#endif
|
|
}
|
|
|
|
- (void)push
|
|
{
|
|
currentCursor = cursorStack.push(self);
|
|
}
|
|
|
|
- (void)pop
|
|
{
|
|
[CPCursor pop];
|
|
}
|
|
|
|
+ (void)pop
|
|
{
|
|
if (cursorStack.length > 1)
|
|
{
|
|
cursorStack.pop();
|
|
currentCursor = cursorStack[cursorStack.length - 1];
|
|
}
|
|
}
|
|
|
|
- (id)initWithCoder:(CPCoder)coder
|
|
{
|
|
if (self = [super init])
|
|
_cssString = [coder decodeObjectForKey:@"CPCursorNameKey"];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)encodeWithCoder:(CPCoder)coder
|
|
{
|
|
[coder encodeObject:_cssString forKey:@"CPCursorNameKey"];
|
|
}
|
|
|
|
@end
|
|
|