*! diablo -- Dialog box layout manager *! version 1.0.0 January 1997 Timothy J. Schmidt STB-35 ip15 program define diablo version 5.0 parse "`*'", parse(",") cap confirm integer number `1' if (_rc) { makedb "`1'" } else { local row "`1'" mac shift 2 if ("`1'" == "" | "`1'" == ")") { di in red "no window controls specified" exit 198 } global S_DBr`row' "`*'" } end program define makedb version 5.0 local title = "`1'" local hbuff = 10 /* Horizontal space between controls */ local vbuff = 5 /* Vertical space between controls */ local Elx = 80 /* List box horizontal extent */ local Ely = 50 /* List box vertical extent */ local Echx = 5 /* Check box horizontal extent */ local Echy = 10 /* Check box vertical extent */ local Ebux = 60 /* Button horizontal extent */ local Ebuy = 12 /* Button vertical extent */ local Eedx = 80 /* Edit horizontal extent */ local Eedy = 10 /* Edit vertical extent */ local Erax = 35 /* Radio button horizontal extent */ local Eray = 10 /* Radio button vertical extent */ local Estx = 80 /* Static horizontal extent */ local Esty = 9 /* Static vertical extent */ local Ecx = 80 /* Combo box horizontal extent */ local Ecy = 40 /* Combo box vertical extent */ local DBex = 0 local DBey = 0 /* find number of columns in longest row */ local columns = 0 local r = 1 while ("${S_DBr`r'}" != "") { parse "${S_DBr`r'}", parse("|") local cols = 1 while ("`1'" != "") { if ("`1'" == "|") { local cols = `cols' + 1 } mac shift } local columns = max(`columns', `cols') local r = `r' + 1 } /* create string of controls and strings of each control's arguments */ local numobj = 1 local r = 1 while ("${S_DBr`r'}" != "") { parse "${S_DBr`r'}", parse("[]|") local objstr "`objstr' `1'" local numcol = 1 mac shift while ("`1'" != "") { if ("`1'" == "[") { mac shift local arg`numobj' = "`1'" } else if ("`1'" == "|") { mac shift local objstr = "`objstr' `1'" local numcol = `numcol' + 1 local numobj = `numobj' + 1 } mac shift } /* pad end of "short" rows with placeholder controls */ while (`numcol' < `columns') { local objstr = "`objstr' i" local numobj = `numobj' + 1 local numcol = `numcol' + 1 } local numobj = `numobj' + 1 local r = `r' + 1 } local rows = `r' - 1 local height = `vbuff' local width = `hbuff' local rowh = 0 /* calculate placement coordinates (offsets) for each control */ parse "`objstr'", parse(" ") local i = 1 while (`i' <= `rows') { local j = 1 while (`j' <= `columns') { local C`i'`j'x = `width' local C`i'`j'y = `height' if (`i' > 1) { local k = `i' - 1 local C`i'`j'x = max(`C`i'`j'x', `C`k'`j'x') } if (`i' > 1 & `j' < `rows') { local k = `j' + 1 local t = `i' - 1 local Eopt = `C`t'`k'x' - `C`i'`j'x' - `hbuff' } else { local Eopt = 0 } local objnum = ((`i'-1) * `columns') + `j' if ("`1'" == "ls" | "`1'" == "lm") { local width = `width' + max(`Elx',`Eopt') local h = `Ely' } else if ("`1'" == "ch") { local strlen = (index("`arg`objnum''",",") - 1) * 4 local Ech`i'`j'x = max(`Echx',`strlen') local width = `width' + max(`Ech`i'`j'x',`Eopt') local h = `Echy' } else if ("`1'" == "bu") { local strlen = (index("`arg`objnum''",",") - 1) * 4 local Ebu`i'`j'x = max(`Ebux',`strlen') local width = `width' + max(`Ebu`i'`j'x',`Eopt') local h = `Ebuy' } else if ("`1'" == "ed") { local width = `width' + max(`Eedx',`Eopt') local h = `Eedy' } else if ("`1'" == "ra") { parse "`arg`objnum''", parse(",") if ("`5'" == "") { di in red "too few radio buttons specified" exit 198 } local nr`i'`j' = 0 local Era`i'`j'x = `Erax' while ("`1'" != "") { local strlen = length("`1'") * 4 local Era`i'`j'x = max(`Era`i'`j'x', `strlen') local nr`i'`j' = `nr`i'`j'' + 1 mac shift 2 } local nr`i'`j' = `nr`i'`j'' - 1 local width = `width' + max((`Era`i'`j'x' * `nr`i'`j''),`Eopt') local h = `Eray' parse "`objstr'", parse(" ") local ms = `objnum' - 1 mac shift `ms' } else if ("`1'" == "st") { local strlen = length("${`arg`objnum''}") * 4 local Est`i'`j'x = max(`Estx',`strlen') local width = `width' + max(`Est`i'`j'x',`Eopt') local h = `Esty' } else if ("`1'" == "cs" | "`1'" == "cm") { local width = `width' + max(`Ecx',`Eopt') local h = `Ecy' } else if ("`1'" == "i") { local Ei = `hbuff' if (`i' > 1) { local n = 1 local m = `j' + 1 while (`n' < `i') { local Ei = max(`C`n'`m'x'-`C`n'`j'x'-`hbuff', `Ei') local n = `n' + 1 } } local width = `width' + max(`Ei',`Eopt') local h = `vbuff' } local width = `width' + `hbuff' local rowh = max(`rowh', `h') mac shift local j = `j' + 1 } local height = `height' + `rowh' + `vbuff' local DBex = max(`DBex', `width') local width = `hbuff' local rowh = 0 local i = `i' + 1 } local DBey = `height' + 15 /* create Stata window control commands for each control */ local shift = 0 local i = 1 while (`i' <= `rows') { local j = 1 while (`j' <= `columns') { local objnum = ((`i'-1) * `columns') + `j' parse "`objstr'", parse(" ") mac shift `shift' local contype "`1'" parse "`arg`objnum''", parse(",") local field1 "`1'" local macname "`3'" local conopts "`5'" if ("`contype'" == "ls") { win control ssimple `field1' `C`i'`j'x' `C`i'`j'y' `Elx' `Ely' `macname' `conopts' } else if ("`contype'" == "lm") { win control msimple `field1' `C`i'`j'x' `C`i'`j'y' `Elx' `Ely' `macname' `conopts' } else if ("`contype'" == "cs") { win control scombo `field1' `C`i'`j'x' `C`i'`j'y' `Ecx' `Ecy' `macname' `conopts' } else if ("`contype'" == "cm") { win control mcombo `field1' `C`i'`j'x' `C`i'`j'y' `Ecx' `Ecy' `macname' `conopts' } else if ("`contype'" == "bu") { win control button "`field1'" `C`i'`j'x' `C`i'`j'y' `Ebu`i'`j'x' `Ebuy' `macname' `conopts' } else if ("`contype'" == "ch") { win control check "`field1'" `C`i'`j'x' `C`i'`j'y' `Ech`i'`j'x' `Echy' `macname' `conopts' } else if ("`contype'" == "ed") { win control edit `C`i'`j'x' `C`i'`j'y' `Eedx' `Eedy' `field1' `macname' } else if ("`contype'" == "st") { win control static `field1' `C`i'`j'x' `C`i'`j'y' `Est`i'`j'x' `Esty' `conopts' } else if ("`contype'" == "ra") { local lastarg = (`nr`i'`j'' * 2) + 1 local macname "``lastarg''" local xpos = `C`i'`j'x' win control radbegin "`1'" `xpos' `C`i'`j'y' `Era`i'`j'x' `Eray' `macname' local radnum = 2 mac shift 2 while (`radnum' < `nr`i'`j'') { local xpos = `xpos' + `Era`i'`j'x' + 2 win control radio "`1'" `xpos' `C`i'`j'y' `Era`i'`j'x' `Eray' `macname' mac shift 2 local radnum = `radnum' + 1 } local xpos = `xpos' + `Era`i'`j'x' + 2 win control radend "`1'" `xpos' `C`i'`j'y' `Era`i'`j'x' `Eray' `macname' } local shift = `shift' + 1 local j = `j' + 1 } local i = `i' + 1 } cap noi win dialog "`title'" . . `DBex' `DBey' mac drop S_DBr* end