Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/GridDemo.Wpf/Controls/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/GridDemo.Wpf/Controls/OrderDataGenerator.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports DevExpress.Xpf.DemoBase
Imports System.Data

Namespace GridDemo
	Public Class OrderDataGenerator
		Private Shared SyncRoot As Object = New Object()
		Private Shared customerNames As New List(Of String)()
		Private Shared categoryData As New List(Of CategoryData)()
		Private Shared productData As New List(Of ProductData)()
'INSTANT VB TODO TASK: There is no VB.NET equivalent to 'volatile':
		Private count_Renamed As Integer
		Private cachedOrders As New List(Of OrderData)()

		Private Shared Function ExtractCustomerNames() As List(Of String)
			If customerNames.Count = 0 Then
				Dim customers As IList = NWindData.Customers
				customerNames.Capacity = customers.Count
				For Each row As DataRowView In customers
					customerNames.Add(row("ContactName").ToString())
				Next row
			End If
			Return customerNames
		End Function
		Private Shared Function ExtractCategoryDataList() As List(Of CategoryData)
			If categoryData.Count = 0 Then
				Dim categories As IList = NWindData.Categories
				categoryData.Capacity = categories.Count
				For Each row As DataRowView In categories
					categoryData.Add(New CategoryData() With {.Name = row("CategoryName").ToString(), .Picture = CType(row("Icon_25"), Byte())})
				Next row
			End If
			Return categoryData
		End Function
		Private Shared Function ExtractProductDataList(ByVal categoriesList As List(Of CategoryData)) As List(Of ProductData)
			If productData.Count = 0 Then
				Dim categoryProducts As IList = NWindData.CategoryProducts
				productData.Capacity = categoryProducts.Count
				Dim rand As New Random()
				For Each row As DataRowView In categoryProducts
					productData.Add(New ProductData() With {.Category = FindCategory(categoriesList, row("CategoryName").ToString()), .Name = row("ProductName").ToString(), .Price = CDec(rand.Next(20) + rand.Next(99) / 100.0)})
				Next row
			End If
			Return productData
		End Function

		Private Shared Function FindCategory(ByVal categoriesList As List(Of CategoryData), ByVal name As String) As CategoryData
			For Each category As CategoryData In categoriesList
				If category.Name = name Then
					Return category
				End If
			Next category
			Return Nothing
		End Function

		Private Function GenerateOrders(ByVal generateCount As Integer, ByVal startFrom As Integer) As List(Of OrderData)
			Dim result As New List(Of OrderData)(generateCount)
			Dim customerNames As List(Of String) = ExtractCustomerNames()
			Dim categoriesList As List(Of CategoryData) = ExtractCategoryDataList()
			Dim productsList As List(Of ProductData) = ExtractProductDataList(categoriesList)

			OnGenerateOrderDataStarted(EventArgs.Empty)
			Dim rand As New Random()
			Dim generateCountPerCent As Integer = generateCount \ 100
			For i As Integer = 0 To generateCount - 1
				Dim randomProduct As ProductData = productsList(rand.Next(productsList.Count))
				Dim randomName As String = customerNames(rand.Next(customerNames.Count))
				Dim data As New OrderData() With {.OrderId = i + startFrom, .OrderDate = DateTime.Today.Subtract(TimeSpan.FromDays(rand.Next(180))), .CustomerName = randomName, .Quantity = rand.Next(200) + 1, .ProductCategory = randomProduct.Category, .ProductName = randomProduct.Name, .Price = randomProduct.Price, .IsReady = (rand.Next(2) = 0)}
				result.Add(data)
				If ((i + 1) Mod generateCountPerCent) = 0 Then
					OnGenerateOrderDataProgress(New GenerateOrderDataProgressEventArgs(Convert.ToDouble((i + 1) / generateCountPerCent)))
				End If
			Next i
			OnGenerateOrderDataCompleted(EventArgs.Empty)
			Return result
		End Function

		Protected Overridable Sub OnGenerateOrderDataStarted(ByVal e As EventArgs)
			RaiseEvent GenerateOrderDataStarted(Me, e)
		End Sub
		Protected Overridable Sub OnGenerateOrderDataCompleted(ByVal e As EventArgs)
			RaiseEvent GenerateOrderDataCompleted(Me, e)
		End Sub
		Protected Overridable Sub OnGenerateOrderDataProgress(ByVal e As GenerateOrderDataProgressEventArgs)
			RaiseEvent GenerateOrderDataProgress(Me, e)
		End Sub

		Public Sub New(ByVal count As Integer)
			Me.count_Renamed = count
		End Sub

		Public Property Count() As Integer
			Get
				Return count_Renamed
			End Get
			Set(ByVal value As Integer)
				count_Renamed = value
			End Set
		End Property

		Public Function GetOrders() As List(Of OrderData)
			Dim result As List(Of OrderData)
			SyncLock SyncRoot
				If Count > cachedOrders.Count Then
					cachedOrders.AddRange(GenerateOrders(Count - cachedOrders.Count, cachedOrders.Count + 1))
				End If
				result = cachedOrders.GetRange(0, Count)
			End SyncLock
			Return result
		End Function
		Public Function GetCategories() As List(Of CategoryData)
			Return ExtractCategoryDataList()
		End Function

		Public Event GenerateOrderDataStarted As EventHandler
		Public Event GenerateOrderDataCompleted As EventHandler
		Public Event GenerateOrderDataProgress As EventHandler(Of GenerateOrderDataProgressEventArgs)
	End Class

	Public Class GenerateOrderDataProgressEventArgs
		Inherits EventArgs
		Private progress_Renamed As Double

		Public Sub New(ByVal progress As Double)
			Me.progress_Renamed = progress
		End Sub
		Public ReadOnly Property Progress() As Double
			Get
				Return progress_Renamed
			End Get
		End Property
	End Class

	Public Class CategoryData
		Implements IComparable, IComparable(Of CategoryData)
		Private privateName As String
		Public Property Name() As String
			Get
				Return privateName
			End Get
			Set(ByVal value As String)
				privateName = value
			End Set
		End Property
		Private privatePicture As Byte()
		Public Property Picture() As Byte()
			Get
				Return privatePicture
			End Get
			Set(ByVal value As Byte())
				privatePicture = value
			End Set
		End Property
		Public Overrides Function ToString() As String
			Return Name
		End Function

		#Region "IComparable Members"
		Public Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo
			If TypeOf obj Is CategoryData Then
				Return CompareTo(CType(obj, CategoryData))
			End If
			Return -1
		End Function
		#End Region
		#Region "IComparable<CategoryData> Members"
		Public Function CompareTo(ByVal other As CategoryData) As Integer Implements IComparable(Of CategoryData).CompareTo
			Return StringComparer.CurrentCulture.Compare(Name, other.Name)
		End Function
		#End Region
	End Class
	Public Class ProductData
		Private privateName As String
		Public Property Name() As String
			Get
				Return privateName
			End Get
			Set(ByVal value As String)
				privateName = value
			End Set
		End Property
		Private privateCategory As CategoryData
		Public Property Category() As CategoryData
			Get
				Return privateCategory
			End Get
			Set(ByVal value As CategoryData)
				privateCategory = value
			End Set
		End Property
		Private privatePrice As Decimal
		Public Property Price() As Decimal
			Get
				Return privatePrice
			End Get
			Set(ByVal value As Decimal)
				privatePrice = value
			End Set
		End Property
		Public Overrides Function ToString() As String
			Return Name
		End Function
	End Class

	Public Class OrderData
		Private privateOrderId As Integer
		Public Property OrderId() As Integer
			Get
				Return privateOrderId
			End Get
			Set(ByVal value As Integer)
				privateOrderId = value
			End Set
		End Property
		Private privateIsReady As Boolean
		Public Property IsReady() As Boolean
			Get
				Return privateIsReady
			End Get
			Set(ByVal value As Boolean)
				privateIsReady = value
			End Set
		End Property
		Private privateCustomerName As String
		Public Property CustomerName() As String
			Get
				Return privateCustomerName
			End Get
			Set(ByVal value As String)
				privateCustomerName = value
			End Set
		End Property
		Private privateOrderDate As DateTime
		Public Property OrderDate() As DateTime
			Get
				Return privateOrderDate
			End Get
			Set(ByVal value As DateTime)
				privateOrderDate = value
			End Set
		End Property
		Private privateProductCategory As CategoryData
		Public Property ProductCategory() As CategoryData
			Get
				Return privateProductCategory
			End Get
			Set(ByVal value As CategoryData)
				privateProductCategory = value
			End Set
		End Property
		Private privateProductName As String
		Public Property ProductName() As String
			Get
				Return privateProductName
			End Get
			Set(ByVal value As String)
				privateProductName = value
			End Set
		End Property
		Private privateQuantity As Integer
		Public Property Quantity() As Integer
			Get
				Return privateQuantity
			End Get
			Set(ByVal value As Integer)
				privateQuantity = value
			End Set
		End Property
		Private privatePrice As Decimal
		Public Property Price() As Decimal
			Get
				Return privatePrice
			End Get
			Set(ByVal value As Decimal)
				privatePrice = value
			End Set
		End Property
	End Class
End Namespace