# Quicknote -- a small sticky notes app for PyS60 using the topwindow module
#
# (c) 2/2008 Goetz Schwandtner <schwandtner@googlemail.com>
#
# see www.schwandtner.info



import topwindow, graphics
import appuifw, e32

class Quicknote(object):
    def __init__(self):
        self.dummyimg=graphics.Image.new((10,10))
        ctmp=appuifw.Canvas()
        self.BORDER=10
        self.MAXW=ctmp.size[0]-self.BORDER-50
        self.MAXH=ctmp.size[1]  
        self.tw=topwindow.TopWindow()
        self.running=False
        self.set(u"<empty>")
        self.show()
    def set(self,text):
        self.text=text
        self.update()
    def sum(self,seq):
        return(reduce(lambda x,y: x+y, seq))
    def update(self):
        lines=self.wrap_all(self.text)
        l_w=[self.txw(t) for t in lines]
        l_h=[self.txh(t)+2 for t in lines]
        self.W=min(max(l_w)+self.BORDER,self.MAXW)
        self.H=self.sum(l_h)+self.BORDER
        self.tw.size=(self.W,self.H)
        self.buf=graphics.Image.new((self.W,self.H))
        self.buf.clear(0xffff50)
        yp=self.BORDER//2
        for l in lines:
            yp += self.txh(l)+2
            self.buf.text((0,yp),l)
        self.buf.rectangle((self.W-8,self.H-8,self.W,self.H),outline=0)
        self.buf.line((self.W-8,self.H,self.W,self.H-8),outline=0)
        self.tw.add_image(self.buf,(0,0))
    def show(self):
        self.tw.show()
    def hide(self):
        self.tw.hide()
    def menu_set(self):
        t=appuifw.query(u"Set Note", "text",self.text)
        if t:
            self.set(t)
    def run(self):
        self.running=True
        appuifw.app.menu=[(u"Set Note", self.menu_set),(u"Show",self.show),(u"Hide",self.hide),(u"about",self.about)]
        appuifw.app.exit_key_handler=self.stop
        while self.running:
            e32.ao_sleep(.5)
    def stop(self):
        self.hide()
        self.running=False
    def about(self):
        appuifw.note(u'Quicknote \n (c) 2008 Goetz Schwandtner\nschwandtner@googlemail.com')
    def txw(self,text):
        return (self.dummyimg.measure_text(text))[0][2]
    def txh(self,text):
        return -(self.dummyimg.measure_text(text))[0][1]
    def wrap_line(self,text):
        text=text.lstrip()
        op=len(text)
        np=text.find(" ")
        while np>0 and self.txw(text[:np])<self.MAXW:
            op=np
            np=text.find(" ",np+1)
        if np<0:
            op=len(text)
        return(text[:op],text[op+1:])
    def wrap_all(self,text):
        lines=[]
        while text != "":
            line,text = self.wrap_line(text)
            lines.append(line)
        return(lines)        

q=Quicknote()
q.run()
appuifw.app.set_exit()
