You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
11 KiB
288 lines
11 KiB
Imports System.Windows.Forms
|
|
Imports System.Drawing
|
|
Imports System.IO
|
|
Imports System.ComponentModel
|
|
Imports System.Reflection
|
|
|
|
Namespace PropertyGridEx
|
|
|
|
<Designer(GetType(System.Windows.Forms.Design.ControlDesigner)), _
|
|
ToolboxBitmap(GetType(PropertyGridEx))> _
|
|
Public Class PropertyGridEx
|
|
Inherits PropertyGrid
|
|
|
|
#Region "Protected variables and objects"
|
|
|
|
' CustomPropertyCollection assigned to MyBase.SelectedObject
|
|
Protected oCustomPropertyCollection As CustomPropertyCollection
|
|
Protected bShowCustomProperties As Boolean
|
|
|
|
' CustomPropertyCollectionSet assigned to MyBase.SelectedObjects
|
|
Protected oCustomPropertyCollectionSet As CustomPropertyCollectionSet
|
|
Protected bShowCustomPropertiesSet As Boolean
|
|
|
|
' Internal PropertyGrid Controls
|
|
Protected oPropertyGridView As Object
|
|
Protected oHotCommands As Object
|
|
Protected oDocComment As Object
|
|
Protected oToolStrip As ToolStrip
|
|
|
|
' Internal PropertyGrid Fields
|
|
Protected oDocCommentTitle As Label
|
|
Protected oDocCommentDescription As Label
|
|
Protected oPropertyGridEntries As FieldInfo
|
|
|
|
' Properties variables
|
|
Protected bAutoSizeProperties As Boolean
|
|
Protected bDrawFlatToolbar As Boolean
|
|
|
|
#End Region
|
|
|
|
#Region "Public Functions"
|
|
Public Sub New()
|
|
' This call is required by the Windows Form Designer.
|
|
InitializeComponent()
|
|
|
|
' Add any initialization after the InitializeComponent() call.
|
|
Me.DoubleBuffered = True
|
|
|
|
' Initialize collections
|
|
oCustomPropertyCollection = New CustomPropertyCollection
|
|
oCustomPropertyCollectionSet = New CustomPropertyCollectionSet
|
|
|
|
' Attach internal controls
|
|
oPropertyGridView = MyBase.GetType.BaseType.InvokeMember("gridView", BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance, Nothing, Me, Nothing)
|
|
oHotCommands = MyBase.GetType.BaseType.InvokeMember("hotcommands", BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance, Nothing, Me, Nothing)
|
|
oToolStrip = MyBase.GetType.BaseType.InvokeMember("toolStrip", BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance, Nothing, Me, Nothing)
|
|
oDocComment = MyBase.GetType.BaseType.InvokeMember("doccomment", BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance, Nothing, Me, Nothing)
|
|
|
|
' Attach DocComment internal fields
|
|
If oDocComment IsNot Nothing Then
|
|
oDocCommentTitle = oDocComment.GetType.InvokeMember("m_labelTitle", BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance, Nothing, oDocComment, Nothing)
|
|
oDocCommentDescription = oDocComment.GetType.InvokeMember("m_labelDesc", BindingFlags.NonPublic Or BindingFlags.GetField Or BindingFlags.Instance, Nothing, oDocComment, Nothing)
|
|
End If
|
|
|
|
' Attach PropertyGridView internal fields
|
|
If oPropertyGridView IsNot Nothing Then
|
|
oPropertyGridEntries = oPropertyGridView.GetType.GetField("allGridEntries", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)
|
|
End If
|
|
|
|
' Apply Toolstrip style
|
|
If oToolStrip IsNot Nothing Then
|
|
ApplyToolStripRenderMode(bDrawFlatToolbar)
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Public Sub MoveSplitterTo(ByVal x As Integer)
|
|
oPropertyGridView.GetType().InvokeMember("MoveSplitterTo", BindingFlags.InvokeMethod Or BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, oPropertyGridView, New Object() {x})
|
|
End Sub
|
|
|
|
Public Overrides Sub Refresh()
|
|
If bShowCustomPropertiesSet Then
|
|
MyBase.SelectedObjects = oCustomPropertyCollectionSet.ToArray
|
|
End If
|
|
MyBase.Refresh()
|
|
If bAutoSizeProperties Then AutoSizeSplitter()
|
|
End Sub
|
|
|
|
Public Sub SetComment(ByVal title As String, ByVal description As String)
|
|
oDocComment.SetComment(title, description)
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
#Region "Protected Functions"
|
|
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
|
|
MyBase.OnResize(e)
|
|
If bAutoSizeProperties Then AutoSizeSplitter()
|
|
End Sub
|
|
|
|
Protected Sub AutoSizeSplitter(Optional ByVal RightMargin As Integer = 24)
|
|
|
|
Dim oItemCollection As GridItemCollection = oPropertyGridEntries.GetValue(oPropertyGridView)
|
|
Dim oItem As GridItem = Nothing, oParent As GridItem = Nothing
|
|
If oItemCollection Is Nothing Then Exit Sub
|
|
|
|
Dim oGraphics As Drawing.Graphics = Drawing.Graphics.FromHwnd(Me.Handle)
|
|
Dim nested As Integer = 0
|
|
Dim CurWidth As Integer = 0
|
|
Dim MaxWidth As Integer = 0
|
|
|
|
For Each oItem In oItemCollection
|
|
oParent = oItem.Parent
|
|
Do While oParent IsNot Nothing
|
|
oParent = oParent.Parent
|
|
nested += 1
|
|
Loop
|
|
If oItem.GridItemType = GridItemType.Property Then
|
|
CurWidth = oGraphics.MeasureString(oItem.Label, Me.Font).Width + RightMargin + (nested - 1)
|
|
If CurWidth > MaxWidth Then
|
|
MaxWidth = CurWidth
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
MoveSplitterTo(MaxWidth)
|
|
End Sub
|
|
Protected Sub ApplyToolStripRenderMode(ByVal value As Boolean)
|
|
If value Then
|
|
oToolStrip.Renderer = New ToolStripSystemRenderer
|
|
Else
|
|
Dim Renderer As New ToolStripProfessionalRenderer(New CustomColorScheme())
|
|
Renderer.RoundedEdges = False
|
|
oToolStrip.Renderer = Renderer
|
|
End If
|
|
End Sub
|
|
#End Region
|
|
|
|
#Region "Properties"
|
|
|
|
<Category("Behavior"), _
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
|
|
DescriptionAttribute("Set the collection of the CustomProperty. Set ShowCustomProperties to True to enable it."), _
|
|
RefreshProperties(RefreshProperties.Repaint)> _
|
|
Public ReadOnly Property Item() As CustomPropertyCollection
|
|
Get
|
|
Return oCustomPropertyCollection
|
|
End Get
|
|
End Property
|
|
|
|
<Category("Behavior"), _
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
|
|
DescriptionAttribute("Set the CustomPropertyCollectionSet. Set ShowCustomPropertiesSet to True to enable it."), _
|
|
RefreshProperties(RefreshProperties.Repaint)> _
|
|
Public ReadOnly Property ItemSet() As CustomPropertyCollectionSet
|
|
Get
|
|
Return oCustomPropertyCollectionSet
|
|
End Get
|
|
End Property
|
|
|
|
<Category("Behavior"), _
|
|
DefaultValue(False), _
|
|
DescriptionAttribute("Move automatically the splitter to better fit all the properties shown.")> _
|
|
Public Property AutoSizeProperties() As Boolean
|
|
Get
|
|
Return bAutoSizeProperties
|
|
End Get
|
|
Set(ByVal Value As Boolean)
|
|
bAutoSizeProperties = Value
|
|
If Value Then AutoSizeSplitter()
|
|
End Set
|
|
End Property
|
|
|
|
<Category("Behavior"), _
|
|
DefaultValue(False), _
|
|
DescriptionAttribute("Use the custom properties collection as SelectedObject."), _
|
|
RefreshProperties(RefreshProperties.All)> _
|
|
Public Property ShowCustomProperties() As Boolean
|
|
Get
|
|
Return bShowCustomProperties
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If value = True Then
|
|
bShowCustomPropertiesSet = False
|
|
MyBase.SelectedObject = oCustomPropertyCollection
|
|
End If
|
|
bShowCustomProperties = value
|
|
End Set
|
|
End Property
|
|
|
|
<Category("Behavior"), _
|
|
DefaultValue(False), _
|
|
DescriptionAttribute("Use the custom properties collections as SelectedObjects."), _
|
|
RefreshProperties(RefreshProperties.All)> _
|
|
Public Property ShowCustomPropertiesSet() As Boolean
|
|
Get
|
|
Return bShowCustomPropertiesSet
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
If value = True Then
|
|
bShowCustomProperties = False
|
|
MyBase.SelectedObjects = oCustomPropertyCollectionSet.ToArray
|
|
End If
|
|
bShowCustomPropertiesSet = value
|
|
End Set
|
|
End Property
|
|
|
|
<Category("Appearance"), _
|
|
DefaultValue(False), _
|
|
DescriptionAttribute("Draw a flat toolbar")> _
|
|
Public Overloads Property DrawFlatToolbar() As Boolean
|
|
Get
|
|
Return bDrawFlatToolbar
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
bDrawFlatToolbar = value
|
|
ApplyToolStripRenderMode(bDrawFlatToolbar)
|
|
End Set
|
|
End Property
|
|
|
|
<Category("Appearance"), _
|
|
DisplayName("Toolstrip"), _
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
|
|
DescriptionAttribute("Toolbar object"), _
|
|
Browsable(True)> _
|
|
Public ReadOnly Property ToolStrip() As ToolStrip
|
|
Get
|
|
Return oToolStrip
|
|
End Get
|
|
End Property
|
|
|
|
<Category("Appearance"), _
|
|
DisplayName("Help"), _
|
|
DescriptionAttribute("DocComment object. Represent the comments area of the PropertyGrid."), _
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), _
|
|
Browsable(False)> _
|
|
Public ReadOnly Property DocComment() As Control
|
|
Get
|
|
Return oDocComment
|
|
End Get
|
|
End Property
|
|
|
|
<Category("Appearance"), _
|
|
DisplayName("HelpTitle"), _
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
|
|
DescriptionAttribute("Help Title Label."), _
|
|
Browsable(True)> _
|
|
Public ReadOnly Property DocCommentTitle() As Label
|
|
Get
|
|
Return oDocCommentTitle
|
|
End Get
|
|
End Property
|
|
|
|
<Category("Appearance"), _
|
|
DisplayName("HelpDescription"), _
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
|
|
DescriptionAttribute("Help Description Label."), _
|
|
Browsable(True)> _
|
|
Public ReadOnly Property DocCommentDescription() As Label
|
|
Get
|
|
Return oDocCommentDescription
|
|
End Get
|
|
End Property
|
|
|
|
<Category("Appearance"), _
|
|
DisplayName("HelpImageBackground"), _
|
|
DescriptionAttribute("Help Image Background.")> _
|
|
Public Property DocCommentImage() As Image
|
|
Get
|
|
Return oDocComment.BackgroundImage
|
|
End Get
|
|
Set(ByVal value As Image)
|
|
oDocComment.BackgroundImage = value
|
|
End Set
|
|
End Property
|
|
|
|
#End Region
|
|
|
|
Public Shadows Sub ExpandAllGridItems()
|
|
MyBase.ExpandAllGridItems()
|
|
If bAutoSizeProperties Then AutoSizeSplitter()
|
|
End Sub
|
|
|
|
End Class
|
|
|
|
End Namespace
|
|
|