Beispiel #1
0
        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);
        }
Beispiel #2
0
		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);
        }
Beispiel #5
0
        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;
                }
            }
        }
Beispiel #7
0
        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);
        }