spambayes/Outlook2000/dialogs win32struct.py, NONE, 1.1 dialog_map.py, 1.49, 1.50 opt_processors.py, 1.16, 1.17
"Kenny Pitt" <[email protected]>
| Newsgroups | gmane.mail.spam.spambayes.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/spambayes/spambayes/Outlook2000/dialogs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29379/Outlook2000/dialogs Modified Files: dialog_map.py opt_processors.py Added Files: win32struct.py Log Message: Add a "Notifications" tab to SpamBayes Manager for configuring notification sounds. --- NEW FILE: win32struct.py --- # This module provides helper classes for various structs (currently only # OPENFILENAME) that need to be passed to Win32 api functions as strings. # # The base cStruct class is a slightly modified version of an example posted # by Telion <[email protected]> to the PythonCE mailing list. # http://mail.python.org/pipermail/pythonce/2002-October/000204.html import struct, array import win32gui class cStruct(object): # cStruct class uses following struct information. # (name, fs, initial_value) # # "name" is used for accessing value # "fs" is format string for that value (see struct module doc) # For lpstr, lpcstr, lpxxx, use 'P'. # "initial_value" default value def __init__(self, sd): self.sd = list(sd) self.nlst = [i[0] for i in sd] self.fs = "".join([i[1] for i in sd]) t = [i[2] for i in sd] self.data = struct.pack(self.fs, *t) def __setattr__(self, name, v): if name in ['sd', 'nlst', 'fs', 'data', 'ptr'] or name not in self.nlst: object.__setattr__(self, name, v) return t = list(struct.unpack(self.fs, self.data)) i = self.nlst.index(name) if i > -1: t[i] = v self.data = struct.pack(self.fs, *t) def __getattr__(self, name): t = struct.unpack(self.fs, self.data) i = self.nlst.index(name) if i > -1: return t[i] else: raise AttributeError def __str__(self): return self.data def dump(self): # use this to see the data t = struct.unpack(self.fs, self.data) ii = 0 for i in self.nlst: print i, "=", t[ii] ii += 1 print "fs =", self.fs return class OPENFILENAME(cStruct): _struct_def = ( \ ('lStructSize', 'L', 0), # size of struct (filled in by __init__) ('hwndOwner', 'P', 0), ('hInstance', 'P', 0), ('lpstrFilter', 'P', 0), # File type filter ('lpstrCustomFilter', 'P', 0), ('nMaxCustFilter', 'L', 0), ('nFilterIndex', 'L', 0), ('lpstrFile', 'P', 0), # Initial filename and filename buffer ('nMaxFile', 'L', 0), # Size of filename string (should be >= 256) ('lpstrFileTitle', 'P', 0), # (optional) base name receiving buffer ('nMaxFileTitle', 'L', 0), # max size of above ('lpstrInitialDir', 'P', 0), # (optional) initial directory ('lpstrTitle', 'P', 0), # Title of dialog ('Flags', 'L', 0), ('nFileOffset', 'H', 0), ('nFileExtension', 'H', 0), ('lpstrDefExt', 'P', 0), # default extension ('lCustData', 'l', 0), ('lpfnHook', 'P', 0), ('lpTemplateName', 'P', 0) ) def __init__(self, max_filename_len): cStruct.__init__(self, self._struct_def) self.lStructSize = struct.calcsize(self.fs) self.fn_buf = array.array("c", '\0'*max_filename_len) self.fn_buf_addr, self.fn_buf_len = self.fn_buf.buffer_info() self.lpstrFile = self.fn_buf_addr self.nMaxFile = self.fn_buf_len def setFilename(self, filename): win32gui.PySetString(self.fn_buf_addr, filename, self.fn_buf_len - 1) def getFilename(self): return win32gui.PyGetString(self.fn_buf_addr) def setTitle(self, title): if isinstance(title, unicode): title = title.encode("mbcs") self.title_buf = array.array("c", title+'\0') self.lpstrTitle = self.title_buf.buffer_info()[0] def setInitialDir(self, initialDir): if isinstance(initialDir, unicode): initialDir = initialDir.encode("mbcs") self.initialDir_buf = array.array("c", initialDir+'\0') self.lpstrInitialDir = self.initialDir_buf.buffer_info()[0] def setFilter(self, fileFilter): if isinstance(fileFilter, unicode): fileFilter = fileFilter.encode("mbcs") fileFilter = fileFilter.replace('|', '\0') + '\0' self.fileFilter_buf = array.array("c", fileFilter+'\0') self.lpstrFilter = self.fileFilter_buf.buffer_info()[0] Index: dialog_map.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/dialogs/dialog_map.py,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** dialog_map.py 18 Jan 2005 18:23:10 -0000 1.49 --- dialog_map.py 11 Feb 2005 21:05:51 -0000 1.50 *************** *** 444,448 **** (TabProcessor, "IDC_TAB", """IDD_GENERAL IDD_FILTER IDD_TRAINING ! IDD_STATISTICS IDD_ADVANCED"""), (CommandButtonProcessor, "IDC_ABOUT_BTN", ShowAbout, ()), ), --- 444,449 ---- (TabProcessor, "IDC_TAB", """IDD_GENERAL IDD_FILTER IDD_TRAINING ! IDD_STATISTICS IDD_NOTIFICATIONS ! IDD_ADVANCED"""), (CommandButtonProcessor, "IDC_ABOUT_BTN", ShowAbout, ()), ), *************** *** 519,522 **** --- 520,539 ---- "IDC_LAST_RESET_DATE"), ), + "IDD_NOTIFICATIONS" : ( + (BoolButtonProcessor, "IDC_ENABLE_SOUNDS", "Notification.notify_sound_enabled", + """IDC_HAM_SOUND IDC_BROWSE_HAM_SOUND + IDC_UNSURE_SOUND IDC_BROWSE_UNSURE_SOUND + IDC_SPAM_SOUND IDC_BROWSE_SPAM_SOUND + IDC_ACCUMULATE_DELAY_SLIDER + IDC_ACCUMULATE_DELAY_TEXT"""), + (FilenameProcessor, "IDC_HAM_SOUND IDC_BROWSE_HAM_SOUND", + "Notification.notify_ham_sound", _("Sound Files (*.wav)|*.wav|All Files (*.*)|*.*")), + (FilenameProcessor, "IDC_UNSURE_SOUND IDC_BROWSE_UNSURE_SOUND", + "Notification.notify_unsure_sound", _("Sound Files (*.wav)|*.wav|All Files (*.*)|*.*")), + (FilenameProcessor, "IDC_SPAM_SOUND IDC_BROWSE_SPAM_SOUND", + "Notification.notify_spam_sound", _("Sound Files (*.wav)|*.wav|All Files (*.*)|*.*")), + (EditNumberProcessor, "IDC_ACCUMULATE_DELAY_TEXT IDC_ACCUMULATE_DELAY_SLIDER", + "Notification.notify_accumulate_delay", 0, 30, 20, 60), + ), "IDD_ADVANCED" : ( (BoolButtonProcessor, "IDC_BUT_TIMER_ENABLED", "Filter.timer_enabled", Index: opt_processors.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/dialogs/opt_processors.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** opt_processors.py 28 Oct 2004 04:29:00 -0000 1.16 --- opt_processors.py 11 Feb 2005 21:05:54 -0000 1.17 *************** *** 252,255 **** --- 252,305 ---- self.SetOptionValue(val) + class FilenameProcessor(OptionControlProcessor): + def __init__(self, window, control_ids, option, file_filter="All Files|*.*"): + self.button_id = control_ids[1] + self.file_filter = file_filter + OptionControlProcessor.__init__(self, window, control_ids, option) + + def GetPopupHelpText(self, idFrom): + if idFrom == self.button_id: + return "Displays a dialog from which you can select a file." + return OptionControlProcessor.GetPopupHelpText(self, id) + + def DoBrowse(self): + from win32struct import OPENFILENAME + ofn = OPENFILENAME(512) + ofn.hwndOwner = self.window.hwnd + ofn.setFilter(self.file_filter) + ofn.setTitle(_("Browse for file")) + def_filename = self.GetOptionValue() + if (len(def_filename) > 0): + from os.path import basename + ofn.setInitialDir(basename(def_filename)) + ofn.setFilename(def_filename) + ofn.Flags = win32con.OFN_FILEMUSTEXIST + retval = win32gui.GetOpenFileName(str(ofn)) + if (retval == win32con.IDOK): + self.SetOptionValue(ofn.getFilename()) + self.UpdateControl_FromValue() + return True + return False + + def OnCommand(self, wparam, lparam): + id = win32api.LOWORD(wparam) + code = win32api.HIWORD(wparam) + if id == self.button_id: + self.DoBrowse() + elif code==win32con.EN_CHANGE: + self.UpdateValue_FromControl() + + def UpdateControl_FromValue(self): + win32gui.SendMessage(self.GetControl(), win32con.WM_SETTEXT, 0, + self.GetOptionValue()) + + def UpdateValue_FromControl(self): + buf_size = 256 + buf = win32gui.PyMakeBuffer(buf_size) + nchars = win32gui.SendMessage(self.GetControl(), win32con.WM_GETTEXT, + buf_size, buf) + str_val = buf[:nchars] + self.SetOptionValue(str_val) + # Folder IDs, and the "include_sub" option, if applicable. class FolderIDProcessor(OptionControlProcessor):