diff --git a/collects/framework/main.rkt b/collects/framework/main.rkt index 383b5027..e015ef3f 100644 --- a/collects/framework/main.rkt +++ b/collects/framework/main.rkt @@ -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%)) diff --git a/collects/framework/private/keymap.rkt b/collects/framework/private/keymap.rkt index 10e727e3..47e59ca4 100644 --- a/collects/framework/private/keymap.rkt +++ b/collects/framework/private/keymap.rkt @@ -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)))) + \ No newline at end of file diff --git a/collects/framework/private/scheme.rkt b/collects/framework/private/scheme.rkt index d175214e..f521669d 100644 --- a/collects/framework/private/scheme.rkt +++ b/collects/framework/private/scheme.rkt @@ -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)) diff --git a/collects/framework/private/sig.rkt b/collects/framework/private/sig.rkt index d44b5673..a4aa0167 100644 --- a/collects/framework/private/sig.rkt +++ b/collects/framework/private/sig.rkt @@ -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<%>