#!/usr/bin/env python

# This Multilingual Handwriting Writepad requires an internet connection to be functional.
# It should run on major OSes such as Windows XP/Vista, Linux, FreeBSD and 
# MacOS X etc. Python runtime is required to run this program.

# Note 0: 
# This program is created to test some of the functions provided by Google App
# Engine. The client side program is provided by the author "as-is". Any
# express or implied warranties, including, but not limited to, the implied
# warranties of merchantability and fitness for a particular purpose are
# disclaimed.

# Note 1:
# You may need to set up the default fonts for TCL/TK to display all the foreign
# characters on Linux/FreeBSD properly. However, changing the default locale to 
# a non-English one is not required.


from Tkinter import *
import urllib, urllib2

app_site = "http://cwritepad.appspot.com/reco/gb2312"
app_key = "11773edfd643f813c18d82f56a8104ed"
app_encoding =  "GB2312"

class Application(Frame):
    def reco_char(self):
        self.points.append(255)
        self.points.append(255)    	
    	result = self.web_reco(self.points)
        if result != None:
            self.update_result(result)
            self.reset_canvas()

    def web_reco( self, points ):
        data = str(points)
        params = urllib.urlencode(dict(q=data, key=app_key))
        return urllib2.urlopen(app_site, params).read()

    def update_result(self, s):
        print(s.decode(app_encoding))
        self.f.result_label["text"] = s[0:2].decode(app_encoding)
        self.char_num += 1
        self.f.index_label["text"] = self.char_num
		
    def reset_canvas(self):
    	self.writing_canvas.delete("all")
    	self.stroke_num = 0
    	self.points = []
    	self.prevpoints = []
        self.pendown = False
    	
    def mouse_down(self, event):
        self.pendown = True
        self.prevpoint = [ event.x, event.y ]
        self.writing_canvas.create_oval(event.x-3, event.y-3, event.x+3, event.y+3, fill="red")
        self.points.append(event.x)
        self.points.append(event.y)

    def mouse_up(self, event):
        if self.pendown:
            self.pendown = False
            self.points.append(255)
            self.points.append(0)
            self.writing_canvas.create_oval(event.x-2, event.y-2, event.x+2, event.y+2, fill="blue")
            self.update_stroke()

    def mouse_move(self, event):
        if self.pendown:
            self.writing_canvas.create_line(self.prevpoint[0], self.prevpoint[1], event.x, event.y, fill="blue", width=3)
            self.prevpoint = [ event.x, event.y ]
            self.points.append(event.x)
            self.points.append(event.y)

    def update_stroke(self):
        self.stroke_num += 1
        self.f.stroke_label["text"] = self.stroke_num
    
    def create_widgets(self):
        self.writing_canvas = Canvas(self)
        self.writing_canvas["bg"] = "white"
        self.writing_canvas["width"] = 250
        self.writing_canvas["height"] = 250
        self.writing_canvas.pack({"side": "left"})

        self.f = Frame(self)
        self.f.pack({"side": "left", "expand": "yes", "fill" : "y"})
        
        self.f.quit_button = Button(self.f)
        self.f.quit_button["text"] = "QUIT"
        self.f.quit_button["fg"]   = "red"
        self.f.quit_button["command"] =  self.quit
        self.f.quit_button.pack({"side": "top"})

        self.f.reco_button = Button(self.f)
        self.f.reco_button["text"] = "Reco",
        self.f.reco_button["command"] = self.reco_char
        self.f.reco_button.pack({"side": "top"})

        
        self.f.index_label = Label(self.f, text="0")
        self.f.index_label.pack({"side": "bottom"})

        self.f.stroke_label = Label(self.f, text="0")
        self.f.stroke_label.pack({"side": "bottom"})
        
        self.f.result_label = Label(self.f, text="")
        self.f.result_label.pack({"side": "bottom"})

        self.writing_canvas.bind("<Button-1>", self.mouse_down)
        self.writing_canvas.bind("<B1-Motion>", self.mouse_move)
        self.writing_canvas.bind("<ButtonRelease-1>", self.mouse_up)

        self.char_num = 0

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.create_widgets()
        self.reset_canvas()

root = Tk()
root.title("WritePad")
root.resizable(width=FALSE, height=FALSE)

app = Application(master=root)
app.mainloop()


