More indenting support for Java mode, including ( and [ support

svn: r10243
This commit is contained in:
Kathy Gray 2008-06-12 22:32:58 +00:00
parent 2b1aebca19
commit b9516aa543

View File

@ -125,6 +125,15 @@
(send java-keymap map-function "{" "insert-{")
(keymap:send-map-function-meta java-keymap "{" "insert-{")
(send java-keymap add-function "insert-(" (lambda (edit event) (send edit open-par)))
(send java-keymap map-function "(" "insert-(")
(keymap:send-map-function-meta java-keymap "(" "insert-(")
(send java-keymap add-function "insert-[" (lambda (edit event) (send edit open-brack)))
(send java-keymap map-function "[" "insert-[")
(keymap:send-map-function-meta java-keymap "[" "insert-[")
(define indent-mixin
(mixin (color:text<%> editor:keymap<%>) ()
(inherit insert classify-position set-position
@ -166,12 +175,38 @@
[(eq? (classify-position (sub1 open-pos)) 'block-comment)
(loop (find-string "/*" 'backward open-pos 0 #f))]
[else open-pos])))]
[sensitive-indent
(lambda (last-line-indent last-line-start opener open-at)
#;(printf "sensitive-indent opener ~a~n" opener)
#;(printf "previous open at ~a~n" (get-sexp-start (sub1 open-at)))
(cond
[(equal? opener #\{)
(let* ([previous-open (get-sexp-start (sub1 open-at))]
[brace? (and previous-open (equal? #\{ (get-character (sub1 previous-open))))]
[base-line-start (and brace? (skip-whitespace (add1 previous-open) 'forward #f))])
#;(printf "brace? ~a bls ~a~n" brace? base-line-start)
(cond
[base-line-start (+ single-tab-stop
(max 0 (sub1 (- base-line-start previous-open))))]
[brace? (+ single-tab-stop 0)]
[else (+ single-tab-stop last-line-indent)]))]
[(equal? opener #\()
(+ (max 0
(- open-at #;(find-string "(" 'forward last-line-start start-pos #f)
last-line-start))
last-line-indent)]
[(equal? opener #\[)
(+ (max 0
(- open-at
last-line-start))
last-line-indent)]
[else last-line-indent]))]
[indent
(if (or (is-stopped?) (is-frozen?))
0
(let* ([base-offset 0]
[curr-open (get-sexp-start start-pos)])
#;(printf "indent ~a, ~a :~a ~n" start-pos (classify-position start-pos) curr-open)
#;(printf "indent starts at ~a open is ~a~n" start-pos curr-open)
(cond
[(and (eq? (classify-position start-pos) 'block-comment)
(not (blockcomment-end? start-pos)))
@ -186,7 +221,6 @@
[(or (not curr-open) (= curr-open 0)) base-offset]
[else
(let ([previous-line (find-string eol 'backward start-pos 0 #f)])
#;(printf "prev-line ~a~n" previous-line)
(cond
[(not previous-line) (+ base-offset single-tab-stop)]
[(eq? (classify-position previous-line) 'block-comment)
@ -206,16 +240,20 @@
(cond
[(not old-open) last-line-indent]
[(and old-open (<= curr-open old-open)) last-line-indent]
[else (+ single-tab-stop last-line-indent)]))]
[else
(sensitive-indent last-line-indent last-line-start (get-character (sub1 curr-open)) curr-open)
#;(+ single-tab-stop last-line-indent)]))]
[else
(let* ([last-line-start (skip-whitespace previous-line 'forward #f)]
[last-line-indent (last-offset previous-line last-line-start)]
[old-open (get-sexp-start last-line-start)])
#;(printf "lls ~a lli ~a oo~a~n" last-line-start last-line-indent old-open)
#;(printf "lls ~a lli ~a oo~a ~n" last-line-start last-line-indent old-open)
(cond
[(not old-open) last-line-indent]
[(and old-open (<= curr-open old-open)) last-line-indent]
[else (+ single-tab-stop last-line-indent)]))]))])))])
[else
(sensitive-indent last-line-indent last-line-start (get-character (sub1 curr-open)) curr-open)
#;(+ single-tab-stop last-line-indent)]))]))])))])
(build-string (max indent 0) (λ (x) #\space))))
(define/public (do-return)
@ -233,10 +271,40 @@
[(and (= start-pos end-pos)
(or (and (eq? cur-class 'block-comment) (blockcomment-end? start-pos))
(not (memq cur-class '(comment string error block-comment)))))
(insert (string-append "{\n" (get-indentation start-pos) "}"))
(insert "{")
(insert (string-append "\n"
(let ([indent (get-indentation (add1 start-pos))])
(substring indent 0 (max 0 (- (string-length indent) single-tab-stop))))
"}"))
(set-position (add1 start-pos))
]
[else (insert "{")])))
(define/public (open-par)
(let* ([start-pos (get-start-position)]
[end-pos (get-end-position)]
[cur-class (classify-position start-pos)])
(cond
[(and (= start-pos end-pos)
(or (and (eq? cur-class 'block-comment) (blockcomment-end? start-pos))
(not (memq cur-class '(comment string error block-comment)))))
(insert "()")
(set-position (add1 start-pos))
]
[else (insert "(")])))
(define/public (open-brack)
(let* ([start-pos (get-start-position)]
[end-pos (get-end-position)]
[cur-class (classify-position start-pos)])
(cond
[(and (= start-pos end-pos)
(or (and (eq? cur-class 'block-comment) (blockcomment-end? start-pos))
(not (memq cur-class '(comment string error block-comment)))))
(insert "[]")
(set-position (add1 start-pos))
]
[else (insert "[")])))
(define/public (java-tabify-selection)
(let ([start-para (position-paragraph (get-start-position))]