//----------------------------------------------------------- void ListaOperacoes::refazerOperacao(void) { if(refazerHabilitado()) { Operacao *operacao=NULL; bool enc_ativo=false; Excecao erro; unsigned tam_enc=0, pos=0; //Calcula o tamanho do encademanto de operações atual if(!this->signalsBlocked()) tam_enc=obterTamanhoEncadeamento(); do { //Obtém elemento atual da lista de operações operacao=operacoes[idx_atual]; /* Caso seja detectada que a operação é encadeada com outras e o flag de encadeamento ativo esteja desmarcado, marca o flag para dar início a executação de várias operações de uma só vez */ if(!anular_enc && !enc_ativo && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO) enc_ativo=true; /* Caso o encadeamento esteja ativo e a operação atual não faça parte do encadeamento, aborta a execução da operação */ else if(enc_ativo && (operacao->tipo_enc==Operacao::ENC_INICIO || operacao->tipo_enc==Operacao::SEM_ENCADEAMENTO)) break; try { if(tam_enc > 0) { //Dispara um sinal com o progresso da operação encadeada pos++; emit s_operacaoExecutada((pos/static_cast<float>(tam_enc))*100, trUtf8("Redoing operation on object:: %1 (%2)") .arg(operacao->obj_pool->obterNome()) .arg(operacao->obj_pool->obterNomeTipoObjeto()), operacao->obj_pool->obterTipoObjeto()); } //Executa a operação de refazer (segundo parametro = true) executarOperacao(operacao, true); } catch(Excecao &e) { erro=e; } idx_atual++; } /* Executa a operação enquanto a operação faça parte de encadeamento ou a opção de refazer esteja habilidata */ while(!anular_enc && refazerHabilitado() && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO); if(erro.obterTipoErro()!=ERR_NULO) throw Excecao(erro.obterMensagemErro(), erro.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__); } }
void CaixaMensagem::show(Excecao e, const QString &msg, unsigned tipo_ico) { deque<Excecao> lista; deque<Excecao>::reverse_iterator itr,itr_end; QTreeWidgetItem *item=NULL,*item1=NULL,*item2=NULL; QLabel *label=NULL; int idx=0; Excecao *ex=NULL; QString str_aux, titulo; QFont fonte=this->font(); exibir_exec_txt_tb->blockSignals(true); exibir_exec_txt_tb->setChecked(false); exibir_exec_txt_tb->blockSignals(false); //Armazena a exceção também em formato texto excecoes_txt->setPlainText(e.obterTextoExcecoes()); //Obtém a lista de erros contida na exceção passada e.obterListaExcecoes(lista); /* Varre a lista de erros obtidas em ordem reversa mostrando de onde partiu cada em sua ordem correta */ itr=lista.rbegin(); itr_end=lista.rend(); fonte.setPointSize(8); while(itr!=itr_end) { ex=&(*itr); /* Configura o item da lista responsável pela exibiação da função ou método onde foi gerado o erro */ item=new QTreeWidgetItem; str_aux=QString("[%1] - %2") .arg(idx) .arg(ex->obterLocal()); item->setIcon(0,QPixmap(QString(":/icones/icones/funcao.png"))); excecoes_trw->insertTopLevelItem(0,item); label=new QLabel; label->setFont(fonte); label->setWordWrap(true); label->setText(str_aux); excecoes_trw->setItemWidget(item, 0, label); /* Configura o item da lista responsável pela exibição do nome de arquivo onde foi gerado o erro */ item1=new QTreeWidgetItem(item); item1->setIcon(0,QPixmap(QString(":/icones/icones/codigofonte.png"))); item1->setText(0,ex->obterArquivo() + " (" + ex->obterLinha() + ")"); //Configura o item o qual denota o código interno do erro item2=new QTreeWidgetItem(item); item2->setIcon(0,QPixmap(QString(":/icones/icones/msgbox_alerta.png"))); item2->setText(0,Excecao::obterNomeErro(ex->obterTipoErro()) + " (" + QString("%1").arg(ex->obterTipoErro()) + ")"); //Configura o item da lista o qual exibe a mensagem de erro da exceção item1=new QTreeWidgetItem(item); item1->setIcon(0,QPixmap(":/icones/icones/msgbox_erro.png")); label=new QLabel; label->setWordWrap(true); label->setFont(fonte); label->setStyleSheet("color: #ff0000;"); excecoes_trw->setItemWidget(item1, 0, label); label->setText(ex->obterMensagemErro()); if(!ex->obterInfoAdicional().isEmpty()) { //Configura o item da lista o qual exibe a mensagem de erro da exceção item1=new QTreeWidgetItem(item); item1->setIcon(0,QPixmap(QString(":/icones/icones/msgbox_info.png"))); label=new QLabel; label->setWordWrap(true); label->setFont(fonte); label->setStyleSheet("color: #000080;"); excecoes_trw->setItemWidget(item1, 0, label); label->setText(ex->obterInfoAdicional()); } itr++; idx++; } switch(tipo_ico) { case ICONE_ERRO: titulo=trUtf8("Error"); break; case ICONE_ALERTA: titulo=trUtf8("Alert"); break; case ICONE_INFO: titulo=trUtf8("Information"); break; default: titulo=""; break; } /* Configura a caixa de mensagem com apenas o botão OK e com o ícone de erro crítico */ if(msg.isEmpty()) str_aux=e.obterMensagemErro(); else str_aux=msg; this->show(titulo,str_aux,tipo_ico,BOTAO_OK); }
//----------------------------------------------------------- void ListaOperacoes::desfazerOperacao(void) { if(desfazerHabilitado()) { Operacao *operacao=NULL; bool enc_ativo=false; Excecao erro; unsigned tam_enc=0, pos=0; if(!this->signalsBlocked()) tam_enc=obterTamanhoEncadeamento(); do { /* Na operação de desfazer, é necessário obter o objeto no índice atual decrementado em 1 pois o índice atual sempre aponta para o elemento posterior ao último elemento */ operacao=operacoes[idx_atual-1]; /* Caso seja detectada que a operação é encadeada com outras e o flag de encadeamento ativo esteja desmarcado, marca o flag para dar início a executação de várias operações de uma só vez */ if(!anular_enc && !enc_ativo && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO) enc_ativo=true; /* Caso o encadeamento esteja ativo e a operação atual não faça parte do encadeamento, aborta a execução da operação */ else if(enc_ativo && (operacao->tipo_enc==Operacao::ENC_FINAL || operacao->tipo_enc==Operacao::SEM_ENCADEAMENTO)) break; try { if(!this->signalsBlocked() && tam_enc > 0) { //Dispara um sinal com o progresso da operação encadeada pos++; emit s_operacaoExecutada((pos/static_cast<float>(tam_enc))*100, trUtf8("Undoing operation on object: %1 (%2)") .arg(operacao->obj_pool->obterNome()) .arg(operacao->obj_pool->obterNomeTipoObjeto()), operacao->obj_pool->obterTipoObjeto()); } //Executa a operação de desfazer executarOperacao(operacao, false); } catch(Excecao &e) { erro=e; } idx_atual--; } /* Executa a operação enquanto a operação faça parte de encadeamento ou a opção de desfazer esteja habilidata */ while(!anular_enc && desfazerHabilitado() && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO); if(erro.obterTipoErro()!=ERR_NULO) throw Excecao(erro.obterMensagemErro(), erro.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__); } }