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 Listview_DeeperLevelSelection(object sender, DeeperLevelSelectionEventArgs e) { if (DeeperLevelSelection != null) DeeperLevelSelection(sender, e); }