ui/cocoa/text.m

changeset 103
6606616eca9f
parent 0
2483f517c562
child 108
77254bd6dccb
--- a/ui/cocoa/text.m	Tue Feb 25 21:11:00 2025 +0100
+++ b/ui/cocoa/text.m	Sat Apr 05 16:46:11 2025 +0200
@@ -1,7 +1,7 @@
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
- * Copyright 2014 Olaf Wintermann. All rights reserved.
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -26,165 +26,23 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#import <stdio.h>
-#import <stdlib.h>
-#import <string.h>
-
 #import "text.h"
-#import "container.h"
-
-@implementation TextChangeMgr
-
-- (TextChangeMgr*)initWithValue:(UiText*)text context:(UiContext*)ctx {
-    value = text;
-    context = ctx;
-    last_length = 0;
-    return self;
-}
-
-- (NSUndoManager*)undoManagerForTextView:(NSTextView*)textview {
-    return (NSUndoManager*)value->undomgr;
-}
-
-- (NSRange)textView:(NSTextView *)textview
-       willChangeSelectionFromCharacterRange:(NSRange)oldrange
-       toCharacterRange:(NSRange)newrange
-{
-    if(newrange.length != last_length) {
-        if(newrange.length == 0) {
-            ui_unset_group(context, UI_GROUP_SELECTION);
-        } else {
-            ui_set_group(context, UI_GROUP_SELECTION);
-        }
-    }
-    
-    last_length = newrange.length;
-    return newrange;
-}
-
-@end
-
+#import "EventData.h"
+#import "Container.h"
+#import <objc/runtime.h>
 
-UIWIDGET ui_textarea(UiObject *obj, UiText *value) {
-    UiContainer *ct = uic_get_current_container(obj);
-    
-    NSRect frame = ct->getframe(ct);
-    
-    NSScrollView *scrollview = [[NSScrollView alloc] initWithFrame:frame];
-    [scrollview setHasVerticalScroller:YES];
-    //[scrollvew setHasHorizontalScroller:YES];
-    [scrollview setBorderType:NSNoBorder];
-    //[scrollview setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
-    
-    //frame.size.width = frame.size.width - 15;
-    NSTextView *textview = [[NSTextView alloc]initWithFrame:frame];
-    [textview setAllowsUndo:TRUE];
-    [textview setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
-    
-    [textview setFont:[NSFont fontWithName:@"Menlo" size:12]];
-    
-    [scrollview setDocumentView:textview];
-    
-    ct->add(ct, scrollview);
-    
-    // bind value
-    if(value) {
-        value->get = ui_textarea_get;
-        value->set = ui_textarea_set;
-        value->getsubstr = ui_textarea_getsubstr;
-        value->insert = ui_textarea_insert;
-        value->position = ui_textarea_position;
-        value->selection = ui_textarea_selection;
-        value->length = ui_textarea_length;
-        value->value = NULL;
-        value->obj = textview;
-        
-        TextChangeMgr *delegate = [[TextChangeMgr alloc]initWithValue:value context:obj->ctx];
-        [textview setDelegate:delegate];
-        
-        NSUndoManager *undomgr = [[NSUndoManager alloc]init];
-        value->undomgr = undomgr;
-    }
+UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) {
+    NSTextView *textview = [[NSTextView alloc] init];
+    textview.autoresizingMask = NSViewWidthSizable;
+    textview.minSize = NSMakeSize(0, 0);
+    textview.maxSize = NSMakeSize(FLT_MAX, FLT_MAX);
     
-    return textview;
-}
-
-char* ui_textarea_get(UiText *text) {
-    if(text->value) {
-        free(text->value);
-    }
-    NSTextView *textview = (NSTextView*)text->obj;
-    NSString *str = [[textview textStorage]string];
-    size_t length = [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
-    const char *cstr = [str UTF8String];
-    char *value = malloc(length + 1);
-    memcpy(value, cstr, length);
-    value[length] = '\0';
-    text->value = value;
-    return value;
-}
-
-void ui_textarea_set(UiText *text, char *str) {
-    if(text->value) {
-        free(text->value);
-    }
-    NSTextView *textview = (NSTextView*)text->obj;
-    NSString *s = [[NSString alloc]initWithUTF8String:str];
-    NSAttributedString *as = [[NSAttributedString alloc]initWithString:s];
-    [[textview textStorage] setAttributedString:as];
-    text->value = NULL;
-}
-
-char* ui_textarea_getsubstr(UiText *text, int begin, int end) {
-    if(text->value) {
-        free(text->value);
-    }
-    NSTextView *textview = (NSTextView*)text->obj;
-    NSString *str = [[textview textStorage]string];
-    NSRange range;
-    range.location = begin;
-    range.length = end - begin;
+    NSScrollView *scrollview = [[NSScrollView alloc] init];
+    scrollview.hasVerticalScroller = YES;
+    scrollview.documentView = textview;
     
-    NSString *substr = [str substringWithRange:range];
-    size_t length = [substr lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
-    const char *cstr = [substr UTF8String];
-    char *value = malloc(length + 1);
-    memcpy(value, cstr, length);
-    value[length] = '\0';
-    text->value = value;
-    return value;
-}
-
-void ui_textarea_insert(UiText *text, int pos, char *str) {
-    if(text->value) {
-        free(text->value);
-    }
-    NSTextView *textview = (NSTextView*)text->obj;
-    NSString *s = [[NSString alloc]initWithUTF8String:str];
-    NSAttributedString *as = [[NSAttributedString alloc]initWithString:s];
-    [[textview textStorage] insertAttributedString:as atIndex: pos];
-    text->value = NULL;
+    UiLayout layout = UI_INIT_LAYOUT(args);
+    ui_container_add(obj, scrollview, &layout, TRUE);
+    
+    return (__bridge void*)scrollview;
 }
-
-int ui_textarea_position(UiText *text) {
-    return [[[(NSTextView*)text->obj selectedRanges] objectAtIndex:0] rangeValue].location;
-}
-
-void ui_textarea_selection(UiText *text, int *begin, int *end) {
-    NSRange range = [[[(NSTextView*)text->obj selectedRanges] objectAtIndex:0] rangeValue];
-    *begin = range.location;
-    *end = range.location + range.length;
-}
-
-int ui_textarea_length(UiText *text) {
-    return [[(NSTextView*)text->obj textStorage] length];
-}
-
-void ui_text_undo(UiText *text) {
-    [(NSUndoManager*)text->undomgr undo];
-}
-
-void ui_text_redo(UiText *text) {
-    [(NSUndoManager*)text->undomgr redo];
-}
-

mercurial