import stdwin
from stdwinevents import *

class TicTacBoard:
      #
      # initialize the tic-tac-toe board with a certain
      #
      # dimensionality and edge-length
      #
   def __init__(self, edge, dimensionality):
      self.edge = edge

      self.size = 0
      self.dimensionality = dimensionality-1

      self.incrementDimensionality()
   
      #
      # the window size has changed...
      #
   def refreshSize(self,win):
      width, height = win.getwinsize()

      smaller = 0
      if (width < self.width or height < self.height):
	 smaller = 1

      if ((self.dimensionality%2) == 1):
	 if ( height*self.edge > width ):
	    height = width/self.edge
	 else:
	    width = h*self.edge
      else:
	 if ( height > width ):
	    height = width
	 else:
	    width = height

      
      self.width,self.height = width,height
      return smaller
      
   
      #
      # draw a rectangle
      #
   def drawRect(self,dc,x1,y1,x2,y2):
      dc.line( (x1,y1), (x2,y1) )
      dc.line( (x2,y1), (x2,y2) )
      dc.line( (x2,y2), (x1,y2) )
      dc.line( (x1,y2), (x1,y1) )

      #
      # draw the board (recursively)
      #
   def draw(self,dc,x,y,width,height,dim,boff,fact):

      x = x+dim
      y = y+dim
      width = width-2*dim
      height = height-2*dim

      self.drawRect(dc,x,y,x+width,y+height)

      if (dim == 0):
	 if (self.bytes[boff]):
	    dc.text((x,y),self.bytes[boff])
      elif ((dim%2) == 0):
	 for ii in range(0,self.edge):
	    for jj in range(0,self.edge):
	       self.draw(dc,ii*width/self.edge+x,jj*height/self.edge+y,
		  width/self.edge, height/self.edge, dim-2,
		  boff+ (jj*fact/self.edge + ii*fact/(self.edge*self.edge)),
		  fact/(self.edge*self.edge))
      else:
	 for ii in range(0,self.edge):
	    self.draw(dc,ii*width/self.edge+x,y,
	       width/self.edge, height, dim-1,
	       boff+ii*fact/self.edge,fact/self.edge)
   
      #
      # find mouse location (recursively)
      #
   def click(self,x,y,width,height,dim,boff,fact, mx, my, turn):

      x = x+dim
      y = y+dim
      width = width-2*dim
      height = height-2*dim

      ret = 0
      if (mx >= x and my >= y and mx < x+width and my < y+height):
	 if (dim == 0):
	    if (self.bytes[boff] == 0):
	       if (turn):
		  self.bytes[boff] = 'X'
	       else:
		  self.bytes[boff] = '0'
	       ret = 1
	 elif ((dim%2) == 0):
	    for ii in range(0,self.edge):
	       for jj in range(0,self.edge):
		  tret = self.click(
		     ii*width/self.edge+x,jj*height/self.edge+y,
		     width/self.edge, height/self.edge, dim-2,
		     boff+ (jj*fact/self.edge + ii*fact/(self.edge*self.edge)),
		     fact/(self.edge*self.edge), mx,my,turn)
		  ret = ret + tret
	 else:
	    for ii in range(0,self.edge):
	       tret = self.click(ii*width/self.edge+x,y,
		  width/self.edge, height, dim-1,
		  boff+ii*fact/self.edge,fact/self.edge, mx,my,turn)
	       ret = ret + tret
      
      return ret
   
      #
      # increment the dimensionality of the board
      #
      # preserve the known dimensions [Note: should try
      #		to center these dimensions a bit, but
      #		I'm not in the mood for all of that at
      #		the moment.]
      #
   def incrementDimensionality(self):
      dimensionality = self.dimensionality+1

      size = self.edge
      for ii in range(1,dimensionality):
	 size = size * self.edge

      bytes = range(0,size)

      for ii in range(0,self.size):
	 bytes[ii] = self.bytes[ii]
      
      for ii in range(self.size,size):
	 bytes[ii] = 0
      
      self.dimensionality = dimensionality
      self.size = size
      self.bytes = bytes

      print 'Now moving to', self.dimensionality, 'dimensions'

      #
      # The main loop...
      #
      # opens a window and processes the events.
      #
      #
   def main(self):
      mywin = stdwin.open('Tic-Tac Toe')
      self.width, self.height = mywin.getwinsize()
      self.refreshSize(mywin)

      turn = 0

      done = 0
      while not done:
	 redraw = 0
	 (type, win, detail) = stdwin.getevent()

	 if type == WE_DRAW:
	    redraw = 1

	 elif type == WE_SIZE:
	    redraw = self.refreshSize(mywin)
	 
	 elif type == WE_CLOSE:
	    done = 1
	 
	 elif type == WE_MOUSE_DOWN:
	    (x,y) = detail[0]
	    if (self.click( 0,0, self.width,self.height,
		  self.dimensionality, 0, self.size, x, y, turn) > 0):
	       turn = not turn
	       redraw = 1

	 elif type == WE_CHAR:
	    if (detail == 'I' or detail == 'i'):
	       self.incrementDimensionality()
	       self.refreshSize(mywin)
	       redraw = 1
	    elif (detail == 'Q' or detail == 'q'):
	       done = 1

	 if redraw != 0:
	    dc = win.begindrawing()

	    dc.erase((0,0),win.getwinsize())
	    self.draw( dc, 0,0, self.width,self.height, self.dimensionality,
		0, self.size)
	    del dc

def main():
   board = TicTacBoard(4,1)
   board.main()

main()
