Beispiel #1
0
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        #Parse options and commandline arguments
        try:
            opts, args = getopt.getopt(sys.argv[1:], "hp:m:", ["help","port=","mininet="])
        except getopt.GetoptError:
            print "Option error!"
            self.usage()
            sys.exit(2)

        #Get options
        self.backend_port = 7790 #GuiMessenger port
        for opt,arg in opts:
            if (opt in ("-h","--help")):
                self.usage()
                sys.exit(0)
            elif (opt in ("-p","--port")):
                self.backend_port = int(arg)
            elif (opt in ("-m","--mininet")):
                self.mininet_address = arg
            else:
                print "Unhandled option :"+opt
                sys.exit(2)

        # Messenger socket:
        if len(args) >= 1:
            self.backend_ip = args[0]
        else:
            self.backend_ip = "127.0.0.1"

        # Global Settings
        self.settings = settings.Settings(self)

        # Configure layout
        self.setWindowTitle('POX Graphical User Interface')
        self.resize(1280, 800)
        self.statusBar().showMessage('Ready')
        self.center()

        self.communication = Communication(self)
        self.communication.start()
        
        self.logWidget = log.LogWidget(self)
        self.infoWidget = info.InfoWidget(self)
        self.topoWidget = topology.TopoWidget(self)
        self.consoleWidget = console.ConsoleWidget(self)
        
                
        # Initialize communication with backend messengers
        #self.topoWidget.topologyView.helloMessenger()
        self.logWidget.helloMessenger()

        self.leftvbox = QtGui.QVBoxLayout()
        self.vSplitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        self.vSplitter.addWidget(self.infoWidget)
        # Hide info pane initially, show when needed (e.q. switch query)
        self.infoWidget.hide()
        self.vSplitter.addWidget(self.logWidget)
        self.leftvbox.addWidget(self.vSplitter)
        self.left = QtGui.QWidget()
        self.left.setLayout(self.leftvbox)

        self.rightvbox = QtGui.QVBoxLayout()
        self.rightvbox.addWidget(self.topoWidget)
        self.rightvbox.addWidget(self.consoleWidget)
        self.right = QtGui.QWidget()
        self.right.setLayout(self.rightvbox)

        self.hSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.hSplitter.addWidget(self.left)
        self.hSplitter.addWidget(self.right)

        self.setCentralWidget(self.hSplitter)

        signal.signal(signal.SIGINT, self.sigint_handler)

        # Actions
        start = QtGui.QAction(QtGui.QIcon('gui/icons/logo.png'), 'Start', self)
        start.setShortcut('Ctrl+S')
        start.setStatusTip('Start POX')
        self.connect(start, QtCore.SIGNAL('triggered()'), self.start_nox)

        switch_to_log = QtGui.QAction(QtGui.QIcon('gui/icons/log.png'),'Log View',self)
        switch_to_log.setShortcut('Ctrl+1')
        switch_to_log.setStatusTip('Switch to system log view')
        self.connect(switch_to_log, QtCore.SIGNAL('triggered()'), self.show_log)

        switch_to_topo = QtGui.QAction(QtGui.QIcon('gui/icons/topo.png'),'Topology View',self)
        switch_to_topo.setShortcut('Ctrl+2')
        switch_to_topo.setStatusTip('Switch to topology view')
        self.connect(switch_to_topo, QtCore.SIGNAL('triggered()'), self.show_topo)

        switch_to_split = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),'Split View',self)
        switch_to_split.setShortcut('Ctrl+3')
        switch_to_split.setStatusTip('Switch to split view')
        self.connect(switch_to_split, QtCore.SIGNAL('triggered()'), self.show_split)

        toggle_console = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),'Show/Hide Console',self)
        toggle_console.setShortcut('Ctrl+4')
        toggle_console.setStatusTip('Show/Hide Console')
        self.connect(toggle_console, QtCore.SIGNAL('triggered()'), self.toggle_show_console)

        exit = QtGui.QAction(QtGui.QIcon('gui/icons/exit.png'), 'Exit', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        switch_to_dark = QtGui.QAction('Dark',self)
        switch_to_dark.setStatusTip('Switch to dark color theme')
        self.connect(switch_to_dark, QtCore.SIGNAL('triggered()'), self.dark)

        switch_to_bright = QtGui.QAction('Bright',self)
        switch_to_bright.setStatusTip('Switch to bright color theme')
        self.connect(switch_to_bright, QtCore.SIGNAL('triggered()'), self.bright)

        set_node_id_size_small = QtGui.QAction('Small',self)
        set_node_id_size_small.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_small, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_small)

        set_node_id_size_normal = QtGui.QAction('Normal',self)
        set_node_id_size_normal.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_normal, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_normal)

        set_node_id_size_large = QtGui.QAction('Large',self)
        set_node_id_size_large.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_large, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_large)

        self.statusBar()

        # Configure Menubar
        menubar = self.menuBar()
        file_menu = menubar.addMenu('&File')
        file_menu.addAction(start)
        file_menu.addAction(exit)
        view_menu = menubar.addMenu('&View')
        view_menu.addAction(switch_to_log)
        view_menu.addAction(switch_to_topo)
        view_menu.addAction(switch_to_split)
        view_menu.addAction(toggle_console)
        id_size_menu = view_menu.addMenu('ID size')
        id_size_menu.addAction(set_node_id_size_small)
        id_size_menu.addAction(set_node_id_size_normal)
        id_size_menu.addAction(set_node_id_size_large)
        components_menu = menubar.addMenu('&Components')
        components_menu.addAction('Installed Components')
        components_menu.addAction('Active Components')
        #'''
        theme_menu = menubar.addMenu('&Colors')
        theme_menu.addAction(switch_to_dark)
        theme_menu.addAction(switch_to_bright)
        #'''
        help_menu = menubar.addMenu('&Help')
        help_menu.addAction('Help')
        help_menu.addAction('About')

        # Configure Toolbar
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(start)
        toolbar.addAction(switch_to_log)
        toolbar.addAction(switch_to_topo)
        toolbar.addAction(switch_to_split)
        toolbar.addAction(exit)
        
        self.toggle_show_console()
Beispiel #2
0
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        #Parse options and commandline arguments
        try:
            opts, args = getopt.getopt(sys.argv[1:], "hp:m:",
                                       ["help", "port=", "mininet="])
        except getopt.GetoptError:
            print "Option error!"
            self.usage()
            sys.exit(2)

        #Get options
        self.backend_port = 7790  #GuiMessenger port
        for opt, arg in opts:
            if (opt in ("-h", "--help")):
                self.usage()
                sys.exit(0)
            elif (opt in ("-p", "--port")):
                self.backend_port = int(arg)
            elif (opt in ("-m", "--mininet")):
                self.mininet_address = arg
            else:
                print "Unhandled option :" + opt
                sys.exit(2)

        # Messenger socket:
        if len(args) >= 1:
            self.backend_ip = args[0]
        else:
            self.backend_ip = "127.0.0.1"

        # Global Settings
        self.settings = settings.Settings(self)

        # Configure layout
        self.setWindowTitle('POX Graphical User Interface')
        self.resize(1280, 800)
        self.statusBar().showMessage('Ready')
        self.center()

        self.communication = Communication(self)
        self.communication.start()

        self.logWidget = log.LogWidget(self)
        self.infoWidget = info.InfoWidget(self)
        self.topoWidget = topology.TopoWidget(self)
        self.consoleWidget = console.ConsoleWidget(self)

        # Initialize communication with backend messengers
        #self.topoWidget.topologyView.helloMessenger()
        self.logWidget.helloMessenger()

        self.leftvbox = QtGui.QVBoxLayout()
        self.vSplitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        self.vSplitter.addWidget(self.infoWidget)
        # Hide info pane initially, show when needed (e.q. switch query)
        self.infoWidget.hide()
        self.vSplitter.addWidget(self.logWidget)
        self.leftvbox.addWidget(self.vSplitter)
        self.left = QtGui.QWidget()
        self.left.setLayout(self.leftvbox)

        self.rightvbox = QtGui.QVBoxLayout()
        self.rightvbox.addWidget(self.topoWidget)
        self.rightvbox.addWidget(self.consoleWidget)
        self.right = QtGui.QWidget()
        self.right.setLayout(self.rightvbox)

        self.hSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.hSplitter.addWidget(self.left)
        self.hSplitter.addWidget(self.right)

        self.setCentralWidget(self.hSplitter)

        signal.signal(signal.SIGINT, self.sigint_handler)

        # Actions
        start = QtGui.QAction(QtGui.QIcon('gui/icons/logo.png'), 'Start', self)
        start.setShortcut('Ctrl+S')
        start.setStatusTip('Start POX')
        self.connect(start, QtCore.SIGNAL('triggered()'), self.start_nox)

        switch_to_log = QtGui.QAction(QtGui.QIcon('gui/icons/log.png'),
                                      'Log View', self)
        switch_to_log.setShortcut('Ctrl+1')
        switch_to_log.setStatusTip('Switch to system log view')
        self.connect(switch_to_log, QtCore.SIGNAL('triggered()'),
                     self.show_log)

        switch_to_topo = QtGui.QAction(QtGui.QIcon('gui/icons/topo.png'),
                                       'Topology View', self)
        switch_to_topo.setShortcut('Ctrl+2')
        switch_to_topo.setStatusTip('Switch to topology view')
        self.connect(switch_to_topo, QtCore.SIGNAL('triggered()'),
                     self.show_topo)

        switch_to_split = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),
                                        'Split View', self)
        switch_to_split.setShortcut('Ctrl+3')
        switch_to_split.setStatusTip('Switch to split view')
        self.connect(switch_to_split, QtCore.SIGNAL('triggered()'),
                     self.show_split)

        toggle_console = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),
                                       'Show/Hide Console', self)
        toggle_console.setShortcut('Ctrl+4')
        toggle_console.setStatusTip('Show/Hide Console')
        self.connect(toggle_console, QtCore.SIGNAL('triggered()'),
                     self.toggle_show_console)

        exit = QtGui.QAction(QtGui.QIcon('gui/icons/exit.png'), 'Exit', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit, QtCore.SIGNAL('triggered()'),
                     QtCore.SLOT('close()'))

        switch_to_dark = QtGui.QAction('Dark', self)
        switch_to_dark.setStatusTip('Switch to dark color theme')
        self.connect(switch_to_dark, QtCore.SIGNAL('triggered()'), self.dark)

        switch_to_bright = QtGui.QAction('Bright', self)
        switch_to_bright.setStatusTip('Switch to bright color theme')
        self.connect(switch_to_bright, QtCore.SIGNAL('triggered()'),
                     self.bright)

        set_node_id_size_small = QtGui.QAction('Small', self)
        set_node_id_size_small.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_small, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_small)

        set_node_id_size_normal = QtGui.QAction('Normal', self)
        set_node_id_size_normal.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_normal, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_normal)

        set_node_id_size_large = QtGui.QAction('Large', self)
        set_node_id_size_large.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_large, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_large)

        self.statusBar()

        # Configure Menubar
        menubar = self.menuBar()
        file_menu = menubar.addMenu('&File')
        file_menu.addAction(start)
        file_menu.addAction(exit)
        view_menu = menubar.addMenu('&View')
        view_menu.addAction(switch_to_log)
        view_menu.addAction(switch_to_topo)
        view_menu.addAction(switch_to_split)
        view_menu.addAction(toggle_console)
        id_size_menu = view_menu.addMenu('ID size')
        id_size_menu.addAction(set_node_id_size_small)
        id_size_menu.addAction(set_node_id_size_normal)
        id_size_menu.addAction(set_node_id_size_large)
        components_menu = menubar.addMenu('&Components')
        components_menu.addAction('Installed Components')
        components_menu.addAction('Active Components')
        #'''
        theme_menu = menubar.addMenu('&Colors')
        theme_menu.addAction(switch_to_dark)
        theme_menu.addAction(switch_to_bright)
        #'''
        help_menu = menubar.addMenu('&Help')
        help_menu.addAction('Help')
        help_menu.addAction('About')

        # Configure Toolbar
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(start)
        toolbar.addAction(switch_to_log)
        toolbar.addAction(switch_to_topo)
        toolbar.addAction(switch_to_split)
        toolbar.addAction(exit)

        self.toggle_show_console()
Beispiel #3
0
class MainWindow(QtGui.QMainWindow):

    def usage(self):
        """Print usage information
        """
        print "Usage: "+sys.argv[0]+" <options> [IP address | default to localhost]"
        print  "Options:"
        print "-h / --help \tPrint this usage guide"
        print "-p / --port \tPort to connect to"
        print "-m / --mininet \tMininet IP address"

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        #Parse options and commandline arguments
        try:
            opts, args = getopt.getopt(sys.argv[1:], "hp:m:", ["help","port=","mininet="])
        except getopt.GetoptError:
            print "Option error!"
            self.usage()
            sys.exit(2)

        #Get options
        self.backend_port = 7790 #GuiMessenger port
        for opt,arg in opts:
            if (opt in ("-h","--help")):
                self.usage()
                sys.exit(0)
            elif (opt in ("-p","--port")):
                self.backend_port = int(arg)
            elif (opt in ("-m","--mininet")):
                self.mininet_address = arg
            else:
                print "Unhandled option :"+opt
                sys.exit(2)

        # Messenger socket:
        if len(args) >= 1:
            self.backend_ip = args[0]
        else:
            self.backend_ip = "127.0.0.1"

        # Global Settings
        self.settings = settings.Settings(self)

        # Configure layout
        self.setWindowTitle('POX Graphical User Interface')
        self.resize(1280, 800)
        self.statusBar().showMessage('Ready')
        self.center()

        self.communication = Communication(self)
        self.communication.start()
        
        self.logWidget = log.LogWidget(self)
        self.infoWidget = info.InfoWidget(self)
        self.topoWidget = topology.TopoWidget(self)
        self.consoleWidget = console.ConsoleWidget(self)
        
                
        # Initialize communication with backend messengers
        #self.topoWidget.topologyView.helloMessenger()
        self.logWidget.helloMessenger()

        self.leftvbox = QtGui.QVBoxLayout()
        self.vSplitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        self.vSplitter.addWidget(self.infoWidget)
        # Hide info pane initially, show when needed (e.q. switch query)
        self.infoWidget.hide()
        self.vSplitter.addWidget(self.logWidget)
        self.leftvbox.addWidget(self.vSplitter)
        self.left = QtGui.QWidget()
        self.left.setLayout(self.leftvbox)

        self.rightvbox = QtGui.QVBoxLayout()
        self.rightvbox.addWidget(self.topoWidget)
        self.rightvbox.addWidget(self.consoleWidget)
        self.right = QtGui.QWidget()
        self.right.setLayout(self.rightvbox)

        self.hSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.hSplitter.addWidget(self.left)
        self.hSplitter.addWidget(self.right)

        self.setCentralWidget(self.hSplitter)

        signal.signal(signal.SIGINT, self.sigint_handler)

        # Actions
        start = QtGui.QAction(QtGui.QIcon('gui/icons/logo.png'), 'Start', self)
        start.setShortcut('Ctrl+S')
        start.setStatusTip('Start POX')
        self.connect(start, QtCore.SIGNAL('triggered()'), self.start_nox)

        switch_to_log = QtGui.QAction(QtGui.QIcon('gui/icons/log.png'),'Log View',self)
        switch_to_log.setShortcut('Ctrl+1')
        switch_to_log.setStatusTip('Switch to system log view')
        self.connect(switch_to_log, QtCore.SIGNAL('triggered()'), self.show_log)

        switch_to_topo = QtGui.QAction(QtGui.QIcon('gui/icons/topo.png'),'Topology View',self)
        switch_to_topo.setShortcut('Ctrl+2')
        switch_to_topo.setStatusTip('Switch to topology view')
        self.connect(switch_to_topo, QtCore.SIGNAL('triggered()'), self.show_topo)

        switch_to_split = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),'Split View',self)
        switch_to_split.setShortcut('Ctrl+3')
        switch_to_split.setStatusTip('Switch to split view')
        self.connect(switch_to_split, QtCore.SIGNAL('triggered()'), self.show_split)

        toggle_console = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),'Show/Hide Console',self)
        toggle_console.setShortcut('Ctrl+4')
        toggle_console.setStatusTip('Show/Hide Console')
        self.connect(toggle_console, QtCore.SIGNAL('triggered()'), self.toggle_show_console)

        exit = QtGui.QAction(QtGui.QIcon('gui/icons/exit.png'), 'Exit', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        switch_to_dark = QtGui.QAction('Dark',self)
        switch_to_dark.setStatusTip('Switch to dark color theme')
        self.connect(switch_to_dark, QtCore.SIGNAL('triggered()'), self.dark)

        switch_to_bright = QtGui.QAction('Bright',self)
        switch_to_bright.setStatusTip('Switch to bright color theme')
        self.connect(switch_to_bright, QtCore.SIGNAL('triggered()'), self.bright)

        set_node_id_size_small = QtGui.QAction('Small',self)
        set_node_id_size_small.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_small, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_small)

        set_node_id_size_normal = QtGui.QAction('Normal',self)
        set_node_id_size_normal.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_normal, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_normal)

        set_node_id_size_large = QtGui.QAction('Large',self)
        set_node_id_size_large.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_large, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_large)

        self.statusBar()

        # Configure Menubar
        menubar = self.menuBar()
        file_menu = menubar.addMenu('&File')
        file_menu.addAction(start)
        file_menu.addAction(exit)
        view_menu = menubar.addMenu('&View')
        view_menu.addAction(switch_to_log)
        view_menu.addAction(switch_to_topo)
        view_menu.addAction(switch_to_split)
        view_menu.addAction(toggle_console)
        id_size_menu = view_menu.addMenu('ID size')
        id_size_menu.addAction(set_node_id_size_small)
        id_size_menu.addAction(set_node_id_size_normal)
        id_size_menu.addAction(set_node_id_size_large)
        components_menu = menubar.addMenu('&Components')
        components_menu.addAction('Installed Components')
        components_menu.addAction('Active Components')
        #'''
        theme_menu = menubar.addMenu('&Colors')
        theme_menu.addAction(switch_to_dark)
        theme_menu.addAction(switch_to_bright)
        #'''
        help_menu = menubar.addMenu('&Help')
        help_menu.addAction('Help')
        help_menu.addAction('About')

        # Configure Toolbar
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(start)
        toolbar.addAction(switch_to_log)
        toolbar.addAction(switch_to_topo)
        toolbar.addAction(switch_to_split)
        toolbar.addAction(exit)
        
        self.toggle_show_console()

    def center(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        size =  self.geometry()
        self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)


    def sigint_handler(self, signal, frame):
        sys.exit(0)

    def closeEvent(self, event):
        '''
        reply = QtGui.QMessageBox.question(self, 'Exit NOX',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            # Close log DB
            self.logWidget.dbWrapper.closeDb()
            # Close log message communication interface
            # Close topology communication interface
            self.topoWidget.topologyView.topologyInterface.shutdown()
            event.accept()
        else:
            event.ignore()
        '''
        """
        self.logWidget.logInterface.stop_serving()
        self.logWidget.logInterface.shutdown()
        self.logWidget.logInterface.quit()
        self.logWidget.logInterface.exit()
        """
        self.topoWidget.topologyView.topologyInterface.shutdown()
        self.logWidget.dbWrapper.closeDb()

    def start_nox(self):
        popup = Popup.StartComboBox(self)
        popup.exec_()

    def show_log(self):
        self.right.hide()
        self.left.show()

    def show_topo(self):
        self.right.show()
        self.left.hide()

    def show_split(self):
        self.right.show()
        self.left.show()

    def dark(self):
        # Change Log colors
        self.logWidget.logDisplay.setStyleSheet("background-color: \
                black; color: green")

        # Change Topology colors
        self.topoWidget.topologyView.setStyleSheet("background: black")
        #self.topoWidget.topologyView.update()
        # stupid way to refresh background color:
        self.topoWidget.topologyView.scaleView(0.5)
        self.topoWidget.topologyView.scaleView(2)

    def bright(self):
        # Change Topology colors
        self.logWidget.logDisplay.setStyleSheet("background-color: white; \
                color: black")

        # Change Topology colors
        self.topoWidget.topologyView.setStyleSheet("background: white")
        #self.topoWidget.topologyView.update()
        self.topoWidget.topologyView.scaleView(0.5)
        self.topoWidget.topologyView.scaleView(2)


    def toggle_show_console(self):
        if self.consoleWidget.isHidden():
            self.consoleWidget.show()
        else:
            self.consoleWidget.hide()
Beispiel #4
0
class MainWindow(QtGui.QMainWindow):
    def usage(self):
        """Print usage information
        """
        print "Usage: " + sys.argv[
            0] + " <options> [IP address | default to localhost]"
        print "Options:"
        print "-h / --help \tPrint this usage guide"
        print "-p / --port \tPort to connect to"
        print "-m / --mininet \tMininet IP address"

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        #Parse options and commandline arguments
        try:
            opts, args = getopt.getopt(sys.argv[1:], "hp:m:",
                                       ["help", "port=", "mininet="])
        except getopt.GetoptError:
            print "Option error!"
            self.usage()
            sys.exit(2)

        #Get options
        self.backend_port = 7790  #GuiMessenger port
        for opt, arg in opts:
            if (opt in ("-h", "--help")):
                self.usage()
                sys.exit(0)
            elif (opt in ("-p", "--port")):
                self.backend_port = int(arg)
            elif (opt in ("-m", "--mininet")):
                self.mininet_address = arg
            else:
                print "Unhandled option :" + opt
                sys.exit(2)

        # Messenger socket:
        if len(args) >= 1:
            self.backend_ip = args[0]
        else:
            self.backend_ip = "127.0.0.1"

        # Global Settings
        self.settings = settings.Settings(self)

        # Configure layout
        self.setWindowTitle('POX Graphical User Interface')
        self.resize(1280, 800)
        self.statusBar().showMessage('Ready')
        self.center()

        self.communication = Communication(self)
        self.communication.start()

        self.logWidget = log.LogWidget(self)
        self.infoWidget = info.InfoWidget(self)
        self.topoWidget = topology.TopoWidget(self)
        self.consoleWidget = console.ConsoleWidget(self)

        # Initialize communication with backend messengers
        #self.topoWidget.topologyView.helloMessenger()
        self.logWidget.helloMessenger()

        self.leftvbox = QtGui.QVBoxLayout()
        self.vSplitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        self.vSplitter.addWidget(self.infoWidget)
        # Hide info pane initially, show when needed (e.q. switch query)
        self.infoWidget.hide()
        self.vSplitter.addWidget(self.logWidget)
        self.leftvbox.addWidget(self.vSplitter)
        self.left = QtGui.QWidget()
        self.left.setLayout(self.leftvbox)

        self.rightvbox = QtGui.QVBoxLayout()
        self.rightvbox.addWidget(self.topoWidget)
        self.rightvbox.addWidget(self.consoleWidget)
        self.right = QtGui.QWidget()
        self.right.setLayout(self.rightvbox)

        self.hSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.hSplitter.addWidget(self.left)
        self.hSplitter.addWidget(self.right)

        self.setCentralWidget(self.hSplitter)

        signal.signal(signal.SIGINT, self.sigint_handler)

        # Actions
        start = QtGui.QAction(QtGui.QIcon('gui/icons/logo.png'), 'Start', self)
        start.setShortcut('Ctrl+S')
        start.setStatusTip('Start POX')
        self.connect(start, QtCore.SIGNAL('triggered()'), self.start_nox)

        switch_to_log = QtGui.QAction(QtGui.QIcon('gui/icons/log.png'),
                                      'Log View', self)
        switch_to_log.setShortcut('Ctrl+1')
        switch_to_log.setStatusTip('Switch to system log view')
        self.connect(switch_to_log, QtCore.SIGNAL('triggered()'),
                     self.show_log)

        switch_to_topo = QtGui.QAction(QtGui.QIcon('gui/icons/topo.png'),
                                       'Topology View', self)
        switch_to_topo.setShortcut('Ctrl+2')
        switch_to_topo.setStatusTip('Switch to topology view')
        self.connect(switch_to_topo, QtCore.SIGNAL('triggered()'),
                     self.show_topo)

        switch_to_split = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),
                                        'Split View', self)
        switch_to_split.setShortcut('Ctrl+3')
        switch_to_split.setStatusTip('Switch to split view')
        self.connect(switch_to_split, QtCore.SIGNAL('triggered()'),
                     self.show_split)

        toggle_console = QtGui.QAction(QtGui.QIcon('gui/icons/split.png'),
                                       'Show/Hide Console', self)
        toggle_console.setShortcut('Ctrl+4')
        toggle_console.setStatusTip('Show/Hide Console')
        self.connect(toggle_console, QtCore.SIGNAL('triggered()'),
                     self.toggle_show_console)

        exit = QtGui.QAction(QtGui.QIcon('gui/icons/exit.png'), 'Exit', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')
        self.connect(exit, QtCore.SIGNAL('triggered()'),
                     QtCore.SLOT('close()'))

        switch_to_dark = QtGui.QAction('Dark', self)
        switch_to_dark.setStatusTip('Switch to dark color theme')
        self.connect(switch_to_dark, QtCore.SIGNAL('triggered()'), self.dark)

        switch_to_bright = QtGui.QAction('Bright', self)
        switch_to_bright.setStatusTip('Switch to bright color theme')
        self.connect(switch_to_bright, QtCore.SIGNAL('triggered()'),
                     self.bright)

        set_node_id_size_small = QtGui.QAction('Small', self)
        set_node_id_size_small.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_small, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_small)

        set_node_id_size_normal = QtGui.QAction('Normal', self)
        set_node_id_size_normal.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_normal, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_normal)

        set_node_id_size_large = QtGui.QAction('Large', self)
        set_node_id_size_large.setStatusTip('Set node ID fonts to small')
        self.connect(set_node_id_size_large, QtCore.SIGNAL('triggered()'), \
         self.settings.set_node_id_size_large)

        self.statusBar()

        # Configure Menubar
        menubar = self.menuBar()
        file_menu = menubar.addMenu('&File')
        file_menu.addAction(start)
        file_menu.addAction(exit)
        view_menu = menubar.addMenu('&View')
        view_menu.addAction(switch_to_log)
        view_menu.addAction(switch_to_topo)
        view_menu.addAction(switch_to_split)
        view_menu.addAction(toggle_console)
        id_size_menu = view_menu.addMenu('ID size')
        id_size_menu.addAction(set_node_id_size_small)
        id_size_menu.addAction(set_node_id_size_normal)
        id_size_menu.addAction(set_node_id_size_large)
        components_menu = menubar.addMenu('&Components')
        components_menu.addAction('Installed Components')
        components_menu.addAction('Active Components')
        #'''
        theme_menu = menubar.addMenu('&Colors')
        theme_menu.addAction(switch_to_dark)
        theme_menu.addAction(switch_to_bright)
        #'''
        help_menu = menubar.addMenu('&Help')
        help_menu.addAction('Help')
        help_menu.addAction('About')

        # Configure Toolbar
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(start)
        toolbar.addAction(switch_to_log)
        toolbar.addAction(switch_to_topo)
        toolbar.addAction(switch_to_split)
        toolbar.addAction(exit)

        self.toggle_show_console()

    def center(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move((screen.width() - size.width()) / 2,
                  (screen.height() - size.height()) / 2)

    def sigint_handler(self, signal, frame):
        sys.exit(0)

    def closeEvent(self, event):
        '''
        reply = QtGui.QMessageBox.question(self, 'Exit NOX',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            # Close log DB
            self.logWidget.dbWrapper.closeDb()
            # Close log message communication interface
            # Close topology communication interface
            self.topoWidget.topologyView.topologyInterface.shutdown()
            event.accept()
        else:
            event.ignore()
        '''
        """
        self.logWidget.logInterface.stop_serving()
        self.logWidget.logInterface.shutdown()
        self.logWidget.logInterface.quit()
        self.logWidget.logInterface.exit()
        """
        self.topoWidget.topologyView.topologyInterface.shutdown()
        self.logWidget.dbWrapper.closeDb()

    def start_nox(self):
        popup = Popup.StartComboBox(self)
        popup.exec_()

    def show_log(self):
        self.right.hide()
        self.left.show()

    def show_topo(self):
        self.right.show()
        self.left.hide()

    def show_split(self):
        self.right.show()
        self.left.show()

    def dark(self):
        # Change Log colors
        self.logWidget.logDisplay.setStyleSheet("background-color: \
                black; color: green")

        # Change Topology colors
        self.topoWidget.topologyView.setStyleSheet("background: black")
        #self.topoWidget.topologyView.update()
        # stupid way to refresh background color:
        self.topoWidget.topologyView.scaleView(0.5)
        self.topoWidget.topologyView.scaleView(2)

    def bright(self):
        # Change Topology colors
        self.logWidget.logDisplay.setStyleSheet("background-color: white; \
                color: black")

        # Change Topology colors
        self.topoWidget.topologyView.setStyleSheet("background: white")
        #self.topoWidget.topologyView.update()
        self.topoWidget.topologyView.scaleView(0.5)
        self.topoWidget.topologyView.scaleView(2)

    def toggle_show_console(self):
        if self.consoleWidget.isHidden():
            self.consoleWidget.show()
        else:
            self.consoleWidget.hide()