/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsMacCursor.h"
#include "nsObjCExceptions.h"
#include "nsDebug.h"
#include "nsDirectoryServiceDefs.h"
#include "nsCOMPtr.h"
#include "nsIFile.h"
#include "nsString.h"
/*! @category nsMacCursor (PrivateMethods)
@abstract Private methods internal to the nsMacCursor class.
@discussion nsMacCursor
is effectively an abstract class. It
does not define complete behaviour in and of itself, the subclasses defined
in this file provide the useful implementations.
*/
@interface nsMacCursor (PrivateMethods)
/*! @method getNextCursorFrame
@abstract get the index of the next cursor frame to display.
@discussion Increments and returns the frame counter of an animated cursor.
@result The index of the next frame to display in the cursor animation
*/
- (int)getNextCursorFrame;
/*! @method numFrames
@abstract Query the number of frames in this cursor's animation.
@discussion Returns the number of frames in this cursor's animation. Static
cursors return 1.
*/
- (int)numFrames;
/*! @method createTimer
@abstract Create a Timer to use to animate the cursor.
@discussion Creates an instance of NSTimer
which is used to
drive the cursor animation. This method should only be called for cursors
that are animated.
*/
- (void)createTimer;
/*! @method destroyTimer
@abstract Destroy any timer instance associated with this cursor.
@discussion Invalidates and releases any NSTimer
instance
associated with this cursor.
*/
- (void)destroyTimer;
/*! @method destroyTimer
@abstract Destroy any timer instance associated with this cursor.
@discussion Invalidates and releases any NSTimer
instance
associated with this cursor.
*/
/*! @method advanceAnimatedCursor:
@abstract Method called by animation timer to perform animation.
@discussion Called by an animated cursor's associated timer to advance the
animation to the next frame. Determines which frame should occur next and
sets the cursor to that frame.
@param aTimer the timer causing the animation
*/
- (void)advanceAnimatedCursor:(NSTimer*)aTimer;
/*! @method setFrame:
@abstract Sets the current cursor, using an index to determine which frame
in the animation to display.
@discussion Sets the current cursor. The frame index determines which frame
is shown if the cursor is animated. Frames and numbered from 0
to -[nsMacCursor numFrames] - 1
. A static cursor has a single
frame, numbered 0.
@param aFrameIndex the index indicating which frame from the animation
to display
*/
- (void)setFrame:(int)aFrameIndex;
@end
/*! @class nsCocoaCursor
@abstract Implementation of nsMacCursor
that uses Cocoa
NSCursor
instances.
@discussion Displays a static or animated cursor, using Cocoa
NSCursor
instances. These can be either built-in
NSCursor
instances, or custom NSCursor
s created
from images. When more than one NSCursor
is provided, the cursor
will use these as animation frames.
*/
@interface nsCocoaCursor : nsMacCursor {
@private
NSArray* mFrames;
NSCursor* mLastSetCocoaCursor;
}
/*! @method initWithFrames:
@abstract Create an animated cursor by specifying the frames to use for
the animation.
@discussion Creates a cursor that will animate by cycling through the given
frames. Each element of the array must be an instance of
NSCursor
@param aCursorFrames an array of NSCursor
, representing
the frames of an animated cursor, in the order they should be played.
@param aType the corresponding nsCursor
constant
@result an instance of nsCocoaCursor
that will animate the
given cursor frames
*/
- (id)initWithFrames:(NSArray*)aCursorFrames type:(nsCursor)aType;
/*! @method initWithCursor:
@abstract Create a cursor by specifying a Cocoa NSCursor
.
@discussion Creates a cursor representing the given Cocoa built-in cursor.
@param aCursor the NSCursor
to use
@param aType the corresponding nsCursor
constant
@result an instance of nsCocoaCursor
representing the given
NSCursor
*/
- (id)initWithCursor:(NSCursor*)aCursor type:(nsCursor)aType;
/*! @method initWithImageNamed:hotSpot:
@abstract Create a cursor by specifying the name of an image resource to
use for the cursor and a hotspot.
@discussion Creates a cursor by loading the named image using the
+[NSImage imageNamed:]
method.
The image must be compatible
with any restrictions laid down by NSCursor
. These vary by
operating system version.
The hotspot precisely determines the point where the user clicks when using the cursor.
@param aCursor the name of the image to use for the cursor @param aPoint the point within the cursor to use as the hotspot @param aType the correspondingnsCursor
constant
@result an instance of nsCocoaCursor
that uses the given
image and hotspot
*/
- (id)initWithImageNamed:(NSString*)aCursorImage
hotSpot:(NSPoint)aPoint
type:(nsCursor)aType;
@end
@implementation nsMacCursor
+ (nsMacCursor*)cursorWithCursor:(NSCursor*)aCursor type:(nsCursor)aType {
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
return [[[nsCocoaCursor alloc] initWithCursor:aCursor
type:aType] autorelease];
NS_OBJC_END_TRY_BLOCK_RETURN(nil);
}
+ (nsMacCursor*)cursorWithImageNamed:(NSString*)aCursorImage
hotSpot:(NSPoint)aPoint
type:(nsCursor)aType {
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
return [[[nsCocoaCursor alloc] initWithImageNamed:aCursorImage
hotSpot:aPoint
type:aType] autorelease];
NS_OBJC_END_TRY_BLOCK_RETURN(nil);
}
+ (nsMacCursor*)cursorWithFrames:(NSArray*)aCursorFrames type:(nsCursor)aType {
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
return [[[nsCocoaCursor alloc] initWithFrames:aCursorFrames
type:aType] autorelease];
NS_OBJC_END_TRY_BLOCK_RETURN(nil);
}
+ (NSCursor*)cocoaCursorWithImageNamed:(NSString*)imageName
hotSpot:(NSPoint)aPoint {
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
nsCOMPtr