1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22\writestatus{loading}{ConTeXt Screen Macros Fields}
23
24\unprotect
25
26\registerctxluafile{scrnfld}{}
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\installcorenamespace {forms}
103
104\installdirectcommandhandler \??forms {forms}
105
106\appendtoks
107 \clf_setformsmethod{\formsparameter\c!method}
108\to \everysetupforms
109
110\setupforms
111 [\c!method=XML]
112
113\mutable\let\currentfieldbackgroundcolor \empty
114\mutable\let\currentfieldbackgroundcolorvalue\empty
115\mutable\let\currentfieldbodycategory \empty
116\mutable\let\currentfieldframecolor \empty
117\mutable\let\currentfieldframecolorvalue \empty
118\mutable\let\currentfieldlabel \empty
119\mutable\let\currentfieldstackname \empty
120
121\appendtoks
122 \iflocation
123 \clf_exportformdata{\formsparameter\c!export}
124 \fi
125\to \everystoptext
126
127
128
129
130\permanent\protected\def\presetfieldsymbols[#list]
131 {\processcommacommand[#list]\scrn_symbols_preset}
132
133\def\scrn_symbols_preset#set
134 {\processcommalist[#set]\scrn_symbols_preset_indeed}
135
136\permanent\protected\def\scrn_symbols_preset_indeed#tag
137 {\doifelseobjectfound{SYM}{#tag}
138 {}
139 {\settightobject{SYM}{#tag}\hbox{\symbol[#tag]}
140 \page_otr_add_special_content{\hskip\maxdimen\getobject{SYM}{#tag}}}}
141
142\aliased\let\dosetfieldsymbol\scrn_symbols_preset_indeed
143
144\permanent\def\dogetfieldsymbol#tag
145 {\getobject{SYM}{#tag}}
146
147\permanent\protected\def\definedefaultsymbols
148 {\definesymbol[defaultyes][\mathematics{\times}]
149 \definesymbol[defaultno] [\mathematics{\cdot }]}
150
151
152
153\installcorenamespace{fieldcategory}
154\installcorenamespace{fieldbody}
155
156\installcommandhandler \??fieldcategory {fieldcategory} \??fieldcategory
157\installcommandhandler \??fieldbody {fieldbody} \??fieldbody
158
159\newbox\b_scrn_field_body
160
161\setupfieldcategory
162 [\c!alternative=\v!normal,
163 \c!type=\v!line,
164 \c!width=5em,
165 \c!height=1em,
166 \c!depth=\zeropoint,
167 \c!align=\v!flushleft,
168 \c!option=\v!printable,
169 \c!n=1024]
170
171\def\scrn_field_check_category
172 {\edef\currentfieldbodycategory{\fieldbodyparameter\c!category}
173 \ifempty\currentfieldbodycategory
174 \letfieldbodyparameter\s!parent\??fieldcategory
175
176 \else
177 \normalexpanded{\setfieldbodyparameter{\s!parent}{\??fieldcategory\currentfieldbodycategory}}
178
179 \fi}
180
181\appendtoks
182 \ifempty\currentfieldbodyparent
183 \scrn_field_check_category
184 \clf_definefield
185 name {\currentfieldbody}
186 alternative {normal}
187 type {\fieldbodyparameter\c!type}
188 category {\fieldbodyparameter\c!category}
189 values {\fieldbodyparameter\c!values}
190 default {\fieldbodyparameter\c!default}
191 \relax
192 \else
193 \clf_clonefield
194 children {\currentfieldbody}
195 alternative {clone}
196 parent {\currentfieldbodyparent}
197 category {\fieldbodyparameter\c!category}
198 values {\fieldbodyparameter\c!values}
199 default {\fieldbodyparameter\c!default}
200 \relax
201 \fi
202\to \everydefinefieldbody
203
204\permanent\tolerant\protected\def\fieldbody[#tag]#spacer[#settings]
205 {\iflocation
206 \hbox\bgroup
207 \edef\currentfieldbody{#tag}
208 \setupcurrentfieldbody[#settings]
209 \scrn_field_body_typeset
210 \box\b_scrn_field_body
211 \egroup
212 \fi}
213
214\def\scrn_field_body_typeset
215 {\edef\currentfieldframecolor{\fieldbodyparameter\c!fieldframecolor}
216 \ifempty\currentfieldframecolor\else
217 \getcolorattributevalue\currentfieldframecolor\currentfieldframecolorvalue
218
219 \fi
220 \edef\currentfieldbackgroundcolor{\fieldbodyparameter\c!fieldbackgroundcolor}
221 \ifempty\currentfieldbackgroundcolor\else
222 \getcolorattributevalue\currentfieldbackgroundcolor\currentfieldbackgroundcolorvalue
223
224 \fi
225 \usefieldbodystyleandcolor\c!style\c!color
226 \clf_insertfield
227 {\currentfieldbody}
228 {
229 title {\currentfieldbody}
230 width \dimexpr\fieldbodyparameter\c!width \relax
231 height \dimexpr\fieldbodyparameter\c!height\relax
232 depth \dimexpr\fieldbodyparameter\c!depth \relax
233 align {\fieldbodyparameter\c!align}
234 length {\fieldbodyparameter\c!n}
235 fontstyle {\fontstyle}
236 fontalternative {\fontalternative}
237 fontsize {\fontbody}
238 fontsymbol {\fieldbodyparameter\c!symbol}
239 color {\fieldbodyparameter\c!color}
240 colorvalue \c_attr_color
241 \ifempty\currentfieldbackgroundcolor \else
242 backgroundcolor {\currentfieldbackgroundcolor}
243 backgroundcolorvalue \numexpr\currentfieldbackgroundcolorvalue\relax
244 \fi
245 \ifempty\currentfieldframecolor \else
246 framecolor {\currentfieldframecolor}
247 framecolorvalue \numexpr\currentfieldframecolorvalue\relax
248 \fi
249 layer {\fieldbodyparameter\c!fieldlayer}
250 option {\fieldbodyparameter\c!option}
251 clickin {\fieldbodyparameter\c!clickin}
252 clickout {\fieldbodyparameter\c!clickout}
253 regionin {\fieldbodyparameter\c!regionin}
254 regionout {\fieldbodyparameter\c!regionout}
255 afterkey {\fieldbodyparameter\c!afterkey}
256 format {\fieldbodyparameter\c!format}
257 validate {\fieldbodyparameter\c!validate}
258 calculate {\fieldbodyparameter\c!calculate}
259 focusin {\fieldbodyparameter\c!focusin}
260 focusout {\fieldbodyparameter\c!focusout}
261 openpage {\fieldbodyparameter\c!openpage}
262 closepage {\fieldbodyparameter\c!closepage}
263 }
264 \relax}
265
266
267
268
269
270\permanent\tolerant\protected\def\definefieldbodyset[#tag]#spacer[#list]
271 {\clf_definefieldset{#tag}{#list}}
272
273\aliased\let\dodefinefieldset\definefieldbodyset
274
275
276
277\permanent\def\doifelsefieldbody #tag{\clf_doifelsefield{#tag}}
278\permanent\def\doifelsefieldcategory#tag{\clf_doifelsefieldcategory{#tag}}
279
280\aliased\let\doiffieldbodyelse \doifelsefieldbody
281\aliased\let\doiffieldcategoryelse\doifelsefieldcategory
282
283\aliased\let\doiffieldelse \doifelsefieldbody
284\aliased\let\doifelsefield \doifelsefieldbody
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312\permanent\tolerant\protected\def\definefield[#tag]#spacer[#type]#spacer[#category]#spacer[#values]#spacer[#default]
313 {\definefieldbody[#tag][\c!type=#type,\c!category=#category,\c!values={#values},\c!default={#default}]}
314
315\permanent\tolerant\protected\def\definesubfield[#tag]#spacer[#category]#spacer[#values]
316 {\definefieldbody[#tag][\c!type=sub,\c!category=#category,\c!values={#values}]}
317
318\permanent\tolerant\protected\def\clonefield[#parent]#spacer[#tag]#spacer[#category]#spacer[#values]
319 {\definefieldbody[#tag][#parent][\c!category=#category,\c!values={#values}]}
320
321\permanent\tolerant\protected\def\copyfield[#parent]#spacer[#tag]
322 {\definefieldbody[#tag][#parent]}
323
324\aliased\let\definemainfield\definefield
325
326
327
328
329\appendtoks
330 \let\currentfieldcategory\empty
331 \doifelse{\interactionparameter\c!fieldlayer}\v!auto
332 {\setupcurrentfieldcategory[\c!fieldlayer=\currentviewerlayer]}
333 {\setupcurrentfieldcategory[\c!fieldlayer=]}
334\to \everysetupinteraction
335
336\setupinteraction
337 [\c!fieldlayer=\v!auto]
338
339
340
341
342
343
344
345
346
347
348
349\newbox\b_scrn_field_fit_symbol
350
351\defineframed
352 [fitfieldframed]
353 [\c!strut=\v!no,
354 \c!frame=off,
355 \c!offset=\v!overlay,
356 \c!align=]
357
358\permanent\tolerant\protected\def\fitfield[#tag]#spacer[#settings]
359 {\iflocation
360 \begingroup
361 \setbox\b_scrn_field_fit_symbol\hbox\bgroup
362 \normalexpanded{\symbol[\clf_getdefaultfieldvalue{#tag}]}
363 \egroup
364 \fitfieldframed
365 {\fieldbody[#tag]
366 [\c!width=\wd\b_scrn_field_fit_symbol,
367 \c!height=\ht\b_scrn_field_fit_symbol,
368 \c!depth=\dp\b_scrn_field_fit_symbol,
369 #settings]}
370 \endgroup
371 \fi}
372
373
374
375\installcorenamespace{fieldlabel}
376\installcorenamespace{fieldcontent}
377\installcorenamespace{fieldtotal}
378
379\installparameterhandler \??fieldlabel {fieldlabelframed}
380\installparameterhandler \??fieldcontent {fieldcontentframed}
381\installparameterhandler \??fieldtotal {fieldtotalframed}
382
383\installparametersethandler \??fieldcontent {fieldcontentframed}
384
385\installsetuphandler \??fieldlabel {fieldlabelframed}
386\installsetuphandler \??fieldcontent {fieldcontentframed}
387\installsetuphandler \??fieldtotal {fieldtotalframed}
388
389\installinheritedframed {fieldlabelframed}
390\installinheritedframed {fieldcontentframed}
391\installinheritedframed {fieldtotalframed}
392
393\setupfieldcontentframed
394 [\c!align=\v!flushleft,
395 \c!strut=\v!no,
396 \s!parent=\??regularframed]
397
398\setupfieldcontentframed
399 [\c!alternative=\v!normal,
400 \c!type=\v!line,
401 \c!width=5em,
402 \c!height=\lineheight,
403 \c!depth=\zeropoint,
404 \c!align=\v!flushleft,
405 \c!option=\v!printable,
406 \c!n=1024]
407
408\setupfieldlabelframed
409 [\c!style=,
410 \c!color=,
411 \c!align=\v!flushleft,
412 \s!parent=\??regularframed]
413
414\setupfieldtotalframed
415 [
416 \c!strut=\v!no,
417 \c!align=,
418 \s!parent=\??regularframed]
419
420
421
422\permanent\tolerant\protected\def\setupfield[#tag]#spacer[#variant]#spacer[#totalsettings]#spacer[#labelsettings]#spacer[#fieldsettings]
423 {\ifarguments\or\or
424 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#variant]
425 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal]
426 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel]
427 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#variant]
428 \or
429 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#totalsettings]
430 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal,\c!alternative={#variant}]
431 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel]
432 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#totalsettings]
433 \or
434 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#labelsettings]
435 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal,\c!alternative={#variant},#totalsettings]
436 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel]
437 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#labelsettings]
438 \or
439 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#fieldsettings]
440 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal,\c!alternative={#variant},#totalsettings]
441 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel,#labelsettings]
442 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#fieldsettings]
443 \fi}
444
445\permanent\tolerant\protected\def\setupfields[#variant]#spacer[#totalsettings]#spacer[#labelsettings]#spacer[#fieldsettings]
446 {\ifarguments\or
447 \setupfieldtotalframed [#variant]
448 \or
449 \setupfieldtotalframed [#variant]
450 \setupfieldcontentframed[#totalsettings]
451 \or
452 \setupfieldtotalframed [#variant]
453 \setupfieldlabelframed [#totalsettings]
454 \setupfieldcontentframed[#labelsettings]
455 \or
456 \setupfieldtotalframed [\c!alternative={#variant},#totalsettings]
457 \setupfieldlabelframed [#labelsettings]
458 \setupfieldcontentframed[#fieldsettings]
459 \fi}
460
461
462
463\definefieldcategory [][\s!parent=\??fieldcontent]
464
465
466
467
468
469
470
471
472\def\scrn_field_load_scripts{\useJSscripts[fld]\glet\scrn_field_load_scripts\relax}
473
474\newconditional\fieldlabelshown
475\newconditional\fieldframeshown
476\newconditional\fieldisvertical
477\newconditional\fieldishorizontal
478
479\mutable\let\currentfieldtotalframed \empty
480\mutable\let\currentfieldlabelframed \empty
481\mutable\let\currentfieldcontentframed\empty
482
483\mutable\let\fieldtotalframedparameterhash \empty
484\mutable\let\fieldlabelframedparameterhash \empty
485\mutable\let\fieldcontentframedparameterhash\empty
486
487\permanent\tolerant\protected\def\field[#tag]#spacer[#label]
488 {\iflocation
489 \dontleavehmode
490 \begingroup
491 \scrn_field_load_scripts
492 \edef\currentfieldbody {#tag}
493 \edef\currentfieldlabel {#label}
494 \edef\currentfieldcategory{\clf_getfieldcategory{#tag}}
495 \ifempty\currentfieldlabel
496 \let\currentfieldlabel\currentfieldbody
497 \fi
498 \ifempty\currentfieldcategory
499 \setupfieldtotalframed [\currentfieldbody][\s!parent=\??fieldtotal]
500 \setupfieldlabelframed [\currentfieldbody][\s!parent=\??fieldlabel]
501 \setupfieldcontentframed[\currentfieldbody][\s!parent=\??fieldcontent]
502 \definefieldcategory [\currentfieldbody]
503 \setupfieldbody [\currentfieldbody][\c!category=\currentfieldbody]
504 \let\currentfieldcategory\currentfieldbody
505 \fi
506 \let\currentfieldtotalframed \currentfieldcategory
507 \let\currentfieldlabelframed \currentfieldcategory
508 \let\currentfieldcontentframed\currentfieldcategory
509 \scrn_field_analyze_setups
510 \ifconditional\fieldframeshown
511 \inheritedfieldtotalframedframed
512 \bgroup
513 \else
514 \vbox
515 \bgroup
516 \fi
517 \dontcomplain
518 \ifconditional\fieldlabelshown
519 \scrn_field_set_label_box
520 \fi
521 \scrn_field_set_content_box
522 \ifconditional\fieldlabelshown
523 \ifconditional\fieldisvertical
524 \scrn_field_flush_vertical
525 \else
526 \scrn_field_flush_horizontal
527 \fi
528 \else
529 \scrn_field_flush_content
530 \fi
531 \egroup
532 \endgroup
533 \fi}
534
535
536
537\newbox\b_scrn_field_label
538\newbox\b_scrn_field_content
539
540
541
542\def\scrn_field_set_label_box
543 {\setbox\b_scrn_field_label\hbox
544 {\reshapeframeboxtrue
545 \inheritedfieldlabelframedframed{\currentfieldlabel}}}
546
547
548
549
550\def\scrn_field_set_content_box
551 {\setbox\b_scrn_field_content\hbox
552 {\reshapeframeboxtrue
553 \doifnothing{\fieldcontentframedparameter\c!height}
554 {\ifconditional\fieldisvertical
555 \setfieldcontentframedparameter\c!height{6ex}
556 \orelse\ifconditional\fieldishorizontal
557 \setfieldcontentframedparameter\c!height{\vsize}
558 \else
559 \setfieldcontentframedparameter\c!height{2cm}
560 \fi}
561 \doifnothing{\fieldcontentframedparameter\c!width}
562 {\ifconditional\fieldisvertical
563 \setfieldcontentframedparameter\c!width{\hsize}
564 \orelse\ifconditional\fieldishorizontal
565 \setfieldcontentframedparameter\c!width{20em}
566 \else
567 \setfieldcontentframedparameter\c!width{2cm}
568 \fi}
569 \inheritedfieldcontentframedframed
570 {\fieldbody
571 [\currentfieldbody]
572 [\c!width=\framedwidth,\c!height=\framedheight]}}}
573
574
575\def\scrn_field_flush_vertical
576 {\vbox
577 {\copy\b_scrn_field_label
578 \fieldtotalframedparameter\c!inbetween
579 \copy\b_scrn_field_content}}
580
581\def\scrn_field_flush_horizontal
582 {\hbox
583 {\vbox \ifdim\ht\b_scrn_field_content>\ht\b_scrn_field_label to \ht\b_scrn_field_content \fi
584 {\fieldtotalframedparameter\c!before
585 \copy\b_scrn_field_label
586 \fieldtotalframedparameter\c!after}
587 \hskip\fieldtotalframedparameter\c!distance
588 \vbox \ifdim\ht\b_scrn_field_label>\ht\b_scrn_field_content to \ht\b_scrn_field_label \fi
589 {\fieldtotalframedparameter\c!before
590 \box\b_scrn_field_content
591 \fieldtotalframedparameter\c!after}}}
592
593\def\scrn_field_flush_content
594 {\box\b_scrn_field_content}
595
596
597
598\def\scrn_field_analyze_setups
599 {\setfalse\fieldlabelshown
600 \setfalse\fieldframeshown
601 \setfalse\fieldishorizontal
602 \setfalse\fieldisvertical
603 \normalexpanded{\processallactionsinset[\fieldtotalframedparameter\c!alternative]}
604 [ \v!reset=>\setfalse\fieldlabelshown
605 \setfalse\fieldframeshown
606 \setfalse\fieldishorizontal
607 \setfalse\fieldisvertical,
608 \v!label=>\settrue\fieldlabelshown,
609 \v!frame=>\settrue\fieldframeshown,
610 \v!horizontal=>\settrue\fieldishorizontal,
611 \v!vertical=>\settrue\fieldisvertical]
612 \ifconditional\fieldisvertical
613 \setupfieldtotalframed[\c!distance=\zeropoint,\c!inbetween=\vskip\d_framed_local_offset,\c!align=\v!right,\c!width=20em]
614 \orelse\ifconditional\fieldishorizontal
615 \setupfieldtotalframed[\c!distance=\d_framed_local_offset,\c!inbetween=,\c!align=\c!left,\c!height=10ex]
616 \else
617 \setupfieldtotalframed[\c!distance=\zeropoint,\c!inbetween=,\c!align=\c!left]
618 \fi
619 \setupfieldtotalframed[\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=]}
620
621
622
623\newcount\c_scrn_field_system_n
624
625\permanent\def\currentsystemfield{sys::\number\c_scrn_field_system_n}
626
627\permanent\protected\def\nextsystemfield
628 {\global\advance\c_scrn_field_system_n\plusone}
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643\newbox \b_scrn_tooltip_anchor
644\newbox \b_scrn_tooltip_text
645\newcount\c_scrn_tooltip_n
646
647\installcorenamespace{tooltip}
648
649\installframedcommandhandler \??tooltip {tooltip} \??tooltip
650
651\setuptooltip
652 [\c!location=\v!right,
653 \c!frame=\v!off,
654 \c!offset=.1ex,
655 \c!background=\v!color,
656 \c!backgroundcolor=gray]
657
658\appendtoks
659 \frozen\instance\setuevalue\currenttooltip{\scrn_tooltip_direct{\currenttooltip}}
660\to \everydefinetooltip
661
662\protected\def\scrn_tooltip_direct#tag
663 {\def\currenttooltip{#tag}
664 \iflocation
665 \expandafter\scrn_tooltip_indeed
666 \else
667 \expandafter\scrn_tooltip_ignore
668 \fi}
669
670\tolerant\def\scrn_tooltip_ignore[#settings]#:#anchortext#tiptext
671 {#anchortext}
672
673\mutable\let\currenttooltipname\empty
674
675\tolerant\def\scrn_tooltip_indeed[#settings]#:#anchortext#tiptext
676 {\dontleavehmode \hbox \bgroup
677 \dontcomplain
678 \global\advance\c_scrn_tooltip_n\plusone
679 \edef\currenttooltipname{tooltip:\number\c_scrn_tooltip_n}
680 \setbox\b_scrn_tooltip_anchor\hbox
681 {\strut#anchortext}
682 \doifelseassignment{#settings}
683 {\setupcurrenttooltip[#settings]}
684 {\setupcurrenttooltip[\c!location=#settings]}
685 \setbox\b_scrn_tooltip_text\hbox
686 {\lettooltipparameter\c!location\empty
687 \inheritedtooltipframed{#tiptext}}
688 \definesymbol
689 [\currenttooltipname:txt]
690 [\copy\b_scrn_tooltip_text]
691 \definefieldbody
692 [\currenttooltipname:txt]
693 [\c!type=push,
694 \c!width=\wd\b_scrn_tooltip_text,
695 \c!height=\ht\b_scrn_tooltip_text,
696 \c!depth=\dp\b_scrn_tooltip_text,
697 \c!option=\v!hidden,
698 \c!values=\currenttooltipname:txt]
699 \setbox\b_scrn_tooltip_text\hbox
700 {\fieldbody[\currenttooltipname:txt]}
701 \setbox\b_scrn_tooltip_text\hbox
702 {\strut\lower\dimexpr.25ex\ht\b_scrn_tooltip_text\relax\box\b_scrn_tooltip_text}
703 \edef\p_location{\tooltipparameter\c!location}
704 \ifx\p_location\v!left
705 \hsmashed{\hskip\wd\b_scrn_tooltip_anchor\llap{\box\b_scrn_tooltip_text}}
706 \orelse\ifx\p_location\v!middle
707 \hsmashed to \wd\b_scrn_tooltip_anchor{\hss\box\b_scrn_tooltip_text\hss}
708 \else
709 \hsmashed{\box\b_scrn_tooltip_text}
710 \fi
711 \definesymbol
712 [\currenttooltipname:but]
713 [\hphantom{\copy\b_scrn_tooltip_anchor}]
714 \definefieldbody
715 [\currenttooltipname:but]
716 [\c!type=push,
717 \c!regionin=action(show{\currenttooltipname:txt}),
718 \c!regionout=action(hide{\currenttooltipname:txt}),
719 \c!width=\wd\b_scrn_tooltip_anchor,
720 \c!height=\ht\b_scrn_tooltip_anchor,
721 \c!depth=\dp\b_scrn_tooltip_anchor]
722 \hsmashed{\fieldbody[\currenttooltipname:but]}
723 \egroup
724 #anchortext}
725
726\definetooltip[tooltip]
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745\installcorenamespace {fieldstack}
746
747\permanent\tolerant\protected\def\definefieldstack[#tag]#spacer[#symbols]#spacer[#settings]
748 {\ifcsname\??fieldstack#tag\endcsname
749
750 \else
751
752 \setxvalue{\??fieldstack#tag}{\scrn_fieldstack_construct[#tag][#symbols][\normalunexpanded{#settings}]}
753 \fi}
754
755\permanent\tolerant\protected\def\fieldstack[#tag]#spacer[#symbols]#spacer[#settings]
756 {\ifparameter#symbols\or
757 \definefieldstack[#tag][#symbols][#settings]
758 \fi
759 \csname\??fieldstack#tag\endcsname}
760
761\newbox\b_scrn_fieldstack_box
762
763\definesymbol[\s!empty][]
764
765\def\scrn_fieldstack_add#tag#settings#symbol
766 {\advance\scratchcounter\plusone
767 \edef\currentfieldstackname{#tag:\number\scratchcounter}
768 \ifnum\scratchcounter=\fieldcategoryparameter\c!start\relax
769 \definefieldbody[\currentfieldstackname][\c!type=check,\c!values={#symbol,\s!empty},\c!default={#symbol}]
770 \else
771 \definefieldbody[\currentfieldstackname][\c!type=check,\c!values={#symbol,\s!empty},\c!default=\s!empty]
772 \fi
773 \setbox\b_scrn_fieldstack_box\hbox{\symbol[#symbol]}
774 \setcollector
775 [fieldstack]
776 {\fieldbody
777 [\currentfieldstackname]
778 [\c!option={\v!readonly},
779 \c!width=\wd\b_scrn_fieldstack_box,
780 \c!height=\ht\b_scrn_fieldstack_box,
781 \c!depth=\dp\b_scrn_fieldstack_box,
782 #settings]}}
783
784\protected\def\scrn_fieldstack_construct[#tag][#symbols][#settings]
785 {\iflocation
786 \dontleavehmode
787 \begingroup
788 \setupfieldcategory[\c!start=1,#settings]
789 \scrn_field_load_scripts
790 \definecollector
791 [fieldstack]
792 [\c!corner=\v!middle,
793 \c!location=\v!middle]
794 \scratchcounter\zerocount
795 \processcommalist[#symbols]{\scrn_fieldstack_add{#tag}{#settings}}
796 \flushcollector[fieldstack]
797 \endgroup
798 \fi}
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814\newcount\c_scrn_rollbutton_n
815
816\permanent\tolerant\protected\def\overlayrollbutton[#1]#*[#2]#;#=#=
817 {\iflocation
818 \bgroup
819 \global\advance\c_scrn_rollbutton_n_button\plusone
820 \global\advance\c_scrn_rollbutton_n_symbol\plusone
821 \definesymbol
822 [rollsymbol:\number\c_scrn_rollbutton_n_symbol]
823 [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]
824
825
826
827
828
829
830
831
832
833
834 \definefield
835 [rollbutton:\number\c_scrn_rollbutton_n_button][push][rollbutton]
836 [rollsymbol:\number\c_scrn_rollbutton_n_symbol]
837 \fitfield
838 [rollbutton:\number\c_scrn_rollbutton_n_button]
839 [\c!regionin={#1#3},\c!regionout={#2#4}]
840
841 \egroup
842 \fi}
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869\newcount\c_scrn_pushbutton_n
870
871\permanent\tolerant\protected\def\definepushbutton[#tag]#spacer[#settings]
872 {\scrn_pushbutton_define_variant{#tag}{n}{push}
873 \scrn_pushbutton_define_variant{#tag}{r}{\symbol[pushsymbol:#tag:n]}
874 \scrn_pushbutton_define_variant{#tag}{d}{\symbol[pushsymbol:#tag:r]}
875 \setvalue{pushbutton:#tag}{\scrn_pushbutton_handle{#tag}{#settings}}}
876
877\def\scrn_pushbutton_define_variant#tag#variant#content
878 {\doifelsesymboldefined{pushsymbol:#tag:#variant}
879 \donothing
880 {\definesymbol[pushsymbol:#tag:#variant][{#content}]}}
881
882\def\scrn_pushbutton_handle#tag#settings#reference
883 {\bgroup
884 \global\advance\c_scrn_pushbutton_n\plusone
885 \setupfield
886 [pushbutton]
887 [\c!frame=\v!overlay,
888 \c!offset=\v!overlay,
889 \c!clickout={#reference},
890 #settings]
891 \definefield
892 [pushbutton:\number\c_scrn_pushbutton_n]
893 [push]
894 [pushbutton]
895 [pushsymbol:#tag:n,pushsymbol:#tag:r,pushsymbol:#tag:d]
896 \fitfield
897 [pushbutton:\number\c_scrn_pushbutton_n]
898 \egroup}
899
900\permanent\tolerant\protected\def\definepushsymbol[#tag]#spacer[#variant]
901 {\definesymbol[pushsymbol:#tag:#variant]}
902
903\permanent\tolerant\def\pushbutton[#tag]#spacer[#variant]
904 {\executeifdefined{pushbutton:#tag}\gobbleoneargument{#variant}}
905
906
907
908\permanent\permanent\protected\def\scrn_menu_psh_start[#reference]#text\stoppsh
909 {\starttxt\pushbutton[\currentinteractionmenu][#reference]\stoptxt}
910
911\permanent\permanent\protected\def\scrn_menu_psh_direct[#reference]#text\\
912 {\scrn_menu_psh_start[#reference]\stoprob}
913
914\aliased\let\startpsh\relax
915\aliased\let\stoppsh \relax
916\aliased\let\psh \relax
917
918\appendtoks
919 \enforced\let\startpsh\scrn_menu_psh_start
920 \enforced\let\stoppsh \relax
921 \enforced\let\psh \scrn_menu_psh_direct
922\to \everysetmenucommands
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946\definepalet
947 [rollover]
948 [n=red,
949 r=green,
950 d=blue]
951
952\newcount\c_scrn_rollbutton_n_button
953\newcount\c_scrn_rollbutton_n_symbol
954
955\permanent\def\lastrollbuttonindex{\the\c_scrn_rollbutton_n_button}
956
957\setupfield
958 [rollbutton]
959 [\c!frame=\v!off,
960 \c!offset=\v!overlay]
961
962\let\scrn_rollbutton_symbol\relax
963
964\def\scrn_rollbutton_symbol_m
965 {\scrn_rollbutton_symbol_indeed
966 \interactionmenuparameter
967 \inheritedinteractionmenuframed
968 \setinteractionmenuparameter
969 \useinteractionmenustyleandcolor}
970
971\def\scrn_rollbutton_symbol_b
972 {\scrn_rollbutton_symbol_indeed
973 \buttonparameter
974 \inheritedbuttonframed
975 \setbuttonparameter
976 \usebuttonstyleandcolor}
977
978\permanent\tolerant\protected\def\rollbutton[#tag]#spacer[#settings]#:#text[#reference]
979 {\dontleavehmode
980 \bgroup
981 \global\advance\c_scrn_rollbutton_n_button\plusone
982 \global\advance\c_scrn_rollbutton_n_symbol\plusone
983 \ifparameter#tag\or
984 \ifparameter#settings\or
985 \edef\currentinteractionmenu{#tag}
986 \setupcurrentinteractionmenu[#settings]
987 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_m
988 \orelse\ifhastok={#tag}
989 \let\currentbutton\empty
990 \setupcurrentbutton[#tag]
991 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_b
992 \else
993 \edef\currentinteractionmenu{#tag}
994 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_m
995 \fi
996 \else
997 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_b
998 \fi
999
1000 \definesymbol[rollsymbol:\number\c_scrn_rollbutton_n_symbol:n][\scrn_rollbutton_symbol{n}{#text}]
1001 \definesymbol[rollsymbol:\number\c_scrn_rollbutton_n_symbol:r][\scrn_rollbutton_symbol{r}{#text}]
1002 \definesymbol[rollsymbol:\number\c_scrn_rollbutton_n_symbol:d][\scrn_rollbutton_symbol{d}{#text}]
1003 \definefield
1004 [rollbutton:\number\c_scrn_rollbutton_n_button][push][rollbutton]
1005 [rollsymbol:\number\c_scrn_rollbutton_n_symbol:n,
1006 rollsymbol:\number\c_scrn_rollbutton_n_symbol:r,
1007 rollsymbol:\number\c_scrn_rollbutton_n_symbol:d]
1008 \fitfield
1009 [rollbutton:\number\c_scrn_rollbutton_n_button]
1010 [\c!clickout={#reference}]
1011 \egroup}
1012
1013\protected\def\scrn_rollbutton_symbol_indeed#getparameter#inheritedframed#setparameter#usestyleandcolor#what#text
1014 {\definecolor[rollover][rollover:#what]
1015 \doifelse{#what}{n}
1016 {\doifelse{#getparameter\c!alternative}\v!hidden\phantom\hbox}\hbox
1017 {#setparameter\c!framecolor {rollover}
1018 #setparameter\c!backgroundcolor{rollover}
1019 #setparameter\c!color {rollover}
1020 #inheritedframed{#usestyleandcolor\c!style\c!color{#text}}}}
1021
1022
1023
1024\permanent\protected\def\scrn_menu_rob_start[#reference]#text\stoprob
1025 {\starttxt\rollbutton[\currentinteractionmenu]{\ignorespaces#text\unskip}[#reference]\stoptxt}
1026
1027\permanent\protected\def\scrn_menu_rob_direct[#reference]#text\\
1028 {\scrn_menu_rob_start[#reference]#text\stoprob}
1029
1030\aliased\let\startrob\relax
1031\aliased\let\stoprob \relax
1032\aliased\let\rob \relax
1033
1034\appendtoks
1035 \enforced\let\startrob\scrn_menu_rob_start
1036 \enforced\let\stoprob \relax
1037 \enforced\let\rob \scrn_menu_rob_direct
1038\to \everysetmenucommands
1039
1040\protect \endinput
1041 |