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