############################################################################ # # File: vgrid.icn # # Subject: Procedures for vidget grids # # Author: Jon Lipp # # Date: March 23, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Links: vidgets # ############################################################################ link vidgets record Vgrid_rec(win, callback, id, aw, ah, rows, cols, Hpos, Vpos, hpad, vpad, ax, ay, uid, P, V) procedure Vgrid(params[]) local self, i, frame, x, y, ins static procs initial procs := Vstd(event_Vgrid, draw_Vgrid, outline_Vidget, resize_Vgrid, inrange_Vpane, init_Vgrid) if ins := Vinsert_check(params) then { frame := pop(params); x := pop(params); y:= pop(params) } self := Vgrid_rec ! params[1:8|0] Vwin_check(self.win, "Vgrid()") if (\self.aw, not numeric(self.aw) ) then _Vbomb("invalid aw parameter to Vgrid()") if (\self.ah, not numeric(self.ah) ) then _Vbomb("invalid ah parameter to Vgrid()") if (\self.rows, not numeric(self.rows) ) then _Vbomb("invalid rows parameter to Vgrid()") if (\self.cols, not numeric(self.cols) ) then _Vbomb("invalid cols parameter to Vgrid()") self.V := procs self.P := Vstd_pos() self.uid := Vget_uid() self.V.init(self) if \ins then VInsert(frame, self, x, y) return self end procedure init_Vgrid(self) local p self.Hpos := table() self.Vpos := table() /self.aw := 100 /self.ah := 100 /self.rows := 10 /self.cols := 10 p := \self.callback self.callback := Vcoupler() add_clients_Vinit(self.callback, p, self) return self end procedure draw_Vgrid(self) local i # draw vertical lines every i := 0 to self.cols do DrawLine(self.win, self.ax+self.Hpos[i], self.ay, self.ax+self.Hpos[i], self.ay+self.ah) # draw horizontal lines. every i := 0 to self.rows do DrawLine(self.win, self.ax, self.ay+self.Vpos[i], self.ax+self.aw, self.ay+self.Vpos[i]) end procedure event_Vgrid(self, e) local row, col if \self.callback.locked then fail col := VGetCol(self, &x) row := VGetRow(self, &y) return self.callback.V.set(self.callback, self, [row, col, e]) end procedure resize_Vgrid(self, x, y, w, h) local i resize_Vidget(self, x, y, w, h) self.hpad := 1 <= self.aw / real(self.cols) | 1 self.vpad := 1 <= self.ah / real(self.rows) | 1 every i := 0 to self.cols do self.Hpos[i] := integer (i * self.hpad ) every i := 0 to self.rows do self.Vpos[i] := integer(i * self.vpad ) end procedure VFillGrid(self, row, col) FillRectangle(self.win, self.ax+self.Hpos[col], self.ay+self.Vpos[row], 1 <= self.Hpos[col+1] - self.Hpos[col] | 1, 1 <= self.Vpos[row+1] - self.Vpos[row] | 1 ) end procedure check_Vgrid(self, row, col) end procedure VEraseGrid(self, row, col) EraseArea(self.win, self.ax+self.Hpos[col]+1, self.ay+self.Vpos[row]+1, 1 <= ( self.Hpos[col+1] - self.Hpos[col] - 1) | 1, 1 <= ( self.Vpos[row+1] - self.Vpos[row] - 1) | 1 ) end procedure VGetRow(self, y) local row row := integer( (y - self.ay) / real(self.vpad) ) row := row < 0 | row > self.rows - 1 return row end procedure VGetCol(self, x) local col col := integer( (x - self.ax) / real(self.hpad) ) col := col < 0 | col > self.cols - 1 return col end