Imports System.Drawing.Drawing2D

Module ConversionFunctions
    Function ToBrush(ByVal A As Integer, ByVal R As Integer, ByVal G As Integer, ByVal B As Integer) As Brush
        Return New SolidBrush(Color.FromArgb(A, R, G, B))
    End Function
    Function ToBrush(ByVal R As Integer, ByVal G As Integer, ByVal B As Integer) As Brush
        Return New SolidBrush(Color.FromArgb(R, G, B))
    End Function
    Function ToBrush(ByVal A As Integer, ByVal C As Color) As Brush
        Return New SolidBrush(Color.FromArgb(A, C))
    End Function
    Function ToBrush(ByVal Pen As Pen) As Brush
        Return New SolidBrush(Pen.Color)
    End Function
    Function ToBrush(ByVal Color As Color) As Brush
        Return New SolidBrush(Color)
    End Function
    Function ToPen(ByVal A As Integer, ByVal R As Integer, ByVal G As Integer, ByVal B As Integer) As Pen
        Return New Pen(New SolidBrush(Color.FromArgb(A, R, G, B)))
    End Function
    Function ToPen(ByVal R As Integer, ByVal G As Integer, ByVal B As Integer) As Pen
        Return New Pen(New SolidBrush(Color.FromArgb(R, G, B)))
    End Function
    Function ToPen(ByVal A As Integer, ByVal C As Color) As Pen
        Return New Pen(New SolidBrush(Color.FromArgb(A, C)))
    End Function
    Function ToPen(ByVal Brush As SolidBrush) As Pen
        Return New Pen(Brush)
    End Function
    Function ToPen(ByVal Color As Color) As Pen
        Return New Pen(New SolidBrush(Color))
    End Function
End Module
Module RRM
    Public Function RoundRect(ByVal Rectangle As Rectangle, ByVal Curve As Integer) As GraphicsPath
        Dim P As GraphicsPath = New GraphicsPath()
        Dim ArcRectangleWidth As Integer = Curve * 2
        P.AddArc(New Rectangle(Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -180, 90)
        P.AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -90, 90)
        P.AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 0, 90)
        P.AddArc(New Rectangle(Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 90, 90)
        P.AddLine(New Point(Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y), New Point(Rectangle.X, Curve + Rectangle.Y))
        Return P
    End Function
    Public Function RoundRect(ByVal X As Integer, ByVal Y As Integer, ByVal Width As Integer, ByVal Height As Integer, ByVal Curve As Integer) As GraphicsPath
        Dim Rectangle As Rectangle = New Rectangle(X, Y, Width, Height)
        Dim P As GraphicsPath = New GraphicsPath()
        Dim ArcRectangleWidth As Integer = Curve * 2
        P.AddArc(New Rectangle(Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -180, 90)
        P.AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), -90, 90)
        P.AddArc(New Rectangle(Rectangle.Width - ArcRectangleWidth + Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 0, 90)
        P.AddArc(New Rectangle(Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y, ArcRectangleWidth, ArcRectangleWidth), 90, 90)
        P.AddLine(New Point(Rectangle.X, Rectangle.Height - ArcRectangleWidth + Rectangle.Y), New Point(Rectangle.X, Curve + Rectangle.Y))
        Return P
    End Function
End Module

Class GraphiteButton
    Inherits Control

    Enum MouseState
        None = 0
        Over = 1
        Down = 2
    End Enum

    Private State As MouseState = 0

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim G As Graphics = e.Graphics

        G.FillRectangle(ToBrush(Color.FromArgb(232, 232, 232)), ClientRectangle)
        G.FillRectangle(ToBrush(120, Color.White), New Rectangle(0, 0, Width, CInt(Height / 2)))
        Select Case Enabled
            Case True
                Select Case State
                    Case MouseState.Over
                        Dim Whit As New GraphicsPath
                        Whit.AddEllipse(New Rectangle(0, 0, Width, Height * 2))

                        Dim Whity As New PathGradientBrush(Whit)
                        Whity.CenterColor = Color.FromArgb(120, Color.White)

                        Whity.SurroundColors = New Color() {Color.Transparent}

                        G.FillEllipse(Whity, New Rectangle(0, 0, Width, Height * 2))
                    Case MouseState.Down
                        Dim Whit As New GraphicsPath
                        Whit.AddEllipse(New Rectangle(0, 0, Width, Height * 2))

                        Dim Whity As New PathGradientBrush(Whit)
                        Whity.CenterColor = Color.FromArgb(120, Color.White)

                        Whity.SurroundColors = New Color() {Color.Transparent}

                        G.FillEllipse(Whity, New Rectangle(0, 0, Width, Height * 2))
                        G.FillRectangle(ToBrush(20, Color.Black), ClientRectangle)
                End Select

                G.DrawString(Text, Font, Brushes.Black, New Point(CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2)), CInt((Height / 2) - (G.MeasureString(Text, Font).Height / 2))))
            Case False
                G.DrawString(Text, Font, Brushes.White, New Point(CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2)) + 1, CInt((Height / 2) - (G.MeasureString(Text, Font).Height / 2)) + 1))
                G.DrawString(Text, Font, Brushes.Gray, New Point(CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2)), CInt((Height / 2) - (G.MeasureString(Text, Font).Height / 2))))
        End Select


        G.SmoothingMode = SmoothingMode.HighQuality
        G.DrawPath(ToPen(157, 157, 157), RoundRect(0, 0, Width - 1, Height - 1, 2))
        G.DrawRectangle(ToPen(40, Color.White), New Rectangle(1, 1, Width - 3, Height - 3))
    End Sub

    Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
        MyBase.OnMouseEnter(e) : State = MouseState.Over : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
        MyBase.OnMouseLeave(e) : State = MouseState.None : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e) : State = MouseState.Down : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseUp(e) : State = MouseState.Over : Invalidate()
    End Sub
End Class

Class GraphiteButtonToggle
    Inherits Control

    Private _toggled As Boolean
    Public Property Toggled() As Boolean
        Get
            Return _toggled
        End Get
        Set(ByVal value As Boolean)
            _toggled = value
            Invalidate()
        End Set
    End Property

    Enum MouseState
        None = 0
        Over = 1
        Down = 2
    End Enum

    Private State As MouseState = 0

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim G As Graphics = e.Graphics

        G.FillRectangle(ToBrush(Color.FromArgb(232, 232, 232)), ClientRectangle)
        G.FillRectangle(ToBrush(120, Color.White), New Rectangle(0, 0, Width, CInt(Height / 2)))
        Select Case Enabled
            Case True
                If Not Toggled Then
                    Select Case State
                        Case MouseState.Over
                            Dim Whit As New GraphicsPath
                            Whit.AddEllipse(New Rectangle(0, 0, Width, Height * 2))

                            Dim Whity As New PathGradientBrush(Whit)
                            Whity.CenterColor = Color.FromArgb(120, Color.White)

                            Whity.SurroundColors = New Color() {Color.Transparent}

                            G.FillEllipse(Whity, New Rectangle(0, 0, Width, Height * 2))
                        Case MouseState.Down
                            Dim Whit As New GraphicsPath
                            Whit.AddEllipse(New Rectangle(0, 0, Width, Height * 2))

                            Dim Whity As New PathGradientBrush(Whit)
                            Whity.CenterColor = Color.FromArgb(120, Color.White)

                            Whity.SurroundColors = New Color() {Color.Transparent}

                            G.FillEllipse(Whity, New Rectangle(0, 0, Width, Height * 2))
                            G.FillRectangle(ToBrush(20, Color.Black), ClientRectangle)
                    End Select
                Else
                    Dim Whit As New GraphicsPath
                    Whit.AddEllipse(New Rectangle(0, 0, Width, Height * 2))

                    Dim Whity As New PathGradientBrush(Whit)
                    Whity.CenterColor = Color.FromArgb(120, Color.White)

                    Whity.SurroundColors = New Color() {Color.Transparent}

                    G.FillEllipse(Whity, New Rectangle(0, 0, Width, Height * 2))
                    G.FillRectangle(ToBrush(20, Color.Black), ClientRectangle)
                End If

                G.DrawString(Text, Font, Brushes.Black, New Point(CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2)), CInt((Height / 2) - (G.MeasureString(Text, Font).Height / 2))))
            Case False
                G.DrawString(Text, Font, Brushes.White, New Point(CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2)) + 1, CInt((Height / 2) - (G.MeasureString(Text, Font).Height / 2)) + 1))
                G.DrawString(Text, Font, Brushes.Gray, New Point(CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2)), CInt((Height / 2) - (G.MeasureString(Text, Font).Height / 2))))
        End Select


        G.SmoothingMode = SmoothingMode.HighQuality
        G.DrawPath(ToPen(157, 157, 157), RoundRect(0, 0, Width - 1, Height - 1, 2))
        G.DrawRectangle(ToPen(40, Color.White), New Rectangle(1, 1, Width - 3, Height - 3))
    End Sub

    Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
        MyBase.OnMouseEnter(e) : State = MouseState.Over : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
        MyBase.OnMouseLeave(e) : State = MouseState.None : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e) : State = MouseState.Down : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseUp(e) : State = MouseState.Over : Invalidate()
    End Sub

    Protected Overrides Sub OnMouseClick(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick(e) : Toggled = Not Toggled : Invalidate()
    End Sub
End Class

Class GraphiteFrame
    Inherits ContainerControl
    Enum TAlign
        Left = 0
        Center = 1
        Right = 2
    End Enum

    Private TA As TAlign
    Public Property TextAlignment() As TAlign
        Get
            Return TA
        End Get
        Set(ByVal value As TAlign)
            TA = value
            Invalidate()
        End Set
    End Property

    Sub New()
        Size = New Size(275, 75)
        TA = TAlign.Left
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim G As Graphics = e.Graphics

        G.Clear(Color.FromArgb(236, 237, 239))

        G.DrawRectangle(ToPen(165, 166, 168), New Rectangle(0, CInt(G.MeasureString(Text, Font).Height / 2), Width - 1, Height - 1 - CInt(G.MeasureString(Text, Font).Height / 2)))

        Dim TOff As Integer = 0
        Select Case TA
            Case TAlign.Left
                TOff = 6
            Case TAlign.Right
                TOff = Width - 6 - G.MeasureString(Text, Font).Width
            Case TAlign.Center
                TOff = CInt((Width / 2) - (G.MeasureString(Text, Font).Width / 2))
        End Select

        G.FillRectangle(ToBrush(236, 237, 239), New Rectangle(New Point(TOff, 0), G.MeasureString(Text, Font).ToSize))

        G.DrawString(Text, Font, Brushes.Black, TOff, 0)
    End Sub
End Class

Class GraphiteProgress
    Inherits Control

    Private Max As Integer
    Public Property Maximum() As Integer
        Get
            Return Max
        End Get
        Set(ByVal value As Integer)
            If value > 0 Then Max = value
            If Max < Val Then Val = Max
            Invalidate()
        End Set
    End Property

    Private Val As Integer
    Public Property Value() As Integer
        Get
            Return Val
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then Val = 0 Else If value > Max Then Val = Max Else Val = value
            Invalidate()
        End Set
    End Property

    Sub New()
        Max = 100
    End Sub

    Protected Overrides Sub CreateHandle()
        DoubleBuffered = True
        MyBase.CreateHandle()
        Dim Animation As New Timer With {.Interval = 50}
        AddHandler Animation.Tick, AddressOf AnimationHandle
        Animation.Start()
    End Sub

    Dim Offset As Integer = 0

    Sub AnimationHandle()
        If Offset < 7 Then Offset += 1 Else Offset = 0
        Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim G As Graphics = e.Graphics

        G.SmoothingMode = SmoothingMode.HighQuality

        G.Clear(Color.FromArgb(225, 226, 228))

        Dim Fill As Rectangle = New Rectangle(2, 2, CInt((Width - 5) * (Val / Max)), Height - 5)
        G.FillRectangle(ToBrush(180, Color.Black), Fill)

        G.RenderingOrigin = New Point(Offset, 0)
        Dim KP As New HatchBrush(HatchStyle.WideUpwardDiagonal, Color.FromArgb(40, Color.Black), Color.Empty)
        G.FillRectangle(KP, Fill)

        'If Value > 2 Then
        '    For x = 0 To Math.Floor(Fill.Width / 10)
        '        Dim points As Point() = {New Point(x * 10, 3), New Point((x * 10) - 5, Height - 3), New Point((x * 10) - 10, Height - 3), New Point((x * 10) - 5, 3)}
        '        G.FillPolygon(ToBrush(40, Color.Black), points)
        '    Next
        'End If

        G.DrawRectangle(ToPen(40, Color.Black), Fill)
        G.FillRectangle(ToBrush(40, Color.White), New Rectangle(0, 0, Width, CInt(Height / 2)))
        G.DrawPath(ToPen(50, Color.Black), RoundRect(0, 0, Width - 1, Height - 1, 2))
    End Sub
End Class

Class GraphiteRadio
    Inherits Control

    Private [Check] As Boolean
    Public Property Checked() As Boolean
        Get
            Return [Check]
        End Get
        Set(ByVal value As Boolean)
            [Check] = value
            Invalidate()
        End Set
    End Property

    Private aZ As Boolean
    Public Overrides Property Autosize() As Boolean
        Get
            Return aZ
        End Get
        Set(ByVal value As Boolean)
            aZ = value
            Invalidate()
        End Set
    End Property


    Sub New()
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        BackColor = Color.Transparent
        Autosize = True
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim Ell As Rectangle = New Rectangle(0, 0, 12, 12)
        Dim G As Graphics = e.Graphics

        If Autosize Then
            Size = New Size(Ell.Width + 5 + G.MeasureString(Text, Font).Width, _
                                  Ell.Height + 1)
        End If

        G.Clear(Parent.FindForm.BackColor)
        G.SmoothingMode = SmoothingMode.HighQuality

        If Enabled Then
            G.FillEllipse(Brushes.White, Ell)
            G.DrawEllipse(ToPen(40, Color.Black), Ell)

            If Checked Then
                G.FillEllipse(ToBrush(180, Color.Black), New Rectangle(New Point(Ell.X + 3, Ell.Y + 3), New Size(Ell.Width - 6, Ell.Height - 6)))
            End If

            G.DrawString(Text, Font, Brushes.Black, New Point(5 + Ell.X + Ell.Width, CInt(((Ell.Y + Ell.Width) / 2) - (G.MeasureString(Text, Font).Height / 2))))
        Else
            G.DrawEllipse(ToPen(40, Color.Black), Ell)

            If Checked Then
                G.FillEllipse(ToBrush(80, Color.Black), New Rectangle(New Point(Ell.X + 3, Ell.Y + 3), New Size(Ell.Width - 6, Ell.Height - 6)))
            End If

            G.DrawString(Text, Font, Brushes.DimGray, New Point(5 + Ell.X + Ell.Width, CInt(((Ell.Y + Ell.Width) / 2) - (G.MeasureString(Text, Font).Height / 2))))
        End If
    End Sub

    Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
        MyBase.OnTextChanged(e)
        Invalidate()
    End Sub

    Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
        MyBase.OnClick(e)
        If Enabled Then
            If Not Checked Then Checked = True

            For Each ctl As Control In Parent.Controls
                If TypeOf ctl Is GraphiteRadio Then
                    If ctl.Handle = Me.Handle Then Continue For
                    If ctl.Enabled Then DirectCast(ctl, GraphiteRadio).Checked = False
                End If
            Next
        End If
    End Sub
End Class

Class GraphiteTabControl
    Inherits TabControl

    Sub New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or _
        ControlStyles.ResizeRedraw Or _
        ControlStyles.UserPaint Or _
        ControlStyles.DoubleBuffer, True)
    End Sub
    Protected Overrides Sub CreateHandle()
        MyBase.CreateHandle()
        Select Case Alignment
            Case TabAlignment.Left
                SizeMode = TabSizeMode.Fixed
                ItemSize = New Size(20, 75)
            Case TabAlignment.Right
                SizeMode = TabSizeMode.Fixed
                ItemSize = New Size(20, 75)
            Case Else
                SizeMode = TabSizeMode.Normal
                ItemSize = New Size(77, 21)
        End Select
    End Sub
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim G As Graphics = e.Graphics
        Dim ItemBounds As Rectangle
        Dim TextBrush As New SolidBrush(Color.Empty)
        Dim SOFF As Integer = 0
        G.Clear(Color.FromArgb(236, 237, 239))



        For TabItemIndex As Integer = 0 To Me.TabCount - 1
            ItemBounds = Me.GetTabRect(TabItemIndex)

            If Not TabItemIndex = SelectedIndex Then
                SOFF = 2
                
                Select Case Alignment
                    Case TabAlignment.Left
                        G.FillPath(ToBrush(216, 217, 219), RoundRect(New Rectangle(New Point(ItemBounds.X + SOFF, ItemBounds.Y), New Size(ItemBounds.Width, ItemBounds.Height)), 2))
                        G.DrawPath(ToPen(90, Color.Black), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y), New Size(ItemBounds.Width, ItemBounds.Height)), 2))

                        Dim sf As New StringFormat
                        sf.LineAlignment = StringAlignment.Center
                        sf.Alignment = StringAlignment.Center
                        TextBrush.Color = Color.FromArgb(80, 80, 80)
                        Try
                            G.DrawString(TabPages(TabItemIndex).Text, New Font(Font.Name, Font.Size - 1), TextBrush, New Rectangle(GetTabRect(TabItemIndex).Location, GetTabRect(TabItemIndex).Size), sf)
                            TabPages(TabItemIndex).BackColor = Color.FromArgb(236, 237, 239)
                        Catch : End Try
                    Case TabAlignment.Right
                        G.FillPath(ToBrush(216, 217, 219), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y + SOFF), New Size(ItemBounds.Width, ItemBounds.Height)), 2))
                        G.DrawPath(ToPen(90, Color.Black), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y + SOFF), New Size(ItemBounds.Width, ItemBounds.Height)), 2))

                        Dim sf As New StringFormat
                        sf.LineAlignment = StringAlignment.Center
                        sf.Alignment = StringAlignment.Center
                        TextBrush.Color = Color.FromArgb(80, 80, 80)
                        Try
                            G.DrawString(TabPages(TabItemIndex).Text, New Font(Font.Name, Font.Size - 1), TextBrush, New Rectangle(GetTabRect(TabItemIndex).Location, GetTabRect(TabItemIndex).Size), sf)
                            TabPages(TabItemIndex).BackColor = Color.FromArgb(236, 237, 239)
                        Catch : End Try
                    Case TabAlignment.Top
                        G.FillPath(ToBrush(216, 217, 219), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y + SOFF), New Size(ItemBounds.Width, ItemBounds.Height)), 2))
                        G.DrawPath(ToPen(90, Color.Black), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y + SOFF), New Size(ItemBounds.Width, ItemBounds.Height)), 2))

                        Dim sf As New StringFormat
                        sf.LineAlignment = StringAlignment.Center
                        sf.Alignment = StringAlignment.Center
                        TextBrush.Color = Color.FromArgb(80, 80, 80)
                        Try
                            G.DrawString(TabPages(TabItemIndex).Text, New Font(Font.Name, Font.Size - 1), TextBrush, New Rectangle(GetTabRect(TabItemIndex).Location, GetTabRect(TabItemIndex).Size), sf)
                            TabPages(TabItemIndex).BackColor = Color.FromArgb(236, 237, 239)
                        Catch : End Try
                    Case TabAlignment.Bottom
                        G.FillPath(ToBrush(216, 217, 219), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y - 6 + SOFF), New Size(ItemBounds.Width, ItemBounds.Height)), 2))
                        G.DrawPath(ToPen(90, Color.Black), RoundRect(New Rectangle(New Point(ItemBounds.X, ItemBounds.Y - 6 + SOFF), New Size(ItemBounds.Width, ItemBounds.Height)), 2))

                        Dim sf As New StringFormat
                        sf.LineAlignment = StringAlignment.Center
                        sf.Alignment = StringAlignment.Center
                        TextBrush.Color = Color.FromArgb(80, 80, 80)
                        Try
                            G.DrawString(TabPages(TabItemIndex).Text, New Font(Font.Name, Font.Size - 1), TextBrush, New Rectangle(GetTabRect(TabItemIndex).Location - New Point(0, 2), GetTabRect(TabItemIndex).Size), sf)
                            TabPages(TabItemIndex).BackColor = Color.FromArgb(236, 237, 239)
                        Catch : End Try
                End Select

            End If
        Next
        Select Case Alignment
            Case TabAlignment.Top
                G.FillPath(ToBrush(236, 237, 239), RoundRect(0, 20, Width - 1, Height - 21, 2))
                G.DrawPath(ToPen(150, 151, 153), RoundRect(0, 20, Width - 1, Height - 21, 2))
            Case TabAlignment.Bottom
                G.DrawPath(ToPen(150, 151, 153), RoundRect(0, 0, Width - 1, Height - 22, 2))
                G.FillPath(ToBrush(236, 237, 239), RoundRect(1, 1, Width - 3, Height - 23, 2))
            Case TabAlignment.Right
                G.FillPath(ToBrush(236, 237, 239), RoundRect(0, 2, Width - 76, Height - 3, 2))
                G.DrawPath(ToPen(150, 151, 153), RoundRect(0, 2, Width - 76, Height - 3, 2))
            Case TabAlignment.Left
                G.FillPath(ToBrush(236, 237, 239), RoundRect(75, 2, Width - 76, Height - 3, 2))
                G.DrawPath(ToPen(150, 151, 153), RoundRect(75, 2, Width - 76, Height - 3, 2))
        End Select

        For TabItemIndex As Integer = 0 To Me.TabCount - 1
            ItemBounds = Me.GetTabRect(TabItemIndex)

            If TabItemIndex = SelectedIndex Then
                
                Select Case Alignment
                    Case TabAlignment.Top
                        G.FillPath(ToBrush(236, 237, 239), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 3, ItemBounds.Height - 2)), 2))
                        G.DrawPath(ToPen(150, 151, 153), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 2, ItemBounds.Height - 2)), 2))

                        G.FillRectangle(ToBrush(236, 237, 239), New Rectangle(New Point(ItemBounds.X - 1, ItemBounds.Y + 1), New Size(ItemBounds.Width + 1, ItemBounds.Height)))
                    Case TabAlignment.Bottom
                        G.FillPath(ToBrush(236, 237, 239), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 3, ItemBounds.Height - 2)), 2))
                        G.DrawPath(ToPen(150, 151, 153), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 2, ItemBounds.Height - 2)), 2))

                        G.FillRectangle(ToBrush(236, 237, 239), New Rectangle(New Point(ItemBounds.X - 1, ItemBounds.Y - 2), New Size(ItemBounds.Width + 1, ItemBounds.Height)))
                    Case TabAlignment.Left
                        G.FillPath(ToBrush(236, 237, 239), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 3, ItemBounds.Height + 2)), 2))
                        G.DrawPath(ToPen(150, 151, 153), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 2, ItemBounds.Height + 1)), 2))

                        G.FillRectangle(ToBrush(236, 237, 239), New Rectangle(New Point(ItemBounds.X + 1, ItemBounds.Y + 1), New Size(ItemBounds.Width + 6, ItemBounds.Height)))
                    Case TabAlignment.Right
                        G.FillPath(ToBrush(236, 237, 239), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 3, ItemBounds.Height + 1)), 2))
                        G.DrawPath(ToPen(150, 151, 153), RoundRect(New Rectangle(New Point(ItemBounds.X - 2, ItemBounds.Y), New Size(ItemBounds.Width + 2, ItemBounds.Height + 2)), 2))

                        G.FillRectangle(ToBrush(236, 237, 239), New Rectangle(New Point(ItemBounds.X - 7, ItemBounds.Y + 1), New Size(ItemBounds.Width + 6, ItemBounds.Height + 1)))
                End Select
                SOFF = 0

                Dim sf As New StringFormat
                sf.LineAlignment = StringAlignment.Center
                sf.Alignment = StringAlignment.Center
                TextBrush.Color = Color.FromArgb(80, 80, 80)
                Try
                    G.DrawString(TabPages(TabItemIndex).Text, Font, TextBrush, New Rectangle(GetTabRect(TabItemIndex).Location + New Point(0, SOFF), GetTabRect(TabItemIndex).Size), sf)
                    TabPages(TabItemIndex).BackColor = Color.FromArgb(236, 237, 239)
                Catch : End Try

            End If
        Next
    End Sub

End Class

Class GraphiteTheme
    Inherits ContainerControl

    Sub New()
        Dock = DockStyle.Fill
        BackColor = Color.FromArgb(235, 235, 235)
        ForeColor = Color.FromArgb(235, 235, 235)
    End Sub

    Protected Overrides Sub CreateHandle()
        MyBase.CreateHandle() : SendToBack()
        Parent.FindForm.TransparencyKey = Color.Fuchsia
        Parent.FindForm.FormBorderStyle = FormBorderStyle.None
    End Sub

    Private _ico As Icon
    Public Property Icon() As Icon
        Get
            Return _ico
        End Get
        Set(ByVal value As Icon)
            _ico = value
            Invalidate()
        End Set
    End Property

#Region " Movement and Control Buttons"
    Private Cap As Boolean = False
    Private CapL As Point = Nothing

    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e)
        If New Rectangle(0, 0, Width, 25).Contains(e.Location) Then
            Cap = True : CapL = e.Location : End If
    End Sub

    Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseUp(e) : Cap = False
    End Sub

    Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseMove(e) : If Cap Then Parent.Location = MousePosition - CapL
    End Sub
#End Region

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e) : Dim G As Graphics = e.Graphics
        G.Clear(BackColor)
        'Title
        G.FillRectangle(ToBrush(78, 78, 78), New Rectangle(0, 0, Width, 19))
        G.FillRectangle(ToBrush(73, Color.White), New Rectangle(0, 0, Width, 10))

        'Title Icon
        Try
            G.DrawIcon(_ico, New Rectangle(3, 3, 16, 16))
        Catch : End Try

        'Title Text
        G.DrawString(Text, Font, ToBrush(120, Color.Black), New Point((Width / 2) - (G.MeasureString(Text, Font).Width / 2), 4))
        G.DrawString(Text, Font, ToBrush(ForeColor), New Point((Width / 2) - (G.MeasureString(Text, Font).Width / 2) + 1, 2))

        'Border
        G.DrawRectangle(Pens.DimGray, New Rectangle(1, 1, Width - 3, Height - 3))
        G.DrawPath(Pens.Black, RoundRect(0, 0, Width - 1, Height - 1, 2))

        Try
            G.DrawRectangle(ToPen(Parent.FindForm.TransparencyKey), New Rectangle(0, 0, 1, 1))
            G.DrawRectangle(ToPen(Parent.FindForm.TransparencyKey), New Rectangle(Width - 1, 0, 1, 1))
            G.DrawRectangle(ToPen(Parent.FindForm.TransparencyKey), New Rectangle(0, Height - 1, 1, 1))
            G.DrawRectangle(ToPen(Parent.FindForm.TransparencyKey), New Rectangle(Width - 1, Height - 1, 1, 1))
        Catch : End Try

    End Sub

End Class

Class GraphiteTrackBar
    Inherits Control

#Region "Properties"
    Dim _Maximum As Integer = 10
    Public Property Maximum() As Integer
        Get
            Return _Maximum
        End Get
        Set(ByVal value As Integer)
            If value > 0 Then _Maximum = value
            If value < _Value Then _Value = value
            Invalidate()
        End Set
    End Property

    Event ValueChanged()
    Dim _Value As Integer = 0
    Public Property Value() As Integer
        Get
            Return _Value
        End Get
        Set(ByVal value As Integer)

            Select Case value
                Case Is = _Value
                    Exit Property
                Case Is < 0
                    _Value = 0
                Case Is > _Maximum
                    _Value = _Maximum
                Case Else
                    _Value = value
            End Select

            Invalidate()
            RaiseEvent ValueChanged()
        End Set
    End Property
#End Region

    Sub New()
        Me.SetStyle(ControlStyles.DoubleBuffer, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.ResizeRedraw, True)
        Me.SetStyle(ControlStyles.UserPaint, True)
        Me.SetStyle(ControlStyles.Selectable, True)
        Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    End Sub

    Dim CaptureM As Boolean = False
    Dim Bar As Rectangle = New Rectangle(0, 10, Width - 1, Height - 21)
    Dim Track As Size = New Size(20, 10)

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim G As Graphics = e.Graphics
        Bar = New Rectangle(15, 10, Width - 31, Height - 21)
        G.Clear(Parent.FindForm.BackColor)

        G.FillRectangle(ToBrush(20, Color.Black), New Rectangle(0, CInt((Height / 2) - 2), Width - 1, 4))
        G.DrawRectangle(ToPen(20, Color.Black), New Rectangle(0, CInt((Height / 2) - 2), Width - 1, 4))

        G.FillRectangle(ToBrush(180, Color.Black), New Rectangle(1, CInt((Height / 2) - 2), CInt(Bar.Width * (Value / Maximum)) + CInt(Track.Width / 2), 4))

        G.FillRectangle(ToBrush(Parent.FindForm.BackColor), New Rectangle(New Point(Bar.X + CInt(Bar.Width * (Value / Maximum)) - CInt(Track.Width / 2), Bar.Y + CInt((Bar.Height / 2)) - CInt(Track.Height / 2)), New Size(Track.Width, Track.Height)))
        G.DrawRectangle(ToPen(50, Color.Black), New Rectangle(New Point(Bar.X + CInt(Bar.Width * (Value / Maximum)) - CInt(Track.Width / 2), Bar.Y + CInt((Bar.Height / 2)) - CInt(Track.Height / 2)), New Size(Track.Width, Track.Height)))
    End Sub

    Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
        Me.BackColor = Color.Transparent

        MyBase.OnHandleCreated(e)
    End Sub

    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e)
        Dim mp = New Rectangle(New Point(e.Location.X, e.Location.Y), New Size(1, 1))
        Dim Bar As Rectangle = New Rectangle(10, 10, Width - 21, Height - 21)
        If New Rectangle(New Point(Bar.X + CInt(Bar.Width * (Value / Maximum)) - CInt(Track.Width / 2), 0), New Size(Track.Width, Height)).IntersectsWith(mp) Then
            CaptureM = True
        End If
    End Sub

    Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseUp(e)
        CaptureM = False
    End Sub

    Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseMove(e)
        If CaptureM Then
            Dim mp As Point = New Point(e.X, e.Y)
            Dim Bar As Rectangle = New Rectangle(10, 10, Width - 21, Height - 21)
            Value = CInt(Maximum * ((mp.X - Bar.X) / Bar.Width))
        End If
    End Sub

    Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
        MyBase.OnMouseLeave(e) : CaptureM = False
    End Sub

End Class

Class GraphiteSeperator
    Inherits Control

    Enum POrientation
        Horizonal = 0
        Vertical = 1
    End Enum

    Private ori As POrientation
    Public Property Orientation() As POrientation
        Get
            Return ori
        End Get
        Set(ByVal value As POrientation)
            ori = value
            If ori = POrientation.Horizonal Then If Height > Width Then Size = New Size(Height, Width)
            If ori = POrientation.Vertical Then If Width > Height Then Size = New Size(Height, Width)
            Invalidate()
        End Set
    End Property

    Sub New()
        Size = New Size(100, 10)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim G As Graphics = e.Graphics

        G.Clear(Parent.BackColor)

        Select Case ori
            Case POrientation.Horizonal
                G.DrawLine(ToPen(40, Color.Black), New Point(0, CInt(Height / 2) - 1), New Point(Width, CInt(Height / 2) - 1))
                G.DrawLine(ToPen(20, Color.White), New Point(0, CInt(Height / 2)), New Point(Width, CInt(Height / 2)))
            Case POrientation.Vertical
                G.DrawLine(ToPen(40, Color.Black), New Point(CInt(Width / 2) - 1, 0), New Point(CInt(Width / 2) - 1, Height))
                G.DrawLine(ToPen(20, Color.White), New Point(CInt(Width / 2), 0), New Point(CInt(Width / 2), Height))
        End Select
    End Sub

    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
        MyBase.OnResize(e)

        Select Case ori
            Case POrientation.Horizonal
                Size = New Size(Width, 10)
            Case POrientation.Vertical
                Size = New Size(10, Height)
        End Select
    End Sub
End Class

Class GraphiteComboBox
    Inherits ComboBox
    Sub New()
        MyBase.New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or _
        ControlStyles.ResizeRedraw Or _
        ControlStyles.UserPaint Or _
        ControlStyles.DoubleBuffer, True)
        DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
        BackColor = Color.FromArgb(235, 235, 235)
        ForeColor = Color.FromArgb(31, 31, 31)
        DropDownStyle = ComboBoxStyle.DropDownList
    End Sub
    Private _StartIndex As Integer = 0
    Public Property StartIndex As Integer
        Get
            Return _StartIndex
        End Get
        Set(ByVal value As Integer)
            _StartIndex = value
            Try
                MyBase.SelectedIndex = value
            Catch
            End Try
            Invalidate()
        End Set
    End Property

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        If Not DropDownStyle = ComboBoxStyle.DropDownList Then DropDownStyle = ComboBoxStyle.DropDownList
        MyBase.OnPaint(e)
        Dim G As Graphics = e.Graphics
        Dim T As LinearGradientBrush = New LinearGradientBrush(New Rectangle(0, 0, Width, Height), Color.FromArgb(0, Color.Black), Color.FromArgb(22, Color.Black), 90S)
        Dim DrawCornersBrush As SolidBrush
        DrawCornersBrush = ToBrush(235, 235, 235)
        Try
            With G
                G.SmoothingMode = SmoothingMode.HighQuality
                .Clear(Color.FromArgb(235, 235, 235))
                .FillRectangle(T, New Rectangle(0, 0, Width, Height))
                .DrawLine(ToPen(235, 235, 235), 0, 0, 0, 0)
                .DrawRectangle(ToPen(235, 235, 235), New Rectangle(1, 1, Width - 3, Height - 3))

                .DrawLine(ToPen(80, Color.Black), New Point(Width - 22, 4), New Point(Width - 22, Height - 5))

                Dim K As New GraphicsPath
                K.AddEllipse(-Width \ 2, -Height, Width * 2, CInt(Height * 1.55))

                Dim kK As New PathGradientBrush(K)
                kK.CenterColor = Color.Transparent
                kK.SurroundColors = New Color() {Color.FromArgb(100, Color.White)}
                .FillPath(kK, K)

                Try
                    If .MeasureString(Text, Font).Width > Width - 29 Then
                        .DrawString(Items(SelectedIndex).ToString, Font, ToBrush(71, 71, 71), New RectangleF(3, 3, Width - 35, Height - 7))
                        .DrawString("...", Font, ToBrush(71, 71, 71), New Point(Width - 38, 3))
                    Else
                        .DrawString(Items(SelectedIndex).ToString, Font, ToBrush(71, 71, 71), New RectangleF(3, 3, Width - 35, Height - 7))
                    End If
                Catch
                    .DrawString("...", Font, ToBrush(71, 71, 71), New Point(3, 3))
                End Try

                DrawTriangle(Color.FromArgb(71, 71, 71), New Point(Width - 15, Height - 10), New Point(Width - 12, Height - 7), New Point(Width - 9, Height - 10), G)
                DrawTriangle(Color.FromArgb(235, 235, 235), New Point(Width - 15, Height - 12), New Point(Width - 12, Height - 8), New Point(Width - 9, Height - 12), G)
                DrawTriangle(Color.FromArgb(71, 71, 71), New Point(Width - 15, 9), New Point(Width - 12, 6), New Point(Width - 9, 9), G)
                DrawTriangle(Color.FromArgb(235, 235, 235), New Point(Width - 15, 11), New Point(Width - 12, 7), New Point(Width - 9, 11), G)

                .DrawPath(ToPen(120, Color.Black), RoundRect(0, 0, Width - 1, Height - 1, 2))
            End With
        Catch
        End Try
    End Sub
    Sub ReplaceItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem
        e.DrawBackground()
        Try
            If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
                e.Graphics.FillRectangle(ToBrush(200, 200, 200), e.Bounds)
            End If
            e.Graphics.DrawString(MyBase.GetItemText(MyBase.Items(e.Index)), e.Font, ToBrush(71, 71, 71), e.Bounds)
        Catch : End Try
    End Sub
    Protected Sub DrawTriangle(ByVal Clr As Color, ByVal FirstPoint As Point, ByVal SecondPoint As Point, ByVal ThirdPoint As Point, ByVal G As Graphics)
        Dim points As New List(Of Point)()
        points.Add(FirstPoint)
        points.Add(SecondPoint)
        points.Add(ThirdPoint)
        G.FillPolygon(New SolidBrush(Clr), points.ToArray)
    End Sub
End Class

Class GraphiteCheck
    Inherits Control

    Sub New()
        Check = False
        Az = True
    End Sub

    Private [Check] As Boolean
    Public Property Checked() As Boolean
        Get
            Return [Check]
        End Get
        Set(ByVal value As Boolean)
            [Check] = value
            Invalidate()
        End Set
    End Property

    Private [Az] As Boolean
    Public Property AutoResize() As Boolean
        Get
            Return [Az]
        End Get
        Set(ByVal value As Boolean)
            [Az] = value
            OnResize(EventArgs.Empty)
        End Set
    End Property

    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
        MyBase.OnResize(e)
        If Az Then Size = New Size(15 + CreateGraphics().MeasureString(Text, Font).Width, 13)
    End Sub

    Protected Overrides Sub OnMouseClick(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseClick(e) : Checked = Not Checked : Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim G As Graphics = e.Graphics
        G.Clear(BackColor)

        G.FillPath(Brushes.White, RoundRect(0, 0, Height - 1, Height - 1, 2))
        G.DrawPath(ToPen(120, Color.Black), RoundRect(0, 0, Height - 1, Height - 1, 2))

        Dim ChkSize As Integer = Height - 1

        If Checked Then
            Dim WWidth As Integer = Height
            G.SmoothingMode = SmoothingMode.HighQuality
            Dim OFS As Integer = -2
            Dim CP As Point() = {New Point(ChkSize / 4, ChkSize / 2), New Point(ChkSize / 2, ChkSize - (ChkSize / 4)), New Point(ChkSize - (ChkSize / 5), ChkSize / 4), New Point(ChkSize - (ChkSize / 4), (ChkSize / 4) + OFS), New Point(ChkSize / 2, ChkSize - (ChkSize / 4) + OFS), New Point(ChkSize / 4, (ChkSize / 2) + OFS)}
            G.FillPolygon(Brushes.Black, CP)
        End If

        G.DrawString(Text, Font, ToBrush(ForeColor), New Point(ChkSize + 3, CInt(Height / 2) - CInt(G.MeasureString(Text, Font).Height / 2)))

    End Sub

    Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
        MyBase.OnTextChanged(e) : OnResize(EventArgs.Empty) : Invalidate()
    End Sub
End Class