ui/cocoa/text.m

changeset 13
2dbc56c2323b
parent 7
431dde3c5fbe
child 23
decc6bf584aa
--- a/ui/cocoa/text.m	Sat Mar 29 12:15:39 2014 +0100
+++ b/ui/cocoa/text.m	Sat Mar 29 19:12:07 2014 +0100
@@ -33,6 +33,20 @@
 #import "text.h"
 #import "container.h"
 
+@implementation TextChangeMgr
+
+- (TextChangeMgr*)initWithValue:(UiText*)text {
+    value = text;
+    return self;
+}
+
+- (NSUndoManager*)undoManagerForTextView:(NSTextView*)textview {
+    return (NSUndoManager*)value->undomgr;
+}
+
+@end
+
+
 UIWIDGET ui_textarea(UiObject *obj, UiText *value) {
     UiContainer *ct = uic_get_current_container(obj);
     
@@ -46,6 +60,7 @@
     
     //frame.size.width = frame.size.width - 15;
     NSTextView *textview = [[NSTextView alloc]initWithFrame:frame];
+    [textview setAllowsUndo:TRUE];
     [textview setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
     
     [scrollview setDocumentView:textview];
@@ -56,23 +71,86 @@
     if(value) {
         value->get = ui_textarea_get;
         value->set = ui_textarea_set;
+        value->getsubstr = ui_textarea_getsubstr;
+        value->insert = ui_textarea_insert;
         value->value = NULL;
         value->obj = textview;
         
+        TextChangeMgr *delegate = [[TextChangeMgr alloc]initWithValue:value];
+        [textview setDelegate:delegate];
+        
+        NSUndoManager *undomgr = [[NSUndoManager alloc]init];
+        value->undomgr = undomgr;
     }
     
     return textview;
 }
 
 char* ui_textarea_get(UiText *text) {
+    if(text->value) {
+        free(text->value);
+    }
     NSTextView *textview = (NSTextView*)text->obj;
     NSString *str = [[textview textStorage]string];
-    return (char*)[str UTF8String];
+    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;
+    
+    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);
+    }
+    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;
+}
+
+void ui_text_undo(UiText *text) {
+    [(NSUndoManager*)text->undomgr undo];
+}
+
+void ui_text_redo(UiText *text) {
+    [(NSUndoManager*)text->undomgr redo];
+}
+

mercurial