implement textarea events (Cocoa)

Wed, 03 Jun 2026 20:19:27 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 03 Jun 2026 20:19:27 +0200
changeset 1164
3c037b84e6eb
parent 1163
a32411b88442
child 1165
aca0b56e92d2

implement textarea events (Cocoa)

ui/cocoa/text.h file | annotate | diff | comparison | revisions
ui/cocoa/text.m file | annotate | diff | comparison | revisions
--- a/ui/cocoa/text.h	Wed Jun 03 19:58:39 2026 +0200
+++ b/ui/cocoa/text.h	Wed Jun 03 20:19:27 2026 +0200
@@ -48,6 +48,22 @@
 char* ui_textfield_get(UiString *s);
 void ui_textfield_set(UiString *s, const char *value);
 
+
+@interface TextAreaDelegate: NSObject<NSTextViewDelegate, NSTextDelegate>
+
+@property UiObject *obj;
+@property UiVar *var;
+@property ui_callback onchange;
+@property void *onchangedata;
+@property NSString *onchange_action;
+@property ui_callback ontextchanged;
+@property void *ontextchangeddata;
+@property NSString *ontextchanged_action;
+
+- (id)init:(UiObject*)obj var:(UiVar*)var args:(UiTextAreaArgs*)args;
+
+@end
+
 @interface TextFieldDelegate : NSObject<NSTextFieldDelegate>
 
 @property UiObject *obj;
--- a/ui/cocoa/text.m	Wed Jun 03 19:58:39 2026 +0200
+++ b/ui/cocoa/text.m	Wed Jun 03 20:19:27 2026 +0200
@@ -72,6 +72,10 @@
         text->remove = ui_textarea_remove;
     }
     
+    if(args->onchange || args->ontextchanged || args->onchange_action || args->ontextchanged_action) {
+        
+    }
+    
     return (__bridge void*)scrollview;
 }
 
@@ -269,6 +273,110 @@
 
 
 
+@implementation TextAreaDelegate
+
+- (id)init:(UiObject*)obj var:(UiVar*)var args:(UiTextAreaArgs*)args {
+    self.onchange = args->onchange;
+    self.onchangedata = args->onchangedata;
+    if(args->onchange_action) {
+        self.onchange_action = [[NSString alloc]initWithUTF8String:args->onchange_action];
+    }
+    self.ontextchanged = args->ontextchanged;
+    self.ontextchangeddata = args->ontextchangeddata;
+    if(args->ontextchanged_action) {
+        self.ontextchanged_action = [[NSString alloc]initWithUTF8String:args->ontextchanged_action];
+    }
+    self.obj = obj;
+    self.var = var;
+    return self;
+}
+
+- (BOOL) textView:(NSTextView *) textView
+    shouldChangeTextInRange:(NSRange) affectedCharRange
+    replacementString:(NSString *) replacementString {
+    
+    if(_onchange == nil && _onchange_action == nil) {
+        return YES;
+    }
+    
+    UiEvent event;
+    event.obj = _obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    event.intval = 0;
+    event.set = ui_get_setop();
+    // event data not set yet
+    
+    if(affectedCharRange.length > 0) {
+        UiTextChangeEventData eventdata;
+        eventdata.type = UI_TEXT_DELETE;
+        eventdata.begin = (int)affectedCharRange.location;
+        eventdata.end = (int)(affectedCharRange.location + affectedCharRange.length);
+        eventdata.text = NULL;
+        eventdata.length = 0;
+        
+        event.eventdata = &eventdata;
+        event.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED;
+        
+        if(_onchange) {
+            _onchange(&event, _onchangedata);
+        }
+        
+        if(_onchange_action) {
+            uic_action_callback(&event, _onchange_action.UTF8String);
+        }
+    }
+    
+    if(replacementString.length > 0) {
+        UiTextChangeEventData eventdata;
+        eventdata.type = UI_TEXT_INSERT;
+        eventdata.begin = (int)affectedCharRange.location;
+        eventdata.end = 0;
+        eventdata.text = replacementString.UTF8String;
+        eventdata.length = (int)replacementString.length;
+        
+        event.eventdata = &eventdata;
+        event.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED;
+        
+        if(_onchange) {
+            _onchange(&event, _onchangedata);
+        }
+        
+        if(_onchange_action) {
+            uic_action_callback(&event, _onchange_action.UTF8String);
+        }
+    }
+    
+    return YES;
+}
+
+- (void) textDidChange:(NSNotification *) notification {
+    UiEvent event;
+    event.obj = _obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    if(_var) {
+        event.eventdata = _var->value;
+        event.eventdatatype = UI_EVENT_DATA_TEXT_VALUE;
+    } else {
+        event.eventdata = NULL;
+        event.eventdatatype = 0;
+    }
+    event.intval = 0;
+    event.set = ui_get_setop();
+    
+    if(_ontextchanged) {
+        _ontextchanged(&event, _ontextchangeddata);
+    }
+    
+    if(_ontextchanged_action) {
+        uic_action_callback(&event, _ontextchanged_action.UTF8String);
+    }
+}
+
+@end
+
+
 /* -------------------------- TextField -------------------------- */
 
 static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value) {

mercurial