﻿from array import array
import wx
import random
import wx.lib.dragscroller
#import wx.html as html
import  sqlite3 as lite

class MinFrame(wx.Frame):
    def __init__(self,parent,id, vsize):
        wx.Frame.__init__(self,parent, id,  size=vsize)
        self.parent =parent
        self.SetMinSize(vsize)
        
class AnswerWindow(wx.ScrolledWindow):
    def __init__(self,parent,count):
        self.parent = parent
        id = -1
        wx.ScrolledWindow.__init__(self, parent,id)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
        self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
        self.SetScrollbars(1, 1, 1000, 48*count, 0, 0)
        self.SetBackgroundColour("WHITE")
        parent.SetTitle("Answer Sheet")
        
    def OnRightDown(self, event):
        self.scroller.Start(event.GetPosition())

    def OnRightUp(self, event):
        self.scroller.Stop()
        
    def OnPaint(self,event):
        dc = wx.PaintDC(self)
        self.DoPrepareDC(dc)
        pen = wx.Pen(wx.BLACK, 1)
        dc.SetPen(pen)
        dc.Clear()
        te = dc.GetTextExtent("Answer  WorkSheet")
        w,h = self.GetSize()
        font = dc.GetFont()
        dc.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        dc.DrawText("Answer  WorkSheet",(w - te[0])/2,20)
        #dc.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        dc.SetFont(font)
        dc.DrawLine(20, 40, w -20, 40)
        dc.DrawLine(20, 100, 620, 100)
        dc.DrawLine(20, 100, 20, 140)
        dc.DrawText("No.",40,120)
        dc.DrawLine(80, 100, 80, 140)
        dc.DrawText("Problem",100,120)
        dc.DrawLine(220, 100, 220, 140)
        dc.DrawText("Your Answer",260,120)
        dc.DrawLine(360, 100, 360, 140)
        dc.DrawText("Correct Answer",400,120)
        dc.DrawLine(520, 100, 520, 140)
        dc.DrawText("Result",560,120)
        dc.DrawLine(620, 100, 620, 140)
        dc.DrawLine(20, 140, 620, 140)
        count = self.parent.mywindow.count
        win = self.parent.mywindow
        #con = lite.connect('math')
        #cur = con.cursor()

        for i in range(win.count):
            dc.DrawText(str(i +1),40,160+40*i)
            num1 = win.num_first[i]
            num2 = win.num_sec[i]
            op = win.oper
            dc.DrawText(str(num1)+op+str(num2),100,160+40*i)
            if op == "+":
                correct_answer = num1 + num2
            if op == "-":
                correct_answer = num1 - num2
            if op == "x":    
                correct_answer = num1 * num2
            if op == u"÷" :   
                correct_answer = num1 / num2
                
            dc.DrawText(str(correct_answer),420, 160+40*i)   
            dc.DrawLine(20, 180 +i*40, 620, 180 +i*40)
            your_answer =win.d[10+i].GetValue()
            dc.DrawText(str(your_answer),240, 160+40*i)
            #yes =u'√'
            yes = "OK"
            no="X"
            new_answer = your_answer.lstrip()
            your_answer1 = new_answer.rstrip()
            result = 0
            if your_answer1 != "":
                answer = int(your_answer1)
                if int(your_answer1 )== int(correct_answer):
                    result = 1
                    dc.SetTextForeground("GREEN")
                    dc.DrawText(yes,540, 160+40*i)
                    dc.SetTextForeground("BLACK")
                else:
                    dc.SetTextForeground("RED")
                    dc.DrawText(no,540, 160+40*i)
                    dc.SetTextForeground("BLACK")
            else:
                answer = 0;
                dc.SetTextForeground("RED")
                dc.DrawText(no,540, 160+40*i)
                dc.SetTextForeground("BLACK")
            problem = str(num1)+op+str(num2)
            #cur.execute('insert into answer_sheet(problem,answer,result) values(?,?,?)',(problem,answer,result))
            
            
        dc.DrawLine(20, 140 , 20, 140 + count*40)
        dc.DrawLine(80, 140 , 80, 140 + count*40)
        dc.DrawLine(220, 140 , 220, 140 + count*40)
        dc.DrawLine(360, 140 , 360, 140 + count*40)
        dc.DrawLine(520, 140 , 520, 140 + count*40)
        dc.DrawLine(620, 140 , 620, 140 + count*40)
        # con.commit()
        #cur.close()
        #con.close()

class MyWindow(wx.ScrolledWindow):
    def __init__(self,parent,ops,kind,count):
        
        self.parent = parent
        id = -1
        wx.ScrolledWindow.__init__(self, parent,id)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
        self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
        self.SetScrollbars(1, 1, 1000, 40*count, 0, 0)
        self.SetBackgroundColour("WHITE")
        self.scroller = wx.lib.dragscroller.DragScroller(self)
        self.SetOps(ops)
        parent.SetTitle(self.oper_str +"  Worksheet")
        self.SetOpsType(kind)
        self.count = count
        self.num_first = array('i')
        self.num_sec = array('i')
        self.answer = array('i')
        self.d = {}
        for i in range(self.count):
            num1 = random.randint(self.start1,self.end1)
            num2 = random.randint(self.start2,self.end2)
            if num1 < num2:
                temp = num1
                num1 = num2
                num2 = temp
            if self.ops == 3:
                if num2 ==0:
                   num2 =1   
                self.num_first.append(num1*num2)
            else:
                self.num_first.append(num1)
            self.num_sec.append(num2)
        for i in range(self.count/5):
            for column in range(5):   
                text =  wx.TextCtrl(self,10+5*i +column,"",wx.Point( column*200+10,100*i +150),wx.Size(40,20))
                self.d[10+5*i +column] = text
                      
        self.answer = wx.Button(self, 12, "Get Answers", wx.Point(410 , 20*self.count +100))
        self.close = wx.Button(self, 13, "Close", wx.Point(410 , 20*self.count +140))
        wx.EVT_BUTTON(self, 12, self.OnAnswer)
        wx.EVT_BUTTON(self,13,self.OnClose)
        

    def OnAnswer(self,event):
        frame2 = MinFrame(self,-1,(720,620))
        frame2.mywindow = self
        panel1 = AnswerWindow(frame2,self.count)
        frame2.Show(1)
        
    def OnClose(self,event):
        self.parent.Destroy()
        
    def SetOps(self,ops):
        self.ops = ops
        if ops == 0:
            self.oper = "+"
            self.oper_str = "Addition"
        if ops == 1:
            self.oper = "-"
            self.oper_str = "Subtraction"
        if ops == 2:
            self.oper = "x"
            self.oper_str = "Multiplication"
        if ops == 3:
            #self.oper = "/"
            self.oper = u"÷"
            self.oper_str = "Division"
            
    def SetOpsType(self,kind):
        if kind == 0:
            self.start1 = 0
            self.start2 = 0
            self.end1 = 12
            self.end2 = 12
            
        elif kind == 1:
            self.start1 = 10
            self.start2 = 0
            self.end1   = 99
            self.end2 = 9
            
        elif kind == 2:
            self.start1 = 10
            self.start2 = 10
            self.end1   = 99
            self.end2   = 99
            
        elif kind == 3:
            self.start2 = 0
            self.start1 = 100            
            self.end1   = 999
            self.end2   = 9
            
        elif kind == 4:
            self.start1 = 100
            self.start2 = 10
            self.end1   = 999
            self.end2   = 99
            
        else:
            self.start1 = 100
            self.start2 = 100
            self.end1   = 999
            self.end2   = 999    
        
    def OnPaint(self,event):
        dc = wx.PaintDC(self)
        self.DoPrepareDC(dc)
        pen = wx.Pen(wx.BLACK, 1)
        dc.SetPen(pen)
        dc.Clear()
        te = dc.GetTextExtent(self.oper_str+"  WorkSheet")
        w,h = self.GetSize()
        dc.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        dc.DrawText(self.oper_str+"  WorkSheet",(w - te[0])/2,20)
        dc.DrawLine(20, 40, w -20, 40)
        for i in range(self.count/5):
            for column in range(5):
                index = i*5 + column
                num1 = self.num_first[index]
                num2 = self.num_sec[index]
                
                len_diff = len(str(num1)) -len(str(num2))
                if len_diff > 0:
                    sec = " "*len_diff + str(num2)
                    first =str(num1)
                    space = len_diff
                else:
                    first = " "+str(num1)
                    sec = str(num2)
                    space =2
                pen = wx.Pen(wx.BLACK, 1) 
                dc.SetPen(pen)
                dc.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))
                dc.DrawText(str(i*5 + column +1)+".",( column*200 +10),100*i +80)
                dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
                dc.DrawText(first,(30 + column*200) ,100*i +100)
                dc.DrawText(self.oper+sec,(column*200 +30-1-space),100*i +120)
                dc.SetTextForeground(wx.BLACK)
                dc.DrawLine(10+column*200,100*i +140,50 + column*200,100*i +140)
                
    def OnRightDown(self, event):
        self.scroller.Start(event.GetPosition())

    def OnRightUp(self, event):
        self.scroller.Stop()


class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(490, 450))

        panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)
        font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT)

        # Add panel 1
        panel1 = wx.Panel(panel, -1)
        vbox1 = wx.BoxSizer(wx.VERTICAL)
        title = wx.StaticText(panel1, -1,"Math Worksheet")
        title.SetFont(font)
        vbox1.Add(title,0,wx.ALIGN_CENTRE)
        vbox1.Add((-1, 40))
        line = wx.StaticLine(panel1, -1, (25, 50), (400,1) )
        vbox1.Add(line,1,wx.EXPAND|wx.LEFT|wx.RIGHT,20)
        vbox1.Add((-1, 40))
        panel1.SetSizer(vbox1)
        vbox.Add(panel1, 0, wx.BOLD|wx.ALIGN_CENTRE | wx.TOP, 9)
        vbox.Add((-1, 20))

        # Add panel 2
        panel2 = wx.Panel(panel,-1)
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        panel2.SetSizer(hbox2)
        date = wx.StaticText(panel2, -1, 'Date')
        date.SetFont(font)
        hbox2.Add(date,0,wx.RIGHT,20)
        self.todate = wx.TextCtrl(panel2, -1)
        hbox2.Add(self.todate,1)
        vbox.Add(panel2,1,wx.EXPAND|wx.LEFT|wx.RIGHT,20)
        
        # Add panel 3
        panel3 = wx.Panel(panel, -1)
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        panel3.SetSizer(hbox3)
        op = wx.StaticText(panel3, -1, 'Operation')
        op.SetFont(font)
        self.sampleList = ['Addition', 'Subtraction', 'Multiplication', 'Division']
        op_name = wx.ComboBox(panel3, 30, "", wx.Point(0, 0), wx.Size(95, -1),
                   self.sampleList, wx.CB_DROPDOWN)
        hbox3.Add(op,0,wx.RIGHT,20)
        op_font = op_name.GetFont()
        op_font.SetWeight(wx.BOLD)
        op_name.SetFont(op_font)
        hbox3.Add(op_name,1)
        vbox.Add(panel3,1,wx.EXPAND|wx.LEFT|wx.RIGHT,20)
        vbox.Add((-1, 10))
        
        # Add panel 4
        panel4 = wx.Panel(panel,-1)
        hbox4 = wx.BoxSizer(wx.HORIZONTAL)
        prob1 = wx.StaticBox(panel4,-1,'Type of problem')
        prob1.SetFont(font)
        sizer11 = wx.StaticBoxSizer(prob1,orient=wx.HORIZONTAL)
        hbox4.Add(sizer11,1,wx.RIGHT,20)
        btn_777 = wx.RadioButton(panel4, 1, 'upto 12')
        font_777 = btn_777.GetFont()
        font_777.SetWeight(wx.BOLD)
        btn_777.SetFont(font_777)

        btn_787 = wx.RadioButton(panel4, 2, '2 by 1')
        font_787 = btn_787.GetFont()
        font_787.SetWeight(wx.BOLD)
        btn_787.SetFont(font_787)

        btn_pil = wx.RadioButton(panel4, 3, '2 by 2')
        font_pil = btn_pil.GetFont()
        font_pil.SetWeight(wx.BOLD)
        btn_pil.SetFont(font_pil)
        
        sizer11.Add(btn_777)
        sizer11.Add(btn_787)
        sizer11.Add(btn_pil)
        #sizer11.Add(wx.RadioButton(panel4, 4, ''))
        #sizer11.Add(wx.RadioButton(panel4, 5, '3 by 3'))
        #sizer11.Add(wx.RadioButton(panel4, 6, '4 by 4'))
        panel4.SetSizer(hbox4)
        vbox.Add(panel4,1,wx.EXPAND|wx.LEFT|wx.RIGHT,20)
        vbox.Add((-1, 10))

        # Add panel 5
        panel5 = wx.Panel(panel,-1)
        hbox5 = wx.BoxSizer(wx.HORIZONTAL)
        prob2 = wx.StaticBox(panel5,5,'Number of problems ')
        prob2.SetFont(font)
        sizer21 = wx.StaticBoxSizer(prob2,orient=wx.HORIZONTAL)
        hbox5.Add(sizer21,1,wx.RIGHT,20)
        panel5.btn1 = wx.RadioButton(panel5, 7, '10')
        sizer21.Add(panel5.btn1)
        sizer21.Add(wx.RadioButton(panel5, 8, '20'))
        sizer21.Add(wx.RadioButton(panel5, 9, '30'))
        sizer21.Add(wx.RadioButton(panel5, 10, '40'))
        sizer21.Add(wx.RadioButton(panel5, 11, '50'))
        panel5.SetSizer(hbox5)
        vbox.Add(panel5,1,wx.EXPAND|wx.LEFT|wx.RIGHT,20)

        # Add panel 6
        panel6 = wx.Panel(panel,-1)
        hbox6 = wx.BoxSizer(wx.HORIZONTAL)
        creater = wx.Button(panel6, 20, "Create")
        leaver  = wx.Button(panel6, 21, "Quit")
        hbox6.Add((191, -1), 1, wx.EXPAND | wx.ALIGN_RIGHT)
        hbox6.Add(creater,1,wx.ALIGN_RIGHT|wx.RIGHT,10)
        hbox6.Add(leaver,1,wx.ALIGN_RIGHT)
        panel6.SetSizer(hbox6)
        vbox.Add(panel6,1,wx.EXPAND|wx.RIGHT,20)
        panel.SetSizer(vbox)

        #Add event handlers
        self.Bind(wx.EVT_COMBOBOX, self.OnSelect)
        wx.EVT_RADIOBUTTON(self,1,self.OnType)
        wx.EVT_RADIOBUTTON(self,2,  self.OnType)
        wx.EVT_RADIOBUTTON(self, 3, self.OnType)
        #wx.EVT_RADIOBUTTON(self, 4, self.OnCount)
        #wx.EVT_RADIOBUTTON(self, 5, self.OnCount)
        #wx.EVT_RADIOBUTTON(self, 6, self.OnCount)
        wx.EVT_RADIOBUTTON(self, 7, self.OnCount)
        wx.EVT_RADIOBUTTON(self, 8, self.OnCount)
        wx.EVT_RADIOBUTTON(self, 9, self.OnCount)
        wx.EVT_RADIOBUTTON(self, 10, self.OnCount)
        wx.EVT_RADIOBUTTON(self, 11, self.OnCount)
        wx.EVT_BUTTON(self, 20, self.OnCreate)
        wx.EVT_BUTTON(self, 21, self.OnQuit)
        self.ops = 0
        self.count = 10
        self.type = 0
        self.Centre()
        self.Show(True)
        
    def OnQuit(self,event):
        self.Destroy()
        
    def OnCreate(self,event):
        frame1 = MinFrame(self,-1,(1020,620))
        #self.edname.AppendText(" Test Id %d\n" %event.GetId())
        panel1 = MyWindow(frame1,self.ops,self.type,self.count)
        frame1.Show(1)
        #con = lite.connect('math')
        #cur = con.cursor()
        #grade = 1
        #cur.execute('insert into student(name,grade) values(?,?)',(self.edname.GetValue(),grade))
        #cur.execute('insert into test(op,count,correct,date) values(?,?,?,?)',(self.ops,self.count,0,self.todate.GetValue()))
        #con.commit()
        #cur.close()
        #con.close()
    def OnCount(self,event):
        id = event.GetId()
        self.count = 10*(id-6) #Convert from id to real count
                
    def OnType(self,event):
        self.type = event.GetId()-1
        
    def OnSelect(self,event):
        self.ops = event.GetSelection()
        
        
app = wx.PySimpleApp()
frame = MyFrame(None, -1,"MATH Worksheet")
frame.Show(1)
app.MainLoop()
