#Boa:Dialog:MakePyDialog
import wx
from wx.lib.anchors import LayoutAnchors
from win32com.client import selecttlb,makepy
import traceback, types
def create(parent):
return MakePyDialog(parent)
[wxID_MAKEPYDIALOG, wxID_MAKEPYDIALOGBFORDEMAND, wxID_MAKEPYDIALOGCANCEL,
wxID_MAKEPYDIALOGDIRECTSPECIFICATION, wxID_MAKEPYDIALOGOK,
wxID_MAKEPYDIALOGTYPELIBRARYLIST,
] = [wx.NewId() for _init_ctrls in range(6)]
class MakePyDialog(wx.Dialog):
def _init_coll_typeLibraryList_Columns(self, parent):
# generated method, don't edit
parent.InsertColumn(col=0, format=wx.LIST_FORMAT_CENTRE,
heading='Library Name', width=372)
def _init_ctrls(self, prnt):
# generated method, don't edit
wx.Dialog.__init__(self, id=wxID_MAKEPYDIALOG, name='MakePyDialog',
parent=prnt, pos=wx.Point(498, 119), size=wx.Size(420, 433),
style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
title='COM Library Generator')
self.SetAutoLayout(True)
self.SetClientSize(wx.Size(412, 406))
self.Bind(wx.EVT_INIT_DIALOG, self.OnMakepydialogInitDialog)
self.typeLibraryList = wx.ListCtrl(id=wxID_MAKEPYDIALOGTYPELIBRARYLIST,
name='typeLibraryList', parent=self, pos=wx.Point(16, 40),
size=wx.Size(376, 280), style=wx.LC_NO_HEADER | wx.LC_REPORT,
validator=wx.DefaultValidator)
self.typeLibraryList.SetToolTipString('List of the registered COM type libraries on your system')
self.typeLibraryList.SetConstraints(LayoutAnchors(self.typeLibraryList,
True, True, True, True))
self._init_coll_typeLibraryList_Columns(self.typeLibraryList)
self.typeLibraryList.Bind(wx.EVT_LEFT_DCLICK,
self.OnTypelibrarylistLeftDclick)
self.OK = wx.Button(id=wxID_MAKEPYDIALOGOK, label='Generate', name='OK',
parent=self, pos=wx.Point(200, 360), size=wx.Size(88, 27),
style=0)
self.OK.SetToolTipString('Click to generate a wrapper for the selected library')
self.OK.SetConstraints(LayoutAnchors(self.OK, False, False, True, True))
self.OK.Bind(wx.EVT_BUTTON, self.OnOkButton, id=wxID_MAKEPYDIALOGOK)
self.Cancel = wx.Button(id=wx.ID_CANCEL, label='Cancel', name='Cancel',
parent=self, pos=wx.Point(304, 360), size=wx.Size(88, 27),
style=0)
self.Cancel.SetToolTipString('Cancel wrapper generation')
self.Cancel.SetConstraints(LayoutAnchors(self.Cancel, False, False,
True, True))
self.bForDemand = wx.CheckBox(id=wxID_MAKEPYDIALOGBFORDEMAND,
label='Generate Classes on Demand', name='bForDemand',
parent=self, pos=wx.Point(144, 328), size=wx.Size(248, 20),
style=0)
self.bForDemand.SetToolTipString('Minimises amount of code generated by only wrapping used classes (recommended). Clear to generate a single-file wrapper.')
self.bForDemand.SetValue(True)
self.bForDemand.SetConstraints(LayoutAnchors(self.bForDemand, False,
False, True, True))
self.bForDemand.Bind(wx.EVT_CHECKBOX, self.OnBfordemandCheckbox,
id=wxID_MAKEPYDIALOGBFORDEMAND)
self.directSpecification = wx.TextCtrl(id=wxID_MAKEPYDIALOGDIRECTSPECIFICATION,
name='directSpecification', parent=self, pos=wx.Point(16, 8),
size=wx.Size(376, 28), style=0, value='')
self.directSpecification.SetToolTipString('Type text here to search for matching type libraries')
self.directSpecification.SetConstraints(LayoutAnchors(self.directSpecification,
True, True, True, False))
self.directSpecification.Bind(wx.EVT_TEXT,
self.OnDirectspecificationText,
id=wxID_MAKEPYDIALOGDIRECTSPECIFICATION)
def __init__(self, parent):
self._init_ctrls(parent)
self.generatedFilename =''
def OnTypelibrarylistLeftDclick(self, event):
return self.OnOkButton( event )
def OnOkButton(self, event):
index = self.typeLibraryList.GetNextItem(-1,state=wx.LIST_STATE_SELECTED )
# there could be multiple selected, should decide what to do then...
if index != -1:
self.generatedFilename = self.Generate( self.libraryList[index] )
print 'generated to filename', self.generatedFilename
return self.EndModal(wx.ID_OK)
def Generate( self, typeLibrary):
""" Generate wrapper for a given type library """
progress = Progress( self )
try:
makepy.GenerateFromTypeLibSpec(
typeLibrary, None,
bForDemand = 1,
bBuildHidden = 1,
progressInstance = progress,
)
filename =progress.filename
progress.Destroy()
except Exception, error:
traceback.print_exc()
errorMessage =wx.MessageDialog( self, str(error), "Generation Failure!", style=wx.OK)
progress.Destroy()
errorMessage.ShowModal()
errorMessage.Destroy()
return None
return filename
def OnDirectspecificationText(self, event):
'''Set focus to any matching item while typing'''
text = self.directSpecification.GetValue()
if text:
items = self.SearchList( text )
if items:
for index in range(self.typeLibraryList.GetItemCount()):
self.typeLibraryList.SetItemState( index, 0, wx.LIST_STATE_SELECTED )
for (index,item) in items:
self.typeLibraryList.SetItemState( index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED )
self.typeLibraryList.EnsureVisible( items[0][0] )
event.Skip()
def SearchList( self, text ):
""" Attempt to find the specified text in the list
of DLL names, classID, and descriptions."""
import re
finder = re.compile( text, re.IGNORECASE )
items = []
wx.BeginBusyCursor()
try:
for attribute in ('desc', 'clsid','dll',):
for index in range(len( self.libraryList)):
librarySpecification = self.libraryList[index]
try:
value = getattr( librarySpecification, attribute)
if value and type(value) == types.StringType:
if finder.search( value ):
items.append( (index, librarySpecification))
except Exception, error:
pass
## print error, librarySpecification, attribute, repr(getattr( librarySpecification, attribute))
finally:
wx.EndBusyCursor()
return items
def OnMakepydialogInitDialog(self, event):
'''Initialisation of the dialog starts up a
process of loading the type library definitions.'''
wx.BeginBusyCursor()
try:
self.libraryList = libraryList = selecttlb.EnumTlbs()
libraryList.sort()
for index in range(len( libraryList)):
librarySpecification = libraryList[index]
self.typeLibraryList.InsertStringItem(
index,
librarySpecification.desc
)
finally:
wx.EndBusyCursor()
def OnBfordemandCheckbox(self, event):
pass
class Progress(wx.ProgressDialog):
verboseLevel = 1
filename = ""
def __init__(self, parent):
wx.ProgressDialog.__init__(
self, "MakePy Progress",
"Generating type library wrappers",
parent=parent, style=wx.PD_AUTO_HIDE | wx.PD_APP_MODAL,
)
def Close(self, event=None):
pass
def Starting( self, description=None ):
pass
def Finished(self):
pass
def SetDescription(self, desc, maxticks = None):
self.Update(-1, newmsg = desc )
def Tick(self, desc = None):
pass
def VerboseProgress(self, desc, verboseLevel = 2):
if self.verboseLevel >= verboseLevel:
self.SetDescription(desc)
def LogBeginGenerate(self, filename):
self.VerboseProgress("Generating to %s" % filename, 1)
self.filename = filename
def LogWarning(self, desc):
self.VerboseProgress("WARNING: " + desc, 1)
if __name__ == "__main__":
class DemoFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, 2400, "File entry with browse", size=(500,150) )
dialog = MakePyDialog( self )
dialog.ShowModal( )
dialog.Destroy()
class DemoApp(wx.App):
def OnInit(self):
wxImage_AddHandler(wxJPEGHandler())
wx.Image_AddHandler(wxPNGHandler())
wx.Image_AddHandler(wxGIFHandler())
frame = DemoFrame(None)
frame.Show(True)
self.SetTopWindow(frame)
return True
def test( ):
app = DemoApp(0)
app.MainLoop()
print 'Creating dialog'
test( )
|