added some text functions for the Cocoa implementation

Sat, 29 Mar 2014 19:12:07 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 29 Mar 2014 19:12:07 +0100
changeset 13
2dbc56c2323b
parent 12
fe94e0fb9ef3
child 14
e2fd132ab781

added some text functions for the Cocoa implementation

ui/cocoa/container.m file | annotate | diff | comparison | revisions
ui/cocoa/menu.m file | annotate | diff | comparison | revisions
ui/cocoa/text.h file | annotate | diff | comparison | revisions
ui/cocoa/text.m file | annotate | diff | comparison | revisions
--- a/ui/cocoa/container.m	Sat Mar 29 12:15:39 2014 +0100
+++ b/ui/cocoa/container.m	Sat Mar 29 19:12:07 2014 +0100
@@ -48,5 +48,5 @@
 }
 
 NSRect ui_window_container_getframe(UiContainer *ct) {
-    [ct->widget frame];
+    return [ct->widget frame];
 }
--- a/ui/cocoa/menu.m	Sat Mar 29 12:15:39 2014 +0100
+++ b/ui/cocoa/menu.m	Sat Mar 29 19:12:07 2014 +0100
@@ -134,4 +134,5 @@
     UiMenuItem *item = i->obj;
     [item->item setState: value];
     i->value = value;
+    item->state = value;
 }
--- a/ui/cocoa/text.h	Sat Mar 29 12:15:39 2014 +0100
+++ b/ui/cocoa/text.h	Sat Mar 29 19:12:07 2014 +0100
@@ -28,6 +28,31 @@
 
 #import "../ui/text.h"
 #import "toolkit.h"
+#import "../../ucx/list.h"
+
+@interface TextChangeMgr : NSObject<NSTextViewDelegate> {
+    UiText* value;
+}
+
+- (TextChangeMgr*)initWithValue:(UiText*)text;
+
+- (NSUndoManager*)undoManagerForTextView:(NSTextView*)textview;
+
+@end
+
+#define UI_TEXTBUF_INSERT 0
+#define UI_TEXTBUF_DELETE 1
+typedef struct UiTextBufOp {
+    int  type; // UI_TEXTBUF_INSERT, UI_TEXTBUF_DELETE
+    int  start;
+    int  end;
+    int  len;
+    char *text;
+} UiTextBufOp;
+
+
 
 char* ui_textarea_get(UiText *text);
 void ui_textarea_set(UiText *text, char *str);
+char* ui_textarea_getsubstr(UiText *text, int begin, int end);
+void ui_textarea_insert(UiText *text, int pos, char *str);
--- 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