File size: 2,510 Bytes
07c3cdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/checkbutton-size 15 px def

/box-checkbutton-create {
  box-generic-create
  dup box-checkbutton-setup-methods
  
  dup /checked false put
  checkbutton-size 1 index put-default-baseline
  checkbutton-size 1 index put-height
  checkbutton-size 1 index put-width
  
  dup /box-checkbutton add-type
} def

/box-checkbutton-get-max-width {   % => Context Box
  dup get-full-width
  exch pop
  exch pop
} def

/box-checkbutton-get-min-width {   % => Context Box
  dup get-full-width
  exch pop
  exch pop
} def

/box-checkbutton-put-checked {     % => Value Box
  exch /checked exch put
} def

/box-checkbutton-reflow {          % => Context Parent Box
% Set default baseline
  dup get-default-baseline
  1 index put-baseline

% append to parent line box
  dup 2 index box-container-append-line

% Determine coordinates of upper-left _margin_ corner
  1 index 1 index box-generic-guess-corner

% Offset parent current X coordinate
  1 index get-current-x
  1 index get-full-width
  add
  2 index put-current-x

% Extend parent height
  dup get-bottom-margin
  2 index box-generic-extend-height

  pop pop pop
} def

/box-checkbutton-setup-methods {
  dup /Methods get
  dup /get-max-width {box-checkbutton-get-max-width} put
  dup /get-min-width {box-checkbutton-get-min-width} put
  dup /reflow {box-checkbutton-reflow} put
  dup /show {box-checkbutton-show} put
  pop pop
} def

/box-checkbutton-show {            % => Viewport Box
% Get check center
  dup get-left
  1 index get-right add
  2 div                            % => Viewport Box X

  1 index get-top
  2 index get-bottom add
  2 div                            % => Viewport Box X Y

% Calculate checkbox size
  2 index /get-width call-method
  3 div                            % => Viewport Box X Y Size

% Draw checkbox
  0.25 setlinewidth
  
  2 index 1 index sub
  2 index 2 index add moveto

  2 index 1 index add
  2 index 2 index add lineto

  2 index 1 index add
  2 index 2 index sub lineto

  2 index 1 index sub
  2 index 2 index sub lineto

  closepath
  stroke

% Draw checkmark if needed
  3 index /checked get {
    dup 2 div                      % => Viewport Box X Y Size CheckSize

    3 index 1 index sub
    3 index 2 index add moveto
    3 index 1 index add
    3 index 2 index sub lineto
    stroke
    
    3 index 1 index add
    3 index 2 index add moveto
    3 index 1 index sub
    3 index 2 index sub lineto
    stroke

    pop
  } if                             % => Viewport Box X Y Size

  pop pop pop
  pop pop
} def