Files
SISBusiness/SISBusiness.Module.Win/Controllers/DragAndDrop/DragAndDropBusinessDirectory_VC.vb
2017-03-26 20:00:03 +02:00

405 lines
21 KiB
VB.net

Imports System
Imports System.ComponentModel
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.Text
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.Actions
Imports DevExpress.Persistent.Base
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraGrid.Views.Grid.ViewInfo
Imports Microsoft.VisualBasic
Imports System.Drawing
Imports System.Collections
Imports System.Windows.Forms
Imports System.Data
Imports DevExpress.ExpressApp.Win.Editors
Imports DevExpress.Persistent.BaseImpl
Imports DevExpress.ExpressApp.Win
Imports Microsoft.Office.Interop
Imports System.IO
Imports DevExpress.XtraTreeList
Imports DevExpress.ExpressApp.Win.Controls
Imports DevExpress.ExpressApp.TreeListEditors.Win
Imports DevExpress.XtraTreeList.Nodes
Imports Microsoft.Office
Imports System.Runtime.InteropServices
Imports System.Collections.Specialized
Imports System.Threading
Public Class DragAndDropBusinessDirectory_VC
Inherits DevExpress.ExpressApp.ViewController
Private _TreeListEditor As TreeListEditor
Private _TreeList As TreeList
Private _Selection As New ArrayList
Private _EnabledSelection = True
Private _CanEmailDrop As Boolean = True
Dim _WaitFormClass As New WaitFormClass
Public Sub New()
MyBase.New()
InitializeComponent()
RegisterActions(components)
End Sub
Protected Overrides Sub OnActivated()
MyBase.OnActivated()
If View.Id Like "*BusinessDirectory_ListView*" Then
AddHandler View.ControlsCreated, AddressOf View_ControlsCreated
End If
End Sub
Protected Overrides Sub OnDeactivated()
MyBase.OnDeactivated()
If View.Id = "BusinessDirectory_ListView" Then
Frame.GetController(Of DevExpress.ExpressApp.SystemModule.DeleteObjectsViewController).DeleteAction.Active.SetItemValue("", True)
End If
End Sub
Private Sub View_ControlsCreated(sender As Object, e As EventArgs)
_TreeListEditor = CType((CType(View, DevExpress.ExpressApp.ListView)).Editor, TreeListEditor)
_TreeList = _TreeListEditor.TreeList
_TreeList.OptionsDragAndDrop.DragNodesMode = DragNodesMode.Multiple
_TreeList.OptionsDragAndDrop.ExpandNodeOnDrag = True
AddHandler _TreeList.DragOver, AddressOf _TreeList_DragOver
AddHandler _TreeList.DragDrop, AddressOf _TreeList_DragDrop
AddHandler _TreeList.DragLeave, AddressOf _TreeList_DragLeave
AddHandler View.SelectionChanged, AddressOf BusinessDirectory_ListView_SelectionChanged
End Sub
#Region "Drag and Drop"
Private Sub _TreeList_DragOver(sender As Object, e As DragEventArgs)
'Dim dragNode As TreeListNode = TryCast(e.Data.GetData(GetType(TreeListNode)), TreeListNode)
e.Effect = DragDropEffects.All
'e.Effect = GetDragDropEffect(TryCast(sender, TreeList), dragNode, New Point(e.X, e.Y))
End Sub
Private Sub _TreeList_DragLeave(sender As Object, e As EventArgs)
'Fileok Clipboard droplistba
Dim _Paths As New StringCollection
For Each _BusinessDirectory As BusinessDirectory In View.SelectedObjects
If _BusinessDirectory.FileData IsNot Nothing Then
Dim _FileName As String = System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetTempPath, _BusinessDirectory.FileData.FileName)
Dim _StreamFile As System.IO.Stream = New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
_BusinessDirectory.FileData.SaveToStream(_StreamFile)
_StreamFile.Close()
_Paths.Add(_FileName)
End If
Next
If _Paths.Count > 0 Then
Dim data As New DataObject()
data.SetFileDropList(_Paths)
_TreeList.DoDragDrop(data, DragDropEffects.Copy)
End If
End Sub
Private Sub _TreeList_DragDrop(sender As Object, e As DragEventArgs)
Dim _TargetNode As TreeListNode = Nothing
Dim _Point As Point
Dim _BusinessDirectoryDrop As Boolean = False
Dim _FileDrop As Boolean = False
Dim _EmailDrop As Boolean = False
Dim _ocur As Xpo.XPObjectSpace = TryCast(View.ObjectSpace, Xpo.XPObjectSpace)
Dim _TL As TreeList = TryCast(sender, TreeList)
If _TL IsNot Nothing Then
_Point = _TL.PointToClient(New Point(e.X, e.Y))
_TargetNode = _TL.CalcHitInfo(_Point).Node
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
_FileDrop = True
ElseIf e.Data.GetDataPresent("FileGroupDescriptor") Then
_EmailDrop = True
ElseIf TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory) IsNot Nothing Then
_BusinessDirectoryDrop = True
End If
End If
If _TargetNode Is Nothing Then Exit Sub
If _BusinessDirectoryDrop Then
Dim _TargetBusinessDirectory As BusinessDirectory = TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory)
If TryCast(_Selection(0), BusinessDirectory).Oid <> _TargetBusinessDirectory.Oid Then
If _TargetBusinessDirectory.IsFolder Then
If _TargetBusinessDirectory IsNot Nothing Then
_EnabledSelection = False
For Each _BusinessDirectory As BusinessDirectory In _Selection
_BusinessDirectory.BusinessDirectory_Parent = _TargetBusinessDirectory
Next
_ocur.CommitChanges()
_EnabledSelection = True
End If
Else
MsgBox("Fájl nem használható könyvtárként!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Figyelem!")
End If
Else
MsgBox("Nem helyezhetõ át az elem saját magába!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Figyelem!")
End If
End If
If _FileDrop Then
Dim _FileIn As Object = e.Data.GetData(DataFormats.FileDrop)
If _FileIn IsNot Nothing Then
_Selection.Clear()
Try
_WaitFormClass.Initwork(0, 1, TryCast(_FileIn, String()).Length)
For Each _ActFile As String In _FileIn
_WaitFormClass.DoWork()
If System.IO.File.Exists(_ActFile) Then
Dim _BusinessDirectory As New BusinessDirectory(_ocur.Session)
With _BusinessDirectory
.IsFolder = False
.ShortName = IO.Path.GetFileName(IO.Path.GetFileNameWithoutExtension(_ActFile))
.FileData = LoadOtherFile(_ActFile, New FileData(_ocur.Session))
.BusinessDirectory_Parent = TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory)
.FileCreated = GetFileCreatedDate(_ActFile)
.FileModified = GetFileModifiedDate(_ActFile)
End With
End If
Next
_ocur.CommitChanges()
Catch ex As Exception
Finally
_WaitFormClass.FinalWork()
End Try
End If
End If
If _EmailDrop Then
Dim _OL As Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application
Dim _Explorer As Microsoft.Office.Interop.Outlook.Explorer = _OL.ActiveExplorer
Dim _TargetBusinessDirectory As BusinessDirectory = TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory)
If _TargetBusinessDirectory.IsFolder Then
If _CanEmailDrop Then
If _Explorer.Selection.Count > 0 Then
_CanEmailDrop = False
Dim _MemoryStream As MemoryStream = TryCast(e.Data.GetData("FileGroupDescriptor"), MemoryStream)
Dim _TMPFileName As String = Path.GetTempPath + Path.GetRandomFileName
Dim _FileStream As FileStream = File.OpenWrite(_TMPFileName)
_MemoryStream.WriteTo(_FileStream)
_FileStream.Flush()
_FileStream.Close()
Dim _TxtLine As String = ""
If File.Exists(_TMPFileName) Then
Dim _StreamReader As New StreamReader(_TMPFileName)
Do While _StreamReader.Peek <> -1
_TxtLine += _StreamReader.ReadLine
Loop
End If
If _TxtLine.Contains(".msg") Then
Try
_WaitFormClass.Initwork(0, 1, _Explorer.Selection.Count)
For ik = 1 To _Explorer.Selection.Count
_WaitFormClass.DoWork()
Dim _FileIn As Object = _Explorer.Selection(ik)
Dim _MailItem As Microsoft.Office.Interop.Outlook.MailItem = TryCast(_FileIn, Microsoft.Office.Interop.Outlook.MailItem)
Dim _MeetingItem As Microsoft.Office.Interop.Outlook.MeetingItem = TryCast(_FileIn, Microsoft.Office.Interop.Outlook.MeetingItem)
If _MailItem Is Nothing And _MeetingItem Is Nothing Then Throw New Exception("*Csak e-mail, értekezlet és találkozó típusú Outlook elemet lehet beilleszteni!")
If _MailItem IsNot Nothing Then
Try
Dim _FileName As String = ""
Dim _Subject As String = ""
If _MailItem.Subject IsNot Nothing Then
_Subject = _MailItem.Subject.Replace(":", "")
_Subject = _Subject.Replace("/", "-")
Else
_Subject = "Nincs tárgy"
End If
If Not IsValidFileName(_Subject) Then Throw New Exception("*Illegális karakterek a tárgy mezõben!")
_FileName = String.Format("{0}{1}.msg", System.IO.Path.GetTempPath, _Subject)
_MailItem.SaveAs(_FileName, Microsoft.Office.Interop.Outlook.OlSaveAsType.olMSG)
If System.IO.File.Exists(_FileName) Then
Dim _BusinessDirectory As New BusinessDirectory(_ocur.Session)
With _BusinessDirectory
.FileData = LoadOtherFile(_FileName, New FileData(_ocur.Session))
.FileData.FileName = IO.Path.GetFileName(_FileName)
.FileCreated = _MailItem.ReceivedTime 'Küldés dátuma kell?
.FileModified = GetFileModifiedDate(_FileName)
.ShortName = IO.Path.GetFileName(_FileName)
.BusinessDirectory_Parent = TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory)
.IsFolder = False
.EMail_Sender = _MailItem.Sender.Name
.Email_Copy = _MailItem.CC
End With
System.IO.File.Delete(_FileName)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Hiba!")
End Try
ElseIf _MeetingItem IsNot Nothing Then
Try
Dim _FileName As String = ""
Dim _Subject As String = ""
If _MeetingItem.Subject IsNot Nothing Then
_Subject = _MeetingItem.Subject.Replace(":", "")
_Subject = _Subject.Replace("/", "-")
_Subject = _Subject.Replace("|", "_")
Else
_Subject = "Nincs tárgy"
End If
If Not IsValidFileName(_Subject) Then Throw New Exception("*Illegális karakterek a tárgy mezõben!")
_FileName = String.Format("{0}{1}.msg", System.IO.Path.GetTempPath, _Subject)
_MeetingItem.SaveAs(_FileName, Microsoft.Office.Interop.Outlook.OlSaveAsType.olMSG)
If System.IO.File.Exists(_FileName) Then
Dim _BusinessDirectory As New BusinessDirectory(_ocur.Session)
With _BusinessDirectory
.FileData = LoadOtherFile(_FileName, New FileData(_ocur.Session))
.FileData.FileName = IO.Path.GetFileName(_FileName)
.FileCreated = _MeetingItem.ReceivedTime 'Küldés dátuma kell?
.FileModified = GetFileModifiedDate(_FileName)
.ShortName = IO.Path.GetFileName(_FileName)
.BusinessDirectory_Parent = TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory)
.IsFolder = False
.EMail_Sender = _MeetingItem.SenderName '.Sender.Name
End With
System.IO.File.Delete(_FileName)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Hiba!")
Finally
_WaitFormClass.FinalWork()
End Try
End If
Next
_ocur.CommitChanges()
Catch ex As Exception
Finally
Marshal.ReleaseComObject(_Explorer)
Marshal.ReleaseComObject(_Explorer)
_Explorer = Nothing
Marshal.ReleaseComObject(_OL)
_OL = Nothing
_WaitFormClass.FinalWork()
End Try
Else
_WaitFormClass.Initwork(0, 1, 1)
_WaitFormClass.DoWork()
Dim _FileNameFromStream As New StringBuilder("")
_FileNameFromStream.Append(Path.GetTempPath)
Dim fileGroupDescriptor(512) As Byte
_MemoryStream.Read(fileGroupDescriptor, 0, 512)
Dim i As Integer = 76
While fileGroupDescriptor(i) <> 0
_FileNameFromStream.Append(Convert.ToChar(fileGroupDescriptor(i)))
i += 1
End While
Dim _FileIn As Object = _Explorer.Selection(1)
Dim _MailItem As Microsoft.Office.Interop.Outlook.MailItem = TryCast(_FileIn, Microsoft.Office.Interop.Outlook.MailItem)
For Each _Attachment As Microsoft.Office.Interop.Outlook.Attachment In _MailItem.Attachments
If _Attachment.FileName = Path.GetFileName(_FileNameFromStream.ToString) Then
_Attachment.SaveAsFile(Path.GetTempPath + _Attachment.FileName)
If System.IO.File.Exists(Path.GetTempPath + _Attachment.FileName) Then
Dim _BusinessDirectory As New BusinessDirectory(_ocur.Session)
With _BusinessDirectory
.FileData = LoadOtherFile(Path.GetTempPath + _Attachment.FileName, New FileData(_ocur.Session))
.FileData.FileName = IO.Path.GetFileName(Path.GetTempPath + _Attachment.FileName)
.FileCreated = GetFileCreatedDate(Path.GetTempPath + _Attachment.FileName)
.FileModified = GetFileModifiedDate(Path.GetTempPath + _Attachment.FileName)
.ShortName = IO.Path.GetFileName(Path.GetTempPath + _Attachment.FileName)
.BusinessDirectory_Parent = TryCast(DirectCast(_TargetNode, DevExpress.ExpressApp.Win.Controls.ObjectTreeListNode).Object, BusinessDirectory)
.IsFolder = False
.EMail_Sender = _MailItem.Sender.Name
.Email_Copy = _MailItem.CC
End With
System.IO.File.Delete(Path.GetTempPath + _Attachment.FileName)
End If
End If
Next
_ocur.CommitChanges()
Marshal.ReleaseComObject(_Explorer)
Marshal.ReleaseComObject(_Explorer)
_Explorer = Nothing
Marshal.ReleaseComObject(_OL)
_OL = Nothing
_WaitFormClass.FinalWork()
End If
End If
End If
_CanEmailDrop = True
Else
MsgBox("Fájl nem használható könyvtárként!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Figyelem!")
End If
End If
e.Effect = DragDropEffects.None
End Sub
#End Region
Private Function GetDragDropEffect(ByVal tl As TreeList, ByVal dragNode As TreeListNode, _Point As Point) As DragDropEffects
Dim _TargetNode As TreeListNode
Dim _PointNew As Point = tl.PointToClient(_Point)
_TargetNode = tl.CalcHitInfo(_PointNew).Node
Return DragDropEffects.Move
End Function
Private Sub BusinessDirectory_ListView_SelectionChanged(sender As Object, e As EventArgs)
If _EnabledSelection Then
_Selection.Clear()
_Selection.AddRange(View.SelectedObjects)
End If
End Sub
Private Function LoadOtherFile(ByVal _ActFile As String, _FileData As FileData) As FileData
Dim _StreamFile = New System.IO.FileStream(_ActFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim _StreamReader As New System.IO.StreamReader(_StreamFile)
_StreamFile.Seek(0, System.IO.SeekOrigin.Begin)
_FileData.LoadFromStream(_ActFile, _StreamFile)
_FileData.FileName = System.IO.Path.GetFileName(_ActFile)
_StreamReader.Close()
_StreamFile.Close()
Return _FileData
End Function
Private Function GetFileCreatedDate(_ActFile As String) As Date
Return System.IO.File.GetCreationTime(_ActFile)
End Function
Private Function GetFileModifiedDate(_ActFile As String) As Date
Return System.IO.File.GetLastAccessTime(_ActFile)
End Function
Public Function IsValidFileName(ByVal fn As String) As Boolean
Try
Dim fi As New IO.FileInfo(fn)
Catch ex As Exception
Return False
End Try
Return True
End Function
End Class