## $Id: prefs.py,v 1.72 2001/10/16 17:48:32 kjetilja Exp $ ## System modules from gtk import * from gnome.ui import * from gnome.config import * from posixpath import split import os, glob, sys ## Local import pwdmodules import folderops, fileops, fonts ## Error messages from the GUI err1 = """You must specify at least one account!""" err2 = """You must specify a host for outgoing mail!""" err3 = """Unable to create mail folder directory: \n %s""" WIN_SIZE = 0 FLD_SIZE = 1 MSG_SIZE = 2 LST_SIZE = 3 ## Name of the default account DEF_ACC = "New account" ## Old GnomeUI modules have a typo here class PFontPicker(GnomeFontPicker): def __init__(self, _obj=None): GnomeFontPicker.__init__(self, _obj) def get_font_name(self): import _gnomeui return _gnomeui.gnome_font_picker_get_font_name(self._o) ## ## ## Preferences class ## ## class Preferences: ## ## Method __init__ (self) ## ## Constructor for preferences class. ## ## def __init__(self): launch_preferences = 0 if not has_section('pygmy/prefs'): launch_preferences = 1 self.accounts = {} self.filepaths = {} account_names = get_vector('pygmy/prefs/account_names') for name in account_names: self.accounts[name] = get_vector('pygmy/accounts/%s' % name) if self.accounts[name][0][0] == '_': self.accounts[name] = map(lambda x: x[1:], self.accounts[name]) self.defacc = get_string('pygmy/prefs/defacc') or '' # Keep temporarily for consistency with older versions of Pygmy self.usemailserver = get_bool('pygmy/prefs/usemailserver') or 0 self.serverentry = get_string('pygmy/prefs/serverentry') or "smtp" self.usesendmail = get_bool('pygmy/prefs/usesendmail') or 0 self.sendmailentry = get_string('pygmy/prefs/sendmailentry') or "/usr/lib/sendmail" # End of consistency check self.external_cmd = get_string('pygmy/prefs/external_cmd') or "" self.invoke_at_startup = get_bool('pygmy/prefs/invoke_at_startup') or 0 self.mailnotify = get_bool('pygmy/prefs/mailnotify') or 0 self.addsig = get_bool('pygmy/prefs/addsig') or 0 self.sigreply = get_string('pygmy/prefs/sigreply') or 'none' self.sigforward = get_string('pygmy/prefs/sigforward') or 'none' self.expand = get_bool('pygmy/prefs/expand') or 0 self.confirmsend = get_bool('pygmy/prefs/confirmsend') or 0 self.fillwidth = get_int('pygmy/prefs/fillwidth') or 74 self.view_to = get_bool('pygmy/prefs/view_to') or 0 self.view_cc = get_bool('pygmy/prefs/view_cc') or 0 self.trash = get_bool('pygmy/prefs/trash') or 0 self.default_folders = ('inbox', 'sent-mail', 'drafts', 'trash') self.filter_start = get_bool('pygmy/prefs/filter_start') or 0 self.gtkhtml = get_bool('pygmy/prefs/gtkhtml') or 0 self.citechar = get_string('pygmy/prefs/citechar') or ">" self.prefix = get_string('pygmy/prefs/prefix') or "Re:" self.forward = get_string('pygmy/prefs/forward') or "Fw:" self.usebuiltined = get_bool('pygmy/prefs/usebuiltined') or \ not get_bool('pygmy/prefs/useexternaled') self.externaledentry = get_string('pygmy/prefs/externaledentry') or "/usr/bin/vim" self.editorhints = get_string('pygmy/prefs/editorhints') or 'none' self.fld_font = get_string('pygmy/prefs/fld_font') or fonts.NORMAL_FONT self.sub_font = get_string('pygmy/prefs/sub_font') or fonts.NORMAL_FONT self.msg_font = get_string('pygmy/prefs/msg_font') or fonts.NORMAL_FONT self.compose_font = get_string('pygmy/prefs/compose_font') or fonts.NORMAL_FONT self.externaled_font = get_string('pygmy/prefs/externaled_font') or fonts.EXTERNALED_FONT default_sizes = [[560, 560], [170, 280], [520, 280], [10, 100, 290, 10, 20]] self.size = range(len(default_sizes)) for index in range(len(default_sizes)): vec = get_vector('pygmy/geometry/win_%d' % index) vec = map(lambda x: int(x), vec) self.size[index] = vec or default_sizes[index] fp = get_vector('pygmy/prefs/default_filepaths') for name in fp: self.filepaths[name] = get_string('pygmy/filepaths/%s' % name) homedir = fileops.gethomedir() self.alistfile = get_string('pygmy/prefs/alistfile') or \ os.path.join(homedir, ".pygmy-adrlist") self.flistfile = get_string('pygmy/prefs/flistfile') or \ os.path.join(homedir, ".pygmy-filterlist") self.spoolfile = get_string('pygmy/prefs/spoolfile') or \ fileops.getmailfile() self.folders = get_string('pygmy/prefs/folders') or \ os.path.join(homedir, "Mail") self.more = get_bool('pygmy/prefs/moreheaders') or 0 self.version = "0.6.0" if launch_preferences: p = PreferencesWindow(self) p.mainloop() ## ## Method save (self) ## ## Save the current configuration. ## ## def save(self): set_bool('pygmy/prefs/filter_start', self.filter_start) set_bool('pygmy/prefs/gtkhtml', self.gtkhtml) set_string('pygmy/prefs/defacc', self.defacc) # set_bool('pygmy/prefs/usemailserver', self.usemailserver) # set_string('pygmy/prefs/serverentry', self.serverentry) # set_bool('pygmy/prefs/usesendmail', self.usesendmail) set_string('pygmy/prefs/external_cmd', self.external_cmd) set_bool('pygmy/prefs/invoke_at_startup', self.invoke_at_startup) set_bool('pygmy/prefs/mailnotify', self.mailnotify) set_bool('pygmy/prefs/addsig', self.addsig) set_string('pygmy/prefs/sigreply', self.sigreply) set_string('pygmy/prefs/sigforward', self.sigforward) set_bool('pygmy/prefs/expand', self.expand) set_bool('pygmy/prefs/confirmsend', self.confirmsend) set_int('pygmy/prefs/fillwidth', self.fillwidth) set_bool('pygmy/prefs/view_cc', self.view_cc) set_bool('pygmy/prefs/view_to', self.view_to) set_bool('pygmy/prefs/trash', self.trash) set_string('pygmy/prefs/citechar', self.citechar) set_string('pygmy/prefs/prefix', self.prefix) set_string('pygmy/prefs/forward', self.forward) set_string('pygmy/prefs/fld_font', self.fld_font) set_string('pygmy/prefs/sub_font', self.sub_font) set_string('pygmy/prefs/msg_font', self.msg_font) set_string('pygmy/prefs/compose_font', self.compose_font) set_string('pygmy/prefs/externaled_font', self.externaled_font) set_string('pygmy/prefs/version', self.version) set_vector('pygmy/prefs/default_folders', self.default_folders) set_string('pygmy/prefs/alistfile', self.alistfile) set_string('pygmy/prefs/flistfile', self.flistfile) set_string('pygmy/prefs/spoolfile', self.spoolfile) set_string('pygmy/prefs/folders', self.folders) # Editor preferences set_bool('pygmy/prefs/usebuiltined', self.usebuiltined ) set_bool('pygmy/prefs/useexternaled', not self.usebuiltined ) set_string('pygmy/prefs/externaledentry', self.externaledentry ) set_string('pygmy/prefs/editorhints', self.editorhints ) clean_section('pygmy/accounts') set_vector('pygmy/prefs/account_names', self.accounts.keys()) for name in self.accounts.keys(): # For consistency with older than 0.5.13 preferences file if len(self.accounts[name]) == 4: if self.usesendmail: self.accounts[name] = self.accounts[name] + \ ['', self.sendmailentry] else: self.accounts[name] = self.accounts[name] + \ [self.serverentry, ''] self.usemailserver, self.sendmailentry, self.usesendmail,\ self.sendmailentry = 0, '', 0, '' # End of consistency check if self.accounts[name][4] != '': self.accounts[name][5] = '' set_vector('pygmy/accounts/%s' % name, map(lambda x: '_'+ x, self.accounts[name][:])) clean_section('pygmy/geometry') index = 0 for set in self.size: vec = map(lambda x: str(x), self.size[index]) set_vector('pygmy/geometry/win_%d' % index, vec) index = index + 1 clean_section('pygmy/filepaths') set_vector('pygmy/prefs/default_filepaths', self.filepaths.keys()) for name in self.filepaths.keys(): set_string('pygmy/filepaths/%s' % name, self.filepaths[name] or '' ) set_bool('pygmy/prefs/moreheaders', self.more) sync() ## ## ## Preferences Window class ## ## class PreferencesWindow: ## ## Method __init__ (self, prefs instance, parent window instance) ## ## Constructor for preferences window. ## ## def __init__(self, prefs, parent=None): from gnome.zvt import ZvtTerm self.win = GnomeDialog(':Pygmy - Preferences', 'Ok', 'Cancel') self.vbox = self.win.vbox self.prefs = prefs self.dialogs = {} self.entry = prefs.accounts.copy() self.externaled_support = "writechild" in dir(ZvtTerm) if not self.externaled_support: self.prefs.usebuiltined = 0 # Set parent window if supplied if parent != None: self.win.set_parent(parent) self.win.connect('delete_event', mainquit) self.win.connect('destroy', mainquit) self.win.connect('clicked', self.handle_callbacks) self.init_notebook() self.vbox.show() self.win.show() ## ## Method handle_callbacks (self, button, no) ## ## Handle callbacks for the action buttons. ## ## def handle_callbacks(self, button, no): if no == 0: # Propagate configuration from the preferences window if self.entry.has_key(DEF_ACC): del self.entry[DEF_ACC] self.prefs.accounts = self.entry.copy() self.prefs.folders = self.direntry.gtk_entry().get_text() self.prefs.spoolfile = self.spoolentry.gtk_entry().get_text() self.prefs.mailnotify = self.notify.get_active() self.prefs.trash = self.trash.get_active() self.prefs.expand = self.expand.get_active() self.prefs.addsig = self.addsig.get_active() self.prefs.sigreply = self.sigreply.get_menu().get_active().get_data("id") self.prefs.sigforward = self.sigforward.get_menu().get_active().get_data("id") self.prefs.confirmsend = self.confirmsend.get_active() self.prefs.filter_start = self.filter_start.get_active() self.prefs.fillwidth = int(self.fillwidth.get_value()) self.prefs.sub_font = self.sub_fontpicker.get_font_name() self.prefs.fld_font = self.fld_fontpicker.get_font_name() self.prefs.msg_font = self.msg_fontpicker.get_font_name() self.prefs.compose_font = self.compose_fontpicker.get_font_name() if self.externaled_support: self.prefs.externaled_font = self.externaled_fontpicker.get_font_name() self.prefs.external_cmd = self.externalentry.gtk_entry().get_text() self.prefs.invoke_at_startup = self.invokeentry.get_active() self.prefs.gtkhtml = self.gtkhtml.get_active() #editor prefs if self.externaled_support: self.prefs.usebuiltined = self.usebuiltined.get_active() self.prefs.externaledentry = self.externaledentry.get_text() self.prefs.editorhints = self.editorhints.get_menu().get_active().get_data("id") # Ensure only one of mailserver or smtp is set #if self.prefs.usemailserver: # self.prefs.usesendmail = 0 #if self.prefs.usesendmail: # self.prefs.usemailserver = 0 # Check that the username and email address is entered if len(self.prefs.accounts) == 0: w = GnomeErrorDialog(err1) w.set_parent(self.win) w.show() return # Check if the folder directory exists try: os.stat(self.prefs.folders) except os.error: # Need to create the directory try: os.mkdir(self.prefs.folders) except os.error: # Could not create directory w = GnomeErrorDialog(err3 % self.prefs.folders) w.set_parent(self.win) w.show() return # Find all folders in the mail directory try: flds = map( lambda x, y=split: y(x)[1], glob.glob(self.prefs.folders+'/*') ) except IndexError: flds = [] # Ensure that the default folders are present for f in self.prefs.default_folders: if f not in flds: # Create default folder file open(self.prefs.folders+'/'+f, 'a').close() # Create the index file folderops.create_folder_index(self.prefs.folders+"/"+f) # Save configuration to disk self.prefs.save() # Finished self.win.destroy() elif no == 1: # Just bail out without doing any modifications self.win.destroy() else: print "preferences -- got unknown button callback event" ## ## Method init_notebook (self) ## ## Create the notbook widget. ## ## def init_notebook(self): notebook = GtkNotebook() notebook.set_tab_pos(POS_TOP) frame = GtkFrame('Accounts') frame.set_border_width(10) frame.set_usize(400, 320) frame.show() label = GtkLabel('Accounts') notebook.append_page(frame, label) self.init_account(frame) frame = GtkFrame('Incoming') frame.set_border_width(10) frame.set_usize(400, 320) frame.show() label = GtkLabel('Incoming') notebook.append_page(frame, label) self.init_incoming(frame) if self.externaled_support: frame = GtkFrame('Editor') frame.set_border_width(10) frame.set_usize(400, 320) frame.show() label = GtkLabel('Editor') notebook.append_page(frame, label) self.init_editor(frame) frame = GtkFrame('Mail') frame.set_border_width(10) frame.set_usize(400, 320) frame.show() label = GtkLabel('Mail') notebook.append_page(frame, label) self.init_messages(frame) frame = GtkFrame('Misc') frame.set_border_width(10) frame.set_usize(400, 320) frame.show() label = GtkLabel('Misc') notebook.append_page(frame, label) self.init_fonts(frame) self.vbox.pack_start(notebook) notebook.show() ## ## Method *acc* (self) ## ## Methods for account management ## ## def update_acc(self): self.acc.clear() e = self.entry.keys() if DEF_ACC in e: e.remove(DEF_ACC) e.sort() for name in e: self.acc.append( (name,) ) acc = self.prefs.defacc if acc and len(e) > 0: if acc in e: row = e.index(acc) self.acc.set_background(row, GdkColor(29535,29535,32535)) else: self.prefs.defacc = '' def acc_edit_cb(self, button, no): w = self.dialogs[button] accname = w[8] if no == 0: del self.entry[accname] self.entry[accname] = [ w[1].get_text(), w[2].get_text(), w[4].gtk_entry().get_text(), w[3].get_text(), w[5].get_text(), w[6].gtk_entry().get_text() ] if not w[7].get_active(): self.entry[accname][4] = '' # Flag that smtpserver is not used self.update_acc() elif no == 1: pass del self.dialogs[button] button.destroy() def acc_select(self, list, r, c, ev): if hasattr(ev, 'type'): # Check for double clicks on the list item if ev.type == 5: name = list.get_text(r,c) v = GnomeDialog('Modify Account %s' % name, 'Ok', 'Cancel') v.set_parent(self.win) v.connect('clicked', self.acc_edit_cb) v.show() t, self.dialogs[v] = self.acc_view(name) v.vbox.pack_start(t) def acc_new(self, button): v = GnomeDialog('New Account', 'Ok', 'Cancel') v.set_parent(self.win) v.connect('clicked', self.acc_new_cb) v.show() import pwd pwdline = pwd.getpwuid(os.getuid()) dummy = [pwdline[4], '%s@' % pwdline[0], '%s/.signature' % pwdline[5], '%s@' % pwdline[0] ] self.entry[DEF_ACC] = dummy t, self.dialogs[v] = self.acc_view(DEF_ACC) v.vbox.pack_start(t) def acc_new_cb(self, button, no): w = self.dialogs[button] if no == 0: self.entry[w[0].get_text()] = [ w[1].get_text(), w[2].get_text(), w[4].gtk_entry().get_text(), w[3].get_text(), w[5].get_text(), w[6].gtk_entry().get_text(), ] self.update_acc() del self.dialogs[button] button.destroy() def acc_remove(self, button): if self.acc.selection == []: return row = self.acc.selection[0] account = self.acc.get_text(row, 0) if account == self.prefs.defacc: self.prefs.defacc = '' del self.entry[account] self.update_acc() def acc_view(self, accname): if len (self.entry[accname]) == 6: name, email, sigfile, reply, smtpserver, sendmail = self.entry[accname] else: # For compatibility with older versions of Pymy name, email, sigfile, reply = self.entry[accname] smtpserver, sendmail = '', '' if smtpserver != '': usesmtpserver = 1 else: usesmtpserver = 0 if sendmail == '': sendmail = '/usr/lib/sendmail' notebook = GtkNotebook() notebook.set_tab_pos(POS_TOP) notebook.show() # Make tab for identity frame = GtkFrame('Identity') frame.set_border_width(10) frame.set_usize(320, 300) frame.show() label = GtkLabel('Identity') notebook.append_page(frame, label) t = GtkTable(15,1,0) t.show() la = GtkLabel("Account name:") la.show() la.set_alignment(0.0, 0.5) accentry = GtkEntry() accentry.show() accentry.set_text(accname) ln = GtkLabel("User name:") ln.show() ln.set_alignment(0.0, 0.5) nameentry = GtkEntry() nameentry.show() if name != None: nameentry.set_text(name) le = GtkLabel("Email address:") le.show() le.set_alignment(0.0, 0.5) mailentry = GtkEntry() mailentry.show() if email != None: mailentry.set_text(email) ls = GtkLabel("Signature file:") ls.show() ls.set_alignment(0.0, 0.5) sigentry = GnomeFileEntry() sigentry.gnome_entry().set_history_id('signature') sigentry.gnome_entry().load_history() sigentry.show() if sigfile != None: sigentry.gtk_entry().set_text(sigfile) lr = GtkLabel("Reply-to address:") lr.show() lr.set_alignment(0.0, 0.5) replyentry = GtkEntry() replyentry.show() if reply != None: replyentry.set_text(reply) t.attach(la, 0, 1, 0, 1, yoptions=0, ypadding=3, xpadding=10) t.attach(accentry, 0, 1, 1, 2, xpadding=10, yoptions=0, ypadding=3) t.attach(ln, 0, 1, 2, 3, yoptions=0, ypadding=3, xpadding=10) t.attach(nameentry, 0, 1, 3, 4, xpadding=10, yoptions=0, ypadding=3) t.attach(le, 0, 1, 4, 5, yoptions=0, ypadding=3, xpadding=10) t.attach(mailentry, 0, 1, 5, 6, xpadding=10, yoptions=0, ypadding=3) t.attach(lr, 0, 1, 6, 7, yoptions=0, ypadding=3, xpadding=10) t.attach(replyentry, 0, 1, 7, 8, xpadding=10, yoptions=0, ypadding=3) t.attach(ls, 0, 1, 8, 9, yoptions=0, ypadding=3, xpadding=10) t.attach(sigentry, 0, 1, 10, 11, xpadding=10, yoptions=0, ypadding=3) frame.add(t) # Make tab for outgoing t = GtkTable(4,1,0) t.show() frame = GtkFrame('Outgoing') frame.set_border_width(10) frame.set_usize(320, 300) frame.show() label = GtkLabel('Outgoing') notebook.append_page(frame, label) bsv = GtkRadioButton(None, "Send using mail server:") bsv.show() bsv.set_active ( usesmtpserver ) serverentry = GtkEntry() serverentry.show() if smtpserver != '': serverentry.set_text (smtpserver) bsm = GtkRadioButton(bsv, "Send using local 'sendmail':") bsm.show() bsm.set_active ( not usesmtpserver ) sendmailentry = GnomeFileEntry() sendmailentry.gnome_entry().set_history_id('sendmail') sendmailentry.gnome_entry().load_history() sendmailentry.show() sendmailentry.gtk_entry().set_text(sendmail) t.attach(bsv, 0, 1, 0, 1, yoptions=0, ypadding=3, xpadding=10) t.attach(serverentry, 0, 1, 1, 2, xpadding=10, yoptions=0, ypadding=3) t.attach(bsm, 0, 1, 3, 4, yoptions=0, ypadding=3, xpadding=10) t.attach(sendmailentry, 0, 1, 4, 5, xpadding=10, yoptions=0, ypadding=3) frame.add(t) # Return notebook return notebook, (accentry, nameentry, mailentry, replyentry, sigentry, serverentry, sendmailentry, bsv, accname) def set_as_default(self, button): if self.acc.selection == []: return row = self.acc.selection[0] account = self.acc.get_text(row, 0) self.prefs.defacc = account self.update_acc() ## Create the account notebook def init_account(self, frame): t = GtkTable(8,1,0) t.show() acc = GtkCList(1, ['Name']) acc.connect("select_row", self.acc_select) # Widget attributes acc.set_selection_mode(SELECTION_SINGLE) acc.set_column_width(0, 150) acc.set_column_width(1, 150) acc.set_border_width(2) acc.set_usize(0, 250) # Add scrollbars swin = GtkScrolledWindow() swin.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) swin.add(acc) swin.show() acc.show() t.attach(swin, 0, 3, 0, 1, yoptions=0) # 'Default' button b = GtkButton('Set as default') b.show() b.connect('clicked', self.set_as_default) t.attach(b, 0, 1, 1, 2, yoptions=0, ypadding=5, xpadding=5) # 'Delete' button b = GtkButton('Remove') b.show() b.connect('clicked', self.acc_remove) t.attach(b, 1, 2, 1, 2, yoptions=0, ypadding=5, xpadding=5) # 'New...' button b = GtkButton('New...') b.show() b.connect('clicked', self.acc_new) t.attach(b, 2, 3, 1, 2, yoptions=0, ypadding=5, xpadding=5) frame.add(t) # Add entries to the list view self.acc = acc self.update_acc() ## Create the 'Editor' notebook def init_editor(self, frame): from externaleditor import hintlist t = GtkTable(8,1,0) t.show() self.usebuiltined = GtkRadioButton(None, "Use standard editor") self.usebuiltined.show() self.usebuiltined.set_active(self.prefs.usebuiltined) self.useexternaled = GtkRadioButton(self.usebuiltined, "Use external editor") self.useexternaled.show() self.useexternaled.set_active( not self.prefs.usebuiltined) self.externaledentry = GtkEntry() self.externaledentry.show() self.externaledentry.set_sensitive( not self.prefs.usebuiltined ) self.externaledentry.set_text(self.prefs.externaledentry) self.usebuiltined.connect('clicked', self.editor_cb, 1 ) self.useexternaled.connect('clicked', self.editor_cb, 0 ) self.editorhints = GtkOptionMenu() self.editorhints.show() self.editorhints.set_sensitive( not self.prefs.usebuiltined ) m = GtkMenu() n = 0 for menu in hintlist: # add the item to the option list i = GtkMenuItem(menu[0]) i.set_data("id", menu[1]) i.show() m.append(i) # check if this item should be made "active" if self.prefs.editorhints == menu[1]: active = n n = n + 1 m.set_active(active) self.editorhints.set_menu(m) b = GtkHBox() lc = GtkLabel("External Editor Font: ") lc.show() lc.set_alignment(0.0, 0.5) b.pack_start(lc, expand=FALSE, fill=TRUE) mc = PFontPicker() mc.set_mode(FONT_PICKER_MODE_FONT_INFO) if self.prefs.externaled_font != None: mc.set_font_name(self.prefs.externaled_font) mc.show() self.externaled_fontpicker = mc b.pack_start(mc, expand=FALSE, fill=TRUE) b.show() t.attach(self.usebuiltined, 0, 1, 0, 1, yoptions=0, ypadding=3, xpadding=10) t.attach(self.useexternaled, 0, 1, 1, 2, xpadding=10, yoptions=0, ypadding=3) t.attach(self.externaledentry, 0, 1, 2, 3, yoptions=0, ypadding=3, xpadding=10) t.attach(self.editorhints, 0, 1, 3, 4, yoptions=0, ypadding=3, xpadding=10) t.attach(b, 0, 1, 4, 5, yoptions=0, ypadding=3, xpadding=10) frame.add(t) def editor_cb( self, widget=None, usebuiltin=1 ): self.externaledentry.set_sensitive( not usebuiltin ) self.editorhints.set_sensitive( not usebuiltin ) self.externaled_fontpicker.set_sensitive( not usebuiltin ) ## Create the 'Incoming' notebook def init_incoming(self, frame): t = GtkTable(8,1,0) t.show() lf = GtkLabel("Incoming mail file:") lf.show() lf.set_alignment(0.0, 0.5) self.spoolentry = GnomeFileEntry() self.spoolentry.show() self.spoolentry.gnome_entry().set_history_id('mailspool') self.spoolentry.gnome_entry().load_history() if self.prefs.spoolfile != None: self.spoolentry.gtk_entry().set_text(self.prefs.spoolfile) lm = GtkLabel("Mail folder directory:") lm.show() lm.set_alignment(0.0, 0.5) self.direntry = GnomeFileEntry() self.direntry.show() self.direntry.gnome_entry().set_history_id('folderdir') self.direntry.gnome_entry().load_history() if self.prefs.folders != None: self.direntry.gtk_entry().set_text(self.prefs.folders) lec = GtkLabel("External command for mail fetching:") lec.show() lec.set_alignment(0.0, 0.5) self.externalentry = GnomeFileEntry() self.externalentry.show() self.externalentry.gnome_entry().set_history_id('external') self.externalentry.gnome_entry().load_history() if self.prefs.external_cmd: self.externalentry.gtk_entry().set_text(self.prefs.external_cmd) self.invokeentry = GtkCheckButton("Invoke external command at startup") self.invokeentry.show() self.invokeentry.set_active(self.prefs.invoke_at_startup) t.attach(lf, 0, 1, 0, 1, yoptions=0, ypadding=3, xpadding=10) t.attach(self.spoolentry, 0, 1, 1, 2, xpadding=10, yoptions=0, ypadding=3) t.attach(lm, 0, 1, 3, 4, yoptions=0, ypadding=3, xpadding=10) t.attach(self.direntry, 0, 1, 4, 5, xpadding=10, yoptions=0, ypadding=3) t.attach(lec, 0, 1, 5, 6, yoptions=0, ypadding=3, xpadding=10) t.attach(self.externalentry, 0, 1, 6, 7, xpadding=10, yoptions=0, ypadding=3) t.attach(self.invokeentry, 0, 1, 7, 8, xpadding=10, yoptions=0, ypadding=3) frame.add(t) # Create the 'Fonts:' notebook def init_fonts(self, frame): t = GtkTable(8,1,0) t.show() lf = GtkLabel("Folder Tree:") lf.show() lf.set_alignment(0.0, 0.5) fp = PFontPicker() fp.set_mode(FONT_PICKER_MODE_FONT_INFO) if self.prefs.fld_font != None: fp.set_font_name(self.prefs.fld_font) fp.show() self.fld_fontpicker = fp ls = GtkLabel("Message Headers:") ls.show() ls.set_alignment(0.0, 0.5) sp = PFontPicker() sp.set_mode(FONT_PICKER_MODE_FONT_INFO) if self.prefs.sub_font != None: sp.set_font_name(self.prefs.sub_font) sp.show() self.sub_fontpicker = sp lm = GtkLabel("Message Body:") lm.show() lm.set_alignment(0.0, 0.5) mp = PFontPicker() mp.set_mode(FONT_PICKER_MODE_FONT_INFO) if self.prefs.msg_font != None: mp.set_font_name(self.prefs.msg_font) mp.show() self.msg_fontpicker = mp lc = GtkLabel("Compose Body:") lc.show() lc.set_alignment(0.0, 0.5) mc = PFontPicker() mc.set_mode(FONT_PICKER_MODE_FONT_INFO) if self.prefs.compose_font != None: mc.set_font_name(self.prefs.compose_font) mc.show() self.compose_fontpicker = mc self.gtkhtml = GtkCheckButton("If available, use GtkHTML for message viewing") self.gtkhtml.show() self.gtkhtml.set_active(self.prefs.gtkhtml) v = GtkHBox() v.show() fillval = self.prefs.fillwidth fillwidth_label = GtkLabel("Set fill-width for paragraphs ") fillwidth_label.show() self.fillwidth = GtkSpinButton(GtkAdjustment(fillval,10,130,1,10,0), 0, 0) self.fillwidth.show() v.pack_start(fillwidth_label, expand=FALSE, fill=TRUE) v.pack_start(self.fillwidth, expand=FALSE, fill=FALSE) t.attach(lf, 0, 1, 0, 1, yoptions=0, ypadding=3, xpadding=10) t.attach(fp, 1, 2, 0, 1, xpadding=20, yoptions=0, ypadding=3) t.attach(ls, 0, 1, 2, 3, yoptions=0, ypadding=3, xpadding=10) t.attach(sp, 1, 2, 2, 3, xpadding=20, yoptions=0, ypadding=3) t.attach(lm, 0, 1, 4, 5, yoptions=0, ypadding=3, xpadding=10) t.attach(mp, 1, 2, 4, 5, xpadding=20, yoptions=0, ypadding=3) t.attach(lc, 0, 1, 6, 7, yoptions=0, ypadding=3, xpadding=10) t.attach(mc, 1, 2, 6, 7, xpadding=20, yoptions=0, ypadding=3) t.attach(self.gtkhtml, 0, 2, 7, 8, xpadding=10, yoptions=0, ypadding=3) t.attach(v, 0, 2, 8, 9, xpadding=10, yoptions=0, ypadding=3) frame.add(t) ## Create the 'Messages' notebook def init_messages(self, frame): t = GtkTable(6,2,0) t.show() self.notify = GtkCheckButton("Popup notify window when new mail arrives") self.notify.show() self.notify.set_active(self.prefs.mailnotify) self.trash = GtkCheckButton("Empty 'trash' folder on exit") self.trash.show() self.trash.set_active(self.prefs.trash) # create the menus for where to put signatures when replying # and when forwarding rb = GtkHBox() fb = GtkHBox() self.sigreply = GtkOptionMenu() self.sigreply.show() self.sigreply.set_sensitive( self.prefs.addsig ) self.sigforward = GtkOptionMenu() self.sigforward.show() self.sigforward.set_sensitive( self.prefs.addsig ) rm = GtkMenu() fm = GtkMenu() n = 0 ractive = 1 factive = 1 s = [ ("Don't use signature", 'none'), ("Put signature after cited text", 'after'), ("Put signature before cited text", 'before') ] for menu in s: # add the item to each option list ri = GtkMenuItem(menu[0]) ri.set_data("id", menu[1]) ri.show() rm.append(ri) fi = GtkMenuItem(menu[0]) fi.set_data("id", menu[1]) fi.show() fm.append(fi) # check if this item should be made "active" if self.prefs.sigreply == menu[1]: ractive = n if self.prefs.sigforward == menu[1]: factive = n n = n + 1 rm.set_active(ractive) fm.set_active(factive) self.sigreply.set_menu(rm) l = GtkLabel(" when replying") l.show() rb.pack_start(self.sigreply, expand=FALSE, fill=TRUE) rb.pack_start(l, expand=FALSE, fill=TRUE) rb.show() self.sigforward.set_menu(fm) l = GtkLabel(" when forwarding") l.show() fb.pack_start(self.sigforward, expand=FALSE, fill=TRUE) fb.pack_start(l, expand=FALSE, fill=TRUE) fb.show() self.addsig = GtkCheckButton("Automatically add signature in composer") self.addsig.show() self.addsig.connect('clicked', self.addsig_cb ) self.addsig.set_active(self.prefs.addsig) self.expand = GtkCheckButton("Confirm address list name expansions") self.expand.show() self.expand.set_active(self.prefs.expand) self.confirmsend = GtkCheckButton("Popup notify window when mail has been successfully sent") self.confirmsend.show() self.confirmsend.set_active(self.prefs.confirmsend) self.filter_start = GtkCheckButton("When getting new mail, only run filters on new mail") self.filter_start.show() self.filter_start.set_active(self.prefs.filter_start) self.gtkhtml = GtkCheckButton("If available, use GtkHTML for message viewing") self.gtkhtml.show() self.gtkhtml.set_active(self.prefs.gtkhtml) v = GtkHBox() v.show() fillval = self.prefs.fillwidth fillwidth_label = GtkLabel("Set fill-width for paragraphs ") fillwidth_label.show() self.fillwidth = GtkSpinButton(GtkAdjustment(fillval,10,130,1,10,0), 0, 0) self.fillwidth.show() v.pack_start(fillwidth_label, expand=FALSE, fill=TRUE) v.pack_start(self.fillwidth, expand=FALSE, fill=FALSE) t.attach(self.notify, 0, 1, 0, 1, xpadding=10, yoptions=0, ypadding=3) t.attach(self.trash, 0, 1, 1, 2, xpadding=10, yoptions=0, ypadding=3) t.attach(self.addsig, 0, 1, 2, 3, xpadding=10, yoptions=0, ypadding=3) t.attach(rb, 0, 1, 3, 4, xpadding=10, yoptions=0, ypadding=3) t.attach(fb, 0, 1, 4, 5, xpadding=10, yoptions=0, ypadding=3) t.attach(self.expand, 0, 1, 5, 6, xpadding=10, yoptions=0, ypadding=3) t.attach(self.confirmsend, 0, 1, 6, 7, xpadding=10, yoptions=0, ypadding=3) t.attach(self.filter_start, 0, 1, 7, 8, xpadding=10, yoptions=0, ypadding=3) frame.add(t) def addsig_cb( self, widget=None ): self.sigreply.set_sensitive( self.addsig.get_active() ) self.sigforward.set_sensitive( self.addsig.get_active() ) ## Window mainloop def mainloop(self): mainloop()