view Glimpse/Glimpse Services/GlimpseService.vb @ 86:2084cfd89b80

solution user file containing startup object
author Steven Hollidge <stevenhollidge@hotmail.com>
date Tue, 24 Apr 2012 00:53:56 +0100
parents 536498832a79
children
line wrap: on
line source

Imports System.Diagnostics
Imports System.Collections.ObjectModel
Imports System.ComponentModel

Public Class GlimpseService

#Region " Declarations "

    Private Shared _instance As GlimpseService
    Private _objGlimpseWindow As ChildWindow
    Private _objHostExceptions As New ObservableCollection(Of ExceptionWrapper)
    Private _strHostApplicationName As String = String.Empty
    Private WithEvents _objApp As Application
    Private WithEvents _objRootVisual As FrameworkElement

#End Region

#Region " Properties "

    Public Shared ReadOnly Property CreateInstance() As GlimpseService
        Get

            If _instance Is Nothing Then
                _instance = New GlimpseService
            End If

            Return _instance
        End Get
    End Property

    Friend Property App() As Application
        Get
            Return _objApp
        End Get
        Set(ByVal Value As Application)
            _objApp = Value
        End Set
    End Property

    Friend Property GlimpseWindow() As ChildWindow
        Get
            Return _objGlimpseWindow
        End Get

        Private Set(ByVal Value As ChildWindow)
            _objGlimpseWindow = Value
        End Set
    End Property

    Friend Property HostApplicationName() As String
        Get
            Return _strHostApplicationName
        End Get
        Set(ByVal Value As String)
            _strHostApplicationName = Value
        End Set
    End Property

    Friend ReadOnly Property HostExceptions() As ObservableCollection(Of ExceptionWrapper)
        Get
            Return _objHostExceptions
        End Get
    End Property

    Friend Property RootVisual() As FrameworkElement
        Get
            Return _objRootVisual
        End Get
        Set(ByVal Value As FrameworkElement)
            _objRootVisual = Value
        End Set
    End Property

#End Region

#Region " Creation and Loading "

    Public Sub DisplayLoadFailure(ByVal objApp As Application, ByVal ex As Exception, ByVal strHostApplicationName As String)
        Debug.WriteLine(String.Format("{0} had exception. {1}", Me.HostApplicationName, ex.ToString))
        _objApp = objApp
        _objApp.RootVisual = New LoadExceptionViewer(ex, strHostApplicationName)
    End Sub

    Public Sub Load(ByVal objApp As Application, ByVal strHostApplicationName As String)
        Me.App = objApp
        Me.RootVisual = TryCast(objApp.RootVisual, FrameworkElement)
        Me.HostApplicationName = strHostApplicationName

        Dim fw As New FloatableWindow()
        fw.Title = Me.HostApplicationName
        fw.Content = New GlimpseViewer
        fw.ParentLayoutRoot = DirectCast(VisualTreeHelper.GetChild(RootVisual, 0), Panel)

        If Double.IsNaN(Me.RootVisual.Width) Then
            'if the host control is autosized (consumes the browser window) then locate Glimpse in the top, left
            fw.Show()

        Else

            'if the host is fixed size then attempt to locate the popup control in the upper right corner
            Dim dblLeft As Double = Me.RootVisual.Width - 200

            If dblLeft < 0 Then
                dblLeft = 0
            End If

            fw.Show(dblLeft, 10)
        End If

    End Sub

    Private Sub New()
    End Sub

#End Region

#Region " Host Application Events "

    Private Sub _objHostRootVisual_BindingValidationError(ByVal sender As Object, ByVal e As System.Windows.Controls.ValidationErrorEventArgs) Handles _objRootVisual.BindingValidationError

        Dim strControlName As String = "(none)"
        Dim objControl As Control = TryCast(e.OriginalSource, Control)

        If objControl IsNot Nothing AndAlso Not String.IsNullOrEmpty(objControl.Name) Then
            strControlName = objControl.Name
        End If

        Dim ex As Exception = e.Error.Exception

        While ex IsNot Nothing
            Me.HostExceptions.Add(New ExceptionWrapper(e.Action, strControlName, e.Error.Exception))
            ex = ex.InnerException
        End While

    End Sub

    Private Sub Application_UnhandledException(ByVal sender As Object, ByVal e As ApplicationUnhandledExceptionEventArgs) Handles _objApp.UnhandledException
        Debug.WriteLine(String.Format("{0} had exception.  {1}", Me.HostApplicationName, e.ExceptionObject.ToString))

        Dim ex As Exception = e.ExceptionObject

        While ex IsNot Nothing
            Me.HostExceptions.Add(New ExceptionWrapper(ex))
            ex = ex.InnerException
        End While

        e.Handled = True
    End Sub

#End Region

End Class