Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #import <Cocoa/Cocoa.h>
- @interface EditTextField : NSTextField <NSTextDelegate,NSTextViewDelegate,NSTextFieldDelegate>
- @property BOOL isEditing;
- @property BOOL commitChangesOnEscapeKey;
- @property BOOL editAfterDelay;
- @property CGFloat delay;
- @end
- ----
- #import "EditTextField.h"
- @interface EditTextField ()
- @property NSObject <NSTextFieldDelegate,NSTextViewDelegate> * userDelegate;
- @property NSString * originalStringValue;
- @property NSTimer * editTimer;
- @property NSTrackingArea * editTrackingArea;
- @end
- @implementation EditTextField
- - (id) initWithCoder:(NSCoder *)coder {
- self = [super initWithCoder:coder];
- [self defaultInit];
- return self;
- }
- - (id) initWithFrame:(NSRect)frameRect {
- self = [super initWithFrame:frameRect];
- [self defaultInit];
- return self;
- }
- - (id) init {
- self = [super init];
- [self defaultInit];
- return self;
- }
- - (void) defaultInit {
- self.delay = .8;
- }
- - (void) mouseDown:(NSEvent *) theEvent {
- if(theEvent.clickCount == 2) {
- [self startEditing];
- } else {
- [super mouseDown:theEvent];
- if(self.editAfterDelay) {
- [self startTracking];
- self.editTimer = [NSTimer scheduledTimerWithTimeInterval:.8 target:self selector:@selector(startEditing) userInfo:nil repeats:FALSE];
- }
- }
- }
- - (void) startTracking {
- if(!self.editTrackingArea) {
- self.editTrackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited|NSTrackingMouseMoved|NSTrackingActiveInActiveApp|NSTrackingAssumeInside|NSTrackingInVisibleRect owner:self userInfo:nil];
- }
- [self addTrackingArea:self.editTrackingArea];
- }
- - (void) mouseExited:(NSEvent *)theEvent {
- [self.editTimer invalidate];
- self.editTimer = nil;
- }
- - (void) mouseMoved:(NSEvent *) theEvent {
- [self.editTimer invalidate];
- self.editTimer = nil;
- }
- - (void) startEditing {
- id firstResponder = self.window.firstResponder;
- if([firstResponder isKindOfClass:[NSTextView class]]) {
- NSTextView * tv = (NSTextView *)firstResponder;
- if(tv.delegate && [tv.delegate isKindOfClass:[EditTextField class]]) {
- EditTextField * fr = (EditTextField *)tv.delegate;
- [fr stopEditingCommitChanges:FALSE clearFirstResponder:FALSE];
- }
- }
- if(self.delegate != self) {
- self.userDelegate = (NSObject <NSTextFieldDelegate,NSTextViewDelegate> *)self.delegate;
- }
- self.isEditing = TRUE;
- self.delegate = self;
- self.editable = TRUE;
- self.originalStringValue = self.stringValue;
- [self.window makeFirstResponder:self];
- }
- - (void) stopEditingCommitChanges:(BOOL) commitChanges clearFirstResponder:(BOOL) clearFirstResponder {
- self.editable = FALSE;
- self.isEditing = FALSE;
- self.delegate = nil;
- [self removeTrackingArea:self.editTrackingArea];
- if(!commitChanges) {
- self.stringValue = self.originalStringValue;
- }
- if(clearFirstResponder) {
- [self.window makeFirstResponder:nil];
- }
- }
- - (void) cancelOperation:(id) sender {
- if(self.commitChangesOnEscapeKey) {
- [self stopEditingCommitChanges:TRUE clearFirstResponder:TRUE];
- } else {
- [self stopEditingCommitChanges:FALSE clearFirstResponder:TRUE];
- }
- }
- - (BOOL) textView:(NSTextView *) textView doCommandBySelector:(SEL) commandSelector {
- BOOL handlesCommand = FALSE;
- NSString * selector = NSStringFromSelector(commandSelector);
- if(self.userDelegate) {
- if([self.userDelegate respondsToSelector:@selector(control:textView:doCommandBySelector:)]) {
- handlesCommand = [self.userDelegate control:self textView:textView doCommandBySelector:commandSelector];
- } else if([self.userDelegate respondsToSelector:@selector(textView:doCommandBySelector:)]) {
- handlesCommand = [self.userDelegate textView:textView doCommandBySelector:commandSelector];
- }
- if(!handlesCommand) {
- if([selector isEqualToString:@"insertNewline:"]) {
- [self stopEditingCommitChanges:TRUE clearFirstResponder:TRUE];
- handlesCommand = TRUE;
- }
- if([selector isEqualToString:@"insertTab:"]) {
- [self stopEditingCommitChanges:TRUE clearFirstResponder:FALSE];
- handlesCommand = FALSE;
- }
- }
- } else {
- if([selector isEqualToString:@"insertNewline:"]) {
- [self stopEditingCommitChanges:TRUE clearFirstResponder:TRUE];
- handlesCommand = TRUE;
- }
- if([selector isEqualToString:@"insertTab:"]) {
- [self stopEditingCommitChanges:TRUE clearFirstResponder:FALSE];
- handlesCommand = FALSE;
- }
- }
- return handlesCommand;
- }
- @end
Advertisement
Add Comment
Please, Sign In to add comment