Imports System.ComponentModel Imports System.IO Imports DevExpress.Export.Xl Imports DevExpress.Utils.Drawing Imports DevExpress.XtraEditors Imports DevExpress.XtraExport.Helpers Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraSplashScreen Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Imports EnvelopeGenerator.Common Imports EnvelopeGenerator.Common.Constants Imports EnvelopeGenerator.Common.My Partial Public Class frmEnvelopeEditor Public Property Envelope As Envelope Public Property Documents As New BindingList(Of EnvelopeDocument) Public Property Receivers As New BindingList(Of EnvelopeReceiver) Private AllReceiverEmails As New List(Of String) Private Controller As EnvelopeEditorController Private Logger As Logger Private Const COL_NAME = "Name" Private Const COL_EMAIL = "Email" Private Const COL_CODE = "AccessCode" Public Property State As State Public Sub New() InitializeComponent() End Sub Private Async Sub btnNewFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnNewFile.ItemClick Dim oHandle = SplashScreenManager.ShowOverlayForm(Me) Try ' prüfen ob es schon eine Datei gibt If Documents.Count > 0 Then MsgBox(Resources.Envelope.Only_one_file_is_allowed, MsgBoxStyle.Information, Text) Return End If If OpenFileDialog1.ShowDialog() = DialogResult.OK Then Dim oDocument = Await Controller.CreateDocument(OpenFileDialog1.FileName) If oDocument IsNot Nothing Then Documents.Add(oDocument) Else MsgBox(Resources.Envelope.Document_Could_Not_Be_Saved, MsgBoxStyle.Critical, Text) End If End If Catch ex As Exception Logger.Error(ex) Finally SplashScreenManager.CloseOverlayForm(oHandle) RibbonPageGroupAddSignature_Enabled() End Try End Sub Private Sub frmEditor_Load(sender As Object, e As EventArgs) Handles Me.Load Logger = State.LogConfig.GetLogger() Logger.Debug("Loading Configuration..") If Envelope Is Nothing Then Controller = New EnvelopeEditorController(State) ' Get additional data Dim oDataForm As New frmEnvelopeMainData() With { .State = State, .Envelope = Controller.Envelope, .NewEnvelopeMode = True } Dim oResult As DialogResult = oDataForm.ShowDialog() If oResult = DialogResult.Cancel Then Controller.DeleteEnvelopeFromDisk(Controller.Envelope) Me.Close() End If Else Controller = New EnvelopeEditorController(State, Envelope) Documents = New BindingList(Of EnvelopeDocument)(Controller.Envelope.Documents) Receivers = New BindingList(Of EnvelopeReceiver)(Controller.Envelope.Receivers) For Each docItem As EnvelopeDocument In Documents If docItem.Thumbnail Is Nothing Then docItem.Thumbnail = Controller.CreateThumbnail(docItem.Filepath) docItem.PageCount = Controller.GetPageCount(docItem.Filepath) End If Next If Envelope.Status = Constants.EnvelopeStatus.EnvelopeSent Then ' TODO - Nach Testen ' SetFormReadonly() End If End If txtMessage.EditValue = Controller.Envelope.Message GridDocuments.DataSource = Documents GridReceivers.DataSource = Receivers AllReceiverEmails = Controller.GetEnvelopeReceiverAddresses(State.UserId) RepositoryItemComboBox1.Items.Clear() RepositoryItemComboBox1.Items.AddRange(AllReceiverEmails) SetAccessCodeColumnVisible() txtEnvelopeIdLabel2.Caption = String.Format(txtEnvelopeIdLabel2.Tag.ToString, Controller.Envelope.Id) txtCreatorEmailLabel.Caption = String.Format(txtCreatorEmailLabel.Tag.ToString, Controller.Envelope.User.Email) SetFormTitle(Controller.Envelope.Title) End Sub Private Sub SetAccessCodeColumnVisible() If Controller.Envelope.UseAccessCode Then colAccessCode.Visible = True Else colAccessCode.Visible = False End If End Sub Private Sub btnDeleteFile_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnDeleteFile.ItemClick If ViewDocuments.GetSelectedRows().Count > 0 Then Dim oMessage = Resources.Envelope.Do_you_really_want_to_remove_this_document If MsgBox(oMessage, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.No Then Exit Sub End If Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument) If Controller.DeleteDocument(oDocument) Then Documents.Remove(oDocument) End If End If End Sub Private Sub btnSave_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSave.ItemClick Try SaveEnvelopeWithOutValidation() Catch ex As Exception Logger.Error(ex) End Try End Sub Private Sub btnEditFields_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnEditFields.ItemClick Dim oHandle = SplashScreenManager.ShowOverlayForm(Me) Try If SaveEnvelopeWithReceiverDocumentValidation() = False Then Return End If If ViewDocuments.GetSelectedRows().Count > 0 Then Dim oDocument As EnvelopeDocument = DirectCast(ViewDocuments.GetFocusedRow(), EnvelopeDocument) Dim oGDPictureKey As String = "21182889975216572111813147150675976632" Dim oForm As New frmFieldEditor(State) With { .Document = Controller.Envelope.Documents. Where(Function(d) d.Filename = oDocument.Filename). SingleOrDefault(), .GDPictureKey = oGDPictureKey, .Receivers = Controller.Envelope.Receivers.ToList } oForm.ShowDialog() End If Catch ex As Exception Logger.Error(ex) Finally SplashScreenManager.CloseOverlayForm(oHandle) End Try End Sub Private Function SaveEnvelopeWithValidation() As Boolean Return SaveEnvelope(True) End Function Private Function SaveEnvelopeWithOutValidation() As Boolean Return SaveEnvelope(False) End Function ''' ''' Speichert den Envelope und prüft ''' ob Receiver und Dokument vorhanden ist. ''' Private Function SaveEnvelopeWithReceiverDocumentValidation() As Boolean If SaveEnvelope(False) = True Then Dim oEnvelope = Controller.Envelope Dim oErrors = oEnvelope.ValidateReceiverDocumentData() If oErrors.Any Then ShowValidationErrors(Resources.Envelope.Errors_when_saving_the_envelope, oErrors) Return False End If Else Return False End If Return True End Function Private Function ValidateEnvelope() As List(Of String) Dim oMessage = GetEditValueFromTextControl(txtMessage) Dim oErrors As New List(Of String) If String.IsNullOrWhiteSpace(oMessage) Then oErrors.Add(Resources.Envelope.Missing_Message) End If If Documents.Count = 0 Then oErrors.Add(Resources.Envelope.Missing_Documents) End If If Receivers.Count = 0 Then oErrors.Add(Resources.Envelope.Missing_Receivers) End If For Each Receiver In Receivers If Helpers.IsValidEmailAddress(Receiver.Email) = False Then oErrors.Add(String.Format(Resources.Envelope.Invalid_Email_Address, Receiver.Name)) End If Next Return oErrors End Function Private Function SaveEnvelope(pWithValidation As Boolean) As Boolean Dim oMessage = GetEditValueFromTextControl(txtMessage) ' Ensure all receivers are saved ViewReceivers.CloseEditor() If pWithValidation = True Then Dim oErrors = ValidateEnvelope() If oErrors.Any Then ShowValidationErrors(Resources.Envelope.Errors_when_saving_the_envelope, oErrors) Return False End If End If Dim oEnvelope = Controller.Envelope oEnvelope.Message = oMessage oEnvelope.Documents = Documents.ToList If Controller.SaveReceivers(oEnvelope, Receivers.ToList) = False Then MsgBox(Resources.Envelope.Error_when_saving_the_recipients, MsgBoxStyle.Critical, Text) Return False End If If Controller.SaveEnvelope() = False Then MsgBox(Resources.Envelope.Error_when_saving_the_envelope, MsgBoxStyle.Critical, Text) Return False Else Return True End If End Function Private Function GetEditValueFromTextControl(pControl As TextEdit) As String If pControl.EditValue Is Nothing Then Return String.Empty Else Return pControl.EditValue.ToString End If End Function Private Sub ShowValidationErrors(pErrorTitle As String, pErrors As List(Of String)) Dim oError = pErrorTitle & vbNewLine & vbNewLine & String.Join(vbNewLine, pErrors) MsgBox(oError, MsgBoxStyle.Exclamation, Text) End Sub Private Sub btnDeleteReceiver_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnDeleteReceiver.ItemClick If ViewReceivers.SelectedRowsCount = 0 Then Exit Sub End If Dim oReceiver As EnvelopeReceiver = ViewReceivers.GetFocusedRow() If oReceiver Is Nothing Then Exit Sub End If Dim oMessage = Resources.Envelope.Do_you_want_to_delete_the_selected_recipient If Controller.ElementsExist(oReceiver.Id) Then oMessage = Resources.Envelope.There_are_already_elements_for_this_recipient End If If MsgBox(oMessage, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.No Then Exit Sub End If If Controller.DeleteReceiver(oReceiver) Then Receivers.Remove(oReceiver) Else MsgBox(Resources.Envelope.Recipient_could_not_be_deleted, MsgBoxStyle.Critical, Text) End If End Sub Private Sub btnSendEnvelope_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSendEnvelope.ItemClick If Controller.Envelope.Status = Constants.EnvelopeStatus.EnvelopeSent Then MsgBox(Resources.Envelope.Envelope_already_sent, MsgBoxStyle.Information, Text) Exit Sub End If If SaveEnvelopeWithValidation() = False Then Exit Sub End If Dim oErrors = ValidateEnvelope() oErrors = Controller.ValidateEnvelopeForSending(oErrors) If oErrors.Any() Then ShowValidationErrors(Resources.Envelope.Error_when_validating_the_envelope, oErrors) Exit Sub End If Dim oMessage = Resources.Envelope.Do_you_want_to_start_the_signature_process_now If MsgBox(oMessage, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.No Then Exit Sub End If If Controller.SendEnvelope() = False Then MsgBox(Resources.Envelope.Envelope_could_not_be_sent, MsgBoxStyle.Critical, Text) Else If MsgBox(Resources.Envelope.Envelope_Invitations_Sent, MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, Text) = MsgBoxResult.Ok Then If DOCUMENT_PATH_MOVE_AFTSEND <> String.Empty Then If My.Settings.NetUse_PW <> String.Empty And My.Settings.NetUse_Usr <> String.Empty Then Dim oDecrypted = Decryption.Decrypt(My.Settings.NetUse_PW) For Each odoc In Controller.Envelope.Documents 'envelope ist leer! MoveFileWithNetUse(odoc.Filepath, DOCUMENT_PATH_MOVE_AFTSEND, My.Settings.NetUse_Usr, My.Settings.NetUse_PW) Next End If End If Me.Close() End If End If End Sub Sub MoveFileWithNetUse(pSourcePath As String, pDestinationPath As String, pUsername As String, pPassword As String) Dim oDectryptedPW = Decryption.Decrypt(pPassword) Dim oFilename = System.IO.Path.GetFileName(pSourcePath) Dim netUseCommand As String = $"net use {pDestinationPath} /user:{pUsername} {oDectryptedPW}" Dim processInfo As New ProcessStartInfo("cmd.exe", $"/C {netUseCommand}") processInfo.RedirectStandardOutput = True processInfo.UseShellExecute = False processInfo.CreateNoWindow = True Using process As Process = Process.Start(processInfo) process.WaitForExit() ' Prüfe den Rückgabewert des net use Befehls If process.ExitCode = 0 Then ' Verschiebe die Datei Try Dim oFilePath As String = pSourcePath Dim split As String() = oFilePath.Split("\") Dim parentFolder As String = split(split.Length - 2) pDestinationPath &= "\" + parentFolder If Not System.IO.Directory.Exists(pDestinationPath) Then System.IO.Directory.CreateDirectory(pDestinationPath) End If pDestinationPath &= "\" + oFilename If File.Exists(pDestinationPath) Then File.Delete(pDestinationPath) End If System.IO.File.Move(pSourcePath, pDestinationPath) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error in MoveFileWithNetUse") End Try Else MsgBox("Error while connecting to network: " & pDestinationPath, MsgBoxStyle.Critical, "Unexpected error in MoveFileWithNetUse") End If End Using End Sub Private Sub btnCancel_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnCancel.ItemClick ' Speichern? Dim oMessage = Resources.Envelope.Should_The_Envelope_Be_Saved If MsgBox(oMessage, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.Yes Then SaveEnvelope(False) End If ' Schließen Me.Close() End Sub Private Sub btnEditData_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnEditData.ItemClick Dim oForm As New frmEnvelopeMainData() With { .State = State, .Envelope = Controller.Envelope, .NewEnvelopeMode = False } oForm.ShowDialog() SetAccessCodeColumnVisible() SetFormTitle(Controller.Envelope.Title) End Sub Private Sub GridReceivers_PaintEx(sender As Object, e As DevExpress.XtraGrid.PaintExEventArgs) Handles GridReceivers.PaintEx Dim grid As GridControl = sender, view As GridView = Nothing If TypeOf sender Is GridControl AndAlso TypeOf grid.MainView Is GridView Then view = grid.MainView Dim pen = New Pen(Color.Gainsboro, 2) Dim info = view.GetViewInfo() e.Cache.DrawRectangle(pen, info.Bounds) pen.Dispose() End If End Sub Private Sub ViewReceivers_InitNewRow(sender As Object, e As InitNewRowEventArgs) Handles ViewReceivers.InitNewRow Dim oReceiver As EnvelopeReceiver = ViewReceivers.GetRow(e.RowHandle) Dim oUsedColors = Receivers.Select(Of Integer)(Function(r) r.ColorType).ToList() Dim oAllColors = [Enum].GetValues(GetType(ColorType)).Cast(Of Integer).ToList() Dim oUnusedColors = oAllColors.Except(oUsedColors) If oUnusedColors.Any() Then oReceiver.ColorType = oUnusedColors.Min() End If End Sub Private Sub frmEnvelopeEditor_Shown(sender As Object, e As EventArgs) Handles Me.Shown RibbonPageGroupAddSignature_Enabled() RibbonPageGroupReceiver_Enable() SendEnvelopeButton_Enable() End Sub Private Sub RibbonPageGroupAddSignature_Enabled() If ViewDocuments.RowCount > 0 And ViewReceivers.SelectedRowsCount > 0 Then RibbonPageGroupAddSignature.Enabled = True Else RibbonPageGroupAddSignature.Enabled = False End If End Sub Private Sub RibbonPageGroupReceiver_Enable() If ViewReceivers.SelectedRowsCount = 0 Then RibbonPageGroupReceiver.Enabled = False Else RibbonPageGroupReceiver.Enabled = True End If End Sub Private Sub DocumentButtons_Enable() If ViewDocuments.RowCount = 0 Then btnNewFile.Enabled = True btnDeleteFile.Enabled = False Else btnNewFile.Enabled = False btnDeleteFile.Enabled = True End If End Sub Private Sub SendEnvelopeButton_Enable() If ViewDocuments.RowCount > 0 And ViewReceivers.SelectedRowsCount > 0 Then btnSendEnvelope.Enabled = True Else btnSendEnvelope.Enabled = False End If End Sub Private Sub SetFormTitle(pTitle As String) Dim oFormTitle As String = State.DbConfig.ExternalProgramName + " - " + Resources.Envelope.Envelope_Editor If String.IsNullOrEmpty(pTitle) = False Then oFormTitle += " - " + Controller.Envelope.Title.Truncate(30) End If Me.Text = oFormTitle End Sub Private Sub frmEnvelopeEditor_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing If Controller.Envelope?.Status = EnvelopeStatus.EnvelopeCreated Then Controller.DeleteEnvelopeFromDisk(Controller.Envelope) End If End Sub Private Sub ViewReceivers_RowCountChanged(sender As Object, e As EventArgs) Handles ViewReceivers.RowCountChanged RibbonPageGroupReceiver_Enable() SendEnvelopeButton_Enable() RibbonPageGroupAddSignature_Enabled() End Sub Private Sub ViewDocuments_RowCountChanged(sender As Object, e As EventArgs) Handles ViewDocuments.RowCountChanged DocumentButtons_Enable() SendEnvelopeButton_Enable() RibbonPageGroupAddSignature_Enabled() End Sub Private Sub ViewReceivers_CellValueChanged(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles ViewReceivers.CellValueChanged If e.Column.FieldName = COL_EMAIL Then If e.Value Is Nothing Then ' Keine E-Mail-Adresse, also weg damit ViewReceivers.DeleteRow(ViewReceivers.FocusedRowHandle) Else ' Doppelte E-Mail-Adresse? TODO 'Dim oReceivers = Controller.Envelope.Receivers Dim oNameCellValue = ViewReceivers.GetRowCellValue(e.RowHandle, COL_NAME) If oNameCellValue Is Nothing Then Dim oEmailAdress As String = DirectCast(e.Value, String) Dim oLastName As String = Controller.GetLastNameByEmailAdress(oEmailAdress) Dim oAccessCode As String = Helpers.GetAccessCode() ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName) ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode) End If End If End If End Sub End Class