public void Deactivate()
 {
     mContexto                   = ObjetoDigitalFedoraHelper.Contexto.nenhum;
     currentODComp               = null;
     currentODSimples            = null;
     currentObjetoDigitalRow     = null;
     currentObjetoDigitalRowComp = null;
     docSimplesSemOD             = null;
     newObjects.Clear();
 }
        private void CreateDatabaseObjDigSimples(ObjDigComposto odComp, GISADataset.ObjetoDigitalRow odRowComp, ObjDigSimples odSimples)
        {
            Debug.Assert(odComp != null);
            Debug.Assert(odSimples != null);
            Debug.Assert(odRowComp != null && odRowComp.RowState != DataRowState.Deleted);

            var orderNr = odComp.objSimples.IndexOf(odSimples);
            var odRow   = GisaDataSetHelper.GetInstance().ObjetoDigital.AddObjetoDigitalRow(odSimples.pid, odSimples.titulo, odSimples.publicado, (orderNr + 1), new byte[] { }, 0);


            GisaDataSetHelper.GetInstance().ObjetoDigitalRelacaoHierarquica.AddObjetoDigitalRelacaoHierarquicaRow(odRow, odRowComp, new byte[] { }, 0);
            //PermissoesHelper.AddNewObjDigGrantPermissions(odRow, currentNivel);

            newObjects.Add(odRow, odSimples);
        }
        private static void UpdateObjSimples(ObjDigComposto odComposto, ObjDigSimples odSimples, List <Anexo> anexos, string titulo, bool publicado)
        {
            if (anexos.Count != odSimples.fich_associados.Count)
            {
                odSimples.fich_associados.Clear();
                odSimples.fich_associados.AddRange(anexos);
                odSimples.state = odSimples.state != State.added ? State.modified : State.added;

                if (odComposto != null)
                {
                    odComposto.state = State.poked;
                }
            }
            else
            {
                for (int i = 0; i < anexos.Count; i++)
                {
                    if (!anexos[i].url.Equals(odSimples.fich_associados[i].url))
                    {
                        odSimples.fich_associados[i] = anexos[i];
                        odSimples.state = odSimples.state != State.added ? State.modified : State.added;

                        if (odComposto != null && odComposto.state == State.unchanged)
                        {
                            odComposto.state = State.poked;
                        }
                    }
                }
            }

            if (!odSimples.titulo.Equals(titulo) || odSimples.publicado != publicado)
            {
                odSimples.titulo    = titulo.Length > 0 ? titulo : odSimples.titulo;
                odSimples.publicado = publicado;
                odSimples.state     = odSimples.state != State.added ? State.modified : State.added;

                if (odComposto != null)
                {
                    odComposto.state = odComposto.state != State.added ? State.modified : State.added;
                }
            }
        }
        private void AddOrRemoveODRelations(ObjDigComposto odComp, ObjDigSimples odSimples, GISADataset.ObjetoDigitalRow odRow)
        {
            var frdRow = currentNivel.GetFRDBaseRows().Single();

            if (odComp.state == State.added)
            {
                var imgODRow = odRow.GetSFRDImagemObjetoDigitalRows().SingleOrDefault(r => r.IDFRDBase == frdRow.ID);
                if (imgODRow != null) // esta row é nula no caso dos ODs Simples associados a subdocumentos
                {
                    imgODRow.SFRDImagemRowParent.Delete();
                    imgODRow.Delete();
                }
                GisaDataSetHelper.GetInstance().ObjetoDigitalRelacaoHierarquica.AddObjetoDigitalRelacaoHierarquicaRow(odRow, currentObjetoDigitalRowComp, new byte[] { }, 0);
            }
            else if (odComp.state == State.deleted)
            {
                if (odRow.GetSFRDImagemObjetoDigitalRows().Count() == 0) // se se tratar de um od simples sem estar relacionado com um subdocumento cria-se relacao com a UI selecionada
                {
                    FedoraHelper.RelateODtoUI(odSimples, odRow, currentNivel.GetFRDBaseRows().Single());
                }
            }
        }
        public void Deactivate()
        {
            DocumentoSimplesOrderManager1.Deactivate();
            DocumentoSimplesOrderManager1.Visible = false;
            FicheirosOrderManager1.Deactivate();
            FicheirosOrderManager1.Visible = false;
            versionControl.Visible         = false;
            mViewMode         = ObjetoDigitalFedoraHelper.Contexto.nenhum;
            mCurrentODComp    = null;
            mCurrentODSimples = null;
            previewControl.Clear();
            newObjects.Clear();
            GUIHelper.GUIHelper.clearField(txtTitulo);
            GUIHelper.GUIHelper.clearField(chkPublicar);

            disableSave = false;

            // Garantir que apagamos os JPGs e PDFs (e TMPs) todos que possam ter sido descarregados durante este contexto
            ImageHelper.DeleteFilteredFiles("*.jpg");
            ImageHelper.DeleteFilteredFiles("*.tmp");
            ImageHelper.DeleteFilteredFiles("*.pdf");
        }
        private void ViewToModelObjsSimples(List <ObjDigSimples> odsSimples, ObjDigComposto odComp, GISADataset.ObjetoDigitalRow odRowComp)
        {
            odsSimples.ForEach(odSimples =>
            {
                var odRow = default(GISADataset.ObjetoDigitalRow);
                switch (odSimples.state)
                {
                case State.added:
                    if (odComp != null && odComp.state != State.deleted)
                    {
                        CreateDatabaseObjDigSimples(odComp, odRowComp, odSimples);
                    }
                    else
                    {
                        CreateDatabaseObjDigSimplesSolto(odSimples);
                    }
                    break;

                case State.modified:
                    odRow           = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.RowState != DataRowState.Deleted && r.pid.Equals(odSimples.pid));
                    odRow.Titulo    = odSimples.titulo;
                    odRow.Publicado = odSimples.publicado;
                    odRow.GUIOrder  = odSimples.guiorder;

                    UpdateNvlDocSimplesOrderNr(odSimples);

                    if (odComp != null)
                    {
                        AddOrRemoveODRelations(odComp, odSimples, odRow);
                    }
                    break;

                case State.deleted:
                    odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.RowState != DataRowState.Deleted && r.pid.Equals(odSimples.pid));
                    FedoraHelper.DeleteObjDigitalRows(odRow);
                    break;

                case State.unchanged:     // apanhar o caso de a ordem do OD Simples ter mudado
                    odRow          = GisaDataSetHelper.GetInstance().ObjetoDigital.Cast <GISADataset.ObjetoDigitalRow>().Single(r => r.RowState != DataRowState.Deleted && r.pid.Equals(odSimples.pid));
                    odRow.GUIOrder = odSimples.guiorder;

                    UpdateNvlDocSimplesOrderNr(odSimples);

                    if (odComp != null)
                    {
                        AddOrRemoveODRelations(odComp, odSimples, odRow);
                    }
                    break;
                }
            });

            // atualizar a tipologia e assuntos dos objetos simples
            // - se houver um objeto composto, nenhum dos seus simples não pode ter tipologia e assuntos definidos
            // - se não houver um objeto composto:
            //   * se o nro de objetos simples for um, então esse objeto simples pode ter tipologia e assuntos definidos
            //   * se o nro de objetos simples for maior que um, então nenhum desses objetos pode ter tipologia e assuntos definidos
            if (odComp == null || odComp.state == State.deleted)
            {
                var ods = odsSimples.Where(od => od.state != State.deleted);
                if (ods.Count() == 1)
                {
                    var odSimples = ods.Single();
                    var frdRow    = currentNivel.GetFRDBaseRows().Single();
                    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();
                    }
                }
                else
                {
                    odsSimples.Where(od => od.state != State.deleted).ToList().ForEach(od =>
                    {
                        od.tipologia = "";
                        od.assuntos.Clear();
                        if (od.state == State.unchanged)
                        {
                            od.state = State.modified;
                        }
                    });
                }
            }
            else
            {
                odsSimples.Where(od => od.state != State.deleted).ToList().ForEach(od =>
                {
                    od.tipologia = "";
                    od.assuntos.Clear();
                    if (od.state == State.unchanged)
                    {
                        od.state = State.modified;
                    }
                });
            }
        }
        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()
        {
            if (mViewMode == ObjetoDigitalFedoraHelper.Contexto.objetosDigitais)
            {
                // neste modo não deveria haver qualquer mudança neste ponto
                if (disableSave)
                {
                    return;
                }

                if (mCurrentODComp == null)
                {
                    var hasChanges = false;
                    UpdateObjectsList(ref mCurrentODSimples, out hasChanges);

                    if (chkKeepODComposto.Checked && mCurrentODSimples.Count > 0)
                    {
                        mCurrentODComp       = new ObjDigComposto();
                        mCurrentODComp.state = State.added;
                        mCurrentODComp.pid   = "-1";
                        mCurrentODComp.objSimples.AddRange(mCurrentODSimples);
                        mCurrentODComp.titulo = mTitulo;
                        UpdateODSimplesParentTitle(mTitulo);
                        mCurrentODComp.publicado = chkPublicar.Checked;
                    }
                }
                else
                {
                    // actualizar ODs simples sem se considerar o OD Composto
                    var hasChanges = false;
                    UpdateObjectsList(ref mCurrentODComp.objSimples, out hasChanges);
                    if (hasChanges)
                    {
                        mCurrentODComp.state = State.modified;
                    }

                    mCurrentODComp.publicado = chkPublicar.Checked;

                    if (!chkKeepODComposto.Checked)
                    {
                        // foi decidido não manter o OD Composto
                        mCurrentODComp.state = State.deleted;
                        UpdateODSimplesParentTitle("");
                    }
                    else if (!mCurrentODComp.titulo.Equals(txtTitulo.Text))
                    {
                        mCurrentODComp.titulo = txtTitulo.Text;
                        mCurrentODComp.state  = State.modified;
                    }
                }
            }
            else if (mViewMode == ObjetoDigitalFedoraHelper.Contexto.imagens)
            {
                var items = FicheirosOrderManager1.Items();
                if (mCurrentODSimples.Count == 0)
                {
                    if (items.Count == 0)
                    {
                        return;
                    }
                    else
                    {
                        var odSimples = new ObjDigSimples();
                        odSimples.state = State.added;
                        odSimples.pid   = "-1";
                        odSimples.fich_associados.AddRange(items.Select(i => i.Tag as Anexo));
                        odSimples.nextDatastreamId = 1;
                        odSimples.gisa_id          = "-1";
                        odSimples.titulo           = txtTitulo.Text.Trim().Length == 0 ? mTitulo : txtTitulo.Text.Trim();
                        odSimples.publicado        = chkPublicar.Checked;

                        if (mCurrentODComp != null)
                        {
                            mCurrentODComp.state = State.modified;
                            // o objeto digital será adicionado ao composto no ModelToView do SlavePanelFedora
                            //mCurrentODComp.objSimples.Add(odSimples);
                        }

                        mCurrentODSimples = new List <ObjDigSimples>()
                        {
                            odSimples
                        };
                    }
                }
                else
                {
                    var odSimples = mCurrentODSimples[0];

                    if (items.Count == 0)
                    {
                        // objeto simples sem ficheiros
                        odSimples.state = State.deleted;
                        if (mCurrentODComp != null)
                        {
                            mCurrentODComp.state = ((ObjDigComposto)mCurrentODComp).objSimples.Count(od => od.state != State.deleted) > 1 ? State.modified : State.deleted;
                        }
                    }
                    else
                    {
                        // actualizar a ordem dos ficheiros dentro do objeto digital simples
                        var anexos = items.Select(i => i.Tag as Anexo).ToList();
                        UpdateObjSimples(mCurrentODComp, odSimples, anexos, txtTitulo.Text, chkPublicar.Checked);
                        // actualizar estado publicado do documento composto caso exista

                        if (mCurrentODComp != null)
                        {
                            mCurrentODComp.publicado = mCurrentODComp.objSimples.FirstOrDefault(od => od.publicado) != null;
                        }
                    }
                }
            }
        }