Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/WinForms/VB/GridMainDemo/Modules/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/WinForms/VB/GridMainDemo/Modules/Tasks.vb

Imports System.Collections
Imports System.ComponentModel
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraGrid.Columns

Namespace DevExpress.XtraGrid.Demos
	Public MustInherit Class BindingCollection
		Inherits CollectionBase
		Implements IBindingList
		Public Overridable Sub OnListChanged(ByVal item As Object)
		End Sub
		Public Function AddNew() As Object Implements IBindingList.AddNew
			Return Nothing
		End Function
		Public ReadOnly Property AllowEdit() As Boolean Implements IBindingList.AllowEdit
			Get
				Return True
			End Get
		End Property
		Public ReadOnly Property AllowNew() As Boolean Implements IBindingList.AllowNew
			Get
				Return False
			End Get
		End Property
		Public ReadOnly Property AllowRemove() As Boolean Implements IBindingList.AllowRemove
			Get
				Return True
			End Get
		End Property

		Private Event listChangedHandler As ListChangedEventHandler
		Public Custom Event ListChanged As ListChangedEventHandler Implements IBindingList.ListChanged
			AddHandler(ByVal value As ListChangedEventHandler)
				AddHandler listChangedHandler, value
			End AddHandler
			RemoveHandler(ByVal value As ListChangedEventHandler)
				RemoveHandler listChangedHandler, value
			End RemoveHandler
			RaiseEvent(ByVal sender As System.Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
			End RaiseEvent
		End Event
		Friend Sub OnListChanged(ByVal args As ListChangedEventArgs)
			If Not listChangedHandlerEvent Is Nothing Then
			RaiseEvent listChangedHandler(Me, args)
			End If
		End Sub
		Protected Overrides Sub OnRemoveComplete(ByVal index As Integer, ByVal value As Object)
			OnListChanged(New ListChangedEventArgs(ListChangedType.ItemDeleted, index))
		End Sub
		Protected Overrides Sub OnInsertComplete(ByVal index As Integer, ByVal value As Object)
			OnListChanged(New ListChangedEventArgs(ListChangedType.ItemAdded, index))
		End Sub

		Public Sub AddIndex(ByVal pd As PropertyDescriptor) Implements IBindingList.AddIndex
			Throw New NotSupportedException()
		End Sub
		Public Sub ApplySort(ByVal pd As PropertyDescriptor, ByVal dir As ListSortDirection) Implements IBindingList.ApplySort
			Throw New NotSupportedException()
		End Sub
		Public Function Find(ByVal [property] As PropertyDescriptor, ByVal key As Object) As Integer Implements IBindingList.Find
			Throw New NotSupportedException()
		End Function
		Public ReadOnly Property IsSorted() As Boolean Implements IBindingList.IsSorted
			Get
				Return False
			End Get
		End Property
		Public Sub RemoveIndex(ByVal pd As PropertyDescriptor) Implements IBindingList.RemoveIndex
			Throw New NotSupportedException()
		End Sub
		Public Sub RemoveSort() Implements IBindingList.RemoveSort
			Throw New NotSupportedException()
		End Sub
		Public ReadOnly Property SortDirection() As ListSortDirection Implements IBindingList.SortDirection
			Get
				Throw New NotSupportedException()
			End Get
		End Property
		Public ReadOnly Property SortProperty() As PropertyDescriptor Implements IBindingList.SortProperty
			Get
				Throw New NotSupportedException()
			End Get
		End Property
		Public ReadOnly Property SupportsChangeNotification() As Boolean Implements IBindingList.SupportsChangeNotification
			Get
				Return True
			End Get
		End Property
		Public ReadOnly Property SupportsSearching() As Boolean Implements IBindingList.SupportsSearching
			Get
				Return False
			End Get
		End Property
		Public ReadOnly Property SupportsSorting() As Boolean Implements IBindingList.SupportsSorting
			Get
				Return False
			End Get
		End Property
	End Class

	Public Class Task
		Private fID As Integer
		Private fName As String
		Private fDate As Date
		Private fPercentComplete As Integer
		Private fComplete As Boolean
		Private fNote As String

		Private fRelationCollection As BindingCollection
		Public Sub New(ByVal relationCollection As BindingCollection, ByVal id As Integer, ByVal name As String, ByVal [date] As Date)
			Me.fRelationCollection = relationCollection
			Me.fID = id
			Me.fName = name
			Me.fDate = [date]
			Me.fPercentComplete = 0
			Me.fComplete = False
			Me.fNote = ""
		End Sub

		Public ReadOnly Property ID() As Integer
			Get
				Return fID
			End Get
		End Property

		Public Property TaskName() As String
			Get
				Return fName
			End Get
			Set(ByVal value As String)
				fName = value
				OnListChanged()
			End Set
		End Property

		Public Property DueDate() As Date
			Get
				Return fDate
			End Get
			Set(ByVal value As Date)
				fDate = value
				OnListChanged()
			End Set
		End Property

		Public Property Complete() As Boolean
			Get
				Return fComplete
			End Get
			Set(ByVal value As Boolean)
				fComplete = value
				If fComplete Then
					fPercentComplete = 100
				End If
				If (Not fComplete) AndAlso fPercentComplete = 100 Then
					fPercentComplete = 0
				End If
				OnListChanged()
			End Set
		End Property

		Public Property PercentComplete() As Integer
			Get
				Return fPercentComplete
			End Get
			Set(ByVal value As Integer)
				fPercentComplete = value
				If fPercentComplete < 0 Then
					fPercentComplete = 0
				End If
				If fPercentComplete > 100 Then
					fPercentComplete = 100
				End If
				fComplete = fPercentComplete = 100
				OnListChanged()
			End Set
		End Property

		Public Property Note() As String
			Get
				Return fNote
			End Get
			Set(ByVal value As String)
				fNote = value
				OnListChanged()
			End Set
		End Property

		Public ReadOnly Property CategoryName() As String
			Get
				Return GetCategoryByTask(CType(fRelationCollection, TasksWithCategories), Me)
			End Get
		End Property

		Shared Function GetCategoryByTask(ByVal collection As TasksWithCategories, ByVal task As Task) As String
			Dim ret As String = ""
			For i As Integer = 0 To collection.fCategories.Count - 1
				If collection.HasCategory(task, collection.fCategories(i)) Then
					ret &= String.Format("{0}{1}", (If(ret = "", "", ", ")), collection.fCategories(i).CategoryName)
				End If
			Next i
			If ret = "" Then
				ret = My.Resources.NoneString
			End If
			Return ret
		End Function

		Private Sub OnListChanged()
			fRelationCollection.OnListChanged(Me)
		End Sub
	End Class
	Public Class Category
		Private fID As Integer
		Private fName As String
		Public Sub New(ByVal id As Integer, ByVal name As String)
			Me.fID = id
			Me.fName = name
		End Sub

		Public ReadOnly Property ID() As Integer
			Get
				Return fID
			End Get
		End Property

		Public Property CategoryName() As String
			Get
				Return fName
			End Get
			Set(ByVal value As String)
				fName = value
			End Set
		End Property
	End Class
	Public Class Relation
		Friend fTask As Task
		Friend fCategory As Category
		Public Sub New(ByVal task As Task, ByVal category As Category)
			Me.fTask = task
			Me.fCategory = category
		End Sub
		Public Property TaskName() As String
			Get
				Return fTask.TaskName
			End Get
			Set(ByVal value As String)
				fTask.TaskName = value
			End Set
		End Property
		Public Property DueDate() As Date
			Get
				Return fTask.DueDate
			End Get
			Set(ByVal value As Date)
				fTask.DueDate = value
			End Set
		End Property
		Public ReadOnly Property CategoryName() As String
			Get
				Return fCategory.CategoryName
			End Get
		End Property
		Public Property Complete() As Boolean
			Get
				Return fTask.Complete
			End Get
			Set(ByVal value As Boolean)
				fTask.Complete = value
			End Set
		End Property

		Public Property PercentComplete() As Integer
			Get
				Return fTask.PercentComplete
			End Get
			Set(ByVal value As Integer)
				fTask.PercentComplete = value
			End Set
		End Property

		Public Property Note() As String
			Get
				Return fTask.Note
			End Get
			Set(ByVal value As String)
				fTask.Note = value
			End Set
		End Property
	End Class
	Public Class Tasks
		Inherits BindingCollection

		Public Shared MaxTasks As Integer = 7
		Public Shared Function GetTasks(ByVal collection As TasksWithCategories) As Tasks
			Dim ret As New Tasks()
			Dim rnd As New Random()
			For i As Integer = 0 To MaxTasks - 1
				ret.List.Add(New Task(collection, i + 1, My.Resources.Task + (i + 1).ToString(), Date.Today.AddDays(rnd.Next(5))))
				If i = 2 Then
					ret(i).PercentComplete = 50
				End If
				If i = 6 Then
					ret(i).PercentComplete = 100
				End If
			Next i
			Return ret
		End Function
		Default Public Property Item(ByVal index As Integer) As Task
			Get
				Return CType(List(index), Task)
			End Get
			Set(ByVal value As Task)
				List(index) = value
			End Set
		End Property
	End Class
	Public Class Categories
		Inherits BindingCollection

		Public Shared MaxCategories As Integer = 6
		Public Shared Function GetCategories(ByVal collection As TasksWithCategories) As Categories
			Dim ret As New Categories()
			Dim names() As String = {My.Resources.Business, My.Resources.Competitor, My.Resources.Favorites, My.Resources.Gifts, My.Resources.Goals, My.Resources.Holiday, My.Resources.Ideas, My.Resources.International, My.Resources.Personal}
			For i As Integer = 0 To names.Length - 1
				ret.List.Add(New Category(i + 1, names(i)))
			Next i
			Return ret
		End Function
		Default Public Property Item(ByVal index As Integer) As Category
			Get
				Return CType(List(index), Category)
			End Get
			Set(ByVal value As Category)
				List(index) = value
			End Set
		End Property
	End Class
	Public Class TasksWithCategories
		Inherits BindingCollection

		Friend fTasks As Tasks
		Friend fCategories As Categories
		Public Sub New()
			fTasks = Tasks.GetTasks(Me)
			fCategories = Categories.GetCategories(Me)
		End Sub
		Public Shared Function GetTasksWithCategories() As TasksWithCategories
			Dim ret As New TasksWithCategories()
			Dim rnd As New Random()
			For i As Integer = 0 To Tasks.MaxTasks - 1
				For j As Integer = 0 To 1 + rnd.Next(Categories.MaxCategories) - 1
					Dim cat As Category = ret.fCategories(rnd.Next(ret.fCategories.Count))
					If Not ret.HasCategory(ret.fTasks(i), cat) Then
						ret.List.Add(New Relation(ret.fTasks(i), cat))
					End If
				Next j
			Next i
			Return ret
		End Function
		Default Public Property Item(ByVal index As Integer) As Relation
			Get
				Return CType(List(index), Relation)
			End Get
			Set(ByVal value As Relation)
				List(index) = value
			End Set
		End Property
		Public Overrides Sub OnListChanged(ByVal item As Object)
			If item Is Nothing Then
				Return
			End If
			For i As Integer = 0 To Me.Count - 1
				If item.Equals(Me(i).fTask) Then
					Me.OnListChanged(New ListChangedEventArgs(ListChangedType.ItemChanged, i))
				End If
			Next i
		End Sub
		Public Function HasCategory(ByVal task As Task, ByVal category As Category) As Boolean
			For i As Integer = 0 To Me.Count - 1
				If Me(i).fCategory Is category AndAlso Me(i).fTask Is task Then
					Return True
				End If
			Next i
			Return False
		End Function
	End Class
	'<gridControl1>
	Public Class GroupingControllerTasksWithCategories
		Private fGrid As GridControl
		Private fTasks As TasksWithCategories
		Public Event AfterGrouping As EventHandler
		Public Sub New(ByVal grid As GridControl)
			Me.fGrid = grid
			Me.fTasks = TasksWithCategories.GetTasksWithCategories()
			Dim view As GridView = TryCast(fGrid.MainView, GridView)
			If view IsNot Nothing Then
				AddHandler view.EndGrouping, AddressOf Grid_Grouping
			End If
			SetDataSource()
		End Sub
		Private Sub Grid_Grouping(ByVal sender As Object, ByVal e As EventArgs)
			SetDataSource()
			RaiseEvent AfterGrouping(Me, EventArgs.Empty)
		End Sub

		Public ReadOnly Property CategoryColumn() As GridColumn
			Get
				Dim view As GridView = TryCast(fGrid.MainView, GridView)
				If view Is Nothing Then
					Return Nothing
				End If
				For Each column As GridColumn In view.Columns
					If column.FieldName = "CategoryName" Then
						Return column
					End If
				Next column
				Return Nothing
			End Get
		End Property

		Public ReadOnly Property IsCategoryGrouping() As Boolean
			Get
				If CategoryColumn Is Nothing Then
					Return False
				End If
				Return CategoryColumn.GroupIndex > -1
			End Get
		End Property

		Public Sub SetDataSource()
			If IsCategoryGrouping Then
				fGrid.DataSource = fTasks
			Else
				fGrid.DataSource = fTasks.fTasks
			End If
		End Sub
	End Class
	'</gridControl1>

End Namespace