#!/usr/bin/env python

import wx

class MyWindow(wx.ScrolledWindow):
    def __init__(self, *args, **kw):
        wx.ScrolledWindow.__init__(self, *args, **kw)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
        self._radius = 10
        self._dots = [(10,10), (100,100)]
        self.SetScrollbars(100, 100, 20, 20, 0, 0)
        self.SetBackgroundColour(wx.Colour(0, 0, 0))

    def Offset(self):
        xm, ym = self.GetScrollPixelsPerUnit()
        tx, ty = self.ViewStart
        return -tx * xm, -ty * ym

    def OnPaint(self, e):
        dc = wx.PaintDC(self)
        #self.DoPrepareDC(dc) doesn't seem to work
        gc = wx.GraphicsContext.Create(dc)
        gc.Translate(*self.Offset())
        gc.SetBrush(wx.Brush("cyan"))
        for dot in self._dots:
            path = gc.CreatePath()
            path.AddCircle(dot[0], dot[1], self._radius)
            gc.FillPath(path)

    def SRefresh(self, x, y, w, h):
        tx, ty = self.Offset()
        self.RefreshRect(wx.Rect(x + tx, y + ty, w, h))
                
    def OnClick(self, e):
        tx, ty = self.Offset()
        x, y = e.GetX() - tx, e.GetY() - ty
        self._dots.append((x, y))
        #self.Refresh()
        self.SRefresh(x - self._radius, y - self._radius,
            self._radius *2, self._radius *2)

class MagicSash(wx.SplitterWindow):
    def __init__(self, *args, **kw):
        wx.SplitterWindow.__init__(self, *args, **kw)
        self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.OnSashDragged, self)
        self.Bind(wx.EVT_SIZE, self.OnSize, self)
        
    def OnSashDragged(self, e):
        print "Pos:", e.SashPosition
    
    def OnSize(self, e):
        print "Size:", e.Size
        e.Skip()

class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        wx.Frame.__init__(self, *args, **kw)
        filemenu= wx.Menu()
        self.Bind(wx.EVT_MENU, self.OnExit,
            filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program"))
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File")
        self.SetMenuBar(menuBar)
        self._vsash = MagicSash(self)
        vpanel = wx.Panel(self._vsash)
        hsash = wx.SplitterWindow(self._vsash)
        my = MyWindow(hsash)
        hpanel = wx.Panel(hsash)
        hsash.SplitHorizontally(my, hpanel)
        self._vsash.SplitVertically(vpanel, hsash)
        self._vsash.SetSashGravity(1.0)
        
    def adjust(self):
        w, h = self._vsash.GetSizeTuple()
        self._vsash.SetSashPosition(w - 200)
        

    def OnExit(self, e):
        self.Close(True)

class MyApp(wx.App):
    def OnInit(self):
        print wx.DisplaySize()
        frame = MyFrame(None, title="This is a test",
            size=(500, 400))
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

def main():
    app = MyApp(0)
    app.MainLoop()

if __name__ == "__main__":
    main()


