Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5037 Modified Files: changelog.txt customDialogs.py outputWindow.py outputWindow.rsrc.py prefsDialog.rsrc.py readme.txt standaloneBuilder.gtk.rsrc.py standaloneBuilder.py standaloneBuilder.rsrc.py Added Files: newProjectWizard.gtk.rsrc.py newProjectWizardPage1.gtk.rsrc.py newProjectWizardPage2.gtk.rsrc.py newProjectWizardPage3.gtk.rsrc.py newProjectWizardPage4.gtk.rsrc.py outputWindow.gtk.rsrc.py prefsDialog.gtk.rsrc.py propertiesDialog.gtk.rsrc.py versionInfo.py Log Message: Multiple bug fixes and enhancements ready for release of 0.8.2 Index: standaloneBuilder.rsrc.py =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/standaloneBuilder.rsrc.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** standaloneBuilder.rsrc.py 9 Sep 2005 12:32:08 -0000 1.6 --- standaloneBuilder.rsrc.py 12 May 2006 16:26:20 -0000 1.7 *************** *** 22,29 **** --- 22,31 ---- 'name':'menuFileOpen', 'label':'&Open\tCtrl+O', + 'command':'openBtn', }, {'type':'MenuItem', 'name':'menuFileSave', 'label':'&Save\tCtrl+S', + 'command':'saveBtn', }, [...966 lines suppressed...] }, --- 575,578 ---- *************** *** 627,632 **** 'name':'StaticText7', 'position':(15, 95), - 'labelSpecified':0, - 'nameSpecified':0, 'text':'Base directory', }, --- 581,584 ---- *************** *** 635,640 **** 'name':'StaticText6', 'position':(15, 65), - 'labelSpecified':0, - 'nameSpecified':0, 'text':'Name', }, --- 587,590 ---- --- NEW FILE: newProjectWizardPage2.gtk.rsrc.py --- {'type':'CustomDialog', 'name':'Template', 'title':'New Project Wizard', 'position':(171, 401), 'size':(600, 310), 'components': [ {'type':'StaticText', 'name':'page2text1', 'position':(175, 0), 'actionBindings':{}, 'font':{'faceName': 'Tahoma', 'family': 'sansSerif', 'size': 20}, 'text':'New project wizard', 'userdata':'page2', }, {'type':'StaticText', 'name':'page2text2', 'position':(175, 60), 'actionBindings':{}, 'text':'Project description', 'userdata':'page2', }, {'type':'TextField', 'name':'projectDesc', 'position':(175, 80), 'size':(415, -1), 'actionBindings':{}, 'userdata':'page2', }, {'type':'Image', 'name':'Image1', 'position':(-5, -5), 'size':(174, 324), 'actionBindings':{}, 'file':'pixmaps/newproject.png', }, ] # end components } # end CustomDialog --- NEW FILE: propertiesDialog.gtk.rsrc.py --- {'type':'CustomDialog', 'name':'propertiesDialog', 'title':'Project properties', 'position':(468, 29), 'size':(450, 385), 'components': [ {'type':'TextField', 'name':'buildPath', 'position':(130, 5), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'buildPathBtn', 'position':(400, 5), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'distPath', 'position':(130, 40), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'distPathBtn', 'position':(400, 40), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'pixmapsPath', 'position':(130, 75), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'pixmapsPathBtn', 'position':(400, 75), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'tarballPath', 'position':(130, 110), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'tarballsPathBtn', 'position':(400, 110), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'TextField', 'name':'appPublisher', 'position':(130, 145), 'size':(265, -1), 'actionBindings':{}, }, {'type':'TextField', 'name':'appURL', 'position':(130, 180), 'size':(265, -1), 'actionBindings':{}, }, {'type':'TextField', 'name':'appLicence', 'position':(130, 215), 'size':(265, -1), 'actionBindings':{}, }, {'type':'Button', 'name':'appLicenceBtn', 'position':(400, 215), 'size':(25, 22), 'actionBindings':{}, 'label':'...', }, {'type':'Choice', 'name':'buildType', 'position':(125, 250), 'size':(140, -1), 'actionBindings':{}, 'items':[u'Single file', u'Single directory'], 'stringSelection':'Single directory', }, {'type':'CheckBox', 'name':'asciiChk', 'position':(120, 285), 'actionBindings':{}, 'label':'No encoding', }, {'type':'CheckBox', 'name':'consoleChk', 'position':(250, 285), 'actionBindings':{}, 'label':'Console', }, {'type':'CheckBox', 'name':'compressChk', 'position':(345, 285), 'actionBindings':{}, 'label':'Compress', }, {'type':'CheckBox', 'name':'striplibsChk', 'position':(120, 305), 'actionBindings':{}, 'label':'Strip libs (Linux)', }, {'type':'CheckBox', 'name':'optimizeChk', 'position':(250, 305), 'actionBindings':{}, 'label':'Optimize', }, {'type':'CheckBox', 'name':'debugChk', 'position':(345, 305), 'actionBindings':{}, 'label':'Debug', }, {'type':'Button', 'id':5100, 'name':'btnOK', 'position':(270, 340), 'actionBindings':{}, 'label':'OK', }, {'type':'Button', 'id':5101, 'name':'btnCancel', 'position':(355, 340), 'actionBindings':{}, 'label':'Cancel', }, {'type':'StaticText', 'name':'StaticText9', 'position':(25, 220), 'actionBindings':{}, 'text':'App licence file', }, {'type':'StaticText', 'name':'StaticText8', 'position':(20, 185), 'actionBindings':{}, 'text':'Application URL', }, {'type':'StaticText', 'name':'StaticText7', 'position':(30, 150), 'actionBindings':{}, 'text':'App publisher', }, {'type':'StaticText', 'name':'StaticText6', 'position':(30, 285), 'actionBindings':{}, 'text':'Build options', }, {'type':'StaticText', 'name':'StaticText5', 'position':(15, 255), 'actionBindings':{}, 'text':'Deployment type', }, {'type':'StaticText', 'name':'StaticText4', 'position':(15, 115), 'actionBindings':{}, 'text':'Tarballs directory', }, {'type':'StaticText', 'name':'StaticText3', 'position':(15, 80), 'actionBindings':{}, 'text':'Pixmaps directory', }, {'type':'StaticText', 'name':'StaticText2', 'position':(5, 45), 'actionBindings':{}, 'text':'Distribution directory', }, {'type':'StaticText', 'name':'StaticText1', 'position':(30, 10), 'actionBindings':{}, 'text':'Build directory', }, ] # end components } # end CustomDialog Index: outputWindow.py =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/outputWindow.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** outputWindow.py 9 Apr 2005 09:30:36 -0000 1.2 --- outputWindow.py 12 May 2006 16:26:20 -0000 1.3 *************** *** 1,52 **** ! #!/usr/bin/python ! # ! # projectmanager message output window ! # ! # This program is free software; you can redistribute it and/or modify ! # it under the terms of the GNU General Public License as published by ! # the Free Software Foundation; either version 2 of the License, or ! # (at your option) any later version. ! # ! # This program is distributed in the hope that it will be useful, ! # but WITHOUT ANY WARRANTY; without even the implied warranty of ! # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! # GNU General Public License for more details. ! # ! # You should have received a copy of the GNU General Public License ! # along with this program; if not, write to the Free Software ! # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! # ! # Copyright (C)2003 Phil Edwards, ph...@li... ! # vim: ts=4 sw=4 ai et ! ! import string ! import time ! ! from PythonCard import model, dialog ! import wx ! ! class outputWindow(model.Background): ! ! def on_initialize(self, event): ! self.parent = self.GetParent() ! ! def clearLines(self): ! self.components.returnedText.text = '' ! self.Refresh() ! wx.Yield() ! ! def addLine(self, text): ! self.components.returnedText.text += str(text) ! #self.Refresh() ! #self.Update() ! #wx.Yield() ! ! def on_closeBtn_mouseClick(self, event): ! self.Hide() ! ! def on_close(self, event): ! self.Hide() ! ! if __name__ == '__main__': ! app = model.PythonCardApp(outputWindow) ! app.MainLoop() --- 1,67 ---- ! #!/usr/bin/python ! # ! # projectmanager message output window ! # ! # This program is free software; you can redistribute it and/or modify ! # it under the terms of the GNU General Public License as published by ! # the Free Software Foundation; either version 2 of the License, or ! # (at your option) any later version. ! # ! # This program is distributed in the hope that it will be useful, ! # but WITHOUT ANY WARRANTY; without even the implied warranty of ! # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! # GNU General Public License for more details. ! # ! # You should have received a copy of the GNU General Public License ! # along with this program; if not, write to the Free Software ! # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! # ! # Copyright (C)2003 Phil Edwards, ph...@li... ! # vim: ts=4 sw=4 ai et ! ! import string ! import time ! import sys ! ! from PythonCard import model, dialog ! import wx ! ! class outputWindow(model.Background): ! ! def on_initialize(self, event): ! self.parent = self.GetParent() ! ! def clearLines(self): ! self.components.returnedText.text = '' ! self.components.importError.text = '' ! self.Refresh() ! wx.Yield() ! ! def addLine(self, text): ! if self.components.returnedText.enabled: ! self.components.returnedText.text += str(text) ! else: ! self.components.importError.text += str(text) ! #self.Refresh() ! #self.Update() ! #wx.Yield() ! ! def on_closeBtn_mouseClick(self, event): ! self.Hide() ! ! def on_close(self, event): ! self.Hide() ! ! def on_clipBoardBtn_mouseClick(self, event): ! if sys.platform.startswith('win'): ! stuff = wx.TextDataObject() ! stuff.SetText(self.components.clipBoardBtn.userdata) ! if wx.TheClipboard.Open(): ! wx.TheClipboard.SetData(stuff) ! wx.TheClipboard.Close() ! ! ! ! if __name__ == '__main__': ! app = model.PythonCardApp(outputWindow) ! app.MainLoop() --- NEW FILE: outputWindow.gtk.rsrc.py --- {'application':{'type':'Application', 'name':'Template', 'backgrounds': [ {'type':'Background', 'name':'outputWindow', 'title':'Rebuild project', 'size':(400, 300), 'visible':0, 'components': [ {'type':'TextArea', 'name':'importError', 'position':(10, 10), 'size':(375, 205), 'actionBindings':{}, 'editable':False, 'enabled':False, 'visible':False, }, {'type':'Button', 'name':'clipBoardBtn', 'position':(95, 225), 'actionBindings':{}, 'label':'Clipboard', 'toolTip':'Click here to copy the PythonCard component imports line to the Windows clipboard', }, {'type':'Button', 'name':'closeBtn', 'position':(10, 225), 'actionBindings':{}, 'label':'Close', }, {'type':'StaticText', 'name':'txt5', 'position':(10, 90), 'actionBindings':{}, 'text':'Returned messages:', }, {'type':'TextArea', 'name':'returnedText', 'position':(10, 105), 'size':(375, 110), 'actionBindings':{}, }, {'type':'StaticText', 'name':'txt4c', 'position':(145, 70), 'actionBindings':{}, 'text':'please wait...', 'visible':False, }, {'type':'StaticText', 'name':'txt4b', 'position':(145, 70), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt4a', 'position':(10, 70), 'actionBindings':{}, 'text':'Rebuilding distributable:', 'visible':False, }, {'type':'StaticText', 'name':'txt3c', 'position':(145, 50), 'actionBindings':{}, 'text':'please wait...', 'visible':False, }, {'type':'StaticText', 'name':'txt3b', 'position':(145, 50), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt3a', 'position':(10, 50), 'actionBindings':{}, 'text':'Rebuilding application:', 'visible':False, }, {'type':'StaticText', 'name':'txt2b', 'position':(145, 30), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt2a', 'position':(10, 30), 'actionBindings':{}, 'text':'Rebuilding versioninfo file:', 'visible':False, }, {'type':'StaticText', 'name':'txt1b', 'position':(145, 10), 'actionBindings':{}, 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 'text':'Done', 'visible':False, }, {'type':'StaticText', 'name':'txt1a', 'position':(10, 10), 'actionBindings':{}, 'text':'Rebuilding spec file:', 'visible':False, }, ] # end components } # end background ] # end backgrounds } } --- NEW FILE: versionInfo.py --- # copyright 2001 McMillan Enterprises, Inc. # license: use as you please. No warranty. # Gordon McMillan gm...@hy... # import win32api import struct import pywintypes import string import pprint TEST=0 LOAD_LIBRARY_AS_DATAFILE = 2 RT_VERSION = 16 def getRaw0(o): return o.raw def getRaw1(o): return str(buffer(o)) import sys if hasattr(sys, "version_info"): pyvers = sys.version_info[0]*10 + sys.version_info[1] else: toks = string.split(sys.version, '.', 2) pyvers = int(toks[0])*10 + int(toks[1]) if pyvers < 20: getRaw = getRaw0 else: getRaw = getRaw1 ##VS_VERSION_INFO { ## WORD wLength; // Specifies the length of the VS_VERSION_INFO structure ## WORD wValueLength; // Specifies the length of the Value member ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "VS_VERSION_INFO". ## WORD Padding1[]; ## VS_FIXEDFILEINFO Value; ## WORD Padding2[]; ## WORD Children[]; // Specifies a list of zero or more StringFileInfo or VarFileInfo structures (or both) that are children of the current version structure. ##}; def decode(pathnm): h = win32api.LoadLibraryEx(pathnm, 0, LOAD_LIBRARY_AS_DATAFILE) nm = win32api.EnumResourceNames(h, RT_VERSION)[0] data = win32api.LoadResource(h, RT_VERSION, nm) vs = VSVersionInfo() j = vs.fromRaw(data) if TEST: print vs if data[:j] != vs.toRaw(): print "AAAAAGGHHHH" txt = repr(vs) glbls = {} glbls['VSVersionInfo'] = VSVersionInfo glbls['FixedFileInfo'] = FixedFileInfo glbls['StringFileInfo'] = StringFileInfo glbls['StringTable'] = StringTable glbls['StringStruct'] = StringStruct glbls['VarFileInfo'] = VarFileInfo glbls['VarStruct'] = VarStruct vs2 = eval(txt+'\n', glbls) if vs.toRaw() != vs2.toRaw(): print print 'reconstruction not the same!' print vs2 win32api.FreeLibrary(h) return vs class VSVersionInfo: def __init__(self, ffi=None, kids=None): self.ffi = ffi self.kids = kids if kids is None: self.kids = [] def fromRaw(self, data): i, (sublen, vallen, wType, nm) = parseCommon(data) #vallen is length of the ffi, typ is 0, nm is 'VS_VERSION_INFO' i = ((i + 3) / 4) * 4 # now a VS_FIXEDFILEINFO self.ffi = FixedFileInfo() j = self.ffi.fromRaw(data, i) #print ffi if TEST: if data[i:j] != self.ffi.toRaw(): print "raw:", `data[i:j]` print "ffi:", `self.ffi.toRaw()` i = j while i < sublen: j = i i, (csublen, cvallen, ctyp, nm) = parseCommon(data, i) if string.strip(str(nm)) == "StringFileInfo": sfi = StringFileInfo() k = sfi.fromRaw(csublen, cvallen, nm, data, i, j+csublen) if TEST: if data[j:k] != sfi.toRaw(): rd = data[j:k] sd = sfi.toRaw() for x in range(0, len(rd), 16): rds = rd[x:x+16] sds = sd[x:x+16] if rds != sds: print "rd[%s:%s+16]: %s" % (x, x, `rds`) print "sd[%s:%s+16]: %s" % (x, x, `sds`) print print "raw: len %d, wLength %d" % (len(rd), struct.unpack('h', rd[:2])[0]) print "sfi: len %d, wLength %d" % (len(sd), struct.unpack('h', sd[:2])[0]) self.kids.append(sfi) i = k else: vfi = VarFileInfo() k = vfi.fromRaw(csublen, cvallen, nm, data, i, j+csublen) self.kids.append(vfi) if TEST: if data[j:k] != vfi.toRaw(): print "raw:", `data[j:k]` print "vfi:", `vfi.toRaw()` i = k i = j + csublen i = ((i + 3) / 4) * 4 return i def toRaw(self): nm = pywintypes.Unicode('VS_VERSION_INFO') rawffi = self.ffi.toRaw() vallen = len(rawffi) typ = 0 sublen = 6 + 2*len(nm) + 2 pad = '' if sublen % 4: pad = '\000\000' sublen = sublen + len(pad) + vallen pad2 = '' if sublen % 4: pad2 = '\000\000' tmp = [] for kid in self.kids: tmp.append(kid.toRaw()) tmp = string.join(tmp, '') sublen = sublen + len(pad2) + len(tmp) return struct.pack('hhh', sublen, vallen, typ) + getRaw(nm) + '\000\000' + pad + rawffi + pad2 + tmp def __repr__(self, indent=''): tmp = [] newindent = indent + ' ' for kid in self.kids: tmp.append(kid.__repr__(newindent+' ')) tmp = string.join(tmp, ', \n') return "VSVersionInfo(\n%sffi=%s,\n%skids=[\n%s\n%s]\n)" % (newindent, self.ffi.__repr__(newindent), newindent, tmp, newindent) def parseCommon(data, start=0): i = start + 6 (wLength, wValueLength, wType) = struct.unpack('3h', data[start:i]) #print "wLength, wValueLength, wType, i:", wLength, wValueLength, wType, i i, szKey = parseUString(data, i, i+wLength) #i = ((i + 3) / 4) * 4 #print `data[start+6:start+wLength]` return i, (wLength, wValueLength, wType, szKey) def parseUString(data, start, limit): i = start while i < limit: if data[i:i+2] == '\000\000': break i = i + 2 szKey = pywintypes.UnicodeFromRaw(data[start:i]) i = i + 2 #print "szKey:", '"'+str(szKey)+'"', "(consumed", i-start, "bytes - to", i, ")" return i, szKey ##VS_FIXEDFILEINFO { // vsffi ## DWORD dwSignature; //Contains the value 0xFEEFO4BD ## DWORD dwStrucVersion; //Specifies the binary version number of this structure. The high-order word of this member contains the major version number, and the low-order word contains the minor version number. ## DWORD dwFileVersionMS; // Specifies the most significant 32 bits of the files binary version number ## DWORD dwFileVersionLS; // ## DWORD dwProductVersionMS; // Specifies the most significant 32 bits of the binary version number of the product with which this file was distributed ## DWORD dwProductVersionLS; // ## DWORD dwFileFlagsMask; // Contains a bitmask that specifies the valid bits in dwFileFlags. A bit is valid only if it was defined when the file was created. ## DWORD dwFileFlags; // VS_FF_DEBUG, VS_FF_PATCHED etc. ## DWORD dwFileOS; // VOS_NT, VOS_WINDOWS32 etc. ## DWORD dwFileType; // VFT_APP etc. ## DWORD dwFileSubtype; // 0 unless VFT_DRV or VFT_FONT or VFT_VXD ## DWORD dwFileDateMS; ## DWORD dwFileDateLS; ##}; class FixedFileInfo: def __init__(self, filevers=(0, 0, 0, 0), prodvers=(0, 0, 0, 0), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0)): self.sig = -17890115 # 0xfeef04bd self.strucVersion = 0x10000 self.fileVersionMS = (filevers[0] << 16) | (filevers[1] & 0xffff) self.fileVersionLS = (filevers[2] << 16) | (filevers[3] & 0xffff) self.productVersionMS = (prodvers[0] << 16) | (prodvers[1] & 0xffff) self.productVersionLS = (prodvers[2] << 16) | (prodvers[3] & 0xffff) self.fileFlagsMask = mask self.fileFlags = flags self.fileOS = OS self.fileType = fileType self.fileSubtype = subtype self.fileDateMS = date[0] self.fileDateLS = date[1] def fromRaw(self, data, i): (self.sig, self.strucVersion, self.fileVersionMS, self.fileVersionLS, self.productVersionMS, self.productVersionLS, self.fileFlagsMask, self.fileFlags, self.fileOS, self.fileType, self.fileSubtype, self.fileDateMS, self.fileDateLS) = struct.unpack('13l', data[i:i+52]) return i+52 def toRaw(self): return struct.pack('13l', self.sig, self.strucVersion, self.fileVersionMS, self.fileVersionLS, self.productVersionMS, self.productVersionLS, self.fileFlagsMask, self.fileFlags, self.fileOS, self.fileType, self.fileSubtype, self.fileDateMS, self.fileDateLS) def __repr__(self, indent=''): fv = (self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, self.fileVersionLS >> 16, self.fileVersionLS & 0xFFFF) pv = (self.productVersionMS >> 16, self.productVersionMS & 0xffff, self.productVersionLS >> 16, self.productVersionLS & 0xFFFF) fd = (self.fileDateMS, self.fileDateLS) tmp = ["FixedFileInfo(", "filevers=%s," % (fv,), "prodvers=%s," % (pv,), "mask=%s," % hex(self.fileFlagsMask), "flags=%s," % hex(self.fileFlags), "OS=%s," % hex(self.fileOS), "fileType=%s," % hex(self.fileType), "subtype=%s," % hex(self.fileSubtype), "date=%s" % (fd,), ")" ] return string.join(tmp, '\n'+indent+' ') ##StringFileInfo { ## WORD wLength; // Specifies the length of the version resource ## WORD wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "StringFileInfo". ## WORD Padding[]; ## StringTable Children[]; // Specifies a list of zero or more String structures ##}; class StringFileInfo: def __init__(self, kids=None): self.name = "StringFileInfo" if kids is None: self.kids = [] else: self.kids = kids def fromRaw(self, sublen, vallen, name, data, i, limit): self.name = name while i < limit: st = StringTable() j = st.fromRaw(data, i, limit) if TEST: if data[i:j] != st.toRaw(): rd = data[i:j] sd = st.toRaw() for x in range(0, len(rd), 16): rds = rd[x:x+16] sds = sd[x:x+16] if rds != sds: print "rd[%s:%s+16]: %s" % (x, x, `rds`) print "sd[%s:%s+16]: %s" % (x, x, `sds`) print print "raw: len %d, wLength %d" % (len(rd), struct.unpack('h', rd[:2])[0]) print " st: len %d, wLength %d" % (len(sd), struct.unpack('h', sd[:2])[0]) self.kids.append(st) i = j return i def toRaw(self): if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) vallen = 0 typ = 1 sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' tmp = [] for kid in self.kids: tmp.append(kid.toRaw()) tmp = string.join(tmp, '') sublen = sublen + len(pad) + len(tmp) if tmp[-2:] == '\000\000': sublen = sublen - 2 return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + pad + tmp def __repr__(self, indent=''): tmp = [] newindent = indent + ' ' for kid in self.kids: tmp.append(kid.__repr__(newindent)) tmp = string.join(tmp, ', \n') return "%sStringFileInfo(\n%s[\n%s\n%s])" % (indent, newindent, tmp, newindent) ##StringTable { ## WORD wLength; ## WORD wValueLength; ## WORD wType; ## WCHAR szKey[]; ## String Children[]; // Specifies a list of zero or more String structures. ##}; class StringTable: def __init__(self, name=None, kids=None): self.name = name self.kids = kids if name is None: self.name = '' if kids is None: self.kids = [] def fromRaw(self, data, i, limit): #print "Parsing StringTable" i, (cpsublen, cpwValueLength, cpwType, self.name) = parseCodePage(data, i, limit) # should be code page junk #i = ((i + 3) / 4) * 4 while i < limit: ss = StringStruct() j = ss.fromRaw(data, i, limit) if TEST: if data[i:j] != ss.toRaw(): print "raw:", `data[i:j]` print " ss:", `ss.toRaw()` i = j self.kids.append(ss) i = ((i + 3) / 4) * 4 return i def toRaw(self): if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) vallen = 0 typ = 1 sublen = 6 + 2*len(self.name) + 2 tmp = [] for kid in self.kids: raw = kid.toRaw() if len(raw) % 4: raw = raw + '\000\000' tmp.append(raw) tmp = string.join(tmp, '') sublen = sublen + len(tmp) if tmp[-2:] == '\000\000': sublen = sublen - 2 return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + tmp def __repr__(self, indent=''): tmp = [] newindent = indent + ' ' for kid in self.kids: tmp.append(repr(kid)) tmp = string.join(tmp, ',\n%s' % newindent) return "%sStringTable(\n%s'%s', \n%s[%s])" % (indent, newindent, str(self.name), newindent, tmp) ##String { ## WORD wLength; ## WORD wValueLength; ## WORD wType; ## WCHAR szKey[]; ## WORD Padding[]; ## String Value[]; ##}; class StringStruct: def __init__(self, name=None, val=None): self.name = name self.val = val if name is None: self.name = '' if val is None: self.val = '' def fromRaw(self, data, i, limit): i, (sublen, vallen, typ, self.name) = parseCommon(data, i) limit = i + sublen i = ((i + 3) / 4) * 4 i, self.val = parseUString(data, i, limit) return i def toRaw(self): if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) if type(self.val) is STRINGTYPE: self.val = pywintypes.Unicode(self.val) vallen = len(self.val) + 1 typ = 1 sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' sublen = sublen + len(pad) + 2*vallen return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + pad + getRaw(self.val) + '\000\000' def __repr__(self, indent=''): if pyvers < 20: return "StringStruct('%s', '%s')" % (str(self.name), str(self.val)) else: return "StringStruct('%s', '%s')" % (self.name, self.val) def parseCodePage(data, i, limit): #print "Parsing CodePage" i, (sublen, wValueLength, wType, nm) = parseCommon(data, i) #i = ((i + 3) / 4) * 4 return i, (sublen, wValueLength, wType, nm) ##VarFileInfo { ## WORD wLength; // Specifies the length of the version resource ## WORD wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "VarFileInfo". ## WORD Padding[]; ## Var Children[]; // Specifies a list of zero or more Var structures ##}; class VarFileInfo: def __init__(self, kids=None): if kids is None: self.kids = [] else: self.kids = kids def fromRaw(self, sublen, vallen, name, data, i, limit): self.sublen = sublen self.vallen = vallen self.name = name i = ((i + 3) / 4) * 4 while i < limit: vs = VarStruct() j = vs.fromRaw(data, i, limit) self.kids.append(vs) if TEST: if data[i:j] != vs.toRaw(): print "raw:", `data[i:j]` print "cmp:", `vs.toRaw()` i = j return i def toRaw(self): self.vallen = 0 self.wType = 1 self.name = pywintypes.Unicode('VarFileInfo') sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' tmp = [] for kid in self.kids: tmp.append(kid.toRaw()) tmp = string.join(tmp, '') self.sublen = sublen + len(pad) + len(tmp) return struct.pack('hhh', self.sublen, self.vallen, self.wType) + getRaw(self.name) + '\000\000' + pad + tmp def __repr__(self, indent=''): tmp = map(repr, self.kids) return "%sVarFileInfo([%s])" % (indent, string.join(tmp, ', ')) ##Var { ## WORD wLength; // Specifies the length of the version resource ## WORD wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure ## WORD wType; // 1 means text, 0 means binary ## WCHAR szKey[]; // Contains the Unicode string "Translation" or a user-defined key string value ## WORD Padding[]; // ## WORD Value[]; // Specifies a list of one or more values that are language and code-page identifiers ##}; STRINGTYPE = type('') class VarStruct: def __init__(self, name=None, kids=None): self.name = name self.kids = kids if name is None: self.name = '' if kids is None: self.kids = [] def fromRaw(self, data, i, limit): i, (self.sublen, self.wValueLength, self.wType, self.name) = parseCommon(data, i) i = ((i + 3) / 4) * 4 for j in range(self.wValueLength/2): kid = struct.unpack('h', data[i:i+2])[0] self.kids.append(kid) i = i + 2 return i def toRaw(self): self.wValueLength = len(self.kids) * 2 self.wType = 0 if type(self.name) is STRINGTYPE: self.name = pywintypes.Unicode(self.name) sublen = 6 + 2*len(self.name) + 2 pad = '' if sublen % 4: pad = '\000\000' self.sublen = sublen + len(pad) + self.wValueLength tmp = [] for kid in self.kids: tmp.append(struct.pack('h', kid)) tmp = string.join(tmp, '') return struct.pack('hhh', self.sublen, self.wValueLength, self.wType) + getRaw(self.name) + '\000\000' + pad + tmp def __repr__(self, indent=''): return "VarStruct('%s', %s)" % (str(self.name), repr(self.kids)) def SetVersion(exenm, versionfile): txt = open(versionfile, 'r').read() vs = eval(txt+'\n', globals()) hdst = win32api.BeginUpdateResource(exenm, 0) win32api.UpdateResource(hdst, RT_VERSION, 1, vs.toRaw()) win32api.EndUpdateResource (hdst, 0) if __name__ == '__main__': import sys TEST = 1 if len(sys.argv) < 2: decode('c:/Program Files/Netscape/Communicator/Program/netscape.exe') else: print "Examining", sys.argv[1] decode(sys.argv[1]) Index: customDialogs.py =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/customDialogs.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** customDialogs.py 19 Apr 2005 08:23:56 -0000 1.5 --- customDialogs.py 12 May 2006 16:26:20 -0000 1.6 *************** *** 3,7 **** # # This file contains all the custom dialogs (each based on CustomDialog) used ! # by projectmanager # # This program is free software; you can redistribute it and/or modify --- 3,7 ---- # # This file contains all the custom dialogs (each based on CustomDialog) used ! # by standaloneBuilder # # This program is free software; you can redistribute it and/or modify *************** *** 178,182 **** def addWizardPage(self, basename, pageref): ! resName = basename + pageref + '.rsrc.py' fd = open(resName, 'r') res = eval(fd.read()) --- 178,183 ---- def addWizardPage(self, basename, pageref): ! r = basename + pageref ! resName = model.internationalResourceName(r) fd = open(resName, 'r') res = eval(fd.read()) *************** *** 286,294 **** def on_baseDirBtn_mouseClick(self, event): title = 'Select project base directory' ! basepath = self.parent.cfg.get('ConfigData', 'projects') result = dialog.directoryDialog(self, title, basepath, wx.DD_NEW_DIR_BUTTON) if result.accepted: ! self.components.baseDir.text = result.path ! self.components.nextBtn.enabled = True def getResult(self): --- 287,309 ---- def on_baseDirBtn_mouseClick(self, event): title = 'Select project base directory' ! basepath = str(self.parent.cfg.get('ConfigData', 'projects')) result = dialog.directoryDialog(self, title, basepath, wx.DD_NEW_DIR_BUTTON) if result.accepted: ! # need an error here if the directory selected is not a subdirectory ! # of basepath... ! plist = [] ! plist.append(basepath) ! plist.append(str(result.path)) ! if os.path.commonprefix(plist) != basepath: ! title = 'Invalid project base directory' ! txt = 'This version of standaloneBuilder does not allow creation ' ! txt += 'of projects which reside outside of the projects directory ' ! txt += 'specified in your preferences. This issue will be addressed ' ! txt += 'in the next version. Yes, it\'s lame - sorry! :-(' ! bull = dialog.alertDialog(self, wrap_string(txt, 60), title) ! self.components.baseDir.SetFocus() ! else: ! self.components.baseDir.text = result.path ! self.components.nextBtn.enabled = True def getResult(self): *************** *** 315,329 **** --- 330,411 ---- self.components.resEditPath.text = self.parent.cfg.get('ConfigData', 'reseditor') self.components.srcEditPath.text = self.parent.cfg.get('ConfigData', 'codeeditor') + self.components.txtEditPath.text = self.parent.cfg.get('ConfigData', 'texteditor') self.components.pixmapEditPath.text = self.parent.cfg.get('ConfigData', 'pixmapeditor') self.components.installerPath.text = self.parent.cfg.get('ConfigData', 'installerpath') + self.components.buildTool.stringSelection = self.parent.cfg.get('ConfigData', 'buildtool') + + if self.components.buildTool.stringSelection == 'py2exe': + self.components.installerPath.enabled = False + self.components.installerPathBtn.enabled = False + self.components.installerPathHelpBtn.enabled = False + else: + self.components.installerPath.enabled = True + self.components.installerPathBtn.enabled = True + self.components.installerPathHelpBtn.enabled = True + self.components.compilerPath.text = self.parent.cfg.get('ConfigData', 'compilerpath') self.components.appPublisher.text = self.parent.cfg.get('ConfigData', 'publisher') self.components.projectsPath.text = self.parent.cfg.get('ConfigData', 'projects') + def on_buildTool_select(self, event): + if self.components.buildTool.stringSelection == 'py2exe': + try: + from distutils.core import setup as wibble + except ImportError: + title = '*** ERROR ***' + txt = 'You do not appear to have a copy of the distutils ' + txt += 'package installed. This is required in order to allow ' + txt += 'building with py2exe.' + bull = dialog.alertDialog(self, wrap_string(txt, 60), title) + self.components.buildTool.stringSelection = 'pyInstaller' + else: + try: + import py2exe as wibble + except ImportError: + title = '*** ERROR ***' + txt = 'You do not appear to have a ' + txt += 'copy of the py2exe package installed. Please install ' + txt += 'the package and then re-configure your preferences.' + bull = dialog.alertDialog(self, wrap_string(txt, 60), title) + self.components.buildTool.stringSelection = 'pyInstaller' + else: + self.components.installerPath.text = '' + self.components.installerPath.enabled = False + self.components.installerPathBtn.enabled = False + self.components.installerPathHelpBtn.enabled = False + else: + self.components.installerPath.enabled = True + self.components.installerPathBtn.enabled = True + self.components.installerPathHelpBtn.enabled = True + # see if we can find pyInstaller + # C:\Python23\pyInstaller\Build.py + want = os.path.join('pyInstaller', 'Build.py') + installer = self.parent.lookFor(want) + #self.parent.cfg.set('ConfigData', 'installerpath', installer) + self.components.installerPath.text = installer + def on_btnOK_mouseClick(self, event): + if self.components.buildTool.stringSelection == 'pyInstaller': + if self.components.installerPath.text == '': + title = 'Preferences not saved!' + txt = 'You must specify the directory where the pyInstaller components can be found' + bull = dialog.alertDialog(self, wrap_string(txt, 60), title) + return + if self.components.compilerPath.text == '' and sys.platform.startswith('win'): + title = 'Preferences not saved!' + txt = 'You must specify the directory where the Inno Setup compiler can be found' + bull = dialog.alertDialog(self, wrap_string(txt, 60), title) + return + if self.components.projectsPath.text == '': + title = 'Preferences not saved!' + txt = 'You must specify your base projects directory' + bull = dialog.alertDialog(self, wrap_string(txt, 60), title) + return self.parent.cfg.set('ConfigData', 'reseditor', self.components.resEditPath.text) self.parent.cfg.set('ConfigData', 'codeeditor', self.components.srcEditPath.text) + self.parent.cfg.set('ConfigData', 'texteditor', self.components.txtEditPath.text) self.parent.cfg.set('ConfigData', 'pixmapeditor', self.components.pixmapEditPath.text) self.parent.cfg.set('ConfigData', 'installerpath', self.components.installerPath.text) + self.parent.cfg.set('ConfigData', 'buildtool', self.components.buildTool.stringSelection) self.parent.cfg.set('ConfigData', 'compilerpath', self.components.compilerPath.text) self.parent.cfg.set('ConfigData', 'publisher', self.components.appPublisher.text) *************** *** 369,372 **** --- 451,457 ---- self.showHelp(self.components.installerPath.userdata, self.components.StaticText1.text) + def on_buildToolHelpBtn_mouseClick(self, event): + self.showHelp(self.components.buildTool.userdata, self.components.StaticText1.text) + def on_compilerPathBtn_mouseClick(self, event): result = dialog.fileDialog(self, self.components.StaticText7.text, self.components.compilerPath.text) Index: prefsDialog.rsrc.py =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/prefsDialog.rsrc.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** prefsDialog.rsrc.py 15 Apr 2005 15:18:54 -0000 1.2 --- prefsDialog.rsrc.py 12 May 2006 16:26:20 -0000 1.3 *************** *** 1,205 **** ! {'type':'CustomDialog', ! 'name':'prefsDialog', ! 'title':'Projectmanager Preferences', ! 'position':(541, 39), ! 'size':(495, 385), ! 'components': [ ! ! {'type':'TextField', ! 'name':'resEditPath', ! 'position':(10, 20), ! 'size':(410, -1), ! 'userdata':'Select the location on your computer where the PythonCard resource editor is installed.', ! }, ! ! {'type':'Button', ! 'name':'resEditPathBtn', ! 'position':(425, 20), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'resEditPathHelpBtn', ! 'position':(455, 20), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'srcEditPath', ! 'position':(10, 65), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', ! }, ! ! {'type':'Button', ! 'name':'srcEditPathBtn', ! 'position':(425, 65), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'srcEditPathHelpBtn', ! 'position':(455, 65), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'pixmapEditPath', ! 'position':(10, 110), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where your preferred pixmap editor is installed.\n', ! }, ! ! {'type':'Button', ! 'name':'pixmapEditPathBtn', ! 'position':(425, 110), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'pixmapEditPathHelpBtn', ! 'position':(455, 110), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'installerPath', ! 'position':(10, 155), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the McMillan installer software is installed. Note that projectmanager assumes that you have already configured this according to the documentation that comes with it.\n', ! }, ! ! {'type':'Button', ! 'name':'installerPathBtn', ! 'position':(425, 155), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'installerPathHelpBtn', ! 'position':(455, 155), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'compilerPath', ! 'position':(10, 200), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the Inno setup compiler is installed.', ! }, ! ! {'type':'Button', ! 'name':'compilerPathBtn', ! 'position':(425, 200), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'compilerPathHelpBtn', ! 'position':(455, 200), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'appPublisher', ! 'position':(10, 245), ! 'size':(405, -1), ! 'userdata':"Defines the name which will be used to add an 'AppPublisher' entry to your Inno script file. This name will appear when someone does a right click on your standalone executable and selects 'properties'.", ! }, ! ! {'type':'Button', ! 'name':'appPublisherHelpBtn', ! 'position':(455, 245), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'projectsPath', ! 'position':(10, 295), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where you normally keep your PythonCard projects.', ! }, ! ! {'type':'Button', ! 'name':'projectsPathBtn', ! 'position':(425, 295), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'projectsPathHelpBtn', ! 'position':(455, 295), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'Button', ! 'id':5100, ! 'name':'btnOK', ! 'position':(10, 330), ! 'label':'OK', ! }, ! ! {'type':'Button', ! 'id':5101, ! 'name':'btnCancel', ! 'position':(95, 330), ! 'label':'Cancel', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText7', ! 'position':(10, 185), ! 'text':'Path to Inno setup compiler:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText6', ! 'position':(10, 230), ! 'text':'Your name as it will appear in finished applications properties:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText3', ! 'position':(10, 5), ! 'text':'Path to PythonCard resource editor:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText4', ! 'position':(10, 50), ! 'text':'Path to preferred code editor:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText5', ! 'position':(10, 95), ! 'text':'Path to preferred pixmap editor:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText1', ! 'position':(10, 140), ! 'text':'Path to McMillan Installer:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText2', ! 'position':(10, 280), ! 'text':'Path to your projects directory:', ! }, ! ! ] # end components ! } # end CustomDialog --- 1,268 ---- ! {'type':'CustomDialog', ! 'name':'prefsDialog', ! 'title':'standaloneBuilder Preferences', ! 'position':(123, 38), ! 'size':(665, 415), ! 'components': [ ! ! {'type':'TextField', ! 'name':'resEditPath', ! 'position':(165, 25), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the PythonCard resource editor is installed.', ! }, ! ! {'type':'Button', ! 'name':'resEditPathBtn', ! 'position':(580, 25), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'resEditPathHelpBtn', ! 'position':(610, 25), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'srcEditPath', ! 'position':(165, 55), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', ! }, ! ! {'type':'Button', ! 'name':'srcEditPathBtn', ! 'position':(580, 55), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'srcEditPathHelpBtn', ! 'position':(610, 55), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'txtEditPath', ! 'position':(165, 85), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the PythonCard source code editor is installed.\n', ! }, ! ! {'type':'Button', ! 'name':'txtEditPathBtn', ! 'position':(580, 85), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'txtEditPathHelpBtn', ! 'position':(610, 85), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'pixmapEditPath', ! 'position':(165, 115), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where your preferred pixmap editor is installed.\n', ! }, ! ! {'type':'Button', ! 'name':'pixmapEditPathBtn', ! 'position':(580, 115), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'pixmapEditPathHelpBtn', ! 'position':(610, 115), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'compilerPath', ! 'position':(165, 145), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the Inno setup compiler is installed.', ! }, ! ! {'type':'Button', ! 'name':'compilerPathBtn', ! 'position':(580, 145), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'compilerPathHelpBtn', ! 'position':(610, 145), ! 'size':(25, 25), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'projectsPath', ! 'position':(165, 175), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where you normally keep your PythonCard projects.', ! }, ! ! {'type':'Button', ! 'name':'projectsPathBtn', ! 'position':(580, 175), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'projectsPathHelpBtn', ! 'position':(610, 175), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'Choice', ! 'name':'buildTool', ! 'position':(165, 245), ! 'size':(130, -1), ! 'items':[u'py2exe', u'pyInstaller'], ! 'stringSelection':'pyInstaller', ! 'userdata':'Select the tool which you would prefer to use when building the executables for your projects.', ! }, ! ! {'type':'Button', ! 'name':'buildToolHelpBtn', ! 'position':(610, 245), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'installerPath', ! 'position':(165, 275), ! 'size':(405, -1), ! 'userdata':'Select the location on your computer where the pyInstaller software is installed. Note that standaloneBuilder assumes that you have already configured this according to the documentation that comes with it.\n', ! }, ! ! {'type':'Button', ! 'name':'installerPathBtn', ! 'position':(580, 275), ! 'size':(25, -1), ! 'label':'...', ! }, ! ! {'type':'Button', ! 'name':'installerPathHelpBtn', ! 'position':(610, 275), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'TextField', ! 'name':'appPublisher', ! 'position':(165, 305), ! 'size':(405, -1), ! 'userdata':"Defines the name which will be used to add an 'AppPublisher' entry to your Inno script file. This name will appear when someone does a right click on your standalone executable and selects 'properties'.", ! }, ! ! {'type':'Button', ! 'name':'appPublisherHelpBtn', ! 'position':(610, 305), ! 'size':(25, -1), ! 'label':'?', ! }, ! ! {'type':'Button', ! 'id':5100, ! 'name':'btnOK', ! 'position':(495, 355), ! 'label':'OK', ! }, ! ! {'type':'Button', ! 'id':5101, ! 'name':'btnCancel', ! 'position':(575, 355), ! 'label':'Cancel', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText2', ! 'position':(70, 180), ! 'text':'Projects directory:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText7', ! 'position':(60, 150), ! 'text':'Inno setup compiler:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText5', ! 'position':(40, 120), ! 'text':'Preferred pixmap editor:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText9', ! 'position':(80, 90), ! 'text':'Plain text editor:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText4', ! 'position':(40, 60), ! 'text':'PythonCard code editor:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText3', ! 'position':(20, 30), ! 'text':'PythonCard resource editor:', ! }, ! ! {'type':'StaticBox', ! 'name':'StaticBox1', ! 'position':(5, 0), ! 'size':(645, 215), ! 'label':'Paths to external files', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText6', ! 'position':(80, 310), ! 'text':'Publisher name:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText1', ! 'position':(65, 280), ! 'text':'Path to pyInstaller:', ! }, ! ! {'type':'StaticText', ! 'name':'StaticText8', ! 'position':(60, 250), ! 'text':'Preferred build tool:', ! }, ! ! {'type':'StaticBox', ! 'name':'StaticBox2', ! 'position':(5, 220), ! 'size':(645, 125), ! 'label':'Other settings', ! }, ! ! ] # end components ! } # end CustomDialog Index: standaloneBuilder.py =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/standaloneBuilder.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** standaloneBuilder.py 9 Sep 2005 12:32:08 -0000 1.13 --- standaloneBuilder.py 12 May 2006 16:26:20 -0000 1.14 *************** *** 34,45 **** import ConfigParser import time ! ! if not sys.platform.startswith('win'): ! import commands # pythoncard imports import wx from wxPython.html import wxHtmlEasyPrinting ! from PythonCard import dialog, model [...1721 lines suppressed...] + self.menuBar.setEnabled('menuEditPrefs', True) + self.menuBar.setEnabled('menuToolsLogAdd', True) + self.menuBar.setEnabled('menuToolsChkImport', True) + self.menuBar.setEnabled('menuToolsAddScript', True) + self.menuBar.setEnabled('menuToolsAddResource', True) + self.menuBar.setEnabled('menuToolsAddPixmap', True) + self.menuBar.setEnabled('menuToolsAddOther', True) + self.menuBar.setEnabled('menuToolsRunMain', True) + self.menuBar.setEnabled('menuToolsRebuild', True) + self.menuBar.setEnabled('menuToolsRelease', True) + self.menuBar.setEnabled('menuHelpManual', True) + self.menuBar.setEnabled('menuHelpAbout', True) + if self.cfg.get('ConfigData', 'buildtool') != 'pyInstaller': + self.components.specBtn.enabled = False + self.menuBar.setEnabled('menuEditSpecfile', False) + else: + self.components.specBtn.enabled = True + self.menuBar.setEnabled('menuEditSpecfile', True) if __name__ == '__main__': Index: outputWindow.rsrc.py =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/outputWindow.rsrc.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** outputWindow.rsrc.py 15 Apr 2005 15:18:54 -0000 1.3 --- outputWindow.rsrc.py 12 May 2006 16:26:20 -0000 1.4 *************** *** 1,107 **** ! {'application':{'type':'Application', ! 'name':'Template', ! 'backgrounds': [ ! {'type':'Background', ! 'name':'outputWindow', ! 'title':'Rebuild project', ! 'size':(400, 300), ! 'visible':0, ! ! 'components': [ ! ! {'type':'Button', ! 'name':'closeBtn', ! 'position':(10, 225), ! 'label':'Close', ! }, ! ! {'type':'StaticText', ! 'name':'txt5', ! 'position':(10, 90), ! 'text':'Returned messages:', ! }, ! ! {'type':'TextArea', ! 'name':'returnedText', ! 'position':(10, 105), ! 'size':(375, 110), ! }, ! ! {'type':'StaticText', ! 'name':'txt4c', ! 'position':(145, 70), ! 'text':'please wait...', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt4b', ! 'position':(145, 70), ! 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, ! 'text':'Done', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt4a', ! 'position':(10, 70), ! 'text':'Rebuilding distributable:', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt3c', ! 'position':(145, 50), ! 'text':'please wait...', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt3b', ! 'position':(145, 50), ! 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, ! 'text':'Done', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt3a', ! 'position':(10, 50), ! 'text':'Rebuilding application:', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt2b', ! 'position':(145, 30), ! 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, ! 'text':'Done', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt2a', ! 'position':(10, 30), ! 'text':'Rebuilding versioninfo file:', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt1b', ! 'position':(145, 10), ! 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, ! 'text':'Done', ! 'visible':False, ! }, ! ! {'type':'StaticText', ! 'name':'txt1a', ! 'position':(10, 10), ! 'text':'Rebuilding spec file:', ! 'visible':False, ! }, ! ! ] # end components ! } # end background ! ] # end backgrounds ! } } --- 1,123 ---- ! {'application':{'type':'Application', ! 'name':'Template', ! 'backgrounds': [ ! {'type':'Background', ! 'name':'outputWindow', ! 'title':'Rebuild project', ! 'size':(400, 300), ! 'visible':0, ! ! 'components': [ ! ! {'type':'TextArea', ! 'name':'importError', ! 'position':(10, 10), ! 'size':(375, 205), ! 'enabled':False, ! 'visible':False, ! }, ! ! {'type':'Button',... [truncated message content] |