diff --git a/darwin/entry.m b/darwin/entry.m deleted file mode 100644 index b8940be9..00000000 --- a/darwin/entry.m +++ /dev/null @@ -1,134 +0,0 @@ -// 9 april 2015 -#import "uipriv_darwin.h" - -@interface entryDelegate : NSObject { - uiEntry *e; - void (*onChanged)(uiEntry *, void *); - void *onChangedData; -} -- (void)controlTextDidChange:(NSNotification *)note; -- (void)setEntry:(uiEntry *)newe; -- (void)setOnChanged:(void (*)(uiEntry *, void *))f data:(void *)data; -@end - -@implementation entryDelegate - -- (void)controlTextDidChange:(NSNotification *)note -{ - (*(self->onChanged))(self->e, self->onChangedData); -} - -- (void)setEntry:(uiEntry *)newe -{ - self->e = newe; -} - -- (void)setOnChanged:(void (*)(uiEntry *, void *))f data:(void *)data -{ - self->onChanged = f; - self->onChangedData = data; -} - -@end - -struct entry { - uiEntry e; - NSTextField *textfield; - entryDelegate *delegate; -}; - -static void defaultOnChanged(uiEntry *e, void *data) -{ - // do nothing -} - -static void destroy(void *data) -{ - struct entry *e = (struct entry *) data; - - [e->textfield setDelegate:nil]; - [e->delegate release]; - uiFree(e); -} - -static char *entryText(uiEntry *ee) -{ - struct entry *e = (struct entry *) ee; - - return uiDarwinNSStringToText([e->textfield stringValue]); -} - -static void entrySetText(uiEntry *ee, const char *text) -{ - struct entry *e = (struct entry *) ee; - - [e->textfield setStringValue:toNSString(text)]; -} - -static void entryOnChanged(uiEntry *ee, void (*f)(uiEntry *, void *), void *data) -{ - struct entry *e = (struct entry *) ee; - - [e->delegate setOnChanged:f data:data]; -} - -static int entryReadOnly(uiEntry *ee) -{ - struct entry *e = (struct entry *) ee; - - return [e->textfield isEditable] == NO; -} - -static void entrySetReadOnly(uiEntry *ee, int readonly) -{ - struct entry *e = (struct entry *) ee; - BOOL editable; - - editable = YES; - if (readonly) - editable = NO; - [e->textfield setEditable:editable]; -} - -// these are based on interface builder defaults; my comments in the old code weren't very good so I don't really know what talked about what, sorry :/ -void finishNewTextField(NSTextField *t, BOOL isEntry) -{ - setStandardControlFont(t); - - // THE ORDER OF THESE CALLS IS IMPORTANT; CHANGE IT AND THE BORDERS WILL DISAPPEAR - [t setBordered:NO]; - [t setBezelStyle:NSTextFieldSquareBezel]; - [t setBezeled:isEntry]; - - // we don't need to worry about substitutions/autocorrect here; see window_darwin.m for details - - [[t cell] setLineBreakMode:NSLineBreakByClipping]; - [[t cell] setScrollable:YES]; -} - -uiEntry *uiNewEntry(void) -{ - struct entry *e; - - e = uiNew(struct entry); - - uiDarwinMakeControl(uiControl(e), [NSTextField class], NO, NO, destroy, e); - - e->textfield = (NSTextField *) uiControlHandle(uiControl(e)); - - [e->textfield setSelectable:YES]; // otherwise the setting is masked by the editable default of YES - finishNewTextField(e->textfield, YES); - - e->delegate = [entryDelegate new]; - [e->textfield setDelegate:e->delegate]; - [e->delegate setEntry:uiEntry(e)]; - [e->delegate setOnChanged:defaultOnChanged data:NULL]; - - uiEntry(e)->Text = entryText; - uiEntry(e)->SetText = entrySetText; - uiEntry(e)->OnChanged = entryOnChanged; - uiEntry(e)->ReadOnly = entryReadOnly; - uiEntry(e)->SetReadOnly = entrySetReadOnly; - - return uiEntry(e); -} diff --git a/redo/darwin/button.m b/redo/darwin/button.m index 3675de10..db3e0ced 100644 --- a/redo/darwin/button.m +++ b/redo/darwin/button.m @@ -1,6 +1,8 @@ // 10 june 2015 #include "uipriv_darwin.h" +// TODO reimplement CommitDestroy() on all of these + @interface buttonDelegate : NSObject { uiButton *b; void (*onClicked)(uiButton *, void *); diff --git a/redo/darwin/entry.m b/redo/darwin/entry.m index 657c2171..9ab6eefe 100644 --- a/redo/darwin/entry.m +++ b/redo/darwin/entry.m @@ -1,11 +1,40 @@ // 11 june 2015 #include "uipriv_darwin.h" -struct entry { - uiEntry e; - OSTYPE *OSHANDLE; +@interface entryDelegate : NSObject { + uiEntry *e; void (*onChanged)(uiEntry *, void *); void *onChangedData; +} +- (void)controlTextDidChange:(NSNotification *)note; +- (void)setEntry:(uiEntry *)newe; +- (void)setOnChanged:(void (*)(uiEntry *, void *))f data:(void *)data; +@end + +@implementation entryDelegate + +- (void)controlTextDidChange:(NSNotification *)note +{ + (*(self->onChanged))(self->e, self->onChangedData); +} + +- (void)setEntry:(uiEntry *)newe +{ + self->e = newe; +} + +- (void)setOnChanged:(void (*)(uiEntry *, void *))f data:(void *)data +{ + self->onChanged = f; + self->onChangedData = data; +} + +@end + +struct entry { + uiEntry e; + NSTextField *textfield; + entryDelegate *delegate; }; uiDefineControlType(uiEntry, uiTypeEntry, struct entry) @@ -14,7 +43,7 @@ static uintptr_t entryHandle(uiControl *c) { struct entry *e = (struct entry *) c; - return (uintptr_t) (e->OSHANDLE); + return (uintptr_t) (e->textfield); } static void defaultOnChanged(uiEntry *e, void *data) @@ -26,14 +55,14 @@ static char *entryText(uiEntry *ee) { struct entry *e = (struct entry *) ee; - return PUT_CODE_HERE; + return uiDarwinNSStringToText([e->textfield stringValue]); } static void entrySetText(uiEntry *ee, const char *text) { struct entry *e = (struct entry *) ee; - PUT_CODE_HERE; + [e->textfield setStringValue:toNSString(text)]; // don't queue the control for resize; entry sizes are independent of their contents } @@ -41,31 +70,58 @@ static void entryOnChanged(uiEntry *ee, void (*f)(uiEntry *, void *), void *data { struct entry *e = (struct entry *) ee; - e->onChanged = f; - e->onChangedData = data; + [e->delegate setOnChanged:f data:data]; } static int entryReadOnly(uiEntry *ee) { struct entry *e = (struct entry *) ee; - return PUT_CODE_HERE; + return [e->textfield isEditable] == NO; } static void entrySetReadOnly(uiEntry *ee, int readonly) { struct entry *e = (struct entry *) ee; + BOOL editable; - PUT_CODE_HERE; + editable = YES; + if (readonly) + editable = NO; + [e->textfield setEditable:editable]; +} + +// these are based on interface builder defaults; my comments in the old code weren't very good so I don't really know what talked about what, sorry :/ +void finishNewTextField(uiControl *tt, NSTextField *t, BOOL isEntry) +{ + uiDarwinMakeSingleViewControl(tt, t, YES); + + // THE ORDER OF THESE CALLS IS IMPORTANT; CHANGE IT AND THE BORDERS WILL DISAPPEAR + [t setBordered:NO]; + [t setBezelStyle:NSTextFieldSquareBezel]; + [t setBezeled:isEntry]; + + // we don't need to worry about substitutions/autocorrect here; see window_darwin.m for details + + [[t cell] setLineBreakMode:NSLineBreakByClipping]; + [[t cell] setScrollable:YES]; } uiEntry *uiNewEntry(void) { struct entry *e; - e = (struct entry *) MAKE_CONTROL_INSTANCE(uiTypeEntry()); + e = (struct entry *) uiNewControl(uiTypeEntry()); - PUT_CODE_HERE; + e->textfield = [[NSTextField alloc] initWithFrame:NSZeroRect]; + + [e->textfield setSelectable:YES]; // otherwise the setting is masked by the editable default of YES + finishNewTextField(uiControl(e), e->textfield, YES); + + e->delegate = [entryDelegate new]; + [e->textfield setDelegate:e->delegate]; + [e->delegate setEntry:uiEntry(e)]; + [e->delegate setOnChanged:defaultOnChanged data:NULL]; e->onChanged = defaultOnChanged;