public ListViewItem UpdatePermissions() { ListViewItem item = null; // Actualizar as permissões do Nível quando este é uma entidade detentora e é selecionado quando se acede // à área da Recolha if (this.mPanelToggleState == ToggleState.Estrutural && !mEPFilterMode) { PermissoesHelper.UpdateNivelPermissions(this.controloNivelListEstrutural1.SelectedNivelRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); } else if (this.mPanelToggleState == ToggleState.Estrutural && mEPFilterMode) { if (this.nivelDocumentalListNavigator1.SelectedItems.Count > 0) { PermissoesHelper.UpdateNivelPermissions((GISADataset.NivelRow)(this.nivelDocumentalListNavigator1.SelectedItems[0].Tag), SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); item = this.nivelDocumentalListNavigator1.SelectedItems[0]; } } else { if (this.nivelDocumentalListNavigator1.SelectedItems.Count > 0) { PermissoesHelper.UpdateNivelPermissions((GISADataset.NivelRow)(this.nivelDocumentalListNavigator1.SelectedItems[0].Tag), SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); item = this.nivelDocumentalListNavigator1.SelectedItems[0]; } else { // não há nenhum nível documental selecionado var nRow = GisaDataSetHelper.GetInstance().Nivel.Cast <GISADataset.NivelRow>().Where(r => r.ID == this.nivelDocumentalListNavigator1.BreadCrumbsPath1.getBreadCrumbsPathContextID).SingleOrDefault(); if (nRow != null) { PermissoesHelper.UpdateNivelPermissions(nRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); } else { // esta situação nunca deveria ocorrer Debug.WriteLine("NivelRow not found!!! (ID = " + this.nivelDocumentalListNavigator1.BreadCrumbsPath1.getBreadCrumbsPathContextID.ToString()); PermissoesHelper.UpdateNivelPermissions(null, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); } } } return(item); }
private void treeviews_BeforeSelect(object Sender, TreeViewCancelEventArgs e) { long start = 0; start = DateTime.Now.Ticks; GISATreeNode node = (GISATreeNode)e.Node; PermissoesHelper.UpdateNivelPermissions(node.NivelRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); try { bool selectionChange = beforeNewSelection(node); if (! selectionChange) e.Cancel = true; } catch (InvalidOperationException) { e.Cancel = true; } Debug.WriteLine("<<treeviews_BeforeSelect>>: " + new TimeSpan(DateTime.Now.Ticks - start).ToString()); }
public void LoadData() { currentODSimples = new List <ObjDigSimples>(); docSimplesSemOD = new List <SubDocumento>(); var tnrID = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDTipoNivelRelacionado; // só é considerado válido um contexto definido por um nivel documental if (currentNivel.IDTipoNivel != TipoNivel.DOCUMENTAL) { mContexto = ObjetoDigitalFedoraHelper.Contexto.nenhum; return; } mContexto = IdentifyViewMode(currentNivel); GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { GisaDataSetHelper.ManageDatasetConstraints(false); // carregar a informação da bd consuante o tipo nivel selecionado if (tnrID == (long)TipoNivelRelacionado.SD) { var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), nUpperRow.ID, nUpperRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDTipoNivelRelacionado, ho.Connection); } else { DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), currentNivel.ID, tnrID, ho.Connection); } GisaDataSetHelper.ManageDatasetConstraints(true); } catch (Exception e) { // TODO: apanhar a excepção provocada por uma falha com a comunicação com o servidor Trace.WriteLine(e); throw; } finally { ho.Dispose(); } List <string> pidsParaApagar = new List <string>(); // por algum motivo, no repositório, o objeto composto tem na sua estrutura ods simples que já foram apagados var frdRow = currentNivel.GetFRDBaseRows().Single(); var imgRows = new List <GISADataset.SFRDImagemRow>(); imgRows.AddRange(frdRow.GetSFRDImagemRows().Where(r => r.Tipo.Equals(FedoraHelper.typeFedora))); if (imgRows.Count == 0) { if (tnrID == (long)TipoNivelRelacionado.SD) // Identificar, caso exista, o OD Composto no documento/processo do subdocumento { var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; // determinar se o documento/processo tem um OD composto associado var imgRowsUpper = nUpperRow.GetFRDBaseRows().Single().GetSFRDImagemRows().Where(r => r.Tipo.Equals(FedoraHelper.typeFedora)).ToList(); if (imgRowsUpper.Count != 1) { return; // não existe nenhum OD composto para o OD simples associado ao subdocumento } // o documento/processo tem um OD associado. Determinar se esse OD é composto var odRowUpper = imgRowsUpper[0].GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; if (odRowUpper.GetObjetoDigitalRelacaoHierarquicaRowsByObjetoDigitalObjetoDigitalRelacaoHierarquicaUpper().Count() > 0) { // o OD é composto currentODComp = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(odRowUpper.pid, null) as ObjDigComposto; currentObjetoDigitalRowComp = odRowUpper; if (currentODComp == null) { return; // não se conseguiu obter o OD do servidor... } // clona o próprio e todos os seus simples currentODComp.original = currentODComp.Clone(); } } else if (tnrID == (long)TipoNivelRelacionado.D) // documento/processo sem ODs associados directamente mas com subdocumentos com ODs simples { GetSubDocsImgRows(imgRows); GetODRows(imgRows); } } else if (imgRows.Count == 1) // existe 1 OD associado mas não se sabe se é simples ou composto { var odRow = imgRows[0].GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; var od = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(odRow.pid, null); if (od == null) { ObjectNotFound(odRow.pid); return; } od.publicado = odRow.Publicado; if (tnrID == (long)TipoNivelRelacionado.SD) // o OD é garantidamente simples { PermissoesHelper.LoadObjDigitalPermissions(currentNivel, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.TrusteeRow); currentObjetoDigitalRow = odRow; currentODSimples = new List <ObjDigSimples>() { od as ObjDigSimples }; var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; // determinar se o documento/processo tem um OD composto associado var imgRowsUpper = nUpperRow.GetFRDBaseRows().Single().GetSFRDImagemRows().Where(r => r.Tipo.Equals(FedoraHelper.typeFedora)).ToList(); if (imgRowsUpper.Count == 1) { // o documento/processo tem um OD associado. Determinar se esse OD é composto var odRowUpper = imgRowsUpper[0].GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; if (odRowUpper.GetObjetoDigitalRelacaoHierarquicaRowsByObjetoDigitalObjetoDigitalRelacaoHierarquicaUpper().Count() > 0) { // o OD é composto currentODComp = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(odRowUpper.pid, null) as ObjDigComposto; currentObjetoDigitalRowComp = odRowUpper; if (currentODComp == null) { ObjectNotFound(odRowUpper.pid); return; } // não se conseguiu obter o OD do servidor... ((ObjDigSimples)od).parentDocumentTitle = nUpperRow.GetNivelDesignadoRows().Single().Designacao; //currentODComp.publicado = currentObjetoDigitalRowComp.Publicado; currentODComp.objSimples[currentODComp.objSimples.FindIndex(obj => obj.pid == od.pid)] = od as ObjDigSimples; // clona o próprio e todos os seus simples currentODComp.original = currentODComp.Clone(); } } } else if (tnrID == (long)TipoNivelRelacionado.D) // se a UI selecionada for um documento/processo também tem que se ter em conta os OD simples de subdocumentos { if (od.GetType() == typeof(ObjDigSimples)) { currentObjetoDigitalRow = imgRows.Single().GetSFRDImagemObjetoDigitalRows().Single().ObjetoDigitalRow; GetSubDocsImgRows(imgRows); GetODRows(imgRows); } else { currentODComp = od as ObjDigComposto; currentObjetoDigitalRowComp = odRow; currentODComp.objSimples.ForEach(odSimples => { var odSimplesRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().SingleOrDefault(r => r.pid.Equals(odSimples.pid)); if (odSimplesRow != null) { odSimples.guiorder = odSimplesRow.GUIOrder; odSimples.publicado = odSimplesRow.Publicado; } else if (odSimples.serverState == ServerState.Deleted) { pidsParaApagar.Add(odSimples.pid); } }); if (pidsParaApagar.Count > 0) { FedoraHelper.FixObjetoDigital(ref currentODComp, pidsParaApagar, frdRow, ref currentObjetoDigitalRowComp, ref currentObjetoDigitalRow); } } } else { if (od.GetType() == typeof(ObjDigSimples)) { currentODSimples = new List <ObjDigSimples>() { od as ObjDigSimples }; currentObjetoDigitalRow = odRow; } else { currentODComp = od as ObjDigComposto; currentObjetoDigitalRowComp = odRow; } } od.original = od.Clone(); } else { // caso onde estão associados vários simples soltos e garantidamente a UI selecionada não é um subdocumento (um subdocumento só pode ter um OD simples associado) Trace.Assert(tnrID != (long)TipoNivelRelacionado.SD); GetSubDocsImgRows(imgRows); GetODRows(imgRows); } // preencher o estado publicado nos objetos digitais if (currentODComp != null) { var odRow = default(GISADataset.ObjetoDigitalRow); currentODComp.objSimples.ToList().ForEach(odSimples => { odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().SingleOrDefault(r => r.pid.Equals(odSimples.pid)); odSimples.publicado = odRow.Publicado; }); odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.pid.Equals(currentODComp.pid)); currentODComp.publicado = odRow.Publicado; } else { currentODSimples.ToList().ForEach(odSimples => { var odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.pid.Equals(odSimples.pid)); odSimples.publicado = odRow.Publicado; }); } // obter documentos simples sem objeto digital para efeitos de ordenação GetSubDocsSemODs(); }
public void ViewToModel(Contexto viewMode, bool disableSave) { var tnrID = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDTipoNivelRelacionado; if (viewMode == ObjetoDigitalFedoraHelper.Contexto.imagens) { // neste modo, o contexto é sempre um subdocumento e como tal tem que se ter em consideração informação sobre o subdocumento e o seu documento/processo Trace.Assert(tnrID == (long)TipoNivelRelacionado.SD); var repoName = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.GetRepositoryName(); var imgVolRow = FedoraHelper.GetRepositoryImagemVolumeRow(); Debug.Assert(currentODSimples.Count <= 1); // no contexto de um subdocumento só pode haver 1 OD no máximo if (currentODSimples.Count == 1) { var odSimples = currentODSimples[0]; if (odSimples.state == State.added) { var frdRow = currentNivel.GetFRDBaseRows().Single(); odSimples.gisa_id = FedoraHelper.gisaPrefix + currentNivel.ID; var idxTip = frdRow.GetIndexFRDCARows().SingleOrDefault(idx => idx["Selector"] != DBNull.Value && idx.Selector == -1); if (idxTip != null) { odSimples.tipologia = idxTip.ControloAutRow.GetControloAutDicionarioRows().Single(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).DicionarioRow.Termo; } var assuntos = frdRow.GetIndexFRDCARows().Where(idx => idx.ControloAutRow.IDTipoNoticiaAut < 4).SelectMany(idx => idx.ControloAutRow.GetControloAutDicionarioRows()).Where(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).Select(cad => cad.DicionarioRow.Termo); if (assuntos.Count() > 0) { odSimples.assuntos = assuntos.ToList(); } var imgRow = GisaDataSetHelper.GetInstance().SFRDImagem.NewSFRDImagemRow(); imgRow.Identificador = ""; imgRow.FRDBaseRow = frdRow; imgRow.Tipo = FedoraHelper.typeFedora; imgRow.Versao = new byte[] { }; imgRow.isDeleted = 0; imgRow.GUIOrder = long.MaxValue; imgRow.Descricao = ""; imgRow.SFRDImagemVolumeRow = imgVolRow; GisaDataSetHelper.GetInstance().SFRDImagem.AddSFRDImagemRow(imgRow); if (currentODComp != null) { Debug.Assert(currentObjetoDigitalRowComp != null); var nUpperRow = currentNivel.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single().NivelRowByNivelRelacaoHierarquicaUpper; odSimples.parentDocumentTitle = nUpperRow.GetNivelDesignadoRows().Single().Designacao; var orderNr = currentNivel.GetNivelDesignadoRows().Single().GetNivelDocumentoSimplesRows().Single().GUIOrder; odSimples.guiorder = orderNr; currentObjetoDigitalRow = GisaDataSetHelper.GetInstance().ObjetoDigital.AddObjetoDigitalRow(odSimples.pid, odSimples.titulo, odSimples.publicado, orderNr, new byte[] { }, 0); GisaDataSetHelper.GetInstance().ObjetoDigitalRelacaoHierarquica.AddObjetoDigitalRelacaoHierarquicaRow(currentObjetoDigitalRow, currentObjetoDigitalRowComp, new byte[] { }, 0); currentODComp.objSimples.Insert((int)odSimples.guiorder - 1, odSimples); } else { var ndsRow = currentNivel.GetNivelDesignadoRows().Single().GetNivelDocumentoSimplesRows().Single(); currentObjetoDigitalRow = GisaDataSetHelper.GetInstance().ObjetoDigital.AddObjetoDigitalRow(odSimples.pid, odSimples.titulo, odSimples.publicado, ndsRow.GUIOrder, new byte[] { }, 0); } GisaDataSetHelper.GetInstance().SFRDImagemObjetoDigital.AddSFRDImagemObjetoDigitalRow(imgRow.IDFRDBase, imgRow.idx, currentObjetoDigitalRow, new byte[] { }, 0); //PermissoesHelper.AddNewObjDigGrantPermissions(currentObjetoDigitalRow, currentNivel); newObjects.Add(currentObjetoDigitalRow, odSimples); } else if (odSimples.state == State.modified) { currentObjetoDigitalRow.Titulo = odSimples.titulo; currentObjetoDigitalRow.Publicado = odSimples.publicado; if (currentODComp != null) { currentObjetoDigitalRowComp.Publicado = currentODComp.publicado; } } else if (odSimples.state == State.deleted) { FedoraHelper.DeleteObjDigitalRows(currentObjetoDigitalRow); if (currentODComp != null && currentODComp.state == State.deleted) { FedoraHelper.DeleteObjDigitalRows(currentObjetoDigitalRowComp); } } } } else if (mContexto == ObjetoDigitalFedoraHelper.Contexto.objetosDigitais) { if (disableSave) { return; } if (currentODComp != null) // caso onde existe um OD composto associado à UI { var odRowComp = default(GISADataset.ObjetoDigitalRow); switch (currentODComp.state) { case State.added: currentODComp.gisa_id = FedoraHelper.gisaPrefix + currentNivel.ID; var frdRow = currentNivel.GetFRDBaseRows().Single(); var imgVolRow = FedoraHelper.GetRepositoryImagemVolumeRow(); var imgRow = GisaDataSetHelper.GetInstance().SFRDImagem.NewSFRDImagemRow(); imgRow.Identificador = ""; imgRow.FRDBaseRow = frdRow; imgRow.Tipo = FedoraHelper.typeFedora; imgRow.Versao = new byte[] { }; imgRow.isDeleted = 0; imgRow.GUIOrder = long.MaxValue; imgRow.Descricao = ""; imgRow.SFRDImagemVolumeRow = imgVolRow; GisaDataSetHelper.GetInstance().SFRDImagem.AddSFRDImagemRow(imgRow); currentObjetoDigitalRowComp = GisaDataSetHelper.GetInstance().ObjetoDigital.AddObjetoDigitalRow(currentODComp.pid, currentODComp.titulo, currentODComp.publicado, 1, new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDImagemObjetoDigital.AddSFRDImagemObjetoDigitalRow(imgRow.IDFRDBase, imgRow.idx, currentObjetoDigitalRowComp, new byte[] { }, 0); //PermissoesHelper.AddNewObjDigGrantPermissions(currentObjetoDigitalRowComp, currentNivel); newObjects.Add(currentObjetoDigitalRowComp, currentODComp); var idxTip = frdRow.GetIndexFRDCARows().SingleOrDefault(idx => idx["Selector"] != DBNull.Value && idx.Selector == -1); if (idxTip != null) { currentODComp.tipologia = idxTip.ControloAutRow.GetControloAutDicionarioRows().Single(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).DicionarioRow.Termo; } var assuntos = frdRow.GetIndexFRDCARows().Where(idx => idx.ControloAutRow.IDTipoNoticiaAut < 4).SelectMany(idx => idx.ControloAutRow.GetControloAutDicionarioRows()).Where(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).Select(cad => cad.DicionarioRow.Termo); if (assuntos.Count() > 0) { currentODComp.assuntos = assuntos.ToList(); } break; case State.modified: currentObjetoDigitalRowComp.Titulo = currentODComp.titulo; currentObjetoDigitalRowComp.Publicado = currentODComp.publicado; break; case State.deleted: FedoraHelper.DeleteObjDigitalRows(currentObjetoDigitalRowComp); break; } odRowComp = currentObjetoDigitalRowComp; ViewToModelObjsSimples(currentODComp.objSimples, currentODComp, odRowComp); } else // caso onde só existem ODs simples soltos associados à UI { ViewToModelObjsSimples(currentODSimples); } } // atribuir permissões aos objectos digitais novos var odRows = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Where(r => r.RowState == DataRowState.Added).ToList(); PermissoesHelper.AddNewObjDigGrantPermissions(odRows, currentNivel); // atribuir permissão de leitura ao grupo publicados consoante o valor da flag publicado definida nas datarows GISADataset.ObjetoDigitalRow que foram adicionadas ou editadas GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Where(r => r.RowState == DataRowState.Added || r.RowState == DataRowState.Modified).ToList() .ForEach(odRow => PermissoesHelper.ChangeObjDigPermissionPublicados(odRow)); // actualizar ordem dos subdocumentos sem objeto digital docSimplesSemOD.ForEach(docSimples => docSimples.nRow.GetNivelDesignadoRows().Single().GetNivelDocumentoSimplesRows().Single().GUIOrder = docSimples.guiorder); }
public static void ensureUniqueCodigo(PersistencyHelper.PreConcArguments args) { PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgs = null; pcArgs = (PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments)args; GISADataset.NivelRow nRow = (GISADataset.NivelRow)(GisaDataSetHelper.GetInstance().Nivel.Select("ID=" + pcArgs.nRowID.ToString())[0]); GISADataset.NivelDesignadoRow ndRow = (GISADataset.NivelDesignadoRow)(GisaDataSetHelper.GetInstance().NivelDesignado.Select("ID=" + pcArgs.ndRowID.ToString())[0]); GISADataset.RelacaoHierarquicaRow rhRow = null; if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", pcArgs.rhRowID, pcArgs.rhRowIDUpper)).Length > 0) { rhRow = (GISADataset.RelacaoHierarquicaRow)(GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", pcArgs.rhRowID, pcArgs.rhRowIDUpper))[0]); } // Se o nível em questão for uma entidade detentora if (rhRow == null && nRow.TipoNivelRow.ID == TipoNivel.LOGICO) { if (DBAbstractDataLayer.DataAccessRules.NivelRule.Current.isUniqueCodigo(nRow.Codigo, nRow.ID, pcArgs.tran, pcArgs.testOnlyWithinNivel)) { pcArgs.successful = true; } else { var cod = nRow.Codigo; System.Data.DataSet tempgisaBackup1 = pcArgs.gisaBackup; PersistencyHelper.BackupRow(ref tempgisaBackup1, ndRow); pcArgs.gisaBackup = tempgisaBackup1; System.Data.DataSet tempgisaBackup2 = pcArgs.gisaBackup; PersistencyHelper.BackupRow(ref tempgisaBackup2, nRow); pcArgs.gisaBackup = tempgisaBackup2; ndRow.RejectChanges(); PermissoesHelper.UndoAddNivelGrantPermissions(nRow); nRow.RejectChanges(); pcArgs.message = string.Format( "Não é possível completar a operação porque não é permitido " + Environment.NewLine + "que duas unidades de informação tenham o mesmo código " + Environment.NewLine + "parcial ({0}) no mesmo nivel de descrição.", cod); } } else { // antes de obter o código verificar se adição de um novo nível ainda é possível (por razões // de concorrência é necessário garantir que tanto o nível acima mantém-se na base de dados // até o save estar terminado) bool upperRelationExists; if (rhRow.IDUpper < 0) { upperRelationExists = true; } else { upperRelationExists = NivelRule.Current.isNivelDeleted(rhRow.IDUpper, args.tran); } if (!upperRelationExists) { var frdRow = GisaDataSetHelper.GetInstance().FRDBase.Cast <GISADataset.FRDBaseRow>().Single(r => r.ID == pcArgs.frdBaseID); Nivel.DeleteInDataSet(frdRow, false, pcArgs.gisaBackup); Nivel.DeleteInDataSet(nRow, false, pcArgs.gisaBackup); pcArgs.message = "Não foi possível criar/editar a unidade informacional uma" + Environment.NewLine + "vez que a unidade superior foi apagada por outro utilizador."; } else { if (DBAbstractDataLayer.DataAccessRules.NivelRule.Current.isUniqueCodigo(nRow.Codigo, nRow.ID, pcArgs.tran, pcArgs.testOnlyWithinNivel, rhRow.NivelRowByNivelRelacaoHierarquicaUpper.ID)) { pcArgs.successful = true; } else { var cod = nRow.Codigo; if (nRow.RowState == DataRowState.Modified) { nRow.RejectChanges(); GisaDataSetHelper.GetInstance().IndexFRDCA.Cast <GISADataset.IndexFRDCARow>() .Where(r => r.RowState != DataRowState.Unchanged).ToList().ForEach(r => r.RejectChanges()); } else if (nRow.RowState == DataRowState.Added) { var frdRow = GisaDataSetHelper.GetInstance().FRDBase.Cast <GISADataset.FRDBaseRow>().Single(r => r.ID == pcArgs.frdBaseID); Nivel.DeleteInDataSet(frdRow, false, pcArgs.gisaBackup); Nivel.DeleteInDataSet(nRow, false, pcArgs.gisaBackup); } pcArgs.message = string.Format( "Não é possível completar a operação porque não é permitido " + Environment.NewLine + "que duas unidades de informação tenham o mesmo código " + Environment.NewLine + "parcial ({0}) no mesmo nivel de descrição.", cod); } } } }
private void paginatedList_DeeperLevelSelection(object sender, DeeperLevelSelectionEventArgs e) { // prever a situação onde o utilizador faz duplo click dentro da listview mas sem ser sobre um item dessa lista; // nesta situação pretende-se que o contexto seja perdido if (e.ItemToBeSelected.ListView == null) { lstVwPaginated_BeforeNewSelection(sender, new BeforeNewSelectionEventArgs(new ListViewItem(), true)); return; } PermissoesHelper.UpdateNivelPermissions((GISADataset.NivelRow)e.ItemToBeSelected.Tag, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); if (!PermissoesHelper.AllowExpand) { MessageBox.Show("Não tem permissão para visualizar os sub-níveis do nível documental selecionado.", "Permissões", MessageBoxButtons.OK, MessageBoxIcon.Warning); e.SelectionChange = false; } else { if (e.SelectionChange && !(((GISADataset.NivelRow)e.ItemToBeSelected.Tag).RowState == DataRowState.Detached)) { GISADataset.NivelRow dr = (GISADataset.NivelRow)e.ItemToBeSelected.Tag; // determinar se o nivel actual é um nivel de topo e se está directamente abaixo do produtor de contexto var firstBreadCrumb = BreadCrumbsPath1.Path[0]; var rhRow = dr.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First(); if (rhRow.NivelRowByNivelRelacaoHierarquica.IDTipoNivel == TipoNivel.DOCUMENTAL && rhRow.NivelRowByNivelRelacaoHierarquicaUpper.IDTipoNivel == TipoNivel.ESTRUTURAL && dr.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().SingleOrDefault(r => r.IDUpper == firstBreadCrumb.idNivel) == null) { // o nivel seleccionado é um nivel de topo e não está directamente abaixo do produtor usado como contexto na vista documental BreadCrumbsPath1.ResetBreadCrumbsPath(); var ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { NivelRule.Current.LoadNivelLocalizacao(GisaDataSetHelper.GetInstance(), dr.ID, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID, ho.Connection); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } // identificar os produtores intermédios até chegar ao nivel documental e acrescentá-los na BreadCrumbsPath (método de pesquisa em profundidade: por cada nível identificam-se os níveis hierarquicamente inferiores e dentro desse conjunto e a partir do primeiro, encontram-se os seus descendentes) rhRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast <GISADataset.RelacaoHierarquicaRow>().Single(r => r.ID == firstBreadCrumb.idNivel && r.IDUpper == firstBreadCrumb.idUpperNivel); var q = new Stack <GISADataset.RelacaoHierarquicaRow>(); rhRow.NivelRowByNivelRelacaoHierarquica.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquicaUpper().Where(r => r.IDTipoNivelRelacionado < 7).ToList().ForEach(r => q.Push(r)); var path = new LinkedList <GISADataset.RelacaoHierarquicaRow>(); var currentNode = path.AddFirst(rhRow); while (q.Count > 0) { rhRow = q.Pop(); // se o caminho seguido não levar ao documento pretendido, deve-se retirar todos os nós até àquele que representa o IDUpper de rhRow while (path.Last.Value.ID != rhRow.IDUpper) { path.RemoveLast(); currentNode = path.Last; } if (rhRow.ID != dr.ID) { var rhRows = rhRow.NivelRowByNivelRelacaoHierarquica.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquicaUpper() .Where(r => r.IDTipoNivelRelacionado < 7 || (r.IDTipoNivelRelacionado >= 7 && r.ID == dr.ID)).ToList(); if (rhRows.Count > 0) { currentNode = path.AddAfter(currentNode, rhRow); rhRows.ForEach(r => q.Push(r)); } } else { path.AddAfter(currentNode, rhRow); break; } } path.ToList().ForEach(rh => { var imgIndex = SharedResourcesOld.CurrentSharedResources.NivelImageBase(System.Convert.ToInt32(rh.TipoNivelRelacionadoRow.GUIOrder)); BreadCrumbsPath1.AddBreadCrumb(GISA.Model.Nivel.GetDesignacao(rh.NivelRowByNivelRelacaoHierarquica), rh.ID, rh.IDUpper, imgIndex); }); } else { // acrescentar o nivel documental na BreadCrumbsPath int imageIndex = 0; imageIndex = SharedResourcesOld.CurrentSharedResources.NivelImageBase(System.Convert.ToInt32(dr.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].TipoNivelRelacionadoRow.GUIOrder)); BreadCrumbsPath1.AddBreadCrumb(GISA.Model.Nivel.GetDesignacao(dr), dr.ID, BreadCrumbsPath1.getBreadCrumbsPathContextID, imageIndex); } ClearFilter(); ReloadList(); // Quando não existem elementos a apresentar na lista deve-se forçar uma mudança de contexto para garantir que os paineis de descrição são gravados if (this.Items.Count == 0) { lstVwPaginated_BeforeNewSelection(sender, new BeforeNewSelectionEventArgs(new ListViewItem(), true)); } else if (this.Items.Count > 1) { lstVwPaginated_BeforeNewSelection(sender, new BeforeNewSelectionEventArgs(new ListViewItem(), true)); PermissoesHelper.UpdateNivelPermissions((GISADataset.NivelRow)e.ItemToBeSelected.Tag, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); if (UpdateToolBarButtonsEvent != null) { UpdateToolBarButtonsEvent(new EventArgs()); } } e.SelectionChange = true; } else { e.SelectionChange = false; } } }
private void dragNV_Action(object sender, System.Windows.Forms.ItemDragEventArgs e) { object DragDropObject = null; GISADataset.NivelRow nRow = null; this.Cursor = Cursors.WaitCursor; if (e.Item == null) { return; } if (e.Item is GISATreeNode) { DragDropObject = (GISATreeNode)e.Item; nRow = (GISADataset.NivelRow)(((GISATreeNode)DragDropObject).NivelRow); PermissoesHelper.UpdateNivelPermissions(nRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); if (!PermissoesHelper.AllowRead) { return; } } else if (e.Item is ListViewItem) { if (this.nivelDocumentalListNavigator1.SelectedItems.Count > 1) { var lst = new List <ListViewItem>(); var dick = new Dictionary <long, ListViewItem>(); var nivelIDs = new List <long>(); var perms = new Dictionary <long, Dictionary <string, byte> >(); long tmpID; foreach (ListViewItem lvItem in this.nivelDocumentalListNavigator1.SelectedItems) { tmpID = ((GISADataset.NivelRow)lvItem.Tag).ID; nivelIDs.Add(tmpID); dick[tmpID] = lvItem; } GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { perms = PermissoesRule.Current.CalculateEffectivePermissions(nivelIDs, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID, ho.Connection); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } foreach (long idNivel in perms.Keys) { var nperm = perms[idNivel]; if (nperm.ContainsKey("Ler") && nperm["Ler"] == 1) { lst.Add(dick[idNivel]); } } DragDropObject = lst.ToArray(); } else if (e.Item != null) { DragDropObject = (ListViewItem)e.Item; nRow = (GISADataset.NivelRow)(((ListViewItem)DragDropObject).Tag); PermissoesHelper.UpdateNivelPermissions(nRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator.ID); if (!PermissoesHelper.AllowRead) { return; } } } if (DragDropObject == null) { return; } this.Cursor = Cursors.Default; Trace.WriteLine("Dragging " + DragDropObject.ToString().GetType().FullName); DoDragDrop(DragDropObject, DragDropEffects.Link); }