Files
TimetableDesigner/TimetableDesigner/Views/MainWindow.xaml

356 lines
25 KiB
XML

<rib:RibbonWindow x:Class="TimetableDesigner.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:TimetableDesigner.ViewModels.Views"
xmlns:p = "clr-namespace:TimetableDesigner.Properties"
xmlns:rib="urn:fluent-ribbon"
Height="450"
Width="800">
<rib:RibbonWindow.Title>
<MultiBinding StringFormat="Timetable Designer {0} ({1})">
<Binding Path="Version"/>
<Binding Path="ProjectService.ProjectViewModel.Name" FallbackValue="{x:Static p:Resources.Global_NoProjectLoadedTitle}"/>
</MultiBinding>
</rib:RibbonWindow.Title>
<rib:RibbonWindow.DataContext>
<vm:MainWindowVM/>
</rib:RibbonWindow.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0.3*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.3*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<rib:Ribbon Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_File}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_File_New}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_New_New}" Icon="{StaticResource NewImage}" Command="{Binding NewProjectCommand}"/>
</rib:RibbonGroupBox>
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_File_Open}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Open_Open}" Icon="{StaticResource OpenImage}" Command="{Binding OpenProjectCommand}"/>
<rib:DropDownButton Header="{x:Static p:Resources.Main_Ribbon_File_Open_OpenRecent}"
Icon="{StaticResource OpenRecentImage}"
ItemsSource="{Binding ProjectService.RecentProjects}">
<rib:DropDownButton.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value.Name}"/>
</DataTemplate>
</rib:DropDownButton.ItemTemplate>
<rib:DropDownButton.ItemContainerStyle>
<Style TargetType="rib:MenuItem">
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext.OpenRecentProjectCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Value.Path}"/>
</Style>
</rib:DropDownButton.ItemContainerStyle>
</rib:DropDownButton>
</rib:RibbonGroupBox>
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_File_Save}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_Save}"
Icon="{StaticResource SaveImage}"
Command="{Binding SaveProjectCommand}"/>
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_SaveAs}"
Icon="{StaticResource SaveAsImage}"
Command="{Binding SaveAsProjectCommand}"/>
</rib:RibbonGroupBox>
</rib:RibbonTabItem>
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Project}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_Settings}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Settings_ProjectSettings}"
Command="{Binding ProjectSettingsCommand}"
Icon="{StaticResource ProjectSettingsImage}"/>
</rib:RibbonGroupBox>
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_New}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewClassroom}"
Icon="{StaticResource ClassroomAddImage}"
Command="{Binding NewClassroomCommand}"/>
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewTeacher}"
Icon="{StaticResource TeacherAddImage}"
Command="{Binding NewTeacherCommand}"/>
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewGroup}"
Icon="{StaticResource GroupAddImage}"
Command="{Binding NewGroupCommand}"/>
</rib:RibbonGroupBox>
<!--rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_Import}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Import_ImportClassrooms}"
Icon="{StaticResource ImportImage}"
Command="{Binding ImportClassroomCommand}"/>
</rib:RibbonGroupBox-->
</rib:RibbonTabItem>
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Edit}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Edit_Timetable}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Edit_Timetable_Autoschedule}"
Icon="{StaticResource AutoscheduleImage}"
Command="{Binding AutoScheduleCommand}"/>
</rib:RibbonGroupBox>
</rib:RibbonTabItem>
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Export}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable_HTML}"
Icon="{StaticResource HTMLImage}"
Command="{Binding ExportHTMLCommand}"/>
<!--rib:Button Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable_XLS}"/-->
</rib:RibbonGroupBox>
</rib:RibbonTabItem>
</rib:Ribbon>
<ScrollViewer Grid.Row="1" CanContentScroll="True">
<TreeView DataContext="{Binding ProjectService.ProjectViewModel}" Visibility="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext, Converter={StaticResource IsNullToVisibilityConverter}}">
<TreeViewItem>
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="{StaticResource ProjectImage}" Width="18" Height="18"/>
<Label Content="{Binding Name}"/>
</StackPanel>
</TreeViewItem.Header>
<TreeViewItem.InputBindings>
<MouseBinding Gesture="LeftDoubleClick"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext.ProjectSettingsCommand}"/>
</TreeViewItem.InputBindings>
<TreeViewItem ItemsSource="{Binding Classrooms}">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="{StaticResource ClassroomImage}" Width="18" Height="18"/>
<Label Content="{x:Static p:Resources.Main_Treeview_Classrooms}"/>
</StackPanel>
</TreeViewItem.Header>
<TreeViewItem.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_EditTimetable}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditTimetableCommand}"
CommandParameter="{Binding}"/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_Classrooms_ContextMenu_Edit}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditClassroomCommand}"
CommandParameter="{Binding}"/>
<Separator/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_Remove}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.RemoveClassroomCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeViewItem.ItemContainerStyle>
</TreeViewItem>
<TreeViewItem ItemsSource="{Binding Teachers}">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="{StaticResource TeacherImage}" Width="18" Height="18"/>
<Label Content="{x:Static p:Resources.Main_Treeview_Teachers}"/>
</StackPanel>
</TreeViewItem.Header>
<TreeViewItem.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_EditTimetable}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditTimetableCommand}"
CommandParameter="{Binding}"/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_Teachers_ContextMenu_Edit}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditTeacherCommand}"
CommandParameter="{Binding}"/>
<Separator/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_Remove}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.RemoveTeacherCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeViewItem.ItemContainerStyle>
</TreeViewItem>
<TreeViewItem ItemsSource="{Binding Groups}">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="{StaticResource GroupImage}" Width="18" Height="18"/>
<Label Content="{x:Static p:Resources.Main_Treeview_Groups}"/>
</StackPanel>
</TreeViewItem.Header>
<TreeViewItem.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_EditTimetable}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditTimetableCommand}"
CommandParameter="{Binding}"/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_Groups_ContextMenu_Edit}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditGroupCommand}"
CommandParameter="{Binding}"/>
<Separator/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_Remove}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.RemoveGroupCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
<Setter Property="ItemsSource" Value="{Binding AssignedSubgroups}"/>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="TreeViewItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_EditTimetable}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.EditTimetableCommand}"
CommandParameter="{Binding}"/>
<Separator/>
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_Remove}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.Tag.RemoveGroupCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
</TreeViewItem.ItemContainerStyle>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</ScrollViewer>
<GridSplitter Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Stretch" ShowsPreview="True" Width="2"/>
<TabControl Grid.Row="1" Grid.Column="2" DataContext="{Binding TabNavigationService}" ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab, Mode=OneWay}">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Image}"
Visibility="{Binding Image, Converter={StaticResource IsNullToVisibilityConverter}}"
Width="15"
Height="15"/>
<TextBlock Text="{Binding Title}"/>
<Button BorderThickness="0"
Background="Transparent"
Margin="5,0,0,0"
Visibility="{Binding IsClosable, Converter={StaticResource boolToVisibilityConverter}}"
Command="{Binding CloseCommand}">
<Image Source="{StaticResource CloseImage}"
Width="15"
Height="15"/>
</Button>
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding ViewModel, Converter={StaticResource ViewModelToViewConverter}}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
<GridSplitter Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Center" ShowsPreview="True" Height="2"/>
<DataGrid Grid.Row="3" Grid.ColumnSpan="3"
ItemsSource="{Binding ProjectService.Errors}"
CanUserAddRows="False"
AutoGenerateColumns="False"
IsReadOnly="True"
IsSynchronizedWithCurrentItem="True"
CanUserSortColumns="True"
VerticalGridLinesBrush="LightGray"
HorizontalGridLinesBrush="Transparent">
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick"
Command="{Binding EditTimetableCommand}"
CommandParameter="{Binding ProjectService.Errors/Unit}"/>
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTemplateColumn Width="25" SortMemberPath="Type">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Width="20" Height="20">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Type}" Value="Error">
<Setter Property="Source" Value="{StaticResource ErrorImage}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Warning">
<Setter Property="Source" Value="{StaticResource WarningImage}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Information">
<Setter Property="Source" Value="{StaticResource InfoImage}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_Source}" SortMemberPath="Unit.Name">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="2,0,2,0" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.Binding>
<MultiBinding StringFormat=" {0}: {1}">
<Binding Path="Unit" Converter="{StaticResource IUnitVMToUnitNameConverter}"/>
<Binding Path="Unit.Name"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_ClassName}" Binding="{Binding Class.Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="2,0,2,0" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_Day}" Binding="{Binding Class.Day.Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="2,0,2,0" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_Slot}">
<DataGridTextColumn.Binding>
<MultiBinding StringFormat=" {0} - {1}">
<Binding Path="Class.Slot.From"/>
<Binding Path="Class.Slot.To"/>
</MultiBinding>
</DataGridTextColumn.Binding>
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="2,0,2,0" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_Description}" Binding="{Binding Description}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="2,0,2,0" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</rib:RibbonWindow>