adjust the handling of the scheme mode keymap so that it can go

before the plain text-mode keymap.

Add a doubleleftclick binding to the scheme mode keymap so that
we can have sexp-sensitive double clicking in the drracket editor

original commit: 1c2f9cd721588affa82b0a5497c3580e846a0892
This commit is contained in:
Robby Findler 2011-11-29 11:21:20 -06:00
parent 2eb9dede6a
commit ade72045be
4 changed files with 94 additions and 31 deletions

View File

@ -1358,6 +1358,23 @@
@racket[(send editor get-keymap)] That is, @racket[keymap] must be chained
to some keymap attached to the editor.})
(proc-doc/names
keymap:region-click
(-> any/c any/c (-> number? boolean? number? number? any)
any)
(text mouse-event f)
@{Calls @racket[f] after computing where the @racket[event]
corresponds to in the @racket[text]. If @racket[event] is
not a @racket[mouse-event%] object or if @racket[text] is not a
@racket[text%] object, this function does nothing, returning
@racket[(void)].
The arguments to @racket[f] are:
@itemize[@item{the position where the click occurred}
@item{a boolean indicating if the position is at
the right-hand edge of the screen (to
cover the eol ambiguity)}]})
(proc-doc/names
scheme:text-balanced?
(->* ((is-a?/c text%))

View File

@ -623,39 +623,20 @@
(let ([start-box (box sel-start)])
(send edit find-wordbreak start-box #f 'caret)
(send edit kill 0 (unbox start-box) sel-end))))]
[region-click
(λ (edit event f)
(when (and (send event button-down?)
(is-a? edit text%))
(let ([x-box (box (send event get-x))]
[y-box (box (send event get-y))]
[eol-box (box #f)])
(send edit global-to-local x-box y-box)
(let ([click-pos (send edit find-position
(unbox x-box)
(unbox y-box)
eol-box)]
[start-pos (send edit get-start-position)]
[end-pos (send edit get-end-position)])
(let ([eol (unbox eol-box)])
(if (< start-pos click-pos)
(f click-pos eol start-pos click-pos)
(f click-pos eol click-pos end-pos)))))))]
[copy-click-region
(λ (edit event)
(region-click edit event
(region-click/internal edit event
(λ (click eol start end)
(send edit flash-on start end)
(send edit copy #f 0 start end))))]
[cut-click-region
(λ (edit event)
(region-click edit event
(region-click/internal edit event
(λ (click eol start end)
(send edit cut #f 0 start end))))]
[paste-click-region
(λ (edit event)
(region-click edit event
(region-click/internal edit event
(λ (click eol start end)
(send edit set-position click)
(send edit paste-x-selection 0 click))))]
@ -675,7 +656,7 @@
[select-click-word
(λ (edit event)
(region-click edit event
(λ (click eol start end)
(λ (click eol)
(let ([start-box (box click)]
[end-box (box click)])
(send edit find-wordbreak
@ -688,7 +669,7 @@
[select-click-line
(λ (edit event)
(region-click edit event
(λ (click eol start end)
(λ (click eol)
(let* ([line (send edit position-line
click eol)]
[start (send edit line-start-position
@ -1473,3 +1454,27 @@
(send keymap chain-to-keymap global #t)
(ctki keymap))])
(thunk))))
(define (region-click text event f)
(region-click/internal text event
(λ (click-pos eol start end) (f click-pos eol))))
(define (region-click/internal text event f)
(when (and (is-a? event mouse-event%)
(send event button-down?)
(is-a? text text%))
(define x-box (box (send event get-x)))
(define y-box (box (send event get-y)))
(define eol-box (box #f))
(send text global-to-local x-box y-box)
(define click-pos (send text find-position
(unbox x-box)
(unbox y-box)
eol-box))
(define start-pos (send text get-start-position))
(define end-pos (send text get-end-position))
(define eol (unbox eol-box))
(if (< start-pos click-pos)
(f click-pos eol start-pos click-pos)
(f click-pos eol click-pos end-pos))))

View File

@ -34,7 +34,9 @@
(init-depend mred^ framework:keymap^ framework:color^ framework:mode^
framework:text^ framework:editor^)
(define-local-member-name stick-to-next-sexp?)
(define-local-member-name
stick-to-next-sexp?
get-private-scheme-container-keymap)
(define (scheme-paren:get-paren-pairs)
'(("(" . ")")
@ -409,7 +411,7 @@
(send style-list find-named-style "Matching Parenthesis Style")))
(define text-mixin
(mixin (text:basic<%> mode:host-text<%> color:text<%> text:autocomplete<%>) (-text<%>)
(mixin (text:basic<%> mode:host-text<%> color:text<%> text:autocomplete<%> editor:keymap<%>) (-text<%>)
(inherit begin-edit-sequence
delete
end-edit-sequence
@ -452,6 +454,13 @@
(inherit has-focus? find-snip split-snip
position-location get-dc)
(define private-scheme-container-keymap (new keymap%))
(define/public (get-private-scheme-container-keymap) private-scheme-container-keymap)
(define/override (get-keymaps)
(editor:add-after-user-keymap private-scheme-container-keymap
(super get-keymaps)))
(define/override (get-word-at current-pos)
(let ([no-word ""])
(cond
@ -1216,7 +1225,6 @@
[else first-non-whitespace]))
new-pos)
(super-new)))
(define -text-mode<%>
@ -1233,9 +1241,7 @@
(define/override (on-enable-surrogate text)
(send text begin-edit-sequence)
(super on-enable-surrogate text)
(let ([km (send text get-keymap)])
(when km
(send km chain-to-keymap keymap #f)))
(send (send text get-private-scheme-container-keymap) chain-to-keymap keymap #f)
;; I don't know about these editor flag settings.
;; maybe they belong in drscheme?
@ -1356,6 +1362,37 @@
(add-edit-function "uncomment"
(λ (x) (send x uncomment-selection)))
(send keymap add-function "paren-double-select"
(λ (text event)
(keymap:region-click
text event
(λ (click-pos eol?)
(define str1 (string (send text get-character click-pos)))
(define sexp-based-start/end
(cond
[(ormap (λ (pr) (equal? (cdr pr) str1))
(scheme-paren:get-paren-pairs))
(define start (send text get-backward-sexp (+ click-pos 1)))
(and start
(cons start (+ click-pos 1)))]
[else
(let ([end (send text get-forward-sexp click-pos)])
(and end
(let ([beginning (send text get-backward-sexp end)])
(and beginning
(cons beginning end)))))]))
(cond
[sexp-based-start/end
(send text set-position
(car sexp-based-start/end)
(cdr sexp-based-start/end))]
[else
(define start-box (box click-pos))
(define end-box (box click-pos))
(send text find-wordbreak start-box end-box 'selection)
(send text set-position (unbox start-box) (unbox end-box))])))))
(let ([add/map-non-clever
(λ (name keystroke char)
(add-edit-function
@ -1387,6 +1424,8 @@
(send keymap map-function "]" "balance-parens")
(send keymap map-function "}" "balance-parens")
(send keymap map-function "leftbuttondouble" "paren-double-select")
(define (insert-brace-pair text open-brace close-brace)
(define selection-start (send text get-start-position))
(send text set-position (send text get-end-position))

View File

@ -383,7 +383,9 @@
call/text-keymap-initializer
add-user-keybindings-file
remove-user-keybindings-file))
remove-user-keybindings-file
region-click))
(define-signature color-class^
(text<%>