changeset 653:36c6669422d2

Continuing to add types... looking to almost be usable. :)
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 23 Feb 2011 15:40:46 +0000
parents ef0f484c6c4b
children 80e253df49fd
files mac/dw.m
diffstat 1 files changed, 235 insertions(+), 90 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Wed Feb 23 11:41:47 2011 +0000
+++ b/mac/dw.m	Wed Feb 23 15:40:46 2011 +0000
@@ -54,56 +54,66 @@
 	
 	if(handler)
 	{
-		if(message == 3 || message == 4)
+		switch(message)
 		{
-			int (* API buttonfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction;
-			int flags = [object pressedMouseButtons];
-			NSPoint point = [object mouseLocation];
-			int button = 0;
-			char *which = "pressed";
-			
-			if(message == 4)
-			{
-				which = "released";
-			}
-			
-			if(flags & 1)
-			{
-				button = 1;
-			}
-			else if(flags & (1 << 1))
-			{
-				button = 2;
-			}
-			else if(flags & (1 << 2))
+			case 3:
+			case 4:
 			{
-				button = 3;
-			}
+				int (* API buttonfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction;
+				int flags = [object pressedMouseButtons];
+				NSPoint point = [object mouseLocation];
+				int button = 0;
+				char *which = "pressed";
+			
+				if(message == 4)
+				{
+					which = "released";
+				}
 			
-			NSLog(@"Button %s x:%d y:%d button:%d\n", which, (int)point.x, (int)point.y, (int)button);
-			return buttonfunc(object, point.x, point.y, button, handler->data);
-		}
-		else if(message == 7)
-		{
-			DWExpose exp;
-			int (* API exposefunc)(HWND, DWExpose *, void *) = (int (* API)(HWND, DWExpose *, void *))handler->signalfunction;
-			NSRect rect = [object frame];
+				if(flags & 1)
+				{
+					button = 1;
+				}
+				else if(flags & (1 << 1))
+				{
+					button = 2;
+				}
+				else if(flags & (1 << 2))
+				{
+					button = 3;
+				}
 			
-			exp.x = rect.origin.x;
-			exp.y = rect.origin.y;
-			exp.width = rect.size.width;
-			exp.height = rect.size.height;
-			return exposefunc(object, &exp, handler->data);
-		}
-		else if(message == 8)
-		{
-			int (* API clickfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction;
-
-			NSLog(@"Clicked\n");
-			return clickfunc(object, handler->data);
+				NSLog(@"Button %s x:%d y:%d button:%d\n", which, (int)point.x, (int)point.y, (int)button);
+				return buttonfunc(object, point.x, point.y, button, handler->data);
+			}
+			case 6:
+			{
+				int (* API closefunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction;
+				NSLog(@"Close\n");
+				return closefunc(object, handler->data);
+			}
+			case 7:
+			{
+				DWExpose exp;
+				int (* API exposefunc)(HWND, DWExpose *, void *) = (int (* API)(HWND, DWExpose *, void *))handler->signalfunction;
+				NSRect rect = [object frame];
+			
+				exp.x = rect.origin.x;
+				exp.y = rect.origin.y;
+				exp.width = rect.size.width;
+				exp.height = rect.size.height;
+				return exposefunc(object, &exp, handler->data);
+			}
+			case 8:
+			{
+				int (* API clickfunc)(HWND, void *) = (int (* API)(HWND, void *))handler->signalfunction;
+
+				NSLog(@"Clicked\n");
+				return clickfunc(object, handler->data);
+			}
 		}
 	}
-	return 0;
+	return -1;
 }
 
 /* So basically to implement our event handlers...
@@ -151,12 +161,15 @@
 
 /* Subclass for a top-level window */
 @interface DWView : DWBox  { }
+-(BOOL)windowShouldClose:(id)sender;
 @end
 
 @implementation DWView
--(void)windowWillClose:(NSNotification *)note 
-{
-    [[NSApplication sharedApplication] terminate:self];
+-(BOOL)windowShouldClose:(id)sender 
+{
+    if(_event_handler(self, nil, 6) == FALSE)
+		return NO;
+	return YES;
 }
 - (void)viewDidMoveToWindow
 {
@@ -324,6 +337,74 @@
 }
 @end
 
+/* Subclass for a slider type */
+@interface DWSlider : NSSlider
+{
+	void *userdata; 
+}
+-(void *)userdata;
+-(void)setUserdata:(void *)input;
+@end
+
+@implementation DWSlider
+-(void *)userdata { return userdata; }
+-(void)setUserdata:(void *)input { userdata = input; }
+@end
+
+/* Subclass for a slider type */
+@interface DWScrollbar : NSScroller
+{
+	void *userdata;
+	float range;
+	float visible;
+}
+-(void *)userdata;
+-(void)setUserdata:(void *)input;
+-(float)range;
+-(float)visible;
+-(void)setRange:(float)input1 andVisible:(float)input2;
+@end
+
+@implementation DWScrollbar
+-(void *)userdata { return userdata; }
+-(void)setUserdata:(void *)input { userdata = input; }
+-(float)range { return range; }
+-(float)visible { return visible; }
+-(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; }
+@end
+
+/* Subclass for a render area type */
+@interface DWRender : NSView 
+{
+	void *userdata;
+}
+-(void *)userdata;
+-(void)setUserdata:(void *)input;
+-(void)drawRect:(NSRect)rect;
+-(BOOL)isFlipped;
+@end
+
+@implementation DWRender
+-(void *)userdata { return userdata; }
+-(void)setUserdata:(void *)input { userdata = input; }
+-(void)drawRect:(NSRect)rect { _event_handler(self, nil, 7); }
+-(BOOL)isFlipped { return YES; }
+@end
+
+/* Subclass for a MLE type */
+@interface DWMLE : NSTextView 
+{
+	void *userdata;
+}
+-(void *)userdata;
+-(void)setUserdata:(void *)input;
+@end
+
+@implementation DWMLE
+-(void *)userdata { return userdata; }
+-(void)setUserdata:(void *)input { userdata = input; }
+@end
+
 NSApplication *DWApp;
 NSRunLoop *DWRunLoop;
 #if !defined(GARBAGE_COLLECT)
@@ -1444,7 +1525,10 @@
 HWND API dw_button_new(char *text, ULONG id)
 {
 	DWButton *button = [[DWButton alloc] init];
-	[button setTitle:[ NSString stringWithUTF8String:text ]];
+	if(text && *text)
+	{
+		[button setTitle:[ NSString stringWithUTF8String:text ]];
+	}
 	[button setButtonType:NSMomentaryPushInButton];
 	[button setBezelStyle:NSThickerSquareBezelStyle];
 	[button setTarget:button];
@@ -1516,8 +1600,10 @@
  */
 HWND API dw_bitmapbutton_new_from_file(char *text, unsigned long id, char *filename)
 {
-	NSLog(@"dw_bitmapbutton_new_from_file() unimplemented\n");
-	return HWND_DESKTOP;
+	NSImage *image = [[NSImage alloc] initWithContentsOfFile:[ NSString stringWithUTF8String:filename ]];
+	DWButton *button = dw_button_new("", id);
+	[button setImage:image];
+	return button;
 }
 
 /*
@@ -1531,8 +1617,11 @@
  */
 HWND API dw_bitmapbutton_new_from_data(char *text, unsigned long id, char *data, int len)
 {
-	NSLog(@"dw_bitmapbutton_new_from_data() unimplemented\n");
-	return HWND_DESKTOP;
+	NSData *thisdata = [[NSData alloc] dataWithBytes:data length:len];
+	NSImage *image = [[NSImage alloc] initWithData:thisdata];
+	DWButton *button = dw_button_new("", id);
+	[button setImage:image];
+	return button;
 }
 
 /*
@@ -1603,8 +1692,10 @@
  */
 HWND API dw_slider_new(int vertical, int increments, ULONG id)
 {
-	NSLog(@"dw_slider_new() unimplemented\n");
-	return HWND_DESKTOP;
+	DWSlider *slider = [[DWSlider alloc] init];
+	[slider setMaxValue:(double)increments];
+	[slider setMinValue:0];
+	return slider;
 }
 
 /*
@@ -1614,8 +1705,9 @@
  */
 unsigned int API dw_slider_get_pos(HWND handle)
 {
-	NSLog(@"dw_slider_get_pos() unimplemented\n");
-	return 0;
+	DWSlider *slider = handle;
+	double val = [slider doubleValue];
+	return (int)val;
 }
 
 /*
@@ -1626,7 +1718,8 @@
  */
 void API dw_slider_set_pos(HWND handle, unsigned int position)
 {
-	NSLog(@"dw_slider_set_pos() unimplemented\n");
+	DWSlider *slider = handle;
+	[slider setDoubleValue:(double)position];
 }
 
 /*
@@ -1638,8 +1731,8 @@
  */
 HWND API dw_scrollbar_new(int vertical, ULONG id)
 {
-	NSLog(@"dw_scrollbar_new() unimplemented\n");
-	return HWND_DESKTOP;
+	DWScrollbar *scrollbar = [[DWScrollbar alloc] init];
+	return scrollbar;
 }
 
 /*
@@ -1649,8 +1742,10 @@
  */
 unsigned int API dw_scrollbar_get_pos(HWND handle)
 {
-	NSLog(@"dw_scrollbar_get_pos() unimplemented\n");
-	return 0;
+	DWScrollbar *scrollbar = handle;
+	float range = [scrollbar range];
+	float fresult = [scrollbar doubleValue] * range;
+	return (int)fresult;
 }
 
 /*
@@ -1661,7 +1756,10 @@
  */
 void API dw_scrollbar_set_pos(HWND handle, unsigned int position)
 {
-	NSLog(@"dw_scrollbar_set_pos() unimplemented\n");
+	DWScrollbar *scrollbar = handle;
+	double range = (double)[scrollbar range];
+	double newpos = (double)position/range;
+	[scrollbar setDoubleValue:newpos];
 }
 
 /*
@@ -1673,7 +1771,10 @@
  */
 void API dw_scrollbar_set_range(HWND handle, unsigned int range, unsigned int visible)
 {
-	NSLog(@"dw_scrollbar_set_range() unimplemented\n");
+	DWScrollbar *scrollbar = handle;
+	float knob = (float)visible/(float)range;
+	[scrollbar setRange:(float)range andVisible:(float)visible];
+	[scrollbar setKnobProportion:knob];
 }
 
 /*
@@ -1908,8 +2009,8 @@
  */
 HWND API dw_mle_new(ULONG id)
 {
-	NSLog(@"dw_mle_new() unimplemented\n");
-	return HWND_DESKTOP;
+	DWMLE *mle = [[DWMLE alloc] init];
+	return mle;
 }	
 
 /*
@@ -1921,8 +2022,9 @@
  */
 unsigned int API dw_mle_import(HWND handle, char *buffer, int startpoint)
 {
-	NSLog(@"dw_mle_import() unimplemented\n");
-	return 0;
+	DWMLE *mle = handle;
+	[mle insertText:[ NSString stringWithUTF8String:buffer ]];
+	return strlen(buffer) + startpoint;
 }
 
 /*
@@ -1991,7 +2093,15 @@
  */
 void API dw_mle_set_editable(HWND handle, int state)
 {
-	NSLog(@"dw_mle_set_editable() unimplemented\n");
+	DWMLE *mle = handle;
+	if(state)
+	{
+		[mle setEditable:YES];
+	}
+	else 
+	{
+		[mle setEditable:NO];
+	}
 }
 
 /*
@@ -2058,8 +2168,11 @@
  */
 HWND API dw_status_text_new(char *text, ULONG id)
 {
-	NSLog(@"dw_status_text_new() unimplemented\n");
-	return HWND_DESKTOP;
+	NSTextField *textfield = dw_text_new(text, id);
+	[textfield setBordered:YES];
+	[textfield setBezeled:YES];
+	[textfield setBezelStyle:NSRecessedBezelStyle];
+	return textfield;
 }
 
 /*
@@ -2070,8 +2183,13 @@
  */
 HWND API dw_text_new(char *text, ULONG id)
 {
-	NSLog(@"dw_text_new() unimplemented\n");
-	return HWND_DESKTOP;
+	NSTextField *textfield = [[NSTextField alloc] init];
+	[textfield setEditable:NO];
+	[textfield setSelectable:NO];
+	[textfield setBordered:NO];
+	[textfield setDrawsBackground:NO];
+	[textfield setStringValue:[ NSString stringWithUTF8String:text ]];
+	return textfield;
 }
 
 /*
@@ -2083,8 +2201,8 @@
  */
 HWND API dw_render_new(unsigned long id)
 {
-	NSLog(@"dw_render_new() unimplemented\n");
-	return HWND_DESKTOP;
+	DWRender *render = [[DWRender alloc] init];
+	return render;
 }
 
 /* Sets the current foreground drawing color.
@@ -2140,7 +2258,9 @@
  */
 void API dw_draw_point(HWND handle, HPIXMAP pixmap, int x, int y)
 {
-	NSLog(@"dw_draw_point() unimplemented\n");
+	NSRect rect = NSMakeRect(x, y, x, y);
+	[[NSColor colorWithDeviceRed: DW_RED_VALUE(_foreground)/255.0 green: DW_GREEN_VALUE(_foreground)/255.0 blue: DW_BLUE_VALUE(_foreground)/255.0 alpha: 1] set];
+	NSRectFill(rect);
 }
 
 /* Draw a line on a window (preferably a render window).
@@ -2210,7 +2330,9 @@
  */
 void API dw_draw_rect(HWND handle, HPIXMAP pixmap, int fill, int x, int y, int width, int height)
 {
-	NSLog(@"dw_draw_rect() unimplemented\n");
+	NSRect rect = NSMakeRect(x, y, x + width, y + height);
+	[[NSColor colorWithDeviceRed: DW_RED_VALUE(_foreground)/255.0 green: DW_GREEN_VALUE(_foreground)/255.0 blue: DW_BLUE_VALUE(_foreground)/255.0 alpha: 1] set];
+	NSRectFill(rect);
 }
 
 /*
@@ -2796,8 +2918,10 @@
  */
 HWND API dw_bitmap_new(ULONG id)
 {
-	NSLog(@"dw_bitmap_new() unimplemented\n");
-	return HWND_DESKTOP;
+	NSImageView *bitmap = [[NSImageView alloc] init];
+	[bitmap setImageFrameStyle:NSImageFrameNone];
+	[bitmap setEditable:NO];
+	return bitmap;
 }
 
 /*
@@ -2812,8 +2936,9 @@
  */
 HPIXMAP API dw_pixmap_new(HWND handle, unsigned long width, unsigned long height, int depth)
 {
-	NSLog(@"dw_pixmap_new() unimplemented\n");
-	return HWND_DESKTOP;
+	NSSize size = { (float)width, (float)height };
+	NSImage *pixmap = [[NSImage alloc] initWithSize:size];
+	return (HPIXMAP)pixmap;
 }
 
 /*
@@ -2828,8 +2953,8 @@
  */
 HPIXMAP API dw_pixmap_new_from_file(HWND handle, char *filename)
 {
-	NSLog(@"dw_pixmap_new_from_file() unimplemented\n");
-	return HWND_DESKTOP;
+	NSImage *pixmap = [[NSImage alloc] initWithContentsOfFile:[ NSString stringWithUTF8String:filename ]];
+	return (HPIXMAP)pixmap;
 }
 
 /*
@@ -2844,8 +2969,9 @@
  */
 HPIXMAP API dw_pixmap_new_from_data(HWND handle, char *data, int len)
 {
-	NSLog(@"dw_pixmap_new_from_data() unimplemented\n");
-	return HWND_DESKTOP;
+	NSData *thisdata = [[NSData alloc] dataWithBytes:data length:len];
+	NSImage *pixmap = [[NSImage alloc] initWithData:thisdata];
+	return (HPIXMAP)pixmap;
 }
 
 /*
@@ -2878,7 +3004,8 @@
  */
 void API dw_pixmap_destroy(HPIXMAP pixmap)
 {
-	NSLog(@"dw_pixmap_destroy() unimplemented\n");
+	NSImage *image = (NSImage *)pixmap;
+	[image dealloc];
 }
 
 /*
@@ -3326,7 +3453,7 @@
 	NSRect frame = NSMakeRect(1,1,1,1);
     NSWindow *window = [[NSWindow alloc]
 						initWithContentRect:frame
-						styleMask:flStyle
+						styleMask:(flStyle | NSTexturedBackgroundWindowMask)
 						backing:NSBackingStoreBuffered
 						defer:false];
 
@@ -3411,8 +3538,14 @@
  */
 int API dw_window_set_color(HWND handle, ULONG fore, ULONG back)
 {
-	NSLog(@"dw_window_set_color() unimplemented\n");
-	return -1;
+	id object = handle;
+	
+	if([object isMemberOfClass:[NSTextFieldCell class]])
+	{
+		NSTextFieldCell *text = object;
+		[text setTextColor:[NSColor colorWithDeviceRed: DW_RED_VALUE(_foreground)/255.0 green: DW_GREEN_VALUE(_foreground)/255.0 blue: DW_BLUE_VALUE(_foreground)/255.0 alpha: 1]];
+	}
+	return 0;
 }
 
 /*
@@ -3423,7 +3556,6 @@
  */
 int API dw_window_set_border(HWND handle, int border)
 {
-	NSLog(@"dw_window_set_border() unimplemented\n");
 	return 0;
 }
 
@@ -3436,7 +3568,20 @@
  */
 void API dw_window_set_style(HWND handle, ULONG style, ULONG mask)
 {
-	NSLog(@"dw_window_set_style() unimplemented\n");
+	id object = handle;
+	
+	if([object isMemberOfClass:[NSWindow class]])
+	{
+		NSWindow *window = object;
+		int currentstyle = [window styleMask];
+		int tmp;
+		
+		tmp = currentstyle | mask;
+		tmp ^= mask;
+		tmp |= style;
+		
+		[window setStyleMask:tmp];
+	}
 }
 
 /*