Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/RibbonDemo.Wpf/Modules/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/RibbonDemo.Wpf/Modules/MVVMRibbon.xaml.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Imports System.Collections.ObjectModel
Imports DevExpress.Xpf.Bars
Imports System.Collections.Specialized
Imports DevExpress.Xpf.Ribbon
Imports DevExpress.Xpf.Core
Imports DevExpress.Utils
Namespace RibbonDemo
	Partial Public Class MVVMRibbon
		Inherits RibbonDemoModule
		Private Shared sharedResources_Renamed As ResourceDictionary
		Public Shared Property SharedResources() As ResourceDictionary
			Get
				Return sharedResources_Renamed
			End Get
			Set(ByVal value As ResourceDictionary)
				sharedResources_Renamed = value
			End Set
		End Property
		Public Sub New()
			InitializeComponent()
			SharedResources = Resources
			InitializeViewModel()
		End Sub
		Private Sub InitializeViewModel()
			Dim viewModel As New ViewModel()
			FillViewModel(viewModel, textBox)
			DataContext = viewModel
		End Sub
		Protected Overrides Sub OnUnloaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
			SharedResources = Nothing
			MyBase.OnUnloaded(sender, e)
		End Sub
		Private Sub FillViewModel(ByVal viewModel As ViewModel, ByVal textBox As TextBox)
			Dim homePage As New PageModel() With {.Name = "Home"}
			Dim clipboardGroup As New PageGroupModel() With {.Name = "Clipboard", .Glyph = GlyphHelper.GetGlyph("/Images/Icons/paste-32x32.png")}
			Dim addingGroup As New PageGroupModel() With {.Name = "Addition", .Glyph = GlyphHelper.GetGlyph("/Images/Icons/Add_32x32.png")}
			Dim category As New CategoryModel()

			viewModel.Categories.Add(category)
			category.Pages.Add(homePage)
			homePage.Groups.Add(clipboardGroup)
			homePage.Groups.Add(addingGroup)
			Dim cutCommand As New CommandModel(AddressOf cutCommandExecuteFunc) With {.Caption = "Cut", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/cut-32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/cut-16x16.png")}
			Dim copyCommand As New CommandModel(AddressOf copyCommandExecuteFunc) With {.Caption = "Copy", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/copy-32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/copy-16x16.png")}
			Dim pasteCommand As New CommandModel(AddressOf pasteCommandExecuteFunc) With {.Caption = "Paste", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/paste-32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/paste-16x16.png")}
			Dim selectCommand As New CommandModel(AddressOf selectAllCommandExecuteFunc) With {.Caption = "Select All", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/SelectAll_32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/SelectAll_16x16.png")}
			Dim blankCommand As New CommandModel(AddressOf blankCommandExecuteFunc) With {.Caption = "Clear Page", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/new-32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/new-16x16.png")}
			clipboardGroup.Commands.Add(cutCommand)
			clipboardGroup.Commands.Add(copyCommand)
			clipboardGroup.Commands.Add(pasteCommand)
			clipboardGroup.Commands.Add(selectCommand)
			clipboardGroup.Commands.Add(blankCommand)
			Dim addGroupCommand As New MyGroupCommand() With {.Caption = "Add", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_16x16.png")}
			Dim parentCommand As New MyParentCommand(viewModel, MyParentCommandType.CommandCreation) With {.Caption = "Add New Command", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_16x16.png")}
			Dim parentGroup As New MyParentCommand(viewModel, MyParentCommandType.GroupCreation) With {.Caption = "Add New Group", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_16x16.png")}
			Dim parentPage As New MyParentCommand(viewModel, MyParentCommandType.PageCreation) With {.Caption = "Add New Page", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/Add_16x16.png")}
			addGroupCommand.Commands.Add(parentCommand)
			addGroupCommand.Commands.Add(parentGroup)
			addGroupCommand.Commands.Add(parentPage)
			addingGroup.Commands.Add(addGroupCommand)
			addingGroup.Commands.Add(parentCommand)
			addingGroup.Commands.Add(parentGroup)
			addingGroup.Commands.Add(parentPage)
			viewModel.MenuItems.Add(parentCommand)
			viewModel.MenuItems.Add(parentGroup)
			viewModel.MenuItems.Add(parentPage)
		End Sub
		#Region "CommandFuncs"
		Public Sub cutCommandExecuteFunc()
			Clipboard.SetText(textBox.SelectedText)
			textBox.SelectedText = String.Empty
		End Sub
		Public Sub copyCommandExecuteFunc()
			Clipboard.SetText(textBox.SelectedText)
		End Sub
		Public Sub pasteCommandExecuteFunc()
			textBox.SelectedText = Clipboard.GetText()
			textBox.SelectionStart += textBox.SelectionLength
			textBox.SelectionLength = 0
		End Sub
		Public Sub selectAllCommandExecuteFunc()
			textBox.SelectionStart = 0
			textBox.SelectionLength = textBox.Text.Count()
		End Sub
		Public Sub blankCommandExecuteFunc()
			textBox.SelectionStart = 0
			textBox.SelectionLength = textBox.Text.Count()
			textBox.SelectedText = ""
		End Sub
		#End Region
	End Class

	Public Class GlyphHelper
		Public Shared Function GetGlyph(ByVal ItemPath As String) As ImageSource
			Return New BitmapImage(AssemblyHelper.GetResourceUri(GetType(MVVMRibbon).Assembly, ItemPath))
		End Function
	End Class

	Public Class ViewModel
		Inherits DependencyObject
		Public Shared ReadOnly CategoriesProperty As DependencyProperty = DependencyProperty.Register("Categories", GetType(ObservableCollection(Of CategoryModel)), GetType(ViewModel), New PropertyMetadata(Nothing))
		Public Shared ReadOnly MenuItemsProperty As DependencyProperty = DependencyProperty.Register("MenuItems", GetType(ObservableCollection(Of CommandModel)), GetType(ViewModel), New PropertyMetadata(Nothing))
		Public Property Categories() As ObservableCollection(Of CategoryModel)
			Get
				Return CType(GetValue(CategoriesProperty), ObservableCollection(Of CategoryModel))
			End Get
			Set(ByVal value As ObservableCollection(Of CategoryModel))
				SetValue(CategoriesProperty, value)
			End Set
		End Property
		Public Property MenuItems() As ObservableCollection(Of CommandModel)
			Get
				Return CType(GetValue(MenuItemsProperty), ObservableCollection(Of CommandModel))
			End Get
			Set(ByVal value As ObservableCollection(Of CommandModel))
				SetValue(MenuItemsProperty, value)
			End Set
		End Property
		Public Sub New()
			Categories = New ObservableCollection(Of CategoryModel)()
			MenuItems = New ObservableCollection(Of CommandModel)()
		End Sub
		Public Sub Clear()
			For Each cat As CategoryModel In Categories
				cat.Clear()
			Next cat
			Categories.Clear()
		End Sub
	End Class

	Public Class ModelBase
		Inherits DependencyObject
		Public Shared ReadOnly NameProperty As DependencyProperty

		Shared Sub New()
			NameProperty = DependencyProperty.Register("Name", GetType(String), GetType(ModelBase), New PropertyMetadata(""))
		End Sub
		Public Property Name() As String
			Get
				Return CStr(GetValue(NameProperty))
			End Get
			Set(ByVal value As String)
				SetValue(NameProperty, value)
			End Set
		End Property
	End Class

	Public Class CategoryModel
		Inherits ModelBase
		Public Shared ReadOnly PagesProperty As DependencyProperty = DependencyProperty.Register("Pages", GetType(ObservableCollection(Of PageModel)), GetType(CategoryModel), New PropertyMetadata(Nothing))

		Public Property Pages() As ObservableCollection(Of PageModel)
			Get
				Return CType(GetValue(PagesProperty), ObservableCollection(Of PageModel))
			End Get
			Set(ByVal value As ObservableCollection(Of PageModel))
				SetValue(PagesProperty, value)
			End Set
		End Property

		Public Sub New()
			Pages = New ObservableCollection(Of PageModel)()
		End Sub
		Public Sub Clear()
			For Each cat As PageModel In Pages
				cat.Clear()
			Next cat
			Pages.Clear()
		End Sub
	End Class

	Public Class PageModel
		Inherits ModelBase
		Public Shared ReadOnly GroupsProperty As DependencyProperty

		Shared Sub New()
			GroupsProperty = DependencyProperty.Register("Groups", GetType(ObservableCollection(Of PageGroupModel)), GetType(PageModel), New PropertyMetadata(Nothing))
		End Sub
		Public Sub New()
			Groups = New ObservableCollection(Of PageGroupModel)()
		End Sub
		Public Property Groups() As ObservableCollection(Of PageGroupModel)
			Get
				Return (CType(GetValue(GroupsProperty), ObservableCollection(Of PageGroupModel)))
			End Get
			Set(ByVal value As ObservableCollection(Of PageGroupModel))
				SetValue(GroupsProperty, value)
			End Set
		End Property
		Public Sub Clear()
			For Each cat As PageGroupModel In Groups
				cat.Clear()
			Next cat
			Groups.Clear()
		End Sub
	End Class

	Public Class PageGroupModel
		Inherits ModelBase
		Implements ICommand
		Public Shared ReadOnly CommandsProperty As DependencyProperty
		Public Shared ReadOnly GlyphProperty As DependencyProperty

		Shared Sub New()
			CommandsProperty = DependencyProperty.Register("Commands", GetType(ObservableCollection(Of CommandModel)), GetType(PageGroupModel), New PropertyMetadata(Nothing))
			GlyphProperty = DependencyProperty.Register("Glyph", GetType(ImageSource), GetType(PageGroupModel), New PropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf OnGlyphPropertyChanged)))
		End Sub
		Public Sub New()
			Commands = New ObservableCollection(Of CommandModel)()
		End Sub

		Public Property Commands() As ObservableCollection(Of CommandModel)
			Get
				Return (CType(GetValue(CommandsProperty), ObservableCollection(Of CommandModel)))
			End Get
			Set(ByVal value As ObservableCollection(Of CommandModel))
				SetValue(CommandsProperty, value)
			End Set
		End Property
		Public Property Glyph() As ImageSource
			Get
				Return CType(GetValue(GlyphProperty), ImageSource)
			End Get
			Set(ByVal value As ImageSource)
				SetValue(GlyphProperty, value)
			End Set
		End Property
		Protected Friend Shared Sub OnGlyphPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
			CType(d, PageGroupModel).OnGlyphChanged(e)
		End Sub
		Protected Friend Sub OnGlyphChanged(ByVal e As DependencyPropertyChangedEventArgs)
			CType(e.NewValue, ImageSource).Freeze()
		End Sub
		Public Sub Clear()
			Commands.Clear()
		End Sub
		#Region "ICommand"
		Private b As Boolean = False
		Public Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute
			If b = True Then
				CanExecuteChangedEvent.Invoke(Me, New EventArgs())
			End If
			Return True
		End Function

		Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged

		Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
			MessageBox.Show(Name & "'s command executed")
		End Sub
		#End Region
	End Class

	Public Class CommandModel
		Inherits DependencyObject
		Implements ICommand
		Private action As Action
		Public Shared ReadOnly CaptionProperty As DependencyProperty
		Public Shared ReadOnly LargeGlyphProperty As DependencyProperty
		Public Shared ReadOnly SmallGlyphProperty As DependencyProperty

		Shared Sub New()
			CaptionProperty = DependencyProperty.Register("Caption", GetType(String), GetType(CommandModel), New PropertyMetadata(""))
			LargeGlyphProperty = DependencyProperty.Register("LargeGlyph", GetType(ImageSource), GetType(CommandModel), New PropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf OnGlyphPropertyChanged)))
			SmallGlyphProperty = DependencyProperty.Register("SmallGlyph", GetType(ImageSource), GetType(CommandModel), New PropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf OnGlyphPropertyChanged)))
		End Sub
		Public Sub New()
			action = AddressOf ShowMessageBox
		End Sub
		Public Sub ShowMessageBox()
			MessageBox.Show(String.Format("Command ""{0}"" executed", Me.Caption))
		End Sub
		Public Sub New(ByVal action As Action)
			Me.action = action
		End Sub

		Public Property Caption() As String
			Get
				Return CStr(GetValue(CaptionProperty))
			End Get
			Set(ByVal value As String)
				SetValue(CaptionProperty, value)
			End Set
		End Property
		Public Property LargeGlyph() As ImageSource
			Get
				Return CType(GetValue(LargeGlyphProperty), ImageSource)
			End Get
			Set(ByVal value As ImageSource)
				SetValue(LargeGlyphProperty, value)
			End Set
		End Property
		Public Property SmallGlyph() As ImageSource
			Get
				Return CType(GetValue(SmallGlyphProperty), ImageSource)
			End Get
			Set(ByVal value As ImageSource)
				SetValue(SmallGlyphProperty, value)
			End Set
		End Property

		Protected Friend Shared Sub OnGlyphPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
			CType(d, CommandModel).OnGlyphChanged(e)
		End Sub
		Protected Friend Sub OnGlyphChanged(ByVal e As DependencyPropertyChangedEventArgs)
			CType(e.NewValue, ImageSource).Freeze()
		End Sub
		#Region "ICommand"
		Private b As Boolean = False
		Public Overridable Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute
			If b = True Then
				CanExecuteChangedEvent.Invoke(Me, New EventArgs())
			End If
			Return True
		End Function

		Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged

		Public Overridable Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
			action()
		End Sub
		#End Region
	End Class

	Public Enum MyParentCommandType
		CommandCreation
		GroupCreation
		PageCreation
	End Enum

	Public Class MyParentCommand
		Inherits CommandModel
		Private viewModel As ViewModel
		Private type As MyParentCommandType
		Public Sub New(ByVal viewModel As ViewModel, ByVal type As MyParentCommandType)
			Me.viewModel = viewModel
			Me.type = type
		End Sub

		Public Overrides Sub Execute(ByVal parameter As Object)
			Select Case type
				Case MyParentCommandType.CommandCreation
					CommandCreation()
				Case MyParentCommandType.GroupCreation
					PageGroupCreation()
				Case MyParentCommandType.PageCreation
					PageCreation()
			End Select
		End Sub

		Private Sub PageCreation()
			viewModel.Categories(0).Pages.Add(New PageModel() With {.Name = "New Page" & IndexCreator.GetIndex()})
		End Sub

		Private Sub PageGroupCreation()
			viewModel.Categories(0).Pages(0).Groups.Add(New PageGroupModel() With {.Name = "New Group", .Glyph = GlyphHelper.GetGlyph("/Images/Icons/NewViaWizard_32x32.png")})
		End Sub

		Private Sub CommandCreation()
			Dim newCommand As New CommandModel() With {.Caption = "New Command", .LargeGlyph = GlyphHelper.GetGlyph("/Images/Icons/NewViaWizard_32x32.png"), .SmallGlyph = GlyphHelper.GetGlyph("/Images/Icons/NewViaWizard_16x16.png")}
			viewModel.Categories(0).Pages(0).Groups(0).Commands.Add(newCommand)
		End Sub
	End Class

	Public Class MyGroupCommand
		Inherits CommandModel
		Public Shared ReadOnly CommandsProperty As DependencyProperty

		Public Property Commands() As ObservableCollection(Of CommandModel)
			Get
				Return CType(GetValue(CommandsProperty), ObservableCollection(Of CommandModel))
			End Get
			Set(ByVal value As ObservableCollection(Of CommandModel))
				SetValue(CommandsProperty, value)
			End Set
		End Property
		Shared Sub New()
			CommandsProperty = DependencyProperty.Register("Commands", GetType(ObservableCollection(Of CommandModel)), GetType(MyGroupCommand), New PropertyMetadata(Nothing))
		End Sub
		Public Sub New()
			MyBase.New(AddressOf emptyFunc)
				Commands = New ObservableCollection(Of CommandModel)()
		End Sub
		Public Shared Sub emptyFunc()
		End Sub
	End Class
	Public Class CommandTemplateSelector
		Inherits DataTemplateSelector
		Public Overrides Function SelectTemplate(ByVal item As Object, ByVal container As DependencyObject) As DataTemplate
			If TypeOf item Is MyGroupCommand Then
				Return CType(MVVMRibbon.SharedResources("subItemTemplate"), DataTemplate)
			End If
			Return CType(MVVMRibbon.SharedResources("itemTemplate"), DataTemplate)
		End Function
	End Class

	Public NotInheritable Class IndexCreator
		Private Shared Value As Integer = 0
		Private Sub New()
		End Sub
		Public Shared Function GetIndex() As String
			Value += 1
			Return Value.ToString()
		End Function
		Public Shared Sub Refresh()
			Value = 0
		End Sub
	End Class
End Namespace