Exemplo n.º 1
0
        private void LoadVersion(int version)
        {
            this.Cursor = Cursors.WaitCursor;
            var objSimples = mCurrentODSimples[0];

            if (version > 0)
            {
                // Mostrar versão historica (e bloquear alterações)
                ObjDigSimples VersaoObjectoDigital = (ObjDigSimples)SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(objSimples.pid, objSimples.historico[version].timestamp);
                FicheirosOrderManager1.Deactivate();
                ObjectToView(VersaoObjectoDigital);
                grpODTitleAndPub.Enabled = false;
                FicheirosOrderManager1.ActivateReadOnlyMode();
            }
            else
            {
                // Mostar versão original (desbloquear alterações)
                FicheirosOrderManager1.Deactivate();
                ObjectToView(objSimples);
                grpODTitleAndPub.Enabled = true;
                if (FedoraHelper.HasObjDigWritePermission(objSimples.pid))
                {
                    FicheirosOrderManager1.DeactivateReadOnlyMode();
                }
            }

            this.Cursor = Cursors.Default;
        }
Exemplo n.º 2
0
        private void ProcessSelectionChange()
        {
            this.Cursor = Cursors.WaitCursor;

            var items = lstView.SelectedItems;

            if (items.Count != 1)
            {
                previewControl.Clear(); this.Cursor = Cursors.Default; return;
            }
            else
            {
                if (items[0].Tag.GetType() == typeof(ObjDigSimples))
                {
                    var selectedItem = (ObjDigSimples)items[0].Tag;
                    if (selectedItem == null && FedoraHelper.HasObjDigReadPermission(selectedItem.pid))
                    {
                        previewControl.Clear(); return;
                    }
                    previewControl.ShowPDF(selectedItem.pid);
                }
                else if (items[0].Tag.GetType() == typeof(Anexo))
                {
                    previewControl.ShowAnexo(items[0].Tag as Anexo);
                }
                else if (items[0].Tag.GetType() == typeof(GISADataset.ObjetoDigitalRow))
                {
                    var selectedItem = (GISADataset.ObjetoDigitalRow)items[0].Tag;
                    previewControl.ShowPDF(selectedItem.pid);
                }
            }

            this.Cursor = Cursors.Default;
        }
Exemplo n.º 3
0
 private void FormFullScreenPdf_Load(object sender, EventArgs e)
 {
     this.previewControl.Qualidade = FedoraHelper.TranslateQualityEnum(this.preSelectedQuality);
     lstView.Focus();
     if (lstView.Items.Count > 0)
     {
         lstView.selectItem(lstView.Items[0]);
     }
 }
        private void CreateDatabaseObjDigSimplesSolto(ObjDigSimples odSimples)
        {
            Debug.Assert(odSimples.guiorder > 0);
            var odRow = GisaDataSetHelper.GetInstance().ObjetoDigital.AddObjetoDigitalRow(odSimples.pid, odSimples.titulo, odSimples.publicado, odSimples.guiorder, new byte[] { }, 0);

            //PermissoesHelper.AddNewObjDigGrantPermissions(odRow, currentNivel);

            FedoraHelper.RelateODtoUI(odSimples, odRow, currentNivel.GetFRDBaseRows().Single());

            newObjects.Add(odRow, odSimples);
        }
Exemplo n.º 5
0
        private void DocumentoSimplesOrderManager1_RemoveInvoked(object sender, EventArgs e)
        {
            var result = MessageBox.Show("Tem a certeza que pretende apagar o(s) objeto(s) digital(ais) selecionado(s)?", "Apagar objeto(s) digital(ais)", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.No)
            {
                return;
            }

            // TODO: avisar se existem ods associadados a subdocumentos

            var odsSimples = new List <ObjDigSimples>();

            if (mCurrentODComp != null)
            {
                odsSimples = mCurrentODComp.objSimples;
            }
            else
            {
                odsSimples = mCurrentODSimples;
            }

            DocumentoSimplesOrderManager1.getSelectedItems().ForEach(item =>
            {
                var selectedODSimples = item.Tag as ObjDigSimples;
                var odSimples         = odsSimples.SingleOrDefault(od => od.pid.Equals(selectedODSimples.pid));
                if (odSimples != null) // se OD está com o estado "added" basta removê-lo da lista; caso contrário é necessário atualizá-lo
                {
                    odSimples.state = State.deleted;
                }

                var nRow = FedoraHelper.GetRelatedNivelDoc(selectedODSimples.pid);
                if (nRow != null)
                {
                    DocumentoSimplesOrderManager1.RefreshItem(item, "", null, "");
                    var docSimples        = new SubDocumento();
                    docSimples.nRow       = nRow;
                    docSimples.id         = nRow.ID;
                    docSimples.guiorder   = item.Index + 1;
                    docSimples.designacao = nRow.GetNivelDesignadoRows().Single().Designacao;
                    item.Tag = docSimples;
                }
                item.Remove();
            });

            UpdateODCompostoStatePublicado();
            UpdateGrpODComposto();

            if (DocumentoSimplesOrderManager1.getSelectedItems().Count == 1 && DocumentoSimplesOrderManager1.getSelectedItems()[0].Tag.GetType() == typeof(SubDocumento))
            {
                DocumentoSimplesOrderManager1.SetEditMixedMode();
            }
        }
        public override void ModelToView()
        {
            IsPopulated = false;

            if (IsReadOnlyMode)
            {
                trvODsFedora.Nodes.Clear();
                if (SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable())
                {
                    var odRows = FedoraHelper.GetObjetosDigitais(CurrentFRDBase);

                    foreach (var odRow in odRows.OrderBy(r => r.GUIOrder))
                    {
                        AddObjetoDigital(odRow);
                    }
                }
            }
            else
            {
                odHelper.currentNivel = CurrentFRDBase.NivelRow;
                odHelper.LoadData();

                controlObjetoDigital1.ViewMode         = odHelper.mContexto;
                controlObjetoDigital1.CurrentODSimples = odHelper.currentODSimples;
                controlObjetoDigital1.CurrentODComp    = odHelper.currentODComp;
                controlObjetoDigital1.docSimplesSemOD  = odHelper.docSimplesSemOD;

                switch (odHelper.mContexto)
                {
                case ObjetoDigitalFedoraHelper.Contexto.objetosDigitais:
                    //this.lblFuncao.Text = "Objetos Digitais";
                    controlObjetoDigital1.Titulo = controlObjetoDigital1.CurrentODComp != null ? controlObjetoDigital1.CurrentODComp.titulo : odHelper.currentNivel.GetNivelDesignadoRows().Single().Designacao;
                    break;

                case ObjetoDigitalFedoraHelper.Contexto.imagens:
                    //this.lblFuncao.Text = "Objeto Digital Simples";
                    controlObjetoDigital1.Titulo = odHelper.currentODSimples.Count > 0 ? odHelper.currentODSimples[0].titulo : odHelper.currentNivel.GetNivelDesignadoRows().Single().Designacao;
                    break;

                default:     // igual a ObjetoDigitalFedoraHelper.Contexto.objetosDigitais.nenhum
                    //this.lblFuncao.Text = "Objeto(s) Digital(ais) associado(s) não encontrado(s)";
                    break;
                }

                controlObjetoDigital1.ModelToView();
            }

            IsPopulated = true;
        }
Exemplo n.º 7
0
 public void Clear(bool preserveQualitySelected)
 {
     this.webBrowser.Navigate("");
     this.objectoActual      = null;
     this.isDocumentLoaded   = false;
     this.cmbQuality.Enabled = false;
     if (!preserveQualitySelected)
     {
         this.cmbQuality.SelectedItem = FedoraHelper.TranslateQualityEnum(defaultQuality);
     }
     errorLabel.Text    = "";
     errorLabel.Visible = true;
     lblFicheiro.Text   = "";
     this.Cursor        = Cursors.Default;
 }
 private void RefreshDetails(TreeNode node)
 {
     controlFedoraPdfViewer1.BringToFront();
     if (node != null && node.Nodes.Count == 0) // não mostrar pdf do composto
     {
         var odRow = node.Tag as GISADataset.ObjetoDigitalRow;
         if (FedoraHelper.HasObjDigReadPermission(odRow.pid))
         {
             this.controlFedoraPdfViewer1.ShowPDF(odRow.pid);
         }
     }
     else
     {
         ClearPreview();
     }
 }
Exemplo n.º 9
0
        public void ShowPDF(string pid)
        {
            this.cmbQuality.Enabled = true;
            this.Cursor             = Cursors.WaitCursor;
            this.objectoActual      = pid;

            var    qualidade = FedoraHelper.TranslateQualityEnum(cmbQuality.SelectedItem as string);
            bool   success;
            string errorMessage;

            string fileName = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.GetDisseminatorByUrl(pid, qualidade, out success, out errorMessage);

            if (success)
            {
                errorLabel.Visible = false;

                Uri fileUri;
                if (Uri.TryCreate(@fileName, UriKind.RelativeOrAbsolute, out fileUri))
                {
                    webBrowser.Navigate(fileUri);
                }
                else
                {
                    Clear();
                }
            }
            else
            {
                ShowError(errorMessage);
            }

            // obter o nome (do ficheiro) da primeira imagem do objeto digital
            var od = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.LoadID(pid, null) as ObjDigSimples;

            if (od != null)
            {
                lblFicheiro.Text = od.fich_associados.First().url.Split('/').Last();
            }
            else
            {
                lblFicheiro.Text = "n/d";
            }

            this.Cursor = Cursors.Default;
        }
Exemplo n.º 10
0
        public frmObjetoDigitalSimples()
        {
            InitializeComponent();
            ficheirosOrderManager1.OrderManagerSelectedIndexChangedEvent += new EventHandler <BeforeNewSelectionEventArgs>(OrderManagerSelectedIndexChangedEvent);
            ficheirosOrderManager1.FullScreenInvoked   += new EventHandler <EventArgs>(FicheirosOrderManager1_FullScreenInvoked);
            ficheirosOrderManager1.AttachedFileAdded   += new EventHandler <EventArgs>(FicheirosOrderManager1_AttachedFileAdded);
            ficheirosOrderManager1.AttachedFileDeleted += new EventHandler <EventArgs>(FicheirosOrderManager1_AttachedFileDeleted);

            versionControl.Enabled = false;

            ButtonTI.Image = SharedResourcesOld.CurrentSharedResources.ChamarPicker;
            CurrentToolTip.SetToolTip(ButtonTI, "Adicionar título predefinido");

            var configRow      = GisaDataSetHelper.GetInstance().GlobalConfig.Cast <GISADataset.GlobalConfigRow>().Single();
            var defaultQuality = configRow.IsQualidadeImagemNull() ? Quality.Low : FedoraHelper.TranslateQualityEnum(configRow.QualidadeImagem);

            this.previewControl.SetupOtherMode();
        }
Exemplo n.º 11
0
        public ControlObjetoDigital()
        {
            InitializeComponent();

            DocumentoSimplesOrderManager1.OrderManagerSelectedIndexChangedEvent += new EventHandler <BeforeNewSelectionEventArgs>(OrderManagerSelectedIndexChangedEvent);
            DocumentoSimplesOrderManager1.FullScreenInvoked += new EventHandler <EventArgs>(DocumentoSimplesOrderManager1_FullScreenInvoked);
            DocumentoSimplesOrderManager1.NewInvoked        += new EventHandler <EventArgs>(DocumentoSimplesOrderManager1_NewInvoked);
            DocumentoSimplesOrderManager1.EditInvoked       += new EventHandler <EventArgs>(DocumentoSimplesOrderManager1_EditInvoked);
            DocumentoSimplesOrderManager1.RemoveInvoked     += new EventHandler <EventArgs>(DocumentoSimplesOrderManager1_RemoveInvoked);
            FicheirosOrderManager1.OrderManagerSelectedIndexChangedEvent += new EventHandler <BeforeNewSelectionEventArgs>(OrderManagerSelectedIndexChangedEvent);
            FicheirosOrderManager1.FullScreenInvoked   += new EventHandler <EventArgs>(FicheirosOrderManager1_FullScreenInvoked);
            FicheirosOrderManager1.AttachedFileAdded   += new EventHandler <EventArgs>(FicheirosOrderManager1_AttachedFileAdded);
            FicheirosOrderManager1.AttachedFileDeleted += new EventHandler <EventArgs>(FicheirosOrderManager1_AttachedFileDeleted);

            var configRow      = GisaDataSetHelper.GetInstance().GlobalConfig.Cast <GISADataset.GlobalConfigRow>().Single();
            var defaultQuality = configRow.IsQualidadeImagemNull() ? Quality.Low : FedoraHelper.TranslateQualityEnum(configRow.QualidadeImagem);

            this.previewControl.SetupOtherMode();
        }
Exemplo n.º 12
0
        private void cmbQuality_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lastSelectedIndex == cmbQuality.SelectedIndex)
            {
                return;
            }

            lastSelectedIndex = cmbQuality.SelectedIndex;
            if (objectoActual != null)
            {
                if (objectoActual.GetType() == typeof(Anexo))
                {
                    ShowAnexo(objectoActual as Anexo);
                }
                else if (objectoActual.GetType() == typeof(String) && FedoraHelper.HasObjDigReadPermission(objectoActual as string))
                {
                    ShowPDF(objectoActual as string);
                }
            }
        }
Exemplo n.º 13
0
        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());
                }
            }
        }
Exemplo n.º 14
0
        private void btnFullScreen_Click(object sender, EventArgs e)
        {
            // Clonar a lista de nós a apresentar em modo full screen
            List <ListViewItem> clonedItemList = new List <ListViewItem>();
            var nodesList = trvODsFedora.Nodes.Count > 1 ? trvODsFedora.Nodes : trvODsFedora.Nodes[0].Nodes;

            if (trvODsFedora.Nodes.Count == 1 && nodesList.Count == 0)
            {
                var item = new ListViewItem(trvODsFedora.Nodes[0].Text)
                {
                    Tag = new ObjDigSimples()
                    {
                        pid = ((GISADataset.ObjetoDigitalRow)trvODsFedora.Nodes[0].Tag).pid
                    }
                };
                FormFullScreenPdf ecraCompleto = new FormFullScreenPdf(new List <ListViewItem>()
                {
                    item
                }, 0, FedoraHelper.TranslateQualityEnum(controlFedoraPdfViewer1.Qualidade));
                ecraCompleto.ShowDialog();
            }
            else
            {
                clonedItemList.AddRange(nodesList.Cast <TreeNode>().Select(node => new ListViewItem(node.Text)
                {
                    Tag = new ObjDigSimples()
                    {
                        pid = ((GISADataset.ObjetoDigitalRow)node.Tag).pid
                    }
                }));

                var selectedItemIndex = trvODsFedora.SelectedNode != null ? trvODsFedora.SelectedNode.Index : -1;

                // Instanciar uma janela modal para mostrar a lista clonada (passamos o identificador do objecto pai, caso exista)
                FormFullScreenPdf ecraCompleto = new FormFullScreenPdf(clonedItemList, selectedItemIndex, FedoraHelper.TranslateQualityEnum(controlFedoraPdfViewer1.Qualidade));
                ecraCompleto.ShowDialog();
            }
        }
Exemplo n.º 15
0
        public ControlFedoraPdfViewer()
        {
            InitializeComponent();

            //GISADataset.GlobalConfigRow configRow = null;
            //var defaultQuality = Quality.Low;

            var configRow = GisaDataSetHelper.GetInstance().GlobalConfig.Cast <GISADataset.GlobalConfigRow>().Single();

            defaultQuality = configRow.IsQualidadeImagemNull() ? Quality.Low : FedoraHelper.TranslateQualityEnum(configRow.QualidadeImagem);
            foreach (Quality quality in Enum.GetValues(typeof(Quality)))
            {
                var qualityString = FedoraHelper.TranslateQualityEnum(quality);
                cmbQuality.Items.Add(qualityString);
                if (quality == defaultQuality)
                {
                    cmbQuality.SelectedItem = qualityString;
                }
            }

            objectoActual    = null;
            isDocumentLoaded = false;
        }
Exemplo n.º 16
0
        private ListViewItem AddODSimplesToList(ObjDigSimples objSimples)
        {
            var hasReadPermission = true;

            if (objSimples.state != State.added)
            {
                hasReadPermission = FedoraHelper.HasObjDigReadPermission(objSimples.pid);
            }

            var item = DocumentoSimplesOrderManager1.CreateItem(FedoraHelper.GetDesignacaoUI(objSimples.pid), objSimples.titulo, objSimples.state == State.added ? "" : objSimples.pid, objSimples.publicado, objSimples);

            // marcar os objetos simples para os quais não existe permissão de leitura
            if (!hasReadPermission)
            {
                item.ForeColor = Color.Gray;
            }

            if (objSimples.state == State.notFound)
            {
                item.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, FontStyle.Italic, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0));
            }

            return(item);
        }
Exemplo n.º 17
0
        private void ShellOpenImg()
        {
            if (this.pictImagem == null)
            {
                return;
            }

            this.Cursor = Cursors.WaitCursor;
            try
            {
                string sUrl = null;
                System.Diagnostics.Process p = new System.Diagnostics.Process();

                switch (TipoAcessoRecurso)
                {
                case ResourceAccessType.Web:
                    if (((GISADataset.GlobalConfigRow)(GisaDataSetHelper.GetInstance().GlobalConfig.Select()[0])).URLBaseActivo)
                    {
                        sUrl = string.Format(((GISADataset.GlobalConfigRow)(GisaDataSetHelper.GetInstance().GlobalConfig.Select()[0])).URLBase.Replace("<id>", "{0}"), SourceLocation);
                    }
                    else
                    {
                        sUrl = SourceLocation;
                    }
                    break;

                case ResourceAccessType.Smb:
                    sUrl = SourceLocation;
                    break;

                case ResourceAccessType.Fedora:
                    var    configRow = GisaDataSetHelper.GetInstance().GlobalConfig.Cast <GISADataset.GlobalConfigRow>().Single();
                    var    qualidade = configRow.IsQualidadeImagemNull() ? Quality.Low : FedoraHelper.TranslateQualityEnum(configRow.QualidadeImagem);
                    bool   success;
                    string errorMessage;
                    sUrl = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.GetDisseminatorByUrl(SourceLocation, qualidade, out success, out errorMessage);
                    if (String.IsNullOrEmpty(sUrl) || !File.Exists(sUrl) || !success)
                    {
                        sUrl = null;
                    }
                    if (!success)
                    {
                        MessageBox.Show(errorMessage, "Repositório Digital", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                    break;

                case ResourceAccessType.DICAnexo:
                    sUrl = DocInPortoHelper.getDocInPortoAnexo(SourceLocation, OtherLocationParams);    //
                    break;

                case ResourceAccessType.DICConteudo:
                    sUrl = DocInPortoHelper.getDocInPortoConteudo(SourceLocation);
                    break;
                }

                if (sUrl != null && sUrl.Length > 0)
                {
                    p = System.Diagnostics.Process.Start(sUrl);
                }
            }
            catch (Win32Exception ex)
            {
                Trace.WriteLine(ex.ToString());
                if (ex.NativeErrorCode == 2)
                {
                    //ERROR FILE NOT FOUND
                    MessageBox.Show("O caminho especificado não é válido.", "Imagem", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            this.Cursor = Cursors.Default;
        }
Exemplo n.º 18
0
        public void ShowFullScreenMode(List <ListViewItem> itemsToDisplay, int selectedItemIndex)
        {
            // Clonar a lista de nós a apresentar em modo full screen
            List <ListViewItem> clonedItemList = new List <ListViewItem>();

            clonedItemList.AddRange(itemsToDisplay.Select(item => item.Clone() as ListViewItem));

            // Instanciar uma janela modal para mostrar a lista clonada (passamos o identificador do objecto pai, caso exista)
            FormFullScreenPdf ecraCompleto = new FormFullScreenPdf(clonedItemList, selectedItemIndex, FedoraHelper.TranslateQualityEnum(previewControl.Qualidade));

            ecraCompleto.ShowDialog();
        }
Exemplo n.º 19
0
        private static void UpdateNvlDocSimplesOrderNr(ObjDigSimples odSimples)
        {
            if (odSimples.gisa_id != null && odSimples.gisa_id.Length > 0)
            {
                var nds = GisaDataSetHelper.GetInstance().NivelDocumentoSimples.Cast <GISADataset.NivelDocumentoSimplesRow>().SingleOrDefault(r => r.RowState != DataRowState.Deleted && r.ID == FedoraHelper.GetGisaID(odSimples.gisa_id));

                if (nds != null)
                {
                    nds.GUIOrder = odSimples.guiorder;
                }
            }
        }
Exemplo n.º 20
0
        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;
                    }
                });
            }
        }
Exemplo n.º 21
0
        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();
        }
Exemplo n.º 22
0
        public void ShowFullScreenMode(List <ListViewItem> itemsToDisplay, int selectedItemIndex)
        {
            // Clonar a lista de nós a apresentar em modo full screen
            List <ListViewItem> clonedItemList = new List <ListViewItem>();
            FormFullScreenPdf   ecraCompleto   = null;

            if (mViewMode == ObjetoDigitalFedoraHelper.Contexto.imagens)
            {
                clonedItemList.AddRange(itemsToDisplay.Select(item => item.Clone() as ListViewItem));

                // Instanciar uma janela modal para mostrar a lista clonada (passamos o identificador do objeto pai, caso exista)
                ecraCompleto = new FormFullScreenPdf(clonedItemList, selectedItemIndex, FedoraHelper.TranslateQualityEnum(previewControl.Qualidade));
            }
            else
            {
                clonedItemList.AddRange(itemsToDisplay
                                        .Where(item => item.Tag.GetType() == typeof(ObjDigSimples) && FedoraHelper.HasObjDigReadPermission(((ObjDigSimples)item.Tag).pid))
                                        .Select(item => new ListViewItem(item.SubItems[DocumentoSimplesOrderManager1.colDesignacaoOD.Index].Text)
                {
                    Tag = item.Tag
                }));

                int newSelectedItemIndex = -1;
                if (selectedItemIndex >= 0)
                {
                    var od = itemsToDisplay[selectedItemIndex].Tag as ObjDigSimples;
                    newSelectedItemIndex = od == null ? -1 : clonedItemList.FindIndex(item => ((ObjDigSimples)item.Tag).pid.Equals(od.pid));
                }

                // Instanciar uma janela modal para mostrar a lista clonada (passamos o identificador do objeto pai, caso exista)
                ecraCompleto = new FormFullScreenPdf(clonedItemList, newSelectedItemIndex, FedoraHelper.TranslateQualityEnum(previewControl.Qualidade));
            }

            ecraCompleto.ShowDialog();
        }
Exemplo n.º 23
0
        public override PersistencyHelper.SaveResult Save(bool activateOpcaoCancelar)
        {
            if (this.CurrentFRDBase == null)
            {
                return(PersistencyHelper.SaveResult.unsuccessful);
            }

            List <long>   IDs         = new List <long>();
            List <string> idsToUpdate = new List <string>();
            List <NivelRule.PublicacaoDocumentos> DocsID = new List <NivelRule.PublicacaoDocumentos> ();

            GISADataset.RelacaoHierarquicaRow rhRow          = null;
            PersistencyHelper.SaveResult      successfulSave = PersistencyHelper.SaveResult.unsuccessful;

            if ((CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length > 0))
            {
                rhRow = CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0];

                PersistencyHelper.PublishSubDocumentosPreSaveArguments   psArgs1 = new PersistencyHelper.PublishSubDocumentosPreSaveArguments();
                PersistencyHelper.AvaliaDocumentosTabelaPreSaveArguments psArgs2 = new PersistencyHelper.AvaliaDocumentosTabelaPreSaveArguments();

                // publicação de subdocumentos baseado na publicação dos documentos respectivos
                if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.D)
                {
                    //contexto é um documento
                    if (CurrentFRDBase.GetSFRDAvaliacaoRows().Length > 0)
                    {
                        GISADataset.SFRDAvaliacaoRow relRow = CurrentFRDBase.GetSFRDAvaliacaoRows()[0];

                        if ((relRow.RowState == DataRowState.Added && relRow.Publicar) || relRow.RowState == DataRowState.Modified)
                        {
                            DocsID.Add(new DBAbstractDataLayer.DataAccessRules.NivelRule.PublicacaoDocumentos(CurrentFRDBase.NivelRow.ID, CurrentFRDBase.GetSFRDAvaliacaoRows()[0].Publicar));
                            IDs.Add(CurrentFRDBase.NivelRow.ID);
                            PermissoesHelper.ChangeDocPermissionPublicados(CurrentFRDBase.NivelRow.ID, (CurrentFRDBase.GetSFRDAvaliacaoRows())[0].Publicar);
                        }
                    }
                }
                else if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SR || rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SSR)
                {
                    //o contexto é uma série ou subsérie e é alterado o estado de publicação de vários documentos simultaneamente
                    foreach (GISADataset.SFRDAvaliacaoRow sfrdAv in GisaDataSetHelper.GetInstance().SFRDAvaliacao.Select("", "", DataViewRowState.Added | DataViewRowState.ModifiedCurrent))
                    {
                        if (sfrdAv.FRDBaseRow.ID != CurrentFRDBase.ID)
                        {
                            DocsID.Add(new DBAbstractDataLayer.DataAccessRules.NivelRule.PublicacaoDocumentos(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar));
                            IDs.Add(sfrdAv.FRDBaseRow.NivelRow.ID);
                            PermissoesHelper.ChangeDocPermissionPublicados(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar);
                        }
                        else
                        {
                            IDs.Add(sfrdAv.FRDBaseRow.IDNivel);
                        }
                    }

                    if (!(CurrentFRDBase.GetSFRDAvaliacaoRows().Length == 0 || CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IsIDModeloAvaliacaoNull() || (!(CurrentFRDBase.GetSFRDAvaliacaoRows()[0].RowState == DataRowState.Added) && !(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Original] == DBNull.Value) && ((long)(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Original])) == (long)(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Current]))))
                    {
                        psArgs2.frdID             = CurrentFRDBase.ID;
                        psArgs2.modeloAvaliacaoID = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IDModeloAvaliacao;
                        psArgs2.avaliacaoTabela   = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].AvaliacaoTabela;
                        if (CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IsPrazoConservacaoNull())
                        {
                            psArgs2.prazoConservacao = 0;
                        }
                        else
                        {
                            psArgs2.prazoConservacao = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].PrazoConservacao;
                        }

                        psArgs2.preservar = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].Preservar;
                    }
                }
                else
                {
                    foreach (GISADataset.SFRDAvaliacaoRow sfrdAv in GisaDataSetHelper.GetInstance().SFRDAvaliacao.Select("", "", DataViewRowState.Added | DataViewRowState.ModifiedCurrent))
                    {
                        PermissoesHelper.ChangeDocPermissionPublicados(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar);
                        IDs.Add(sfrdAv.FRDBaseRow.IDNivel);
                    }
                }

                // actualização do objecto digital caso exista ou o módulo esteja activo
                rhRow = CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First();
                var objDigital = default(ObjDigital);
                if (rhRow.IDTipoNivelRelacionado >= (long)TipoNivelRelacionado.D && SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable())
                {
                    GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
                    try
                    {
                        GisaDataSetHelper.ManageDatasetConstraints(false);
                        if (!PanelAmbitoConteudo1.IsLoaded)
                        {
                            PanelAmbitoConteudo1.LoadData(CurrentFRDBase, ho.Connection);
                        }
                        if (!PanelIndexacao1.IsLoaded)
                        {
                            PanelIndexacao1.LoadData(CurrentFRDBase, ho.Connection);
                        }
                        GisaDataSetHelper.ManageDatasetConstraints(true);
                    }
                    catch (System.Data.ConstraintException Ex)
                    {
                        Trace.WriteLine(Ex);
                        GisaDataSetHelper.FixDataSet(GisaDataSetHelper.GetInstance(), ho.Connection);
                    }
                    catch (Exception e)
                    {
                        Trace.WriteLine(e);
                        throw;
                    }
                    finally
                    {
                        ho.Dispose();
                    }

                    // verificar alterações na tipologia e indexação
                    var tipologia = string.Empty;
                    var hasNewTip = Nivel.HasTipologiaChanged(CurrentFRDBase, out tipologia);
                    var assuntos  = Nivel.HasIndexacaoChanged(CurrentFRDBase);

                    if (hasNewTip || assuntos != null)
                    {
                        objDigital = FedoraHelper.UpdateTipAssuntos(CurrentFRDBase.NivelRow, hasNewTip ? tipologia : null, assuntos);
                    }
                }

                // actualizar objecto digital caso exista
                var preTransactionAction = new PreTransactionAction();
                var fedArgs = new PersistencyHelper.FedoraIngestPreTransactionArguments();
                preTransactionAction.args = fedArgs;

                preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs)
                {
                    var    odComp        = this.PanelObjetoDigitalFedora1.GetObjDigitalComp();
                    var    odSimples     = this.PanelObjetoDigitalFedora1.GetObjDigitalSimples();
                    bool   ingestSuccess = true;
                    string msg           = null;

                    if (odComp != null)
                    {
                        ingestSuccess = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(odComp, out msg);
                    }
                    else if (odSimples != null && odSimples.Count > 0)
                    {
                        odSimples.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg));
                    }

                    if (ingestSuccess)
                    {
                        this.PanelObjetoDigitalFedora1.odHelper.newObjects.Keys.ToList().ForEach(k => { k.pid = this.PanelObjetoDigitalFedora1.odHelper.newObjects[k].pid; });
                    }

                    preTransactionArgs.cancelAction = !ingestSuccess;
                    preTransactionArgs.message      = msg;
                };

                psArgs1.DocsID = DocsID;

                PostSaveAction postSaveAction = new PostSaveAction();
                PersistencyHelper.UpdatePermissionsPostSaveArguments argsPSAction = new PersistencyHelper.UpdatePermissionsPostSaveArguments();
                argsPSAction.NiveisIDs = IDs;
                argsPSAction.TrusteeID = PermissoesHelper.GrpAcessoPublicados.ID;
                postSaveAction.args    = argsPSAction;

                postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs)
                {
                    if (!postSaveArgs.cancelAction && argsPSAction.NiveisIDs.Count > 0)
                    {
                        if (psArgs1 != null)
                        {
                            idsToUpdate = psArgs1.idsToUpdate;
                        }
                    }
                };

                PersistencyHelper.AvaliacaoPublicacaoPreSaveArguments args = new PersistencyHelper.AvaliacaoPublicacaoPreSaveArguments();
                args.psArgs1 = psArgs1;
                args.psArgs2 = psArgs2;

                successfulSave = PersistencyHelper.save(AvaliacaoPublicacao, args, postSaveAction, preTransactionAction, activateOpcaoCancelar);
            }
            else
            {
                successfulSave = PersistencyHelper.save();
            }

            if (successfulSave == PersistencyHelper.SaveResult.successful)
            {
                GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
                try
                {
                    if (CurrentFRDBase.NivelRow.IDTipoNivel == TipoNivel.DOCUMENTAL)
                    {
                        if (idsToUpdate == null)
                        {
                            idsToUpdate = new List <string>();
                        }
                        idsToUpdate.Add(CurrentFRDBase.NivelRow.ID.ToString());
                        GISA.Search.Updater.updateNivelDocumental(idsToUpdate);
                    }
                    ((frmMain)TopLevelControl).SetServerStatus();
                }
                catch (GISA.Search.UpdateServerException)
                {
                    ((frmMain)TopLevelControl).SetServerStatus();
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex.ToString());
                    throw;
                }
                finally
                {
                    ho.Dispose();
                }
            }

            return(successfulSave);
        }
Exemplo n.º 24
0
        private void ActivatePanelStatusObjDigitais(bool resetOrder)
        {
            pxDataGridView1.DataSource = null;
            if (resetOrder)
            {
                pxDataGridView1.ResetOrder();
            }

            List <ObjectoDigitalStatusRule.ObjectoDigitalStatusInfo> list_status =
                new List <ObjectoDigitalStatusRule.ObjectoDigitalStatusInfo>();

            GisaDataSetHelper.ManageDatasetConstraints(false);
            long calc = DateTime.Now.Ticks;

            GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
            try
            {
                long t1 = DateTime.Now.Ticks;
                list_status = ObjectoDigitalStatusRule.Current.GetObjectoDigitalStatusInfo(ho.Connection, this.pxDataGridView1.GetListSortDef());
                Debug.WriteLine("<<GetObjectoDigitalStatusInfo>>: " + new TimeSpan(DateTime.Now.Ticks - t1).ToString());
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.ToString());
                throw ex;
            }
            finally
            {
                ho.Dispose();
            }
            GisaDataSetHelper.ManageDatasetConstraints(true);

            long t2 = DateTime.Now.Ticks;

            StatusObjDigitalDataTable.BeginLoadData();
            StatusObjDigitalDataTable.Clear();
            foreach (var status in list_status)
            {
                var row = StatusObjDigitalDataTable.NewRow();
                row[PID]       = status.pid;
                row[TITULO]    = status.titulo;
                row[QUALIDADE] = FedoraHelper.TranslateQualityEnumEn(status.quality);
                row[ESTADO]    = TranslateState(status.state);
                if (!status.date.Equals(DateTime.MinValue))
                {
                    row[DATA] = status.date;
                }
                else
                {
                    row[DATA] = "";
                }
                row[IDNIVEL]     = status.idNivel;
                row[TITULONIVEL] = status.designacaoNivel;
                StatusObjDigitalDataTable.Rows.Add(row);
            }
            StatusObjDigitalDataTable.EndLoadData();
            StatusObjDigitalDataTable.AcceptChanges();
            this.pxDataGridView1.DataSource = StatusObjDigitalDataTable;

            Debug.WriteLine("<<t2>>: " + new TimeSpan(DateTime.Now.Ticks - t2).ToString());
        }
Exemplo n.º 25
0
        private void OrderManagerSelectedIndexChangedEvent(object sender, BeforeNewSelectionEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;

            try
            {
                if (sender == DocumentoSimplesOrderManager1)
                {
                    var item       = e.ItemToBeSelected;
                    var selectedOD = default(ObjDigital);
                    if (item != null && item.Tag != null)
                    {
                        selectedOD = item.Tag as ObjDigital;
                    }
                    else
                    {
                        // Limpar browser se nada estiver seleccionado
                        var items = DocumentoSimplesOrderManager1.getTrulySelectedItems();
                        if (items.Count != 1)
                        {
                            previewControl.Clear(true); DocumentoSimplesOrderManager1.updateToolBarButtons(); return;
                        }
                        selectedOD = items[0].Tag as ObjDigital;
                    }

                    if (selectedOD == null || (selectedOD != null && selectedOD.state == State.added))
                    {
                        previewControl.Clear(); DocumentoSimplesOrderManager1.updateToolBarButtons(); return;
                    }

                    if (!FedoraHelper.HasObjDigWritePermission(selectedOD.pid))
                    {
                        DocumentoSimplesOrderManager1.ActivateReadOnlyMode();
                    }
                    else
                    {
                        DocumentoSimplesOrderManager1.DeactivateReadOnlyMode();
                    }

                    if (FedoraHelper.HasObjDigReadPermission(selectedOD.pid))
                    {
                        previewControl.Clear(true);
                        previewControl.ShowPDF(selectedOD.pid);
                    }
                    else
                    {
                        previewControl.Clear(true);
                    }

                    if (disableSave)
                    {
                        DocumentoSimplesOrderManager1.DisableToolBar();
                    }
                }
                else if (sender == FicheirosOrderManager1)
                {
                    var item = e.ItemToBeSelected;
                    if (item != null && item.Tag != null)
                    {
                        previewControl.ShowAnexo(item.Tag as Anexo);
                    }
                    else
                    {
                        var items = FicheirosOrderManager1.getTrulySelectedItems();
                        if (items.Count != 1)
                        {
                            previewControl.Clear(true); return;
                        }

                        previewControl.ShowAnexo(items[0].Tag as Anexo);
                    }
                    FicheirosOrderManager1.updateToolBarButtons();
                }
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }
Exemplo n.º 26
0
        public void ModelToView()
        {
            grpNiveisOrObjFed.Visible = true;

            if (mViewMode == ObjetoDigitalFedoraHelper.Contexto.objetosDigitais)
            {
                grpODTitleAndPub.Enabled = true;
                // configurar check que permite criar ou não um OD composto
                chkKeepODComposto.Visible = true;
                chkPublicar.Enabled       = false;

                txtTitulo.Text = mTitulo;

                // configurar lista de ODs
                DocumentoSimplesOrderManager1.Visible = true;

                var itemsToBeAdded = new List <ListViewItem>();
                if (mCurrentODComp != null)
                {
                    chkPublicar.Checked = mCurrentODComp.publicado;
                    mCurrentODComp.objSimples.ForEach(objSimples => itemsToBeAdded.Add(AddODSimplesToList(objSimples)));
                }
                else
                {
                    mCurrentODSimples.ForEach(objSimples => itemsToBeAdded.Add(AddODSimplesToList(objSimples)));
                }

                // adicionar os subdocumentos sem objeto digital à lista
                docSimplesSemOD.ForEach(docSimples =>
                {
                    if ((int)docSimples.guiorder - 1 < itemsToBeAdded.Count)
                    {
                        itemsToBeAdded.Insert((int)docSimples.guiorder - 1, AddDocSimplesToList(docSimples));
                    }
                    else
                    {
                        itemsToBeAdded.Add(AddDocSimplesToList(docSimples));
                    }
                });


                if (itemsToBeAdded.Count > 0)
                {
                    DocumentoSimplesOrderManager1.populateItems(itemsToBeAdded);
                    DocumentoSimplesOrderManager1.selectFirst();
                }

                if (itemsToBeAdded.Count(lvi => lvi.Tag.GetType() == typeof(ObjDigital) && ((ObjDigital)lvi.Tag).state == State.notFound) > 0)
                {
                    disableSave = true;
                    DocumentoSimplesOrderManager1.DisableToolBar();
                    grpODTitleAndPub.Enabled  = false;
                    chkKeepODComposto.Enabled = false;
                    MessageBox.Show("A unidade informacional selecionada tem associado(s) objeto(s) " + System.Environment.NewLine +
                                    "digital(ais) o(s) qual(ais) não foi possivel obter do repositório. " + System.Environment.NewLine +
                                    "Por esse motivo não será possível efetuar qualquer alteração nesta área. " + System.Environment.NewLine +
                                    "Contacte o administrador de sistemas.", "Objeto(s) digital(ais) não encontrado(s)", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else if (itemsToBeAdded.Count > 0 && itemsToBeAdded[0].Tag.GetType() == typeof(SubDocumento))
                {
                    DocumentoSimplesOrderManager1.SetEditMixedMode();
                }
                else
                {
                    DocumentoSimplesOrderManager1.updateToolBarButtons();
                }

                UpdateGrpODComposto();
            }
            else if (mViewMode == ObjetoDigitalFedoraHelper.Contexto.imagens)
            {
                chkKeepODComposto.Visible      = false;
                FicheirosOrderManager1.Visible = true;
                FicheirosOrderManager1.updateToolBarButtons();
                grpNiveisOrObjFed.Visible      = true;
                versionControl.Visible         = true;
                chkPublicar.Enabled            = true;
                txtTitulo.Enabled              = true;
                txtTitulo.Text                 = mTitulo;
                FicheirosOrderManager1.Enabled = true;
                versionControl.Enabled         = true;

                if (mCurrentODSimples.Count == 0)
                {
                    grpODTitleAndPub.Enabled = false;
                    versionControl.Reset();
                    versionControl.Enabled = false;
                    return;
                }

                var odSimples = mCurrentODSimples[0];
                txtTitulo.Text      = odSimples.titulo;
                chkPublicar.Checked = odSimples.publicado;

                if (!FedoraHelper.HasObjDigReadPermission(odSimples.pid))
                {
                    FicheirosOrderManager1.Enabled = false; return;
                }

                var itemsToBeAdded = new List <ListViewItem>();
                odSimples.fich_associados.ForEach(f =>
                {
                    var datastream = f as Anexo;
                    var item       = FicheirosOrderManager1.CreateItem(datastream.url, datastream);
                    itemsToBeAdded.Add(item);
                });

                versionControl.Load(odSimples);

                if (!FedoraHelper.HasObjDigWritePermission(odSimples.pid))
                {
                    FicheirosOrderManager1.ActivateReadOnlyMode();
                }
            }
            else
            {
                grpNiveisOrObjFed.Visible = false;
            }
        }
Exemplo n.º 27
0
        private void RemoveNivel()
        {
            GISADataset.NivelRow nUpperRow          = null;
            GISADataset.RelacaoHierarquicaRow rhRow = null;
            GISADataset.NivelRow nRow = null;


            nRow = this.nivelNavigator1.SelectedNivel;
            // Verificar se a relacção hierárquica ainda é a mesma apresentada na interface (se o
            // utilizador estiver a ver a lista que contem o nível a apagar e entretanto outro utilizador
            // o ter colocado noutro ponto da árvore, a relação hierárquica presente em memória deixa
            // de corresponder com aquela que é apresentada na interface quando esse nível é selecionado;
            // quando o nível é selecionado a informação no DataSet de trabalho é actualizado mas não
            // actualiza a interface)
            if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", nRow.ID, this.nivelNavigator1.ContextBreadCrumbsPathID)).Length > 0)
            {
                rhRow = (GISADataset.RelacaoHierarquicaRow)(GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", nRow.ID, this.nivelNavigator1.ContextBreadCrumbsPathID))[0]);
            }
            else
            {
                MessageBox.Show("Esta operação não pode ser concluída pelo facto de a localização na estrutura " + System.Environment.NewLine + "do nível selecionado ter sido alterada por outro utilizador.", "Eliminar Nível", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            nUpperRow = (GISADataset.NivelRow)(GisaDataSetHelper.GetInstance().Nivel.Select(string.Format("ID={0}", this.nivelNavigator1.ContextBreadCrumbsPathID))[0]);

            var assocODs = FedoraHelper.GetAssociatedODsDetailsMsg(nRow.ID);

            if (assocODs.Length > 0)
            {
                FormDeletionReport form = new FormDeletionReport();
                form.Text         = "Eliminação de unidade de informação";
                form.Interrogacao = "A unidade de informação selecionada tem objeto(s) digital(ais) associado(s). " + System.Environment.NewLine +
                                    "Se eliminar esta unidade de informação, os objeto(s) digital(ais) " + System.Environment.NewLine + " também serão eliminado(s)." + System.Environment.NewLine +
                                    "Pretende continuar?";
                form.Detalhes = assocODs;

                if (form.ShowDialog() == DialogResult.Cancel)
                {
                    return;
                }
            }
            else if (MessageBox.Show("Tem a certeza que deseja eliminar o nível selecionado?", "Eliminação de relação", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
            {
                return;
            }

            if (!FedoraHelper.CanDeleteODsAssociated2UI(nRow, out objetoDigital))
            {
                return;
            }

            Trace.WriteLine("A apagar nível...");

            if (TipoNivel.isNivelDocumental(nRow) && TipoNivel.isNivelOrganico(nUpperRow))
            {
                // Verificar que existem várias relações hierárquicas deste
                // nível documental a entidades produtoras superiores. Nesse
                // caso deverá ser removida a relação, caso contrário, se não
                // existirem subníveis documentais, será eliminado o próprio
                // nível(documental)
                int numRHs = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length;
                if (numRHs > 1)
                {
                    if (MessageBox.Show(
                            "Por favor tenha em atenção que são vários os produtores deste " + System.Environment.NewLine +
                            "nível documental. O nível documental propriamente dito não " + System.Environment.NewLine +
                            "será eliminado, apenas a sua relação ao nível orgânico " + System.Environment.NewLine +
                            "superior o será.", "Eliminação de relação", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
                    {
                        return;
                    }

                    ((frmMain)TopLevelControl).EnterWaitMode();

                    CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]);

                    PersistencyHelper.canDeleteRHRowPreConcArguments args = new PersistencyHelper.canDeleteRHRowPreConcArguments();
                    args.nRowID       = nRow.ID;
                    args.nUpperRowID  = nUpperRow.ID;
                    args.rhRowID      = rhRow.ID;
                    args.rhRowIDUpper = rhRow.IDUpper;
                    PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.verifyIfCanDeleteRH, args);
                    PersistencyHelper.cleanDeletedData(PersistencyHelper.determinaNuvem("RelacaoHierarquica"));
                    if (args.deleteSuccessful)
                    {
                        if (successfulSave == PersistencyHelper.SaveResult.successful)
                        {
                            List <string> IDNiveis = new List <string>();
                            IDNiveis.Add(args.nRowID.ToString());
                            GISA.Search.Updater.updateNivelDocumental(IDNiveis);
                            GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID);
                        }
                        this.nivelNavigator1.RemoveSelectedLVItem();
                    }
                    else
                    {
                        MessageBox.Show(args.message, "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                    ((frmMain)TopLevelControl).LeaveWaitMode();
                }
                else if (numRHs == 1)
                {
                    // Verificar que não existem subníveis documentais
                    int numSubRHs = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("IDUpper={0}", nRow.ID)).Length;
                    if (numSubRHs > 0)
                    {
                        MessageBox.Show("Só é possível eliminar os níveis que não tenham outros directamente associados", "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    else
                    {
                        if (MessageBox.Show(
                                "Por favor tenha em atenção que este nível documental é produzido" + System.Environment.NewLine +
                                "por apenas uma entidade. Ao remover esta relação será perdida " + System.Environment.NewLine +
                                "não só a relação como o nível documental propriamente dito.", "Eliminação de relação", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
                        {
                            return;
                        }

                        ((frmMain)TopLevelControl).EnterWaitMode();

                        CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]);

                        PersistencyHelper.canDeleteRHRowPreConcArguments argsPca = new PersistencyHelper.canDeleteRHRowPreConcArguments();
                        argsPca.nRowID       = nRow.ID;
                        argsPca.nUpperRowID  = nUpperRow.ID;
                        argsPca.rhRowID      = 0;
                        argsPca.rhRowIDUpper = 0;
                        PersistencyHelper.DeleteIDXPreSaveArguments argsPsa = new PersistencyHelper.DeleteIDXPreSaveArguments();
                        argsPsa.ID = nRow.ID;

                        // actualizar objecto digital caso exista
                        var preTransactionAction = new PreTransactionAction();
                        var args = new PersistencyHelper.FedoraIngestPreTransactionArguments();
                        preTransactionAction.args = args;

                        preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs)
                        {
                            bool   ingestSuccess = true;
                            string msg           = null;

                            var odsToIngest = FedoraHelper.DeleteObjDigital(nRow);
                            odsToIngest.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg));

                            preTransactionArgs.cancelAction = !ingestSuccess;
                            preTransactionArgs.message      = msg;
                        };

                        PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.verifyIfCanDeleteRH, argsPca, Nivel.DeleteNivelXInDataBase, argsPsa, preTransactionAction);
                        if (argsPca.deleteSuccessful)
                        {
                            if (successfulSave == PersistencyHelper.SaveResult.successful)
                            {
                                List <string> IDNiveis = new List <string>();
                                IDNiveis.Add(nRow.ID.ToString());
                                GISA.Search.Updater.updateNivelDocumental(IDNiveis);
                                GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID);
                            }
                            this.nivelNavigator1.RemoveSelectedLVItem();
                        }
                        else
                        {
                            // se o nível a eliminar se tratar de uma série ou documento solto mas que
                            // por motivos de conflito de concorrência não foi possível executar,
                            // o refrescamento dos botões é feito tendo como o contexto o próprio
                            // nível que se pretendeu eliminar para desta forma o estado dos mesmos
                            // estar correcta (caso contrário o estado dos botões referir-se-ia a
                            // não haver qualquer item selecionado
                            MessageBox.Show(argsPca.message, "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            UpdateToolBarButtons(this.nivelNavigator1.SelectedItems[0]);
                        }
                        PersistencyHelper.cleanDeletedData(new List <TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("RelacaoHierarquica"), PersistencyHelper.determinaNuvem("FRDBase"), PersistencyHelper.determinaNuvem("ObjetoDigital") }));

                        ((frmMain)TopLevelControl).LeaveWaitMode();
                    }
                }
                else
                {
                    Debug.Assert(false, "Should never happen. There must be a relation with an upper Nivel.");
                }
            }
            else
            {
                // Entre todos os outros tipos de nível proceder normalmente
                if ((nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDTipoNivelRelacionado == TipoNivelRelacionado.D ||
                     nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDTipoNivelRelacionado == TipoNivelRelacionado.SD) &&
                    NiveisHelper.NivelFoiMovimentado(nRow.ID))
                {
                    if (MessageBox.Show(
                            "Por favor tenha em atenção que este nível documental já foi " + System.Environment.NewLine +
                            "requisitado/devolvido. Ao remover nível documental serão perdidos " + System.Environment.NewLine +
                            "todos os seus registos referentes a requisições e devoluções.", "Eliminação de nível documental", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
                    {
                        return;
                    }
                }

                ((frmMain)TopLevelControl).EnterWaitMode();

                CurrentContext.RaiseRegisterModificationEvent(nRow.GetFRDBaseRows()[0]);

                PersistencyHelper.canDeleteRHRowPreConcArguments argsPca = new PersistencyHelper.canDeleteRHRowPreConcArguments();
                argsPca.nRowID       = nRow.ID;
                argsPca.nUpperRowID  = nUpperRow.ID;
                argsPca.rhRowID      = 0;
                argsPca.rhRowIDUpper = 0;
                PersistencyHelper.DeleteIDXPreSaveArguments argsPsa = new PersistencyHelper.DeleteIDXPreSaveArguments();
                argsPsa.ID = nRow.ID;

                // actualizar objecto digital caso exista
                var preTransactionAction = new PreTransactionAction();
                var args = new PersistencyHelper.FedoraIngestPreTransactionArguments();
                preTransactionAction.args = args;

                preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs)
                {
                    bool   ingestSuccess = true;
                    string msg           = null;

                    var odsToIngest = FedoraHelper.DeleteObjDigital(nRow);
                    odsToIngest.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg));

                    preTransactionArgs.cancelAction = !ingestSuccess;
                    preTransactionArgs.message      = msg;
                };

                PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.verifyIfCanDeleteRH, argsPca, Nivel.DeleteNivelXInDataBase, argsPsa, preTransactionAction);
                PersistencyHelper.cleanDeletedData(new List <TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("RelacaoHierarquica"), PersistencyHelper.determinaNuvem("FRDBase") }));
                if (argsPca.deleteSuccessful)
                {
                    if (successfulSave == PersistencyHelper.SaveResult.successful)
                    {
                        List <string> IDNiveis = new List <string>();
                        IDNiveis.Add(argsPsa.ID.ToString());
                        GISA.Search.Updater.updateNivelDocumental(IDNiveis);
                        if (nRow.RowState == DataRowState.Detached)
                        {
                            GISA.Search.Updater.updateNivelDocumentalComProdutores(argsPsa.ID);
                        }
                        else
                        {
                            GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID);
                        }

                        this.nivelNavigator1.RemoveSelectedLVItem();
                    }
                }
                else
                {
                    MessageBox.Show(argsPca.message, "Eliminação de relação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

                ((frmMain)TopLevelControl).LeaveWaitMode();
            }

            UpdateToolBarButtons();
        }
Exemplo n.º 28
0
        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);
        }