Exemplo n.º 1
0
Arquivo: gdot.py Projeto: pointhi/GDot
    def __init__(self):
        self.builder = Gtk.Builder()
        script_dir = os.path.dirname(os.path.realpath(__file__))
        self.builder.add_from_file(os.path.join(script_dir, "gdot.glade"))
        self.builder.connect_signals(self)

        self.header_bar = self.builder.get_object("header_bar")

        self.code_editor = self.builder.get_object("source_code")
        self.code_buffer = self.code_editor.get_buffer()
        self.lm = GtkSource.LanguageManager.new()
        self.code_buffer.set_language(self.lm.get_language("dot"))

        self.dotwidget = DotWidget()
        self.dotwidget.error_dialog = self.dotwidget_error_dialog
        diagram_container = self.builder.get_object("diagram_container")
        diagram_container.pack_start(self.dotwidget, True, True, 0)

        self.open_file_chooser = self.builder.get_object("btn_file_chooser")
        self._set_dotfile_filter(self.open_file_chooser)

        self.set_working_dir(os.getcwd())

        self.window = self.builder.get_object("application")
        self.window.show_all()
Exemplo n.º 2
0
    def on_draw(self, widget, cr):
        DotWidget.on_draw(self, widget, cr)

        if True:
            # Cairo screenshot

            import cairo

            # Scale to give 96 dpi instead of 72 dpi
            dpi = 96.0
            scale = dpi/72.0
            w = int(self.graph.width*scale)
            h = int(self.graph.height*scale)

            CAIRO_XMAX = 32767
            CAIRO_YMAX = 32767
            if w >= CAIRO_XMAX:
                w = CAIRO_XMAX
                scale = w/self.graph.width
                h = int(self.graph.height*scale)
            if h >= CAIRO_YMAX:
                h = CAIRO_YMAX
                scale = h/self.graph.height
                w = int(self.graph.width*scale)

            assert w <= CAIRO_XMAX
            assert h <= CAIRO_YMAX

            surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)

            cr = cairo.Context(surface)

            cr.set_source_rgba(1.0, 1.0, 1.0, 1.0)
            cr.paint()

            cr.scale(scale, scale)

            self.graph.draw(cr, highlight_items=self.highlight)

            surface.write_to_png(self.name + '.png')

        if False:
            # GTK 3 screenshot

            window = self.get_window()

            w = window.get_width()
            h = window.get_height()

            pixbuf = Gdk.pixbuf_get_from_window(window, 0, 0, w, h)

            pixbuf.savev(self.name + '.png', 'png', (), ())

        Gtk.main_quit()
    def __init__(self, catcher_controller):
        encoding = locale.getlocale()[1]
        self._utf8conv = lambda x : unicode(x, encoding).encode('utf8')
        
        self._builder = gtk.Builder()
        self._builder.add_from_file('../GUI/catcher_main.glade')
        self._main_window = self._builder.get_object('main_window')
        self._main_window.show()
        
        self._filter_window = self._builder.get_object('filter_window')
        self._detail_window = self._builder.get_object('detail_view')
        self._rules_window = self._builder.get_object('rules_window')
        self._evaluators_window = self._builder.get_object('evaluators_window')
        self._evaluation_window = self._builder.get_object('evaluation_window')
        self._evaluation_image = self._builder.get_object('evaluation_image')
        self._user_image = self._builder.get_object('img_user')
        self._databases_window = self._builder.get_object('databases_window')
        self._pch_window = self._builder.get_object('pch_window')
        self._user_window = self._builder.get_object('user_window')


        self._ok_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/ok.png')
        self._warning_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/warning.png')
        self._critical_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/critical.png')
        self._plain_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/plain.png')
        self._busy_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/foundstation.png')
        self.set_evaluator_image(RuleResult.IGNORE)
        self.set_user_image()

        self._catcher_controller = catcher_controller        
        
        self._bs_tree_view = self._builder.get_object('tv_stations')
        self._add_column("Provider", 0)
        self._add_column("ARFCN", 1)
        self._add_column("Strength",2)
        self._add_column("Cell ID",3)
        self._add_column("Evaluation",4)
        self._add_column("Last seen", 5)
        self._add_column('# Scanned',6)
        self._bs_tree_view.set_model(self._catcher_controller.bs_tree_list_data)       
            
        self._horizontal_container = self._builder.get_object('vbox2')
        self._dot_widget = DotWidget()
        self._horizontal_container.pack_start_defaults(self._dot_widget)
        self._dot_widget.set_filter('neato')
        self._dot_widget.show()
        self._dot_widget.connect('clicked', self._on_graph_node_clicked)

        self._builder.connect_signals(self)
        
        detail_view_text = self._builder.get_object('te_detail_view')
        self._detail_buffer = detail_view_text.get_buffer()        
        
        log_view = self._builder.get_object('te_log')
        self._log_buffer = log_view.get_buffer()        
        self._log_buffer.insert(self._log_buffer.get_end_iter(),self._utf8conv("-- Log execution on " + datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M %p") + "  --\n\n"))
        
        self._main_window.show()
Exemplo n.º 4
0
    def do_expose_event(self, event):
        """
        In some strange cases we're getting:
            Error: invalid matrix (not invertible)

        This issue was not fixed up-stream, so we're applying this ugly patch
        that avoids users from getting a crash (but will most likely show an
        empty widget).

        I don't care much about this bug since it only appears once every 6
        months or so in my issue tracker.

        :see: https://github.com/andresriancho/w3af/issues/726
        :see: https://github.com/jrfonseca/xdot.py/issues/1
        """
        try:
            return DotWidget.do_expose_event(self, event)
        except cairo.Error:
            pass
Exemplo n.º 5
0
 def __init__(self, name):
     DotWidget.__init__(self)
     self.name = name
Exemplo n.º 6
0
Arquivo: gdot.py Projeto: pointhi/GDot
class GDot(object):
    def __init__(self):
        self.builder = Gtk.Builder()
        script_dir = os.path.dirname(os.path.realpath(__file__))
        self.builder.add_from_file(os.path.join(script_dir, "gdot.glade"))
        self.builder.connect_signals(self)

        self.header_bar = self.builder.get_object("header_bar")

        self.code_editor = self.builder.get_object("source_code")
        self.code_buffer = self.code_editor.get_buffer()
        self.lm = GtkSource.LanguageManager.new()
        self.code_buffer.set_language(self.lm.get_language("dot"))

        self.dotwidget = DotWidget()
        self.dotwidget.error_dialog = self.dotwidget_error_dialog
        diagram_container = self.builder.get_object("diagram_container")
        diagram_container.pack_start(self.dotwidget, True, True, 0)

        self.open_file_chooser = self.builder.get_object("btn_file_chooser")
        self._set_dotfile_filter(self.open_file_chooser)

        self.set_working_dir(os.getcwd())

        self.window = self.builder.get_object("application")
        self.window.show_all()

    @staticmethod
    def _set_dotfile_filter(file_chooser):
        filter_dot = Gtk.FileFilter()
        filter_dot.set_name("Graphviz dot files")
        filter_dot.add_pattern("*.dot")
        file_chooser.add_filter(filter_dot)

        filter_all = Gtk.FileFilter()
        filter_all.set_name("All files")
        filter_all.add_pattern("*")
        file_chooser.add_filter(filter_all)

    @staticmethod
    def on_delete_window(*args):
        # TODO: current content not saved
        Gtk.main_quit(*args)

    def on_load_new_file(self, chooser):
        filename = chooser.get_filename();
        folder = chooser.get_current_folder()
        with open(filename, 'r') as fp:
            self.load_file(fp)
        if folder:
            self.set_working_dir(folder)

    def on_btn_save_as(self, button):
        self.save_as_file()

    def on_btn_reload(self, button):
        self.update_dotwidget()

    def on_btn_export(self, button):
        chooser = Gtk.FileChooserDialog(parent=self.window,
                                        title="Save dot File",
                                        action=Gtk.FileChooserAction.SAVE,
                                        buttons=(Gtk.STOCK_CANCEL,
                                                 Gtk.ResponseType.CANCEL,
                                                 Gtk.STOCK_SAVE,
                                                 Gtk.ResponseType.OK))
        chooser.set_default_response(Gtk.ResponseType.OK)

        if chooser.run() == Gtk.ResponseType.OK:
            filename = chooser.get_filename()
            folder = chooser.get_current_folder() # TODO: save export folder
            chooser.destroy()

            name, extension = os.path.splitext(filename)

            if os.path.isfile(filename):
                box = Gtk.MessageDialog(parent=self.window,
                                        title="File already exists",
                                        flags=Gtk.DialogFlags.MODAL,
                                        type=Gtk.MessageType.WARNING,
                                        message_format='Do you want to override: "{}"?'.format(filename),
                                        buttons=Gtk.ButtonsType.OK_CANCEL)
                ans = box.run()
                box.hide()
                if ans != Gtk.ResponseType.OK:
                    return

            try:
                graph = graphviz.Source(self.get_dotcode(), format=extension[1:])
                graph.render(name)
            except Exception as e:
                box = Gtk.MessageDialog(parent=self.window,
                                        title="graphviz export error",
                                        flags=Gtk.DialogFlags.MODAL,
                                        type=Gtk.MessageType.ERROR,
                                        message_format=e,
                                        buttons=Gtk.ButtonsType.OK)
                box.run()
                box.hide()
        else:
            chooser.destroy()

    def on_btn_zoom_in(self, button):
        self.dotwidget.on_zoom_in(button)

    def on_btn_zoom_out(self, button):
        self.dotwidget.on_zoom_out(button)

    def on_btn_zoom_fit(self, button):
        self.dotwidget.on_zoom_fit(button)

    def on_btn_zoom_100(self, button):
        self.dotwidget.on_zoom_100(button)

    def load_file(self, stream):
        self.set_dotcode(stream.read())
        self.header_bar.set_subtitle(stream.name)

        self.open_file_chooser.set_filename(stream.name)

    def save_as_file(self):
        chooser = Gtk.FileChooserDialog(parent=self.window,
                                        title="Save dot File",
                                        action=Gtk.FileChooserAction.SAVE,
                                        buttons=(Gtk.STOCK_CANCEL,
                                                 Gtk.ResponseType.CANCEL,
                                                 Gtk.STOCK_SAVE ,
                                                 Gtk.ResponseType.OK))
        chooser.set_default_response(Gtk.ResponseType.OK)
        old_filename = self.open_file_chooser.get_filename()
        if old_filename:
            chooser.set_filename(old_filename)
        self._set_dotfile_filter(chooser)

        if chooser.run() == Gtk.ResponseType.OK:
            filename = chooser.get_filename()
            folder = chooser.get_current_folder()
            chooser.destroy()

            if not os.path.splitext(filename)[1]:
                filename = '{}.dot'.format(filename)

            # TODO: canonicalize
            if os.path.isfile(filename) and filename != self.open_file_chooser.get_filename():
                box = Gtk.MessageDialog(parent=self.window,
                                        title="File already exists",
                                        flags=Gtk.DialogFlags.MODAL,
                                        type=Gtk.MessageType.WARNING,
                                        message_format='Do you want to override: "{}"?'.format(filename),
                                        buttons=Gtk.ButtonsType.OK_CANCEL)
                ans = box.run()
                box.hide()
                if ans != Gtk.ResponseType.OK:
                    return

            self.save_file(filename)

            self.open_file_chooser.set_filename(filename)
            self.set_working_dir(folder)
            return True
        else:
            chooser.destroy()
            return False

    def save_file(self, path):
        with open(path, 'w') as fp:
            fp.write(self.get_dotcode())
            self.header_bar.set_subtitle(path)

    def get_dotcode(self):
        start_iter = self.code_buffer.get_start_iter()
        end_iter = self.code_buffer.get_end_iter()
        return self.code_buffer.get_text(start_iter, end_iter, True)

    def set_dotcode(self, dotcode):
        self.code_buffer.begin_not_undoable_action()
        self.code_buffer.set_text(dotcode)
        self.code_buffer.end_not_undoable_action()

        self.update_dotwidget()

    def set_working_dir(self, dir):
        self.open_file_chooser.set_current_folder(dir)
        os.chdir(dir)

    def update_dotwidget(self):
        try:
            self.dotwidget.set_dotcode(str.encode(self.get_dotcode()), None)
        except Exception:
            self.dotwidget_error_dialog("Cannot render graphviz code!\n\n{}".format(traceback.format_exc()))

    def dotwidget_error_dialog(self, message):
        box = Gtk.MessageDialog(parent=self.window,
                                title="graphviz error",
                                flags=Gtk.DialogFlags.MODAL,
                                type=Gtk.MessageType.ERROR,
                                message_format=message,
                                buttons=Gtk.ButtonsType.OK)
        box.run()
        box.hide()
Exemplo n.º 7
0
    def __init__(self, catcher_controller):
        encoding = locale.getlocale()[1]
        self._utf8conv = lambda x: unicode(x, encoding).encode('utf8')

        self._builder = gtk.Builder()
        self._builder.add_from_file('../GUI/catcher_main.glade')
        self._main_window = self._builder.get_object('main_window')
        self._main_window.show()

        self._filter_window = self._builder.get_object('filter_window')
        self._detail_window = self._builder.get_object('detail_view')
        self._rules_window = self._builder.get_object('rules_window')
        self._evaluators_window = self._builder.get_object('evaluators_window')
        self._evaluation_window = self._builder.get_object('evaluation_window')
        self._evaluation_image = self._builder.get_object('evaluation_image')
        self._user_image = self._builder.get_object('img_user')
        self._databases_window = self._builder.get_object('databases_window')
        self._pch_window = self._builder.get_object('pch_window')
        self._user_window = self._builder.get_object('user_window')

        self._ok_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/ok.png')
        self._warning_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/warning.png')
        self._critical_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/critical.png')
        self._plain_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/plain.png')
        self._busy_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/foundstation.png')
        self.set_evaluator_image(RuleResult.IGNORE)
        self.set_user_image()

        self._catcher_controller = catcher_controller

        self._bs_tree_view = self._builder.get_object('tv_stations')
        self._add_column("Provider", 0)
        self._add_column("ARFCN", 1)
        self._add_column("Strength", 2)
        self._add_column("Cell ID", 3)
        self._add_column("Evaluation", 4)
        self._add_column("Last seen", 5)
        self._add_column('# Scanned', 6)
        self._bs_tree_view.set_model(
            self._catcher_controller.bs_tree_list_data)

        self._horizontal_container = self._builder.get_object('vbox2')
        self._dot_widget = DotWidget()
        self._horizontal_container.pack_start_defaults(self._dot_widget)
        self._dot_widget.set_filter('neato')
        self._dot_widget.show()
        self._dot_widget.connect('clicked', self._on_graph_node_clicked)

        self._builder.connect_signals(self)

        detail_view_text = self._builder.get_object('te_detail_view')
        self._detail_buffer = detail_view_text.get_buffer()

        log_view = self._builder.get_object('te_log')
        self._log_buffer = log_view.get_buffer()
        self._log_buffer.insert(
            self._log_buffer.get_end_iter(),
            self._utf8conv(
                "-- Log execution on " +
                datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M %p") +
                "  --\n\n"))

        self._main_window.show()
Exemplo n.º 8
0
class PyCatcherGUI:
    def __init__(self, catcher_controller):
        encoding = locale.getlocale()[1]
        self._utf8conv = lambda x: unicode(x, encoding).encode('utf8')

        self._builder = gtk.Builder()
        self._builder.add_from_file('../GUI/catcher_main.glade')
        self._main_window = self._builder.get_object('main_window')
        self._main_window.show()

        self._filter_window = self._builder.get_object('filter_window')
        self._detail_window = self._builder.get_object('detail_view')
        self._rules_window = self._builder.get_object('rules_window')
        self._evaluators_window = self._builder.get_object('evaluators_window')
        self._evaluation_window = self._builder.get_object('evaluation_window')
        self._evaluation_image = self._builder.get_object('evaluation_image')
        self._user_image = self._builder.get_object('img_user')
        self._databases_window = self._builder.get_object('databases_window')
        self._pch_window = self._builder.get_object('pch_window')
        self._user_window = self._builder.get_object('user_window')

        self._ok_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/ok.png')
        self._warning_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/warning.png')
        self._critical_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/critical.png')
        self._plain_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/plain.png')
        self._busy_image = gtk.gdk.pixbuf_new_from_file(
            '../GUI/Images/foundstation.png')
        self.set_evaluator_image(RuleResult.IGNORE)
        self.set_user_image()

        self._catcher_controller = catcher_controller

        self._bs_tree_view = self._builder.get_object('tv_stations')
        self._add_column("Provider", 0)
        self._add_column("ARFCN", 1)
        self._add_column("Strength", 2)
        self._add_column("Cell ID", 3)
        self._add_column("Evaluation", 4)
        self._add_column("Last seen", 5)
        self._add_column('# Scanned', 6)
        self._bs_tree_view.set_model(
            self._catcher_controller.bs_tree_list_data)

        self._horizontal_container = self._builder.get_object('vbox2')
        self._dot_widget = DotWidget()
        self._horizontal_container.pack_start_defaults(self._dot_widget)
        self._dot_widget.set_filter('neato')
        self._dot_widget.show()
        self._dot_widget.connect('clicked', self._on_graph_node_clicked)

        self._builder.connect_signals(self)

        detail_view_text = self._builder.get_object('te_detail_view')
        self._detail_buffer = detail_view_text.get_buffer()

        log_view = self._builder.get_object('te_log')
        self._log_buffer = log_view.get_buffer()
        self._log_buffer.insert(
            self._log_buffer.get_end_iter(),
            self._utf8conv(
                "-- Log execution on " +
                datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M %p") +
                "  --\n\n"))

        self._main_window.show()

    def set_evaluator_image(self, status):
        pixbuf = self._plain_image
        if status == RuleResult.OK:
            pixbuf = self._ok_image
        elif status == RuleResult.WARNING:
            pixbuf = self._warning_image
        elif status == RuleResult.CRITICAL:
            pixbuf = self._critical_image
        width, height = self._evaluation_window.get_size()
        pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
        self._evaluation_image.set_from_pixbuf(pixbuf)

    def set_user_image(self, status=None):
        pixbuf = self._plain_image
        if not status:
            pass
        elif status == RuleResult.OK:
            pixbuf = self._ok_image
        elif status == RuleResult.WARNING:
            pixbuf = self._warning_image
        elif status == RuleResult.CRITICAL:
            pixbuf = self._critical_image
        elif status == RuleResult.IGNORE:
            pixbuf = self._busy_image
        pixbuf = pixbuf.scale_simple(320, 240, gtk.gdk.INTERP_BILINEAR)
        self._user_image.set_from_pixbuf(pixbuf)

    def _add_column(self, name, index):
        column = gtk.TreeViewColumn(name, gtk.CellRendererText(), text=index)
        column.set_resizable(True)
        column.set_sort_column_id(index)
        self._bs_tree_view.append_column(column)

    def _update_filters(self):
        if self._builder.get_object('cb_filter_by_provider').get_active():
            self._catcher_controller.provider_filter.params = {
                'providers':
                self._builder.get_object('te_filter_provider').get_text()
            }
            self._catcher_controller.provider_filter.is_active = True
        else:
            self._catcher_controller.provider_filter.is_active = False

        if self._builder.get_object('cb_filter_by_arfcn').get_active():
            self._catcher_controller.arfcn_filter.params = {
                'from':
                int(
                    self._builder.get_object(
                        'te_filter_arfcn_from').get_text()),
                'to':
                int(self._builder.get_object('te_filter_arfcn_to').get_text())
            }
            self._catcher_controller.arfcn_filter.is_active = True
        else:
            self._catcher_controller.arfcn_filter.is_active = False

        self._catcher_controller.trigger_evaluation()

    def _update_rules(self):
        self._catcher_controller.provider_rule.is_active = self._builder.get_object(
            'cb_provider_known').get_active()
        self._catcher_controller.country_mapping_rule.is_active = self._builder.get_object(
            'cb_country_provider').get_active()
        self._catcher_controller.arfcn_mapping_rule.is_active = self._builder.get_object(
            'cb_arfcn_provider').get_active()
        self._catcher_controller.lac_mapping_rule.is_active = self._builder.get_object(
            'cb_lac_provider').get_active()
        self._catcher_controller.unique_cell_id_rule.is_active = self._builder.get_object(
            'cb_uniqueness').get_active()
        self._catcher_controller.lac_median_rule.is_active = self._builder.get_object(
            'cb_lac').get_active()
        self._catcher_controller.neighbourhood_structure_rule.is_active = self._builder.get_object(
            'cb_neighbourhood_structure').get_active()
        self._catcher_controller.pure_neighbourhood_rule.is_active = self._builder.get_object(
            'cb_pure_neighbourhood').get_active()
        self._catcher_controller.full_discovered_neighbourhoods_rule.is_active = self._builder.get_object(
            'cb_neighbours_discovered').get_active()
        self._catcher_controller.cell_id_db_rule.is_active = self._builder.get_object(
            'cb_cell_id_database').get_active()
        self._catcher_controller.location_area_database_rule.is_active = self._builder.get_object(
            'cb_local_area_database').get_active()
        self._catcher_controller.lac_change_rule.is_active = self._builder.get_object(
            'cb_lac_change').get_active()
        self._catcher_controller.rx_change_rule.is_active = self._builder.get_object(
            'cb_rx_change').get_active()
        self._catcher_controller.trigger_evaluation()

    def _update_evaluators(self):
        if self._builder.get_object('rb_conservative_evaluator').get_active():
            self._catcher_controller.set_evaluator(
                EvaluatorSelect.CONSERVATIVE)
        elif self._builder.get_object('rb_grouped_evaluator').get_active():
            self._catcher_controller.set_evaluator(EvaluatorSelect.GROUP)

    def _on_csv_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.export_csv()

    def _update_databases(self):
        self._catcher_controller.use_google = self._builder.get_object(
            'cb_google').get_active()
        self._catcher_controller.use_open_cell_id = self._builder.get_object(
            'cb_opencellid').get_active()
        self._catcher_controller.use_local_db = (
            self._builder.get_object('cb_cellid_database_local').get_active(),
            self._builder.get_object('te_cellid_database').get_text())
        self._catcher_controller.set_new_location(
            self._builder.get_object('te_current_location').get_text())

    def show_info(self,
                  message,
                  title='PyCatcher',
                  time_to_sleep=3,
                  type='INFO'):
        gtk_type = {'INFO': gtk.MESSAGE_INFO, 'ERROR': gtk.MESSAGE_ERROR}

        dlg = gtk.MessageDialog(type=gtk.MESSAGE_INFO,
                                message_format=str(message))
        dlg.set_title(title)
        dlg.show()
        time.sleep(time_to_sleep)
        dlg.destroy()

    def log_line(self, line):
        self._log_buffer.insert(
            self._log_buffer.get_end_iter(),
            self._utf8conv(datetime.datetime.now().strftime("%I:%M:%S %p") +
                           ":     " + line + "\n"))

    def _on_graph_node_clicked(self, widget, url, event):
        print 'NODE CLICKED'

    def _on_user_close_clicked(self, widget):
        self._catcher_controller.trigger_evaluation()
        self._user_window.hide()

    def _on_pch_close_clicked(self, widget):
        self._catcher_controller.pch_scan_integration.is_active = self._builder.get_object(
            'cb_integrate_pch').get_active()
        self._catcher_controller.trigger_evaluation()
        self._pch_window.hide()

    def _on_pch_scan_clicked(self, widget):
        self._catcher_controller.pch_scan_integration.is_active = self._builder.get_object(
            'cb_integrate_pch').get_active()
        arfcns = map(
            int,
            self._builder.get_object('te_pch_arfcns').get_text().strip().split(
                ','))
        timeout = int(self._builder.get_object('te_pch_timeout').get_text())
        self._catcher_controller.normal_pch_scan(arfcns, timeout)

    def set_pch_results(self, results):
        results_label = self._builder.get_object('lbl_pch_result')
        result_text = 'Results:\n'
        for scan in results:
            arfcn, pagings = scan
            result_text += 'ARFCN %d:\n' % arfcn
            for key, value in pagings.items():
                result_text += '    %s: %d\n' % (key, value)
            result_text += '\n'
        results_label.set_text(result_text)

    def _on_user_evaluate_clicked(self, widget):
        provider = self._builder.get_object('te_user_provider').get_text()
        self._catcher_controller.user_pch_scan(provider)

    def _on_user_mode_clicked(self, widget):
        self._user_window.show()

    def _on_pch_clicked(self, widget):
        self._pch_window.show()

    def _on_web_services_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.update_with_web_services()

    def _on_localdb_add_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.update_location_database()

    def _on_main_window_destroy(self, widget):
        self._catcher_controller.shutdown()
        gtk.main_quit()

    def _on_scan_toggled(self, widget):
        if widget.get_active():
            self._catcher_controller.start_scan()
        else:
            self._catcher_controller.stop_scan()

    def _on_firmware_toggled(self, widget):
        if widget.get_active():
            self._catcher_controller.start_firmware()
        else:
            self._catcher_controller.stop_firmware()

    def _on_filter_clicked(self, widget):
        self._filter_window.show()

    def _on_evaluation_clicked(self, widget):
        self._evaluation_window.show()

    def _on_filter_close_clicked(self, widget):
        self._update_filters()
        self._filter_window.hide()

    def _on_rules_close_clicked(self, widget):
        self._update_rules()
        self._rules_window.hide()

    def _on_evaluators_clicked(self, widget):
        self._evaluators_window.show()

    def _on_evaluators_window_close_clicked(self, window, event):
        window.hide()
        return True

    def _on_rules_clicked(self, widget):
        self._rules_window.show()

    def _on_evaluators_close_clicked(self, widget):
        self._update_evaluators()
        self._evaluators_window.hide()

    def _on_tv_stations_clicked(self, widget,
                                unecessary_parameter_just_for_signature):
        selection = widget.get_selection()
        model, treeiter = selection.get_selected()
        if treeiter is not None:
            arfcn = model[treeiter][1]
            report = self._catcher_controller.fetch_report(arfcn)
            self._detail_buffer.set_text(self._utf8conv(report))
            self._detail_window.show()

    def _on_details_delete(self, widget, dunno_what_this_param_does):
        self._detail_window.hide()
        return True

    def _on_databases_clicked(self, widget):
        self._databases_window.show()

    def _on_databases_close_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.trigger_evaluation()
        self._databases_window.hide()

    def _on_save_clicked(self, widget):
        chooser = gtk.FileChooserDialog(
            title="Save Project",
            action=gtk.FILE_CHOOSER_ACTION_SAVE,
            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,
                     gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("Catcher Project Files")
        filter.add_pattern("*.cpf")
        chooser.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        if chooser.run() == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            self._catcher_controller.save_project(filename)
        else:
            chooser.destroy()

    def _on_load_clicked(self, widget):
        chooser = gtk.FileChooserDialog(
            title="Open Project",
            action=gtk.FILE_CHOOSER_ACTION_OPEN,
            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
                     gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("Catcher Project Files")
        filter.add_pattern("*.cpf")
        chooser.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        if chooser.run() == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            self._catcher_controller.load_project(filename)
        else:
            chooser.destroy()

    #---------------- Viewer Bindings ----------------------------------------------------#
    def _on_open_file_clicked(self, widget):
        chooser = gtk.FileChooserDialog(
            title="Open dot File",
            action=gtk.FILE_CHOOSER_ACTION_OPEN,
            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
                     gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("Graphviz dot files")
        filter.add_pattern("*.dot")
        chooser.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        if chooser.run() == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            self.load_dot_from_file(filename)
        else:
            chooser.destroy()

    def _on_zoon_in_clicked(self, widget):
        self._dot_widget.on_zoom_in(None)

    def _on_zoon_out_clicked(self, widget):
        self._dot_widget.on_zoom_out(None)

    def _on_zoon_fit_clicked(self, widget):
        self._dot_widget.on_zoom_fit(None)

    def _on_zoon_original_clicked(self, widget):
        self._dot_widget.on_zoom_100(None)

    def load_dot_from_file(self, filename):
        try:
            fp = file(filename, 'rt')
            self.load_dot(fp.read(), filename)
            fp.close()
        except IOError, ex:
            self.show_info(ex)
class PyCatcherGUI:
 
    def __init__(self, catcher_controller):
        encoding = locale.getlocale()[1]
        self._utf8conv = lambda x : unicode(x, encoding).encode('utf8')
        
        self._builder = gtk.Builder()
        self._builder.add_from_file('../GUI/catcher_main.glade')
        self._main_window = self._builder.get_object('main_window')
        self._main_window.show()
        
        self._filter_window = self._builder.get_object('filter_window')
        self._detail_window = self._builder.get_object('detail_view')
        self._rules_window = self._builder.get_object('rules_window')
        self._evaluators_window = self._builder.get_object('evaluators_window')
        self._evaluation_window = self._builder.get_object('evaluation_window')
        self._evaluation_image = self._builder.get_object('evaluation_image')
        self._user_image = self._builder.get_object('img_user')
        self._databases_window = self._builder.get_object('databases_window')
        self._pch_window = self._builder.get_object('pch_window')
        self._user_window = self._builder.get_object('user_window')


        self._ok_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/ok.png')
        self._warning_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/warning.png')
        self._critical_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/critical.png')
        self._plain_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/plain.png')
        self._busy_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/foundstation.png')
        self.set_evaluator_image(RuleResult.IGNORE)
        self.set_user_image()

        self._catcher_controller = catcher_controller        
        
        self._bs_tree_view = self._builder.get_object('tv_stations')
        self._add_column("Provider", 0)
        self._add_column("ARFCN", 1)
        self._add_column("Strength",2)
        self._add_column("Cell ID",3)
        self._add_column("Evaluation",4)
        self._add_column("Last seen", 5)
        self._add_column('# Scanned',6)
        self._bs_tree_view.set_model(self._catcher_controller.bs_tree_list_data)       
            
        self._horizontal_container = self._builder.get_object('vbox2')
        self._dot_widget = DotWidget()
        self._horizontal_container.pack_start_defaults(self._dot_widget)
        self._dot_widget.set_filter('neato')
        self._dot_widget.show()
        self._dot_widget.connect('clicked', self._on_graph_node_clicked)

        self._builder.connect_signals(self)
        
        detail_view_text = self._builder.get_object('te_detail_view')
        self._detail_buffer = detail_view_text.get_buffer()        
        
        log_view = self._builder.get_object('te_log')
        self._log_buffer = log_view.get_buffer()        
        self._log_buffer.insert(self._log_buffer.get_end_iter(),self._utf8conv("-- Log execution on " + datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M %p") + "  --\n\n"))
        
        self._main_window.show()

    def set_evaluator_image(self, status):
        pixbuf = self._plain_image
        if status == RuleResult.OK:
            pixbuf = self._ok_image
        elif status == RuleResult.WARNING:
            pixbuf = self._warning_image
        elif status == RuleResult.CRITICAL:
            pixbuf = self._critical_image
        width, height = self._evaluation_window.get_size()
        pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
        self._evaluation_image.set_from_pixbuf(pixbuf)

    def set_user_image(self, status=None):
        pixbuf = self._plain_image
        if not status:
           pass
        elif status == RuleResult.OK:
            pixbuf = self._ok_image
        elif status == RuleResult.WARNING:
            pixbuf = self._warning_image
        elif status == RuleResult.CRITICAL:
            pixbuf = self._critical_image
        elif status == RuleResult.IGNORE:
            pixbuf = self._busy_image
        pixbuf = pixbuf.scale_simple(320, 240, gtk.gdk.INTERP_BILINEAR)
        self._user_image.set_from_pixbuf(pixbuf)


    def _add_column(self, name, index):
        column = gtk.TreeViewColumn(name, gtk.CellRendererText(), text=index)
        column.set_resizable(True)
        column.set_sort_column_id(index)
        self._bs_tree_view.append_column(column)
    
    def _update_filters(self):
        if self._builder.get_object('cb_filter_by_provider').get_active():
            self._catcher_controller.provider_filter.params = {'providers': self._builder.get_object('te_filter_provider').get_text()}
            self._catcher_controller.provider_filter.is_active = True
        else: 
            self._catcher_controller.provider_filter.is_active = False
                                                               
        if self._builder.get_object('cb_filter_by_arfcn').get_active():
            self._catcher_controller.arfcn_filter.params = {'from':int(self._builder.get_object('te_filter_arfcn_from').get_text()),
                                         'to':int(self._builder.get_object('te_filter_arfcn_to').get_text())}
            self._catcher_controller.arfcn_filter.is_active = True
        else:
            self._catcher_controller.arfcn_filter.is_active = False

        self._catcher_controller.trigger_evaluation()

    def _update_rules(self):
        self._catcher_controller.provider_rule.is_active = self._builder.get_object('cb_provider_known').get_active()
        self._catcher_controller.country_mapping_rule.is_active = self._builder.get_object('cb_country_provider').get_active()
        self._catcher_controller.arfcn_mapping_rule.is_active = self._builder.get_object('cb_arfcn_provider').get_active()
        self._catcher_controller.lac_mapping_rule.is_active = self._builder.get_object('cb_lac_provider').get_active()
        self._catcher_controller.unique_cell_id_rule.is_active = self._builder.get_object('cb_uniqueness').get_active()
        self._catcher_controller.lac_median_rule.is_active = self._builder.get_object('cb_lac').get_active()
        self._catcher_controller.neighbourhood_structure_rule.is_active = self._builder.get_object('cb_neighbourhood_structure').get_active()
        self._catcher_controller.pure_neighbourhood_rule.is_active = self._builder.get_object('cb_pure_neighbourhood').get_active()
        self._catcher_controller.full_discovered_neighbourhoods_rule.is_active = self._builder.get_object('cb_neighbours_discovered').get_active()
        self._catcher_controller.cell_id_db_rule.is_active = self._builder.get_object('cb_cell_id_database').get_active()
        self._catcher_controller.location_area_database_rule.is_active = self._builder.get_object('cb_local_area_database').get_active()
        self._catcher_controller.lac_change_rule.is_active = self._builder.get_object('cb_lac_change').get_active()
        self._catcher_controller.rx_change_rule.is_active = self._builder.get_object('cb_rx_change').get_active()
        self._catcher_controller.trigger_evaluation()

    def _update_evaluators(self):
        if self._builder.get_object('rb_conservative_evaluator').get_active():
            self._catcher_controller.set_evaluator(EvaluatorSelect.CONSERVATIVE)
        elif self._builder.get_object('rb_grouped_evaluator').get_active():
            self._catcher_controller.set_evaluator(EvaluatorSelect.GROUP)

    def _on_csv_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.export_csv()

    def _update_databases(self):
        self._catcher_controller.use_google =  self._builder.get_object('cb_google').get_active()
        self._catcher_controller.use_open_cell_id = self._builder.get_object('cb_opencellid').get_active()
        self._catcher_controller.use_local_db =  (self._builder.get_object('cb_cellid_database_local').get_active(),
                                                  self._builder.get_object('te_cellid_database').get_text())
        self._catcher_controller.set_new_location(self._builder.get_object('te_current_location').get_text())

    def show_info(self, message, title='PyCatcher', time_to_sleep=3, type='INFO'):
        gtk_type = {'INFO' : gtk.MESSAGE_INFO,
                    'ERROR': gtk.MESSAGE_ERROR}

        dlg = gtk.MessageDialog(type=gtk.MESSAGE_INFO,
                                message_format=str(message)
        )
        dlg.set_title(title)
        dlg.show()
        time.sleep(time_to_sleep)
        dlg.destroy()

    def log_line(self, line):
        self._log_buffer.insert(self._log_buffer.get_end_iter(),self._utf8conv(datetime.datetime.now().strftime("%I:%M:%S %p")+ ":     " + line + "\n"))
    
    def _on_graph_node_clicked(self, widget, url, event):
        print 'NODE CLICKED'

    def _on_user_close_clicked(self, widget):
        self._catcher_controller.trigger_evaluation()
        self._user_window.hide()

    def _on_pch_close_clicked(self, widget):
        self._catcher_controller.pch_scan_integration.is_active = self._builder.get_object('cb_integrate_pch').get_active()
        self._catcher_controller.trigger_evaluation()
        self._pch_window.hide()

    def _on_pch_scan_clicked(self, widget):
        self._catcher_controller.pch_scan_integration.is_active = self._builder.get_object('cb_integrate_pch').get_active()
        arfcns = map(int, self._builder.get_object('te_pch_arfcns').get_text().strip().split(','))
        timeout = int(self._builder.get_object('te_pch_timeout').get_text())
        self._catcher_controller.normal_pch_scan(arfcns, timeout)

    def set_pch_results(self, results):
        results_label = self._builder.get_object('lbl_pch_result')
        result_text = 'Results:\n'
        for scan in results:
            arfcn, pagings = scan
            result_text += 'ARFCN %d:\n'%arfcn
            for key, value in pagings.items():
                result_text += '    %s: %d\n'%(key, value)
            result_text += '\n'
        results_label.set_text(result_text)

    def _on_user_evaluate_clicked(self, widget):
        provider = self._builder.get_object('te_user_provider').get_text()
        self._catcher_controller.user_pch_scan(provider)

    def _on_user_mode_clicked(self, widget):
        self._user_window.show()

    def _on_pch_clicked(self, widget):
        self._pch_window.show()

    def _on_web_services_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.update_with_web_services()

    def _on_localdb_add_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.update_location_database()

    def _on_main_window_destroy(self, widget):
        self._catcher_controller.shutdown() 
        gtk.main_quit()
        
    def _on_scan_toggled(self, widget):
        if widget.get_active():
            self._catcher_controller.start_scan()
        else:
            self._catcher_controller.stop_scan()
            
    def _on_firmware_toggled(self, widget):
        if widget.get_active():
            self._catcher_controller.start_firmware()
        else:
            self._catcher_controller.stop_firmware()

    def _on_filter_clicked(self,widget):
        self._filter_window.show()

    def _on_evaluation_clicked(self,widget):
        self._evaluation_window.show()

    def _on_filter_close_clicked(self, widget):
        self._update_filters()
        self._filter_window.hide()

    def _on_rules_close_clicked(self, widget):
        self._update_rules()
        self._rules_window.hide()
    
    def _on_evaluators_clicked(self, widget):
        self._evaluators_window.show()

    def _on_evaluators_window_close_clicked(self, window, event):
        window.hide()
        return True

    def _on_rules_clicked(self, widget):
        self._rules_window.show()
    
    def _on_evaluators_close_clicked(self, widget):
        self._update_evaluators()
        self._evaluators_window.hide()

    def _on_tv_stations_clicked(self, widget, unecessary_parameter_just_for_signature):
        selection = widget.get_selection()
        model, treeiter = selection.get_selected()
        if treeiter is not None:
            arfcn = model[treeiter][1]
            report = self._catcher_controller.fetch_report(arfcn)
            self._detail_buffer.set_text(self._utf8conv(report))
            self._detail_window.show()

    def _on_details_delete(self, widget, dunno_what_this_param_does):
        self._detail_window.hide()
        return True

    def _on_databases_clicked(self, widget):
        self._databases_window.show()

    def _on_databases_close_clicked(self, widget):
        self._update_databases()
        self._catcher_controller.trigger_evaluation()
        self._databases_window.hide()


    def _on_save_clicked(self, widget):
        chooser = gtk.FileChooserDialog(title="Save Project",
            action=gtk.FILE_CHOOSER_ACTION_SAVE,
            buttons=(gtk.STOCK_CANCEL,
                     gtk.RESPONSE_CANCEL,
                     gtk.STOCK_SAVE,
                     gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("Catcher Project Files")
        filter.add_pattern("*.cpf")
        chooser.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        if chooser.run() == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            self._catcher_controller.save_project(filename)
        else:
            chooser.destroy()

    def _on_load_clicked(self, widget):
        chooser = gtk.FileChooserDialog(title="Open Project",
            action=gtk.FILE_CHOOSER_ACTION_OPEN,
            buttons=(gtk.STOCK_CANCEL,
                     gtk.RESPONSE_CANCEL,
                     gtk.STOCK_OPEN,
                     gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("Catcher Project Files")
        filter.add_pattern("*.cpf")
        chooser.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        if chooser.run() == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            self._catcher_controller.load_project(filename)
        else:
            chooser.destroy()

    #---------------- Viewer Bindings ----------------------------------------------------#
    def _on_open_file_clicked(self, widget):
        chooser = gtk.FileChooserDialog(title="Open dot File",
                                        action=gtk.FILE_CHOOSER_ACTION_OPEN,
                                        buttons=(gtk.STOCK_CANCEL,
                                                 gtk.RESPONSE_CANCEL,
                                                 gtk.STOCK_OPEN,
                                                 gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        filter = gtk.FileFilter()
        filter.set_name("Graphviz dot files")
        filter.add_pattern("*.dot")
        chooser.add_filter(filter)
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        if chooser.run() == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            self.load_dot_from_file(filename)
        else:
            chooser.destroy()
    
    def _on_zoon_in_clicked(self,widget):
        self._dot_widget.on_zoom_in(None)
    
    def _on_zoon_out_clicked(self,widget):
        self._dot_widget.on_zoom_out(None)
    
    def _on_zoon_fit_clicked(self,widget):
        self._dot_widget.on_zoom_fit(None)
    
    def _on_zoon_original_clicked(self,widget):
        self._dot_widget.on_zoom_100(None)
    
    def load_dot_from_file(self, filename):
        try:
            fp = file(filename, 'rt')
            self.load_dot(fp.read(), filename)
            fp.close()
        except IOError, ex:
            self.show_info(ex)