class ConsoleController(object):
    def __init__(self, cfg):
        #Service that handles HTTP requests
        dl = DataListener()
    
        #Start the HTTP server
        cp_cfg = cfg.get('cherrypy',{})
        cp_cfg['log.screen'] = cp_cfg.get('log.screen', False)
        self.ls = ListeningService(cp_cfg, dl)
        self.ls.server_started.connect(self.on_server_started)
        self.ls.server_stopped.connect(self.on_server_stopped)
        self.ls.start()
        
        self.cfg = cfg
        self.session_manager = SessionManager(cfg, dl)
        self.session_manager.session_new.connect(self.on_session_new)
        self.session_manager.switch_new_session()
        
        self.command_console = CommandConsole()
        self.command_console.quit_command.connect(self.on_quit_command)
        self.command_console.save_command.connect(self.on_save_command)
    
    def cmdloop(self):
        self.command_console.cmdloop()
    
    def on_server_started(self, **kwargs):
        print "HTTP Server Started"
    
    def on_server_stopped(self, **kwargs):
        print "HTTP Server Stopped"    
    
    def on_quit_command(self, **kwargs):
        self.ls.exit()
    
    def on_save_command(self, output_dir, **kwargs):
        self.session_manager.save(output_dir)
        
    def start_server(self):
        self.ls.start()
        
    def on_session_new(self, session_id, session_monitors, **kwargs):
        #for monitor_name, action_cfg in self.cfg.iteritems():
        for monitor_name, monitor in session_monitors.iteritems():
            monitor_cfg = self.cfg['elements'][monitor_name]
            panel_factory = FigureMemoryPanelFactory()
            p = panel_factory.build(monitor.get_figure(), monitor_cfg)
            #we throw away p?
 def __init__(self, cfg):
     #Service that handles HTTP requests
     dl = DataListener()
 
     #Start the HTTP server
     cp_cfg = cfg.get('cherrypy',{})
     cp_cfg['log.screen'] = cp_cfg.get('log.screen', False)
     self.ls = ListeningService(cp_cfg, dl)
     self.ls.server_started.connect(self.on_server_started)
     self.ls.server_stopped.connect(self.on_server_stopped)
     self.ls.start()
     
     self.cfg = cfg
     self.session_manager = SessionManager(cfg, dl)
     self.session_manager.session_new.connect(self.on_session_new)
     self.session_manager.switch_new_session()
     
     self.command_console = CommandConsole()
     self.command_console.quit_command.connect(self.on_quit_command)
     self.command_console.save_command.connect(self.on_save_command)
    def __init__(self, app, cfg):
        self.frame = MainFrame(app)
        self.cfg = cfg
        self.session_id2page = {}
        self.page2session_id = {}
        
        #Event Bindings
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_save_session, 
                  id=self.frame.save_session_btn.GetId())
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_new_session, 
                  id=self.frame.new_session_btn.GetId()) 
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_switch_session, 
                  id=self.frame.switch_session_btn.GetId()) 
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_clone_session,
                  id=self.frame.clone_session_btn.GetId())
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_clear_session, 
                  id=self.frame.clear_session_btn.GetId()) 
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_start_server, 
                  id=self.frame.start_server_btn.GetId())
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_stop_server, 
                  id=self.frame.stop_server_btn.GetId())
        
        self.frame.Bind(wx.EVT_CLOSE, self.on_quit)
        
        #Service that handles HTTP requests
        dl = DataListener()
    
        self.session_manager = SessionManager(cfg, dl)
        self.session_manager.session_new.connect(self.on_session_new)
        self.session_manager.session_switch.connect(self.on_session_switch)
        self.session_manager.switch_new_session()
        
        #Start the HTTP server
        self.ls = ListeningService(cfg.get('cherrypy',{}), dl)
        self.ls.server_started.connect(self.on_server_started)
        self.ls.server_stopped.connect(self.on_server_stopped)
        self.ls.start()
        

        self.frame.Show()
        self.frame.Maximize()
class GUIController(object):
    def __init__(self, app, cfg):
        self.frame = MainFrame(app)
        self.cfg = cfg
        self.session_id2page = {}
        self.page2session_id = {}
        
        #Event Bindings
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_save_session, 
                  id=self.frame.save_session_btn.GetId())
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_new_session, 
                  id=self.frame.new_session_btn.GetId()) 
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_switch_session, 
                  id=self.frame.switch_session_btn.GetId()) 
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_clone_session,
                  id=self.frame.clone_session_btn.GetId())
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_clear_session, 
                  id=self.frame.clear_session_btn.GetId()) 
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_start_server, 
                  id=self.frame.start_server_btn.GetId())
        self.frame.Bind(wx.EVT_TOOL, self.on_btn_stop_server, 
                  id=self.frame.stop_server_btn.GetId())
        
        self.frame.Bind(wx.EVT_CLOSE, self.on_quit)
        
        #Service that handles HTTP requests
        dl = DataListener()
    
        self.session_manager = SessionManager(cfg, dl)
        self.session_manager.session_new.connect(self.on_session_new)
        self.session_manager.session_switch.connect(self.on_session_switch)
        self.session_manager.switch_new_session()
        
        #Start the HTTP server
        self.ls = ListeningService(cfg.get('cherrypy',{}), dl)
        self.ls.server_started.connect(self.on_server_started)
        self.ls.server_stopped.connect(self.on_server_stopped)
        self.ls.start()
        

        self.frame.Show()
        self.frame.Maximize()
        
    def on_quit(self, event):
        self.ls.stop()
        self.ls.exit()
        event.Skip()
        
    def on_server_started(self, **kwargs):
        self.frame.toolbar.EnableTool(self.frame.start_server_btn.GetId(), False)
        self.frame.toolbar.EnableTool(self.frame.stop_server_btn.GetId(), True)
    
    def on_server_stopped(self, **kwargs):
        self.frame.toolbar.EnableTool(self.frame.start_server_btn.GetId(), True)
        self.frame.toolbar.EnableTool(self.frame.stop_server_btn.GetId(), False)
        
    def on_btn_clear_session(self, event):
        self.session_manager.clear()
        event.Skip()    
        
    def on_btn_save_session(self, event):
        dir_dialog = wx.DirDialog(self.frame, "Select the output directory")
        if dir_dialog.ShowModal() == wx.ID_OK:
            self.save(dir_dialog.GetPath())
        event.Skip()
    
    def on_btn_new_session(self, event):
        self.session_manager.new_session()
        event.Skip()
        
    def on_btn_switch_session(self, event):
        page_id = self.frame.get_selection()
        session_id = self.page2session_id[page_id]
        self.session_manager.switch_session(session_id)
        event.Skip()
        
    def on_btn_clone_session(self, event):
        page_id = self.frame.get_selection()
        session_id = self.page2session_id[page_id]
        self.session_manager.clone_session(session_id)
        event.Skip()
            
    def on_btn_start_server(self, event):
        self.ls.start()
        event.Skip()
        
    def on_btn_stop_server(self, event):
        self.ls.stop()
        event.Skip()
        
    def save(self, outdir):
        self.session_manager.save(outdir)
    
    def on_session_switch(self, session_id, **kwargs):
        page_id = self.session_id2page[session_id]
        self.frame.select_active_session(page_id)
    
        
    def on_session_new(self, session_id, session_monitors, **kwargs):
        session_panel, page_id = self.frame.new_session_panel(session_id)
        self.session_id2page[session_id] = page_id
        self.page2session_id[page_id] = session_id
        for tab_name, tab_monitors in sorted(session_monitors.iteritems()):
            tab_panel = session_panel.new_tab(tab_name)
            for monitor_name, monitor in sorted(tab_monitors.iteritems()):
                try:
                    monitor_cfg = self.cfg['elements']['tabs'][tab_name][monitor_name]
                except KeyError:
                    monitor_cfg = self.cfg['elements'][monitor_name]
                monitor_figure = monitor.get_figure()
                tab_panel.add_monitor(monitor_cfg, 
                                   monitor_figure, monitor_name)