Imports System.ComponentModel Imports DevExpress.XtraEditors.Repository Imports DevExpress.XtraVerticalGrid Imports DigitalData.GUIs.ClientSuite.ClassControlUtils Imports DigitalData.GUIs.ClientSuite.ControlProperties Public Class frmEntityDesigner Private _IsMouseDown As Boolean = False Private _IsMouseMoving As Boolean = False Private _BeginPosition As Point = Nothing Private _EndPosition As Point = Nothing Private _LastCursorPosition As Point = Nothing Private _CurrentControl As Control = Nothing Private _ControlBuilder As ClassControlBuilder = Nothing Private _DragDropButtonList As New List(Of Button) Private Sub frmEntityDesigner_Load(sender As Object, e As EventArgs) Handles Me.Load ' Assign Control Types to DragDrop Buttons btnLabel.Tag = ControlType.Label btnTextbox.Tag = ControlType.TextBox btnCombobox.Tag = ControlType.Combobox ' Add Default Editors for certain datatypes in the PropertyGrid Dim oColorEditor = New RepositoryItemColorEdit() Dim oBooleanEditor = New RepositoryItemCheckEdit() PropertyGridMain.DefaultEditors.Add(GetType(Color), oColorEditor) PropertyGridMain.DefaultEditors.Add(GetType(Boolean), oBooleanEditor) ' Create the control builder _ControlBuilder = New ClassControlBuilder(DesignMode:=True) ' Create a list of all DragDrop buttons _DragDropButtonList.Add(btnLabel) _DragDropButtonList.Add(btnTextbox) _DragDropButtonList.Add(btnCombobox) ' Add EventHandlers for each button For Each oButton As Button In _DragDropButtonList AddHandler oButton.MouseDown, AddressOf DragDropButton_MouseDown AddHandler oButton.MouseMove, AddressOf DragDropButton_MouseMove Next End Sub #Region "Control Buttons Events" Private Sub DragDropButton_MouseDown(sender As Object, e As MouseEventArgs) _IsMouseDown = True End Sub Private Sub DragDropButton_MouseMove(sender As Button, e As MouseEventArgs) If _IsMouseDown Then Dim oButton = sender Dim oType As ControlType = oButton.Tag oButton.DoDragDrop(oType.ToString, DragDropEffects.Copy) End If End Sub Private Sub SnapPanelMain_DragEnter(sender As Object, e As DragEventArgs) Handles PanelMain.DragEnter If (e.Data.GetDataPresent(DataFormats.Text)) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub Private Sub SnapPanelMain_DragDrop(sender As Object, e As DragEventArgs) Handles PanelMain.DragDrop Dim data As String = e.Data.GetData(DataFormats.Text) Dim type = ClassUtils.ToEnum(Of ClassControlUtils.ControlType)(data) HandleDragDrop(type) End Sub #End Region #Region "Control Events" Private Sub Control_MouseDown(sender As Control, e As MouseEventArgs) If e.Button = MouseButtons.Left Then _CurrentControl = sender _BeginPosition = e.Location ' Set the mode flag to signal the MouseMove event handler that it ' needs to now calculate new positions for our control _IsMouseMoving = True End If End Sub Private Sub Control_MouseMove(sender As Object, e As MouseEventArgs) If _CurrentControl Is Nothing Or Not _IsMouseMoving Then Exit Sub End If Cursor = Cursors.Hand Dim oCursorPosition As Point = PanelMain.PointToClient(Cursor.Position) Dim oNewPosition As New Point(oCursorPosition.X - _BeginPosition.X, oCursorPosition.Y - _BeginPosition.Y) ' If control will be moved out the of bounds of the panel at TOP/LEFT side, exit. If oNewPosition.X < 0 Or oNewPosition.Y < 0 Then Exit Sub End If _CurrentControl.Location = oNewPosition End Sub Private Sub Control_MouseUp(sender As Object, e As MouseEventArgs) If Not _IsMouseMoving Then Exit Sub End If _IsMouseMoving = False _EndPosition = e.Location Cursor = Cursors.Default End Sub Private Sub Control_MouseClick(sender As Control, e As MouseEventArgs) TabControlMain.SelectedTabPage = TabPageProperties HandleLoadProperties(sender) End Sub Private Sub Control_MouseEnter(sender As Control, e As EventArgs) Cursor = Cursors.Hand End Sub Private Sub Control_MouseLeave(sender As Control, e As EventArgs) Cursor = Cursors.Default End Sub Private Sub SetEventHandlers(Control As Control) AddHandler Control.MouseDown, AddressOf Control_MouseDown AddHandler Control.MouseMove, AddressOf Control_MouseMove AddHandler Control.MouseUp, AddressOf Control_MouseUp AddHandler Control.MouseClick, AddressOf Control_MouseClick AddHandler Control.MouseEnter, AddressOf Control_MouseEnter AddHandler Control.MouseLeave, AddressOf Control_MouseLeave End Sub #End Region Private Sub HandleLoadProperties(Control As Control) Dim oMetadata As ControlMetadata = Control.Tag Dim oType = oMetadata.Type Dim oProps As ClassBaseProperties = Nothing Select Case oType Case ControlType.Label oProps = New ClassLabelProperties With { .Id = oMetadata.Id, .Name = Control.Name, .Type = oType, .Location = Control.Location, .Size = Control.Size, .Font = Control.Font, .Color = Control.ForeColor, .Caption = Control.Text } Case ControlType.TextBox oProps = New ClassTextboxProperties With { .Id = oMetadata.Id, .Name = Control.Name, .Type = oType, .Location = Control.Location, .Size = Control.Size, .Font = Control.Font, .Color = ForeColor, .IsReadOnly = False, .IsRequired = False, .Multiline = False, .TabIndex = 0, .TabStop = 1, .DefaultValue = "" } Case ControlType.Combobox oProps = New ClassComboboxProperties() With { .Id = oMetadata.Id, .Name = Control.Name, .Type = oType, .Location = Control.Location, .Size = Control.Size, .Font = Control.Font, .Color = ForeColor, .IsReadOnly = False, .IsRequired = False, .TabIndex = 0, .TabStop = 1, .DefaultValue = "", .StaticList = New StaticList() } Case Else Exit Sub End Select PropertyGridMain.SelectedObject = oProps End Sub Private Sub HandleDragDrop(type As ControlType) Dim oCursorPosition As Point = PanelMain.PointToClient(Cursor.Position) Dim oControl As Control = Nothing Select Case type Case ControlType.Label oControl = _ControlBuilder.CreateLabel() Case ControlType.TextBox oControl = _ControlBuilder.CreateTextbox() Case ControlType.Combobox oControl = _ControlBuilder.CreateCombobox() Case Else MsgBox($"Unknown Control Type {type.ToString}") Exit Sub End Select ' Set Location to current cursor position oControl.Location = oCursorPosition ' Attach Eventhandlers SetEventHandlers(oControl) ' Add the control to the panel PanelMain.Controls.Add(oControl) End Sub Private Sub PropertyGridMain_RowChanged(sender As Object, e As DevExpress.XtraVerticalGrid.Events.RowChangedEventArgs) Handles PropertyGridMain.RowChanged If e.ChangeType <> RowChangeTypeEnum.Value Then Exit Sub End If Dim oPropertyName As String = e.Properties.FieldName Dim oPropertyValue = e.Properties.Value Select Case oPropertyName Case "Name" _CurrentControl.Name = oPropertyValue Case "Location" _CurrentControl.Location = oPropertyValue Case "X" _CurrentControl.Location = New Point(oPropertyValue, _CurrentControl.Location.Y) Case "Y" _CurrentControl.Location = New Point(_CurrentControl.Location.X, oPropertyValue) Case "Size" _CurrentControl.Size = oPropertyValue Case "Width" _CurrentControl.Size = New Size(oPropertyValue, _CurrentControl.Height) Case "Height" _CurrentControl.Size = New Size(_CurrentControl.Width, oPropertyValue) Case "Font" _CurrentControl.Font = oPropertyValue Case "Color" _CurrentControl.ForeColor = oPropertyValue Case "Caption" If TypeOf _CurrentControl Is Label Then _CurrentControl.Text = oPropertyValue End If End Select End Sub Private Sub frmEntityDesigner_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing My.MainForm.RibbonPageCategoryEntityDesigner.Visible = False End Sub End Class