Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports Microsoft.VisualBasic
'''
''' Winsock designer class provides designer time support for the Winsock component.
'''
Public Class WinsockDesigner
Inherits System.ComponentModel.Design.ComponentDesigner
Private lists As DesignerActionListCollection
'''
''' Creates a new instance of the WinsockDesigner class.
'''
'''
Public Sub New()
End Sub
'''
''' Initializes this instance of the WinsockDesigner class.
'''
''' The base component of the designer.
Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent)
MyBase.Initialize(component)
End Sub
'''
''' Gets the Verb collection.
'''
'''
''' The Verb collection is used to display links at the
''' bottom of the description in the Properties pane.
'''
Public Overrides ReadOnly Property Verbs() As System.ComponentModel.Design.DesignerVerbCollection
Get
Return New DesignerVerbCollection()
End Get
End Property
'''
''' Gets the Action list collection.
'''
'''
''' The Action list collection is used for the Smart Tag
''' popup to provide easy access to various properties/actions.
'''
Public Overrides ReadOnly Property ActionLists() As DesignerActionListCollection
Get
If lists Is Nothing Then
lists = New DesignerActionListCollection()
lists.Add(New WinsockActionList(Me.Component))
End If
Return lists
End Get
End Property
End Class
'''
''' Provides the action list for the Winsock component during design time.
'''
Public Class WinsockActionList
Inherits DesignerActionList
Private _wsk As Winsock
Private designerActionUISvc As DesignerActionUIService = Nothing
Private host As IDesignerHost
Private parentDesigner As IDesigner
'''
''' Initializes a new instance of the WinsockActionList class.
'''
''' The component used in initialization.
Public Sub New(ByVal component As IComponent)
MyBase.New(component)
Me._wsk = CType(component, Winsock)
Me.designerActionUISvc = CType(GetService(GetType(DesignerActionUIService)), DesignerActionUIService)
Me.host = Me.Component.Site.GetService(GetType(IDesignerHost))
Me.parentDesigner = host.GetDesigner(Me.Component)
End Sub
'''
''' Gets or sets a value indicating if Legacy support should be used or not.
'''
''' Legacy support is to support older winsock style connections.
Public Property LegacySupport() As Boolean
Get
Return _wsk.LegacySupport
End Get
Set(ByVal value As Boolean)
GetPropertyByName("LegacySupport").SetValue(_wsk, value)
Me.designerActionUISvc.Refresh(Me.Component)
End Set
End Property
'''
''' Gets or sets the winsock protocol to use when communicating with the remote computer.
'''
Public Property Protocol() As WinsockProtocol
Get
Return _wsk.Protocol
End Get
Set(ByVal value As WinsockProtocol)
GetPropertyByName("Protocol").SetValue(_wsk, value)
Me.designerActionUISvc.Refresh(Me.Component)
End Set
End Property
'''
''' Builds and retrieves the Action list itself.
'''
Public Overrides Function GetSortedActionItems() As DesignerActionItemCollection
Dim items As New DesignerActionItemCollection()
' create the headers
items.Add(New DesignerActionHeaderItem("Appearance & Behavior"))
items.Add(New DesignerActionHeaderItem("Events"))
items.Add(New DesignerActionHeaderItem("About"))
' add the properties
items.Add(New DesignerActionPropertyItem("LegacySupport", "Legacy Support", "Appearance & Behavior", "Enables legacy (VB6) send/receive support."))
items.Add(New DesignerActionPropertyItem("Protocol", "Protocol", "Appearance & Behavior", "Specifies whether the component should use the TCP or UDP protocol."))
' add the events
items.Add(New DesignerActionMethodItem(Me, "TriggerConnectedEvent", "Connected", "Events", "Takes you to the handler for the Connected event.", False))
items.Add(New DesignerActionMethodItem(Me, "TriggerConnectionRequestEvent", "ConnectionRequest", "Events", "Takes you to the handler for the ConnectionRequest event.", False))
items.Add(New DesignerActionMethodItem(Me, "TriggerDataArrivalEvent", "DataArrival", "Events", "Takes you to the handler for the DataArrival event.", False))
items.Add(New DesignerActionMethodItem(Me, "TriggerDisconnectedEvent", "Disconnected", "Events", "Takes you to the handler for the Disconnected event.", False))
items.Add(New DesignerActionMethodItem(Me, "TriggerErrorReceivedEvent", "ErrorReceived", "Events", "Takes you to the handler for the ErrorReceived event.", False))
items.Add(New DesignerActionMethodItem(Me, "TriggerStateChangedEvent", "StateChanged", "Events", "Takes you to the handler for the StateChanged event.", False))
' add support items
Dim ver As String = String.Format("{0}.{1}.{2}", My.Application.Info.Version.Major, My.Application.Info.Version.Minor, My.Application.Info.Version.Build)
items.Add(New DesignerActionMethodItem(Me, "ShowAbout", "About Winsock " & ver, "About", "Displays the about box.", False))
items.Add(New DesignerActionMethodItem(Me, "LaunchWebSite", "Kolkman Koding Website", "About", "Opens the author's website.", False))
Return items
End Function
'''
''' Gets the property information by the given name.
'''
''' The name of the property to get.
Private Function GetPropertyByName(ByVal propName As String) As PropertyDescriptor
Dim prop As PropertyDescriptor
prop = TypeDescriptor.GetProperties(_wsk)(propName)
If prop Is Nothing Then
Throw New ArgumentException("Invalid property.", propName)
Else
Return prop
End If
End Function
'''
''' Shows the about box.
'''
Public Sub ShowAbout()
Dim f As New frmAbout()
f.ShowDialog()
End Sub
'''
''' Launches the author's website.
'''
Public Sub LaunchWebSite()
System.Diagnostics.Process.Start("http://www.k-koding.com")
End Sub
Public Sub TriggerConnectedEvent()
CreateAndShowEvent("Connected")
End Sub
Public Sub TriggerConnectionRequestEvent()
CreateAndShowEvent("ConnectionRequest")
End Sub
Public Sub TriggerDataArrivalEvent()
CreateAndShowEvent("DataArrival")
End Sub
Public Sub TriggerDisconnectedEvent()
CreateAndShowEvent("Disconnected")
End Sub
Public Sub TriggerErrorReceivedEvent()
CreateAndShowEvent("ErrorReceived")
End Sub
Public Sub TriggerStateChangedEvent()
CreateAndShowEvent("StateChanged")
End Sub
Private Sub CreateAndShowEvent(ByVal eventName As String)
Dim evService As IEventBindingService = CType(Me.Component.Site.GetService(GetType(System.ComponentModel.Design.IEventBindingService)), IEventBindingService)
Dim ev As EventDescriptor = GetEvent(evService, eventName)
If ev IsNot Nothing Then
CreateEvent(evService, ev)
Me.designerActionUISvc.HideUI(Me.Component)
evService.ShowCode(Me.Component, ev)
End If
End Sub
Private Sub CreateEvent(ByRef evService As IEventBindingService, ByVal ev As EventDescriptor)
Dim epd As PropertyDescriptor = evService.GetEventProperty(ev)
Dim strEventName As String = Me.Component.Site.Name & "_" & ev.Name
Dim existing As Object = epd.GetValue(Me.Component)
'Only create if there isn't already a handler
If existing Is Nothing Then
epd.SetValue(Me.Component, strEventName)
End If
End Sub
Private Function GetEvent(ByRef evService As IEventBindingService, ByVal eventName As String) As EventDescriptor
If evService Is Nothing Then Return Nothing
' Attempt to obtain a PropertyDescriptor for a
' component event named "testEvent".
Dim edc As EventDescriptorCollection = TypeDescriptor.GetEvents(Me.Component)
If edc Is Nothing Or edc.Count = 0 Then
Return Nothing
End If
Dim ed As EventDescriptor = Nothing
' Search for an event named "Connected".
Dim edi As EventDescriptor
For Each edi In edc
If edi.Name = eventName Then
ed = edi
Exit For
End If
Next edi
If ed Is Nothing Then
Return Nothing
End If
Return ed
End Function
End Class