def test_ipaddrctrlProperties(self):
        t = m.IpAddrCtrl(self.frame)

        t.DefaultStyle
        t.NumberOfLines
        t.Hint
        t.InsertionPoint
        t.LastPosition
        t.Margins
        t.StringSelection
        t.Value
 def test_ipaddrctrlCtor(self):
     t = m.IpAddrCtrl(self.frame)
     t = m.IpAddrCtrl(self.frame, -1, "128.000.000.000")
     t = m.IpAddrCtrl(self.frame, style=wx.TE_READONLY)
Exemple #3
0
    def __init__(self, parent, log):
        self.log = log
        scroll.ScrolledPanel.__init__(self, parent, -1)
        self.sizer = wx.BoxSizer(wx.VERTICAL)

        labelMaskedCombos = wx.StaticText(
            self, -1, """\
These are some examples of masked.ComboBox:""")
        labelMaskedCombos.SetForegroundColour("Blue")

        label_statecode = wx.StaticText(
            self, -1, """\
A state selector; only
"legal" values can be
entered:""")
        statecode = masked.ComboBox(self,
                                    -1,
                                    masked.states[0],
                                    choices=masked.states,
                                    autoformat="USSTATE")

        label_statename = wx.StaticText(
            self, -1, """\
A state name selector,
with auto-select:""")

        # Create this one using factory function:
        statename = masked.Ctrl(self,
                                -1,
                                masked.state_names[0],
                                controlType=masked.controlTypes.COMBO,
                                choices=masked.state_names,
                                autoformat="USSTATENAME",
                                autoSelect=True)
        statename.SetCtrlParameters(formatcodes='F!V_')

        numerators = [str(i) for i in range(1, 4)]
        denominators = [
            string.ljust(str(i), 2) for i in [2, 3, 4, 5, 8, 16, 32, 64]
        ]
        fieldsDict = {
            0: masked.Field(choices=numerators, choiceRequired=False),
            1: masked.Field(choices=denominators, choiceRequired=True)
        }
        choices = []
        for n in numerators:
            for d in denominators:
                if n != d:
                    choices.append('%s/%s' % (n, d))

        label_fraction = wx.StaticText(
            self, -1, """\
A masked ComboBox for fraction selection.
Choices for each side of the fraction can
be selected with PageUp/Down:""")

        fraction = masked.Ctrl(self,
                               -1,
                               "",
                               controlType=masked.controlTypes.COMBO,
                               choices=choices,
                               choiceRequired=True,
                               mask="#/##",
                               formatcodes="F_",
                               validRegex="^\d\/\d\d?",
                               fields=fieldsDict)

        label_code = wx.StaticText(
            self, -1, """\
A masked ComboBox to validate
text from a list of numeric codes:""")

        choices = ["91", "136", "305", "4579"]
        code = masked.ComboBox(self,
                               -1,
                               choices[0],
                               choices=choices,
                               choiceRequired=True,
                               formatcodes="F_r",
                               mask="####")

        label_selector = wx.StaticText(
            self, -1, """\
Programmatically set
choice sets:""")
        self.list_selector = wx.ComboBox(self,
                                         -1,
                                         '',
                                         choices=['list1', 'list2', 'list3'])
        self.dynamicbox = masked.Ctrl(
            self,
            -1,
            '    ',
            controlType=masked.controlTypes.COMBO,
            mask='XXXX',
            formatcodes='F_',
            # these are to give dropdown some initial height,
            # as base control apparently only sets that size
            # during initial construction <sigh>:
            choices=['', '1', '2', '3', '4', '5'])

        self.dynamicbox.Clear(
        )  # get rid of initial choices used to size the dropdown

        labelIpAddrs = wx.StaticText(
            self, -1, """\
Here are some examples of IpAddrCtrl, a control derived from masked.TextCtrl:"""
        )
        labelIpAddrs.SetForegroundColour("Blue")

        label_ipaddr1 = wx.StaticText(self, -1, "An empty control:")
        ipaddr1 = masked.IpAddrCtrl(self, -1, style=wx.TE_PROCESS_TAB)

        label_ipaddr2 = wx.StaticText(self, -1, "A restricted mask:")
        ipaddr2 = masked.IpAddrCtrl(self, -1, mask=" 10.  1.109.###")

        label_ipaddr3 = wx.StaticText(
            self, -1, """\
A control with restricted legal values:
10. (1|2) . (129..255) . (0..255)""")
        ipaddr3 = masked.Ctrl(self,
                              -1,
                              controlType=masked.controlTypes.IPADDR,
                              mask=" 10.  #.###.###")
        ipaddr3.SetFieldParameters(
            0, validRegex="1|2",
            validRequired=False)  # requires entry to match or not allowed

        # This allows any value in penultimate field, but colors anything outside of the range invalid:
        ipaddr3.SetFieldParameters(1,
                                   validRange=(129, 255),
                                   validRequired=False)

        labelNumerics = wx.StaticText(
            self, -1, """\
Here are some useful configurations of a masked.TextCtrl for integer and floating point input that still treat
the control as a text control.  (For a true numeric control, check out the masked.NumCtrl class!)"""
        )
        labelNumerics.SetForegroundColour("Blue")

        label_intctrl1 = wx.StaticText(
            self, -1, """\
An integer entry control with
shifting insert enabled:""")
        self.intctrl1 = masked.TextCtrl(self,
                                        -1,
                                        name='intctrl',
                                        mask="#{9}",
                                        formatcodes='_-,F>')
        label_intctrl2 = wx.StaticText(
            self, -1, """\
     Right-insert integer entry:""")
        self.intctrl2 = masked.TextCtrl(self,
                                        -1,
                                        name='intctrl',
                                        mask="#{9}",
                                        formatcodes='_-,Fr')

        label_floatctrl = wx.StaticText(
            self, -1, """\
A floating point entry control
with right-insert for ordinal:""")
        self.floatctrl = masked.TextCtrl(self,
                                         -1,
                                         name='floatctrl',
                                         mask="#{9}.#{2}",
                                         formatcodes="F,_-R",
                                         useParensForNegatives=False)
        self.floatctrl.SetFieldParameters(
            0, formatcodes='r<', validRequired=True
        )  # right-insert, require explicit cursor movement to change fields
        self.floatctrl.SetFieldParameters(
            1, defaultValue='00')  # don't allow blank fraction

        label_numselect = wx.StaticText(
            self, -1, """\
<= Programmatically set the value
     of the float entry ctrl:""")
        numselect = wx.ComboBox(self,
                                -1,
                                choices=[
                                    '', '111', '222.22', '-3',
                                    '54321.666666666', '-1353.978', '1234567',
                                    '-1234567', '123456789', '-123456789.1',
                                    '1234567890.', '-1234567890.1'
                                ])

        parens_check = wx.CheckBox(
            self, -1, "Use () to indicate negatives in above controls")

        gridCombos = wx.FlexGridSizer(cols=4, vgap=10, hgap=10)
        gridCombos.Add(label_statecode, 0, wx.ALIGN_LEFT)
        gridCombos.Add(statecode, 0, wx.ALIGN_LEFT)
        gridCombos.Add(label_fraction, 0, wx.ALIGN_LEFT)
        gridCombos.Add(fraction, 0, wx.ALIGN_LEFT)
        gridCombos.Add(label_statename, 0, wx.ALIGN_LEFT)
        gridCombos.Add(statename, 0, wx.ALIGN_LEFT)
        gridCombos.Add(label_code, 0, wx.ALIGN_LEFT)
        gridCombos.Add(code, 0, wx.ALIGN_LEFT)
        gridCombos.Add(label_selector, 0, wx.ALIGN_LEFT)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(self.list_selector, 0, wx.ALIGN_LEFT)
        hbox.Add(wx.StaticText(self, -1, ' => '), 0, wx.ALIGN_LEFT)
        hbox.Add(self.dynamicbox, 0, wx.ALIGN_LEFT)
        gridCombos.Add(hbox, 0, wx.ALIGN_LEFT)

        gridIpAddrs = wx.FlexGridSizer(cols=4, vgap=10, hgap=15)
        gridIpAddrs.Add(label_ipaddr1, 0, wx.ALIGN_LEFT)
        gridIpAddrs.Add(ipaddr1, 0, wx.ALIGN_LEFT)
        gridIpAddrs.Add(label_ipaddr2, 0, wx.ALIGN_LEFT)
        gridIpAddrs.Add(ipaddr2, 0, wx.ALIGN_LEFT)
        gridIpAddrs.Add(label_ipaddr3, 0, wx.ALIGN_LEFT)
        gridIpAddrs.Add(ipaddr3, 0, wx.ALIGN_LEFT)

        gridNumerics = wx.FlexGridSizer(cols=4, vgap=10, hgap=10)
        gridNumerics.Add(label_intctrl1, 0, wx.ALIGN_LEFT)
        gridNumerics.Add(self.intctrl1, 0, wx.ALIGN_LEFT)
        gridNumerics.Add(label_intctrl2, 0, wx.ALIGN_RIGHT)
        gridNumerics.Add(self.intctrl2, 0, wx.ALIGN_LEFT)
        gridNumerics.Add(label_floatctrl, 0, wx.ALIGN_LEFT)
        gridNumerics.Add(self.floatctrl, 0, wx.ALIGN_LEFT)
        gridNumerics.Add(label_numselect, 0, wx.ALIGN_RIGHT)
        gridNumerics.Add(numselect, 0, wx.ALIGN_LEFT)

        self.sizer.Add(labelMaskedCombos, 0, wx.ALIGN_LEFT | wx.ALL, 5)
        self.sizer.Add(gridCombos, 0, wx.ALIGN_LEFT | wx.ALL, border=5)
        self.sizer.Add(wx.StaticLine(self, -1),
                       0,
                       wx.EXPAND | wx.TOP | wx.BOTTOM,
                       border=8)
        self.sizer.Add(labelIpAddrs, 0, wx.ALIGN_LEFT | wx.ALL, 5)
        self.sizer.Add(gridIpAddrs, 0, wx.ALIGN_LEFT | wx.ALL, border=5)
        self.sizer.Add(wx.StaticLine(self, -1),
                       0,
                       wx.EXPAND | wx.TOP | wx.BOTTOM,
                       border=8)
        self.sizer.Add(labelNumerics, 0, wx.ALIGN_LEFT | wx.ALL, 5)
        self.sizer.Add(gridNumerics, 0, wx.ALIGN_LEFT | wx.ALL, border=5)
        self.sizer.Add(parens_check, 0, wx.ALIGN_LEFT | wx.ALL, 5)

        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.SetupScrolling()

        self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=fraction.GetId())
        self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=code.GetId())
        self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=statecode.GetId())
        self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=statename.GetId())
        self.Bind(wx.EVT_TEXT, self.OnTextChange, id=code.GetId())
        self.Bind(wx.EVT_TEXT, self.OnTextChange, id=statecode.GetId())
        self.Bind(wx.EVT_TEXT, self.OnTextChange, id=statename.GetId())
        self.Bind(wx.EVT_COMBOBOX,
                  self.OnListSelection,
                  id=self.list_selector.GetId())

        self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.intctrl1.GetId())
        self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.intctrl2.GetId())
        self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.floatctrl.GetId())
        self.Bind(wx.EVT_COMBOBOX, self.OnNumberSelect, id=numselect.GetId())
        self.Bind(wx.EVT_CHECKBOX, self.OnParensCheck, id=parens_check.GetId())

        self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr1.GetId())
        self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr2.GetId())
        self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr3.GetId())
Exemple #4
0
	def __init__( self, parent, id = wx.ID_ANY, title='', size=(200,200) ):
		wx.Frame.__init__(self, parent, id, title, size=size)

		self.config = wx.Config(appName="CrossMgrImpinj",
						vendorName="SmartCyclingSolutions",
						style=wx.CONFIG_USE_LOCAL_FILE)
						
		self.SetBackgroundColour( wx.Colour(232,232,232) )
		
		self.LightGreen = wx.Colour(153,255,153)
		self.LightRed = wx.Colour(255,153,153)
		
		font = self.GetFont()
		bigFont = wx.Font( font.GetPointSize() * 1.5, font.GetFamily(), font.GetStyle(), wx.FONTWEIGHT_BOLD )
		italicFont = wx.Font( bigFont.GetPointSize()*2.2, bigFont.GetFamily(), wx.FONTSTYLE_ITALIC, bigFont.GetWeight() )
		
		self.vbs = wx.BoxSizer( wx.VERTICAL )
		
		bs = wx.BoxSizer( wx.HORIZONTAL )
		
		self.reset = RoundButton(self, label='Reset', size=(80, 80))
		self.reset.SetBackgroundColour( wx.WHITE )
		self.reset.SetForegroundColour( wx.Colour(0,128,128) )
		self.reset.SetFontToFitLabel()	# Use the button's default font, but change the font size to fit the label.
		self.reset.Bind( wx.EVT_BUTTON, self.doReset )
		self.reset.Refresh()
		bs.Add( self.reset, border = 8, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL )
		bs.Add( setFont(italicFont,wx.StaticText(self, label='CrossMgrImpinj')), border = 8, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL )
		bs.AddStretchSpacer()
		bitmap = wx.BitmapFromXPMData( clipboard_xpm )
		self.copyToClipboard = wx.BitmapButton( self, bitmap=bitmap )
		self.copyToClipboard.SetToolTip(wx.ToolTip('Copy Configuration and Logs to Clipboard...'))
		self.copyToClipboard.Bind( wx.EVT_BUTTON, self.doCopyToClipboard )
		bs.Add( self.copyToClipboard, border = 32, flag = wx.LEFT|wx.ALIGN_CENTER_VERTICAL )
		self.tStart = datetime.datetime.now()
		bs.Add( setFont(bigFont,wx.StaticText(self, label='Last Reset: %s' % self.tStart.strftime('%H:%M:%S'))), border = 10, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL )
		self.runningTime = setFont(bigFont,wx.StaticText(self, label='00:00:00' ))
		bs.Add( self.runningTime, border = 20, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL )
		bs.Add( setFont(bigFont,wx.StaticText(self, label=' / ')), flag=wx.ALIGN_CENTER_VERTICAL )
		self.time = setFont(bigFont, wx.StaticText(self, label='00:00:00' ))
		bs.Add( self.time, flag=wx.ALIGN_CENTER_VERTICAL )
		
		self.vbs.Add( bs, flag=wx.ALL|wx.EXPAND, border = 4 )
		
		fgs = wx.FlexGridSizer( rows = 2, cols = 2, vgap = 4, hgap = 4 )
		fgs.AddGrowableRow( 1 )
		fgs.AddGrowableCol( 0 )
		fgs.AddGrowableCol( 1 )
		fgs.SetFlexibleDirection( wx.BOTH )
		
		self.vbs.Add( fgs, flag=wx.EXPAND, proportion=5 )
		
		#------------------------------------------------------------------------------------------------
		# Impinj configuration.
		#
		gbs = wx.GridBagSizer( 4, 4 )
		fgs.Add( gbs, flag=wx.EXPAND|wx.ALL, border = 4 )
		
		iRow = 0
		hb = wx.BoxSizer( wx.HORIZONTAL )
		hb.Add( setFont(bigFont,wx.StaticText(self, label='Impinj Configuration:')), flag=wx.ALIGN_CENTER_VERTICAL )
		self.autoDetectButton = wx.Button(self, label='Auto Detect')
		self.autoDetectButton.Bind( wx.EVT_BUTTON, self.doAutoDetect )
		hb.Add( self.autoDetectButton, flag=wx.LEFT, border = 6 )
		
		self.advancedButton = wx.Button(self, label='Advanced...' )
		self.advancedButton.Bind( wx.EVT_BUTTON, self.doAdvanced )
		hb.Add( self.advancedButton, flag=wx.LEFT, border = 6 )
		
		gbs.Add( hb, pos=(iRow,0), span=(1,2), flag=wx.ALIGN_LEFT )
		
		iRow += 1
		
		gs = wx.GridSizer( rows=0, cols=4, vgap=0, hgap=2 )
		self.antennaLabels = []
		self.antennas = []
		for i in xrange(4):
			self.antennaLabels.append( wx.StaticText(self, label='{}'.format(i+1), style=wx.ALIGN_CENTER) )
			gs.Add( self.antennaLabels[-1], flag=wx.ALIGN_CENTER|wx.EXPAND )
		for i in xrange(4):
			cb = wx.CheckBox( self, wx.ID_ANY, '')
			if i < 2:
				cb.SetValue( True )
			cb.Bind( wx.EVT_CHECKBOX, lambda x: self.getAntennaStr() )
			gs.Add( cb, flag=wx.ALIGN_CENTER )
			self.antennas.append( cb )
		
		gbs.Add( wx.StaticText(self, label='ANT Ports:'), pos=(iRow,0), span=(1,1), flag=wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM )
		gbs.Add( gs, pos=(iRow,1), span=(1,1), flag=wx.ALIGN_CENTER_VERTICAL )
		
		iRow += 1
		
		self.useHostName = wx.RadioButton( self, label='Host Name:', style=wx.wx.RB_GROUP )
		gbs.Add( self.useHostName, pos=(iRow,0), span=(1,1), flag=wx.ALIGN_CENTER_VERTICAL )
		hb = wx.BoxSizer( wx.HORIZONTAL )
		hb.Add( wx.StaticText(self, label=ImpinjHostNamePrefix), flag=wx.ALIGN_CENTER_VERTICAL )
		self.impinjHostName = masked.TextCtrl( self,
							mask         = 'NN-NN-NN',
							defaultValue = '00-00-00',
							useFixedWidthFont = True,
							size=(80, -1),
						)
		hb.Add( self.impinjHostName )
		hb.Add( wx.StaticText(self, label=ImpinjHostNameSuffix), flag=wx.ALIGN_CENTER_VERTICAL )
		hb.Add( wx.StaticText(self, label=' : ' + '{}'.format(ImpinjInboundPort)), flag=wx.ALIGN_CENTER_VERTICAL )
		gbs.Add( hb, pos=(iRow,1), span=(1,1), flag=wx.ALIGN_LEFT )
		
		iRow += 1
		self.useStaticAddress = wx.RadioButton( self, label='IP:' )
		gbs.Add( self.useStaticAddress, pos=(iRow,0), span=(1,1), flag=wx.ALIGN_CENTER_VERTICAL )
		hb = wx.BoxSizer( wx.HORIZONTAL )
		self.impinjHost = masked.IpAddrCtrl( self, style=wx.TE_PROCESS_TAB )
		hb.Add( self.impinjHost )
		hb.Add( wx.StaticText(self, label=' : ' + '{}'.format(ImpinjInboundPort)), flag=wx.ALIGN_CENTER_VERTICAL )

		gbs.Add( hb, pos=(iRow,1), span=(1,1), flag=wx.ALIGN_LEFT )
		
		self.useHostName.SetValue( True )
		self.useStaticAddress.SetValue( False )
		
		iRow += 1
		gbs.Add( wx.StaticText(self, label='ANT Reads:'), pos=(iRow,0), span=(1,1), flag=wx.ALIGN_RIGHT )
		self.antennaReadCount = wx.StaticText( self, label='1:0 0% | 2:0 0% | 3:0 0% | 4:0 0%               ' )
		gbs.Add( self.antennaReadCount, pos=(iRow,1), span=(1,2), flag=wx.ALIGN_LEFT )
		
		iRow += 1
		gbs.Add( wx.StaticText(self, label='Backup File:'), pos=(iRow,0), span=(1,1), flag=wx.ALIGN_RIGHT )
		self.backupFile = wx.StaticText( self, label='                                                   ' )
		gbs.Add( self.backupFile, pos=(iRow,1), span=(1,2), flag=wx.ALIGN_LEFT )
		
		#------------------------------------------------------------------------------------------------
		# CrossMgr configuration.
		#
		gbs = wx.GridBagSizer( 4, 4 )
		fgs.Add( gbs, flag=wx.EXPAND|wx.ALL, border = 4 )
		
		gbs.Add( setFont(bigFont,wx.StaticText(self, label='CrossMgr Configuration:')), pos=(0,0), span=(1,2), flag=wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL )
		gbs.Add( wx.StaticText(self, label='CrossMgr Address:'), pos=(1,0), span=(1,1), flag=wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL )
		
		hb = wx.BoxSizer( wx.HORIZONTAL )
		self.crossMgrHost = masked.IpAddrCtrl( self, style = wx.TE_PROCESS_TAB )
		hb.Add( self.crossMgrHost, flag=wx.ALIGN_LEFT )
		hb.Add( wx.StaticText( self, label=' : 53135' ), flag=wx.ALIGN_CENTER_VERTICAL )
		gbs.Add( hb, pos=(1,1), span=(1,1), flag=wx.ALIGN_LEFT )
		
		#------------------------------------------------------------------------------------------------
		# Add messages
		#
		self.impinjMessagesText = wx.TextCtrl( self, style=wx.TE_READONLY|wx.TE_MULTILINE|wx.HSCROLL, size=(-1,400) )
		fgs.Add( self.impinjMessagesText, flag=wx.EXPAND, proportion=2 )
		self.impinjMessages = MessageManager( self.impinjMessagesText )
		
		self.crossMgrMessagesText = wx.TextCtrl( self, style=wx.TE_READONLY|wx.TE_MULTILINE|wx.HSCROLL, size=(-1,400) )
		fgs.Add( self.crossMgrMessagesText, flag=wx.EXPAND, proportion=2 )
		self.crossMgrMessages = MessageManager( self.crossMgrMessagesText )
		self.fgs = fgs
		
		#------------------------------------------------------------------------------------------------
		# Create a timer to update the messages.
		#
		self.timer = wx.Timer()
		self.timer.Bind( wx.EVT_TIMER, self.updateMessages )
		self.timer.Start( 1000, False )
		
		self.Bind(wx.EVT_CLOSE, self.onCloseWindow)

		self.readOptions()
		
		self.SetSizer( self.vbs )
		self.start()
Exemple #5
0
    def __init__(self, parent, id=wx.ID_ANY, title='', size=(200, 200)):
        wx.Frame.__init__(self, parent, id, title, size=size)

        self.config = wx.Config(appName="CrossMgrAlien",
                                vendorName="SmartCyclingSolutions",
                                style=wx.CONFIG_USE_LOCAL_FILE)

        self.SetBackgroundColour(wx.Colour(232, 232, 232))

        self.LightGreen = wx.Colour(153, 255, 153)
        self.LightRed = wx.Colour(255, 153, 153)

        font = self.GetFont()
        bigFont = wx.Font(font.GetPointSize() * 1.5, font.GetFamily(),
                          font.GetStyle(), wx.FONTWEIGHT_BOLD)
        italicFont = wx.Font(bigFont.GetPointSize() * 2.2, bigFont.GetFamily(),
                             wx.FONTSTYLE_ITALIC, bigFont.GetWeight())

        self.vbs = wx.BoxSizer(wx.VERTICAL)

        bs = wx.BoxSizer(wx.HORIZONTAL)

        self.reset = RoundButton(self, wx.ID_ANY, 'Reset', size=(80, 80))
        self.reset.SetBackgroundColour(wx.WHITE)
        self.reset.SetForegroundColour(wx.Colour(0, 128, 128))
        self.reset.SetFontToFitLabel(
        )  # Use the button's default font, but change the font size to fit the label.
        self.reset.Bind(wx.EVT_BUTTON, self.doReset)
        self.reset.Refresh()
        bs.Add(self.reset, border=8, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
        bs.Add(setFont(italicFont,
                       wx.StaticText(self, wx.ID_ANY, 'CrossMgrAlien')),
               border=8,
               flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
        bs.AddStretchSpacer()
        bitmap = wx.BitmapFromXPMData(clipboard_xpm)
        self.copyToClipboard = wx.BitmapButton(self, wx.ID_ANY, bitmap)
        self.copyToClipboard.SetToolTip(
            wx.ToolTip('Copy Configuration and Logs to Clipboard...'))
        self.copyToClipboard.Bind(wx.EVT_BUTTON, self.doCopyToClipboard)
        bs.Add(self.copyToClipboard,
               border=32,
               flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.tStart = datetime.datetime.now()
        bs.Add(setFont(
            bigFont,
            wx.StaticText(
                self, wx.ID_ANY,
                'Last Reset: {}'.format(self.tStart.strftime('%H:%M:%S')))),
               border=10,
               flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.runningTime = setFont(bigFont,
                                   wx.StaticText(self, wx.ID_ANY, '00:00:00'))
        bs.Add(self.runningTime,
               border=20,
               flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
        bs.Add(setFont(bigFont, wx.StaticText(self, wx.ID_ANY, ' / ')),
               flag=wx.ALIGN_CENTER_VERTICAL)
        self.time = setFont(bigFont, wx.StaticText(self, wx.ID_ANY,
                                                   '00:00:00'))
        bs.Add(self.time, flag=wx.ALIGN_CENTER_VERTICAL)

        self.vbs.Add(bs, flag=wx.ALL | wx.EXPAND, border=4)

        fgs = wx.FlexGridSizer(rows=0, cols=2, vgap=4, hgap=4)
        fgs.AddGrowableRow(1)
        fgs.AddGrowableCol(0)
        fgs.AddGrowableCol(1)
        fgs.SetFlexibleDirection(wx.BOTH)

        self.vbs.Add(fgs, flag=wx.EXPAND, proportion=5)

        #------------------------------------------------------------------------------------------------
        # Alien configuration.
        #
        gbs = wx.GridBagSizer(4, 4)
        fgs.Add(gbs, flag=wx.EXPAND | wx.ALL, border=4)

        iRow = 0
        hs = wx.BoxSizer(wx.HORIZONTAL)
        hs.Add(setFont(bigFont,
                       wx.StaticText(self, wx.ID_ANY, 'Alien Configuration:')),
               flag=wx.ALIGN_CENTER_VERTICAL)
        self.autoDetectButton = wx.Button(self, wx.ID_ANY, 'Auto Detect')
        self.autoDetectButton.Bind(wx.EVT_BUTTON, self.doAutoDetect)
        hs.Add(self.autoDetectButton,
               flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
               border=6)

        self.advancedButton = wx.Button(self, wx.ID_ANY, 'Advanced...')
        self.advancedButton.Bind(wx.EVT_BUTTON, self.doAdvanced)
        hs.Add(self.advancedButton, flag=wx.LEFT, border=6)

        gbs.Add(hs, pos=(iRow, 0), span=(1, 2), flag=wx.ALIGN_LEFT)
        iRow += 1

        gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Antennas:'),
                pos=(iRow, 0),
                span=(1, 1),
                flag=wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)

        gs = wx.GridSizer(rows=0, cols=4, hgap=2, vgap=2)
        self.antennas = []
        for i in xrange(4):
            gs.Add(wx.StaticText(self, wx.ID_ANY, '{}'.format(i)),
                   flag=wx.ALIGN_CENTER)
        for i in xrange(4):
            cb = wx.CheckBox(self, wx.ID_ANY, '')
            if i < 2:
                cb.SetValue(True)
            cb.Bind(wx.EVT_CHECKBOX, lambda x: self.getAntennaStr())
            gs.Add(cb, flag=wx.ALIGN_CENTER)
            self.antennas.append(cb)

        gbs.Add(gs, pos=(iRow, 1), span=(1, 1), flag=wx.ALIGN_CENTER_VERTICAL)

        iRow += 1

        gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Notify Address:'),
                pos=(iRow, 0),
                span=(1, 1),
                flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)

        hb = wx.BoxSizer(wx.HORIZONTAL)
        ips = Utils.GetAllIps()
        self.notifyHost = wx.Choice(self, wx.ID_ANY, choices=ips)
        hb.Add(self.notifyHost)
        hb.Add(wx.StaticText(self, wx.ID_ANY, ' : {}'.format(NotifyPort)),
               flag=wx.ALIGN_CENTER_VERTICAL)
        gbs.Add(hb, pos=(iRow, 1), span=(1, 1))

        iRow += 1
        self.listenForHeartbeat = wx.CheckBox(
            self,
            wx.ID_ANY,
            'Listen for Alien Heartbeat on Port: {}'.format(HeartbeatPort),
            style=wx.ALIGN_LEFT)
        self.listenForHeartbeat.SetValue(True)
        gbs.Add(self.listenForHeartbeat, pos=(iRow, 0), span=(1, 2))

        iRow += 1
        gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Alien Cmd Address:'),
                pos=(iRow, 0),
                span=(1, 1),
                flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        hb = wx.BoxSizer(wx.HORIZONTAL)
        self.cmdHost = masked.IpAddrCtrl(self,
                                         wx.ID_ANY,
                                         style=wx.TE_PROCESS_TAB)
        hb.Add(self.cmdHost)
        hb.Add(wx.StaticText(self, wx.ID_ANY, ' : '),
               flag=wx.ALIGN_CENTER_VERTICAL)
        self.cmdPort = intctrl.IntCtrl(self, size=(50, -1), min=0, max=999999)
        hb.Add(self.cmdPort, flag=wx.ALIGN_CENTER_VERTICAL)
        gbs.Add(hb, pos=(iRow, 1), span=(1, 1), flag=wx.ALIGN_LEFT)

        iRow += 1
        gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Backup File:'),
                pos=(iRow, 0),
                span=(1, 1),
                flag=wx.ALIGN_RIGHT)
        self.backupFile = wx.StaticText(self, wx.ID_ANY, '')
        gbs.Add(self.backupFile,
                pos=(iRow, 1),
                span=(1, 1),
                flag=wx.ALIGN_LEFT)

        #------------------------------------------------------------------------------------------------
        # CrossMgr configuration.
        #
        gbs = wx.GridBagSizer(4, 4)
        fgs.Add(gbs, flag=wx.EXPAND | wx.ALL, border=4)

        gbs.Add(setFont(
            bigFont, wx.StaticText(self, wx.ID_ANY,
                                   'CrossMgr Configuration:')),
                pos=(0, 0),
                span=(1, 2),
                flag=wx.ALIGN_LEFT)
        gbs.Add(wx.StaticText(self, wx.ID_ANY, 'CrossMgr Address:'),
                pos=(1, 0),
                span=(1, 1),
                flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)

        hb = wx.BoxSizer(wx.HORIZONTAL)
        self.crossMgrHost = masked.IpAddrCtrl(self,
                                              wx.ID_ANY,
                                              style=wx.TE_PROCESS_TAB)
        hb.Add(self.crossMgrHost, flag=wx.ALIGN_LEFT)
        hb.Add(wx.StaticText(self, wx.ID_ANY, ' : 53135'),
               flag=wx.ALIGN_CENTER_VERTICAL)
        gbs.Add(hb, pos=(1, 1), span=(1, 1), flag=wx.ALIGN_LEFT)

        #------------------------------------------------------------------------------------------------
        # Add messages
        #
        self.alienMessagesText = wx.TextCtrl(self,
                                             wx.ID_ANY,
                                             style=wx.TE_READONLY
                                             | wx.TE_MULTILINE | wx.HSCROLL,
                                             size=(-1, 400))
        fgs.Add(self.alienMessagesText, flag=wx.EXPAND, proportion=2)
        self.alienMessages = MessageManager(self.alienMessagesText)

        self.crossMgrMessagesText = wx.TextCtrl(self,
                                                wx.ID_ANY,
                                                style=wx.TE_READONLY
                                                | wx.TE_MULTILINE | wx.HSCROLL,
                                                size=(-1, 400))
        fgs.Add(self.crossMgrMessagesText, flag=wx.EXPAND, proportion=2)
        self.crossMgrMessages = MessageManager(self.crossMgrMessagesText)
        self.fgs = fgs

        #------------------------------------------------------------------------------------------------
        # Create a timer to update the messages.
        #
        self.timer = wx.Timer()
        self.timer.Bind(wx.EVT_TIMER, self.updateMessages)
        self.timer.Start(1000, False)

        self.Bind(wx.EVT_CLOSE, self.onCloseWindow)

        self.readOptions()

        self.SetSizer(self.vbs)
        self.start()