Namespace SoloViewSerg
    Friend Class ssTask
        Friend Sub New(ByVal aDocumentFullPath As String, ByVal aLastBackupTime As Date)
            _DocumentFullPath = aDocumentFullPath
            _LastBackupTime = aLastBackupTime
        End Sub
 
        Private _DocumentFullPath As String
        Friend ReadOnly Property DocumentFullPath As String
            Get
                Return _DocumentFullPath
            End Get
        End Property
 
        Private _LastBackupTime As Date
        Friend ReadOnly Property LastBackupTime As Date
            Get
                Return _LastBackupTime
            End Get
        End Property
 
        Private _Guid As Guid = Guid.NewGuid
        Friend ReadOnly Property Guid As Guid
            Get
                Return _Guid
            End Get
        End Property
    End Class
End Namespace
 
Imports System
Imports Autodesk.Revit.UI
Imports Autodesk.Revit.DB
Imports Autodesk.Revit.ApplicationServices
Imports Autodesk.Revit.Creation
'Imports Autodesk.Revit.Utility
'Imports Autodesk.Revit.VSTA
Imports System.Drawing
Imports System.Windows.Media.Imaging
Imports System.Reflection
Imports System.Windows.Media
Imports SoloViewSerg.ssApplication
Imports SoloViewSerg.ssModel
Imports System.IO
 
Namespace SoloViewSerg
 
    Friend Class ssAddRibbonPanel
        Implements Autodesk.Revit.UI.IExternalApplication
 
        Friend Shared pTaskProcessor As ssTaskProcessor
 
        Public Sub ApplicationDocumentClosing(sender As Object, e As Autodesk.Revit.DB.Events.DocumentClosingEventArgs)
            Try
                'RemoveTaskProcessorTaskByDocumentFullPath
                Dim aTask As ssTask
                SyncLock pTaskProcessor.Tasks
                    For i As Int32 = 0 To pTaskProcessor.Tasks.Count - 1
                        aTask = pTaskProcessor.Tasks.Item(i)
                        If aTask IsNot Nothing AndAlso aTask.DocumentFullPath = e.Document.PathName Then
                            pTaskProcessor.Tasks.RemoveAt(i)
                        End If
                    Next
                End SyncLock
            Catch ex As System.Exception
                BuildErrorMessage(ex, False)
            Finally
 
            End Try
        End Sub
        Public Sub ApplicationDocumentSavedAs(sender As Object, e As Autodesk.Revit.DB.Events.DocumentSavedAsEventArgs)
            Try
 
                'RemoveTaskProcessorTaskByDocumentFullPath
                Dim aTask As ssTask
                SyncLock pTaskProcessor.Tasks
                    For i As Int32 = 0 To pTaskProcessor.Tasks.Count - 1
                        aTask = pTaskProcessor.Tasks.Item(i)
                        If aTask IsNot Nothing AndAlso aTask.DocumentFullPath = pActiveDocumentFullPath Then
                            pTaskProcessor.Tasks.RemoveAt(i)
                        End If
                    Next
                End SyncLock
 
                'Document Backup
                pActiveDocumentFullPath = e.Document.PathName
                pActiveDocument = e.Document
                If pDocBackupON = True Then
                    'AddTaskProcessorTaskByDocumentFullPath
                    If pTaskProcessor Is Nothing Then
                        pTaskProcessor = New ssTaskProcessor
                        pTaskProcessor.Start()
                    ElseIf pTaskProcessor.IsCompleted = True Then
                        Dim aTasks As ArrayList = pTaskProcessor.Tasks
                        pTaskProcessor = New ssTaskProcessor
                        pTaskProcessor.Tasks = aTasks
                        pTaskProcessor.Start()
                    End If
                    pTaskProcessor.SubmitTask(New ssTask(pActiveDocumentFullPath, DateTime.MinValue))
                Else
                    If pTaskProcessor IsNot Nothing Then
                        pTaskProcessor.Stop()
                    End If
                End If
 
            Catch ex As System.Exception
                BuildErrorMessage(ex, False)
            Finally
 
            End Try
        End Sub
        Public Sub ApplicationDocumentOpened(sender As Object, e As Autodesk.Revit.DB.Events.DocumentOpenedEventArgs)
            Try
 
                Dim textFields As String() = Nothing
                Dim errString As String = String.Empty, errDescription As String = String.Empty
                Dim aFontFamilyName As String = "Arial", aFontSize As Single = 10.0F, aFontItalic As Boolean = True, aFontUnderline As Boolean, aFontBold As Boolean, aFontStrikethrough As Boolean
                Dim alocalInterfaceLanguage As ssInterfaceLanguagesEnum = InterfaceLanguage
 
                pActiveDocumentFullPath = e.Document.PathName
                pActiveDocument = e.Document
 
                Try
                    'ReadSaveFaceDocBackup
                    Call ReadSaveFace(textFields, errString, errDescription,
                                  aFontFamilyName, aFontSize, aFontItalic, aFontUnderline, aFontBold, aFontStrikethrough,
                                      alocalInterfaceLanguage)
                    If errString <> String.Empty OrElse textFields Is Nothing OrElse textFields.Length < 19 Then
                        If dlgMain IsNot Nothing Then
                            MsgBox(ResourceManagerMainShadow.GetString("Error read Data:", curUICulture) & vbCrLf &
                                errString & vbCrLf &
                                errDescription & vbCrLf &
                                ResourceManagerMainShadow.GetString("Application options will be set by default.", curUICulture), vbInformation + vbOKOnly, ResourceManagerMainShadow.GetString("Application Name", curUICulture))
                        End If
 
                        pDocBackupON = False
                        pDocBackupInterval = 6000 ' 600000
                        pBackupFolder = "С:\" ' "D:\Revit MEP Projects 2013\DocumentBackup\"
 
                    Else
 
                    End If
 
                Catch ex As System.Exception
                    BuildErrorMessage(ex, False)
                Finally
 
                End Try
 
                'Check pBackupFolder
                Dim aBackupDirectory As DirectoryInfo = Nothing
                If String.IsNullOrWhiteSpace(pBackupFolder) = False Then
                    aBackupDirectory = New DirectoryInfo(pBackupFolder)
                End If
                If aBackupDirectory Is Nothing OrElse aBackupDirectory.Exists = False Then
 
                    'DisableBackup
                    pDocBackupON = False
 
                    If dlgMain IsNot Nothing Then
                        MsgBox(ResourceManagerMainShadow.GetString("Document Backup Folder", curUICulture) & vbCrLf &
                           pBackupFolder & vbCrLf &
                           ResourceManagerMainShadow.GetString("is NOT exist!", curUICulture) & vbCrLf & vbCrLf &
                           ResourceManagerMainShadow.GetString("Unfortunately,", curUICulture) & " " & ResourceManagerMainShadow.GetString("Asynchronous Document Backup", curUICulture) & " " &
                           ResourceManagerMainShadow.GetString("is impossible.", curUICulture) & vbCrLf &
                           ResourceManagerMainShadow.GetString("Try to set up exiting backup folder. Current session backup will be disabled.", curUICulture), vbCritical, ResourceManagerMainShadow.GetString("Application Name", curUICulture))
                    End If
                End If
 
                'Document Backup
                If pDocBackupON = True Then
                    If pTaskProcessor Is Nothing Then
                        pTaskProcessor = New ssTaskProcessor
                        pTaskProcessor.Start()
                    ElseIf pTaskProcessor.IsCompleted = True Then
                        Dim aTasks As ArrayList = pTaskProcessor.Tasks
                        pTaskProcessor = New ssTaskProcessor
                        pTaskProcessor.Tasks = aTasks
                        pTaskProcessor.Start()
                    End If
                    pTaskProcessor.SubmitTask(New ssTask(pActiveDocumentFullPath, DateTime.MinValue))
                Else
                    If pTaskProcessor IsNot Nothing Then
                        pTaskProcessor.Stop()
                    End If
                End If
            Catch ex As System.Exception
                BuildErrorMessage(ex, False)
            Finally
 
            End Try
        End Sub
 
        Public Function OnShutdown(application As Autodesk.Revit.UI.UIControlledApplication) As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalApplication.OnShutdown
            Try
                RemoveHandler application.ControlledApplication.DocumentOpened, AddressOf ApplicationDocumentOpened
                RemoveHandler application.ControlledApplication.DocumentSavedAs, AddressOf ApplicationDocumentSavedAs
                RemoveHandler application.ControlledApplication.DocumentClosing, AddressOf ApplicationDocumentClosing
 
                'Document Backup
                pTaskProcessor.Stop()
 
                Return (Result.Succeeded)
            Catch ex As System.Exception
                BuildErrorMessage(ex, False)
                Return (Result.Failed)
            Finally
 
            End Try
        End Function
 
        Public Function OnStartup(application As Autodesk.Revit.UI.UIControlledApplication) As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalApplication.OnStartup
            Try
 
                Dim ssRevitUtilitesAssembly As [Assembly]
                ssRevitUtilitesAssembly = [Assembly].GetAssembly(Me.GetType)
                Dim projectFullPath As String = ssRevitUtilitesAssembly.Location
                pProjectPath = ssRevitUtilitesAssembly.Location.Substring(0, ssRevitUtilitesAssembly.Location.LastIndexOf("\") + 1)
 
                AddHandler application.ControlledApplication.DocumentOpened, AddressOf ApplicationDocumentOpened
                AddHandler application.ControlledApplication.DocumentSavedAs, AddressOf ApplicationDocumentSavedAs
                AddHandler application.ControlledApplication.DocumentClosing, AddressOf ApplicationDocumentClosing
 
                ' add new ribbon panel
                Dim ribbonPanel As RibbonPanel = application.CreateRibbonPanel("ssRevitUtilitesRibbonPanel")
                Dim PushButton1 As PushButton = ribbonPanel.AddItem(New PushButtonData("SoloViewSerg - ssRevitUtilites", "SoloViewSerg - ssRevitUtilites", projectFullPath, "SoloViewSerg.ssCommand"))
                PushButton1.SetContextualHelp(New ContextualHelp(ContextualHelpType.ChmFile, pProjectPath & "ssUtilites_EN.html"))
                Dim largeImage As BitmapImage = New BitmapImage(New Uri(pProjectPath & "ssRevitUtilites.ico"))
 
                PushButton1.LargeImage = largeImage
                Return Result.Succeeded
            Catch ex As Exception
                BuildErrorMessage(ex, False)
                Return Result.Failed
            End Try
        End Function
 
        ...
 
    End Class
End Namespace