\begindata{text,538607584} \textdsversion{12} \template{default} \define{global } \majorheading{Adew Reference Manual } \italic{\center{For Adew version 5.0 Release of October, 1991} } \center{\italic{Thomas Neuendorffer Information Technology Center Carnegie Mellon University 5000 Forbes Ave. Pittsburgh, Pa. 15213 (412) 268-6108 tpn@andrew.cmu.edu}} Adew provides a way for programmers to write ATK applications without the large learning curve involved in writing new insets. It does this by providing the \italic{Arbcon} to allow a programmer to create applications by pasting together a number of existing insets into an application, and Createcon to write a prototype controller in C which can then be modified to 'glue' the separate pieces into an application. The basic procedure involved is described in two other documents ( \italic{ADEW,A Multimedia Interface Builder for Andrew} and \italic{Tutorial on ADEW, The Andrew Development Environment Workbench}). The purpose of this document is provide more details of the Adew system and to outline some of the object methods that a programmer can call from a createcon created controller, to aid in gluing together an application. A main goal of Adew is to allow the casual programmer to piece together complex applications out of some basic building blocks provided by the system. This paper will discuss the use of these blocks. This document accompanies the version of Adew that is being shipped with the X11 R5 tape. It includes documentation of many new Adew features includeing: \indent{The interactive creation of Atk insets. Support for permenant application-specific data. New style buttons, switches etc. Color support. Support for different style on different display types. The automatic updateing of old Adew applications to support new features.} In regard to the later, it should be noted that old Adew applications will get an automatic 'facelift' when compiled and run using the latest code. It is hoped that most people will prefer the new motif-style interface. For those who prefer the old style buttons and switches, they are included on the tape in atk/value/value.R4 and may be used to replace the new value directory if desired. Because of the name conflicts, you need to chose one or the other to compile. \begindata{bp,539644360} \enddata{bp,539644360} \view{bpv,539644360,1388,0,0} \chapter{1 The Arbcon} \center{\ \begindata{raster,539697032} 2 0 68266 68266 0 0 502 304 bits 539697032 502 304 ZZZHfc | d5/55/55/55,55 5c | ea/aa/aa/aa,aa ac | d5/55/55/55,55 efZZZG8c | d7ZZZG8c | efZZZG8c | d7ZZZG8c | efZZZG8c | d7ZZZG8c | efZZZG8c | d7ZZZG8c | efZZZG8c | d7ZZZG8c | efJe783c0999f c3Gfe7fGefbfK d7Jc399cf999f Gfe7fG!dfK8c | eff860Hdb9ccf Gf0e1!930cccH d7f33cH999ccf Ge64c939264cc eff339H999cc0 cc99326649H99 d7f03bH819ccf c099320649H81 ef!f3H3c9ccfe6 9c727e49H3c39 d7f327H3c99cf Ge64c9c726733 eff860H3c83c0 Gf0e19ef30f33 d7ZGf3LcfXfdS efZGf3KfccfXf9 d7ZGf3Kfe1fXf3 efZZZG8c | d7ZZZG8c | efZZZG8c | d7ZZZG8c | efZZZG8c | d7ZZZG8c | efZZZG8c | d0zzzg0c | e0zzzg0c | c0zzzg0c | e0o03ZZfep1c | e2(222380zy0e e0(888780zy0e ea(222b80zy0e e0(888780zy0e e2(222b80t078c e0(888780t0cc4 ea(222b80t0844 e0(888780t1027 e2(222b80t1024 e0(888780t1024 ea(222b80t0844 4c | Ge013Hfe0fI3f 8c | Ge7f3Hfce7I3f 983fGc9H03L9f f3Je7f9K9f3fG 939fGc9H39L9f Kc3f9K9f3fG99 999fGe7930fGfc db213870c9H8e d9bfGe79267Gfe H99g932644H8e c93fGe09267H8c 1993e64cH8432 c93fGe79207Hc4 3993e64cH9532 7fGe7927fGfce4 93e64cH9138G3e e67fGe79267Gfc H3c3893264cH9b e67fGe7930fGfe H3c393870ccH9b 8c | S8c | S8c | e61c324327b392 27!3f0c927fGef 3cc990191338f1 273f3e64047fG cf919f333e3326 7f3fe4667fGea 0c139f337f1320 7f3f04e67fGdf f9939f33739327 64e67fGeabbaf e4c99399327391 38G9864e47fGdd 0e1c43c3327832 3cGc310f27fGef 70c9H390e4c3f baeeafI8c | 2649H3864899f d7577577I8c | 49H03e4c99fGe7 bbabbbI8c | 49H3f04c81fGe7 d77757I8c | c9H3e64c9He7cf bfI8c | 2649H3e64899f d7"777fG8c | 70c9H3f124c3f baefafbbbfG8c | )223c | 08(88dc | a2(223c | 08(88dc | 10h01c740w0e)22 j82x0e08(88dc | h40g44x0ea2(22 3186f01844c676 92494060284924 93c84180284f35 92084060384815 3c | 3c | d8u0e08(88dc | 86u0e)223c | 8180t0e08(88dc | 06u0ea2(223c | e0(888780t0cc4 93294018104c9a 18u0e08(88dc | e2(222b80t0787 11c630g10e712 v0e)223c | e0(888780v10zh 0e08(88dc | ea(222b80v10zh 0ea2(223c | e0(888780v20zh 0e08(88dc | e2(222b80zy0e )223c | e0(8887ZZfe08 (88dc | ea(222bZZfea2 (223c | e0(8887zz0608 (88dc | e2(222b/22/22'22 2e)223c | e0(888708/88/88&88 9608(88dc | ea(222ba2!222a /aa/aa#aaaea2 (223c | e0(888708!88d5 /55/55#551608 (88dc | e2(222b"2220zv 2e)223c | e0(888708!88c0 zv1608(88dc | ea!2274222362 26!222ba2!2220 zvaea2!222724 e0!888c888928 8a!888708!88c0 zv1608!888a08 e2!22a42223#22 2b2a!aa20zv2e )223c | e0!8868eb312b 0e!8887155554 c0zv1608!888a ea!223a964b24 b2!222baa22!20 zvaea2"222492 e0!888c84c92f 92!888710!88c0 zv1608!888a8c e2!22!a44b2432 !222b2a!2220i 18h08he380zk2e e0!88cc94c92e d2!888710!88c0 i08k41zl1608!88 ea!22b86e33f3 8d!222baa22!20 i08k22zlaea2!22 e0!88g!80h0888 8710!88c0g0199 8b630798cb0c22 dc | e2(222b2a!2220 h924924824924 9214zl2e)223c | e0(888710!88c0 hb1c9278248e4 9214zl1608(88 ea(222baa22!20 ha24924024924 921czlaea2(22 e0(888710!88c0 h624926424924 9208zl1608(88 e2(222b2a!2220 h41bcd3839cde cc08zl2e)223c | e0(888710!88c0 k02zp1608(88dc | ea(222baa22!20 k02zpaea2(223c | e0(888710!88c0 k07zp1608(88dc | e2(222b2a!2220 zv2e)223c | e0(888710!88c0 zv1608(88dc | ea(222baa22!20 zvaea2(223c | e0(888710!88c0 i18i08g38e0zk 1608(88dc | e2(222b2a!2220 i08k1040zk2e)22 3c | e0(888710!88c0 i08h08h0880zk 1608(88dc | ea(222baa22!20 g01998b6301df 7ac3c880zkaea2 e0(888710!88c0 h9249248248c9 2485zl1608(88 e2(222b2a!2220 hb1c927830889 2485zl2e)223c | e0(888710!88c0 ha24924gc88927 07zl1608(88dc | ea(222baa22!20 h624926424889 2202zlaea2(22 e0(888710!88c0 h41bcd38387df b382zl1608(88 e2(222b2a!2220 n0440zl2e)223c | e0(888710!88c0 n0440zl1608(88 dc | ea(222baa22!20 n0380zlaea2(22 3c | e0(888710!88c0 zv1608(88dc | e2(222b2a!2220 zv2e)223c | e5(555710!88c0 zv16)555c | ea(aaabaa22!20 i18l071czjae)aa bc | f5(555710hc0i 08l0208zj17)55 5c | 26#223c | 8a#88dc | 8d6ac8"88dc | 82"223c | 9308"88dc | #2224b2a2"223c | 8aac9248"88dc | 27efda62"223c | zl1608"88h#88 dc | 3c | dc | (223c | dc | 3c | dc | ea(aaab2a222a 20i08i20g0201 f0(8883108890 c0g01998b6301 ea(222ba82228 20h9249248249 f0(8883109590 c0hb1c92783c9 ea(2223"2a20h a2492402092208 f0(888310!90c0 h624926432923 ea(222ba8!2820 h41bcd381dd99 f0(8883108890 c0zv1708(889c | ea(22232a222a 20zv2ea2(223c | f0(8883115550 c0zv1708(889c | ea(222b!aaa820 zvaea2(221c | f0(888310!88c0 zv1708(889c | ea(22232a!2220 zv2ea2(223c | f0(888310!88c0 i18m038ezi1708 ea(222baa22!20 i08m0104ziaea2 f0(888310!88c0 i08j10g01g88zi ea(22232a!2220 g01998b6305b0 f0(888310!88c0 h924924824924 ea(222baa22!20 hb1c9278249e4 f0(888310!88c0 ha24924024904 ea(22232a!2220 h624926424994 f0(888310!88c0 h41bcd3876cee ea(222baa22!20 zvaea2(221c | f0(888310!88c0 zv1708(889c | ea(22232a!2220 zv2ea2(223c | f0(888310!88c0 zv1708(889c | ea!2232e2!222c !222baa22!20zv f0!889848!8884 !888310!88c0zv ea!223a42!2224 !22232a!2220i $223c | f0!8894ceddb0 cc!888310!88c0 119db0"889c | ea!223249324b 24!222baa22!20 b249#221c | f0!8892c922c8 ec!888310!88c0 08!888c93cd68 "889c | ea!22314b224b 24!22232a!2220 !2224520542"22 3c | f0!8890c92ac9 2c!888310!88c0 !888cb32e#889c | ea!223a46776c de!222baa22!20 !222e11c4a2"22 1c | f0!88808880h!88 8310!88c0h6249 "889c | ea(22232a!2220 h41bcd381bf32 f0(888310!88c0 zv1708(889c | ea(222baa22!20 zvaea2(221c | f0(888310!88c0 zv1708(889c | ea(22232a!2220 zv2ea2(223c | f0(888310!88c0 zv1708(889c | ea(222baa22!20 zvaea2(221c | f0(888310!88c0 i18h03zo1708(88 ea(22232a!2220 i08h01zo2ea2(22 f0(888310!88c0 i08h01g11zm17 10zj2e)aabc | 96799677d910zj 224c9230a0zjae 23c8c220a0zj17 3220e0zj2ea2(22 28922040zj1708 dce1f040zjaea2 1708(889c | a2(221c | 08(889c | 3c | (889c | (221c | (889c | (221c | 1708(889c | cb3ccb3bec88zi 9126491850zi17 91e4611050ziae 9104191070zi17 9194491020zi2e ccee70f820zi17 2ea2(223c | 08(889c | a2(221c | 08(889c | a2(223c | 08(889c | aea2!222c3a$22 1708!888690$88 18h320619g1c70 1c | 9c | zj2ea2!222632 i08h100208g08 20zj1708!888d i08h100208g84 40zjaea2!2224 g01998b630196 324b1de440zj17 h92492482524a 89248280zj2ea2 hb1c927821243 09308280zj1708 ha24924021242 890c8380zjaea2 2642524a492481 zk1708!88!80!08 7fb861zk2ea2(22 3c | 9c | 3c | 08(889c | ea(222baa22!20 g01998b6305b1 f0(888310!88c0 h924924824924 ea(22232a!2220 hb1c927824924 f0(888310!88c0 ha24924024924 ea(222baa22!20 h624926424924 f0(888310!88c0 h41bcd3876dc3 ea(22232a!2220 zv2ea2(223c | f0(888310!88c0 zv1708(889c | ea(222ba8!8820 zvaea2(221c | f0(888310hc0zv 1708(889c | ea(2223"2220zv 2ea2(223c | f0(888308!88c0 zv1708(889c | ea(222ba2!2220 zvaea2(221c | f0(888308!88c0 zv1708(889c | ea(2223/22/22'22 2ea2(223c | f0o0308!88c0zv 17p1c | e8(888ba2/22/22&22 2e)889c | e0o0315/55/55&55 56p1c | Q2a/aa/aa&aaaf Pfc | ZZZHfc | e8(888b/88/88/88"88 8c | e0o07zzq1c | e2(222b/22/22/22"22 2c | e0(888708!88d5 /55/55.551c | ea(222ba2!222a /aa/aa.aaac | e0(888708!88c0 zzm1c | e2(222b"2220zzm 2c | e0(888708!88c0 zzm1c | ea(222ba2!2220 zzmac | e0(8887155554 c0zzm1c | e2(222b2a!aa20 zzm2c | e0(888710!88c0 zzm1c | ea(222baa22!20 zzmac | e0(888710!88c0 i1cnf38fi01ce e2(222b2a!2220 i0cj20h806106 e0(888710hc0i 0cj60g01806206 ea(222ba8!8820 g039bcfb3c007 7833316c6004z ac | e0(8887108890 c0g01966db660 b6cc1249249004 z1c | e2(222b2a222a 20hd1edb7e7cf fc163924f004z 2c | e0(8887108890 c0hf66db6g0c1b 1449248004z1c | ea(222ba82228 20h666df7200e e40c4924c804z ac | e0"888fa8#8887 108890c0h63be c477b77808379a 700ez1c | e2"222c622a"22 2b2a222a20zm40 e0"8898a8#8887 108890c0zme0y ea"22322cde"22 2ba8222820zk07 e0"88908448"88 87108890c0zl03 e2"2232244a"22 2b2a222a20zl03 e0"88908cc8"88 87108890c0zzm cdbfccb330zjae 91124920zj1708 91124960zj2ea2 91124940zj1708 911248c0zjaea2 4cccec80zj1708 a2(221c | (889c | (223c | (889c | (221c | (889c | j03h04z1c | h04ge4j01h0cz h0cge4j01h14z bef3db3ff63206 2c | 1c | f8f3degb47b6c 0cdb666d659a32 066d966cgb4cd db67ec79981c06 6de7ecg9c3db6 660c3d981c066c f60cg9ccdb6c0 5b672c4d980806 6d372c608ccdb6 dbc007bbb3de78 fc080fefe3c661 y2c | 1c | e1f0yac | f8y1c | b8y2c | 1c | ea"223a244a"22 2ba83b2820i03 e0"888ccec8"88 87109490c0h02 e2"22278366"22 2b2a222a20h06 e0#88!08"8887 108090c0hGdf!f8 ea(222ba82228 20g01966b6d90 e0(8887108890 c0g01e6636d90 e2(222b2a222a 20hf6636de07b e0(8887108890 c0g0136636cc0 ea(222ba82228 20g01e3f7eef0 e0(8887108890 c0j0198g08zy1c | e2(222b2a222a 20j0198g38zy2c | e0(8887108890 c0kf0g30zy1c | ea(222ba82228 20zzmac | e0(8887108890 c0zzm1c | e2(222b2a222a 20zzm2c | e0(8887108890 c0i03g01c0g38 ea(222ba82228 20h0203hc0g18 e0(8887108890 c0h06ic0g18j18 e2(222b2a222a 20hGdf!f8f1e3 e0(8887108890 c0g01966b6d90 1c | ea(222ba82228 20g01e6636d90 e0(8887108890 c0hf6636de0db e2(222b2a222a 20g0136636cc0 e0(8887108890 c0g01e3f7eef0 ea(aaaba82228 20j0198i33zwac | e5(5557108890 c0j0198i33zw1c | e0o032a222a20 kf0i1ezw2c | Q108890c0zzm1c | Qa8222820zzmac | e0o03108890c0 zzm1c | e2(22232a222a 20i03h70k01c0 e0(8887108890 c0h0203hd0lc0 ea(222ba82228 20h06ic0lc0hc0 e0(8887108890 c0hGdff8f9e7b6 e2(222b2a222a 20g01966b6d90 e0(8887115550 c0g01e6636d90 ea(222b!aaa820 hf6636de0ccd8 e0(888710!88c0 g0136636cc0cc e2(222b2a!2220 g01e3f7eef1e7 e0(888710!88c0 j0198h0198zw1c | ea(222baa22!20 j0198h0198zwac | e0(888710!88c0 kf0if0zw1c | e2(222b2a!2220 zzm2c | e0(888710!88c0 zzm1c | ea(222baa22!20 zzmac | e0(888710!88c0 g0380g01c001c0 e2(222b2a!2220 g0180hc0gc068 e0(888710!88c0 g0180hc0gc060 ea(222baa22!20 g019e!f8f1e3d9 e0(888710!88c0 g01b36d90db36 e2(222b2a!2220 g01b36d90db36 e0"88f4$888710 !88c0g01b36de0 ea!22238c$222b aa22!20g01b36c i01c00380zvac | 03h01gc00440zv 1c | i03gc0g40zv2c | 7fb3cfg40zv1c | cb32d9!80zvac | f332df81zw1c | 1ad802zw2c | 9b1cdc8440zv1c | f18def07c0zvac | j38h38zp1c | j18h18zpac | h18zp1c | d99fb3ddfc7801 db365b32d66db6 e799ed80zn2c | d8032cdb3680zn d8f61e32c66db6 361b3cc66db6d8 db375998c66fb6 b1dbb9dfe3c6f7 d9f30cdb36zoac | 030cdb36zo1c | d803acdb36zo2c | 6c01c7bdefzo1c | g01c0zp2c | hc0zp1c | zpac | 78fd9eefe3c00f ccdacd96b36db6 ccd8fd96336db6 c1e6336db6c018 d8e4c6337db6c0 bc78G1e37bb60 3ccf6czo1c | c01966d9b4zo2c | cf9866d9b0zo1c | 66d9b0zoac | 1d66d9b0zo1c | 0e3def78zo2c | 38i0ch40c0zp1c | g10g0chc3zq2c | g30i0142zq1c | f3df7801fdf3c0 d9666db0032d36 d9666db1f3cc67 db36cd666db001 c0db36ce666db0 4780zpac | 6044c0zp1c | e04440zp2c | ecc6g4440zp1c | 026d97204640zp ac | e0!888b04$8887 10!88c0g03deee 1c | e2"2224736772 !222b2a!2220i e0!888a88d9b2 20!888710!88c0 ea#228b12"222b a8!8820jf0h18 e0!888a888911 48!888710hc0zzm e2!222324ab33 42!222b"2220zzm e0!888988d9b0 "888708!88c0zzm ea"22f27363a2 !222ba2!2220zzm e0"88g810908!88 8708!88c0zzm1c | e2#222325"222b /22/22/22"222c | e0#888b8e08!88 8708!88c0zzm1c | ea#22!20"222b a2/22/22/22!22 e0(888715/55/55/55!55 5c | e2(222b2a/aa/aa/aa!aa ac | e0(8887ZZQfc | ea(222b/88/88/88"88 9c | e0(888780zzp1c | e2(222ba2/22/22/22!22 3c | e0(8887/88'88 f4/88)88dc | ea(222b82/22&22 cc/22)223c | e0(8887/88'88 84/88)88dc | e2(222ba2/22&22 c073bbc2/22&22 e0(8887/88'88 70c91228/88&88 ea(222b82/22&22 1a1b33e2/22&22 e0(8887/88'88 84e8a208/88&88 e2(222ba2/22&22 a48aa2/22'223c | e0(8887/88'88 ccc84b10/88&88 ea(222b82/22&22 b87441e2/22&22 e0(8887/88'88 g808808/88&88 e2(222ba2/22/22/22!22 3c | e5(555795/55/55/55!55 5c | ea(aaab/aa/aa/aa"aa bc | e0o0380zzp1c | ZZZHfc | ZZZHfc | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | c0zzzg0c | f0b1e366f3ddd8 0198h04zy2c | i0198h1czy1c | zyac | 1c | 2c | 1c | ac | 2c | 3c dc 3c dc | | | | dc | 3c | dc | 03dff3c0e380zp c0zzzg0c | c0zzzg0c | ZZZHfc | ZZZHfc | \enddata{raster, 539697032} \view{rasterview,539697032,1389,0,0}} \center{ }This is an approxamation of the look of the arbcon. Depending on your scrollbar preferences, your menu preferences, etc. what you see may be somewhat different, but the functionality will be the same. As stated in the Overview document, the Arbcon serves several functions. \indent{1. It is an inset generator that can place an instance of any type of inset into the cut-buffer. 2. It is as an editor for inset attributes. 3. It can cut or copy insets from existing ADEW applications or templates. 4. It can copy links to existing insets, allowing the user to paste in new views on existing data objects. } \section{1.1 Creating the Arbcon} There are two basic ways to bring up Arbcon. program. One is to run the arb \bold{arb filename} This will bring up an Arbcon and the named file (the filename is optional). The second is to add the following lines in your .ezinit file. \bold{addmenu arbcon-Create "Arbcon,Arbcon" textview addmenu arbcon-Create "Arbcon,Arbcon" lsetview } This would provide a menu option to add an Arbcon at any time when you are editing text or lset files. \section{1.2 Arbcon Functions } The use of most of the following is outlined in the Tutorial document, which should be referred to for examples. \subsection{1.2.1 Creating an application window} \paragraph{1.2.1.1 New Window} In addition to using the arb command described above, one can click on the desired object or object view pair in the Object <View> list, and then chose the\italic{ New Window} option on the Arbcon menu. One will then be prompted for the file name to open. If the named file does not already exist, a new file will be created of the type of the desired object. \subsection{1.2.2 Adding a new child object to an application }A click on a desired object or object view pair in the Object <View> list will place a cel initialized to that object into the cut-buffer. This object may then be pasted into the desired application using the applications paste command. \subsection{1.2.3 Adding a child object with it's application layer }After clicking on the desired object, a click on the Application/Normal switch will add this information to the cel in the cut buffer. The application layer refers to additional views that a view may deem useful when it is being used as an application. Typically, it refers to the addition of one or more scroll bars. \subsection{1.2.4 Selecting a child object }When an object is pasted into an application, it also becomes the selected object whose attributes are displayed in the editing window of the Arbcon. Clicking on an existing object will also cause it to become the selected object. Note however, this applies only to objects inserted with an arbcon in the first place. This is because the arbcon inserts objects surrounded with a cel/celview inset that allows the arbcon to function. \paragraph{1.2.4.1 Show Cels }Alternately, the \italic{Show Cels} menu option will display a list of all of the cels in the same namespace as the current cel. Clicking on a cel name in this list will cause it to become the current child object. \subsection{1.2.5 Creating a new link to a child object }With a child selected, a click on the Link/New switch will place a link to that object into the cut-buffer. This may then be pasted into the application. Links can not span windows, however. \subsection{1.2.6 Creating a new link with as different view type} After selecting a child and clicking on the Link/New switch, a click on a Object <View> pair, with the same dataobject as the child, will modify the viewtype of the link in the cut buffer. \subsection{1.2.7 Editing the child's attributes }The attributes of the current child may be edited in the arbcon edit window. The attribute names are displayed in bold, while their values are in plain type. One can move from on attribute to the next via the enter key. After the last attribute, the enter key will prompt for confirmation of the changes. Another enter will confirm the changes and modify the child. Alternately, clicking on the \bold{Save} button at the bottom of the edit window will save the current attributes. See Values below. \subsection{1.2.8 Removing a child object }The Cut button (displaying scissors) can be used to cut the selected child from an application. Alternately, the Cut menu option on the Arbcon menu will do the same thing. \subsection{1.2.9 Moving a child object }When a child object is cut, a copy of it is placed in the cut buffer. It can then be moved by a cut, followed by a paste in the desired location. \subsection{1.2.10 Copying a child object }The Copy button will place a copy of an object into the cut-buffer. At this point it can then be pasted into another location. \subsection{1.2.11 Changing the current directory }The Adew menu card has a Change Directory menu option. It will prompt for a new directory. \subsection{1.2.12 Creating a controller object }A dummy controller object may be created via the Create Controller option on the Adew menu card. Alternately, the createcon program may be run. This controller is a template from which new application may be easily created. For details, see the next section on Createcon. \subsection{1.2.13 Adding a new object to the view list }The Add Object menu on the Arbcon menu will prompt for a new object to add. If an object/view pair is desired (where the view is not the default view for that object), both the object and the view names should be specified, separated be a space. Also , see the preference options below. \subsection{1.2.14 The Value Window }The \italic{Init Value Window} menu option will bring up a window containing examples of the currently available valueview objects (switches, buttons, etc.). These may then be copied into an application with the copy button. Also , see the preference options below. \subsection{1.2.15 Preference options }The following preferences may be set in the Arbcon users preference file. \paragraph{1.2.15.1 ValueFile:filename }Allows the specification of an alternate file to be displayed by the \italic{Init Value Window} menu option. Any Arbcon created file may be used. The default is $ANDREWDIR/lib/arbiters/vallist. \paragraph{1.2.15.2 ObViewList: <list of object> }Allows the specification of an alternate list of objects and views for inclusion in the Object <View> list, i.e. the list of objects that can be created with the arbcon. \paragraph{1.2.15.3 ObViewFile: <filename> } Like above, this option allows the specification of an alternate list of objects and views for inclusion in the Object <View> list. The above provides the list directly, while this specifies a filename to read the list from. The default list is currently included in ANDREWDIR/lib/arbiters/viewlist. \paragraph{1.2.15.4 IgnoreDefaultViewlist:<TRUE or FALSE> }If true, only the user specified ObViewList above will be used. If false, the objects in the ObViewList will be added to those shown by default. The default is FALSE. \begindata{bp,539670984} \enddata{bp,539670984} \view{bpv,539670984,1390,0,0} \chapter{2 Values} Values are simple dataobjects designed to hold a long integer, a string and/or string array, and support a variety of observers, each of which may provide a routine to be called when the value's data changes. In general, interaction with the valueviews are all done with the value methods. \section{2.1 Programmer interface} \subsection{2.1.1 Basic Routines } \bold{long value_GetValue}(self) \bold{value_SetValue}(self,long rock) \indent{Gets or sets the value primary value} \bold{char *value_GetString}(self) \bold{value_SetString}(self,char *rock) \indent{Gets or sets a string pointer. Note, value does not copy this data, rock must be a NULL terminated string in static memory. } \bold{char **value_GetStringArray}(self) \bold{value_SetStringArray}(self,char **rock) \indent{Gets or sets an array or string pointer. Note, value does not copy this data, rock must be a pointer to an array of NULL terminated strings in static memory.} \bold{long value_GetArraySize}(self) \bold{value_SetArraySize}(self,long rock) \indent{Gets or sets the array size parameter to rock. Notes how many entries are in the string array.} \bold{value_SetStrArrayAndSize}(self,char **rock,size) \leftindent{Sets both the string array and it's size w/ one call and producing only one call back.} \subsection{2.1.2 Advanced Routines } \bold{value_AddCallBackObserver}(self, struct basicobject * observer, procedure callBack, long rock ); \indent{Sets up a call back procedure. When a value's contents changes, the procedure \italic{callBack} will be called, with the following arguments callBack(observer,self (the value object), rock, flag) where flag is one of the values defined in value.h. Controller objects created by createcon use this call to set up the call back procedures automatically. } \bold{value_RemoveCallBackObserver}(self, struct basicobject * observer ); \indent{Removes the call back. } \bold{value_SetNotify}(self,boolean val) \indent{Sets a flag to indicate if observers will be notified when one of the above set methods are called. Can be used to turn off notification temporarily when changing several of the above parameters at once. Care should be taken, however to make sure that val is reset to TRUE. } \begindata{bp,539671048} \enddata{bp,539671048} \view{bpv,539671048,1391,0,0} \chapter{3 Valueviews } Valueviews are a collection of views that may be associated with the value object and will display them in a variety of ways. They prompt up the view tree for a set of attributes for detailed information on how they should display their values (i.e. the range of a bargraph or the label on a button). Currently, the cel is responsible for maintaining this information, which may be edited and saved via the Arbcon. Some valueviews allow the input of new values, others are readonly. By convention, valueview names end in a capitol V. Valueviews that allow input are, in general, up-click sensitive. By down-clicking and moving the slider switch, one will see its displayed value change, but it is only on the up-click that this change is reflected in the value object and observers are notified. The latest release of many of these objects have been based on the new sbutton object, that provides a variety of look and feel options, while retaining the same attributes and interface specs as previous versions. The setting of color is also now supported on color displays. \section{3.1 Attributes } The following section will provide an overview of the attributes that are settable for the various valueviews. Note that most attributes are applicable to multiple valueviews, though only the applicable attributes are setable for any given valueview. Attributes are settable via the arbcon when the application is being created, for details on this , see the Adew tutorial paper. \subsection{3.1.1 Style}\center{ }The buttonv mbuttonv, controlv, onoffv, and fourwayv views now call common code to pesent buttons on the screen in various configurations. These buttons may be drawn in a variety of styles as illustrated by the mbuttonv views in the Buttons section below. The style is controlled by the \italic{style} attribute which, like other attributes, may be set by the application author via the arbcon when the application is being created. The default style is the motif-ish style 4. Because the stipiling that occurs on a monochrome screen when using the styles two and four can make the text less readable, it is possible to set the monochrome screen seperately. To do this, prefix the style attribute with a 'C' to indicate the style for color displays, and an M to indicate style for monochrome displays. example:\bold{ [string] style:} C=4 M=3 will result in displaying style 4 on color displays and style 3 on monochrome. The bargraphv and sliderv views currently support a more limitted set of styles, whose numbers correspond roughly with the button styles. Styles 1 and 3 may be preferable on monochrome displays. \subsection{3.1.2 Colors} The buttonv mbuttonv, controlv, onoffv, fourwayv, stringv, checkv, and thumbv views all support the setting of \italic{foreground-color} and \italic{background-color} attributes, where the foreground is the normal color for displaying the text, the background is the normal color for the button and shading is derived from the two. Simmilarly, the sliderv and bargraphv views support \italic{colors} and\italic{ shade-color} attributes, to indicate the color of the bars, and the color to use for shadeing. \paragraph{3.1.2.1 Important Note 1}: Best results (particularly for the motif-button style views) are usually achieved when the foreground is a light color and the background is dark. \paragraph{3.1.2.2 Important Note 2}: The color attributes for the button objects will be ignored on monochrome display's. This avoids the problems of unreadable stippled text. The color attributes of the bargraph and slider objects will be provide different stipple patterns for styles 2 and 4, and will be ignored for other styles, again to improve visibility. \subsection{3.1.3 Min - max values } Bargraphv, sliderv, and thumbwheelv all support min_value and max_value attributes to note the range of numbers each can handle. \subsection{3.1.4 Immediate update}\section{ } By default, the bargraph, slider, and thumbwheel views only update the underlieing value object when they are released. By setting the \italic{immediate-update} attribute to \italic{TRUE} , the application creator can specify that the controlled value should be updated immediatly while the control is being thumbed. \subsection{3.1.5 Read Only } Most valueviews allow interactive manipulation by the user of the application. The stringv view is always read-only. The slider and bargraph views have a setable \italic{readonly} attribute to indicate if they are for display only, or can be manipulated by the user. By default, the slider is not readonly, while the bargraph is readonly. \subsection{3.1.6 Fonts } The font for displaying labels is set by the \italic{bodyfont} and \italic{bodyfont-size} attributes. The default bodyfont is andytype and the default bodyfont size is 10. \subsection{3.1.7 Labels} The \italic{label} attribute provides the string to be displayed as a label for the object. The special cases are as follows. \paragraph{3.1.7.1 onoffv} The onoffv view has seperate \italic{top-label} and \italic{bottom-label} attributes. \paragraph{3.1.7.2 mbuttonv} The mbuttonv determines the number of buttons to display by the number of colon (:) seperated labels found in its \italic{label} attribute. Colons can be included in a label by prepending a '\\' (ie \\:). \paragraph{3.1.7.3 fourwayv and pianov }Like mbuttonv, the fourwayv and pianov labels buttons according to colon seperated labels. For backward compatibility, these are stored in the \italic{':' separated labels} attribute. The pianov labels the notes on the keyboard. \paragraph{3.1.7.4 stringv} The stringv normally displays the string portion of it's value object. Only if this is NULL is the \italic{label} attribute is displayed. \subsection{3.1.8 Placement } Specific to the mbuttonv view, this attribute specifies how the buttons are to be layed out. To specify a fixed number of columns or rows, on can specify a digit (1-9) followed by a 'C' or an 'R' for columns and rows respectively. If there are more labels than can fit in the specified number of columns or rows, then the additional buttons will be added in the opposite direction. I.E., if 2C was specified, and there are 6 labels, then the buttons will appear in 2 columns and 3 rows. A 'C' or an 'R' can be specified but not both. The other possible flag is either a 'T' or a 'B' A 'T' will indicate that that buttons will be filled topdown, a 'B' indicates a bottom-up arrangement. \subsection{3.1.9 Function, Class, and Auto-init }There attributes are specific to the controlv view, which will attempt to load the specified \italic{class} and call \italic{class}\italic{function} from its proctable when it's button is clicked and released. If \italic{auto-init} is TRUE, it will attempt to call the function the first time the view is displayed. This functionality was critical to earlier versions of Adew, as it provided a link between a set of views and a controlling application. See the other Adew documents and above for details. \subsection{3.1.10 Increment }Specific to the thumbwheel views, this attribute indicates how much to increment the value with each movement. \section{3.2 Button and Switch Views} \center{\ \begindata{raster,539697288} 2 0 102302 102302 0 0 418 103 bits 539697288 418 103 zzs | zzs | zzs | zzs | zzs | zzs | zzs | 0fS01Rc07fPfc 07Pf0g | 08l3fL01+22!40 j01Kf406$aa$88 0bLa0k0301$88 89$8889405fJfd 0bLa0k0301+22 405fJfdk1406)22 0bLa0k0301$88 8f$888f405fJfd 0bLa3Ke3012a#aa a52a#aaa5405f 0bc0j07a2k2301 85#555f85#555f 0bc0j07a2k2301 2a$aa2a$aa405f 0bc0j07a2k2301 85#555f85#555f 0bc0j07a2k2301 2a#aaa52a#aaa5 0bc0j07a2k2301 85#555f85#555f 0bc0j07a2k2301 2a$aa2a$aa405f 0bc0j07a2k2301 85#555f85#555f 0bc0j07a2k2301 2a#aaa52a#aaa5 0bc0j07a2k2301 85#555f85#555f 0bc0j07a2k2301 2a$aa2aab2a"aa 0bc0j07a2g04i 23018554!1055 g0fbb9cg140588 b970e888089f77 0bc0j07a2g04i 23012aa8h2aa5 041122g140622 44cb1220a22822 0bc0ge5c38007 a2g0fbb9cg2301 feedd83ffdg04 1522g140588cc 0bc00113244007 a2g041122g2301 feeddbGfdg0415 22g14062244ab 0bc0011227c007 a2g041522g2301 feeddbbffdg04 4a22g140588cc 0bc0011224g07 a2g041522g2301 G18cc7ffdg038a 1cg14062239cc 0bc00112244007 a2g044a22g2301 Jfdk14058880g 08880888g8088 0bc0ge7338007 a2g038a1cg2301 g | 0bc0j07a2k2301 85#555f85#555f 90g | k1405#5554k50 90g | k1405$8808#88 Jfdk1406#2220 405fJfdk1405$88 Jfdk1406)2290 405fJfdk1405$88 405fJfdk1406#22 405fJfdk1405$88 Jfdk1406)2290 405fJfdk1405$88 405fJfdk1406#22 405fJfdg04i14 405fJfdg04i14 5f8557eee7555f 388850g | 2aa90448aaa540 442290g | 85544010155f85 89f0880888aacc 2aa888802aaa2a 02!22!2a442290 85544111155f85 891088088894cc 2aa8g802aa52a e220a227343822 855410g555f85 50g | 2a$aa2a$aa405f 405fJfdk1405$88 g | 50g | a2#2290g | 08#8850g | g | 08#8850g | 20a2#2290g | 08#8850g | g | 08#8850g | 20a2#2290g | 05$8808#8850g | 06%222a"2290g | 405fG1a3c7ffd 5ffeecdbbffdg !5559955f405f 8850g | ab2d4a!aa405f g | 555299955f405f 8850g | aae2a72aa5405f 90g | 550410555f405f Jfdk1406)2290 08#8850g | 0bc0j07a2k2301 0bc0j07a2k2301 0bc0j07a2k2301 0bc0j07a2k2301 0bc0j07a2k2301 0bc0j07a2k2301 0bc0j07a2k2301 0bLa3Ke30185#55 0bLa0k030125$55 0bLa0k03019fK 0bLa0k03012a$aa 08l3fL01R!40j 0fS01+22407fP 0cl60k0301$88 0cl60k0301+22 0cl60k0301$88 0c7fJfc63Ke301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 a272"2290g | 0c40j0462k2301 890880"8850g | 0c4003i0462g38 a2"2290g | 0c4041i0462g40 03gf8e665c014 0c4041i0462g40 83g411222g1404 0c40f962e38704 60411107cf83g 0c404191044884 040803g411222 0c40411107cf84 4511044883g41 0c404111040804 3bbbc38703gf0 0c404511044884 140480h0809"08 0c403bbbc38704 90g | 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 0c40j0462k2301 2a#aaa52a#aaa5 85#555f85#555f 2a$aa2a$aa405f 85#555f85#555f 2a#aaa52a#aaa5 85#555f85#555f 2a$aa2a$aa405f 5f85#555f405f 25$55405fJfdk 9fK405fJfdk14 2a$aa405fJfdk 01Kf404k$5550 f404)8890g | 89$88894060j03 4060j03k1406)22 8f$888f4060j03 2a#aaa52a#aaa5 85#555f85#555f 2a$aa2a$aa4060 85#555f85#555f 2a#aaa52a#aaa5 85#555f85#555f 2a$aa2a$aa4060 85#555f85#555f 2aae"aaa52aae 405fJfdk1406#22 405fJfdk1405$88 Jfdk1406)2290 405fJfdk1405$88 405fJfdk1406#22 405fJfdk1405$88 Jfdk1406)2290 Jfdk1405$8808 1406#2220a2#22 05$8808#8850g | 1406$222a#aa90 g | 20a2#2290g | 08#8850g | g | 08#8850g | 20a2#2290g | 08#8850g | g | #8850g | 90g | k1404j01k50g | 90g | k1404#888908#88 4060j03k1404$22 4060j03k1404#88 j03k1406)2290 4060j03k1404#88 4060j03k1404$22 4060j03k1404#88 j03k1406)2290 4060j03k1404#88 "aaa5406003i03 50g | a2#2290g | 8908#8850g | g | 8908#8850g | a2#2290g | 8908#8850g | g | 8908#8850g | g38i140422c2"22 8592"555f8550 "555f406041i03 g40i14049048!88 i23012a$aa2ab2 #aa406041i03g 40i14063242#22 i230185f6d5d7 04bed8b8e9c909 i23012a832a08 1064431222a282 62gf8e665c023 411222g140490 62g411222g2301 g1406324443!02 62g411222g2301 1222g1404914c 62g411222g2301 e1d78014042eee 62g411222g2301 g0850g | 62gf0e1d78023 5e5f857e799975 f1cccb8850g | b1252a90c4aa82 24442290g | 018596665f9f5f ccc9f3e9088aac 2a!aaa830!2ab2 22a224442290g | 859a6659955f85 c912a9088aaccc 2a!77a72e252a f2e1c2a3e1c3af 85h10505f85!41 5f4060f962e387 012a$aa2a$aa40 60j03k1406)22 85#555f85#555f 2a#aaa52a#aaa5 85#555f85#555f 2a$aa2a$aa4060 85#555f85#555f 2a#aaa52a#aaa5 85#555f85#555f 2a$aa2a$aa4060 4060j03k1404#88 4060j03k1404$22 4060j03k1404#88 j03k1406)2290 4060j03k1404#88 4060j03k1404$22 4060j03k1404#88 j03k1406)2290 8908#8850g a2#2290g | 8908#8850g g | 8908#8850g a2#2290g | 8908#8850g g | g | a5406041910448 85!5599955f40 cc8850g | cc"aa40604111 !5599955f4060 8850g | bcb875eaa54060 2290g | g055f4060j03k | | | | 0c7fJfc63Ke301 85#555f85#555f 4060j03k1404#88 0cl60k030125$55 25$554060j03k 1404$22a2#2290 0cl60k03019fK 9fK4060j03k14 04#888908#8850 0cl60k03012a$aa 2a$aa4060j03k 1406$aa2a#aa90 0fS01R407fPf4 05)5550g | 08r!01r!40p!04 p10g | 0fS01Rc07fPfc 07Pf0g | zzs | zzs | zzs | zzs | zzs | l02h10p02h70o 08g01c0n04h60 j | k2002h10o2002 h88n8008g0220 m4004ha0j | k2002h30o2002 g0104n8008g04 10m4004ha0j | j3c7c121cg50n 3c7c121c0104m f1f048700410l j42241222g10n 42241222g04l01 08904888g20l84 j42!2241g10n42 !2241g08l0108 88890401c0l84 j60!2241g10n60 !2241g10l0180 888904g20lc0!44 j1821427fg10n 1821427fg60m60 8509fcg10l3042 j06214240g10n 06214240g80m18 8509g0410l0c42 j4221c241g10n 4221c24101m01 088709!0410l84 j42208222g10n 4220822201m01 088208880220l j3c18821cg10n 3c18821c01fcm f062087001c0l k01s01r04q02n | k01s01r04q02n | k06s06r18q0cn | zzs | \enddata{raster, 539697288} \view{rasterview,539697288,1392,0,0}} 8908#8850g | g | g | g | 78f824380120j | 4824440120j | !44820220j | 820220j | 84fe0420j | 848007f8j | 438482g20j | 84410444g20j | 78310438g20j | The following objects are all composed of one or more buttons, providing a variety of interfaces. For descriptions of the attributes listed below, see the Attributes section above. \subsection{ 3.2.1 The button view - buttonV }An SPST switch, that increments the value's primary value by one. [string] <foreground-color> () [string] <background-color> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <label> (Button) [string]<style>() \subsection{3.2.2 The multiple button view - mbuttonV } A single object that can support a series of buttons in a radio button mode (i.e. only one button may be pushed at a time). [string] <foreground-color> () [string] <background-color> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <label> (one:two:three:four) [string] <placement> (1C) [string]<style>() \subsection{3.2.3 The control button view - controlV } A subclass of buttonV, this valueview supports two special attributes \italic{class} and \italic{function}. Valid attributes are [string] <Auto-Init> () [string] <function> () [string] <class> () [string] <foreground-color> () [string] <background-color> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <label> (Button) [string]<style>() \subsection{3.2.4 The fourway switch view - fourwayV }This is a fourway switch, that sets the value's primary value to 0,1,2, or 3, starting with the upper left corner and going clockwise. Its attributes are [string] <foreground-color> () [string] <background-color> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <':' separated labels> (Four:way) [string]<style>() \subsection{3.2.5 The on-off switch view - onoffV }A two-way switch, which sets a value's primary value to 0 for down and 1 for up. its attributes are [string] <foreground-color> () [string] <background-color> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <top label> (switch) [string] <bottom label> (switch) [string]<style>() \section{3.3 Range Views - bargraphs thumbwheels and sliders. }The following views can be used for the entry and display numeric data. \section{\subsection{3.3.1 }\center{\ \begindata{raster,539697544} 2 0 72621 72621 0 0 333 152 bits 539697544 333 152 The slider switch view - sliderV } zzh | zzh | zzh | zzh | zzh | zzh | zzh | 03O80Oe03fNf8 02o!80n!20n!08 02o!80n!20n!08 02o!80n!20n!08 02o!80n!20n!08 02o!80n!20n!08 02o!80n!20n!08 02o!80n!20n!08 02o!80n!20n!08 02i03c6j!80if1 02i0209j!80i82 02i0209j!80i82 02i0389j!80ie2 02j49j!80i1240 02j49j!80i1240 02i0386j!80ie1 02o!80n!20n!08 02i7fGfci!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 0fNfeg | n02g | n02g | n02g | n02g | n02g | n02g | n02g | n02g | 80i!20i3c60i!08 40i!20i2090i!08 40i!20i2090i!08 40i!20i3890i!08 i!20i0490i!08 i!20i0490i!08 80i!20i3860i!08 n02g | 0a!aai!20h07H 1fGfci!20h04h 155554i!20h04 1fGf0i!20h04h 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 i0f18i02g i0824i02g i0824i02g i0e24i02g i0124i02g i0124i02g i0e18i02g | | | | | | | c0h!08h01!5540 40h!08i!aa80h h40h!08h01!44 40h!08i9111i02 h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h02g | 02g | 40h02g g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | | | | | | | | 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i5fGf4i!80h 02i5fGf4i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i58g34i!80h 02i5fGf4i!80h 02i5fGf4i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 02i40g04i!80h 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h05 1eaab0i!20h05 0aaaa4i!20h05 1fGd0i!20h05H 155544i!20h05 1fG10i!20h05H 0ab444i!20h05 1feb10i!20h05 155444i!20h05 1feb10i!20h05 0aa444i!20h05 1fd110i!20h05 15!44i!20h05H 1f1110i!20h05 0b5544i!20h05 1eaab0i!20h05 155544i!20h05 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0b5544i!20h04 1eaab0i!20h04 155544i!20h04 1eaab0i!20h04 0a!44i!20h04h 1d1110i!20h04 14!44i!20h04h !1110i!20h04h h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i H40h!08h01!44 H40h!08i80g80 H40h!08h010445 40h!08i911080 H40h!08h014445 40h!08i911080 H40h!08h010445 H40h!08i911080 H40h!08h014445 H40h!08i911080 H40h!08h010445 H40h!08i911080 40h!08h014445 H40h!08i911080 H40h!08h011555 H40h!08i!aa80 H40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i h40h!08h01!44 h40h!08i9111i 40h!08h01!44i h40h!08i80j02 40h!08h01!4440 40h!08n02g | 40h02g 02g | i02g | 02g | 40h02g h02g | i02g | h02g | 40h02g h02g | i02g | h02g | 40h02g h02g | i02g | h02g | 40h02g h02g | i02g | h02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | i02g | 02g | 40h02g 02g | 02g | g | h02g | | | | | | | | | | | | | | 02i40g04i!80n !20h07Hc0h!08 n02g | 02i7fGfci!80n !20n!08n02g | 02o!80n!20n!08 n02g | 02o!80n!20n!08 n02g | 02o!80n!20n!08 n02g | 02o!80n!20n!08 n02g | 02o!80n!20n!08 n02g | 02o!80n!20n!08 i1808i02g | 02o!80h01!80i !20i6020i!08i 08j02g | 02i0602j!80i80 j!20i20j!08i0e 18i02g | 02i02k!80ie180 i!20i3860i!08 i0908i02g | 02i0386j!80i90 80i!20i2420i!08 i0908i02g | 02i0242j!80i90 80i!20i2420i!08 i0908i02g | 02i0242j!80i90 80i!20i2420i!08 i1dbei02g | 02i0242j!80h01 dbe0i!20i76f8 i!08n02g | 02i076f80i!80 n!20n!08n02g | 02o!80n!20n08 0fNfeg | 02o80Oe03fNf8 q | 03O80zq | zzh | zzh | zzh | zzh | zzh | k20g01l01h38m 40g0en800180i | i02g20g01k1001 h44k04g40g11l 08g800280i | i02g20g03k1001 h82k04g40g2080 k08g800280i | h03c7c121c005 j1e3e090eg82j 078f8243802080 i | h042241222001 j21120911g02j 084482444001k h04!22241001j 21!11208004j08 !4448200ek10!88 h060222241001 j30!11208008j 0c0444482001k h01821427f001 j0c10a13f8030 j0304284fe0g80 i | i621424g01j03 10a120g40kc428 48g2080j018850 h04221c241001 j2110e120!80j 08443848!2080 i | h042208222001 j21104111g80j 084410444011k h03c18821c001 j1e0c410egfej 07831043800ek j10o80o20p40l | j10o80o20p40l | j60n03pc0o0180 l | zzh | zzh | zzh | zzh | zw08j | \enddata{raster, 539697544} \view{rasterview,539697544,1393,337,0} Slider options j0f1f04870480 108904888480i | 904880i | 180888904880i | j0608509fd080 901fe0i | j108870904080 10882088!80i | 0f062087g80i | } Used to set and display a value's primary value. Its attributes are [string] <foreground-color> () [string] <background-color> () [string] <immediate-update> () [string] <read-only> () [string] <color> () [string] <shade-color> () [long] <min_value> () [long] <max_value> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <label> (slider) [string]<style>() \subsection{ 3.3.2 The string display slider switch view - sliderstrV } A subclass of sliderV, this object will, by default, display in the same manner. However, if an external object has provided a string array to the value object., and the current value is between 0 and the array size, this slider will display that string instead on an integer at the top. Attributes are the same as sliderV. \subsection{3.3.3 The bargraph view - bargraphV} \center{\ \begindata{raster,539697800} 2 0 65536 65536 0 0 167 126 bits 539697800 167 126 zg | zg | zg | zg | zg | zg | 07O01Oc0 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04i078ci!01j47 04i0412i!01jc4 04i0412i!01i01 04i0712i!01i02 04j92i!01i03e1 04j92i!01j42j 04i070ci!01j42 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04h3fIe0g!01o 04h20i30g!01o 04h20i28g!01o 04h20i3cg!01o 04h20i36g!01h 04h20i3eg!01h 04h20i2ag!01h 04h20i3eg!01h 04h20i36g!01h 80i40 | 80i40 | 4080i40 | 41j40 | j40 | 40 | j40 | 40 | 40 | 40 | 40 | 04"4440h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 04h20i3eg!01h 04h20i2ag!01h 04h20i3eg!01h 04h20i36g!01h 04h20i3eg!01h 04h20i2ag!01h 04h20i3eg!01h 04h20i36g!01h 04h20i3eg!01h 04h20i2ag!01h 04h20i3eg!01h 04h20i36g!01h 04h20i3eg!01h 04h20i2ag!01h 04h20i3eg!01h 04h20i36g!01h 04h20i3eg!01h 04h20i2ag!01h 04h20i3eg!01h 04h20i36g!01h 04h3fIfeg!01h 04h15"555ag!01 04h0a"aaaeg!01 04h05"5556g!01 04h03Ifeg!01o 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04n!01o40 | 04i60j!01i18k 04i20j!01i08k 04i39b180h!01 04i249240h!01 04i249380h!01 04i2492i!01i09 04i7861c0h!01 04j40i!01j10j 04i0180i!01j60 07O01Oc0 | zg | zg | zg | zg | zg | k40g02l02h30i | i04g40g02k2002 i04g40g06k2002 h078f8243800a h084482444002 h08!44482002j h0c0444482002 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | 04#44h40 | 01"1118h40 | h04#44h40 | h0a"aaa8h40 | h05"5554h40 | 40 | 40 | 40 | i0e6c60i40 i092490i40 i0924e0i40 2480i40 | i1e1870i40 40 | j40 | | | | | h50i | h50i | j3c7c121cg90i | j42241222g90i | 42!22410110i | j60!22410110i | h0304284fe002 j1821427f0210 i | ic42848g02j06 21424003fci | h084438482002 j4221c241g10i | h084410444002 j42208222g10i | h078310438002 j3c18821cg10i | j20n01m | j20n01m | jc0n06m | zg | zg | \enddata{raster, 539697800} \view{rasterview,539697800,1394,0,0} Bargraph options } A view for displaying integers as a bargraph. It displays and edits the values primary value. Supports the following attributes. [string] <immediate-update> () [string] <read-only> () [string] <color> () [string] <shade-color> () [long] <min_value> () [long] <max_value> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <label> (bargraph) \subsection{3.3.4 The thumbwheel view - thumbV \begindata{raster,539698056} 2 0 136879 136879 0 0 79 78 bits 539698056 79 78 p | p | 3fNf8 | 20n08 | 20n08 | 20n08 | 20n08 | 20i03j08 | 20i0480i08 | 20i0480i08 | }\center{ 20i0480i08 | 20i0480i08 | 20i0480i08 | 20i03j08 | 20n08 | 20n08 | 20n08 | 20n08 | 20n08 | 20h7fHfch08 | 20h60h0ch08 | 20h5fHf4h08 | 20h4d!5564h08 | 20h4a!aaa4h08 | 20h4d400164h08 | 20h4a8ffea4h08 | 20h4d580d64h08 | 20h4a9ffea4h08 | 20h4d301d64h08 | 20h4a3ffea4h08 | 20h4d603d64h08 | 20h4a7ffea4h08 | 20h4cGfd64h08 | 20h48807ea4h08 | 20h4dGfd64h08 | 20h49g7ea4h08 | 20h4dGfd64h08 | 20h49g7ea4h08 | 20h4dGfd64h08 | 20h49Gfea4h08 | 20h4dg7d64h08 | 20h49Gfea4h08 | 20h4dg7d64h08 | 20h49Gfea4h08 | 20h4dg7d64h08 | 20h49Gfea4h08 | 20h4cGfd64h08 | 20h4a803ea4h08 | 20h4cGfd64h08 | 20h4a401ea4h08 | 20h4d7ffd64h08 | 20h4a300ea4h08 | 20h4d1ffd64h08 | 20h4a9ffea4h08 | 20h4d4ffd64h08 | 20h4aa002a4h08 | 20h4d!5564h08 | 20h4fHe4h08 | 20h50h14h08 | 20h70h1ch08 | 20h60h0ch08 | 20h7fHfch08 | 20n08 | 20n08 | 20n08 | 20n08 | 20n08 | 200180g6006h60 08 | 207c80g2002h20 08 | 2054e6da395b86 182008 | 20109255255249 242008 | 2010925525524e 382008 | 2010925524a248 !2008 | 2039d9b5f8a767 1cf808 | 20n08 | 20n08 | 3fNf8 | p | \enddata{raster, 539698056} \view{rasterview,539698056,1395,0,0} The Thumbwheel} Similar to the sliderV, the thumbwheel differs in that, 1. when it gets to the maximum value, it will cycle back to the minimum value and 2. It has an additional attribute to indicate what increment should be added to the number with each movement. [string] <foreground-color> () [string] <background-color> () [long] <increment> (10) [long] <min_value> (0) [long] <max_value> (100) [long] <bodyfont-size> (10) [string] <bodyfont> (andy) [string] <label> (Thumbwheel) \subsection{3.3.5 The string display thumbwheel view - thumbstrV } Like sliderstrV above, can display string values instead of numbers. See sliderstrV above for details. attributes are the the same as thumbV. \section{3.4 Views for text manipulation. }The following views provide for the entry and display if textual data. \subsection{ 3.4.1 The string entry view - enterstrV }\center{ \begindata{raster,539698312} 2 0 65536 65536 0 0 233 92 bits 539698312 233 92 zp | zp | zp | zp | zp | zp | zp | zp | ga2*2223ga2+22 h | g80q01g80q06h | g8a*aaabg+888a h | g95+55g82*2226 h | ga8q03ga8*888a h | g90q05g82*2226 h | g88q0bg+888ah | g90q05g82*2226 h | ga8q03ga8*888a h | g90G80l03h05g 82*2226h | g891280l01h0b g+888ah | g9011i10g02g02 h05g82*2226h | ga821c3019679 96efbc8386b803 g902124824922 49244482494805 g882129048924 8884450251200b g90424e071247 10488504921005 ga842588452d4 512a8604b2c803 g90e267039323 91c48404cd7005 g88q0bg#88feb9 8ce1b8"888ah | g90q05g82"22c2 33ac7fb2"2226 ga8q03ga8"88c8 b18ce030"888a g90q05g82"22c2 33ac6232"2226 g88q0bg#88c931 8cf0b0"888ah | g90q05g82"22c3 33aebb32"2226 ga8g0180c00cl 03ga8!8889G79 g90h804004l05 g82"22g02g2002 g88h!8004l0bg +888ah | g9161811ae188 l05g82*2226h | ga89241249248 l03ga8*888ah | g909441451488 l05g82*2226h | g892442491710 l0bg+888ah | g912c82cb2454 l05g82*2226h | ga9330135c388 l03ga8*888ah | g90q05g82*2226 h | g88q0bg+888ah | g90q05g82*2226 h | ga8!8889G08%88 g82"22c3&2226 g#88c9088c$88 g82"22c2222c$22 ga8"88c8f31f1e g82"22c237ac33 h | h | h | h | c71e78"888ah | "2226h | 8ah | h | 8ah | 26h | f6"888ah | 36"2226h | ga8q03g,aah | g90q05g95*5546 h | g88q0bg88q0ah | g90q05g90q06h | ga8q03ga8q2ah | g90q05g90q06h | g88q0bg88q0ah | g90q05g90G82j 60j06h | ga8q03ga91280 j20j2ah | g90q05g9011k20 j06h | g88q0bg8821c6 7032c301c618e0 h0ah g90q05g902122 90492482492520 h06h ga8q03ga82124 40892904514880 h2ah g90q05g904244 208a4e04917040 h06h g88q0bg884259 90925884b24520 h0ah g90q05g90e266 e06267034c39c0 h06h ga8q03ga8n08h 2ah | g90q05g90n1ch 06h | g88q0bg88n3eh 0ah | g90q05g90n7fh 06h | ga8q03ga8n77h 2ah | g90q05g90q06h | g88q0bg88q0ah | g90q05g90q06h | ga8q03ga8q2ah | g90q05g90q06h | g88q0bg88q0ah | g90q05g90q06h | ga8q03ga8q2ah | g90q05g90q06h | g88q0bg88q0ah | g90q05g90q06h | ga8q03gaa*222a h | g90q05g90q06h | g+888bg+888ah | g95+55g95*5556 h | g+aaabg,aah | g80q01g80q02h | gSgRfeh | zp | zp | zp | zp | zp | zp | zp | zp | zp | \enddata{raster, 539698312} \view{rasterview,539698312,1396,0,0} The enterstrv object, style 4. } | | | | | | This is a combination of a value object and a special sub-class of text. It is useful for allowing the user to input text on numbers. The value_SetString() function may be used to set the contents of the text area under the label. If the user wants to change the value, he may do so by clicking in that area and typing, backspacing, cutting, or pasting. Any change to the value string will cause it to be displayed in italic until the change is entered and confirmed by the user hitting the return key. Only then will the value's string value be set and observers notified. Other keystrokes that may be used by the user are ^U to clear out (but not change) the current contents, and ^G to redisplay the actual value. Valid attributes are [string] <foreground-color> () [string] <background-color> () [long] <bodyfont-size> () [string] <bodyfont> () [string] <label> (Enter) [string]<style>() \section{ 3.5 The string display view - stringV \center{\ \begindata{raster,539698568} 2 0 65536 65536 0 0 178 85 bits 539698568 178 85 zi | zi | zi | zi | zi | 0fZfeg | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | } 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08k38ge0g70h30 08k18g60g30h30 08k18g60g3002 08k18g60g3006 08k18786e1e31 08k18cc77!3366 08k18cc6361b3 08k181c637fb3 08k186c636031 08k18cc636030 08k18cc6370b2 08k18fc763b33 08k3c663c1e7a 08t83k02g | 08tc1k02g | 08te2k02g | 08t7ck02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | m02g | m02g | o02g | o02g | afbb73983ek02 1b31bccck02g | 261c31ccc4k02 8618318cc4k02 c618318ccck02 e618318c78k02 6618318c40k02 6758318c7ck02 c3bc7bce7fk02 g | g g g g g g g | | | | | | | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 08z02g | 0fZfeg | zi | zi | zi | zi | zi | \enddata{raster, 539698568} \view{rasterview,539698568,1397,0,0}} An output-only valueview for displaying an externally set string. If value_GetString() returns NULL, but value_GetStringArray() does not, it will index the array by value_GetValue() to find the string. If that also fails to produce a string, it will display the label attribute string. attributes are [long] <bodyfont-size> (10) [string] <bodyfont> (andy) [string] <label> (label string) [string] <foreground-color> () [string] <background-color> () \section{ 3.6 The click to enter strings view - clicklistV} \center{\ \begindata{raster,539698824} 2 0 65536 65536 0 0 354 161 bits 539698824 354 161 7fZZIc0 | f0zzi40 | 70zzi40 | f0zzi40 | 70zzi40 | f0v078c10h01c7 40y40 | 70v0cc4j82z40 | f0v0844h40g44 70v10273186f0 f0v1024924940 70v102493c841 f0v0844920840 70v0cc4932940 f0v078711c630 70x10zj40 | f0x10zj40 | 70x20zj40 | f0zzi40 | 7fZZIc0 | ZZJc0 | 60zzj | e2/22/22*22g | 60/88/88*8840 | ea!222a/aa/aa'aa 60!8885/55/55&55 e2!2228zy0280 | 60h44zz40 | e8!22a8zz80 | 60!8844zz40 | e2!22a8zy0280 | 60!8844zz40 | e822a2a8zz80 | 608d4844zz40 | e2!22a8i03h01 608c0844i01k08 e8!22a8i01k04 60!8844h33316c e2!22a8h124924 60!8844h163924 e8!aaa8h144924 61!5544h0c4924 e2!2228h08379a 60!8884l40zs40 | ea!2228l40zs80 | 60!8884le0zs40 | e2!aaa8zy0280 | 61!5504zz40 | ea!22a8zz80 | 61!8804i03i01 e2!2228i01k02 61!8804i01h01 ea!22a8h33316c 61!8804h124924 e2!2228h163924 61!8804h144924 ea!22a8h0c4924 61!8804h08379a e2!2228o88zo02 61!8804o88zp40 | ea!22a8o70zp80 | 61!8804zz40 | z40 | 1844c676d8w40 6028492486w40 80284f358180v 6038481506w40 18104c9a18w40 g10e712x40 | | | 40 | | | 80 | 5440 | h1c70zn0280 | 20zo40 | 40zo80 | 60f319618440zo 40 | 904924924280zn 0280 | f0491c924280zo 40 | 804924924380zo 80 | c849249241zp40 | 70739bd981zo02 80 | g071czo40 | 08zn0280 | h0110zo40 | 603bef587910zo 9049192490a0zo f061112490a0zn 80191124!e0zo c8491124!40zo !70fbf67040zo 80 | 80 | 40 | 0280 | 40 | 80 | 40 | e2!2228zy0280 | 61!8804zz40 | ea!22a8i03me3 61!8804i01m41 e2!2228i01i04 61!8804h33316c ea!22a8h124924 61!8804h163924 e2!2228h144924 61!8804h0c4924 ea!22a8h08379a 61!8804zz40 | e2!2228zy0280 | 61!8804zz40 | ea!22a8zz80 | 61!8804zz40 | e2!2228zy0280 | 61g0104i03n71 eaa222a8i01n20 61088904i01j02 62!2228h33316c 61088904h1249 eaa222a8h1639 610d4904h1449 6222a228h0c49 610c0904h0837 eaa082a8zz80 | 61088904zz40 | 62!2228zy0280 | 61088904zz40 | eaa222a8zz80 | 61088904zz40 | 622aaa28i03h06 61!5504i01h02 ea!22a8i01h02 61!8804h33316c 62!2228h124924 61!8804h163924 ea!22a8h144924 61!8804h0c4924 62!2228h08379a 61!8804zz40 | ea!22a8zz80 | 61!8804zz40 | 62!2228zy0280 | 61!8804zz40 | ea!22a8zz80 | 61!8804i03i60 62!2228i01i20 61!8804i01i20 ea!22a8h33316c 61!8804h124924 62!2228h163924 61!8804h144924 80zm80 | zn40 | h4022zm0280 | 6032cf32cefb22 90492449924614 f0792479184414 8041244106441c c8652465124408 703bb33b9c3e08 zn40 | zn80 | zn40 | zm0280 | zn40 | zn80 | c0zl40 | 80zl80 | h2011zm40 | 60b6196799677d 249049249224c9 24f0493c923c8c 24804920922083 24c84932923289 9a70ed9dd99dce 91zl0280 | 230azm40 | 220azm80 | 220ezm40 | 2204zl0280 | 1f04zm40 | 40c320038ezm02 g41g0104zn40 | g41g1088zn80 | 6032c64963bc88 904a4951249050 f0424861261050 80424851219070 c84a!49249020 7037e64ff70c20 zr40 | zq0280 | 0220zp40 | 60b639b7f99666 90492492224924 f049249222492c 80492492224928 80 | zn40 | zm0280 | zn40 | zn80 | zn40 | zm0280 | zn80 | zn40 | zm0280 | zn40 | ea!22a8h0c4924 c8492492224918 zn80 | 61!8804h08379a 70edb869999d90 zn40 | 62!2228zy0280 | 61!8804zz40 | ea!22a8zz80 | 61!8804zz40 | 62!2228zy0280 | 61!8804zz40 | ea!22a8i0c10zu 80 | 61!8804i04zv40 | 62!2228i0402zt 0280 | 61!8804h0cb737 9960zs40 | ea!22a8h126492 24c0zs80 | 61!8804h0e4492 3c80zs40 | 62!2228h124492 2080zr0280 | 61!8804h124492 3280zs40 | ea!22a8h0de739 9dc0zs80 | 61!8804zz40 | 62!2228zy0280 | 61!8804zz40 | ea!88a8zz80 | 60h04zz40 | 62!2228zy0280 | 60!8884zz40 | ea!2228zz80 | 60!8884h10g10 zu40 | 62!2228h3cc6fc zt0280 | 60h44h112290zu 40 | e8!22a8h11e110 zu80 | 60!8844h110110 zu40 | 62!22a8h119290 zt0280 | 60!8844h0ce6cc zu40 | e822a2a8zz80 | 608d4844zz40 | 62!22a8zy0280 | 608c0844zz40 | e8!22a8zz80 | 60!8844zz40 | 62!22a8zy0280 | 60!8844zz40 | e8!aaa8zz80 | 61!5544zz40 | 62!222a/22/22'22 80 | 60!8880zz40 | ea/22/22*2280 | 65/55/55*5540 | \enddata{raster, 539698824} \view{rasterview,539698824,1398,0,0}} This is a specialized valueview for presenting a list of strings to the user , and getting a callback when the user clicks on one of them. To use, set the string array of the value object to a string array of the desired choices ( this array must be in permanent storage) . When the user clicks on on of them, the string pointer will be set accordingly. So to set : ... static char vwlist[2]; vwlist[0] = "first"; vwlist[1] = "second"; value_SetStringArrayAndSize(valueob,vwlist,2); ... This will place the strings 'first' and 'second' on separate lines in the clicklist text area. When the user clicks on on of them , the string value of the value object will be set to the clicked on item . So in the call back routine, the code will be: result = value_GetString(valueob); Attributes are the same as stringV. \section{ 3.7 The multiple string entry view - menterstrV}\center{ }\center{ \begindata{raster,539699080} 2 0 65536 65536 0 0 447 146 bits 539699080 447 146 d5/55/55*557f Pfe | ZZUfe | d1/11/11/11%11 10 | c0zzt02 | c4/44/44/44&44 | c1!110a/aa/aa/aa"aa a2 | d4!44/55/55/55#55 54 | c1!1108zzq02 | c4!4450zzq04 | c1!1108zzq02 | d4!4450zzq14 | c2!aa88zzq02 | c5!5550zzq04 | c3111008zzq02 | d4444550zzq14 | c3111008i07n3c c4!4450i03j08 c2h08i03j18h60 d5!1150he6f3ec 01zj14 | c2111208h659b 2401zj02 | c4!4450h347b6d 01zj04 | c2111208h3d9b 2001zj02 | d5444550h199b 3201zj14 | c2111208h18ef 9c0380zi02 | c4!4450zm10zi c2111208zm38zi d5444550zk01f8 c2111208zmfezi c4!4450zmeezi c2111208zzq02 | d5444550jc0i70 c2111208i80c0 c4!4450h0180i c2111208h3ff7 d5444550h659a c2111208h7998 c4454450h3d98 c21b9208h4d98 d5450550h78fd c2181208k66g02 c4!4450k66g0e c2111208k3cg0c d5444550zzq14 | c2111208zzq02 | c4!4450zzq04 | c2111208jc0g70 d5444550i80c0 c2111208h0180 c4!4450h3ff7fe c2111208h659a d5444550h7998 c2111208h3d98 c4!4450h4d98db c2111208h78fd d5444550k66i0c c2111208k66i0c c4!4450k3ci07 c2111208zzq02 | d5444550zzq14 | c2111208zzq02 | c4!4450jc0g1c e3c0i7380jc0g h20184180g01g 188180g03g39k f001efbcf6cffd 01zj02 | 39k40g03zj04 | 40g05zj02 | 8c81be3cf7802d 1edb1e0ccc5b18 6d980336d99b59 668c819b659bg 2d336db3049249 f9f3f6d9fb1e66 07019b79fbg27 0f6dbf058e493c 6d800306d9830f 6607019b3d83g 27336db0051249 7dc80396d9cb13 6602019b4dcb18 23336db9031249 b6f001eeecf79e 3f0203fbf8f198 711dedde020de6 04 | 02 | 7czi14 | 02 | 04 | ge0zz14 | h40300110zz02 | c030g10zz04 | fe3e1fecf3c010 db6432ccb66020 db643cccb7e040 db781ec6b6g80 db3026c7372110 fbbc3c637bc1f0 zzi02 | zzi04 | zzi02 | g0ej0eh0ezt02 | g30g06j06h06zt h30g06j06h06zt 3e3c78f667ecf7 db6436cd96ccb5 db64363d878cb1 db7836cd86cf31 3036cdd666319b fbbc2c76ee77f8 c0zz14 | c0zz02 | 80zz04 | l70h70zt04 | zz02 zz14 zz02 zz04 zz02 zz14 | | | | | | 14 | 02 | 7f1eg79e67b60 9b6db6gcb36cd 9b6db67cc336cd 9b6db6gc336cd edb6geb36cd80 f1bddbg71ef7b zr04 | a0zr02 80zr14 80zr02 zr04 | c0zr02 | | | | c2111208i80c0 d5444550h0180 c2111208h3ff7 c4!4450h659adb c2111208h7998 d5444550h3d98 c2111208h4d98 c4!4450h78fdfb c2111208k66i66 d5444550k66i66 c2111208k3ci3c c4!4450zzq04 | c2111208zzq02 | d5444550zzq14 | c2111208he0h70 c4!4450h60h30 c2111208h60h30 d5444550h67be c2111208h6cdb c4!4450h6cdb64 c2111208h6cdb d5444550h6cdb c2111208hf7bb c4!4450j66h01 c2111208j66h07 d5444550j3ch06 c2111208zzq02 | c4!4450zzq04 | c2111208zzq02 | d5444550jc0g70 c2111208i80c0 c4!4450h0180h c2111208h3ff7 d5444550h659a c2111208h7998 c4!4450h3d98db c2111208h4d98 d5444550h78fd c22aaa08k66h01 c4555450k66h07 c3111008k3ch06 d4444550zzq14 | c3111008zzq02 | c4!4450zzq04 | c3111008zzq02 | d4444550zzq14 | c3111008zzq02 | c4!4450zzq04 | c3111008zzq02 | d4444550zzq14 | c3111008zzq02 | c4!4450zzq04 | c3111008zzq02 | d5!1150zzq14 | g34l30h30zt02 | h30l30h30zt14 | fe3e79ed9e3f67 643336b365acdb db6433363f658c db78333630798c db30333639318c bc79ef1e3fc78d zzg02 | zzg14 | zzg02 | g700ei03h1030 g301ag04g03h30 g3018g0cj5080 3e3c78f67cf7de 6436cdb6599b6c 36cdb6599b6c7c 7836cdb3599b6c 3036cdb3999b6c bc2c78d9bcf776 zzi04 | zzi02 | zzi14 | g700ej30zv14 | g30g301ag04h10 30g3018g0ch10 fe3e3c78f67cf7 db6436cdb6599b db6436cdb6599b 7836cdb3599b6c db3036cdb3999b fbbc2c78d9bcf7 k01zv02 | k02zv04 | k06zv02 | bbf8f003cf33db 6db00659b66dzs db6db3e619b66c db6db00619b66c df6db00759b66c eed8038f7bdezs zs02 04 | zs02 zs14 zs02 04 | zt02 | c0zt04 | zt02 | g7f7cf011e0zt 14 | gcb4d981130zt 02 | f319f81110zt04 | g7b31801110zt 02 | g9b65c81190zt 14 | gf7fcf038e0zt 02 | zv02 | zv04 | de06587660zu02 6c09249240zu14 6c072492c0zu02 09249280zu04 | 6c09249180zu02 7606f669zv14 | | | | | | | | | c0h08zzq02 | c4!4450zzq04 | c1!1108zzq02 | d4!4450zzq14 | c1!1108zzq02 | c4!4454/44/44/44#44 | c1!11zzr02 | d4/44/44/44&44 | ca/aa/aa/aa&aa | d5/55/55/55%55 54 | ZZUfe | f1/11/11/11%11 12 | e0zzt02 | e4/44/44/44%44 46 | e1/11(111e91/11*11 1a | f4/44(445984/44*44 46 | e1/11(111091/11*11 1a | e4/44(44580e77 78/44(4446 | e1/11(110e1922 45/11(111a | f4/44(44!4366 7c/44(4446 | e1/11(11109d14 41/11(111a | e4/44(44549154 /44)4446 | e1/11(11199909 62/11(111a | f4/44(44570e88 3c/44(4446 | e1/11(11g1011 01/11(111a | e4/44/44/44%44 46 | e2/aa/aa/aa&aa | f5/55/55/55%55 56 | e0zzt02 | ZZUfe | ZZUfe | \enddata{raster, 539699080} \view{rasterview,539699080,1399,0,0}} The menterstrV (for multiple enter string view) is a specialized object for displaying a list of strings and allowing the user to enter a response to each. When first displayed, this object will place the caret next to the end of the first item in the list, where the user can enter their response. List items will be in bold, user entries will not. Each time the user types 'return', the caret moves down to the end of the next item. After the last item, the user will be prompted to confirm the entries. When confirmed, the value callback routines will be called, with the string array set to the user responses. The user can also confirm an entry by clicking on the button at the bottom of the list. To use, the client sets the value string to a string, with the elements separated by newlines( '\\n' s). So to set : /* first clear the array, so the call back routine will know that nothing has been entered yet */ value_SetArraySize(val,0); /* Now zero the string as a signal to the object to clear out any current entries */ value_SetString(val,""); /* set the string with the two prompts */ value_SetString(val,"question 1\\nquestion 2\\n"); and in the callback char **foo,*resp1, *resp2; int size; size = value_GetArraySize(self->menterob); foo = value_GetStringArray(self->menterob) ; if(size == 2)\{ resp1 = foo[0]; resp2 = foo[1]; \} It is also possible to set default answers. This is done by inserting them in the prompt string following an '@'. So if one wanted to have default answers 'ans 1' and 'ans 2' in the above example, the value_SetString call would look like value_SetString(val,"question 1@ans 1\\nquestion 2@ans 2\\n"); these default answers will show up to the user in plain text and will be editable. An example of the menterstrV can be seen in the arbcon itself , where it is used for editing object resources. The illustration above was taken from an Arbcon. Attributes are the same as buttonV. \section{3.8 Misc views }\subsection{3.8.1 The piano keyboard view - pianoV }\center{\ \begindata{raster,539699336} 2 0 136533 136533 0 0 81 82 bits 539699336 81 82 q | q | q | q | 1fNfcg | 1fNfcg | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 18204408102048 110204g | 183fc7f8103fcf f1fe04g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1802g801004g80 2004g | 1fNfcg | q | q | q | \enddata{raster, 539699336} \view{rasterview,539699336,1400,87,0} }This is a somewhat specialized valueview for displaying one octave on a piano keyboard. Any number of keys may be depressed at a given time. The value is used as a bitmap to indicated depressed keys. Its attributes are [long] <bodyfont-size> (10) [string] <bodyfont> (andy) [string] <':' separated labels> (:c:#:d:#:e:f:#:g:#:a:#:b) \begindata{bp,539671752} \enddata{bp,539671752} \view{bpv,539671752,1401,0,0} \chapter{4 Substrates} In order to create an application, it is necessary to arrange the insets into one or more substrates, i.e. insets that can contain other insets. Adew support the use on any Atk inset with this capability as a substrate. This chapter provides a short overviews of some of the substrates available. \section{4.1 The Text inset } Adew makes it easy to create and get a handle on the basic objects of ATK (text , table, etc.) . The text object can be particularly useful, for presenting information to the user, as a generalized storage object for data, or as a substrate for containing other objects. Below I briefly list some useful text and textview methods. For more details, see the Atk documentation. \subsection{4.1.1 Text} The following deal with reading and writing a text object. text_Read(struct text *self,FILE *file, long id) returns long; text_Write(struct text *self,File *file, long writeid, int level) returns long; The following deal with inserting and deleting characters in text. text_Clear(struct text *self,); text_InsertCharacters(struct text *self,long pos, char *str, long len) returns boolean; /* FALSE if read-only */ text_AlwaysInsertCharacters(struct text *self,long position, char *string, long size); text_AddInCharacter(struct text *self,long pos, char c); not modify marks */ /* Does text_DeleteCharacters(struct text *self,long pos, long len) returns boolean; /* FALSE if read-only */ text_AlwaysDeleteCharacters(struct text *self,long position, long size); text_ReplaceCharacters(struct text *self,long pos, long len, char *repStr, long repLen) returns boolean; /* FALSE if read-only */ text_AlwaysReplaceCharacters(struct text *self,long pos, long len, char *repStr, long repLen); text_GetLength(struct text *self,) returns long; text_GetChar(struct text *self,long pos) returns long; The following attempt to provide the functionality of the C strings package for text text_CopyText(struct text *self,long pos, struct text *srctext, long srcpos, long len) returns boolean; /* FALSE if read-only */ text_AlwaysCopyText(struct text *self,long pos, struct text *srctext, long srcpos, len); text_Index(struct text *self,long pos, char c, long len) returns long; /* functions like the unix index() , but works on text in a range and returns -1 on failure*/ text_Strncmp(struct text *self,long pos, char *str, long len) returns int; text_Textncmp(struct text *self,long pos, struct text *text, long pos2, long len) returns int; The following functions deal with the read-only area of the text text_GetFence(struct text *self) mark_GetLength((self)->fence); text_SetFence(struct text *self,pos) mark_SetLength((self)->fence, pos); text_ClearFence(struct text *self) mark_SetLength((self)->fence, 0L); The following will insert a file into a text object text_AlwaysInsertFile(struct text *self,FILE * file,char *filename, long position) returns long; text_InsertFile(struct text *self,FILE * file,char *filename, long position) returns long; The following insert objects into text. text_InsertObject(struct text *self,long pos, char *dataobject_name,char *view_name) returns struct viewref *; text_AddView(struct text *self,long pos, char *viewtype, struct dataobject *dataobject) returns struct environment *; \subsection{4.1.2 Textview } The following deal with the current text selection. textview_SetDotPosition(struct text *self,long newPosition); textview_SetDotLength(struct text *self,long newLength); textview_GetDotPosition(struct text *self,) returns long; textview_GetDotLength(struct text *self,) returns long; The following deal with the visibility of the current text selection. textview_Visible(struct text *self,long pos) returns boolean; textview_FrameDot(struct text *self,long pos); \section{4.2 The Page Inset } The page inset was recently added to provide a general mechanism for allowing an application to switch between whole sections of switches, text, etc. under program control. Loosely based on code from Nathanial Borenstein's book \italic{The Andrew Toolkit, An Introduction}, the page object may contain any number of pasted in insets, and can switch between them under either user or program control. Since each inset can contain other insets, complex applications can be built up. \subsection{4.2.1 Inserting pages } Like other insets, pages may be inserted by pasting them in with the arbcon. When inserted , a new page will display with the phrase <No Objects>. The page menu (labeled \bold{Flip}, so as to not be confused with the text Page menus) will contain a paste option, and other objects (lset, text, etc.) may be copied from the arbcon and pasted in the page object. The \bold{Flip} menu is persistent, so that even when a subobject is active on a page, the application creator can paste in new objects, each of which will be added as a follow-on to it's predecessor. As new objects are added, the page menu grows, to contain the logical names of each of the subobjects that aren't currently being displayed. The user may bring up any of the hidden objects choosing the object name on the menu. The logical name of any object may set from the Arbcon, see the \italic{Tutorial on ADEW} for details. The objects may also be visited in order by using the \bold{Flip Page} menu option. \subsection{4.2.2 Programmer interface to page } The following methods and macromethods are defined by the page object. The methods below that take a position parameter, may either be given a positive long integer indicating which object (numbered 1 - n) , or one of the following macros \typewriter{macro page_CURRENT meaning The current object being displayed page_AFTERCURRENT The next object page_BEFORECURRENT The previous object page_ATEND The last object in the list page_ATBEGINING The first object in the list } \bold{page_GetPostMenus(self,) page_SetPostMenus(self,val) } The page object maintains a flag indicating whether or not it's view should be posting the menus described above. For many applications, it may be desirable to turn off the pages menus by calling page_SetPostMenus(self,FALSE); \bold{page_AddObject(self,struct dataobject *d, char *label, char *viewname,long position) returns boolean; }\leftindent{Adds a new object to the list of pages. Arguments are struct dataobject *d \leftindent{the dataobject itself; }char *label \leftindent{A label to be associated with the object. If the object is a cel, then this label should be an empty string as the page object will use the cel reference name. This name may be set via the Arbcon, or with the cel_SetRefName method. See below.} char *viewname \leftindent{Name of the type of view to be associated with the object. If NULL, the objects default view will be used. }long position \leftindent{Indicates what page to insert the object as. Typically, this will be one of the macros listed above. Future pages will Not be reserved. i.e. if an object is inserted as the 100th page in an inset that currently has only two pages, it will be inserted as the last (third) page. }} \bold{page_DeleteObject(self,struct dataobject *d) returns boolean; } Removes the page containing the given dataobject. \bold{page GetNowPlaying() returns struct dataobject *; } Gets a pointer to the current object. \bold{page_GetNowPlayingName(self) returns char *; } Gets the name of the current object \bold{page_SetNowPlaying(self,struct dataobject *d) returns boolean;} Given a dataobject, sets the current page. \bold{page_SetNowPlayingByName(self,char *name) returns boolean; } Given a reference name (i.e. label), sets the current page. \bold{page_SetNowPlayingByPosition(self,long position) returns boolean; } Given a position (or one of the macros above), sets the current page. \bold{page_GetPositionOfObject(self,struct dataobject *d) returns long; } Returns the position of a given object. (0 if not found). \bold{page_GetNameOfObject(self,struct dataobject *d) returns char *; } Returns the name of a given object. (NULL if not found). \bold{page_GetObjectAtPosition(self,long position) returns struct dataobject *;} Given a position (or one of the macros above), returns the object at that position. \bold{page_GetObjectByName(self,char *name) returns struct dataobject *; } Given a reference name (i.e. label), returns the object. \bold{page_GetObjectCount(self,) returns long; } Returns the number of pages in the inset. \section{ 4.3 Lset } Lset is a tool for building up a tree of views. It allows the user to start with an empty window and split it, either horizontally or vertically into two separate views, each of which may either be made to contain an inset , or split again. It is particularly adapted for use in creating applications with the cel and Arbcon objects. (It is, in fact, the object used to create the Arbcon. See the Arbcon documentation for details.) The lset indicates that it has the input focus by blacking out its rectangle. At that time, the following menu options become active for that rectangle. \subsection{4.3.1 Menu options. } \paragraph{4.3.1.1 split horizontal split vertical }\indent{Changes the cursor to horizontal bars (or vertical bars) and sets the mode to split the lset into two lsets at the position of the next hit. It is possible to change from vertical to horizontal mode before splitting the window. Clicking outside of the black rectangle will cause it to lose the input focus and exit this mode. Once split, the division between two lsets may be moved by clicking and dragging the mouse when one of the bar cursors appears. } \paragraph{4.3.1.2 Unsplit Lset } \indent{Undoes the split operation. Any object that may have been inserted in the other half of the split will be maintained. } \paragraph{4.3.1.3 Set cel } \indent{Inserts a cel inset in the lset, the cel is responsible for determining its own child, usually via an Arbcon (see Arbcon documentation).}\indent{ }\paragraph{4.3.1.4 Set Object } \indent{Can be used to set objects other than a cel in the lset, the name of the object will be prompted for.} \paragraph{4.3.1.5 Paste } \indent{Creates a child object and inserts the contents of the cut buffer. } \subsection{4.3.2 Notes. } It is not possible to split an lset that contains an inset. However, if one is using cels and the Arbcon to create the child insets, this effect may be achieved by selecting the child inset as the current celview, clicking on the cut button in the Arbcon to cut the cel, splitting the now empty lset as desired, and then using the paste operation to reinsert the cut cel in the desired location. Similarly, when creating applications, it is often useful to have one or two spare blank lsets that can be used as holding areas for previously created cels. Thus, if one wishes to exchange the location of two cels, one can cut out one of the cels, paste it in the holding area, cut the other and paste it in the old location of the first one, and finally cut the first one from the holding area to the old location of the second one. \subsection{4.3.3 Programmer interface } See the lpair documentation. \section{4.4 Layout } From the layout help file \indent{ \italic{Layout} and its companion \italic{layoutview} provide a way to lay out a combination of ATK objects in a single rectangle with arbitrary positions and sizes. Each object is given a fixed size and position. Overlapping objects will generally work, although there are a few cases of advanced graphic operations which are not properly handled. } To use layout to create an Adew application, you will want to use the\italic{ paste on create} authoring option. The mode of creation will then be to select the object in the Arbcon, and then create the rectangle in layout where that object is to be placed. Layout will then automatically paste the desired object in. It will be necessary to exit the Authoring mode in layout in order to click on created objects and enable the setting of the application attributes. For more information, see the layout help file. \begindata{bp,539690184} \enddata{bp,539690184} \view{bpv,539690184,1402,0,0} \chapter{5 Createcon - Creating Controllers} Once an application is prototyped by pasting together various insets, Createcon can be used to generate a controller class that can tie the different pieces into an application. Createcon generates C source code and a .ch file for the Class preprocessor. The object that is created will have pointers to all of the dataobjects and views in the application, callback procedures for all of the value objects, and observer links to all of the other objects. The generated code takes responsibility for making sure that these pointer and links are all established at run time. With this taken care of , the application programmer can often easily add code to get the objects to interact together as an application. Refer to the Tutorial document for a simple detailed example. An alternative to createcon is the use of the interactive Ness language, that allows the controller information to be embedded in the document itself. Please refer to the NESS documentation for further information. Createcon allow for changes to be made in the application. If the user decides to add another button, or change a slider to a thumbwheel, another run of createcon will update any existing controller source code and make it compatible with the new collection of objects. The generated source code contains many comments of the form. \example{/* user code begins here for outputCallBack */ /* user code ends here for outputCallBack */ } The application programmer should insure that all of his/her code is placed in the framework of these comments, as this allows Createcon to preserve this code in future versions. In addition to the needed .c and .ch files, Createcon will also generate a shell script called makefoo, where \bold{foo} is the name of the new application class to be generated or modified, and an Imakefile for generating the application. Running makefoo is usually all that needs to be done to generate the makefile and compile and build the dynamic object. Normally, the name of the class to generate is learned from an embedded controller button embedded in the application. Createcon can also take this information on it's command line. Applications without controller buttons, however, can only be run as stand-alone applications using \bold{Runadew} (see below). Adew applications with control buttons can be included in other objects, sent as mail message , etc. \section{5.1 Eliminating control buttons } Some early Adew users have complained about the necessity of including a control button in their application. The reason for this restriction was that the control button provides a link between the file containing the pieces of an application, and the controller class. This was particularly important where the application was included in a document that could contain numerous other applications, each of which could contain objects with conflicting names. In this case, the control button linked the controller in with the proper namespace. None the less, it was seen that in the common case of using Adew to create a stand-alone application, something could be done to eliminate the control button. This was accomplished by adding some new arguments to createcon, and creating runadew, a new application class that could replace ez for running Adew applications to provide the same facilities normally provided by the control button. \section{5.2 Creating Insets } The latest release of Adew also supports the dynamic creation of insets by createcon. In this case the resulting application consists of data-object and view code, rather than an object template, saved as a data stream, and an external controller. Application thus created can then be inserted in a text of other ATK substrate via the normal object insertion methods, rather then via a paste or insert-file. They may also be added to the list of objects insertable with the arbcon. They may also read and write object specific data, the code for doing so may be automatically generated (see below). In short, they are first class ATK objects. The -I flag to createcon will cause it to generate inset code (i.e. .c and .ch files for both a dataobject and a view), rather than controller code. In this case, the callback procedures and pointers will become part of the created view. In most cases, createcon will support the conversion of old application to insets. (see below). \section{ 5.3 Arguments } The current arguments to createcon are \italic{-O file }\indent{When given this argument, createcon will also output a shell script for running the application within runadew. } \italic{-T "title" }\indent{Only appropriate with the -O flag, this title will be added to the created shellscript and passed on to runadew for display in the title bar of the finished application. } \italic{-C class(:oldclassname) }\indent{Specifies the class to create. This must be provided if no control button is included in the source file, from which createcon normally gets this information.If an old classname is given, it will merge in the information from that file } \italic{-V Viewname(:oldviewname) }\indent{If -I is specified, -V can be used to specify the name of the view to create. By default, a 'v' will be appended to the dataobject name. If an old viewname is given, it will merge in the information from that file }\indent{ }\italic{-F function (defaults to 'go') }\indent{Specifies the class name of the initialization function to create in the class If a -C argument is present with no -F, 'go' is used as the default function name. If used w/ -I, classname_FunctionName will be used as the initialization method, which will default to classname_InitApp. }\italic{-I } \indent{Creates an inset rather than a controller. The callbacks and pointers will be placed in the view. The -C argument will specify the name of the dataobject to create. Control buttons are supported but unnecessary. } -W \indent{If -I is specified, -W will indicate that the datastream describing the object will be written when the file containing the object is saved. This is mainly for backward compatibility with applications that save information within their subobject's datatstream. } \italic{-M } \indent{Forces the creation of a new Imakefile, even if one already exists. The old Imakefile is moved to Imakefile.old } \italic{-Help }\indent{Prints help message. }\section{5.4 View / Controller methods }The following methods are created by createcon as part of the controllers or views it creates. The name foov will be replaced by the view or controller name. \bold{foov__ObservedChanged(self,observed,status) }Called whenever a child view is changed. Usefull for applications that need to react to characters typed in a text object, or other changes to a nonvalue object child. \bold{foov__InitializeClass(ClassID) }Class procedure called only once when class is initialized \bold{foov__FinalizeObject(ClassID,self) }Class procedure called when self is destroyed . Applications should free any malloced data here. \bold{ }\bold{foov__InitializeObject(classID, self)} Code to initialize self should be included here. \bold{FindSelf(v)} This static function will take any view pointer and return a pointer to the adew created controller/view. \bold{XXXCallBack(self,val,r1,r2) }One of these function calls is created for each uniquely named value object included in the application. It is called when the value named XXX changes. \italic{val} is a pointer to the value object. If there are multiple objects with the name XXX followed by an underscore and a number (ex. XXX_3), only one callback is set up for all of them. The int \italic{r1 }is set to number following the underscore. This simplifies programming multiple switches with similar functions. The r2 argument is a flag that the generated code checks for an Objects Destroyed notification. \subsection{5.4.1 Additional View methods} In addition to the above, the following methods are created by createcon as part of the views it creates. The name foov will be replaced by the view name. \bold{foov__GetApplicationLayer(self) }Tells child to produce application layer if it is requested of this layer. Probably not useful to the application programmer. \bold{foov__go(self) } Place for user code to be called when all child views have been initialized . \bold{foov__InitCell(self,cv) }This code is called each time a child view is initialized. Usefull if the application needs to call view methods on a view that doesn't show up when the application is started. \section{ 5.5 Dataobject methods }The following methods are created by createcon as part of the dataobject it creates. The name foo will be replaced by the dataobject name. \bold{foo__ViewName(self)} Returns the name of default view. There is probably no reason for the application developer to deal with this method. \bold{foo__ReadObjects(self)} This method is called when all child dataobjects have been read and may be accessed. The application developer may want to include application initiation code here. See following methods. \bold{*foo__FindChildObjectByName(self,char *name)} Returns the child object with the given name. This call may be useful for getting a pointer to an embedded object. One of the problems of earlier versions of Adew was that the embedded dataobjects could not be accessed until it's corresponding view had been displayed on the screen. This restriction has been eliminated for adew created insets. \bold{*foo__FindChildCelByName(self,char *name)} Returns the child cel with the given name, useful when one wishes to change a child's attributes. See the Cel methods described later in this document. \bold{foo__ReadSup(self, file, id)} \bold{foo__WriteSup(self,file ,writeid,level)} Reads and Writes the object specific data. See below. \section{ 5.6 Support for object specific data } Another new feature of Adew is the ability to specify application specific data that will be stored along with the Adew inset, and then restored when the object is read back in. The code that reads, writes and initializes this data is computer generated and is both upward and backward compatible. So if at some point you need to add additional data to your application, another pass with createcon will make the change in such a way that new versions of the code will be able to read old versions of the datastream, and old versions of the code will not be confused by new versions of the datastream. The only restriction is that no old data is removed from newer versions. To specify the data that one wants associated with the adew created dataobject, one needs so create a .dcl file whose prefix is the same as the dataobject name. Thus, if you are creating the class foo, the declarations would be included in foo.dcl. The form of a dcl file is as follows. \example{DECLARE <name> <typename> <size> <size> }where \italic{typename} is one of the following \example{long | string | float | longarray | stringarray } An example .dcl file is as follows. \example{ DECLARE fl long DECLARE fs string DECLARE ff float DECLARE fly longarray DECLARE fy stringarray 24 80 100 80 }This will result in new instance variables being declared, so in your dataobject you will have access to a long (self->fl), a string array (self->fs), etc. Only longs, floats, and static arrays are currently supported. NOTE: when adding new declarations to an existing object, they should always be added to the end of the .dcl file. \section{ 5.7 Createcon Examples } If one had a control-buttonless application file names \italic{switches}, wanted to create a controller class named \italic{switchcon}, and wanted the final application to be called \italic{doswitch}, with the title\italic{ "switch controller"}. Createcon could be called as follows. createcon -O doswitch -T "switch controller" -C switchcon switches The program would output the following \leftindent{Creating a controller for switches. Please wait... running cat /tmp/adew0.tmp switches | /usr/andy//lib/arbiters/conpros.awk Creating switchcon.ch Creating switchcon.c Creating Imakefile Creating makeswitchcon shellscript Creating doswitch shellscript Done } and the doswitch shellscript would look like \leftindent{runadew -C"switchcon" -F"go" -T"switch controller" S"switches" $* } This shellscript will pass it's arguments on to runadew, which can the pass them on to the controller class. It is possible for the application programmer to edit this shell script to pass additional arguments to runadew, either for passing on, or to change the application colors. See the runadew documentation below for details. \subsection{5.7.1 Converting old applications to insets } If you have an old adew application (myapp), that you wish to update to an inset(newapp), this can usually be accomplished with the following command. createcon -I -C newapp -V newappv:myapp -M This will move the application specific code in myapp.c to the view newappv.c. \section{5.8 Notes} It is possible to create two source files, one with a control button and one without. The latter for use in stand alone mode, and the former for inclusion in other files. If there are no other changes, a single controller class can be used for either file. \section{5.9 Running createcon from the arbcon menu } Createcon can also be run from the Arbcon. When the \bold{Create Controller} option is chosen from the ADEW menu, it is the same as running createcon on the file containing the current object. The output from createcon will be placed in one of the arbcon's windows. No other arguments can be sent to createcon in this mode, so it will only work on files containing a controller button and cannot be used to create insets. \begindata{bp,538930120} \enddata{bp,538930120} \view{bpv,538930120,1403,0,0} \chapter{6 Runadew } Runadew is an alternate environment for running Adew applications. Similar to \bold{ez}, runadew provides some additional facilities, while at the same time, limiting the user options to those provided by the application creator. Any Adew application may be run in runadew; those without control buttons can only be run in runadew. \section{6.1 Arguments} Runadew recognizes the following flags, that are normally set by a shellscript created by createcon. See above for details. \italic{-S file }\indent{This is the atk file that runadew displays in it's window. Runadew must be given this argument. } \italic{-T "title" }\indent{Runadew will place the given string in the title bar of the application (when running under window managers that provide title bars). } \italic{-C class -F function (defaults to 'go')} \indent{When given these arguments, runadew will load the given class, lookup the given function in that classes' proctable, and execute that function, passing it the frame as the argument. This is the mechanism that takes the place of control buttons. }\italic{-I Insetname} \indent{For Adew created inset. } \subsection{6.1.1 Argument passing }All of the other arguments to runadew (except for the standard ones handled by runapp, ie -bg background-color and -fg foreground-color) are saved and may be passed on the the controller class. \bold{runadewapp_GetArguments(argp) }returns a char ** with the remaining arguments. Argp is pointer to an int, whose contents will be set to the number of these arguments. If there are no arguments, only argv[0] (usually 'runadew') is passed on. If the application is not being run from runadew, NULL will be returned. \section{6.2 } the Other features When users run applications in runadew, they are not presented with normal ez menus and keystroke commands for switching files, printing, creating new windows, etc.. Runadew does not try to checkpoint the file, or make sure that the file hasn't changed before exiting. This fits in better with the normal user model of a stand alone application. \begindata{bp,538269640} \enddata{bp,538269640} \view{bpv,538269640,1404,0,0} \chapter{7 Advanced topics - Cels, Celviews and the Arbiterview. } Cels and Celviews make up a wrapper inset that allow the Arbcon to do its work. Since each parent view implements its own ways of inserting children, the celview was created as an intermediary view that could be inserted in any parent and would provide a consistent way for creating its child which the Arbcon could control. When the arbcon is used to create a new object, it does this by creating a cel, telling the cel what kind of inset it should contain, and then writing the cel into the cut-buffer. The cel also provides the conventions for naming it's child and storing the attributes for the value objects. The Arbiterview is a sub-class of the celview. In addition to working like a celview, it also provides the namespace that all of the celviews interact with to ensure that there is no name collision. It also provides classprocedures for locating named cels within the namespace. The typical Adew programmer can ignore these objects, since the createcon created C program does all of the necessary interfacing. However they can be used to provide more flexibility for those doing more advanced applications. The purpose of this section is to explain the methods and classprocedures available. \section{7.1 } Accessing the cel and celview related to an inset. The cels and celviews associated with a given view may be easily accessed. Note that since cels contain view-specific information, that they can't be accessed from a data-object alone. \bold{struct celview *celview_GetCelviewFromView(view)} This class procedure takes a pointer to any view and returns the celview associated with it, or NULL if there is no celview associated with it . All views created with the arbcon within an Adew application should have celviews. \bold{struct cel *celview_GetCel(self)} \leftindent{This macro returns the cel associated with a celview. } \bold{struct view *GetTrueChild(self) }\leftindent{This macro returns the celview's main child view. } \bold{struct view *GetApplication(self) }\leftindent{This macro returns the celview's immediate child, which may be the true child, as returned above, or it may be the application layer associated with the child (usually it's scrollbar), if these is one. } \section{7.2 Dynamically changing valueview attributes } Normally, the attributes associated with a valueview are set interactively from the arbcon, though sometimes it is desirable to change them dynamically while the program is running. The follow methods provide this capability. \subsection{7.2.1 Cel Methods for dealing with attributes } \bold{long cel_GetLongAtt(self,attname)} struct cel *self; char *attname; This method takes a cel and an attribute name and returns the current value of that attribute. If the attribute value has never been defined, cel_UNDEFINEDVALUE will be returned. \bold{void cel_SetLongAtt(self,attname,val) } struct cel *self; char *attname; long val; This method takes a cel and an attribute name and sets the current value of that attribute. If val == cel_UNDEFINEDVALUE, the value will be unset. \bold{char * cel_GetStringAtt(self,attname,buf,buflen) } struct cel *self; char *attname,*buf; long buflen; This method takes a cel, an attribute name, a buffer , and the length of the buffer. The value of the attribute is written into the buffer and the buffer pointer is returned. . If the attribute value has never been defined, NULL will be returned. \bold{void cel_SetStringAtt(self,attname,attval) }struct cel *self; char *attname,*attval; This method takes a cel, an attribute name and a string. It sets the current value of that attribute to the value of the string. If attval == NULL, the value will be unset. \subsection{7.2.2 Examples }example 1. To change the maximum value of a slider switch named self>sliderview to 50: struct cel *cl; cl = celview_GetCel(celview_GetCelviewFromView(self->sliderview)); if(cel_GetLongAtt(cl,"max_value") != 50) cel_SetLongAtt(cl,"max_value", 50); example 2. To change the label of a button named self->buttonview to "push me". struct cel *cl; char buf[256],*res; cl = celview_GetCel(celview_GetCelviewFromView(self->buttonview)); res = cel_GetStringAtt(cl,"label",buf,buflen); if(res == NULL || strcmp(buf,"push me") != 0) cel_SetStringAtt(cl,"label","push me"); \section{7.3 Dynamically creating new cel objects} It is sometimes useful for applications to create new objects on the fly. The following cel methods can support this. \bold{boolean cel_SetChildObject(self,struct dataobject *newobject,char *viewName); }\indent{Places an object in the cel. viewName is the name of the type of view to apply to the dataobject. If NULL, cel will use the default view for that dataobject. } \bold{char *cel_GetRefName(self);}\bold{ } Returns the cel's logical name. \bold{void cel_SetRefName(self,char *refname) returns char *;} This method sets the cel's logical name. \bold{void cel_SetApplication(self,int app) }\leftindent{Can be set to cel_NORMAL, cel_APPLICATION to indicate if the child should be displayed with it's application layer, (usually w/ one or more scroll bars ). } \subsection{7.3.1 Example }\indent{ To place a buttonv with the label "mybutton" in the existing text object, self->text, instead of placing it directly. struct cel *cc; struct value *val; val = value_New(); cc = cel_New(); cel_SetChildObject(cc,val,"buttonv"); cel_SetRefName(cc,"NewButton"); cel_SetLongAtt(cc,"bodyfont-size",16); cel_SetStringAtt(cc,"bodyfont","andy"); cel_SetStringAtt(cc,"label","mybutton"); text_AddView(self->text,0,"celv",cc); text_NotifyObservers(self->text,0); } \section{7.4 Additional Cel Methods } The following are some additional methods and macro methods provided by cels. \bold{boolean cel_SetObjectByName(self,char *dataname) }\leftindent{Sets the child of a cel by giving it the name of an object. The cel will create the object. } \bold{struct dataobject * cel_GetObject(self) }\leftindent{Gets a pointer to the object contained in the cel. } \bold{cel_SetViewName(self,char *viewname,boolean UseDefault) }\leftindent{Sets the name of the view that will be created. If UseDefault is TRUE, the default name will be used if viewname is NULL, or can't be created. } \bold{char *cel_SetRefName(self,char *refname) }\leftindent{Sets the cel's logical name. } \bold{cel_UnsetRefName(self) }\leftindent{Unsets the cel's logical name. } \bold{cel_SetVisible(self) cel_SetInvisible(self) }\leftindent{Attempts to make the cel and it's child visible/invisible. When invisible, a cel requests to be shrunk to 0 size, and won't send updates to child. } \bold{boolean cel_Visible(self) }\leftindent{returns TRUE if the cel is not currently invisible. } \bold{cel_SetLinkName(self,char *linkname) }\leftindent{Used to set the name of a related cel. When the celview goes to create a new child view, It will attempt to find (self,via the arbiterview) the related cel, and create a new view on the object contained in that cel. } \bold{long cel_WriteLink (self,FILE *file, long writeid, int level) }\leftindent{Used by the Arbcon to write a cel that will be a link to the current cel onto the given file descriptor. } \bold{char * cel_GetViewName(self) }\leftindent{returns the view type } \bold{char *cel_GetObjectName(self) }\leftindent{returns the dataobject type. } \bold{char *cel_GetLinkName(self) }\leftindent{returns the name of the source cel that this cel is a link to. } \bold{int cel_GetApplication(self) }\leftindent{returns cel_NORMAL, cel_APPLICATION or cel_VALUE } \bold{cel_SetNoSave(self,val) }\leftindent{Sets a flag to indicate if the child's GetModified flag should be passed on to the parent. If val is set to TRUE, any modification to the child object will not be sent up to the parent, and therefor will not trigger the writing of any checkpoint file. This flag does not effect the writing of the child to any file (checkpoint or otherwise). } \section{7.5 Internal or Obsolete Cel Methods } The following cel methods are either internal or obsolete. They should not be called by external objects. \bold{cel_InsertObject (self,struct dataobject *newobject,char *dataname,char *viewname,int usedefaultview) }\bold{cel_GetRefAtom(self) cel_GetViewAtom(self) cel_GetObjectAtom(self) cel_GetLinkAtom(self) cel_GetScript(self) cel_SetVisibilityBit(self,boolean mode) cel_SetObjectName(self,char *dataname) }\bold{cel_SetObject(self,struct dataobject *newobject) } \section{7.6 Adding menus and keystrokes } The celview has support for external objects to post keymaps and menulists, to be posted on addition to the child views menus and keymaps. This offers the advanced programmer the opportunity to add new menu entry and keystroke commands to any child of a celview. In the case of conflict, the childs menus and keystrokes will be superseded by those posted to the celview. The calls to do this are celview_SetKeymap(self,struct celview *celv, struct keymap *km); celview_SetMenulist(self,struct celview *celv, struct menulist *ml); For more information on keymaps and menulists, see the ATK documentation. \section{7.7 Dealing with Mouse Hits } The celview has support for external objects to intersect the mouse hits being sent to a child view. The call to do this is. \bold{celview_SetHitfunc(self, procedure MouseProc, long rock);} Once this method is called, the celview(self) will react to mouse hits by calling the MouseProc procedure with itself as the first argument, all of the standard hit arguments (see the view documentation) and lastly, the rock that it was passed in the SetHitfunc method. The x and y arguments will have already been scaled to the child objects coordinates. The MouseProc procedure should return a pointer to a view. The controller program then has several options for dealing with this hit. 1. If, after dealing with the mouse hit, the controller wants the hit sent on the child object, it can return NULL to signal the celview to continue processing the hit normally, by passing it down to it's child. 2. If the controller wants to block the passing of the hit, it should return the celview pointer that it received as it's first argument. 3. If the controller wants to pass the hit to the child itself, so it can perform actions after the hit, it can have something like the following as it's MouseProc. struct view *\bold{MouseProc}(cv, action, x, y, numberofclicks, rock) struct celview *cv; /* the celview */ enum view_MouseAction action; long x, y, numberofclicks; long rock; \{ struct view *vw; vw = view_Hit(celview_GetApplication(cv),action, x, y, numberofclicks) /* code deal with the hit goes here */ ... return vw; \} This (or option 1) insures that the proper view (the one that took the hit) is returned up the view tree. For additional information on dealing with mouse hits, see the ATK documentation. \section{7.8 Experimental celview overlay code } Most of the other celview methods are for internal use only. There is currently some experimental code in celview for overlaying other views on top of a celview. The adventurous may want to to experiment with the following, though they should not be considered a supported part of the system. \bold{void celview_PushOverlay(self,struct view *view,struct rectangle *rect,long flags); } \leftindent{Takes a view, a pointer to a struct rectangle. and a flags argument. The rectangle should give the top,left, width, and height in reference to where the view should be in relation to the parent celview. If the celview gets resized, the overlayed view will be resized in proportion. The flags argument is not currently supported, and should be 0L. } \bold{struct view *PopOverlay(self,struct view *view) ; }\leftindent{Pops the view off of the overlay stack. } \section{7.9 The Arbiterview } As mentioned above, the arbiterview provides a namespace for those objects below it. Arbiterviews may be inserted at various levels in an application to provide nested namespaces. If no explicit arbiterview is placed in an application, a phantom one will be created, one per frame, to deal with the namespace for that frame. This 'phantom' arbiterview becomes associated with the frame, but is never actually placed in the view tree. By making the default namespace equivalent to the views under a frame, we avoid name collisions when the user brings up a second window on a view tree, since this action creates a new frame. When Adew insets are created, the dataobject created is a subclass of arbiter,and the view a subclass of arbiterview. This provides several benefits, most importantly is the fact that namespaces can't collide if several instances of the application are included within the same parent. The following class procedures are available for general use. \bold{struct dataobject *arbiterview_GetNamedObject(struct view *vw,char *ObjectName) }\leftindent{Given any view (vw) and an objects reference name (as set by the arbcon, or with celview_SetRefName()), this class procedure returns a pointer to the object with that name that is within the same name space as the given view. } \bold{struct view *arbiterview_GetNamedView(struct view *vw,char *ViewName) }\leftindent{Given any view (vw) and an objects reference name (as set by the arbcon, or with celview_SetRefName()), this class procedure returns a pointer to the view with that name that is within the same name space as the given view. } \bold{struct celview *arbiterview_GetNamedCelview(struct view *vw,char *ViewName) }\leftindent{Given any view (vw) and an objects reference name (as set by the arbcon, or with celview_SetRefName()), this class procedure returns a pointer to the celview with that name that is within the same name space as the given view. } Note that, given the celview, it is easy, given the methods above, the get the related views and dataobjects. The GetNamedView and GetNamedObject procedures are just provided as a convenience. In all of the above class procedures, the application programmer may alternately pass a NULL view, and instead provide an explicit arbiterview name prepended to the viewname string and separated from the viewname with ':'s. This allows the application programmer to get a handle on objects in other namespaces in the same process. So to get the celview named "bar" under the arbiterview named "foo", one would call arbiterview_GetNamedCelview(NULL,"foo:bar"). Since arbiterviews may also be nested, one might also want to get the celview named "bar" under the arbiterview named "foo" under the arbiterview "sis". For this, one would call arbiterview_GetNamedCelview(NULL,"sis:foo:bar"). The phantom arbiterview that gets associated with a buffer inherits the buffers name. \bold{arbiterview_SetIgnoreUpdates(struct view *vw,boolean val); }\leftindent{Given any view (vw) , this procedure will inform the namespace, and it's associated buffer, that changes to the state of the objects in the namespace do not indicate that the application should be checkpointed or saved before the user exits. This gets around the peculiarity of running applications from within a generic editor. See the Adew tutorial for more information. } The other Arbiterview methods are for interaction with the cels and the arbcon, and should not be called by other objects. \section{7.10 Some notes on nesting of arbiters. } The current createcon code for generating applications in not designed for dealing with nested arbiters. In general, in creating a single application, there is no need for dealing with multiple namespaces. However, if one has say three applications, each developed with Adew and createcon, that one desires to combine into a single application, it would be reasonable to create a window with Adew, inset arbiter objects within the application, and then read each of the three applications into the arbiters. They can then each operate without fear of a namespace collision. Alternately, one could just look at the applications and insure that no names are common between them , and then even this use of the arbiters would be unnecessary. \section{7.11 Location of Sources } Under the Andrew directory in the x11 R5 sources , the values and valueviews are located in the atk/value directory, and all of the remaining code is in the atk/adew directory. Example objects, (the calculator, the piano, etc), are in the atk/controllers directory. \begindata{bp,537558784} \enddata{bp,537558784} \view{bpv,537558784,1406,0,0} Copyright 1992 Carnegie Mellon University and IBM. All rights reserved. \smaller{\smaller{$Disclaimer: Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of IBM not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ANY COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. $ }}\enddata{text,538607584}