gngrwzrd

NSTextField Edit in Place

Apr 22nd, 2014
535
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**   delegate **/
  2. #import <Foundation/Foundation.h>
  3. @class GWTitleField;
  4. @protocol GWTitleEditingDelegate <NSObject>
  5. - (void) titleFieldBeginEditing:(GWTitleField *) titleField;
  6. - (void) titleFieldCommitEditing:(GWTitleField *) titleField;
  7. - (void) titleFieldDiscardEditing:(GWTitleField *) titleField;
  8. @end
  9.  
  10. /** title editor field header **/
  11. #import <Cocoa/Cocoa.h>
  12. #import "GWTitleField.h"
  13. #import "GWTitleEditingDelegate.h"
  14. @interface GWTitleEditorField : NSTextField
  15. @property (assign) GWTitleField * titleField;
  16. @property (assign) NSObject <GWTitleEditingDelegate> * editDelegate;
  17. - (void) beginEditing;
  18. - (void) cancelEditing;
  19. @end
  20.  
  21. /** title editor field impl **/
  22.  
  23. #import "GWTitleEditorField.h"
  24. @implementation GWTitleEditorField
  25. - (void) beginEditing {
  26.     [self selectText:nil];
  27.     [self becomeFirstResponder];
  28. }
  29. - (void) cancelEditing {
  30.     if(!self.titleField) {
  31.         return;
  32.     }
  33.     [self.titleField discardEditsFromEditorField:self];
  34. }
  35. - (void) keyUp:(NSEvent *) theEvent {
  36.     if(self.editDelegate) {
  37.         if(theEvent.keyCode == 36 || theEvent.keyCode == 48) { //enter || tab
  38.             if([self.editDelegate respondsToSelector:@selector(titleFieldCommitEditing:)]) {
  39.                 [self.editDelegate titleFieldCommitEditing:self.titleField];
  40.             }
  41.         }
  42.         if(theEvent.keyCode == 53) { //escape
  43.             if([self.editDelegate respondsToSelector:@selector(titleFieldDiscardEditing:)]) {
  44.                 [self.editDelegate titleFieldDiscardEditing:self.titleField];
  45.             }
  46.         }
  47.     }
  48. }
  49. @end
  50.  
  51. /** title field header **/
  52.  
  53. #import <Cocoa/Cocoa.h>
  54. #import "GWTitleEditorField.h"
  55. #import "GWTitleEditingDelegate.h"
  56.  
  57. @class GWTitleEditorField;
  58. @interface GWTitleField : NSTextField {
  59.     NSTimer * _editTimeout;
  60. }
  61. @property BOOL editInPlace;
  62. @property BOOL singleClickDelayedEdit;
  63. @property NSTimeInterval singleClickDelay;
  64. @property (assign) NSObject <GWTitleEditingDelegate> * editDelegate;
  65. - (void) editWithEditorField:(GWTitleEditorField *) editorField;
  66. - (void) commitEditsFromEditorField:(GWTitleEditorField *) editorField;
  67. - (void) discardEditsFromEditorField:(GWTitleEditorField *) editorField;
  68. @end
  69.  
  70. /** title field impl **/
  71.  
  72. #import "GWTitleField.h"
  73.  
  74. @implementation GWTitleField
  75.  
  76. - (id) initWithCoder:(NSCoder *)aDecoder {
  77.     self = [super initWithCoder:aDecoder];
  78.     self.singleClickDelay = .8;
  79.     self.singleClickDelayedEdit = TRUE;
  80.     return self;
  81. }
  82.  
  83. - (id) initWithFrame:(NSRect)frameRect {
  84.     self = [super initWithFrame:frameRect];
  85.     self.singleClickDelay = .8;
  86.     self.singleClickDelayedEdit = FALSE;
  87.     return self;
  88. }
  89.  
  90. - (void) mouseUp:(NSEvent *) theEvent {
  91.     if(!self.editInPlace) {
  92.         return;
  93.     }
  94.     if(_editTimeout) {
  95.         [_editTimeout invalidate];
  96.         _editTimeout = nil;
  97.     }
  98.     if(theEvent.clickCount > 1) {
  99.             [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(_edit:) userInfo:nil repeats:FALSE];
  100.             return;
  101.     }
  102.     if(self.singleClickDelayedEdit) {
  103.         _editTimeout = [NSTimer scheduledTimerWithTimeInterval:self.singleClickDelay target:self selector:@selector(_edit:) userInfo:nil repeats:false];
  104.     }
  105. }
  106.  
  107. - (void) editWithEditorField:(GWTitleEditorField *) editorField {
  108.     if(!self.superview) {
  109.         return;
  110.     }
  111.     if(editorField.titleField) {
  112.         [editorField.titleField commitEditsFromEditorField:editorField];
  113.     }
  114.     editorField.titleField = self;
  115.     [editorField setStringValue:self.stringValue];
  116.     NSRect sf = self.frame;
  117.     editorField.frame = sf;
  118.     [self.superview addSubview:editorField];
  119.     [editorField beginEditing];
  120.     [self setHidden:TRUE];
  121. }
  122.  
  123. - (void) commitEditsFromEditorField:(GWTitleEditorField *) editorField {
  124.     editorField.titleField = nil;
  125.     [self setStringValue:editorField.stringValue];
  126.     [self setHidden:NO];
  127.     [editorField removeFromSuperview];
  128. }
  129.  
  130. - (void) discardEditsFromEditorField:(GWTitleEditorField *) editorField {
  131.     editorField.titleField = nil;
  132.     [self setHidden:NO];
  133.     [editorField removeFromSuperview];
  134. }
  135.  
  136. - (void) _edit:(NSTimer *) sender {
  137.     if(self.editDelegate) {
  138.         if([self.editDelegate respondsToSelector:@selector(titleFieldBeginEditing:)]) {
  139.             [self.editDelegate titleFieldBeginEditing:self];
  140.         }
  141.     }
  142. }
  143.  
  144. @end
Advertisement
Add Comment
Please, Sign In to add comment