home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / plugins / digsby_service_editor / default_ui.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  24.9 KB  |  663 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import logging
  5. log = logging.getLogger('service_editor.default_ui')
  6. import wx
  7. import gui.toolbox as toolbox
  8. import gui.controls as controls
  9. import common
  10. txtSize = (130, -1)
  11. halfTxtSize = (60, -1)
  12. qtrTxtSize = (30, -1)
  13. center_right_all = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.ALL
  14. center_left_all = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.ALL
  15.  
  16. def ezadd(sz, ctrl, *a, **k):
  17.     do_border = k.pop('border', True)
  18.     if do_border is True or do_border is False:
  19.         border = getattr(ctrl, 'GetDefaultBorder', (lambda : 0))() * do_border
  20.     else:
  21.         border = do_border
  22.     k['border'] = border
  23.     sz.Add(ctrl, *a, **k)
  24.  
  25.  
  26. def AddRowToGridBag(gb, stuff, spans = None):
  27.     if stuff is None:
  28.         return None
  29.     if spans is None:
  30.         spans = { }
  31.     
  32.     gb.row = getattr(gb, 'row', 0)
  33.     if 'check' in stuff:
  34.         ezadd(gb, stuff['check'], (gb.row, 1), spans.get('check', (1, 3)), flag = wx.EXPAND | wx.ALL)
  35.     else:
  36.         ezadd(gb, stuff['label'], (gb.row, 0), spans.get('label', (1, 1)), flag = center_right_all)
  37.         if 'text' in stuff:
  38.             ezadd(gb, stuff['text'], (gb.row, 1), spans.get('text', (1, 1)), flag = wx.ALL)
  39.         elif 'choice' in stuff:
  40.             ezadd(gb, stuff['choice'], (gb.row, 1), spans.get('choice', (1, 3)), flag = wx.ALL)
  41.         
  42.         if 'url' in stuff:
  43.             ezadd(gb, stuff['url'], (gb.row, 2), spans.get('url', (1, 2)), flag = center_left_all)
  44.         elif 'portlabel' in stuff:
  45.             ezadd(gb, stuff['portlabel'], (gb.row, 2), spans.get('portlabel', (1, 1)), flag = center_right_all)
  46.             ezadd(gb, stuff['porttext'], (gb.row, 3), spans.get('porttext', (1, 1)), flag = wx.ALL)
  47.         
  48.     gb.row += 1
  49.  
  50.  
  51. def AddLineToGridBag(gb, parent):
  52.     gb.row = getattr(gb, 'row', 0)
  53.     ezadd(gb, wx.StaticLine(parent), (gb.row, 0), (1, 4), flag = wx.EXPAND | wx.ALL, border = 5)
  54.     gb.row += 1
  55.  
  56.  
  57. def title_for_service(sp, sp_info):
  58.     if sp is None:
  59.         title = _('%s') % sp_info.name
  60.     else:
  61.         title = _('%s - %s Settings') % (sp.name, sp_info.name)
  62.     return title
  63.  
  64.  
  65. def LabelText(parent, label, labelStyle = wx.ALIGN_RIGHT, textStyle = 0, textSize = txtSize):
  66.     label = wx.StaticText(parent, -1, label, style = labelStyle)
  67.     text = wx.TextCtrl(parent, -1, style = textStyle, size = textSize)
  68.     return dict(label = label, text = text)
  69.  
  70.  
  71. def LabelChoice(parent, label, labelStyle = wx.ALIGN_RIGHT):
  72.     label = wx.StaticText(parent, -1, _('Mail Client:'), style = labelStyle)
  73.     choice = wx.Choice(parent)
  74.     return dict(label = label, choice = choice)
  75.  
  76.  
  77. def HyperlinkControl(parent, label, url):
  78.     hlc = wx.HyperlinkCtrl(parent, -1, label, url)
  79.     hlc.HoverColour = hlc.VisitedColour = hlc.NormalColour
  80.     return hlc
  81.  
  82.  
  83. def LabelTextUrl(parent, label, url_label, url, labelStyle = wx.ALIGN_RIGHT, textStyle = 0, textSize = txtSize):
  84.     controls = LabelText(parent, label, labelStyle, textStyle, textSize)
  85.     controls['url'] = HyperlinkControl(parent, url_label, url)
  86.     controls['url'].MoveBeforeInTabOrder(parent.Children[0])
  87.     return controls
  88.  
  89.  
  90. def ServerPort(parent, server_label, port_label = _('Port:')):
  91.     server = LabelText(parent, server_label)
  92.     port = LabelText(parent, port_label, textSize = halfTxtSize)
  93.     server['portlabel'] = port['label']
  94.     server['porttext'] = port['text']
  95.     return server
  96.  
  97.  
  98. def construct_basic_panel(parent, SP, MSP):
  99.     panel = getattr(parent, 'basic_panel', None)
  100.     if panel is None:
  101.         panel = wx.Panel(parent = parent)
  102.     
  103.     if getattr(panel, 'controls', None) is None:
  104.         panel.controls = { }
  105.     
  106.     sz = panel.Sizer = wx.BoxSizer(wx.VERTICAL)
  107.     warnings_lbl = panel.controls['warnings_lbl'] = wx.StaticText(panel, -1, '', style = wx.ALIGN_CENTER)
  108.     warnings_lbl.SetForegroundColour(wx.Colour(224, 0, 0))
  109.     warnings_lbl.Show(False)
  110.     warn_sz = wx.BoxSizer(wx.HORIZONTAL)
  111.     warn_sz.Add(warnings_lbl, 1, flag = wx.EXPAND | wx.ALIGN_CENTER | wx.ALL, border = warnings_lbl.GetDefaultBorder())
  112.     sz.Add(warn_sz, flag = wx.EXPAND | wx.TOP, border = panel.GetDefaultBorder())
  113.     fx = wx.GridBagSizer(0, 0)
  114.     fx.SetEmptyCellSize((0, 0))
  115.     fx.AddGrowableCol(1, 1)
  116.     fx.row = 0
  117.     panel.controls['basic_sz'] = fx
  118.     sz.Add(fx, 1, wx.EXPAND | wx.ALL, panel.Top.GetDialogBorder())
  119.     return panel
  120.  
  121.  
  122. def construct_basic_subpanel_provider(panel, SP, MSP, MSC):
  123.     fx = panel.controls['basic_sz']
  124.     emailaddress_stuff = None
  125.     username_stuff = None
  126.     password_stuff = None
  127.     if MSP.info.provider_info.get('needs_smtp', False):
  128.         emailaddress_stuff = LabelText(panel, _('Email Address:'))
  129.         emailaddress_stuff['text'].Value = getattr(SP, 'email_address', u'')
  130.         emailaddress_stuff['text'].SetFocus()
  131.     
  132.     if SP is None and MSP.info.provider_info.get('newuser_url', None) is not None:
  133.         username_stuff = LabelTextUrl(panel, MSP.info.provider_info.get('username_desc', _('Username')) + ':', _('New User?'), MSP.info.provider_info.newuser_url)
  134.     else:
  135.         username_stuff = LabelText(panel, MSP.info.provider_info.get('username_desc', _('Username')) + ':')
  136.     if SP is not None:
  137.         username_stuff['text'].Value = getattr(SP, 'name', getattr(SP, 'label', u''))
  138.         username_stuff['text'].Enabled = False
  139.     elif emailaddress_stuff is None:
  140.         username_stuff['text'].SetFocus()
  141.     
  142.     needs_password = MSP.info.provider_info.get('needs_password', True)
  143.     if needs_password and MSP.info.provider_info.get('password_url', None) is not None:
  144.         password_stuff = LabelTextUrl(panel, MSP.info.provider_info.get('password_desc', _('Password')) + ':', _('Forgot Password?'), MSP.info.provider_info.password_url, textStyle = wx.TE_PASSWORD)
  145.     elif needs_password:
  146.         password_stuff = LabelText(panel, MSP.info.provider_info.get('password_desc', _('Password')) + ':', textStyle = wx.TE_PASSWORD)
  147.     
  148.     if password_stuff is not None and SP is not None:
  149.         
  150.         try:
  151.             password_stuff['text'].Value = SP._decryptedpw()
  152.         except UnicodeError:
  153.             log.error('Error decrypting password')
  154.             password_stuff['text'].Value = u''
  155.  
  156.         if emailaddress_stuff is None:
  157.             password_stuff['text'].SetFocus()
  158.             password_stuff['text'].SetSelection(-1, -1)
  159.         
  160.     
  161.     panel.controls.update(emailaddress = emailaddress_stuff, username = username_stuff, password = password_stuff)
  162.     AddRowToGridBag(fx, emailaddress_stuff)
  163.     AddRowToGridBag(fx, username_stuff)
  164.     AddRowToGridBag(fx, password_stuff)
  165.     if password_stuff is not None and emailaddress_stuff is not None:
  166.         AddLineToGridBag(fx, panel)
  167.     
  168.  
  169.  
  170. def construct_basic_subpanel_im(panel, SP, MSP, MSC):
  171.     fx = panel.controls['basic_sz']
  172.     remotealias_stuff = None
  173.     register_stuff = None
  174.     if MSC.info.get('needs_remotealias', None) is not None:
  175.         remotealias_stuff = LabelText(panel, _('Display Name:'))
  176.         remotealias_stuff['text'].Value = getattr(SP, 'remote_alias', u'')
  177.     
  178.     if MSC.info.get('needs_register', False) and SP is None:
  179.         register_stuff = dict(check = wx.CheckBox(panel, -1, _('&Register New Account')))
  180.     
  181.     panel.controls.update(remotealias = remotealias_stuff, register = register_stuff)
  182.     AddRowToGridBag(fx, remotealias_stuff)
  183.     AddRowToGridBag(fx, register_stuff)
  184.  
  185.  
  186. def construct_basic_subpanel_email(panel, SP, MSP, MSC):
  187.     fx = panel.controls['basic_sz']
  188.     emailserver_stuff = None
  189.     emailssl_stuff = None
  190.     smtpserver_stuff = None
  191.     smtpssl_stuff = None
  192.     
  193.     def ssl_port_swap_handler(checkbox, portfield, default_value, ssl_value):
  194.         
  195.         def handler(e = (None, None, None, None)):
  196.             if e is not None:
  197.                 e.Skip()
  198.             
  199.             if checkbox.Value and portfield.Value == str(default_value):
  200.                 portfield.Value = str(ssl_value)
  201.             elif not (checkbox.Value) and portfield.Value == str(ssl_value):
  202.                 portfield.Value = str(default_value)
  203.             
  204.  
  205.         return handler
  206.  
  207.     needs_server = MSC.info.get('needs_server', None)
  208.     if needs_server is not None:
  209.         server_type = needs_server.lower()
  210.         default_port = MSC.info.defaults.get('%sport' % server_type, u'')
  211.         default_ssl_port = MSC.info.defaults.get('%sport_ssl' % server_type, u'')
  212.         require_ssl = getattr(SP, 'require_ssl', MSC.info.defaults.get('require_ssl', False))
  213.         port = None(getattr, SP, '%sport' % server_type if require_ssl else default_port)
  214.         emailserver_stuff = ServerPort(panel, _('&%s Server:') % _(needs_server))
  215.         emailssl_stuff = dict(check = wx.CheckBox(panel, -1, _('&This server requires SSL')))
  216.         emailserver_stuff['text'].Value = getattr(SP, '%sserver' % server_type, MSC.info.defaults.get('%sserver' % server_type, u''))
  217.         emailserver_stuff['porttext'].Value = str(port)
  218.         emailssl_stuff['check'].Value = bool(require_ssl)
  219.         ssl_chk = emailssl_stuff['check']
  220.         handler = ssl_port_swap_handler(ssl_chk, emailserver_stuff['porttext'], default_port, default_ssl_port)
  221.         ssl_chk.Bind(wx.EVT_CHECKBOX, handler)
  222.         handler()
  223.     
  224.     if MSP.info.provider_info.get('needs_smtp', False):
  225.         default_port = MSC.info.defaults.get('smtp_port', u'')
  226.         default_ssl_port = MSC.info.defaults.get('smtp_port_ssl', u'')
  227.         require_ssl = getattr(SP, 'smtp_require_ssl', MSC.info.defaults.get('smtp_require_ssl', False))
  228.         port = None(getattr, SP, 'smtp_port' if require_ssl else default_port)
  229.         smtpserver_stuff = ServerPort(panel, _('SMTP Server:'))
  230.         smtpssl_stuff = dict(check = wx.CheckBox(panel, -1, _('This server requires SSL')))
  231.         smtpserver_stuff['text'].Value = getattr(SP, 'smtp_server', MSC.info.defaults.get('smtp_server', u''))
  232.         smtpserver_stuff['porttext'].Value = str(port)
  233.         smtpssl_stuff['check'].Value = bool(require_ssl)
  234.         ssl_chk = smtpssl_stuff['check']
  235.         handler = ssl_port_swap_handler(ssl_chk, smtpserver_stuff['porttext'], default_port, default_ssl_port)
  236.         ssl_chk.Bind(wx.EVT_CHECKBOX, handler)
  237.         handler()
  238.     
  239.     panel.controls.update(emailserver = emailserver_stuff, emailssl = emailssl_stuff, smtpserver = smtpserver_stuff, smtpssl = smtpssl_stuff)
  240.     AddRowToGridBag(fx, emailserver_stuff)
  241.     AddRowToGridBag(fx, emailssl_stuff)
  242.     AddRowToGridBag(fx, smtpserver_stuff)
  243.     AddRowToGridBag(fx, smtpssl_stuff)
  244.  
  245.  
  246. def construct_basic_subpanel_social(panel, SP, MSP, MSC):
  247.     pass
  248.  
  249.  
  250. def construct_advanced_panel(parent, SP, MSP):
  251.     panel = getattr(parent, 'advanced_panel', None)
  252.     if panel is None:
  253.         panel = wx.Panel(parent = parent)
  254.     
  255.     panel.Label = 'advanced panel'
  256.     if getattr(panel, 'controls', None) is None:
  257.         panel.controls = { }
  258.     
  259.     sz = panel.Sizer = wx.BoxSizer(wx.VERTICAL)
  260.     fx = wx.GridBagSizer(0, 0)
  261.     fx.SetEmptyCellSize((0, 0))
  262.     fx.AddGrowableCol(1, 1)
  263.     fx.row = 0
  264.     panel.controls['advanced_sz'] = fx
  265.     sz.Add(fx, 1, wx.EXPAND | wx.ALL, panel.Top.GetDialogBorder())
  266.     return panel
  267.  
  268.  
  269. def construct_advanced_subpanel_provider(panel, SP, MSP, MSC):
  270.     pass
  271.  
  272.  
  273. def construct_advanced_subpanel_im(panel, SP, MSP, MSC):
  274.     fx = panel.controls['advanced_sz']
  275.     imserver_stuff = None
  276.     dataproxy_stuff = None
  277.     httponly_stuff = None
  278.     resource_stuff = None
  279.     imserver_stuff = ServerPort(panel, _('IM Server:'))
  280.     (host, port) = getattr(SP, 'server', MSC.info.defaults.get('server'))
  281.     imserver_stuff['text'].Value = host
  282.     imserver_stuff['porttext'].Value = str(port)
  283.     if MSC.info.get('needs_resourcepriority', False):
  284.         resource_stuff = ServerPort(panel, _('Resource:'), _('Priority:'))
  285.         resource_stuff['text'].Value = getattr(SP, 'resource', MSC.info.defaults.get('resource', u'Digsby'))
  286.         resource_stuff['porttext'].Value = str(getattr(SP, 'priority', MSC.info.defaults.get('priority', 5)))
  287.     
  288.     if MSC.info.get('needs_dataproxy', False):
  289.         dataproxy_stuff = LabelText(panel, _('Data Proxy:'))
  290.         dataproxy_stuff['text'].Value = getattr(SP, 'dataproxy', MSC.info.defaults.get('dataproxy', u''))
  291.     
  292.     panel.controls.update(imserver = imserver_stuff, dataproxy = dataproxy_stuff, resource = resource_stuff)
  293.     if MSC.info.get('needs_httponly'):
  294.         httponly_stuff = dict(check = wx.CheckBox(panel, -1, _('Always connect over HTTP')))
  295.         httponly_stuff['check'].Value = getattr(SP, 'use_http_only', MSC.info.defaults.get('use_http_only'))
  296.         panel.controls['httponly'] = httponly_stuff
  297.     
  298.     for detail in MSC.info.get('more_details', []):
  299.         raise Exception('Implement a custom UI builder for this plugin: %r', MSP.provider_id)
  300.     
  301.     AddRowToGridBag(fx, imserver_stuff)
  302.     AddRowToGridBag(fx, resource_stuff)
  303.     AddRowToGridBag(fx, dataproxy_stuff, spans = dict(text = (1, 3)))
  304.     AddRowToGridBag(fx, httponly_stuff)
  305.  
  306.  
  307. def construct_advanced_subpanel_email(panel, SP, MSP, MSC):
  308.     fx = panel.controls['advanced_sz']
  309.     updatefreq_stuff = dict(label1 = wx.StaticText(panel, -1, _('Check for new mail every')), text = wx.TextCtrl(panel, -1, size = qtrTxtSize), label2 = wx.StaticText(panel, -1, _('minutes')))
  310.     h = wx.BoxSizer(wx.HORIZONTAL)
  311.     ezadd(h, updatefreq_stuff['label1'], 0, flag = center_right_all)
  312.     ezadd(h, updatefreq_stuff['text'], 0, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL)
  313.     ezadd(h, updatefreq_stuff['label2'], 0, flag = center_left_all)
  314.     ezadd(fx, h, (getattr(fx, 'row', 0), 1), (1, 3), flag = wx.EXPAND)
  315.     fx.row = getattr(fx, 'row', 0) + 1
  316.     updatefreq_stuff['text'].Value = str(getattr(SP, 'updatefreq', MSC.info.defaults.get('updatefreq', 300)) / 60)
  317.     webclient_stuff = None
  318.     mailclient = None
  319.     if MSC.info.get('needs_webclient', True):
  320.         webclient_stuff = LabelChoice(panel, _('Mail Client:'))
  321.         if not getattr(SP, 'mailclient', MSC.info.defaults.get('mailclient', 'sysdefault')):
  322.             pass
  323.         _setup_mailclient_choice(webclient_stuff['choice'], 'sysdefault')
  324.         webclient_stuff['choice'].custom_inbox_url = getattr(SP, 'custom_inbox_url', '')
  325.         webclient_stuff['choice'].custom_compose_url = getattr(SP, 'custom_compose_url', '')
  326.         webclient_stuff['choice'].Bind(wx.EVT_CHOICE, _mailclient_select_handler(webclient_stuff['choice']))
  327.         AddRowToGridBag(fx, webclient_stuff)
  328.         AddLineToGridBag(fx, panel)
  329.     
  330.     servertype = MSC.info.get('needs_server', None)
  331.     smtppassword_stuff = None
  332.     smtpusername_stuff = None
  333.     if servertype is not None:
  334.         same = panel.controls['smtpsame_rdo'] = wx.RadioButton(panel, -1, _('SMTP username/password are the same as %s') % servertype, style = wx.RB_GROUP)
  335.         diff = panel.controls['smtpdiff_rdo'] = wx.RadioButton(panel, -1, _('Log on using'))
  336.         ezadd(fx, panel.controls['smtpsame_rdo'], (fx.row, 0), (1, 4), flag = wx.EXPAND | wx.ALL)
  337.         fx.row += 1
  338.         ezadd(fx, panel.controls['smtpdiff_rdo'], (fx.row, 0), (1, 4), flag = wx.EXPAND | wx.ALL)
  339.         fx.row += 1
  340.         smtpusername_stuff = LabelText(panel, _('Username:'))
  341.         smtppassword_stuff = LabelText(panel, _('Password:'), textStyle = wx.TE_PASSWORD)
  342.         
  343.         def set_textfields_enabled(e = (fx, fx, None)):
  344.             enabled = diff.Value
  345.             smtppassword_stuff['text'].Enabled = smtpusername_stuff['text'].Enabled = enabled
  346.             if e is not None:
  347.                 e.Skip()
  348.             
  349.             if not enabled:
  350.                 smtppassword_stuff['text'].Value = smtpusername_stuff['text'].Value = u''
  351.             
  352.  
  353.         same.Value = True
  354.         diff.Value = False
  355.         set_textfields_enabled()
  356.         same.Bind(wx.EVT_RADIOBUTTON, set_textfields_enabled)
  357.         diff.Bind(wx.EVT_RADIOBUTTON, set_textfields_enabled)
  358.         AddRowToGridBag(fx, smtpusername_stuff)
  359.         AddRowToGridBag(fx, smtppassword_stuff)
  360.         if SP is None:
  361.             smtpuser = smtppass = u''
  362.         else:
  363.             smtpuser = getattr(SP, 'smtp_username', u'')
  364.             smtppass = SP._decrypted_smtppw()
  365.         if not smtpuser:
  366.             pass
  367.         if not smtppass and smtpuser == getattr(SP, 'username', None):
  368.             pass
  369.         same = smtppass == getattr(SP, 'password', None)
  370.         panel.controls['smtpsame_rdo'].Value = same
  371.         panel.controls['smtpdiff_rdo'].Value = not same
  372.         if not same:
  373.             smtpusername_stuff['text'].Value = smtpuser
  374.             smtppassword_stuff['text'].Value = smtppass
  375.         
  376.         set_textfields_enabled()
  377.     
  378.     panel.controls.update(updatefreq = updatefreq_stuff, mailclient = webclient_stuff, smtpusername = smtpusername_stuff, smtppassword = smtppassword_stuff)
  379.  
  380.  
  381. def construct_advanced_subpanel_social(panel, SP, MSP, MSC):
  382.     pass
  383.  
  384.  
  385. def layout_polish(basic_panel, advanced_panel):
  386.     if advanced_panel:
  387.         labels = []
  388.         label_align_w = -1
  389.         for name, control_set in basic_panel.controls.items() + advanced_panel.controls.items():
  390.             if not isinstance(control_set, dict):
  391.                 continue
  392.             
  393.             if 'port' not in name and control_set.get('label', None) is not None:
  394.                 labels.append(control_set['label'])
  395.                 label_align_w = max(label_align_w, control_set['label'].GetBestSize().x)
  396.                 continue
  397.         
  398.         for c in labels:
  399.             c.SetMinSize((label_align_w, c.GetBestSize().y))
  400.         
  401.     
  402.  
  403.  
  404. def extract_basic_panel(panel, info, SP, MSP):
  405.     if SP is not None:
  406.         info.update(SP.get_options('im'))
  407.         info.update(SP.get_options('email'))
  408.         info.update(SP.get_options('social'))
  409.     
  410.  
  411.  
  412. def extract_basic_subpanel_provider(panel, info, SP, MSP, MSC):
  413.     emailaddress = panel.controls.get('emailaddress', None)
  414.     if emailaddress is not None:
  415.         info['email_address'] = emailaddress['text'].Value
  416.     
  417.     info['name'] = info['label'] = panel.controls['username']['text'].Value
  418.     password = panel.controls.get('password', None)
  419.     if password is not None:
  420.         
  421.         try:
  422.             info['password'] = common.profile.crypt_pw(password['text'].Value)
  423.             info['_real_password_'] = password['text'].Value
  424.         except UnicodeError:
  425.             log.error('Error encrypting password')
  426.             info['password'] = ''
  427.         except:
  428.             None<EXCEPTION MATCH>UnicodeError
  429.         
  430.  
  431.     None<EXCEPTION MATCH>UnicodeError
  432.     return True
  433.  
  434.  
  435. def extract_basic_subpanel_im(panel, info, SP, MSP, MSC):
  436.     remotealias = panel.controls.get('remotealias', None)
  437.     if remotealias is not None:
  438.         info['remote_alias'] = remotealias['text'].Value
  439.     
  440.     register = panel.controls.get('register', None)
  441.     if register is not None:
  442.         info['register'] = register['check'].Value
  443.     
  444.     return True
  445.  
  446.  
  447. def extract_basic_subpanel_email(panel, info, SP, MSP, MSC):
  448.     emailserver = panel.controls.get('emailserver', None)
  449.     if emailserver is not None:
  450.         server_type = MSC.info.get('needs_server', '').lower()
  451.         host = emailserver['text'].Value
  452.         port = emailserver['porttext'].Value
  453.         ssl = panel.controls['emailssl']['check'].Value
  454.         info[server_type + 'server'] = host
  455.         info[server_type + 'port'] = port
  456.         info['require_ssl'] = ssl
  457.     
  458.     smtpserver = panel.controls.get('smtpserver', None)
  459.     if smtpserver is not None:
  460.         host = smtpserver['text'].Value
  461.         port = smtpserver['porttext'].Value
  462.         ssl = panel.controls['smtpssl']['check'].Value
  463.         info['smtp_server'] = host
  464.         info['smtp_port'] = port
  465.         info['smtp_require_ssl'] = ssl
  466.     
  467.     return True
  468.  
  469.  
  470. def extract_basic_subpanel_social(panel, info, SP, MSP, MSC):
  471.     pass
  472.  
  473.  
  474. def extract_advanced_panel(panel, info, SP, MSP):
  475.     pass
  476.  
  477.  
  478. def extract_advanced_subpanel_provider(panel, info, SP, MSP, MSC):
  479.     pass
  480.  
  481.  
  482. def extract_advanced_subpanel_im(panel, info, SP, MSP, MSC):
  483.     host = panel.controls['imserver']['text'].Value
  484.     port = panel.controls['imserver']['porttext'].Value
  485.     info['server'] = (host, port)
  486.     httponly = panel.controls.get('httponly', None)
  487.     if httponly is not None:
  488.         info['use_http_only'] = httponly['check'].Value
  489.     
  490.     resource = panel.controls.get('resource', None)
  491.     if resource is not None:
  492.         info['resource'] = resource['text'].Value
  493.         info['priority'] = resource['porttext'].Value
  494.     
  495.     dataproxy = panel.controls.get('dataproxy', None)
  496.     if dataproxy is not None:
  497.         info['dataproxy'] = dataproxy['text'].Value
  498.     
  499.     return True
  500.  
  501.  
  502. def extract_advanced_subpanel_email(panel, info, SP, MSP, MSC):
  503.     
  504.     try:
  505.         val = int(panel.controls['updatefreq']['text'].Value) * 60
  506.     except ValueError:
  507.         val = 300
  508.  
  509.     info['updatefreq'] = val
  510.     mailclient = panel.controls.get('mailclient', None)
  511.     if mailclient is not None:
  512.         mailclient = _extract_mailclient_choice(mailclient['choice'])
  513.         info.update(mailclient)
  514.     
  515.     smtpusername = panel.controls.get('smtpusername', None)
  516.     if smtpusername is not None:
  517.         unctrl = smtpusername['text']
  518.         info['smtp_username'] = None if unctrl.Enabled else u''
  519.         pwctrl = panel.controls['smtppassword']['text']
  520.         info['_encrypted_pw'] = info.pop('password', '')
  521.         info['_encrypted_smtppw'] = None if pwctrl.Enabled else u''
  522.     elif MSP.info.get('protocol_info', { }).get('needs_smtp', False):
  523.         info['smtp_username'] = info['username']
  524.         info['_encrypted_smtppw'] = info['_encrypted_pw'] = info.pop('password')
  525.     
  526.     return True
  527.  
  528.  
  529. def extract_advanced_subpanel_social(panel, info, SP, MSP, MSC):
  530.     pass
  531.  
  532. MAIL_CLIENT_SYSDEFAULT = _('System Default')
  533. MAIL_CLIENT_OTHER = _('Other Mail Client...')
  534. MAIL_CLIENT_URL = _('Launch URL...')
  535.  
  536. def _setup_mailclient_choice(ch, mc):
  537.     ch.Frozen().__enter__()
  538.     
  539.     try:
  540.         ch.Clear()
  541.         ch.mailclient = mc
  542.         choices = [
  543.             MAIL_CLIENT_SYSDEFAULT]
  544.         file_entry = 0
  545.         choices += [
  546.             MAIL_CLIENT_OTHER,
  547.             MAIL_CLIENT_URL]
  548.         for s in choices:
  549.             ch.Append(s)
  550.         
  551.         if mc == 'sysdefault':
  552.             selection = 0
  553.         elif mc == '__urls__':
  554.             selection = ch.Count - 1
  555.         else:
  556.             selection = file_entry
  557.         ch.SetSelection(selection)
  558.         ch.Layout()
  559.     finally:
  560.         pass
  561.  
  562.  
  563.  
  564. def _mailclient_select_handler(ch):
  565.     
  566.     def evt_handler(evt = (None,)):
  567.         val = ch.StringSelection
  568.         if val.startswith(MAIL_CLIENT_SYSDEFAULT):
  569.             ch._Value = dict(mailclient = 'sysdefault')
  570.         elif val == MAIL_CLIENT_OTHER:
  571.             import os
  572.             import sys
  573.             defaultDir = os.environ.get('ProgramFiles', '')
  574.             wildcard = None if sys.platform == 'win32' else '*.*'
  575.             filediag = wx.FileDialog(ch.Top, _('Please choose a mail client'), defaultDir = defaultDir, wildcard = wildcard, style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
  576.             if filediag.ShowModal() == wx.ID_OK:
  577.                 ch._Value = dict(mailclient = 'file:' + filediag.Path)
  578.             
  579.         elif val == MAIL_CLIENT_URL:
  580.             diag = LaunchURLDialog(ch.Top, ch.custom_inbox_url, ch.custom_compose_url)
  581.             
  582.             try:
  583.                 if wx.ID_OK == diag.ShowModal():
  584.                     mailclient = '__urls__'
  585.                     ch.custom_inbox_url = diag.InboxURL
  586.                     ch.custom_compose_url = diag.ComposeURL
  587.                     ch._Value = dict(mailclient = '__urls__', custom_inbox_url = diag.InboxURL, custom_compose_url = diag.ComposeURL)
  588.             finally:
  589.                 diag.Destroy()
  590.  
  591.         
  592.  
  593.     return evt_handler
  594.  
  595.  
  596. def _extract_mailclient_choice(ch):
  597.     val = getattr(ch, '_Value', None)
  598.     if val is not None:
  599.         return val
  600.     return dict(mailclient = ch.mailclient, custom_inbox_url = ch.custom_inbox_url, custom_compose_url = ch.custom_compose_url)
  601.  
  602.  
  603. class LaunchURLDialog(toolbox.OKCancelDialog):
  604.     MINSIZE = (350, 1)
  605.     inbox_tooltip = _('Enter the URL that will be launched when you click "Inbox" for this email account.')
  606.     compose_tooltip = _('Enter the URL that will be launched when you click "Compose" for this email account.')
  607.     
  608.     def __init__(self, parent, inbox_url = None, compose_url = None):
  609.         toolbox.OKCancelDialog.__init__(self, parent, title = _('Launch URL'))
  610.         self.construct(inbox_url, compose_url)
  611.         self.layout()
  612.  
  613.     
  614.     def InboxURL(self):
  615.         return self.inbox_text.Value
  616.  
  617.     InboxURL = property(InboxURL)
  618.     
  619.     def ComposeURL(self):
  620.         return self.compose_text.Value
  621.  
  622.     ComposeURL = property(ComposeURL)
  623.     
  624.     def construct(self, inbox_url = None, compose_url = None):
  625.         self.inbox_label = wx.StaticText(self, -1, _('Enter a URL for the Inbox'))
  626.         if not inbox_url:
  627.             pass
  628.         self.inbox_text = wx.TextCtrl(self, -1, '')
  629.         self.compose_label = wx.StaticText(self, -1, _('Enter a URL for the Compose window'))
  630.         if not compose_url:
  631.             pass
  632.         self.compose_text = wx.TextCtrl(self, -1, '')
  633.         self.inbox_label.SetToolTipString(self.inbox_tooltip)
  634.         self.inbox_text.SetToolTipString(self.inbox_tooltip)
  635.         self.compose_label.SetToolTipString(self.compose_tooltip)
  636.         self.compose_text.SetToolTipString(self.compose_tooltip)
  637.         self.inbox_text.Bind(wx.EVT_TEXT, self.on_text)
  638.         self.compose_text.Bind(wx.EVT_TEXT, self.on_text)
  639.         self.on_text()
  640.  
  641.     
  642.     def on_text(self, e = None):
  643.         if e is not None:
  644.             e.Skip()
  645.         
  646.         if self.inbox_text.Value:
  647.             pass
  648.         self.OKButton.Enable(bool(self.compose_text.Value))
  649.  
  650.     
  651.     def layout(self):
  652.         sizer = wx.BoxSizer(wx.VERTICAL)
  653.         sizer.AddMany([
  654.             (self.inbox_label, 0, wx.EXPAND | wx.BOTTOM | wx.TOP, 5),
  655.             (self.inbox_text, 0, wx.EXPAND | wx.LEFT, 7),
  656.             (self.compose_label, 0, wx.EXPAND | wx.BOTTOM | wx.TOP, 5),
  657.             (self.compose_text, 0, wx.EXPAND | wx.LEFT, 7),
  658.             self.MINSIZE])
  659.         self.set_component(sizer)
  660.         self.Fit()
  661.  
  662.  
  663.