# -*- coding: utf-8 -*-#

import wx
import wx.lib.scrolledpanel as scrolled
import wx.stc as st

class STC(st.StyledTextCtrl):
    def __init__(self, *args, **kwargs):
        super(STC, self).__init__(*args, **kwargs)

        self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
        self.Bind(wx.EVT_SCROLLWIN, self.OnScroll1)
        
    def OnScroll1(self, event):
        clone = event.Clone()
        clone.SetId(self.GetParent().GetId())
        clone.SetEventObject(self.GetParent())
        self.GetEventHandler().ProcessEvent(clone)
        event.Skip()
#        self.Bind(wx.EVT_MOUSEWHEEL, self.moveparentpanel)
#        
#    def moveparentpanel(self, event):
#        self.GetParent().GetEventHandler().ProcessEvent(event)
#        event.Skip()

    def OnRightDown(self, e):
        control = e.GetEventObject()
        sizer = control.GetContainingSizer()
        print control
        print sizer
        print self.GetGrandParent().GetItemIndex(sizer, control)


class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        self.Autosizer = wx.FlexGridSizer(cols=2)
        self.Autosizer.SetFlexibleDirection(wx.VERTICAL)

        self.scrolled_panel = scrolled.ScrolledPanel(self, -1,
                    style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1")
        self.scrolled_panel.SetAutoLayout(1)
        self.scrolled_panel.SetupScrolling()

        self.scrolled_panel.SetSizer(self.Autosizer)

        self.ctrlsDict = {}
        self.ctrlsReverstDic = {}

        for x in range(5):
            self.AddControl(x)

        panelSizer = wx.BoxSizer(wx.VERTICAL)
        panelSizer.Add(self.scrolled_panel, 1, wx.EXPAND)
#        panelSizer.Add(btn)
        self.SetSizer(panelSizer)

        btn = wx.Button(self, wx.ID_ANY, label="add control")
        btn.Bind(wx.EVT_BUTTON, self.AddControl)
        
        self.Autosizer.Add(btn)
        self.Autosizer.AddSpacer(10)
        

        btn = wx.Button(self, wx.ID_ANY, label="Print Text")
        btn.Bind(wx.EVT_BUTTON, self.OnTest)

    def OnTest(self, event):
        for item in self.ctrlsReverstDic: # ctrlsDict:
            control = wx.FindWindowById(item)
            print control.GetLabelText()

    def AddControl(self, no):
        text = wx.StaticText(self.scrolled_panel, label='Added control - %s' % no)
        editor = STC(self.scrolled_panel)
        editor.Text = """1
2
3
4
5"""
        self.Autosizer.Add(text)
        self.Autosizer.Add(editor)

        self.Layout()
        self.ctrlsReverstDic[text.GetId()] = editor.GetId()

    def GetItemIndex(self, sizer, item):
        """
        Returns the index of the given *item* within the sizer. Does not
        search recursively.  The *item* parameter can be either a window
        or a sizer.  An assertion is raised if the item is not found in
        the sizer.
        """
        sItem = sizer.GetItem(item)
        assert sItem is not None, "Item not found in the sizer."
        allItems = sizer.Children
        idx = 0
        for i in allItems:
            if i.this == sItem.this:
                break
            idx += 1
        return idx



from wx.lib.mixins.inspection import InspectionMixin

class AnApp(wx.App, InspectionMixin):
    def OnInit(self):
        self.Init() # InspectionMixin

        return True

if __name__ == '__main__':

    app = AnApp()
    frame = wx.Frame(None)
    panel = TestPanel(frame)
    frame.Show()
    app.MainLoop()

