*! Date        : 29 July 2005
*! Version     : 1.42
*! Authors     : Adrian Mander
*! Email       : adrian.mander@mrc-hnr.cam.ac.uk
*! Description : Listing values of variables

prog def blist, byable(recall)
version 9.0
syntax [varlist] [if]
preserve

marksample touse, novarlist

qui count if `touse'
if `r(N)'==0 {
   di as text "No Observations"
   exit(2000)
}

/*
  _wlist will list the variables and return the remainder varlist in the macro.. 
 hence keep looping until you run out of variables
*/

di
_wlist `varlist' if `touse'
while "`r(varlist)'"~="" {
  _wlist `r(varlist)' if `touse'
}

restore

end


prog def _wlist, rclass
syntax [varlist] [if]

marksample touse2, novarlist

/* Find the maximum number of display columns.. take away 5 */

local maxcol:set linesize
local maxcol = `maxcol'-5

/* 
Set up the text for each line 

Maxlength 0
# vars 1
Create variables containing the text.
*/

local maxlen 0
local nvar 1
foreach var of varlist `varlist' {
  tempvar sv`nvar' temp
  
  cap confirm numeric variable `var'
  if _rc==0 {
    qui gen `sv`nvar'' = trim(string(`var')) if `touse2'
    qui replace `sv`nvar''= cond(index(`sv`nvar'',".")~=0,substr(`sv`nvar'',1,index(`sv`nvar'',"."))+substr(`sv`nvar'',index(`sv`nvar'',".")+1,3), `sv`nvar'') if `touse2'
  }
  else qui gen `sv`nvar'' = `var' if `touse2'
  
  qui compress `sv`nvar''
  qui gen `temp' = length(`sv`nvar'') if `touse2'
  qui summ `temp' if `touse2'
  local s`nvar' = r(max)
  local len = length("`var'")
  if `len'>`maxlen' local maxlen = `len' 
  local `nvar++'
}

local novars = `nvar'-1


local lastvar 0
forvalues i = `maxlen'(-1)1 {
  local column 1
  local nvar 1
  local line ""
  local nomore 0
  foreach var of varlist `varlist' {
    
    if `nomore'==0 {
      local midpt = `column'+int(`s`nvar''/2)+2
      local column = `column'+`s`nvar''+2

      if length("`var'")>= `i' {
        local entry = substr("`var'",length("`var'")-`i'+1,1)
        if `column'<`maxcol'  local line "`line'{col `midpt'}{input:`entry'}"
      }
    }
    if `column'>=`maxcol' {
      if `nomore'==0 local lastvar = `nvar'-1 
      local nomore 1
    }
    
    if `i'==`maxlen' & `column'>=`maxcol'   local whatsleft "`whatsleft' `var'"
    
    local nvar=`nvar'+1
  }
  di in smcl "`line'"
  
  if `lastvar'==0  local lastvar = `nvar'-1 
  
/* DO TOP of boxes */
  
  if `i'==1 {
    local column2 = `s1'+1
    local line "{text:{c TLC}}{dup `column2':{text:{c -}}}"
    local line2 "{text:{c BLC}}{dup `column2':{text:{c -}}}"
    local nvar 1
    local column 1
    foreach var of varlist `varlist' {
      local nxvar = `nvar'+1
      local column = `column'+`s`nvar''+2
      if `nvar'~=`lastvar'  local column2 = `s`nxvar''+1 
      else  local column2 0 
      if `nvar'==1 {
        if `nvar'<`lastvar' {
          local line "`line'{col `column'}{text:{c TT}}{dup `column2':{text:{c -}}}"
          local line2 "`line2'{col `column'}{text:{c BT}}{dup `column2':{text:{c -}}}"
        }
        else {
          local line "`line'{col `column'}{text:{c TRC}}"
          local line2 "`line2'{col `column'}{text:{c BRC}}"
        }
      }
      else {
          if `nvar'<`lastvar' {
            local line "`line'{col `column'}{text:{c TT}}{dup `column2':{text:{c -}}}"
            local line2 "`line2'{col `column'}{text:{c BT}}{dup `column2':{text:{c -}}}"
          }
          if `nvar'==`lastvar' {
            local line "`line'{col `column'}{text:{c TRC}}"
            local line2 "`line2'{col `column'}{text:{c BRC}}"
          }
      }
      local nvar = `nvar'+1
    }
    di in smcl "`line'"
  }
}


return local varlist "`whatsleft'"

/* This is the set of commands to display each line.. */

local nlines = _N
forvalues i=1/`nlines' {
  local nvar 1

  if `touse2'[`i']==0 continue  /* I think this is the only place that needs an if.. */

  foreach var of varlist `varlist' {
    
    if `nvar'<=`lastvar' {
      
      if `nvar'==1 {
        local line ""
        local column 3
      }
      local entry = `sv`nvar''[`i']
      if `nvar'<=`lastvar' {
        if `nvar'~=`lastvar' local line "`line'{text:{c |}}{col `column'}{result:{ralign `s`nvar'':`entry'}}"
        else  local line "`line'{text:{c |}}{col `column'}{result:{ralign `s`nvar'':`entry'}}{text:{c |}}"  
      }
    
      local column = `column'+`s`nvar''+2
      local nvar=`nvar'+1
    }
    
  }
  di in smcl "`line'"
}

di in smcl "`line2'"

end