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