Пример #1
0
    def __init__(self, parent, frame, log):
        wxPanel.__init__(self, parent, -1)
        self.society = None
        self.hierarchy = None
        self.URL = None
        self.log = log
        self.frame = frame
        self.printData = wxPrintData()
        self.printData.SetPaperId(wxPAPER_LETTER)
        self.heatRange  = {50:"PURPLE", 100:"BLUE", 125:"SEA GREEN", 150:"ORANGE", 1000:"RED" }
#--------
        self.box = wxBoxSizer(wxVERTICAL)
        self.canvas = AgentCanvas(self, frame, log)
        self.box.Add(self.canvas, 1, wxGROW)
        subbox = wxBoxSizer(wxHORIZONTAL)


        # ------
        self.viewSocietyButton = wxButton(self, 11, "View Agents")
        EVT_BUTTON(self, 11, self.OnViewSociety)
        self.viewSocietyButton.SetBackgroundColour("BLUE")
        self.viewSocietyButton.SetForegroundColour("YELLOW")
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.viewSocietyButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)


        # ------

        EVT_AGENT_TASK_COUNT(self, self.AgentTaskCountUpdate)

        # ------
        # ------
        self.ZoomPlusButton = wxButton(self, 12, "+")
        EVT_BUTTON(self, 12, self.OnZoomPlus)
        self.ZoomPlusButton.SetBackgroundColour(wxGREEN)
        self.ZoomPlusButton.SetForegroundColour(wxWHITE)

        subbox.Add(self.ZoomPlusButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

       # ------
        self.ZoomMinusButton = wxButton(self, 13, "-")
        EVT_BUTTON(self, 13, self.OnZoomMinus)
        self.ZoomMinusButton.SetBackgroundColour(wxRED)
        self.ZoomMinusButton.SetForegroundColour(wxWHITE)
        subbox.Add(self.ZoomMinusButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)
       # ------
        #~ self.viewServletButton = wxButton(self, 15, "Servlet Options")
        #~ EVT_BUTTON(self, 15, self.viewServletOptions)
        #~ self.viewServletButton.SetBackgroundColour(wxBLACK)
        #~ self.viewServletButton.SetForegroundColour(wxWHITE)
        #~ self.viewSocietyButton.SetDefault()
        #~ subbox.Add(self.viewServletButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

        # ------
        self.testServletButton = wxButton(self, 16, "Agent Probes")
        EVT_BUTTON(self, 16, self.AgentTaskCountUpdate)
        self.testServletButton.SetBackgroundColour(wxCYAN)
        self.testServletButton.SetForegroundColour(wxBLACK)
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.testServletButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

        #~ EVT_SOCIETYCONTROLLER_TEST(self, self.EventUpdate)
        self.box.Add(subbox, 0, wxGROW)

        self.SetAutoLayout(True)
        self.SetSizer(self.box)
        self.bg_bmp = images.getGridBGBitmap()
        EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
Пример #2
0
    def __init__(self, parent, frame, log):
        wx.Panel.__init__(self, parent, -1)
        self.society = None
        self.hierarchy = None
        self.URL = None
        self.log = log
        self.frame = frame
        self.printData = wx.PrintData()
        self.printData.SetPaperId(wx.PAPER_LETTER)
        self.heatRange  = {50:"PURPLE", 100:"BLUE", 125:"SEA GREEN", 150:"ORANGE", 1000:"RED" }
        self.societyRunning = False
#--------
        self.box = wx.BoxSizer(wx.VERTICAL)
        self.canvas = AgentCanvas(self, frame, log)
        self.box.Add(self.canvas, 1, wx.GROW)
        subbox = wx.BoxSizer(wx.HORIZONTAL)

# ------
        self.ctrlSocietyButtonID =  GLOBAL_WIDGET_ID_BASE+1
        self.ctrlSocietyButton = wx.Button(self, self.ctrlSocietyButtonID , "Start")

        wx.EVT_BUTTON(self, self.ctrlSocietyButtonID, self.OnStartSociety)
        self.ctrlSocietyButton.SetBackgroundColour("BLACK")
        self.ctrlSocietyButton.SetForegroundColour("WHITE")
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.ctrlSocietyButton , flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)
        # ------
        self.viewSocietyButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+2, "View Agents")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+2, self.OnViewSociety)
        self.viewSocietyButton.SetBackgroundColour("BLUE")
        self.viewSocietyButton.SetForegroundColour("YELLOW")
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.viewSocietyButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)
        # ------
        self.Bind(EVT_AGENT_TASK_COUNT, self.AgentTaskCountUpdate)
        # ------
        self.ZoomPlusButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+3, "+")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+3, self.OnZoomPlus)
        self.ZoomPlusButton.SetBackgroundColour(wx.GREEN)
        self.ZoomPlusButton.SetForegroundColour(wx.WHITE)

        subbox.Add(self.ZoomPlusButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)

       # ------
        self.ZoomMinusButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+4, "-")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+4, self.OnZoomMinus)
        self.ZoomMinusButton.SetBackgroundColour(wx.RED)
        self.ZoomMinusButton.SetForegroundColour(wx.WHITE)
        subbox.Add(self.ZoomMinusButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)
       # ------
        #~ self.viewServletButton = wxButton(self, 15, "Servlet Options")
        #~ wx.EVT_BUTTON(self, 15, self.viewServletOptions)
        #~ self.viewServletButton.SetBackgroundColour(wxBLACK)
        #~ self.viewServletButton.SetForegroundColour(wxWHITE)
        #~ self.viewSocietyButton.SetDefault()
        #~ subbox.Add(self.viewServletButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

        # ------
        self.testServletButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+5, "Agent Probes")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+5, self.AgentTaskCountUpdate)
        self.currTaskCount = None
        self.oldTaskCount = None
        self.testServletButton.SetBackgroundColour(wx.CYAN)
        self.testServletButton.SetForegroundColour(wx.BLACK)
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.testServletButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)

        #~ wx.EVT_SOCIETYCONTROLLER_TEST(self, self.EventUpdate)
        self.box.Add(subbox, 0, wx.GROW)

        self.SetAutoLayout(True)
        self.SetSizer(self.box)
        self.bg_bmp = images.getGridBGBitmap()
        wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
        wx.EVT_WINDOW_DESTROY(self, self.OnDestroy)
        ogl.OGLInitialize()
Пример #3
0
class AgentViewer(wxPanel):
    def __init__(self, parent, frame, log):
        wxPanel.__init__(self, parent, -1)
        self.society = None
        self.hierarchy = None
        self.URL = None
        self.log = log
        self.frame = frame
        self.printData = wxPrintData()
        self.printData.SetPaperId(wxPAPER_LETTER)
        self.heatRange  = {50:"PURPLE", 100:"BLUE", 125:"SEA GREEN", 150:"ORANGE", 1000:"RED" }
#--------
        self.box = wxBoxSizer(wxVERTICAL)
        self.canvas = AgentCanvas(self, frame, log)
        self.box.Add(self.canvas, 1, wxGROW)
        subbox = wxBoxSizer(wxHORIZONTAL)


        # ------
        self.viewSocietyButton = wxButton(self, 11, "View Agents")
        EVT_BUTTON(self, 11, self.OnViewSociety)
        self.viewSocietyButton.SetBackgroundColour("BLUE")
        self.viewSocietyButton.SetForegroundColour("YELLOW")
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.viewSocietyButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)


        # ------

        EVT_AGENT_TASK_COUNT(self, self.AgentTaskCountUpdate)

        # ------
        # ------
        self.ZoomPlusButton = wxButton(self, 12, "+")
        EVT_BUTTON(self, 12, self.OnZoomPlus)
        self.ZoomPlusButton.SetBackgroundColour(wxGREEN)
        self.ZoomPlusButton.SetForegroundColour(wxWHITE)

        subbox.Add(self.ZoomPlusButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

       # ------
        self.ZoomMinusButton = wxButton(self, 13, "-")
        EVT_BUTTON(self, 13, self.OnZoomMinus)
        self.ZoomMinusButton.SetBackgroundColour(wxRED)
        self.ZoomMinusButton.SetForegroundColour(wxWHITE)
        subbox.Add(self.ZoomMinusButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)
       # ------
        #~ self.viewServletButton = wxButton(self, 15, "Servlet Options")
        #~ EVT_BUTTON(self, 15, self.viewServletOptions)
        #~ self.viewServletButton.SetBackgroundColour(wxBLACK)
        #~ self.viewServletButton.SetForegroundColour(wxWHITE)
        #~ self.viewSocietyButton.SetDefault()
        #~ subbox.Add(self.viewServletButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

        # ------
        self.testServletButton = wxButton(self, 16, "Agent Probes")
        EVT_BUTTON(self, 16, self.AgentTaskCountUpdate)
        self.testServletButton.SetBackgroundColour(wxCYAN)
        self.testServletButton.SetForegroundColour(wxBLACK)
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.testServletButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

        #~ EVT_SOCIETYCONTROLLER_TEST(self, self.EventUpdate)
        self.box.Add(subbox, 0, wxGROW)

        self.SetAutoLayout(True)
        self.SetSizer(self.box)
        self.bg_bmp = images.getGridBGBitmap()
        EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)


    def OnEraseBackground(self, evt):
        pass

    def AgentTaskCountUpdate(self, evt):
            print >> sys.stdout, "AgentTaskCountUpdate"
            if self.societyReader is not None:
                print >> sys.stdout, "..."
                uniqueObjects = self.societyReader.readUniqueObjects(self.HOST, self.PORT)
                info = InformationPanel (140, 300, self.canvas, information=uniqueObjects)
                self.canvas.addShape(info,     100, 100, wxBLACK_PEN, wxBrush("LIGHT STEEL BLUE", wxSOLID), '   unique Objects', "Yellow"  )
                dc = wxClientDC(self.canvas)
                self.canvas.PrepareDC(dc)
                self.canvas.Redraw(dc)

    def OnZoomPlus(self, evt):
        if self.canvas.getSocietyStatus() == "active":
            print "OnZoomPlus"
            currentLevel = z.getLevel() + 1
            z.setLevel(currentLevel)
            self.canvas.OrganizeAgents(boxWidth=z.viewLevelData[currentLevel]["BOXWIDTH"],
            boxHeight=z.viewLevelData[currentLevel]["BOXHEIGHT"],
            widthspacing=z.viewLevelData[currentLevel]["WIDTHSPACING"],
            heightspacing= z.viewLevelData[currentLevel]["HEIGHTSPACING"],
            fontSize=z.viewLevelData[currentLevel]["FONTSIZE"])
        else:
            self.ErrorWindow()

    def OnZoomMinus(self, evt):
        if self.canvas.getSocietyStatus() == "active":
            print "OnZoomMinus"
            currentLevel = z.getLevel() - 1
            z.setLevel(currentLevel)
            self.canvas.OrganizeAgents(boxWidth=z.viewLevelData[currentLevel]["BOXWIDTH"],
            boxHeight=z.viewLevelData[currentLevel]["BOXHEIGHT"],
            widthspacing=z.viewLevelData[currentLevel]["WIDTHSPACING"],
            heightspacing= z.viewLevelData[currentLevel]["HEIGHTSPACING"],
            fontSize=z.viewLevelData[currentLevel]["FONTSIZE"])
        else:
            self.ErrorWindow()

    def OnViewSociety(self, evt):
        agentList = []
        self.URL = None
        self.HOST = None
        self.PORT = None
        win = ProbeDlg(self,wxNewId(), self.log, "Society Ping", size=wxSize(400, 300),style = wxDEFAULT_DIALOG_STYLE)
        win.CenterOnScreen()
        val = win.ShowModal()
        if val == wxID_OK:
            self.log.WriteText("URLDlg OK\n")
            self.log.WriteText(self.URL)
            print "read...", self.URL, "host==", self.HOST,"port==", self.PORT
            societyreader = SocietyReader(self.URL)
            self.societyReader = societyreader
            print "societyreader:", societyreader
            agentList = societyreader.readAgents()
            self.log.WriteText(str(agentList))
            self.canvas.CreateSociety(agentList)
            self.canvas.OrganizeAgents()

        else:
            self.log.WriteText("URLDlg Cancel\n")
        print "Society Viewed"

    #~ def viewSociety(self, generator_file):
        """
        TODO
        """

        #~ print "creating society from  %s" % generator_file ### DEBUG -- remove this!
        #~ return ULHierarchy(uri='file:'+str(generator_file))

    def loadFromURL(self, aURL):
        file = urllib.urlopen(aURL)
        #~ self.log.WriteText(aURL+"\n\n")
        #~ for line in self.file.readlines():
            #~ self.log.WriteText(line)
        society =  SocietyFactory(uri='hierarchy.xml').parse()
        if society is not None:
            #~ print society
            self.hierarchy = MilitaryHierarchy(society)
            self.canvas.CreateSocieties(self.hierarchy)
            self.canvas.OrganizeAgents()



    def OnEraseBackground(self, evt):
        dc = evt.GetDC()
        if not dc:
          dc = wxClientDC(self.GetClientWindow())

        # tile the background bitmap
        sz = self.GetClientSize()
        w = self.bg_bmp.GetWidth()
        h = self.bg_bmp.GetHeight()
        x = 0
        while x < sz.width:
            y = 0
            while y < sz.height:
                dc.DrawBitmap(self.bg_bmp, x, y)
                y = y + h
            x = x + w

    #~ def viewSociety(self, generator_file):
        #~ return ULHierarchy(uri='file:'+str(generator_file))

    def loadSociety(self, generator_file):
        """
        This wants to be nicely integrated with the GUI, such that
        When you select the file, an animation starts (similar to a busy watch cursor) and when the society is
        complete, an wxEvent is sent to the GUI. see exmaples in other parts of the application.
        use SocietyFactoryServer instead of SocietyFactory
        """
        m = re.compile('\.', re.IGNORECASE).split(str(generator_file))
        baseName = str(m[0])
        #~ print "creating society from  %s" % baseName ### DEBUG -- remove this!
        self.log.WriteText("file:" + generator_file)
        return SocietyFactory("file:" + generator_file).parse()
#----------------------------------------------------------------------

    def OnCloseSociety(self,evt):
        if self.canvas.getSocietyStatus() == "active":
            self.canvas.MySocietyInit()
            print "Society Closed"
        else:
            self.ErrorWindow()
        #~ pass


    def viewServletOptions(self, evt):
        if self.canvas.getSocietyStatus() == "active":
            win = ServletProperties(self.canvas, -1, "Servlet Properties", size=wxSize(300, 400),style = wxDEFAULT_DIALOG_STYLE)
            win.CenterOnScreen()
            val = win.ShowModal()
        else:
            self.ErrorWindow()
        #~ pass
    def testServletPolling(self, evt):
        s = ServletDataReceiver("localhost", 8888)
        thread_id = thread.start_new_thread( s.serve, ())
        self.ServletPoller()
    def ServletPoller(self):
        agentMap = dict.fromkeys(self.hierarchy.getAgents(), -1)
        aPeer = xmlrpclib.Server('http://localhost:8888')
        data = aPeer.initServerMethods(agentMap)
        limit = 0
        for agent in agentMap.iterkeys():
                limit += 1
                if limit > 500: break
                tasks = aPeer.getGeneratedData(agent)
                print "iteration:", limit, agent,  tasks
                evt = AgentTaskCountEvent((agent, tasks))
                wxPostEvent(self, evt)


    def _ServletPoller(self):
            pass
    #~ def PlayRedraw(self, name):
        #~ shape = self.canvas.shapeDict[name]
        #~ shape.SetBrush(wxBrush(COLOURDB[r.randint(0, len(COLOURDB)) % len(COLOURDB )], wxCROSSDIAG_HATCH))
        #~ dc = wxClientDC(self.canvas)
        #~ self.canvas.PrepareDC(dc)
        #~ self.canvas.Redraw(dc)

    def ErrorWindow(self):
        #~ def __init__(self, parent, ID, title, pos=wxDefaultPosition, size=wxDefaultSize, style=wxDEFAULT_DIALOG_STYLE):
        win = ServerNotRunning(self.canvas, -1, "Server Inactive", pos=wxDefaultPosition, size=wxSize(500, 100), style = wxDEFAULT_DIALOG_STYLE)
                         #style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME
        win.CenterOnScreen()
        val = win.ShowModal()
Пример #4
0
class AgentControllerViewer(wx.Panel):
    def __init__(self, parent, frame, log):
        wx.Panel.__init__(self, parent, -1)
        self.society = None
        self.hierarchy = None
        self.URL = None
        self.log = log
        self.frame = frame
        self.printData = wx.PrintData()
        self.printData.SetPaperId(wx.PAPER_LETTER)
        self.heatRange  = {50:"PURPLE", 100:"BLUE", 125:"SEA GREEN", 150:"ORANGE", 1000:"RED" }
        self.societyRunning = False
#--------
        self.box = wx.BoxSizer(wx.VERTICAL)
        self.canvas = AgentCanvas(self, frame, log)
        self.box.Add(self.canvas, 1, wx.GROW)
        subbox = wx.BoxSizer(wx.HORIZONTAL)

# ------
        self.ctrlSocietyButtonID =  GLOBAL_WIDGET_ID_BASE+1
        self.ctrlSocietyButton = wx.Button(self, self.ctrlSocietyButtonID , "Start")

        wx.EVT_BUTTON(self, self.ctrlSocietyButtonID, self.OnStartSociety)
        self.ctrlSocietyButton.SetBackgroundColour("BLACK")
        self.ctrlSocietyButton.SetForegroundColour("WHITE")
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.ctrlSocietyButton , flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)
        # ------
        self.viewSocietyButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+2, "View Agents")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+2, self.OnViewSociety)
        self.viewSocietyButton.SetBackgroundColour("BLUE")
        self.viewSocietyButton.SetForegroundColour("YELLOW")
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.viewSocietyButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)
        # ------
        self.Bind(EVT_AGENT_TASK_COUNT, self.AgentTaskCountUpdate)
        # ------
        self.ZoomPlusButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+3, "+")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+3, self.OnZoomPlus)
        self.ZoomPlusButton.SetBackgroundColour(wx.GREEN)
        self.ZoomPlusButton.SetForegroundColour(wx.WHITE)

        subbox.Add(self.ZoomPlusButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)

       # ------
        self.ZoomMinusButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+4, "-")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+4, self.OnZoomMinus)
        self.ZoomMinusButton.SetBackgroundColour(wx.RED)
        self.ZoomMinusButton.SetForegroundColour(wx.WHITE)
        subbox.Add(self.ZoomMinusButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)
       # ------
        #~ self.viewServletButton = wxButton(self, 15, "Servlet Options")
        #~ wx.EVT_BUTTON(self, 15, self.viewServletOptions)
        #~ self.viewServletButton.SetBackgroundColour(wxBLACK)
        #~ self.viewServletButton.SetForegroundColour(wxWHITE)
        #~ self.viewSocietyButton.SetDefault()
        #~ subbox.Add(self.viewServletButton, flag=wxALIGN_CENTER_VERTICAL | wxBOTTOM, border=20)

        # ------
        self.testServletButton = wx.Button(self, GLOBAL_WIDGET_ID_BASE+5, "Agent Probes")
        wx.EVT_BUTTON(self, GLOBAL_WIDGET_ID_BASE+5, self.AgentTaskCountUpdate)
        self.currTaskCount = None
        self.oldTaskCount = None
        self.testServletButton.SetBackgroundColour(wx.CYAN)
        self.testServletButton.SetForegroundColour(wx.BLACK)
        #~ self.viewSocietyButton.SetDefault()
        subbox.Add(self.testServletButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border=20)

        #~ wx.EVT_SOCIETYCONTROLLER_TEST(self, self.EventUpdate)
        self.box.Add(subbox, 0, wx.GROW)

        self.SetAutoLayout(True)
        self.SetSizer(self.box)
        self.bg_bmp = images.getGridBGBitmap()
        wx.EVT_ERASE_BACKGROUND(self, self.OnEraseBackground)
        wx.EVT_WINDOW_DESTROY(self, self.OnDestroy)
        ogl.OGLInitialize()

    def OnEraseBackground(self, evt):
        pass

    def AgentTaskCountUpdate(self, evt):
#            print >> sys.stdout, "AgentTaskCountUpdate"
            if self.societyReader is not None:
                self.oldTaskCount = self.currTaskCount
                self.currTaskCount = self.societyReader.readUniqueObjects(self.HOST, self.PORT)
                for o in self.currTaskCount.keys():
                    heat = 0
                    if self.oldTaskCount is None:
                      heat = self.currTaskCount[o]
                    elif self.oldTaskCount.get(o) is None:
                      heat = self.currTaskCount[o]
                    else:
                      heat = int(self.currTaskCount[o]) - int(self.oldTaskCount[o])
                    self.computeHeat(o, heat)
                #~ info = InformationPanel (140, 300, self.canvas, information=uniqueObjects)
                #~ self.canvas.addShape(info,     100, 100, wxBLACK_PEN, wxBrush("LIGHT STEEL BLUE", wxSOLID), '   unique Objects', "Yellow"  )
                #~ dc = wxClientDC(self.canvas)
                #~ self.canvas.PrepareDC(dc)
                #~ self.canvas.Redraw(dc)
            else: print >> sys.stdout, "WTF???"

    def OnZoomPlus(self, evt):
        if self.canvas.getSocietyStatus() == "active":
            z.setLevel(z.getLevel()   + 1)
            currentLevel = z.getLevel()
            self.canvas.OrganizeAgents(boxWidth=z.viewLevelData[currentLevel]["BOXWIDTH"],
            boxHeight=z.viewLevelData[currentLevel]["BOXHEIGHT"],
            pixelLevel=z.viewLevelData[currentLevel]["PIXELLEVEL"],
            fontSize=z.viewLevelData[currentLevel]["FONTSIZE"],
            theradius=z.viewLevelData[currentLevel]["RADIUS"])
        else:
            self.ErrorWindow()

    def OnZoomMinus(self, evt):
        if self.canvas.getSocietyStatus() == "active":
            z.setLevel(z.getLevel()-1)
            currentLevel = z.getLevel()
            self.canvas.OrganizeAgents(boxWidth=z.viewLevelData[currentLevel]["BOXWIDTH"],
            boxHeight=z.viewLevelData[currentLevel]["BOXHEIGHT"],
            pixelLevel=z.viewLevelData[currentLevel]["PIXELLEVEL"],
            fontSize=z.viewLevelData[currentLevel]["FONTSIZE"],
            theradius=z.viewLevelData[currentLevel]["RADIUS"])
        else:
            self.ErrorWindow()

    def OnStartSociety(self, evt):
        """
        We are limited to localhost currently!!!
        """
        self.NODE = None
        self.logfile = None
        win = CtrlDlg(self,wx.NewId(), self.log, "Start a Society", size=wx.Size(400, 300),style = wx.DEFAULT_DIALOG_STYLE)
        win.CenterOnScreen()
        val = win.ShowModal()
        if val != wx.ID_OK:
            return
        print "OK::", self.NODE
        rtn = self.startNode()
        if (rtn):
            self.societyRunning = True
            self.ctrlSocietyButton.SetBackgroundColour("WHITE")
            self.ctrlSocietyButton.SetForegroundColour("BLACK")
            self.ctrlSocietyButton.SetLabel("Stop")
            self.canvas.setSocietyActive()
            wx.EVT_BUTTON(self, self.ctrlSocietyButtonID, self.OnStopSociety)

    def OnStopSociety(self, evt):
        #~ signal.signal(signal.SIGINT|signal.SIG_DFL, self.spawnPID)
        if sys.platform[:3] in ('win', 'os2'):
            print 'must use WMI, Win32.all extensions'
        self.ctrlSocietyButton.SetBackgroundColour("BLACK")
        self.ctrlSocietyButton.SetForegroundColour("WHITE")
        self.ctrlSocietyButton.SetLabel("Start")
        wx.EVT_BUTTON(self, self.ctrlSocietyButtonID , self.OnStartSociety)

    def OnViewSociety(self, evt):
        agentList = []
        self.URL = None
        self.HOST = None
        self.PORT = None
        win = ProbeDlg(self,wx.NewId(), self.log, "Society Ping", size=wx.Size(400, 300),style = wx.DEFAULT_DIALOG_STYLE)
        win.CenterOnScreen()
        val = win.ShowModal()
        if val == wx.ID_OK:
            self.log.WriteText("URLDlg OK\n")
            self.log.WriteText(self.URL)
            #~ print "read...", self.URL, "host==", self.HOST,"port==", self.PORT
            societyreader = SocietyReader(self.URL)
            self.societyReader = societyreader
            #~ print "societyreader:", societyreader
            agentList = societyreader.readAgents()
            if agentList is None:
                dlg = wx.MessageDialog(self.frame, "Society not up as yet. Try again in a few seconds",
                          'Non-fatal Error', wx.OK|wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
            else:
                self.log.WriteText(str(agentList))
                self.canvas.CreateSociety(agentList)
                self.canvas.OrganizeAgents()

        else:
            self.log.WriteText("URLDlg Cancel\n")
        #~ print "Society Viewed"

    #~ def viewSociety(self, generator_file):
        """
        TODO
        """

        #~ print "creating society from  %s" % generator_file ### DEBUG -- remove this!
        #~ return ULHierarchy(uri='file:'+str(generator_file))
    def startNode(self):
        try:
            cip = os.environ['COUGAAR_INSTALL_PATH']
            execstring = cip+os.sep+'bin'+os.sep+'cougaar'
            print "EXEC STRING:", execstring, self.NODE
            args = None
            if self.logfile is not None:
                args = (execstring, self.NODE, "> "+self.logfile)
            else:
                args = (execstring, self.NODE)
            self.spawnPID = os.spawnv(os.P_NOWAIT,execstring, args);
            #~ print 'spawned...',execstring , ' ID=', self.spawnPID
        except KeyError:
            dlg = wx.MessageDialog(self.frame, "set 'COUGAAR_INSTALL_PATH' as an environmental variable",
                          'Fatal Error', wx.OK|wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            return False
        return True


    def computeHeat(self, agent, value):
        print "computeHeat:", agent, 'value:',value
        shape = self.canvas.shapeDict[str(agent)]
        # turn on the right color
        #~ color = self.computeColor(value)
        shape.SetBrush(wx.Brush(self.computeColor(value), wx.SOLID))
        dc = wx.ClientDC(self.canvas)
        self.canvas.PrepareDC(dc)
        self.canvas.Redraw(dc)

    def computeColor(self, agentValue):
        red = green = blue = 0
        agentValue = int(agentValue)
        agentValue = agentValue * 2
        if agentValue <= 0:
          red = green = blue = 40
        elif 0 <agentValue < 256:
            red = 0; green = agentValue; blue = 255 - agentValue
        elif  256 <= agentValue < 512:
            red = agentValue - 256; green = 255; blue = 0
        elif 512 <= agentValue  < 767:
            red = 255; green = 766 - agentValue; blue = 0
        else:
            red = 255; green = 0; blue = 0
        return wx.Colour(red, green, blue)

    def loadFromURL(self, aURL):
        file = urllib.urlopen(aURL)
        #~ self.log.WriteText(aURL+"\n\n")
        #~ for line in self.file.readlines():
            #~ self.log.WriteText(line)
        society =  SocietyFactory(uri='hierarchy.xml').parse()
        if society is not None:
            #~ print society
            self.hierarchy = MilitaryHierarchy(society)
            self.canvas.CreateSocieties(self.hierarchy)
            self.canvas.OrganizeAgents()



    def OnEraseBackground(self, evt):
        dc = evt.GetDC()
        if not dc:
          dc = wx.ClientDC(self.GetClientWindow())

        # tile the background bitmap
        sz = self.GetClientSize()
        w = self.bg_bmp.GetWidth()
        h = self.bg_bmp.GetHeight()
        x = 0
        while x < sz.width:
            y = 0
            while y < sz.height:
                dc.DrawBitmap(self.bg_bmp, x, y)
                y = y + h
            x = x + w

    def OnDestroy(self, evt):
        # Do some cleanup
        print "agentController:OnDestroy - Check for running society and give option to terminate"
        if (self.societyRunning):
            dlg = wx.MessageDialog(self.frame, "A society is currently running.  Would you like AWB to stop it before you exit? " +
                                                                 "If you choose 'No' it will remain running in the background", 'Non-fatal Error', wx.YES_NO|wx.ICON_ERROR)
            val = dlg.ShowModal()
            if (val == wx.ID_YES):
                self.stopSociety()
            dlg.Destroy()
            
        
    def loadSociety(self, generator_file):
        """
        This wants to be nicely integrated with the GUI, such that
        When you select the file, an animation starts (similar to a busy watch cursor) and when the society is
        complete, an wxEvent is sent to the GUI. see exmaples in other parts of the application.
        use SocietyFactoryServer instead of SocietyFactory
        """
        m = re.compile('\.', re.IGNORECASE).split(str(generator_file))
        baseName = str(m[0])
        #~ print "creating society from  %s" % baseName ### DEBUG -- remove this!
        self.log.WriteText("file:" + generator_file)
        return SocietyFactory("file:" + generator_file).parse()
        
    def stopSociety(self):
        if (not self.societyRunning):
            return
        print "We still need code to stop a running society!"
        
#----------------------------------------------------------------------

    def OnCloseSociety(self,evt):
        if self.canvas.getSocietyStatus() == "active":
            self.canvas.MySocietyInit()
            print "Society Closed"
        else:
            self.ErrorWindow()
        #~ pass


    def viewServletOptions(self, evt):
        if self.canvas.getSocietyStatus() == "active":
            win = ServletProperties(self.canvas, -1, "Servlet Properties", size=wx.Size(300, 400),style = wx.DEFAULT_DIALOG_STYLE)
            win.CenterOnScreen()
            val = win.ShowModal()
        else:
            self.ErrorWindow()
        #~ pass
    def testServletPolling(self, evt):
        s = ServletDataReceiver("localhost", 8888)
        thread_id = thread.start_new_thread( s.serve, ())
        self.ServletPoller()
    def ServletPoller(self):
        agentMap = dict.fromkeys(self.hierarchy.getAgents(), -1)
        aPeer = xmlrpclib.Server('http://localhost:8888')
        data = aPeer.initServerMethods(agentMap)
        limit = 0
        for agent in agentMap.iterkeys():
                limit += 1
                if limit > 500: break
                tasks = aPeer.getGeneratedData(agent)
                #~ print "iteration:", limit, agent,  tasks
                evt = AgentTaskCountEvent((agent, tasks))
                wx.PostEvent(self, evt)


    def _ServletPoller(self):
            pass
    #~ def PlayRedraw(self, name):
        #~ shape = self.canvas.shapeDict[name]
        #~ shape.SetBrush(wxBrush(COLOURDB[r.randint(0, len(COLOURDB)) % len(COLOURDB )], wxCROSSDIAG_HATCH))
        #~ dc = wxClientDC(self.canvas)
        #~ self.canvas.PrepareDC(dc)
        #~ self.canvas.Redraw(dc)

    def ErrorWindow(self):
        #~ def __init__(self, parent, ID, title, pos=wxDefaultPosition, size=wxDefaultSize, style=wxDEFAULT_DIALOG_STYLE):
        win = ServerNotRunning(self.canvas, -1, "Server Inactive", pos=wx.DefaultPosition, size=wx.Size(500, 100), style = wx.DEFAULT_DIALOG_STYLE)
                         #style = wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME
        win.CenterOnScreen()
        val = win.ShowModal()