Mini Kabibi Habibi
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