def __init__(self, parent, subtitle_list):
        self._subtitle_list = subtitle_list
        
        self._builder = Gtk.Builder()
        glade_file = Resources.find(path.join('data', 'gui', 'glade',
                                              'format_check_dialog.glade'))
        self._builder.add_from_file(glade_file)
        self._dialog = self._builder.get_object('format_check_dialog')
        self._dialog.set_transient_for(parent)
        self._builder.connect_signals(self)
        self._tree_subtitles_old = self._builder.get_object(
                                                           'tree_subtitles_old')
        self._tree_subtitles_new = self._builder.get_object(
                                                           'tree_subtitles_new')
        self._selection_subtitle_old = self._builder.get_object(
                                                       'selection_subtitle_old')
        self._selection_subtitle_new = self._builder.get_object(
                                                       'selection_subtitle_new')

        self._subtitle_list_model_old = SubtitleListTreeModel(subtitle_list,
                                                      self._on_subtitle_changed,
                                                      True)
        self._subtitle_list_model_new = SubtitleListTreeModel(subtitle_list,
                                                      self._on_subtitle_changed)
        self._tree_subtitles_old.set_model(self._subtitle_list_model_old)
        self._tree_subtitles_new.set_model(self._subtitle_list_model_new)

        # The start/end time should be displayed as hh:mm:ss.iii
        # TODO same as in main_window --> outsource
        cellrenderer_start_new = self._builder.get_object(
                                                       'cellrenderer_start_new')
        column_start_new = self._builder.get_object('column_start_new')
        column_start_new.set_cell_data_func(cellrenderer_start_new,
                                        self._format_start_time_column)

        cellrenderer_end_new = self._builder.get_object('cellrenderer_end_new')
        column_end_new = self._builder.get_object('column_end_new')
        column_end_new.set_cell_data_func(cellrenderer_end_new,
                                      self._format_end_time_column)

        cellrenderer_start_old = self._builder.get_object(
                                                       'cellrenderer_start_old')
        column_start_old = self._builder.get_object('column_start_old')
        column_start_old.set_cell_data_func(cellrenderer_start_old,
                                        self._format_start_time_column)

        cellrenderer_end_old = self._builder.get_object('cellrenderer_end_old')
        column_end_old = self._builder.get_object('column_end_old')
        column_end_old.set_cell_data_func(cellrenderer_end_old,
                                      self._format_end_time_column)
class FormatCheckDialog(object):

    def __init__(self, parent, subtitle_list):
        self._subtitle_list = subtitle_list
        
        self._builder = Gtk.Builder()
        glade_file = Resources.find(path.join('data', 'gui', 'glade',
                                              'format_check_dialog.glade'))
        self._builder.add_from_file(glade_file)
        self._dialog = self._builder.get_object('format_check_dialog')
        self._dialog.set_transient_for(parent)
        self._builder.connect_signals(self)
        self._tree_subtitles_old = self._builder.get_object(
                                                           'tree_subtitles_old')
        self._tree_subtitles_new = self._builder.get_object(
                                                           'tree_subtitles_new')
        self._selection_subtitle_old = self._builder.get_object(
                                                       'selection_subtitle_old')
        self._selection_subtitle_new = self._builder.get_object(
                                                       'selection_subtitle_new')

        self._subtitle_list_model_old = SubtitleListTreeModel(subtitle_list,
                                                      self._on_subtitle_changed,
                                                      True)
        self._subtitle_list_model_new = SubtitleListTreeModel(subtitle_list,
                                                      self._on_subtitle_changed)
        self._tree_subtitles_old.set_model(self._subtitle_list_model_old)
        self._tree_subtitles_new.set_model(self._subtitle_list_model_new)

        # The start/end time should be displayed as hh:mm:ss.iii
        # TODO same as in main_window --> outsource
        cellrenderer_start_new = self._builder.get_object(
                                                       'cellrenderer_start_new')
        column_start_new = self._builder.get_object('column_start_new')
        column_start_new.set_cell_data_func(cellrenderer_start_new,
                                        self._format_start_time_column)

        cellrenderer_end_new = self._builder.get_object('cellrenderer_end_new')
        column_end_new = self._builder.get_object('column_end_new')
        column_end_new.set_cell_data_func(cellrenderer_end_new,
                                      self._format_end_time_column)

        cellrenderer_start_old = self._builder.get_object(
                                                       'cellrenderer_start_old')
        column_start_old = self._builder.get_object('column_start_old')
        column_start_old.set_cell_data_func(cellrenderer_start_old,
                                        self._format_start_time_column)

        cellrenderer_end_old = self._builder.get_object('cellrenderer_end_old')
        column_end_old = self._builder.get_object('column_end_old')
        column_end_old.set_cell_data_func(cellrenderer_end_old,
                                      self._format_end_time_column)

    def _on_subtitle_changed(self):
        pass
    
    def _on_cursor_changed_old(self, widget):
        """Is called when an item on the "old" subtitle list is selected.
        
        Selects the same row on the "new" subtitle list.
        """
        __, iter_ = self._selection_subtitle_old.get_selected()
        if iter_ != None:
            i = self._subtitle_list_model_old.get_item_index(iter_)
            __, iter_ = self._subtitle_list_model_new.get_path_iter_by_row(i)
            self._selection_subtitle_new.select_iter(iter_)
    
    def _on_cursor_changed_new(self, widget):
        """Is called when an item on the "new" subtitle list is selected.
        
        Selects the same row on the "old" subtitle list.
        """
        __, iter_ = self._selection_subtitle_new.get_selected()
        if iter_ != None:
            i = self._subtitle_list_model_new.get_item_index(iter_)
            __, iter_ = self._subtitle_list_model_old.get_path_iter_by_row(i)
            self._selection_subtitle_old.select_iter(iter_)
    
    def _on_tree_subtitles_row_activated(self, tree, path, column):
        iter_ = self._subtitle_list_model_new.get_iter(path)
        self._show_subtitle_edit_dialog(iter_)
    
    # TODO same as in main_window --> outsource
    def _format_time_column(self, column_num, cell, model, iter_):
        time = model.get_value(iter_, column_num)
        val = Time.format(time)
        cell.set_property('text', val)

    # TODO same as in main_window --> outsource
    def _format_start_time_column(self, column, cell, model, iter_, user_data):
        self._format_time_column(0, cell, model, iter_)
        
    # TODO same as in main_window --> outsource
    def _format_end_time_column(self, column, cell, model, iter_, user_data):
        self._format_time_column(1, cell, model, iter_)

    def _on_btn_edit_subtitle_clicked(self, widget, edit=True):
        __, iter_ = self._selection_subtitle_new.get_selected()
        self._show_subtitle_edit_dialog(iter_)

    def _show_subtitle_edit_dialog(self, iter_):
        if iter_ != None:
            # Pass a copy of the subtitle to the SubtitleDialog because
            # it should not modify the original subtitle. The subtitle
            # is then modified using SubtitleListTreeModel to reflect
            # changes to the GUI.
            subtitle = copy.copy(self._subtitle_list_model_new.get_item(iter_))
            dlg = SubtitleDialog(self._dialog, subtitle, edit=True,
                                 allow_edit_time=False)
            res = dlg.run()
            dlg.destroy_dialog()
            if res == Gtk.ResponseType.OK:
                self._subtitle_list_model_new.edit_subtitle(iter_, subtitle)    

    def run(self):
        return self._dialog.run()

    def destroy_dialog(self):
        return self._dialog.destroy()