#----------------------------------------------------------------------------
# Name:        wx.lib.mixins.inspect
# Purpose:     A mix-in class that can add PyCrust-based inspection of the app
#
# Author:      Robin Dunn
#
# Created:     21-Nov-2006
# RCS-ID:      $Id$
# Copyright:   (c) 2006 by Total Control Software
# Licence:     wxWindows license
#----------------------------------------------------------------------------

# NOTE: This class is based on ideas sent to the wxPython-users
# mail-list by Dan Eloff.

import wx.py

class InspectionMixin(object):
    """
    This class is intended to be used as a mix-in with the wx.App
    object.  When used it will add the ability to popup a PyCrust
    window where the widget under the mouse cursor will be loaded into
    the shell's namespace as 'win'.

    To use this class simply derive a class from wx.App and
    InspectionMixin and then call the Init() method from the app's
    OnInit.
    """
    def Init(self, pos=(-1, -1), size=(-1, -1)):
        """
        Make the event binding that will activate the PyCrust window.
        """
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)
        self._crust = None
        self._pos = pos
        self._size = size


    def OnKeyPress(self, evt):
        """
        Event handler
        """
        if evt.AltDown() and evt.CmdDown() and evt.KeyCode == ord('I'):
            self.ShowShell()
        else:
            evt.Skip()


    def ShowShell(self):
        """
        Show the PyCrust window.
        """
        if not self._crust:
            self._crust = wx.py.crust.CrustFrame(self.GetTopWindow(),
                                                 pos = self._pos, size = self._size)
            self._crust.shell.interp.locals['app'] = self
        win = wx.FindWindowAtPointer()
        self._crust.shell.interp.locals['win'] = win
        self._crust.Show()
