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\lettonothing\currentfieldbackgroundcolor
114\mutable\lettonothing\currentfieldbackgroundcolorvalue
115\mutable\lettonothing\currentfieldbodycategory
116\mutable\lettonothing\currentfieldframecolor
117\mutable\lettonothing\currentfieldframecolorvalue
118\mutable\lettonothing\currentfieldlabel
119\mutable\lettonothing\currentfieldstackname
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[#S#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 {\fieldbodyparameter\c!width }
231 height {\fieldbodyparameter\c!height}
232 depth {\fieldbodyparameter\c!depth }
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 {\currentfieldbackgroundcolorvalue}
244 \fi
245 \ifempty\currentfieldframecolor \else
246 framecolor {\currentfieldframecolor}
247 framecolorvalue {\currentfieldframecolorvalue}
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_doifelsefieldset{#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 \lettonothing\currentfieldcategory
331 \ifcstok{\interactionparameter\c!fieldlayer}\v!auto
332 \setupcurrentfieldcategory[\c!fieldlayer=\currentviewerlayer]
333 \else
334 \setupcurrentfieldcategory[\c!fieldlayer=]
335 \fi
336\to \everysetupinteraction
337
338\setupinteraction
339 [\c!fieldlayer=\v!auto]
340
341
342
343
344
345
346
347
348
349
350
351\newbox\b_scrn_field_fit_symbol
352
353\defineframed
354 [fitfieldframed]
355 [\c!strut=\v!no,
356 \c!frame=off,
357 \c!offset=\v!overlay,
358 \c!align=]
359
360\permanent\tolerant\protected\def\fitfield[#tag]#spacer[#S#settings]
361 {\iflocation
362 \begingroup
363 \setbox\b_scrn_field_fit_symbol\hbox\bgroup
364 \normalexpanded{\symbol[\clf_getdefaultfieldvalue{#tag}]}
365 \egroup
366 \fitfieldframed
367 {\fieldbody[#tag]
368 [\c!width=\wd\b_scrn_field_fit_symbol,
369 \c!height=\ht\b_scrn_field_fit_symbol,
370 \c!depth=\dp\b_scrn_field_fit_symbol,
371 #settings]}
372 \endgroup
373 \fi}
374
375
376
377\installcorenamespace{fieldlabel}
378\installcorenamespace{fieldcontent}
379\installcorenamespace{fieldtotal}
380
381\installparameterhandler \??fieldlabel {fieldlabelframed}
382\installparameterhandler \??fieldcontent {fieldcontentframed}
383\installparameterhandler \??fieldtotal {fieldtotalframed}
384
385\installparametersethandler \??fieldcontent {fieldcontentframed}
386
387\installsetuphandler \??fieldlabel {fieldlabelframed}
388\installsetuphandler \??fieldcontent {fieldcontentframed}
389\installsetuphandler \??fieldtotal {fieldtotalframed}
390
391\installinheritedframed {fieldlabelframed}
392\installinheritedframed {fieldcontentframed}
393\installinheritedframed {fieldtotalframed}
394
395\setupfieldcontentframed
396 [\c!align=\v!flushleft,
397 \c!strut=\v!no,
398 \s!parent=\??regularframed]
399
400\setupfieldcontentframed
401 [\c!alternative=\v!normal,
402 \c!type=\v!line,
403 \c!width=5em,
404 \c!height=\lineheight,
405 \c!depth=\zeropoint,
406 \c!align=\v!flushleft,
407 \c!option=\v!printable,
408 \c!n=1024]
409
410\setupfieldlabelframed
411 [\c!style=,
412 \c!color=,
413 \c!align=\v!flushleft,
414 \s!parent=\??regularframed]
415
416\setupfieldtotalframed
417 [
418 \c!strut=\v!no,
419 \c!align=,
420 \s!parent=\??regularframed]
421
422
423
424\permanent\tolerant\protected\def\setupfield[#tag]#spacer[#variant]#spacer[#S#totalsettings]#spacer[#S#labelsettings]#spacer[#S#fieldsettings]
425 {\ifarguments\or\or
426 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#variant]
427 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal]
428 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel]
429 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#variant]
430 \or
431 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#totalsettings]
432 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal,\c!alternative={#variant}]
433 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel]
434 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#totalsettings]
435 \or
436 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#labelsettings]
437 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal,\c!alternative={#variant},#totalsettings]
438 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel]
439 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#labelsettings]
440 \or
441 \definefieldcategory[#tag][\s!parent=\??fieldcontent#tag,#fieldsettings]
442 \setupfieldtotalframed [#tag][\s!parent=\??fieldtotal,\c!alternative={#variant},#totalsettings]
443 \setupfieldlabelframed [#tag][\s!parent=\??fieldlabel,#labelsettings]
444 \setupfieldcontentframed[#tag][\s!parent=\??fieldcontent,#fieldsettings]
445 \fi}
446
447\permanent\tolerant\protected\def\setupfields[#variant]#spacer[#S#totalsettings]#spacer[#S#labelsettings]#spacer[#S#fieldsettings]
448 {\ifarguments\or
449 \setupfieldtotalframed [#variant]
450 \or
451 \setupfieldtotalframed [#variant]
452 \setupfieldcontentframed[#totalsettings]
453 \or
454 \setupfieldtotalframed [#variant]
455 \setupfieldlabelframed [#totalsettings]
456 \setupfieldcontentframed[#labelsettings]
457 \or
458 \setupfieldtotalframed [\c!alternative={#variant},#totalsettings]
459 \setupfieldlabelframed [#labelsettings]
460 \setupfieldcontentframed[#fieldsettings]
461 \fi}
462
463
464
465\definefieldcategory [][\s!parent=\??fieldcontent]
466
467
468
469
470
471
472
473
474\def\scrn_field_load_scripts{\useJSscripts[fld]\glet\scrn_field_load_scripts\relax}
475
476\newconditional\fieldlabelshown
477\newconditional\fieldframeshown
478\newconditional\fieldisvertical
479\newconditional\fieldishorizontal
480
481\mutable\lettonothing\currentfieldtotalframed
482\mutable\lettonothing\currentfieldlabelframed
483\mutable\lettonothing\currentfieldcontentframed
484
485\mutable\lettonothing\fieldtotalframedparameterhash
486\mutable\lettonothing\fieldlabelframedparameterhash
487\mutable\lettonothing\fieldcontentframedparameterhash
488
489\permanent\tolerant\protected\def\field[#tag]#spacer[#label]
490 {\iflocation
491 \dontleavehmode
492 \begingroup
493 \scrn_field_load_scripts
494 \edef\currentfieldbody {#tag}
495 \edef\currentfieldlabel {#label}
496 \edef\currentfieldcategory{\clf_getfieldcategory{#tag}}
497 \ifempty\currentfieldlabel
498 \let\currentfieldlabel\currentfieldbody
499 \fi
500 \ifempty\currentfieldcategory
501 \setupfieldtotalframed [\currentfieldbody][\s!parent=\??fieldtotal]
502 \setupfieldlabelframed [\currentfieldbody][\s!parent=\??fieldlabel]
503 \setupfieldcontentframed[\currentfieldbody][\s!parent=\??fieldcontent]
504 \definefieldcategory [\currentfieldbody]
505 \setupfieldbody [\currentfieldbody][\c!category=\currentfieldbody]
506 \let\currentfieldcategory\currentfieldbody
507 \fi
508 \let\currentfieldtotalframed \currentfieldcategory
509 \let\currentfieldlabelframed \currentfieldcategory
510 \let\currentfieldcontentframed\currentfieldcategory
511 \scrn_field_analyze_setups
512 \ifconditional\fieldframeshown
513 \inheritedfieldtotalframedframed
514 \bgroup
515 \else
516 \vbox
517 \bgroup
518 \fi
519 \dontcomplain
520 \ifconditional\fieldlabelshown
521 \scrn_field_set_label_box
522 \fi
523 \scrn_field_set_content_box
524 \ifconditional\fieldlabelshown
525 \ifconditional\fieldisvertical
526 \scrn_field_flush_vertical
527 \else
528 \scrn_field_flush_horizontal
529 \fi
530 \else
531 \scrn_field_flush_content
532 \fi
533 \egroup
534 \endgroup
535 \fi}
536
537
538
539\newbox\b_scrn_field_label
540\newbox\b_scrn_field_content
541
542
543
544\def\scrn_field_set_label_box
545 {\setbox\b_scrn_field_label\hbox
546 {\reshapeframeboxtrue
547 \inheritedfieldlabelframedframed{\currentfieldlabel}}}
548
549
550
551
552\def\scrn_field_set_content_box
553 {\setbox\b_scrn_field_content\hbox
554 {\reshapeframeboxtrue
555 \ifempty{\fieldcontentframedparameter\c!height}
556 \ifconditional\fieldisvertical
557 \setfieldcontentframedparameter\c!height{6ex}
558 \orelse\ifconditional\fieldishorizontal
559 \setfieldcontentframedparameter\c!height{\vsize}
560 \else
561 \setfieldcontentframedparameter\c!height{2cm}
562 \fi
563 \fi
564 \ifempty{\fieldcontentframedparameter\c!width}
565 \ifconditional\fieldisvertical
566 \setfieldcontentframedparameter\c!width{\hsize}
567 \orelse\ifconditional\fieldishorizontal
568 \setfieldcontentframedparameter\c!width{20em}
569 \else
570 \setfieldcontentframedparameter\c!width{2cm}
571 \fi
572 \fi
573 \inheritedfieldcontentframedframed
574 {\fieldbody
575 [\currentfieldbody]
576 [\c!width=\framedwidth,\c!height=\framedheight]}}}
577
578
579\def\scrn_field_flush_vertical
580 {\vbox
581 {\copy\b_scrn_field_label
582 \fieldtotalframedparameter\c!inbetween
583 \copy\b_scrn_field_content}}
584
585\def\scrn_field_flush_horizontal
586 {\hbox
587 {\vbox \ifdim\ht\b_scrn_field_content>\ht\b_scrn_field_label to \ht\b_scrn_field_content \fi
588 {\fieldtotalframedparameter\c!before
589 \copy\b_scrn_field_label
590 \fieldtotalframedparameter\c!after}
591 \hskip{\fieldtotalframedparameter\c!distance}
592 \vbox \ifdim\ht\b_scrn_field_label>\ht\b_scrn_field_content to \ht\b_scrn_field_label \fi
593 {\fieldtotalframedparameter\c!before
594 \box\b_scrn_field_content
595 \fieldtotalframedparameter\c!after}}}
596
597\def\scrn_field_flush_content
598 {\box\b_scrn_field_content}
599
600
601
602\def\scrn_field_analyze_setups
603 {\fieldlabelshown\conditionalfalse
604 \fieldframeshown\conditionalfalse
605 \fieldishorizontal\conditionalfalse
606 \fieldisvertical\conditionalfalse
607 \normalexpanded{\processallactionsinset[\fieldtotalframedparameter\c!alternative]}
608 [ \v!reset=>\fieldlabelshown\conditionalfalse
609 \fieldframeshown\conditionalfalse
610 \fieldishorizontal\conditionalfalse
611 \fieldisvertical\conditionalfalse,
612 \v!label=>\fieldlabelshown\conditionaltrue,
613 \v!frame=>\fieldframeshown\conditionaltrue,
614 \v!horizontal=>\fieldishorizontal\conditionaltrue,
615 \v!vertical=>\fieldisvertical\conditionaltrue]
616 \ifconditional\fieldisvertical
617 \setupfieldtotalframed[\c!distance=\zeropoint,\c!inbetween=\vskip\d_framed_local_offset,\c!align=\v!right,\c!width=20em]
618 \orelse\ifconditional\fieldishorizontal
619 \setupfieldtotalframed[\c!distance=\d_framed_local_offset,\c!inbetween=,\c!align=\c!left,\c!height=10ex]
620 \else
621 \setupfieldtotalframed[\c!distance=\zeropoint,\c!inbetween=,\c!align=\c!left]
622 \fi
623 \setupfieldtotalframed[\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=]}
624
625
626
627\newinteger\c_scrn_field_system_n
628
629\permanent\def\currentsystemfield{sys::\the\c_scrn_field_system_n}
630
631\permanent\protected\def\nextsystemfield
632 {\global\advanceby\c_scrn_field_system_n\plusone}
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647\newbox \b_scrn_tooltip_anchor
648\newbox \b_scrn_tooltip_text
649\newinteger\c_scrn_tooltip_n
650
651\installcorenamespace{tooltip}
652
653\installframedcommandhandler \??tooltip {tooltip} \??tooltip
654
655\setuptooltip
656 [\c!location=\v!right,
657 \c!frame=\v!off,
658 \c!offset=.1ex,
659 \c!background=\v!color,
660 \c!backgroundcolor=gray]
661
662\appendtoks
663 \frozen\instance\protected\edefcsname\currenttooltip\endcsname{\scrn_tooltip_direct{\currenttooltip}}
664\to \everydefinetooltip
665
666\protected\def\scrn_tooltip_direct#tag
667 {\cdef\currenttooltip{#tag}
668 \iflocation
669 \expandafter\scrn_tooltip_indeed
670 \else
671 \expandafter\scrn_tooltip_ignore
672 \fi}
673
674\tolerant\def\scrn_tooltip_ignore[#S#settings]#:#anchortext#tiptext
675 {#anchortext}
676
677\mutable\lettonothing\currenttooltipname
678
679\tolerant\def\scrn_tooltip_indeed[#S#settings]#:#anchortext#tiptext
680 {\dontleavehmode \hbox \bgroup
681 \dontcomplain
682 \global\advanceby\c_scrn_tooltip_n\plusone
683 \edef\currenttooltipname{tooltip:\the\c_scrn_tooltip_n}
684 \setbox\b_scrn_tooltip_anchor\hbox
685 {\strut#anchortext}
686 \doifelseassignment{#settings}
687 {\setupcurrenttooltip[#settings]}
688 {\setupcurrenttooltip[\c!location=#settings]}
689 \setbox\b_scrn_tooltip_text\hbox
690 {\resettooltipparameter\c!location
691 \inheritedtooltipframed{#tiptext}}
692 \definesymbol
693 [\currenttooltipname:txt]
694 [\copy\b_scrn_tooltip_text]
695 \definefieldbody
696 [\currenttooltipname:txt]
697 [\c!type=push,
698 \c!width=\wd\b_scrn_tooltip_text,
699 \c!height=\ht\b_scrn_tooltip_text,
700 \c!depth=\dp\b_scrn_tooltip_text,
701 \c!option=\v!hidden,
702 \c!values=\currenttooltipname:txt]
703 \setbox\b_scrn_tooltip_text\hbox
704 {\fieldbody[\currenttooltipname:txt]}
705 \setbox\b_scrn_tooltip_text\hbox
706 {\strut\lower{.25\exheight\ht\b_scrn_tooltip_text}\box\b_scrn_tooltip_text}
707 \edef\p_location{\tooltipparameter\c!location}
708 \ifx\p_location\v!left
709 \hsmashed{\hskip\wd\b_scrn_tooltip_anchor\llap{\box\b_scrn_tooltip_text}}
710 \orelse\ifx\p_location\v!middle
711 \hsmashed to \wd\b_scrn_tooltip_anchor{\hss\box\b_scrn_tooltip_text\hss}
712 \else
713 \hsmashed{\box\b_scrn_tooltip_text}
714 \fi
715 \definesymbol
716 [\currenttooltipname:but]
717 [\hphantom{\copy\b_scrn_tooltip_anchor}]
718 \definefieldbody
719 [\currenttooltipname:but]
720 [\c!type=push,
721 \c!regionin=action(show{\currenttooltipname:txt}),
722 \c!regionout=action(hide{\currenttooltipname:txt}),
723 \c!width=\wd\b_scrn_tooltip_anchor,
724 \c!height=\ht\b_scrn_tooltip_anchor,
725 \c!depth=\dp\b_scrn_tooltip_anchor]
726 \hsmashed{\fieldbody[\currenttooltipname:but]}
727 \egroup
728 #anchortext}
729
730\definetooltip[tooltip]
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749\installcorenamespace {fieldstack}
750
751\permanent\tolerant\protected\def\definefieldstack[#tag]#spacer[#symbols]#spacer[#S#settings]
752 {\ifcsname\??fieldstack#tag\endcsname
753
754 \else
755
756 \xdefcsname\??fieldstack#tag\endcsname{\scrn_fieldstack_construct[#tag][#symbols][\normalunexpanded{#settings}]}
757 \fi}
758
759\permanent\tolerant\protected\def\fieldstack[#tag]#spacer[#symbols]#spacer[#S#settings]
760 {\ifparameter#symbols\or
761 \definefieldstack[#tag][#symbols][#settings]
762 \fi
763 \csname\??fieldstack#tag\endcsname}
764
765\newbox\b_scrn_fieldstack_box
766
767\definesymbol[\s!empty][]
768
769\def\scrn_fieldstack_add#tag#settings#symbol
770 {\advanceby\scratchcounter\plusone
771 \edef\currentfieldstackname{#tag:\the\scratchcounter}
772 \ifnum\scratchcounter=\fieldcategoryparameter\c!start\relax
773 \definefieldbody[\currentfieldstackname][\c!type=check,\c!values={#symbol,\s!empty},\c!default={#symbol}]
774 \else
775 \definefieldbody[\currentfieldstackname][\c!type=check,\c!values={#symbol,\s!empty},\c!default=\s!empty]
776 \fi
777 \setbox\b_scrn_fieldstack_box\hbox{\symbol[#symbol]}
778 \setcollector
779 [fieldstack]
780 {\fieldbody
781 [\currentfieldstackname]
782 [\c!option={\v!readonly},
783 \c!width=\wd\b_scrn_fieldstack_box,
784 \c!height=\ht\b_scrn_fieldstack_box,
785 \c!depth=\dp\b_scrn_fieldstack_box,
786 #settings]}}
787
788\protected\def\scrn_fieldstack_construct[#tag][#symbols][#S#settings]
789 {\iflocation
790 \dontleavehmode
791 \begingroup
792 \setupfieldcategory[\c!start=1,#settings]
793 \scrn_field_load_scripts
794 \definecollector
795 [fieldstack]
796 [\c!corner=\v!middle,
797 \c!location=\v!middle]
798 \scratchcounter\zerocount
799 \processcommalist[#symbols]{\scrn_fieldstack_add{#tag}{#settings}}
800 \flushcollector[fieldstack]
801 \endgroup
802 \fi}
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818\newinteger\c_scrn_rollbutton_n
819
820\permanent\tolerant\protected\def\overlayrollbutton[#1]#*[#2]#;#=#=
821 {\iflocation
822 \bgroup
823 \global\advanceby\c_scrn_rollbutton_n_button\plusone
824 \global\advanceby\c_scrn_rollbutton_n_symbol\plusone
825 \definesymbol
826 [rollsymbol:\the\c_scrn_rollbutton_n_symbol]
827 [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]
828
829
830
831
832
833
834
835
836
837
838 \definefield
839 [rollbutton:\the\c_scrn_rollbutton_n_button][push][rollbutton]
840 [rollsymbol:\the\c_scrn_rollbutton_n_symbol]
841 \fitfield
842 [rollbutton:\the\c_scrn_rollbutton_n_button]
843 [\c!regionin={#1#3},\c!regionout={#2#4}]
844
845 \egroup
846 \fi}
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873\newinteger\c_scrn_pushbutton_n
874
875\permanent\tolerant\protected\def\definepushbutton[#tag]#spacer[#S#settings]
876 {\scrn_pushbutton_define_variant{#tag}{n}{push}
877 \scrn_pushbutton_define_variant{#tag}{r}{\symbol[pushsymbol:#tag:n]}
878 \scrn_pushbutton_define_variant{#tag}{d}{\symbol[pushsymbol:#tag:r]}
879 \setvalue{pushbutton:#tag}{\scrn_pushbutton_handle{#tag}{#settings}}}
880
881\def\scrn_pushbutton_define_variant#tag#variant#content
882 {\doifelsesymboldefined{pushsymbol:#tag:#variant}
883 \donothing
884 {\definesymbol[pushsymbol:#tag:#variant][{#content}]}}
885
886\def\scrn_pushbutton_handle#tag#settings#reference
887 {\bgroup
888 \global\advanceby\c_scrn_pushbutton_n\plusone
889 \setupfield
890 [pushbutton]
891 [\c!frame=\v!overlay,
892 \c!offset=\v!overlay,
893 \c!clickout={#reference},
894 #settings]
895 \definefield
896 [pushbutton:\the\c_scrn_pushbutton_n]
897 [push]
898 [pushbutton]
899 [pushsymbol:#tag:n,pushsymbol:#tag:r,pushsymbol:#tag:d]
900 \fitfield
901 [pushbutton:\the\c_scrn_pushbutton_n]
902 \egroup}
903
904\permanent\tolerant\protected\def\definepushsymbol[#tag]#spacer[#variant]
905 {\definesymbol[pushsymbol:#tag:#variant]}
906
907\permanent\tolerant\def\pushbutton[#tag]#spacer[#variant]
908 {\executeifdefined{pushbutton:#tag}\gobbleoneargument{#variant}}
909
910
911
912\permanent\permanent\protected\def\scrn_menu_psh_start[#reference]#text\stoppsh
913 {\starttxt\pushbutton[\currentinteractionmenu][#reference]\stoptxt}
914
915\permanent\permanent\protected\def\scrn_menu_psh_direct[#reference]#text\\
916 {\scrn_menu_psh_start[#reference]\stoprob}
917
918\aliased\let\startpsh\relax
919\aliased\let\stoppsh \relax
920\aliased\let\psh \relax
921
922\appendtoks
923 \enforced\let\startpsh\scrn_menu_psh_start
924 \enforced\let\stoppsh \relax
925 \enforced\let\psh \scrn_menu_psh_direct
926\to \everysetmenucommands
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950\definepalet
951 [rollover]
952 [n=red,
953 r=green,
954 d=blue]
955
956\newinteger\c_scrn_rollbutton_n_button
957\newinteger\c_scrn_rollbutton_n_symbol
958
959\permanent\def\lastrollbuttonindex{\the\c_scrn_rollbutton_n_button}
960
961\setupfield
962 [rollbutton]
963 [\c!frame=\v!off,
964 \c!offset=\v!overlay]
965
966\let\scrn_rollbutton_symbol\relax
967
968\def\scrn_rollbutton_symbol_m
969 {\scrn_rollbutton_symbol_indeed
970 \interactionmenuparameter
971 \inheritedinteractionmenuframed
972 \setinteractionmenuparameter
973 \useinteractionmenustyleandcolor}
974
975\def\scrn_rollbutton_symbol_b
976 {\scrn_rollbutton_symbol_indeed
977 \buttonparameter
978 \inheritedbuttonframed
979 \setbuttonparameter
980 \usebuttonstyleandcolor}
981
982\permanent\tolerant\protected\def\rollbutton[#tag]#spacer[#S#settings]#:#text[#reference]
983 {\dontleavehmode
984 \bgroup
985 \global\advanceby\c_scrn_rollbutton_n_button\plusone
986 \global\advanceby\c_scrn_rollbutton_n_symbol\plusone
987 \ifparameter#tag\or
988 \ifparameter#settings\or
989 \edef\currentinteractionmenu{#tag}
990 \setupcurrentinteractionmenu[#settings]
991 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_m
992 \orelse\ifhastok={#tag}
993 \lettonothing\currentbutton
994 \setupcurrentbutton[#tag]
995 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_b
996 \else
997 \edef\currentinteractionmenu{#tag}
998 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_m
999 \fi
1000 \else
1001 \let\scrn_rollbutton_symbol\scrn_rollbutton_symbol_b
1002 \fi
1003
1004 \definesymbol[rollsymbol:\the\c_scrn_rollbutton_n_symbol:n][\scrn_rollbutton_symbol{n}{#text}]
1005 \definesymbol[rollsymbol:\the\c_scrn_rollbutton_n_symbol:r][\scrn_rollbutton_symbol{r}{#text}]
1006 \definesymbol[rollsymbol:\the\c_scrn_rollbutton_n_symbol:d][\scrn_rollbutton_symbol{d}{#text}]
1007 \definefield
1008 [rollbutton:\the\c_scrn_rollbutton_n_button][push][rollbutton]
1009 [rollsymbol:\the\c_scrn_rollbutton_n_symbol:n,
1010 rollsymbol:\the\c_scrn_rollbutton_n_symbol:r,
1011 rollsymbol:\the\c_scrn_rollbutton_n_symbol:d]
1012 \fitfield
1013 [rollbutton:\the\c_scrn_rollbutton_n_button]
1014 [\c!clickout={#reference}]
1015 \egroup}
1016
1017\protected\def\scrn_rollbutton_symbol_indeed#getparameter#inheritedframed#setparameter#usestyleandcolor#what#text
1018 {\definecolor[rollover][rollover:#what]
1019 \ifcstok{#getparameter\c!alternative}\v!hidden
1020 \expandafter\phantom
1021 \else
1022 \expandafter\hbox
1023 \fi
1024 \bgroup
1025 #setparameter\c!framecolor {rollover}
1026 #setparameter\c!backgroundcolor{rollover}
1027 #setparameter\c!color {rollover}
1028 #inheritedframed{#usestyleandcolor\c!style\c!color{#text}}
1029 \egroup}
1030
1031
1032
1033\permanent\protected\def\scrn_menu_rob_start[#reference]#text\stoprob
1034 {\starttxt\rollbutton[\currentinteractionmenu]{\ignorespaces#text\unskip}[#reference]\stoptxt}
1035
1036\permanent\protected\def\scrn_menu_rob_direct[#reference]#text\\
1037 {\scrn_menu_rob_start[#reference]#text\stoprob}
1038
1039\aliased\let\startrob\relax
1040\aliased\let\stoprob \relax
1041\aliased\let\rob \relax
1042
1043\appendtoks
1044 \enforced\let\startrob\scrn_menu_rob_start
1045 \enforced\let\stoprob \relax
1046 \enforced\let\rob \scrn_menu_rob_direct
1047\to \everysetmenucommands
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076\protect \endinput
1077 |