forked from soegaard/remacs
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdraw-line.rkt
137 lines (129 loc) · 5.08 KB
/
draw-line.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#lang racket
(provide (all-defined-out))
(require "core.rkt" "mode-base.rkt")
;;;
;;; LINES
;;;
; The size of a line is the same as the font size plus one.
(define (line-size)
(define multiplier
; see https://docs.racket-lang.org/gui/windowing-overview.html#%28part._display-resolution%29
(case (system-type)
[(macosx) 1]
[(unix window) 96/72]
[else 1]))
(define font-size 16) ;
(inexact->exact (floor (+ 1 (* multiplier font-size)))))
(define line-cursor-mode%
(class mode%
(super-new)
(define/override (draw-points dc b start-row)
(define-values (font-width font-height _ __) (send dc get-text-extent "M"))
(define p (Buffer-cur b))
(define-values (r c) (Point-row-col p))
(define x (* c font-width))
(define line-height (line-size))
(define y (* (- r start-row) line-height))
(send dc draw-line x y x (+ y line-height)))))
(define block-cursor-mode%
(class mode%
(super-new)
(define/override (draw-points dc b start-row)
(send dc set-text-mode 'solid)
(send dc set-text-background "black")
(send dc set-text-foreground "white")
(define-values (font-width font-height _ __) (send dc get-text-extent "M"))
(define p (Buffer-cur b))
;(displayln (list 'draw-points 'p p))
(define-values (r c) (Point-row-col p))
(define x (* c font-width))
(define line-height (line-size))
(define y (* (- r start-row) line-height))
(define l (list-ref (Buffer-lines b) r))
(define Point-char (line-ref-char l c))
(send dc draw-text (string Point-char) x y))))
(define visual-mode-base%
(class mode%
(super-new)
(abstract get-scope)
(define/override (draw-points dc b start-row)
(send dc set-text-mode 'solid)
(send dc set-text-background "black")
(send dc set-text-foreground "white")
(define-values (font-width font-height _ __) (send dc get-text-extent "M"))
(let ([p (Buffer-cur b)])
(define-values (start end) (apply values (get-scope b)))
(define-values (r1 c1) (Point-row-col start))
(define line-height (line-size))
(define x (* c1 font-width))
(define y (* (- r1 start-row) line-height))
(define-values (r2 c2) (Point-row-col end))
(cond
[(equal? r2 r1)
(define str (Buffer-substring-at b r2 c1 (+ c2 1)))
(send dc draw-text str x y)]
[else
(define lines (Buffer-lines b))
(define l1 (list-ref lines (Point-row start)))
(define l2 (list-ref lines (Point-row end)))
(define str1 (Buffer-substring-at b r1 c1 (string-length l1)))
(define str2 (Buffer-substring-at b r2 0 (+ c2 1)))
(send dc draw-text str1 x y)
(define x2 0)
(define y2 (* (- r2 start-row) line-height))
(send dc draw-text str2 x2 y2)
(for ([ri (in-range (+ r1 1) r2)])
(define xi 0)
(define yi (* (- ri start-row) line-height))
(define stri (list-ref lines ri))
(send dc draw-text stri xi yi))])
))))
(define visual-line-mode-base%
(class mode%
(super-new)
(abstract get-scope)
(define/override (draw-points dc b start-row)
(send dc set-text-mode 'solid)
(send dc set-text-background "black")
(send dc set-text-foreground "white")
(define-values (font-width font-height _ __) (send dc get-text-extent "M"))
(let ([p (Buffer-cur b)])
(define-values (start end) (apply values (get-scope b)))
(define-values (r1 _) (Point-row-col start))
(define line-height (line-size))
(define x 0)
(define y (* (- r1 start-row) line-height))
(define-values (r2 __) (Point-row-col end))
(define lines (Buffer-lines b))
(for ([ri (in-range r1 (+ r2 1))])
(define xi 0)
(define yi (* (- ri start-row) line-height))
(define stri (list-ref lines ri))
(send dc draw-text stri xi yi))
))))
(define visual-block-mode-base%
(class mode%
(super-new)
(abstract get-scope)
(define/override (draw-points dc b start-row)
(send dc set-text-mode 'solid)
(send dc set-text-background "black")
(send dc set-text-foreground "white")
(define-values (font-width font-height _ __) (send dc get-text-extent "M"))
(let ([p (Buffer-cur b)])
(define-values (start end) (apply values (get-scope b)))
(define-values (r1 c1) (Point-row-col start))
(define line-height (line-size))
(define-values (r2 c2) (Point-row-col end))
(define lines (Buffer-lines b))
(define c-min (min c1 c2))
(define c-max (max c1 c2))
(define x (* c-min font-width))
(for ([ri (in-range r1 (+ r2 1))])
(define yi (* (- ri start-row) line-height))
(define line (list-ref lines ri))
(when (>= (string-length line) c-min)
(define end-c (min (add1 c-max) (string-length line)))
(define stri (substring line c-min end-c))
(send dc draw-text stri x yi)))
))))