Example #1
0
class Controller:

    __model = None  # Fachada do modelo
    __view = None  # Tela principal da aplicação
    '''
       Método construtor.
    '''
    def __init__(self):
        self.__model = Model()  # Fachada do modelo
        self.__view = View(self)  # Tela principal da aplicação
        self.__view.start()

    def __adicionar_multiplos_elementos(self, lista_de_elementos):
        for elemento in lista_de_elementos:
            self.__adicionar_unico_elemento(elemento)

    def __adicionar_unico_elemento(self, elemento):
        self.__model.adicionar_elemento_na_lista(elemento)
        self.__view.adicionar_elemento_na_lista(elemento.get_nome(),
                                                elemento.get_tipo())

    # Callbacks da interface
    '''
        Método que recebe um nome e a entrada de uma gramática e a adiciona no sistema, mostrando erro caso aconteça.
        \:param nome é o nome da gramática que será criada.
        \:param entrada é a representação textual da gramática.
        \:return True se a operação foi bem sucedida, False caso contrário.
    '''

    def cb_nova_gramatica(self, nome, entrada):
        try:
            gr = self.__model.criar_gramatica(nome, entrada)
            self.__adicionar_unico_elemento(gr)
            return True
        except FormatError as e:
            self.__view.mostrar_aviso(e.get_message())
            return False
        except Exception:
            self.__view.mostrar_aviso("Erro ao criar gramática.")
            return False

    '''
        Método que recebe um nome e a entrada de uma expressão e a adiciona no sistema, mostrando erro caso aconteça.
        \:param nome é o nome da expressão que será criada.
        \:param entrada é a representação textual da expressão.
        \:return True se a operação foi bem sucedida, False caso contrário.
    '''

    def cb_nova_expressao(self, nome, entrada):
        try:
            er = self.__model.criar_expressao(nome, entrada)
            self.__adicionar_unico_elemento(er)
            return True
        except ExpressionParsingError as e:
            self.__view.mostrar_aviso(e.get_message())
            return False
        except Exception:
            self.__view.mostrar_aviso("Erro ao criar expressão.")
            return False

    '''
        Método que recebe um índice e remove esse objeto da lista.
        \:param indice é o índice do elemento na lista.
    '''

    def cb_remover_elemento(self, indice):
        self.__model.remover_elemento(indice)
        self.__view.remover_elemento_da_lista(indice)

    '''
        Método que é chamado ao alterar o elemento selecionado na lista.
        \:param indice é o índice do elemento na lista.
    '''

    def cb_alterar_elemento_selecionado(self, indice):
        elemento = None
        if indice is not None:
            elemento = self.__model.obter_elemento_por_indice(indice)
        self.__view.atualiza_elemento_selecionado(indice, elemento)

    '''
        Método que é chamado ao requisitar a conversao e um elemento para uma gramática regular.
        \:param indice é o índice do elemento na lista.
    '''

    def cb_converter_para_gr(self, indice):
        elementos_novos = self.__model.transformar_elemento_em_gr(indice)
        self.__adicionar_multiplos_elementos(elementos_novos)

    '''
        Método que é chamado ao requisitar a conversao e um elemento para uma gramática regular.
        \:param indice é o índice do elemento na lista.
    '''

    def cb_converter_para_af(self, indice):
        elemento_novo = self.__model.transformar_elemento_em_af(indice)
        self.__adicionar_unico_elemento(elemento_novo)

    '''
        Método que é chamado ao requisitar uma operação entre dois elementos.
        \:param indice_um é o índice na lista do primeiro elemento da operação.
        \:param indice_dois é o índice na lista do segundo elemento da operação.
        \:param operacao é o índice da operacao selecionada.
    '''

    def cb_aplica_operacao(self, indice_um, indice_dois, operacao):
        if operacao >= 3 or indice_dois is not None:
            try:
                elementos_novos = self.__model.operacao_elementos(
                    indice_um, indice_dois, operacao)
                self.__adicionar_multiplos_elementos(elementos_novos)
            except AFNDError as e:
                self.__view.mostrar_aviso(e.get_message())
        else:
            self.__view.mostrar_aviso(
                "Você precisa selecionar um segundo\nelemento para aplicar a operação."
            )

    '''
        Método que é chamado ao requisitar uma operação entre duas gramáticas regulares.
        \:param indice_um é o índice na lista da primeira gramática da operação.
        \:param indice_dois é o índice na lista da segunda gramática da operação.
        \:param operacao é o índice da operacao selecionada.
    '''

    def cb_aplica_operacao_gr(self, indice_um, indice_dois, operacao):
        if operacao == 2 or indice_dois is not None:
            elementos_novos = self.__model.operacao_gr(indice_um, indice_dois,
                                                       operacao)
            self.__adicionar_unico_elemento(elementos_novos)
        else:
            self.__view.mostrar_aviso(
                "Você precisa selecionar uma segunda\ngramática para aplicar a operação."
            )

    '''
        Obtem um automato equivalente determinístico.
        \:param indice é o índice do autômato na lista.
    '''

    def cb_determiniza_af(self, indice):
        try:
            novo_elemento = self.__model.determiniza_af(indice)
            self.__adicionar_unico_elemento(novo_elemento)
        except Exception:
            self.__view.mostrar_aviso("O autômato ja é determinístico.")

    '''
        Obtem um automato equivalente minimo.
        \:param indice é o índice do autômato na lista.
    '''

    def cb_minimiza_af(self, indice):
        try:
            novo_elemento = self.__model.minimiza_af(indice)
            self.__adicionar_unico_elemento(novo_elemento)
        except Exception:
            self.__view.mostrar_aviso(
                "É preciso que o autômato seja determinístico.")

    '''
        Informa se dada sentença é reconhecida por um autômato especificado.
        \:param indice é o índice do autômato na lista.
        \:param sentenca é a sentença que será reconhecida.
    '''

    def cb_reconhecimento(self, indice, sentenca):
        try:
            if self.__model.reconhecimento(indice, sentenca):
                self.__view.mostrar_aviso(
                    "A sentença \"" + sentenca +
                    "\" é reconhecida pelo autômato.",
                    "Reconhecimento de Sentença")
            else:
                self.__view.mostrar_aviso(
                    "A sentença \"" + sentenca +
                    "\" não é reconhecida pelo autômato.",
                    "Reconhecimento de Sentença")
        except AFNDError:
            self.__view.mostrar_aviso(
                "O autômato precisa ser determinístico para reconhecer uma sentença."
            )
        except Exception:
            self.__view.mostrar_aviso("Erro ao reconhecer sentença.")

    '''
        Obtem as sentenças de um autoômato finito com determinado tamanho.
        \:param indice é o índice do autômato na lista.
        \:param tamanho é o tamanho das sentenças que serão enumeradas.
    '''

    def cb_enumeracao(self, indice, tamanho):
        try:
            sentencas = self.__model.enumeracao(indice, tamanho)
            if sentencas:
                self.__view.mostrar_lista(sentencas, tamanho)
            else:
                self.__view.mostrar_aviso("Nenhuma sentença de tamanho " +
                                          tamanho + " é reconhecida.")
        except ValueError:
            self.__view.mostrar_aviso(
                "O tamanho da sentença deve ser um inteiro.")
        except AFNDError:
            self.__view.mostrar_aviso(
                "O autômato precisa ser determinístico para enumerar sentenças."
            )
        except Exception:
            self.__view.mostrar_aviso("Erro ao enumerar sentenças.")

    '''
        Altera um elemento.
        \:param indice é o índice do autômato na lista.
        \:param tamanho é o tamanho das sentenças que serão enumeradas.
    '''

    def cb_alterar_elemento(self, indice):
        elemento = self.__model.obter_elemento_por_indice(indice)
        try:
            sucesso = self.__view.abrir_janela_edicao_de_elemento(
                elemento.get_nome(), elemento.to_string(), elemento.get_tipo())
            if sucesso:
                self.__view.reposiciona_elemento_editado(indice)
                self.__model.reposiciona_elemento_editado(indice)
                self.cb_alterar_elemento_selecionado(indice)
        except Exception:
            self.__view.mostrar_aviso("O elemento não foi alterado.")

    def cb_duplica_elemento(self, indice):
        copia = self.__model.duplicar(indice)
        self.__adicionar_unico_elemento(copia)

    def cb_salvar_elemento(self, indice):
        elemento = self.__model.obter_elemento_por_indice(indice)
        if elemento.get_tipo() is not TipoElemento.AF:
            caminho = self.__view.salvar_arquivo(elemento.get_nome())
            resultado = self.__model.salvar_elemento(caminho, indice)
            if resultado:
                self.__view.mostrar_aviso("Elemento salvo com sucesso.",
                                          titulo="Sucesso")
            else:
                self.__view.mostrar_aviso("Falha ao salvar arquivo.")
        else:
            self.__view.mostrar_aviso(
                "Não é possível salvar autômatos finitos.")

    def cb_carregar_gr(self, caminho):
        try:
            conteudo = self.__model.carregar_elemento(caminho)
            nome_elemento = self.__model.nome_arquivo(caminho)
            resultado = self.cb_nova_gramatica(nome_elemento, conteudo)
            if resultado:
                self.__view.mostrar_aviso("Gramática carregada com sucesso.",
                                          titulo="Sucesso")
        except Exception:
            self.__view.mostrar_aviso("Erro ao carregar arquivo.")

    def cb_carregar_er(self, caminho):
        try:
            conteudo = self.__model.carregar_elemento(caminho)
            nome_elemento = self.__model.nome_arquivo(caminho)
            resultado = self.cb_nova_expressao(nome_elemento, conteudo)
            if resultado:
                self.__view.mostrar_aviso("Expressão carregada com sucesso.",
                                          titulo="Sucesso")
        except Exception:
            self.__view.mostrar_aviso("Erro ao carregar arquivo.")