NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

evemailingListConfig.py (24881B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\neocom\evemailingListConfig.py
      2 import math
      3 import utillib
      4 from carbonui.control.combo import Combo
      5 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText
      6 from carbonui.control.window import Window
      7 from carbonui.primitives.container import Container
      8 from carbonui.primitives.containerAutoSize import ContainerAutoSize
      9 from carbonui.primitives.layoutGrid import LayoutGrid
     10 from carbonui.primitives.line import Line
     11 from eve.client.script.ui.control import eveLabel, eveScroll
     12 from eve.client.script.ui.control.allUserEntries import AllUserEntries
     13 from carbonui.button.group import ButtonGroup
     14 from carbonui.control.button import Button
     15 from carbonui.control.checkbox import Checkbox
     16 from eve.client.script.ui.control.entries.util import GetFromClass
     17 from eve.client.script.ui.control.eveEditPlainText import EditPlainText
     18 from carbonui.control.tabGroup import TabGroup
     19 from eve.client.script.ui.shared.neocom.evemail import MailWindow
     20 from eve.client.script.ui.shared.userentry import UserSimple
     21 from eve.common.lib import appConst as const
     22 import evetypes
     23 import carbonui.const as uiconst
     24 import uthread
     25 import localization
     26 from eve.client.script.ui.util import searchOld
     27 from eve.client.script.ui.util.linkUtil import GetItemIDFromTextLink
     28 from eveexceptions import UserError
     29 from eveservices.menu import GetMenuService
     30 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     31 PAD = 6
     32 SPACING = 22
     33 EDITHEIGHT = 32
     34 FIELDWIDTH = 70
     35 FIELDSPACE = 10
     36 BUTTONTOP = 2
     37 FILTER_ALL = 0
     38 FILTER_MEMBERS = 1
     39 FILTER_MUTED = 2
     40 FILTER_OPERATORS = 3
     41 FILTER_BYNAME = 4
     42 ACTION_SETMEMBER = 0
     43 ACTION_SETMUTED = 1
     44 ACTION_SETOPERATOR = 2
     45 ACTION_KICK = 3
     46 NUMPERPAGE = 50
     47 ALLOWED_GROUP_IDS = [const.groupCharacter, const.groupCorporation, const.groupAlliance]
     48 
     49 class MaillistSetupWindow(Window):
     50     __guid__ = 'form.MaillistSetupWindow'
     51     default_iconNum = MailWindow.default_iconNum
     52 
     53     def ApplyAttributes(self, attributes):
     54         Window.ApplyAttributes(self, attributes)
     55         self.mailingListID = attributes.mailingListID
     56         self.mlsvc = sm.GetService('mailinglists')
     57         self.groupName = self.mlsvc.GetDisplayName(self.mailingListID)
     58         self.SetMinSize([350, 460])
     59         self.SetCaption(localization.GetByLabel('UI/EVEMail/MailingLists/Caption', mailinglistName=self.groupName))
     60         self.welcomeText = None
     61         self.sr.tabs = TabGroup(name='tabs', parent=self.content)
     62         self.sr.membersPanel = Container(name='membersPanel', parent=self.content, align=uiconst.TOALL)
     63         self.sr.accessPanel = Container(name='accessPanel', parent=self.content, align=uiconst.TOALL)
     64         self.sr.welcomePanel = Container(name='welcomePanel', parent=self.content, align=uiconst.TOALL)
     65         tabs = [[localization.GetByLabel('UI/EVEMail/MailingLists/MembersTab'),
     66           self.sr.membersPanel,
     67           self,
     68           'members'], [localization.GetByLabel('UI/EVEMail/MailingLists/AccessTab'),
     69           self.sr.accessPanel,
     70           self,
     71           'access'], [localization.GetByLabel('UI/EVEMail/MailingLists/WelcomeMailTab'),
     72           self.sr.welcomePanel,
     73           self,
     74           'welcome']]
     75         self.StartupMembersPanel()
     76         self.StartupAccessPanel()
     77         self.StartupWelcomePanel()
     78         self.sr.tabs.Startup(tabs, 'mailinglistSetup_tabs', autoselecttab=1)
     79 
     80     def StartupMembersPanel(self):
     81         membersPanel = self.sr.membersPanel
     82         comboOptions = [(localization.GetByLabel('UI/Common/All'), FILTER_ALL),
     83          (localization.GetByLabel('UI/EVEMail/MailingLists/NormalMembers'), FILTER_MEMBERS),
     84          (localization.GetByLabel('UI/EVEMail/MailingLists/MutedMembers'), FILTER_MUTED),
     85          (localization.GetByLabel('UI/Chat/Operators'), FILTER_OPERATORS),
     86          (localization.GetByLabel('UI/EVEMail/MailingLists/SearchByName'), FILTER_BYNAME)]
     87         topCont = Container(name='topCont', parent=membersPanel, align=uiconst.TOTOP, pos=(0, 10, 0, 28))
     88         self.sr.membersPanel.showMembersCombo = Combo(label=localization.GetByLabel('UI/EVEMail/MailingLists/ShowLabel'), parent=topCont, options=comboOptions, name='showMembersCombo', callback=self.OnShowMembersComboChanged, width=100, align=uiconst.TOPLEFT)
     89         self.sr.membersPanel.searchEdit = SingleLineEditText(label=localization.GetByLabel('UI/PeopleAndPlaces/SearchString'), name='searchEdit', parent=topCont, align=uiconst.TOPLEFT, pos=(115,
     90          0,
     91          80,
     92          EDITHEIGHT), state=uiconst.UI_HIDDEN, isCharCorpOrAllianceField=True)
     93         self.sr.membersPanel.searchEdit.ShowClearButton(showOnLetterCount=3)
     94         self.sr.membersPanel.searchEdit.OnReturn = self.UpdateMembersScroll
     95         self.sr.membersPanel.searchButton = Button(parent=topCont, label=localization.GetByLabel('UI/Common/Buttons/Search'), left=200, func=self.UpdateMembersScroll, align=uiconst.TOPLEFT, state=uiconst.UI_HIDDEN)
     96         pagingCont = LayoutGrid(parent=ContainerAutoSize(parent=topCont, align=uiconst.TORIGHT), align=uiconst.CENTER, columns=3, cellSpacing=(4, 0))
     97         self.sr.pageBackBtn = Button(parent=pagingCont, align=uiconst.CENTER, texturePath='res:/UI/Texture/Icons/23_64_1.png', iconSize=24, hint=localization.GetByLabel('UI/Common/Previous'), func=lambda : self.ChangeMembersPage(-1), args=())
     98         self.sr.pageCount = eveLabel.EveLabelMedium(parent=pagingCont, align=uiconst.CENTER, state=uiconst.UI_DISABLED, text='')
     99         self.sr.pageFwdBtn = Button(parent=pagingCont, align=uiconst.CENTER, texturePath='res:/UI/Texture/Icons/23_64_2.png', iconSize=24, hint=localization.GetByLabel('UI/Common/Next'), func=lambda : self.ChangeMembersPage(1), args=())
    100         bottomCont = Container(parent=membersPanel, align=uiconst.TOBOTTOM, pos=(0,
    101          0,
    102          100,
    103          EDITHEIGHT), padding=(0,
    104          3 * PAD,
    105          0,
    106          PAD), state=uiconst.UI_PICKCHILDREN)
    107         comboOptions = [(localization.GetByLabel('UI/EVEMail/MailingLists/SetRoleMember'), ACTION_SETMEMBER),
    108          (localization.GetByLabel('UI/EVEMail/MailingLists/SetRoleMuted'), ACTION_SETMUTED),
    109          (localization.GetByLabel('UI/EVEMail/MailingLists/SetRoleOperator'), ACTION_SETOPERATOR),
    110          (localization.GetByLabel('UI/EVEMail/MailingLists/Kick'), ACTION_KICK)]
    111         self.sr.membersPanel.actionCombo = Combo(label=localization.GetByLabel('UI/EVEMail/MailingLists/ApplyToSelected'), parent=bottomCont, options=comboOptions, name='showMembersCombo', width=150, align=uiconst.TOPLEFT)
    112         self.sr.membersPanel.ApplyBtn = Button(parent=bottomCont, label=localization.GetByLabel('UI/Generic/Apply'), func=self.ApplyActionToMembers, align=uiconst.TOPRIGHT)
    113         self.sr.membersPanel.ApplyBtn.Disable()
    114         self.roles = {const.mailingListMemberDefault: localization.GetByLabel('UI/EVEMail/MailingLists/Member'),
    115          const.mailingListMemberMuted: localization.GetByLabel('UI/EVEMail/MailingLists/MutedMember'),
    116          const.mailingListMemberOperator: localization.GetByLabel('UI/EVEMail/MailingLists/Operator'),
    117          const.mailingListMemberOwner: localization.GetByLabel('UI/EVEMail/MailingLists/Owner')}
    118         self.sr.membersPanel.scroll = eveScroll.Scroll(parent=membersPanel, name='membersScroll', padTop=PAD)
    119         self.sr.membersPanel.scroll.sr.id = 'membersPanelScroll'
    120         self.sr.membersPanel.scroll.OnSelectionChange = self.OnMembersScrollSelectionChange
    121 
    122     def OnMembersScrollSelectionChange(self, *args):
    123         if len(self.sr.membersPanel.scroll.GetSelected()) > 0:
    124             self.sr.membersPanel.ApplyBtn.Enable()
    125         else:
    126             self.sr.membersPanel.ApplyBtn.Disable()
    127 
    128     def OnShowMembersComboChanged(self, comboBox, selString, selVal):
    129         if selVal == FILTER_BYNAME:
    130             self.sr.membersPanel.searchEdit.state = uiconst.UI_NORMAL
    131             self.sr.membersPanel.searchButton.state = uiconst.UI_NORMAL
    132         else:
    133             self.sr.membersPanel.searchEdit.state = uiconst.UI_HIDDEN
    134             self.sr.membersPanel.searchButton.state = uiconst.UI_HIDDEN
    135             self.UpdateMembersScroll()
    136 
    137     def ChangeMembersPage(self, pageChange, *args):
    138         self.currPage += pageChange
    139         if self.numPages <= 1:
    140             self.sr.pageBackBtn.Disable()
    141             self.sr.pageFwdBtn.Disable()
    142         elif self.currPage == 0:
    143             self.sr.pageBackBtn.Disable()
    144             self.sr.pageFwdBtn.Enable()
    145         elif self.currPage == self.numPages - 1:
    146             self.sr.pageBackBtn.Enable()
    147             self.sr.pageFwdBtn.Disable()
    148         else:
    149             self.sr.pageBackBtn.Enable()
    150             self.sr.pageFwdBtn.Enable()
    151         self.PopulateMembersScroll()
    152         self.sr.pageCount.text = '%s / %s' % (self.currPage + 1, self.numPages)
    153 
    154     def UpdateMembersScroll(self, *args):
    155         self.members = self.mlsvc.GetMembers(self.mailingListID)
    156         if not self or self.destroyed:
    157             return
    158         self.FilterMembers()
    159         self.SortMembers()
    160         self.PageMembers()
    161         self.PopulateMembersScroll()
    162 
    163     def FilterMembers(self, *args):
    164         filter = self.sr.membersPanel.showMembersCombo.GetValue()
    165         self.filteredMembers = []
    166         if filter == FILTER_ALL:
    167             for memberID, accessLevel in self.members.iteritems():
    168                 self.filteredMembers.append(utillib.KeyVal(memberID=memberID, accessLevel=accessLevel))
    169 
    170         elif filter == FILTER_MEMBERS:
    171             for memberID, accessLevel in self.members.iteritems():
    172                 if accessLevel == const.mailingListMemberDefault:
    173                     self.filteredMembers.append(utillib.KeyVal(memberID=memberID, accessLevel=accessLevel))
    174 
    175         elif filter == FILTER_MUTED:
    176             for memberID, accessLevel in self.members.iteritems():
    177                 if accessLevel == const.mailingListMemberMuted:
    178                     self.filteredMembers.append(utillib.KeyVal(memberID=memberID, accessLevel=accessLevel))
    179 
    180         elif filter == FILTER_OPERATORS:
    181             for memberID, accessLevel in self.members.iteritems():
    182                 if accessLevel == const.mailingListMemberOperator or accessLevel == const.mailingListMemberOwner:
    183                     self.filteredMembers.append(utillib.KeyVal(memberID=memberID, accessLevel=accessLevel))
    184 
    185         elif filter == FILTER_BYNAME:
    186             searchStr = self.sr.membersPanel.searchEdit.GetValue().strip().lower()
    187             for memberID, accessLevel in self.members.iteritems():
    188                 name = cfg.eveowners.Get(memberID).name.strip().lower()
    189                 if name.startswith(searchStr):
    190                     self.filteredMembers.append(utillib.KeyVal(memberID=memberID, accessLevel=accessLevel))
    191 
    192     def SortMembers(self):
    193         self.filteredMembers.sort(cmp=self._CompareMembers)
    194 
    195     def _CompareMembers(self, x, y):
    196         nameX = cfg.eveowners.Get(x.memberID).name.lower()
    197         nameY = cfg.eveowners.Get(y.memberID).name.lower()
    198         if nameX < nameY:
    199             return -1
    200         elif nameX == nameY:
    201             return 0
    202         else:
    203             return 1
    204 
    205     def PageMembers(self):
    206         self.currPage = 0
    207         self.pagedMembers = []
    208         self.numPages = int(math.ceil(float(len(self.filteredMembers)) / NUMPERPAGE))
    209         for i in range(self.numPages):
    210             self.pagedMembers.append(self.filteredMembers[i * NUMPERPAGE:(i + 1) * NUMPERPAGE])
    211 
    212         if self.numPages > 1:
    213             pages = []
    214             for i in range(self.numPages):
    215                 pages.append((str(i + 1), i))
    216 
    217         self.ChangeMembersPage(0)
    218 
    219     def PopulateMembersScroll(self, *args):
    220         scrolllist = []
    221         self.checkedMembers = []
    222         if len(self.pagedMembers) == 0:
    223             page = []
    224         else:
    225             page = self.pagedMembers[self.currPage]
    226         ownerIDs = {m.memberID for m in page}
    227         cfg.eveowners.Prime(ownerIDs)
    228         for m in page:
    229             memberID = m.memberID
    230             memberInfo = cfg.eveowners.Get(memberID)
    231             label = '%s<t>%s' % (memberInfo.name, self.roles[m.accessLevel])
    232             entry = GetFromClass(UserSimple, {'charID': memberID,
    233              'info': memberInfo,
    234              'label': label,
    235              'ownerID': memberID})
    236             scrolllist.append(entry)
    237 
    238         self.sr.membersPanel.scroll.Load(contentList=scrolllist, headers=[localization.GetByLabel('UI/Generic/NamePerson'), localization.GetByLabel('UI/EVEMail/MailingLists/Role')], customColumnWidths=True, noContentHint=localization.GetByLabel('UI/EVEMail/MailingLists/NoMembersFound'))
    239         self.sr.membersPanel.ApplyBtn.Disable()
    240 
    241     @staticmethod
    242     def GetCharMenu(entry, *args):
    243         return GetMenuService().CharacterMenu(entry.sr.node.charID)
    244 
    245     def ApplyActionToMembers(self, *args):
    246         action = self.sr.membersPanel.actionCombo.GetValue()
    247         selectedMembers = self._GetSelectedMembers()
    248         doClose = False
    249         if action == ACTION_SETMEMBER:
    250             if session.charid in selectedMembers:
    251                 ret = prompt_player_fsd_dialog('MailingListMemberSelfConfirm', {}, uiconst.YESNO)
    252                 if ret != uiconst.ID_YES:
    253                     return
    254                 doClose = True
    255             self.mlsvc.SetMembersClear(self.mailingListID, selectedMembers)
    256         elif action == ACTION_SETMUTED:
    257             if session.charid in selectedMembers:
    258                 ret = prompt_player_fsd_dialog('MailingListMuteSelfConfirm', {}, uiconst.YESNO)
    259                 if ret != uiconst.ID_YES:
    260                     return
    261                 doClose = True
    262             self.mlsvc.SetMembersMuted(self.mailingListID, selectedMembers)
    263         elif action == ACTION_SETOPERATOR:
    264             self.mlsvc.SetMembersOperator(self.mailingListID, selectedMembers)
    265         elif action == ACTION_KICK:
    266             self.mlsvc.KickMembers(self.mailingListID, selectedMembers)
    267             self.UpdateAccessScrollData()
    268         if doClose:
    269             self.Close()
    270         else:
    271             self.UpdateMembersScroll()
    272 
    273     def _GetSelectedMembers(self):
    274         selected = []
    275         for s in self.sr.membersPanel.scroll.GetSelected():
    276             selected.append(s.ownerID)
    277 
    278         return selected
    279 
    280     def ClearAccessForSelected(self, *args):
    281         selected = self.sr.blockedScroll.GetSelected() + self.sr.allowedScroll.GetSelected()
    282         if selected:
    283             for e in selected:
    284                 self.mlsvc.ClearEntityAccess(self.mailingListID, e.ownerID)
    285 
    286             self.UpdateAccessScrollData()
    287         else:
    288             raise UserError('PICKERRORNOTIFY', {'num': 1})
    289 
    290     def AddToBlocked(self, *args):
    291         self._ModifyAccess(const.mailingListBlocked)
    292 
    293     def AddToAllowed(self, *args):
    294         self._ModifyAccess(const.mailingListAllowed)
    295 
    296     def _ModifyAccess(self, newAccess):
    297         ownerID = self.Search(self.sr.blockEdit.GetValue())
    298         if ownerID is not None:
    299             self.mlsvc.SetEntityAccess(self.mailingListID, ownerID, newAccess)
    300             self.UpdateAccessScrollData()
    301 
    302     def OnDropInBlocked(self, dragObj, nodes):
    303         self._UpdateAccessOnDropNodes(nodes, const.mailingListBlocked)
    304 
    305     def OnDropInAllowed(self, dragObj, nodes):
    306         self._UpdateAccessOnDropNodes(nodes, const.mailingListAllowed)
    307 
    308     def _UpdateAccessOnDropNodes(self, nodes, newAccess):
    309         validTypeIDs = evetypes.GetTypeIDsByGroups(ALLOWED_GROUP_IDS)
    310         ownerIDs = set()
    311         for node in nodes:
    312             if (node.charID or node.itemID) and node.__guid__ in AllUserEntries():
    313                 ownerIDs.add(node.charID or node.itemID)
    314             elif node.itemID and node.typeID and node.typeID in validTypeIDs:
    315                 ownerIDs.add(node.itemID)
    316             elif getattr(node, '__guid__', None) == 'TextLink':
    317                 itemID = GetItemIDFromTextLink(node, validTypeIDs)
    318                 if itemID:
    319                     ownerIDs.add(itemID)
    320 
    321         if not ownerIDs:
    322             return
    323         cfg.eveowners.Prime(ownerIDs)
    324         accessByEntityID = {x:newAccess for x in ownerIDs if cfg.eveowners.Get(x).groupID in ALLOWED_GROUP_IDS}
    325         if not accessByEntityID:
    326             return
    327         self.mlsvc.SetEntitiesAccess(self.mailingListID, accessByEntityID)
    328         self.UpdateAccessScrollData()
    329 
    330     def UpdateBlockedScroll(self):
    331         self.sr.blockedScroll.Load(contentList=self.scrolllist[const.mailingListBlocked], headers=[localization.GetByLabel('UI/Generic/NamePerson'), localization.GetByLabel('UI/Common/Type')], customColumnWidths=True)
    332 
    333     def UpdateAllowedScroll(self):
    334         self.sr.allowedScroll.Load(contentList=self.scrolllist[const.mailingListAllowed], headers=[localization.GetByLabel('UI/Generic/NamePerson'), localization.GetByLabel('UI/Common/Type')], customColumnWidths=True)
    335 
    336     def StartupAccessPanel(self):
    337         accessPanel = self.sr.accessPanel
    338         topCont = Container(name='topCont', parent=accessPanel, align=uiconst.TOTOP, height=130)
    339         comboOptions = [(localization.GetByLabel('UI/EVEMail/MailingLists/PrivateAccess'), const.mailingListBlocked), (localization.GetByLabel('UI/EVEMail/MailingLists/PublicAccess'), const.mailingListAllowed)]
    340         self.sr.accessPanel.defaultAccessCombo = Combo(label=localization.GetByLabel('UI/EVEMail/MailingLists/DefaultAccessLabel'), parent=topCont, options=comboOptions, name='subcriptionAccessCombo', select=self.mlsvc.GetSettings(self.mailingListID).defaultAccess, pos=(0,
    341          SPACING,
    342          0,
    343          0), width=200)
    344         Button(parent=topCont, label=localization.GetByLabel('UI/Common/Buttons/Apply'), pos=(0, 41, 0, 0), func=self.ApplySettings, align=uiconst.TOPRIGHT)
    345         roleComboOptions = [(localization.GetByLabel('UI/EVEMail/MailingLists/Normal'), const.mailingListMemberDefault), (localization.GetByLabel('UI/EVEMail/MailingLists/MutedRole'), const.mailingListMemberMuted)]
    346         self.sr.accessPanel.defaultRoleCombo = Combo(label=localization.GetByLabel('UI/EVEMail/MailingLists/DefaultMemberRole'), parent=topCont, options=roleComboOptions, name='roleCombo', select=self.mlsvc.GetSettings(self.mailingListID).defaultMemberAccess, pos=(0,
    347          self.sr.accessPanel.defaultAccessCombo.top + self.sr.accessPanel.defaultAccessCombo.height + SPACING,
    348          0,
    349          0), width=200)
    350         Line(parent=topCont, align=uiconst.TOBOTTOM)
    351         addToBlockCont = Container(name='AddToBlockCont', parent=accessPanel, align=uiconst.TOTOP, state=uiconst.UI_PICKCHILDREN, pos=(0, 0, 0, 22), padding=(0, 20, 0, 0))
    352         self.sr.blockEdit = SingleLineEditText(label=localization.GetByLabel('UI/EVEMail/MailingLists/EntitySearchLabel'), name='AddToBlockEdit', parent=addToBlockCont, align=uiconst.TOPLEFT, pos=(0, 0, 100, 0), isCharCorpOrAllianceField=True)
    353         self.sr.blockEdit.ShowClearButton(showOnLetterCount=3)
    354         b1 = Button(parent=addToBlockCont, label=localization.GetByLabel('UI/EVEMail/MailingLists/Allow'), func=self.AddToAllowed, align=uiconst.CENTERRIGHT)
    355         Button(parent=addToBlockCont, label=localization.GetByLabel('UI/PeopleAndPlaces/BlockContact'), func=self.AddToBlocked, align=uiconst.CENTERRIGHT, left=b1.width + b1.left + 4)
    356         self.sr.scrollCont = scrollCont = Container(name='scrollCont', parent=accessPanel, align=uiconst.TOALL)
    357         eveLabel.EveLabelSmall(text=localization.GetByLabel('UI/EVEMail/MailingLists/BlockedLabel'), parent=scrollCont, align=uiconst.TOTOP, top=10, state=uiconst.UI_NORMAL)
    358         self.sr.blockedScroll = eveScroll.Scroll(parent=scrollCont, name='blockedScroll', align=uiconst.TOTOP)
    359         self.sr.blockedScroll.OnSetFocus = self.BlockedScrollOnSetFocus
    360         self.sr.blockedScroll.sr.id = 'blockedScroll'
    361         self.sr.blockedScroll.sr.content.OnDropData = self.OnDropInBlocked
    362         eveLabel.EveLabelSmall(text=localization.GetByLabel('UI/EVEMail/MailingLists/AllowedLabel'), parent=scrollCont, align=uiconst.TOTOP, top=10, state=uiconst.UI_NORMAL)
    363         self.sr.allowedScroll = eveScroll.Scroll(parent=scrollCont, name='allowedScroll', align=uiconst.TOTOP)
    364         self.sr.allowedScroll.OnSetFocus = self.AllowedScrollOnSetFocus
    365         self.sr.allowedScroll.sr.id = 'allowedScroll'
    366         self.sr.allowedScroll.sr.content.OnDropData = self.OnDropInAllowed
    367         self.UpdateAccessScrollData()
    368         ButtonGroup(btns=[[localization.GetByLabel('UI/EVEMail/MailingLists/RemoveSelected'),
    369           self.ClearAccessForSelected,
    370           None,
    371           None]], parent=accessPanel, line=False)
    372         self._OnResize()
    373 
    374     def AllowedScrollOnSetFocus(self):
    375         self.sr.blockedScroll.DeselectAll()
    376 
    377     def BlockedScrollOnSetFocus(self):
    378         self.sr.allowedScroll.DeselectAll()
    379 
    380     def UpdateAccessScrollData(self):
    381         self.scrolllist = {const.mailingListAllowed: [],
    382          const.mailingListBlocked: []}
    383         accessList = self.mlsvc.GetSettings(self.mailingListID).access
    384         cfg.eveowners.Prime(accessList.keys())
    385         for i, m in enumerate(accessList.iteritems()):
    386             ownerID, accessLevel = m
    387             owner = cfg.eveowners.Get(ownerID)
    388             label = '%s<t>%s' % (owner.name, evetypes.GetGroupNameByGroup(owner.groupID))
    389             entry = GetFromClass(UserSimple, {'charID': ownerID,
    390              'info': owner,
    391              'label': label,
    392              'ownerID': ownerID})
    393             self.scrolllist[accessLevel].append(entry)
    394 
    395         self.UpdateAllowedScroll()
    396         self.UpdateBlockedScroll()
    397 
    398     def ApplySettings(self, *args):
    399         defaultAccess = self.sr.accessPanel.defaultAccessCombo.GetValue()
    400         defaultRole = self.sr.accessPanel.defaultRoleCombo.GetValue()
    401         self.mlsvc.SetDefaultAccess(self.mailingListID, defaultAccess, defaultRole)
    402 
    403     def Search(self, searchStr):
    404         return searchOld.SearchOwners(searchStr=searchStr, groupIDs=ALLOWED_GROUP_IDS, hideNPC=True, notifyOneMatch=True, searchWndName='AddToBlockSearch')
    405 
    406     def StartupWelcomePanel(self, *args):
    407         welcomePanel = self.sr.welcomePanel
    408         self.sr.wekcomeToAllCB = Checkbox(parent=welcomePanel, align=uiconst.TOBOTTOM, padTop=8, text=localization.GetByLabel('UI/EVEMail/MailingLists/SendWelcomeMailToAllCheckbox'), settingsKey='welcomeToAllCB', retval=self.mailingListID, checked=settings.user.ui.Get('welcomeToAllCB_%s' % self.mailingListID, 0), callback=self.OnCheckboxChange)
    409         self.sr.subjecField = SingleLineEditText(name='subjecField', parent=welcomePanel, align=uiconst.TOTOP, padBottom=8, maxLength=const.mailMaxSubjectSize, label='', hintText=localization.GetByLabel('UI/EVEMail/MailingLists/WelcomeMailSubject'))
    410         self.sr.welcomeScrollCont = scrollCont = Container(name='scrollCont', parent=welcomePanel, align=uiconst.TOALL)
    411         self.sr.welcomeEdit = EditPlainText(setvalue='', parent=self.sr.welcomeScrollCont, align=uiconst.TOALL, showattributepanel=1, maxLength=const.mailMaxTaggedBodySize)
    412         ButtonGroup(btns=[[localization.GetByLabel('UI/Common/Buttons/Save'),
    413           self.SaveWelcomeMail,
    414           None,
    415           None]], parent=welcomePanel, padTop=8, idx=0)
    416 
    417     def OnCheckboxChange(self, checkbox, *args):
    418         value = self.mailingListID or ''
    419         name = '%s_%s' % (checkbox.name, value)
    420         settings.user.ui.Set(name, checkbox.checked)
    421 
    422     def UpdateWelcome(self, *args):
    423         welcomeMail = self.mlsvc.GetWelcomeMail(self.mailingListID)
    424         if not welcomeMail:
    425             self.sr.welcomeEdit.SetValue('')
    426             self.sr.subjecField.SetValue('')
    427             return
    428         self.welcomeText = welcomeMail
    429         mail = welcomeMail[0]
    430         self.sr.welcomeEdit.SetValue(mail.body)
    431         self.sr.subjecField.SetValue(mail.title)
    432 
    433     def SaveWelcomeMail(self, *args):
    434         sendToAll = self.sr.wekcomeToAllCB.GetValue()
    435         subject = self.sr.subjecField.GetValue()
    436         body = self.sr.welcomeEdit.GetValue()
    437         if len(subject) < 1 and len(body) < 1:
    438             self.mlsvc.ClearWelcomeMail(self.mailingListID)
    439             return
    440         if len(subject) < 1:
    441             raise UserError('NoSubject')
    442         if sendToAll:
    443             self.mlsvc.SaveAndSendWelcomeMail(self.mailingListID, subject, body)
    444         else:
    445             self.mlsvc.SaveWelcomeMail(self.mailingListID, subject, body)
    446 
    447     def _OnResize(self, *args):
    448         uthread.new(self.__OnResize)
    449 
    450     def __OnResize(self):
    451         if self.destroyed or not self.sr.scrollCont:
    452             return
    453         aL, aT, aW, aH = self.sr.scrollCont.GetAbsolute()
    454         newHeight = (aH - 72) / 2
    455         self.sr.allowedScroll.height = newHeight
    456         self.sr.blockedScroll.height = newHeight
    457 
    458     def Load(self, key):
    459         if key == 'members':
    460             self.UpdateMembersScroll()
    461         elif key == 'access':
    462             self.UpdateAllowedScroll()
    463             self._OnResize()
    464         elif key == 'welcome':
    465             if self.welcomeText is None:
    466                 self.UpdateWelcome()