#import "../ui/toolkit.h"
#import "../common/context.h"
-typedef void(*get_eventdata_func)(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value);
+typedef void(*get_eventdata_func)(id sender, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value);
@interface EventData : NSObject
@property UiObject *obj;
#import "toolkit.h"
#import "../ui/window.h"
-@interface MainWindow : NSWindow<UiToplevelObject>
+@interface MainWindow : NSWindow<UiToplevelObject, NSWindowDelegate>
@property UiObject *obj;
@property (strong) NSSplitView *splitview;
@property (strong) NSView *rightPanel;
@property int topOffset;
-- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview;
+- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview width:(int)width height:(int)height;
+- (void) saveWindowSize;
@end
*/
#import "MainWindow.h"
+#import "WindowManager.h"
#import "container.h"
#import "GridLayout.h"
#import "BoxContainer.h"
#import "menu.h"
#import "Toolbar.h"
+
+
@implementation MainWindow
-- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview{
- NSRect frame = NSMakeRect(300, 200, 600, 500);
+- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview width:(int)width height:(int)height {
+ NSRect frame = NSMakeRect(300, 200, width, height);
self = [self initWithContentRect:frame
styleMask:NSWindowStyleMaskTitled |
backing:NSBackingStoreBuffered
defer:false];
_obj = obj;
-
+ self.delegate = self;
int top = 4;
NSView *content = self.contentView;
[self setToolbar:toolbar];
}
-
return self;
}
+- (void) saveWindowSize {
+ CGSize size = self.frame.size;
+ if(size.width > 0 && size.height > 0) {
+ char width_str[32];
+ char height_str[32];
+ snprintf(width_str, 32, "%d", (int)size.width);
+ snprintf(height_str, 32, "%d", (int)size.height);
+ ui_set_property("ui.window.width", width_str);
+ ui_set_property("ui.window.height", height_str);
+ }
+}
+
- (BOOL) getIsVisible {
return [self isVisible];
}
}
}
+- (void) windowWillClose:(NSNotification *) notification {
+ UiObject *obj = _obj;
+
+ if(obj->onclose) {
+ UiEvent event;
+ memset(&event, 0, sizeof(UiEvent));
+ event.obj = obj;
+ event.window = obj->window;
+ event.document = obj->ctx->document;
+ obj->onclose(&event, obj->onclosedata);
+ }
+
+ if(obj->ref > 0) {
+ obj->ref--;
+ } else {
+ // warn about invalid reference counting
+ NSLog(@"Error: UiObject %p ref == 0\n", obj);
+ }
+
+ if(obj->ref == 0) {
+ [self saveWindowSize];
+ // this cleans up any widget references from the context
+ uic_context_prepare_close(obj->ctx);
+ [[WindowManager sharedWindowManager] closeWindow:self];
+ }
+}
+- (void) dealloc {
+ uic_object_destroy(_obj);
+ NSLog(@"MainWindow dealloc");
+}
@end
NSMutableArray<NSString*> *defaultItems;
}
-@property MainWindow *window;
+@property (weak) MainWindow *window;
@property UiObject *obj;
- (UiToolbar*) initWithWindow:(MainWindow*)window;
#import "toolkit.h"
-@interface WindowManager : NSObject<NSWindowDelegate>
+@interface WindowManager : NSObject
-@property NSMutableArray<NSWindow*> *windows;
+@property NSMutableArray<NSWindowController*> *windows;
+ (WindowManager*) sharedWindowManager;
- (WindowManager*)init;
-- (void)addWindow:(NSWindow*)win;
+- (void)addWindow:(NSWindowController*)win;
+
+- (void)closeWindow:(NSWindow*)win;
+
+- (void)shutdown;
@end
*/
#import "WindowManager.h"
+#import "MainWindow.h"
@implementation WindowManager
return self;
}
-- (void)addWindow:(NSWindow*)win {
+- (void)addWindow:(NSWindowController*)win {
[_windows addObject:win];
- [win setDelegate:self];
}
-- (void) windowWillClose:(NSNotification *) notification {
- NSWindow *window = notification.object;
- [_windows removeObject:window];
+- (void)closeWindow:(NSWindow*)win {
+ [_windows removeObject:win.windowController];
+}
+
+- (void)shutdown {
+ if(_windows.count > 0) {
+ NSWindowController *controller = _windows.firstObject;
+ MainWindow *win = (MainWindow*)controller.window;
+ [win saveWindowSize];
+ }
+ [_windows removeAllObjects];
}
@end
*/
#import "AppDelegate.h"
+#import "WindowManager.h"
#import "toolkit.h"
#import "menu.h"
+#import "../common/app.h"
+
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
ui_menu_init();
NSLog(@"toolkit applicationDidFinishLaunching");
- ui_cocoa_onstartup();
+ uic_application_startup(NULL);
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
NSLog(@"toolkit applicationWillTerminate");
- ui_cocoa_onexit();
+ uic_application_exit(NULL);
+ [[WindowManager sharedWindowManager] shutdown];
+ ui_app_save_settings();
}
}
-static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
NSButton *btn = (NSButton*)button;
NSControlStateValue state = btn.state;
*value = (int)state;
return togglebutton_create(obj, args, NSButtonTypeSwitch);
}
-static void switch_eventdata(id button, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void switch_eventdata(id button, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
NSSwitch *btn = (NSSwitch*)button;
NSControlStateValue state = btn.state;
*value = (int)state;
@end
-static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
if(var) {
UiInteger *i = var->value;
NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj;
}
if(args->onchange || args->ontextchanged || args->onchange_action || args->ontextchanged_action) {
-
+ TextAreaDelegate * tad = [[TextAreaDelegate alloc] init:obj var:var args:args];
+ textview.delegate = tad;
+ objc_setAssociatedObject(textview, "delegate", tad, OBJC_ASSOCIATION_RETAIN);
}
return (__bridge void*)scrollview;
/* -------------------------- TextField -------------------------- */
-static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
}
@end
-void ui_cocoa_onstartup(void);
-void ui_cocoa_onopen(const char *file);
-void ui_cocoa_onexit(void);
exit_on_shutdown = exitapp;
}
-void ui_cocoa_onstartup(void) {
- UiEvent e;
- e.obj = NULL;
- e.window = NULL;
- e.document = NULL;
- e.eventdata = NULL;
- e.intval = 0;
- uic_application_startup(&e);
-}
-
-void ui_cocoa_onopen(const char *file) {
- UiEvent e;
- e.obj = NULL;
- e.window = NULL;
- e.document = NULL;
- e.eventdata = NULL;
- e.intval = 0;
- uic_application_open(&e);
-}
-
-void ui_cocoa_onexit(void) {
- UiEvent e;
- e.obj = NULL;
- e.window = NULL;
- e.document = NULL;
- e.eventdata = NULL;
- e.intval = 0;
- uic_application_exit(&e);
-}
-
void ui_main(void) {
main_thr_check("ui_main");
- NSApplicationMain(app_argc, app_argv);
+ NSApplicationMain(app_argc,app_argv);
//[NSApp finishLaunching];
//[NSApp activateIgnoringOtherApps:YES];
//[NSApp run];
data->webview = (__bridge void*)webview;
data->javascript = TRUE;
data->zoom = 1;
- value->value = value;
+ value->value = data;
}
}
#include "../common/menu.h"
#include "../common/toolbar.h"
#include "../common/object.h"
+#include "../common/utils.h"
#include <cx/mempool.h>
static int splitview_window_default_pos = -1;
static UiBool splitview_window_use_prop = TRUE;
+static void main_window_destroy(UiObject *obj) {
+ MainWindow *window = (__bridge MainWindow*)obj->wobj;
+ [window saveWindowSize];
+ [[WindowManager sharedWindowManager] closeWindow:window];
+}
+
static UiObject* create_window(const char *title, BOOL simple, BOOL sidebar, BOOL splitview) {
UiObject *obj = uic_object_new_toplevel();
- MainWindow *window = [[MainWindow alloc] init:obj withSidebar:sidebar withSplitview:splitview];
- [[WindowManager sharedWindowManager] addWindow:window];
- window.releasedWhenClosed = false; // TODO: we still need a cleanup strategy
+ int width = window_default_width;
+ int height = window_default_height;
+ if(!simple) {
+ ui_get_window_default_width(&width, &height);
+ }
+
+ MainWindow *window = [[MainWindow alloc] init:obj withSidebar:sidebar withSplitview:splitview width:width height:height];
obj->wobj = (__bridge void*)window;
+ obj->destroy = main_window_destroy;
MainWindowController *controller = [[MainWindowController alloc] initWithWindow:obj window:window];
window.windowController = controller;
[window setNextResponder:(NSResponder*)controller];
- objc_setAssociatedObject(window, "windowcontroller", controller, OBJC_ASSOCIATION_RETAIN);
+ [[WindowManager sharedWindowManager] addWindow:controller];
return obj;
}
NSWindowStyleMaskUtilityWindow)
backing:NSBackingStoreBuffered
defer:NO];
+ NSWindowController *controller = [[NSWindowController alloc] initWithWindow:panel];
+ panel.windowController = controller;
panel.parent = (__bridge NSWindow*)parent->wobj;
panel.obj = obj;
panel.modal = args->modal;
panel.onclick = args->onclick;
panel.onclickdata = args->onclickdata;
[panel center];
- [[WindowManager sharedWindowManager] addWindow:panel];
+ [[WindowManager sharedWindowManager] addWindow:controller];
obj->wobj = (__bridge void*)panel;
NSView *content = panel.contentView;
void uic_generic_save(UiGeneric *g) {
if(!g->obj) return;
+ // TODO: this leaks memory
+ // we can't just use get on Generic and ignore the result
+ // probably a separate save method is required
g->get(g);
}
r->obj = NULL;
}
-void uic_list_unbind(UiList *l) {
+void uic_list_unbind(UiList *l) {
l->update = NULL;
l->getselection = NULL;
l->setselection = NULL;