diff --git a/collects/htdch/draw/World-native-methods.ss b/collects/htdch/draw/World-native-methods.ss index 77b111eeeb..e177ef122a 100644 --- a/collects/htdch/draw/World-native-methods.ss +++ b/collects/htdch/draw/World-native-methods.ss @@ -2,7 +2,7 @@ (module World-native-methods mzscheme (require (lib "support.scm" "htdch" "draw") (lib "unitsig.ss")) - (provide endOfTime-native endOfWorld-native bigBangO-double-native) + (provide endOfTime-java.lang.String-native endOfWorld-java.lang.String-native bigBangO-double-native) (define void-or-true #t) (define (imperative world@t+1 world@t) world@t+1) diff --git a/collects/htdch/draw/World.java b/collects/htdch/draw/World.java index 4dd7575daf..c62a2093cd 100644 --- a/collects/htdch/draw/World.java +++ b/collects/htdch/draw/World.java @@ -25,8 +25,8 @@ public abstract class World { // -------------------------------------------------------- - public native boolean endOfTime(); - public native World endOfWorld(); + public native boolean endOfTime(String s); + public native World endOfWorld(String s); public abstract World onTick(); public abstract World onKeyEvent(String ke); public abstract boolean draw(); diff --git a/collects/htdch/draw/support.scm b/collects/htdch/draw/support.scm index cd73d8af41..1e3ec7a4bc 100644 --- a/collects/htdch/draw/support.scm +++ b/collects/htdch/draw/support.scm @@ -1,18 +1,19 @@ #cs (module support mzscheme (require (lib "draw.ss" "htdp") - (lib "posn.ss" "lang") - (lib "class.ss") - (lib "unit.ss") (lib "unitsig.ss") - (lib "String.ss" "profj" "libs" "java" "lang") - (lib "Throwable.ss" "profj" "libs""java""lang") - (lib "RuntimeException.ss" "profj" "libs" "java" "lang")) + (lib "posn.ss" "lang") + (lib "class.ss") + (lib "mred.ss" "mred") + (lib "unit.ss") (lib "unitsig.ss") + (lib "String.ss" "profj" "libs" "java" "lang") + (lib "Throwable.ss" "profj" "libs""java""lang") + (lib "RuntimeException.ss" "profj" "libs" "java" "lang")) (provide world-native@ world-native^ canvas-native@ canvas-native^ support^) (define-signature world-native^ - (endOfTime-native - endOfWorld-native + (endOfTime-java.lang.String-native + endOfWorld-java.lang.String-native bigBangO-double-native)) (define-signature canvas-native^ @@ -29,42 +30,49 @@ clearDisk-geometry.Posn-int-colors.Color-native clearRect-geometry.Posn-int-int-colors.Color-native clearLine-geometry.Posn-geometry.Posn-colors.Color-native)) - + (define-signature support^ (void-or-true imperative)) - + + ;Raises an error if string is null + ;check-string: string string string -> boolean + (define (check-string value method argument) + (when (null? value) + (raise-error (format "Method ~a expects a non-null String for ~a argument, given null" method argument))) + #t) + + ;raises a Java exception with the specified error message + ;raise-error: String -> void + (define (raise-error message) + (raise + (create-java-exception RuntimeException message + (lambda (exn str) + (send exn RuntimeException-constructor-java.lang.String str)) + (current-continuation-marks)))) + (define canvas-native@ (unit/sig canvas-native^ (import support^) - ;raises a Java exception with the specified error message - ;raise-error: String -> void - (define (raise-error message) - (raise - (create-java-exception RuntimeException message - (lambda (exn str) - (send exn RuntimeException-constructor-java.lang.String str)) - (current-continuation-marks)))) - (define-syntax (wrap-start-check stx) (syntax-case stx () [(_ body ...) #'(with-handlers - ((exn:fail? - (lambda (e) - (raise-error + ((exn:fail? + (lambda (e) + (raise-error (format - (string-append - "The method show() must be called on the canvas" - "before using any drawing methods [~s]") - (exn-message e)))))) + (string-append + "The method show() must be called on the canvas" + "before using any drawing methods [~s]") + (exn-message e)))))) (begin (begin body ...) void-or-true))])) - + (define Posn-x-get (dynamic-require '(lib "Posn.ss" "htdch" "geometry") 'Posn-x-get)) (define Posn-y-get (dynamic-require '(lib "Posn.ss" "htdch" "geometry") 'Posn-y-get)) - + (define (build-posn posnO) (make-posn (Posn-x-get posnO) (Posn-y-get posnO))) (define (color->symbol colorO) (string->symbol (to-lower-case (send colorO my-name)))) - + ;Raises an error if value less than or equal to 0 ;check-arg: num string string -> boolean (define (check-arg value method argument) @@ -72,22 +80,15 @@ (raise-error (format "Method ~a expects an int >= 0 for ~a argument, given ~a" method argument value)))) - ;Raises an error if string is null - ;check-string: string string string -> boolean - (define (check-string value method argument) - (when (null? value) - (raise-error (format "Method ~a expects a non-null String for ~a argument, given null" method argument))) - #t) - (define (to-lower-case s) (letrec ((lower - (lambda (s) - (cond - ((null? s) s) - (else (cons (char-downcase (car s)) - (lower (cdr s)))))))) + (lambda (s) + (cond + ((null? s) s) + (else (cons (char-downcase (car s)) + (lower (cdr s)))))))) (list->string (lower (string->list s))))) - + (define (xshow-native this accs gets privates) ;; Kathy: it looks like I am working around a bug here. ;; I really wanted to write ([hash-table-get privates 'width] this) @@ -99,14 +100,14 @@ (define y (with-method ([g (this Canvas-height-get)]) (g '___))) (start-and-export x y privates) void-or-true) - + (define (xclose-native this accs gets privates) (wrap-start-check ([hash-table-get privates '%stop])) void-or-true) - + (define (stop-native this accs gets privates) (wrap-start-check ([hash-table-get privates '%end-of-time]))) - + ;; (copy) restores the viewport and the pixmap so that ;; (end-draw-sequence) can copy the pixmap into the viewport. ;; It also clears the pixmap from anything that was on there. @@ -118,59 +119,59 @@ ;; install. I couldn't figure out how to do this at the time. (define (copy-native this accs gets privates) (wrap-start-check ([hash-table-get privates 'copy]))) - + (define (drawCircle-geometry.Posn-int-colors.Color-native this accs gets privates posn r c) (wrap-start-check - (check-arg r "drawCircle(Posn, int, Color)" "second") - ([hash-table-get privates '%draw-circle] (build-posn posn) r (color->symbol c)))) - + (check-arg r "drawCircle(Posn, int, Color)" "second") + ([hash-table-get privates '%draw-circle] (build-posn posn) r (color->symbol c)))) + (define (drawDisk-geometry.Posn-int-colors.Color-native this accs gets privates posn r c) (wrap-start-check - (check-arg r "drawDisk(Posn, int, Color)" "second") - ([hash-table-get privates '%draw-solid-disk] (build-posn posn) r (color->symbol c)))) - + (check-arg r "drawDisk(Posn, int, Color)" "second") + ([hash-table-get privates '%draw-solid-disk] (build-posn posn) r (color->symbol c)))) + (define (drawRect-geometry.Posn-int-int-colors.Color-native this accs gets privates posn w h c) (wrap-start-check - (check-arg w "drawRect(Posn, int, int, Color)" "second") - (check-arg h "drawRect(Posn, int, int, Color)" "third") - ([hash-table-get privates '%draw-solid-rect] (build-posn posn) w h (color->symbol c)))) - + (check-arg w "drawRect(Posn, int, int, Color)" "second") + (check-arg h "drawRect(Posn, int, int, Color)" "third") + ([hash-table-get privates '%draw-solid-rect] (build-posn posn) w h (color->symbol c)))) + (define (drawLine-geometry.Posn-geometry.Posn-colors.Color-native this accs gets privates p0 p1 c) (wrap-start-check - ([hash-table-get privates '%draw-solid-line] (build-posn p0) (build-posn p1) (color->symbol c)))) - + ([hash-table-get privates '%draw-solid-line] (build-posn p0) (build-posn p1) (color->symbol c)))) + (define (drawString-geometry.Posn-java.lang.String-native this accs gets privates p s) (define _ (check-string s "drawString(Posn, String)" "second")) (define s* (send s get-mzscheme-string)) (wrap-start-check - ([hash-table-get privates '%draw-string] (build-posn p) s*))) - + ([hash-table-get privates '%draw-string] (build-posn p) s*))) + (define (clearCircle-geometry.Posn-int-colors.Color-native this accs gets privates p r c) (wrap-start-check - (check-arg r "clearCircle(Posn, int, Color)" "second") - ([hash-table-get privates '%clear-circle] (build-posn p) r (color->symbol c)))) - + (check-arg r "clearCircle(Posn, int, Color)" "second") + ([hash-table-get privates '%clear-circle] (build-posn p) r (color->symbol c)))) + (define (clearDisk-geometry.Posn-int-colors.Color-native this accs gets privates p r c) (wrap-start-check - (check-arg r "clearDisk(Posn, int, Color)" "second") - ([hash-table-get privates '%clear-solid-disk] (build-posn p) r (color->symbol c)))) - + (check-arg r "clearDisk(Posn, int, Color)" "second") + ([hash-table-get privates '%clear-solid-disk] (build-posn p) r (color->symbol c)))) + (define (clearRect-geometry.Posn-int-int-colors.Color-native this accs gets privates p w h c) (wrap-start-check - (check-arg w "clearRect(Posn, int, int, Color)" "second") - (check-arg h "clearRect(Posn, int, int, Color)" "third") - ([hash-table-get privates '%clear-solid-rect] (build-posn p) w h (color->symbol c)))) - + (check-arg w "clearRect(Posn, int, int, Color)" "second") + (check-arg h "clearRect(Posn, int, int, Color)" "third") + ([hash-table-get privates '%clear-solid-rect] (build-posn p) w h (color->symbol c)))) + (define (clearLine-geometry.Posn-geometry.Posn-colors.Color-native this accs gets privates p0 p1 c) (wrap-start-check - ([hash-table-get privates '%clear-solid-line] (build-posn p0) (build-posn p1) (color->symbol c)))) + ([hash-table-get privates '%clear-solid-line] (build-posn p0) (build-posn p1) (color->symbol c)))) )) - - + + (define world-native@ (unit/sig world-native^ (import support^) - + (define (bigBangO-double-native this accs gets privates i) (define theCanvas ((hash-table-get accs 'theCanvas) this)) (define setCanvas (hash-table-get gets 'theCanvas)) @@ -190,21 +191,25 @@ (send theCanvas show) (big-bang i this) (on-tick-event - (lambda (world) - (on-event world (lambda () (send world onTick))))) + (lambda (world) + (on-event world (lambda () (send world onTick))))) (on-key-event - (lambda (ke world) - (define ke* (make-java-string (if (char? ke) (string ke) (symbol->string ke)))) - (on-event world (lambda () (send world onKeyEvent-java.lang.String ke*))))) + (lambda (ke world) + (define ke* (make-java-string (if (char? ke) (string ke) (symbol->string ke)))) + (on-event world (lambda () (send world onKeyEvent-java.lang.String ke*))))) void-or-true) - (define (endOfTime-native this accs gets privates) + (define (endOfTime-java.lang.String-native this accs gets privates s) (define theCanvas ((hash-table-get accs 'theCanvas) this)) + (define _ (check-string s "endOfTime(String)" "first")) + (message-box "end of time" (send s get-mzscheme-string)) (send theCanvas stop) #t) - (define (endOfWorld-native this accs gets privates) + (define (endOfWorld-java.lang.String-native this accs gets privates s) (define theCanvas ((hash-table-get accs 'theCanvas) this)) + (define _ (check-string s "endOfWorld(String)" "first")) + (message-box "end of world" (send s get-mzscheme-string)) (send theCanvas stop) this))) ) diff --git a/collects/htdch/idraw/World-native-methods.ss b/collects/htdch/idraw/World-native-methods.ss index 26c3fb0ef2..7e95625c58 100644 --- a/collects/htdch/idraw/World-native-methods.ss +++ b/collects/htdch/idraw/World-native-methods.ss @@ -2,7 +2,7 @@ (module World-native-methods mzscheme (require (lib "support.scm" "htdch" "draw") (lib "unitsig.ss")) - (provide endOfTime-native endOfWorld-native bigBangO-double-native) + (provide endOfTime-java.lang.String-native endOfWorld-java.lang.String-native bigBangO-double-native) (define void-or-true void) (define (imperative world@t+1 world@t) world@t) diff --git a/collects/htdch/idraw/World.java b/collects/htdch/idraw/World.java index e07561bd77..c70e5ef51a 100644 --- a/collects/htdch/idraw/World.java +++ b/collects/htdch/idraw/World.java @@ -26,8 +26,8 @@ public abstract class World { // -------------------------------------------------------- - public native boolean endOfTime(); - public native World endOfWorld(); + public native boolean endOfTime(String s); + public native World endOfWorld(String s); public abstract void onTick(); public abstract void onKeyEvent(String ke); public abstract void draw(); diff --git a/collects/teachpack/htdc/Docs/draw.thtml b/collects/teachpack/htdc/Docs/draw.thtml index 07064004a0..f4dbec86df 100644 --- a/collects/teachpack/htdc/Docs/draw.thtml +++ b/collects/teachpack/htdc/Docs/draw.thtml @@ -14,8 +14,8 @@ import geometry.*; | Canvas theCanvas |------>| Canvas | +-----------------------------------+ +---------------------------------------+ | boolean bigBang(int,int,double) | +---------------------------------------+ - | boolean endOfTime() | | boolean show() | - | World endOfWorld() | | boolean close() | + | boolean endOfTime(String) | | boolean show() | + | World endOfWorld(String) | | boolean close() | | | | boolean drawCircle(Posn,int,Color) | | | | boolean drawDisk(Posn,int,Color) | | abstract World onTick() | | boolean drawRect(Posn,int,int,Color) | @@ -51,13 +51,13 @@ produces true.

-
  • endOfTime, stops the clock and, if it succeeds, produces +
  • endOfTime, displays the given message, stops the clock and, if it succeeds, produces true. After the end of time, events no longer trigger calls to onTick or onKeyEvent (see below). The canvas remains visible.
  • -
  • endOfWorld, stops the clock and, if it succeeds, produces the +
  • endOfWorld, displays the given message, stops the clock and, if it succeeds, produces the last World. After the end of the world, events no longer trigger calls to onTick or onKeyEvent (see below). The canvas remains visible.