237 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			VB.net
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			VB.net
		
	
	
	
	
	
| Imports System.ComponentModel
 | |
| Imports System.ComponentModel.Design
 | |
| Imports Microsoft.VisualBasic
 | |
| 
 | |
| ''' <summary>
 | |
| ''' Winsock designer class provides designer time support for the Winsock component.
 | |
| ''' </summary>
 | |
| Public Class WinsockDesigner
 | |
|     Inherits System.ComponentModel.Design.ComponentDesigner
 | |
| 
 | |
|     Private lists As DesignerActionListCollection
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Creates a new instance of the WinsockDesigner class.
 | |
|     ''' </summary>
 | |
|     ''' <remarks></remarks>
 | |
|     Public Sub New()
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Initializes this instance of the WinsockDesigner class.
 | |
|     ''' </summary>
 | |
|     ''' <param name="component">The base component of the designer.</param>
 | |
|     Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent)
 | |
|         MyBase.Initialize(component)
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the Verb collection.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>
 | |
|     ''' The Verb collection is used to display links at the
 | |
|     ''' bottom of the description in the Properties pane.
 | |
|     ''' </remarks>
 | |
|     Public Overrides ReadOnly Property Verbs() As System.ComponentModel.Design.DesignerVerbCollection
 | |
|         Get
 | |
|             Return New DesignerVerbCollection()
 | |
|         End Get
 | |
|     End Property
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the Action list collection.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>
 | |
|     ''' The Action list collection is used for the Smart Tag
 | |
|     ''' popup to provide easy access to various properties/actions.
 | |
|     ''' </remarks>
 | |
|     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
 | |
| 
 | |
| ''' <summary>
 | |
| ''' Provides the action list for the Winsock component during design time.
 | |
| ''' </summary>
 | |
| Public Class WinsockActionList
 | |
|     Inherits DesignerActionList
 | |
| 
 | |
|     Private _wsk As Winsock
 | |
|     Private designerActionUISvc As DesignerActionUIService = Nothing
 | |
| 
 | |
|     Private host As IDesignerHost
 | |
|     Private parentDesigner As IDesigner
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Initializes a new instance of the WinsockActionList class.
 | |
|     ''' </summary>
 | |
|     ''' <param name="component">The component used in initialization.</param>
 | |
|     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
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets a value indicating if Legacy support should be used or not.
 | |
|     ''' </summary>
 | |
|     ''' <remarks>Legacy support is to support older winsock style connections.</remarks>
 | |
|     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
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets or sets the winsock protocol to use when communicating with the remote computer.
 | |
|     ''' </summary>
 | |
|     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
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Builds and retrieves the Action list itself.
 | |
|     ''' </summary>
 | |
|     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
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Gets the property information by the given name.
 | |
|     ''' </summary>
 | |
|     ''' <param name="propName">The name of the property to get.</param>
 | |
|     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
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Shows the about box.
 | |
|     ''' </summary>
 | |
|     Public Sub ShowAbout()
 | |
|         Dim f As New frmAbout()
 | |
|         f.ShowDialog()
 | |
|     End Sub
 | |
| 
 | |
|     ''' <summary>
 | |
|     ''' Launches the author's website.
 | |
|     ''' </summary>
 | |
|     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
 | 
