def OnTrackerChangeUrl(self):
     trackerIdx = self.trackerUrlList.GetFirstSelected()
     if trackerIdx == -1:
         #no tracker selected
         showErrorMessage(self, 'You need to select a tracker, before you can change its url!')
     else:
         #a tracker was selected
         tracker = self.trackerInfo[self.selectedGroup]['groupTracker'][trackerIdx]
         diag = wx.TextEntryDialog(self, message='Please enter the new url for this tracker:', caption='Enter url', defaultValue=tracker['trackerUrl'])
     
         if diag.ShowModal() == wx.ID_OK:
             #user did hit ok
             trackerUrl = diag.GetValue()
             if i2pHttpUrlRegexObj.match(trackerUrl) is None:
                 #invalid url
                 showErrorMessage(self, 'The url "%s" is not a valid i2p http url!', trackerUrl)
             else:
                 #valid
                 tracker['trackerUrl'] = trackerUrl
                 self.trackerUrlList.dataUpdate()
 def OnTrackerAdd(self, event):
     if self.selectedGroup is None:
         #no group selected
         showErrorMessage(self, 'You need to select a tracker group, before you can add a tracker!')
     else:
         #group selected, go on
         tier = self.trackerInfo[self.selectedGroup]['groupTracker']
         trackerUrl = self.trackerAnnounceUrl.GetValue()
         if i2pHttpUrlRegexObj.match(trackerUrl) is None:
             #invalid url
             showErrorMessage(self, 'The url "%s" is not a valid i2p http url!', trackerUrl)
         else:
             #valid
             trackerPos = self.trackerUrlList.GetFirstSelected()
             if trackerPos == -1:
                 trackerPos = 0
             else:
                 trackerPos += 1
                 
             tier.insert(trackerPos, {'tier':self.selectedGroup + 1,
                                      'tierPos':trackerPos + 1,
                                      'trackerUrl':trackerUrl,
                                      'trackerId':self.nextTrackerId,
                                      'active':False,
                                      'announceTryCount':None,
                                      'announceTryTime':None,
                                      'announceSuccessCount':None,
                                      'announceSuccessTime':None,
                                      'lastAnnounceResult':'None',
                                      'scrapeTryCount':None,
                                      'scrapeTryTime':None,
                                      'scrapeSuccessCount':None,
                                      'scrapeSuccessTime':None,
                                      'seeds':None,
                                      'leeches':None,
                                      'downloads':None})
             self.nextTrackerId += 1
             
             self.trackerUrlList.dataUpdate()