Project creation, basics
135
.gitignore
vendored
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
|
||||||
|
[Dd]ebug/
|
||||||
|
[Rr]elease/
|
||||||
|
x64/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_i.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.log
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.Publish.xml
|
||||||
|
*.pubxml
|
||||||
|
*.azurePubxml
|
||||||
|
|
||||||
|
# NuGet Packages Directory
|
||||||
|
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||||
|
packages/
|
||||||
|
## TODO: If the tool you use requires repositories.config, also uncomment the next line
|
||||||
|
!packages/repositories.config
|
||||||
|
|
||||||
|
# Windows Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Windows Store app package directory
|
||||||
|
AppPackages/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
sql/
|
||||||
|
*.Cache
|
||||||
|
ClientBin/
|
||||||
|
[Ss]tyle[Cc]op.*
|
||||||
|
![Ss]tyle[Cc]op.targets
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
|
||||||
|
*.publishsettings
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file to a newer
|
||||||
|
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
App_Data/*.mdf
|
||||||
|
App_Data/*.ldf
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Windows detritus
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Mac desktop service store files
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
_NCrunch*
|
||||||
|
|
||||||
|
.vs/
|
||||||
21
TimetableDesigner.Core/Class.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
public class Class
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public Teacher Teacher { get; set; }
|
||||||
|
public Subgroup Subgroup { get; set; }
|
||||||
|
public Classroom Classroom { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
35
TimetableDesigner.Core/Classroom.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
public class Classroom
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public bool IsCapacityLimited { get; set; }
|
||||||
|
public uint Capacity { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public Classroom()
|
||||||
|
{
|
||||||
|
Name = string.Empty;
|
||||||
|
Description = string.Empty;
|
||||||
|
IsCapacityLimited = false;
|
||||||
|
Capacity = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
20
TimetableDesigner.Core/Group.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
public class Group
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public Subgroup MainSubgroup { get; set; }
|
||||||
|
public ICollection<Subgroup> AssignedSubgroups { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
42
TimetableDesigner.Core/Project.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class Project
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Author { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public TimetableTemplate TimetableTemplate { get; set; }
|
||||||
|
public ICollection<Classroom> Classrooms { get; set; }
|
||||||
|
public ICollection<Teacher> Teachers { get; set; }
|
||||||
|
public ICollection<Group> Groups { get; set; }
|
||||||
|
public ICollection<Subgroup> Subgroups { get; set; }
|
||||||
|
public ICollection<Class> Classes { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public Project()
|
||||||
|
{
|
||||||
|
Name = string.Empty;
|
||||||
|
Author = string.Empty;
|
||||||
|
Description = string.Empty;
|
||||||
|
TimetableTemplate = new TimetableTemplate();
|
||||||
|
Classrooms = new List<Classroom>();
|
||||||
|
Teachers = new List<Teacher>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
18
TimetableDesigner.Core/Subgroup.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
public class Subgroup
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
18
TimetableDesigner.Core/Teacher.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
public class Teacher
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
28
TimetableDesigner.Core/TimetableDay.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
public struct TimetableDay
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public TimetableDay(string name)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
9
TimetableDesigner.Core/TimetableDesigner.Core.csproj
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net7.0-windows</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
75
TimetableDesigner.Core/TimetableSlot.cs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public struct TimetableSlot
|
||||||
|
{
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public TimeOnly From { get; private set; }
|
||||||
|
public TimeOnly To { get; private set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public TimetableSlot(TimeOnly from, TimeOnly to)
|
||||||
|
{
|
||||||
|
if (to <= from)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("\"to\" cannot be less or equal to \"from\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
From = from;
|
||||||
|
To = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
internal TimetableSlotsCollision CheckCollision(TimetableSlot slot)
|
||||||
|
{
|
||||||
|
if (slot.To <= this.From)
|
||||||
|
{
|
||||||
|
return TimetableSlotsCollision.CheckedSlotBefore;
|
||||||
|
}
|
||||||
|
else if (this.To <= slot.From)
|
||||||
|
{
|
||||||
|
return TimetableSlotsCollision.CheckedSlotAfter;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (this.From < slot.From && slot.To < this.To)
|
||||||
|
{
|
||||||
|
return TimetableSlotsCollision.CheckedSlotIn;
|
||||||
|
}
|
||||||
|
else if (this.From < slot.From && slot.From < this.To && this.To < slot.To)
|
||||||
|
{
|
||||||
|
return TimetableSlotsCollision.CheckedSlotFromIn;
|
||||||
|
}
|
||||||
|
else if (slot.From < this.From && this.From < slot.To && slot.To < this.To)
|
||||||
|
{
|
||||||
|
return TimetableSlotsCollision.CheckedSlotToIn;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Unknown collision");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object? obj) => obj is TimetableSlot slot && From == slot.From && To == slot.To;
|
||||||
|
|
||||||
|
public override int GetHashCode() => HashCode.Combine(From, To);
|
||||||
|
|
||||||
|
public override string? ToString() => $"{From}-{To}";
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
17
TimetableDesigner.Core/TimetableSlotsCollision.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
internal enum TimetableSlotsCollision
|
||||||
|
{
|
||||||
|
CheckedSlotBefore,
|
||||||
|
CheckedSlotAfter,
|
||||||
|
CheckedSlotIn,
|
||||||
|
CheckedSlotFromIn,
|
||||||
|
CheckedSlotToIn
|
||||||
|
}
|
||||||
|
}
|
||||||
80
TimetableDesigner.Core/TimetableTemplate.cs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Core
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class TimetableTemplate
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private List<TimetableDay> _days;
|
||||||
|
private List<TimetableSlot> _slots;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public IEnumerable<TimetableDay> Days => _days;
|
||||||
|
public IEnumerable<TimetableSlot> Slots => _slots;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public TimetableTemplate()
|
||||||
|
{
|
||||||
|
_days = new List<TimetableDay>();
|
||||||
|
_slots = new List<TimetableSlot>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
public void AddDay(TimetableDay name)
|
||||||
|
{
|
||||||
|
_days.Add(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RemoveDay(TimetableDay day)
|
||||||
|
{
|
||||||
|
return _days.Remove(day);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddSlot(TimetableSlot slot)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
if (_slots.Count > 0)
|
||||||
|
{
|
||||||
|
bool done = false;
|
||||||
|
while (i < _slots.Count && !done)
|
||||||
|
{
|
||||||
|
switch (slot.CheckCollision(_slots[i]))
|
||||||
|
{
|
||||||
|
case TimetableSlotsCollision.CheckedSlotBefore: i++; break;
|
||||||
|
case TimetableSlotsCollision.CheckedSlotAfter: done ^= true; break;
|
||||||
|
default: throw new ArgumentException("Slot collide with another slot");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_slots.Insert(i, slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RemoveSlot(TimetableSlot slot)
|
||||||
|
{
|
||||||
|
return _slots.Remove(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
33
TimetableDesigner.MessageBox/MessageBoxService.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.Versioning;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using TimetableDesigner.MessageBox.Properties;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.MessageBox
|
||||||
|
{
|
||||||
|
public static class MessageBoxService
|
||||||
|
{
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
public static void ShowError(string message) => System.Windows.MessageBox.Show(message, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
|
||||||
|
public static MessageBoxYesNoCancelResult ShowYesNoCancelQuestion(string message)
|
||||||
|
{
|
||||||
|
MessageBoxResult result = System.Windows.MessageBox.Show(message, Resources.Error, MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
|
||||||
|
switch (result)
|
||||||
|
{
|
||||||
|
case MessageBoxResult.Yes: return MessageBoxYesNoCancelResult.Yes;
|
||||||
|
case MessageBoxResult.No: return MessageBoxYesNoCancelResult.No;
|
||||||
|
case MessageBoxResult.Cancel: return MessageBoxYesNoCancelResult.Cancel;
|
||||||
|
default: return MessageBoxYesNoCancelResult.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
16
TimetableDesigner.MessageBox/MessageBoxYesNoCancelResult.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.MessageBox
|
||||||
|
{
|
||||||
|
public enum MessageBoxYesNoCancelResult
|
||||||
|
{
|
||||||
|
Yes,
|
||||||
|
No,
|
||||||
|
Cancel,
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
81
TimetableDesigner.MessageBox/Properties/Resources.Designer.cs
generated
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace TimetableDesigner.MessageBox.Properties {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
|
/// </summary>
|
||||||
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
|
// class via a tool like ResGen or Visual Studio.
|
||||||
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
|
// with the /str option, or rebuild your VS project.
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class Resources {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TimetableDesigner.MessageBox.Properties.Resources", typeof(Resources).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
|
/// resource lookups using this strongly typed resource class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Error.
|
||||||
|
/// </summary>
|
||||||
|
internal static string Error {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Error", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Question.
|
||||||
|
/// </summary>
|
||||||
|
internal static string Question {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Question", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
126
TimetableDesigner.MessageBox/Properties/Resources.resx
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="Error" xml:space="preserve">
|
||||||
|
<value>Error</value>
|
||||||
|
</data>
|
||||||
|
<data name="Question" xml:space="preserve">
|
||||||
|
<value>Question</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net7.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="Properties\Resources.Designer.cs">
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Update="Properties\Resources.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
22
TimetableDesigner.Tests/TimetableDesigner.Tests.csproj
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net7.0-windows</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
|
||||||
|
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||||
|
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||||
|
<PackageReference Include="coverlet.collector" Version="3.1.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\TimetableDesigner.Core\TimetableDesigner.Core.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
167
TimetableDesigner.Tests/TimetableTest.cs
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Tests
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public class TimetableTest
|
||||||
|
{
|
||||||
|
[TestMethod]
|
||||||
|
public void CreateValidSlotTest()
|
||||||
|
{
|
||||||
|
TimetableSlot slot = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
[ExpectedException(typeof(ArgumentException))]
|
||||||
|
public void CreateInvalidSlotTest()
|
||||||
|
{
|
||||||
|
TimetableSlot slot = new TimetableSlot(new TimeOnly(9, 0), new TimeOnly(8, 0));
|
||||||
|
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
[ExpectedException(typeof(ArgumentException))]
|
||||||
|
public void CreateSlotWithZeroLengthTest()
|
||||||
|
{
|
||||||
|
TimetableSlot slot = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(8, 0));
|
||||||
|
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void CreateModelTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void AddDayTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableDay day = new TimetableDay
|
||||||
|
{
|
||||||
|
Name = "Monday"
|
||||||
|
};
|
||||||
|
|
||||||
|
model.AddDay(day);
|
||||||
|
|
||||||
|
Assert.AreEqual(1, model.Days.Count());
|
||||||
|
Assert.AreEqual(day, model.Days.ToList()[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void AddSlotTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableSlot slot = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0));
|
||||||
|
|
||||||
|
model.AddSlot(slot);
|
||||||
|
|
||||||
|
Assert.AreEqual(1, model.Slots.Count());
|
||||||
|
Assert.AreEqual(new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0)), model.Slots.ToList()[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void AddNoCollidingSlotsTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableSlot slot1 = new TimetableSlot(new TimeOnly(8, 15), new TimeOnly(9, 0));
|
||||||
|
TimetableSlot slot2 = new TimetableSlot(new TimeOnly(9, 15), new TimeOnly(10, 0));
|
||||||
|
|
||||||
|
model.AddSlot(slot1);
|
||||||
|
model.AddSlot(slot2);
|
||||||
|
|
||||||
|
Assert.AreEqual(2, model.Slots.Count());
|
||||||
|
Assert.AreEqual(new TimetableSlot(new TimeOnly(8, 15), new TimeOnly(9, 0)), model.Slots.ToList()[0]);
|
||||||
|
Assert.AreEqual(new TimetableSlot(new TimeOnly(9, 15), new TimeOnly(10, 0)), model.Slots.ToList()[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void AddSlotsWithoutBreakTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableSlot slot1 = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0));
|
||||||
|
TimetableSlot slot2 = new TimetableSlot(new TimeOnly(9, 0), new TimeOnly(10, 0));
|
||||||
|
|
||||||
|
model.AddSlot(slot1);
|
||||||
|
model.AddSlot(slot2);
|
||||||
|
|
||||||
|
Assert.AreEqual(2, model.Slots.Count());
|
||||||
|
Assert.AreEqual(new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0)), model.Slots.ToList()[0]);
|
||||||
|
Assert.AreEqual(new TimetableSlot(new TimeOnly(9, 0), new TimeOnly(10, 0)), model.Slots.ToList()[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
[ExpectedException(typeof(ArgumentException))]
|
||||||
|
public void AddCollidingSlotsTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableSlot slot1 = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 30));
|
||||||
|
TimetableSlot slot2 = new TimetableSlot(new TimeOnly(8, 30), new TimeOnly(10, 0));
|
||||||
|
|
||||||
|
model.AddSlot(slot1);
|
||||||
|
model.AddSlot(slot2);
|
||||||
|
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
[ExpectedException(typeof(ArgumentException))]
|
||||||
|
public void AddBetweenCollidingSlotsTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableSlot slot1 = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0));
|
||||||
|
TimetableSlot slot2 = new TimetableSlot(new TimeOnly(10, 0), new TimeOnly(11, 0));
|
||||||
|
TimetableSlot slot3 = new TimetableSlot(new TimeOnly(8, 59), new TimeOnly(10, 1));
|
||||||
|
|
||||||
|
model.AddSlot(slot1);
|
||||||
|
model.AddSlot(slot2);
|
||||||
|
model.AddSlot(slot3);
|
||||||
|
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void SortSlotsTest()
|
||||||
|
{
|
||||||
|
TimetableTemplate model = new TimetableTemplate();
|
||||||
|
|
||||||
|
TimetableSlot slot1 = new TimetableSlot(new TimeOnly(12, 0), new TimeOnly(13, 0));
|
||||||
|
TimetableSlot slot2 = new TimetableSlot(new TimeOnly(8, 0), new TimeOnly(9, 0));
|
||||||
|
TimetableSlot slot3 = new TimetableSlot(new TimeOnly(10, 0), new TimeOnly(11, 0));
|
||||||
|
TimetableSlot slot4 = new TimetableSlot(new TimeOnly(14, 0), new TimeOnly(15, 0));
|
||||||
|
TimetableSlot slot5 = new TimetableSlot(new TimeOnly(13, 0), new TimeOnly(14, 0));
|
||||||
|
TimetableSlot slot6 = new TimetableSlot(new TimeOnly(9, 0), new TimeOnly(10, 0));
|
||||||
|
TimetableSlot slot7 = new TimetableSlot(new TimeOnly(11, 0), new TimeOnly(12, 0));
|
||||||
|
|
||||||
|
model.AddSlot(slot1);
|
||||||
|
model.AddSlot(slot2);
|
||||||
|
model.AddSlot(slot3);
|
||||||
|
model.AddSlot(slot4);
|
||||||
|
model.AddSlot(slot5);
|
||||||
|
model.AddSlot(slot6);
|
||||||
|
model.AddSlot(slot7);
|
||||||
|
|
||||||
|
List<TimetableSlot> slots = model.Slots.ToList();
|
||||||
|
|
||||||
|
TimetableSlot testSlot = slots[0];
|
||||||
|
for (int i = 1; i < slots.Count; i++)
|
||||||
|
{
|
||||||
|
if (testSlot.To > slots[i].From)
|
||||||
|
{
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
testSlot = slots[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
61
TimetableDesigner.sln
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.4.33213.308
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimetableDesigner", "TimetableDesigner\TimetableDesigner.csproj", "{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimetableDesigner.Core", "TimetableDesigner.Core\TimetableDesigner.Core.csproj", "{A00B17BE-238D-4241-BECC-30119F8CBEE0}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimetableDesigner.Tests", "TimetableDesigner.Tests\TimetableDesigner.Tests.csproj", "{A9B4DB89-A007-472A-9C80-B6340458AC1B}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TimetableDesigner.MessageBox", "TimetableDesigner.MessageBox\TimetableDesigner.MessageBox.csproj", "{95992646-6D81-4FF4-885E-8F0BE2312D54}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{739E5B4E-09D0-468C-9FA0-4BB6D89C1FE0}.Release|x64.Build.0 = Release|x64
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{A00B17BE-238D-4241-BECC-30119F8CBEE0}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{A9B4DB89-A007-472A-9C80-B6340458AC1B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{95992646-6D81-4FF4-885E-8F0BE2312D54}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {948AE685-3476-4374-9ADE-9F57FDE2D8D7}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
15
TimetableDesigner/App.xaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<Application x:Class="TimetableDesigner.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
ShutdownMode="OnMainWindowClose"
|
||||||
|
StartupUri="Views/MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="Resources/Converters.xaml"/>
|
||||||
|
<ResourceDictionary Source="Resources/Images.xaml"/>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Generic.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
17
TimetableDesigner/App.xaml.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace TimetableDesigner
|
||||||
|
{
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public App()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
TimetableDesigner/AssemblyInfo.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
[assembly: ThemeInfo(
|
||||||
|
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// or application resource dictionaries)
|
||||||
|
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// app, or any theme specific resource dictionaries)
|
||||||
|
)]
|
||||||
61
TimetableDesigner/Commands/RelayCommand.cs
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Commands
|
||||||
|
{
|
||||||
|
public class RelayCommand<T> : ICommand
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private readonly Action<T> _execute;
|
||||||
|
private readonly Predicate<T> _canExecute;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public RelayCommand(Action<T> execute) : this(execute, null) { }
|
||||||
|
|
||||||
|
public RelayCommand(Action<T> execute, Predicate<T> canExecute)
|
||||||
|
{
|
||||||
|
if (execute == null)
|
||||||
|
throw new ArgumentNullException("execute");
|
||||||
|
|
||||||
|
_execute = execute;
|
||||||
|
_canExecute = canExecute;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
public bool CanExecute(object parameter) => _canExecute == null || _canExecute((T)parameter);
|
||||||
|
|
||||||
|
public void Execute(object parameter)
|
||||||
|
{
|
||||||
|
_execute((T)parameter);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region EVENTS
|
||||||
|
|
||||||
|
public event EventHandler CanExecuteChanged
|
||||||
|
{
|
||||||
|
add { CommandManager.RequerySuggested += value; }
|
||||||
|
remove { CommandManager.RequerySuggested -= value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
24
TimetableDesigner/Converters/IsNotNullToBooleanConverter.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Converters
|
||||||
|
{
|
||||||
|
public class IsNotNullToBooleanConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
return value is not null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
TimetableDesigner/Converters/IsNullToVisibilityConverter.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Converters
|
||||||
|
{
|
||||||
|
public class IsNullToVisibilityConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
return value is null ? Visibility.Collapsed : Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
57
TimetableDesigner/Converters/ViewModelToViewConverter.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using TimetableDesigner.ViewModels;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
using TimetableDesigner.Views;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Converters
|
||||||
|
{
|
||||||
|
public class ViewModelToViewConverter : IValueConverter
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private static readonly Dictionary<Type, Type> _viewModelViewPairs = new Dictionary<Type, Type>
|
||||||
|
{
|
||||||
|
{ typeof(MainViewModel), typeof(MainWindow) },
|
||||||
|
{ typeof(WelcomeTabViewModel), typeof(WelcomeTabView) },
|
||||||
|
{ typeof(ProjectSettingsTabViewModel), typeof(ProjectSettingsTabView) },
|
||||||
|
{ typeof(ClassroomEditTabViewModel), typeof(ClassroomEditTabView) },
|
||||||
|
};
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
BaseViewModel? viewModel = value as BaseViewModel;
|
||||||
|
if (viewModel is not null)
|
||||||
|
{
|
||||||
|
Type view = _viewModelViewPairs[viewModel.GetType()];
|
||||||
|
FrameworkElement? viewInstance = Activator.CreateInstance(view) as FrameworkElement;
|
||||||
|
if (viewInstance is not null )
|
||||||
|
{
|
||||||
|
viewInstance.DataContext = viewModel;
|
||||||
|
return viewInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
441
TimetableDesigner/Properties/Resources.Designer.cs
generated
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Properties {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
|
/// </summary>
|
||||||
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
|
// class via a tool like ResGen or Visual Studio.
|
||||||
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
|
// with the /str option, or rebuild your VS project.
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
public class Resources {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
public static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TimetableDesigner.Properties.Resources", typeof(Resources).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
|
/// resource lookups using this strongly typed resource class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
public static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Capacity.
|
||||||
|
/// </summary>
|
||||||
|
public static string ClassroomEdit_Capacity {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ClassroomEdit.Capacity", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Is limited?.
|
||||||
|
/// </summary>
|
||||||
|
public static string ClassroomEdit_CapacityIsLimited {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ClassroomEdit.CapacityIsLimited", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Description.
|
||||||
|
/// </summary>
|
||||||
|
public static string ClassroomEdit_Description {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ClassroomEdit.Description", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Name.
|
||||||
|
/// </summary>
|
||||||
|
public static string ClassroomEdit_Name {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ClassroomEdit.Name", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New classroom.
|
||||||
|
/// </summary>
|
||||||
|
public static string Global_DefaultClassroomName {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Global.DefaultClassroomName", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New project.
|
||||||
|
/// </summary>
|
||||||
|
public static string Global_DefaultProjectName {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Global.DefaultProjectName", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to no project loaded.
|
||||||
|
/// </summary>
|
||||||
|
public static string Global_NoProjectLoadedTitle {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Global.NoProjectLoadedTitle", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Project is loaded. Do you want to save?.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Message_SaveCurrentProject {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Message.SaveCurrentProject", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to File.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New/Open.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_NewOpen {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.NewOpen", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_NewOpen_New {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.NewOpen.New", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Open.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_NewOpen_Open {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.NewOpen.Open", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Open recent.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_NewOpen_OpenRecent {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.NewOpen.OpenRecent", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Save.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_Save {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.Save", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Save.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_Save_Save {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.Save.Save", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Save as.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_File_Save_SaveAs {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.File.Save.SaveAs", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Project.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_New {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.New", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New class.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_New_NewClass {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.New.NewClass", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New classroom.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_New_NewClassroom {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.New.NewClassroom", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New group.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_New_NewGroup {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.New.NewGroup", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New subgroup.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_New_NewSubgroup {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.New.NewSubgroup", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New teacher.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_New_NewTeacher {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.New.NewTeacher", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Settings.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_Settings {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.Settings", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Project settings.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Ribbon_Project_Settings_ProjectSettings {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Ribbon.Project.Settings.ProjectSettings", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Classrooms.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Treeview_Classrooms {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Treeview.Classrooms", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Edit classroom.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Treeview_Classrooms_ContextMenu_Edit {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Treeview.Classrooms.ContextMenu.Edit", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Edit timetable.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Treeview_ContextMenu_EditTimetable {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Treeview.ContextMenu.EditTimetable", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Remove.
|
||||||
|
/// </summary>
|
||||||
|
public static string Main_Treeview_ContextMenu_Remove {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Main.Treeview.ContextMenu.Remove", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Error.
|
||||||
|
/// </summary>
|
||||||
|
public static string MessageBox_Error {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("MessageBox.Error", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Author.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Author {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Author", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Basics.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Basics {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Basics", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Days.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Days {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Days", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Description.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Description {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Description", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Hours.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Hours {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Hours", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Length of the class have to be higher than 0 minutes.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Message_FromHigherThanTo {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Message.FromHigherThanTo", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Slot collide with another slot.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Message_SlotCollision {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Message.SlotCollision", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Name.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_Name {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.Name", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Timetable model.
|
||||||
|
/// </summary>
|
||||||
|
public static string ProjectSettings_TimetableModel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ProjectSettings.TimetableModel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Classroom editing.
|
||||||
|
/// </summary>
|
||||||
|
public static string Tabs_ClassroomEdit {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Tabs.ClassroomEdit", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Project settings.
|
||||||
|
/// </summary>
|
||||||
|
public static string Tabs_ProjectSettings {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Tabs.ProjectSettings", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Welcome.
|
||||||
|
/// </summary>
|
||||||
|
public static string Tabs_Welcome {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Tabs.Welcome", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
63
TimetableDesigner/Properties/Resources.pl-PL.Designer.cs
generated
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Properties {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
|
/// </summary>
|
||||||
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
|
// class via a tool like ResGen or Visual Studio.
|
||||||
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
|
// with the /str option, or rebuild your VS project.
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
public class Resources___Copy {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources___Copy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
public static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TimetableDesigner.Properties.Resources - Copy", typeof(Resources___Copy).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
|
/// resource lookups using this strongly typed resource class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
public static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
101
TimetableDesigner/Properties/Resources.pl-PL.resx
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 1.3
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">1.3</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1">this is my long string</data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
[base64 mime encoded serialized .NET Framework object]
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
[base64 mime encoded string representing a byte array form of the .NET Framework object]
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>1.3</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
246
TimetableDesigner/Properties/Resources.resx
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="ClassroomEdit.Capacity" xml:space="preserve">
|
||||||
|
<value>Capacity</value>
|
||||||
|
</data>
|
||||||
|
<data name="ClassroomEdit.CapacityIsLimited" xml:space="preserve">
|
||||||
|
<value>Is limited?</value>
|
||||||
|
</data>
|
||||||
|
<data name="ClassroomEdit.Description" xml:space="preserve">
|
||||||
|
<value>Description</value>
|
||||||
|
</data>
|
||||||
|
<data name="ClassroomEdit.Name" xml:space="preserve">
|
||||||
|
<value>Name</value>
|
||||||
|
</data>
|
||||||
|
<data name="Global.DefaultClassroomName" xml:space="preserve">
|
||||||
|
<value>New classroom</value>
|
||||||
|
</data>
|
||||||
|
<data name="Global.DefaultProjectName" xml:space="preserve">
|
||||||
|
<value>New project</value>
|
||||||
|
</data>
|
||||||
|
<data name="Global.NoProjectLoadedTitle" xml:space="preserve">
|
||||||
|
<value>no project loaded</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Message.SaveCurrentProject" xml:space="preserve">
|
||||||
|
<value>Project is loaded. Do you want to save?</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File" xml:space="preserve">
|
||||||
|
<value>File</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.NewOpen" xml:space="preserve">
|
||||||
|
<value>New/Open</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.NewOpen.New" xml:space="preserve">
|
||||||
|
<value>New</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.NewOpen.Open" xml:space="preserve">
|
||||||
|
<value>Open</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.NewOpen.OpenRecent" xml:space="preserve">
|
||||||
|
<value>Open recent</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.Save" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.Save.Save" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.File.Save.SaveAs" xml:space="preserve">
|
||||||
|
<value>Save as</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project" xml:space="preserve">
|
||||||
|
<value>Project</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.New" xml:space="preserve">
|
||||||
|
<value>New</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.New.NewClass" xml:space="preserve">
|
||||||
|
<value>New class</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.New.NewClassroom" xml:space="preserve">
|
||||||
|
<value>New classroom</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.New.NewGroup" xml:space="preserve">
|
||||||
|
<value>New group</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.New.NewSubgroup" xml:space="preserve">
|
||||||
|
<value>New subgroup</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.New.NewTeacher" xml:space="preserve">
|
||||||
|
<value>New teacher</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.Settings" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Ribbon.Project.Settings.ProjectSettings" xml:space="preserve">
|
||||||
|
<value>Project settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Treeview.Classrooms" xml:space="preserve">
|
||||||
|
<value>Classrooms</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Treeview.Classrooms.ContextMenu.Edit" xml:space="preserve">
|
||||||
|
<value>Edit classroom</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Treeview.ContextMenu.EditTimetable" xml:space="preserve">
|
||||||
|
<value>Edit timetable</value>
|
||||||
|
</data>
|
||||||
|
<data name="Main.Treeview.ContextMenu.Remove" xml:space="preserve">
|
||||||
|
<value>Remove</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageBox.Error" xml:space="preserve">
|
||||||
|
<value>Error</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Author" xml:space="preserve">
|
||||||
|
<value>Author</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Basics" xml:space="preserve">
|
||||||
|
<value>Basics</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Days" xml:space="preserve">
|
||||||
|
<value>Days</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Description" xml:space="preserve">
|
||||||
|
<value>Description</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Hours" xml:space="preserve">
|
||||||
|
<value>Hours</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Message.FromHigherThanTo" xml:space="preserve">
|
||||||
|
<value>Length of the class have to be higher than 0 minutes</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Message.SlotCollision" xml:space="preserve">
|
||||||
|
<value>Slot collide with another slot</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.Name" xml:space="preserve">
|
||||||
|
<value>Name</value>
|
||||||
|
</data>
|
||||||
|
<data name="ProjectSettings.TimetableModel" xml:space="preserve">
|
||||||
|
<value>Timetable model</value>
|
||||||
|
</data>
|
||||||
|
<data name="Tabs.ClassroomEdit" xml:space="preserve">
|
||||||
|
<value>Classroom editing</value>
|
||||||
|
</data>
|
||||||
|
<data name="Tabs.ProjectSettings" xml:space="preserve">
|
||||||
|
<value>Project settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="Tabs.Welcome" xml:space="preserve">
|
||||||
|
<value>Welcome</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
7
TimetableDesigner/Resources/Converters.xaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:c="clr-namespace:TimetableDesigner.Converters">
|
||||||
|
<c:ViewModelToViewConverter x:Key="ViewModelToViewConverter"/>
|
||||||
|
<c:IsNullToVisibilityConverter x:Key="IsNullToVisibilityConverter"/>
|
||||||
|
<c:IsNotNullToBooleanConverter x:Key="IsNotNullToBooleanConverter"/>
|
||||||
|
</ResourceDictionary>
|
||||||
16
TimetableDesigner/Resources/Images.xaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:s="clr-namespace:System;assembly=mscorlib">
|
||||||
|
<BitmapImage x:Key="CloseImage" UriSource="Images/Close.png"/>
|
||||||
|
<BitmapImage x:Key="AddImage" UriSource="Images/Add.png"/>
|
||||||
|
<BitmapImage x:Key="RemoveImage" UriSource="Images/Remove.png"/>
|
||||||
|
<BitmapImage x:Key="ProjectImage" UriSource="Images/Project.png"/>
|
||||||
|
<BitmapImage x:Key="ProjectSettingsImage" UriSource="Images/ProjectSettings.png"/>
|
||||||
|
<BitmapImage x:Key="ClassroomImage" UriSource="Images/Classroom.png"/>
|
||||||
|
<BitmapImage x:Key="ClassroomAddImage" UriSource="Images/ClassroomAdd.png"/>
|
||||||
|
<BitmapImage x:Key="OpenImage" UriSource="Images/Open.png"/>
|
||||||
|
<BitmapImage x:Key="OpenRecentImage" UriSource="Images/OpenRecent.png"/>
|
||||||
|
<BitmapImage x:Key="SaveImage" UriSource="Images/Save.png"/>
|
||||||
|
<BitmapImage x:Key="SaveAsImage" UriSource="Images/SaveAs.png"/>
|
||||||
|
<BitmapImage x:Key="NewImage" UriSource="Images/New.png"/>
|
||||||
|
</ResourceDictionary>
|
||||||
BIN
TimetableDesigner/Resources/Images/Add.png
Normal file
|
After Width: | Height: | Size: 246 B |
BIN
TimetableDesigner/Resources/Images/Classroom.png
Normal file
|
After Width: | Height: | Size: 537 B |
BIN
TimetableDesigner/Resources/Images/ClassroomAdd.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
TimetableDesigner/Resources/Images/Close.png
Normal file
|
After Width: | Height: | Size: 360 B |
BIN
TimetableDesigner/Resources/Images/New.png
Normal file
|
After Width: | Height: | Size: 696 B |
BIN
TimetableDesigner/Resources/Images/Open.png
Normal file
|
After Width: | Height: | Size: 599 B |
BIN
TimetableDesigner/Resources/Images/OpenRecent.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
TimetableDesigner/Resources/Images/Project.png
Normal file
|
After Width: | Height: | Size: 853 B |
BIN
TimetableDesigner/Resources/Images/ProjectSettings.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
TimetableDesigner/Resources/Images/Remove.png
Normal file
|
After Width: | Height: | Size: 401 B |
BIN
TimetableDesigner/Resources/Images/Save.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
TimetableDesigner/Resources/Images/SaveAs.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
103
TimetableDesigner/TimetableDesigner.csproj
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net7.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
<Platforms>AnyCPU;x64</Platforms>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="Resources\Images\Add.png" />
|
||||||
|
<None Remove="Resources\Images\Classroom.png" />
|
||||||
|
<None Remove="Resources\Images\ClassroomAdd.png" />
|
||||||
|
<None Remove="Resources\Images\Close.png" />
|
||||||
|
<None Remove="Resources\Images\CloseButtonImage.png" />
|
||||||
|
<None Remove="Resources\Images\New.png" />
|
||||||
|
<None Remove="Resources\Images\Open.png" />
|
||||||
|
<None Remove="Resources\Images\OpenRecent.png" />
|
||||||
|
<None Remove="Resources\Images\Project.png" />
|
||||||
|
<None Remove="Resources\Images\ProjectSettings.png" />
|
||||||
|
<None Remove="Resources\Images\Remove.png" />
|
||||||
|
<None Remove="Resources\Images\Save.png" />
|
||||||
|
<None Remove="Resources\Images\SaveAs.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Resources\Images\Classroom.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\ClassroomAdd.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\Close.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\New.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\Open.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\OpenRecent.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\Project.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\ProjectSettings.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\Remove.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\Save.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\Images\SaveAs.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Extended.Wpf.Toolkit" Version="4.5.0" />
|
||||||
|
<PackageReference Include="Fluent.Ribbon" Version="9.0.4" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\TimetableDesigner.Core\TimetableDesigner.Core.csproj" />
|
||||||
|
<ProjectReference Include="..\TimetableDesigner.MessageBox\TimetableDesigner.MessageBox.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="Resources\Images\Add.png">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="Properties\Resources.pl-PL.Designer.cs">
|
||||||
|
<DependentUpon>Resources.pl-PL.resx</DependentUpon>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
</Compile>
|
||||||
|
<Compile Update="Properties\Resources.Designer.cs">
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Update="Properties\Resources.pl-PL.resx">
|
||||||
|
<LastGenOutput>Resources.pl-PL.Designer.cs</LastGenOutput>
|
||||||
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Update="Properties\Resources.resx">
|
||||||
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
56
TimetableDesigner/ViewModels/Base/BaseTabViewModel.cs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels.Base
|
||||||
|
{
|
||||||
|
public abstract class BaseTabViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private ImageSource _tabImage;
|
||||||
|
private string _tabTitle;
|
||||||
|
private bool _isTabClosable;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public ImageSource TabImage
|
||||||
|
{
|
||||||
|
get => _tabImage;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_tabImage = value;
|
||||||
|
NotifyPropertyChanged(nameof(TabImage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public string TabTitle
|
||||||
|
{
|
||||||
|
get => _tabTitle;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_tabTitle = value;
|
||||||
|
NotifyPropertyChanged(nameof(TabTitle));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool IsTabClosable
|
||||||
|
{
|
||||||
|
get => _isTabClosable;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isTabClosable = value;
|
||||||
|
NotifyPropertyChanged(nameof(IsTabClosable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
26
TimetableDesigner/ViewModels/Base/BaseViewModel.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels.Base
|
||||||
|
{
|
||||||
|
public abstract class BaseViewModel : INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
#region PROTECTED METHODS
|
||||||
|
|
||||||
|
protected void NotifyPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region EVENTS
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler? PropertyChanged;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
52
TimetableDesigner/ViewModels/ClassroomEditTabViewModel.cs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
using TimetableDesigner.ViewModels.Models;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels
|
||||||
|
{
|
||||||
|
public class ClassroomEditTabViewModel : BaseTabViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private ClassroomViewModel _classroom;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public ClassroomViewModel Classroom
|
||||||
|
{
|
||||||
|
get => _classroom;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_classroom != value)
|
||||||
|
{
|
||||||
|
_classroom = value;
|
||||||
|
NotifyPropertyChanged(nameof(Classroom));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public ClassroomEditTabViewModel() : this(new ClassroomViewModel(new Core.Classroom()))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public ClassroomEditTabViewModel(ClassroomViewModel classroom)
|
||||||
|
{
|
||||||
|
_classroom = classroom;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
214
TimetableDesigner/ViewModels/MainViewModel.cs
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using TimetableDesigner.Commands;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
using System.Windows;
|
||||||
|
using TimetableDesigner.Properties;
|
||||||
|
using TimetableDesigner.MessageBox;
|
||||||
|
using System.Reflection;
|
||||||
|
using TimetableDesigner.ViewModels.Models;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels
|
||||||
|
{
|
||||||
|
class MainViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private ProjectViewModel? _project;
|
||||||
|
|
||||||
|
private ObservableCollection<BaseTabViewModel> _tabs;
|
||||||
|
private BaseTabViewModel? _selectedTab;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public string Version { get; set; }
|
||||||
|
|
||||||
|
public ICommand CloseTabCommand { get; set; }
|
||||||
|
public ICommand NewProjectCommand { get; set; }
|
||||||
|
public ICommand OpenProjectCommand { get; set; }
|
||||||
|
public ICommand ProjectSettingsCommand { get; set; }
|
||||||
|
public ICommand NewClassroomCommand { get; set; }
|
||||||
|
public ICommand EditClassroomCommand { get; set; }
|
||||||
|
public ICommand RemoveClassroomCommand { get; set; }
|
||||||
|
|
||||||
|
public ObservableCollection<BaseTabViewModel> Tabs
|
||||||
|
{
|
||||||
|
get => _tabs;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_tabs = value;
|
||||||
|
NotifyPropertyChanged(nameof(Tabs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public BaseTabViewModel? SelectedTab
|
||||||
|
{
|
||||||
|
get => _selectedTab;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_selectedTab = value;
|
||||||
|
NotifyPropertyChanged(nameof(SelectedTab));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProjectViewModel? Project
|
||||||
|
{
|
||||||
|
get => _project;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _project)
|
||||||
|
{
|
||||||
|
_project = value;
|
||||||
|
NotifyPropertyChanged(nameof(Project));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public MainViewModel()
|
||||||
|
{
|
||||||
|
Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
|
|
||||||
|
CloseTabCommand = new RelayCommand<BaseTabViewModel>(CloseTab);
|
||||||
|
NewProjectCommand = new RelayCommand<object>(param => NewProject());
|
||||||
|
OpenProjectCommand = new RelayCommand<object>(param => OpenProject());
|
||||||
|
ProjectSettingsCommand = new RelayCommand<object>(param => ProjectSettings());
|
||||||
|
NewClassroomCommand = new RelayCommand<object>(param => NewClassroom());
|
||||||
|
EditClassroomCommand = new RelayCommand<ClassroomViewModel>(EditClassroom);
|
||||||
|
RemoveClassroomCommand = new RelayCommand<ClassroomViewModel>(DeleteClassroom);
|
||||||
|
|
||||||
|
_tabs = new ObservableCollection<BaseTabViewModel>
|
||||||
|
{
|
||||||
|
new WelcomeTabViewModel() { TabTitle = Resources.Tabs_Welcome }
|
||||||
|
};
|
||||||
|
_selectedTab = Tabs.Last();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
private void CloseTab(BaseTabViewModel tab)
|
||||||
|
{
|
||||||
|
if (SelectedTab == tab)
|
||||||
|
{
|
||||||
|
int index = Tabs.IndexOf(tab);
|
||||||
|
int before = index - 1;
|
||||||
|
int after = index + 1;
|
||||||
|
|
||||||
|
BaseTabViewModel newSelectedTab = null;
|
||||||
|
if (before >= 0)
|
||||||
|
{
|
||||||
|
newSelectedTab = Tabs[before];
|
||||||
|
}
|
||||||
|
else if (after >= 0 && after < Tabs.Count - 1)
|
||||||
|
{
|
||||||
|
newSelectedTab = Tabs[after];
|
||||||
|
}
|
||||||
|
SelectedTab = newSelectedTab;
|
||||||
|
}
|
||||||
|
Tabs.Remove(tab);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenProject()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NewProject()
|
||||||
|
{
|
||||||
|
if (Project is not null)
|
||||||
|
{
|
||||||
|
MessageBoxYesNoCancelResult result = MessageBoxService.ShowYesNoCancelQuestion(Resources.Main_Message_SaveCurrentProject);
|
||||||
|
|
||||||
|
switch (result)
|
||||||
|
{
|
||||||
|
case MessageBoxYesNoCancelResult.Yes: break;
|
||||||
|
case MessageBoxYesNoCancelResult.No: break;
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Tabs.Clear();
|
||||||
|
|
||||||
|
Project project = new Project()
|
||||||
|
{
|
||||||
|
Name = Resources.Global_DefaultProjectName,
|
||||||
|
};
|
||||||
|
Project = new ProjectViewModel(project);
|
||||||
|
ProjectSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProjectSettings()
|
||||||
|
{
|
||||||
|
if (Project is not null)
|
||||||
|
{
|
||||||
|
ProjectSettingsTabViewModel projectSettingsTabVM = new ProjectSettingsTabViewModel()
|
||||||
|
{
|
||||||
|
Project = Project,
|
||||||
|
TabTitle = Resources.Tabs_ProjectSettings,
|
||||||
|
IsTabClosable = true,
|
||||||
|
};
|
||||||
|
Tabs.Add(projectSettingsTabVM);
|
||||||
|
SelectedTab = Tabs.Last();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NewClassroom()
|
||||||
|
{
|
||||||
|
if (Project is not null)
|
||||||
|
{
|
||||||
|
Classroom classroom = new Classroom()
|
||||||
|
{
|
||||||
|
Name = Resources.Global_DefaultClassroomName
|
||||||
|
};
|
||||||
|
ClassroomViewModel classroomVM = new ClassroomViewModel(classroom);
|
||||||
|
Project.Classrooms.Add(classroomVM);
|
||||||
|
EditClassroom(classroomVM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EditClassroom(ClassroomViewModel classroomViewModel)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("textedit");
|
||||||
|
ClassroomEditTabViewModel classroomEdit = new ClassroomEditTabViewModel()
|
||||||
|
{
|
||||||
|
Classroom = classroomViewModel,
|
||||||
|
TabTitle = $"{Resources.Tabs_ClassroomEdit}: {classroomViewModel.Name}",
|
||||||
|
IsTabClosable = true
|
||||||
|
};
|
||||||
|
Tabs.Add(classroomEdit);
|
||||||
|
SelectedTab = classroomEdit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DeleteClassroom(ClassroomViewModel classroomViewModel)
|
||||||
|
{
|
||||||
|
Debug.WriteLine("textdelete");
|
||||||
|
if (Project is not null)
|
||||||
|
{
|
||||||
|
Project.Classrooms.Remove(classroomViewModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
87
TimetableDesigner/ViewModels/Models/ClassroomViewModel.cs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels.Models
|
||||||
|
{
|
||||||
|
public class ClassroomViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private Classroom _classroom;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public Classroom Classroom => _classroom;
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get => _classroom.Name;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_classroom.Name != value)
|
||||||
|
{
|
||||||
|
_classroom.Name = value;
|
||||||
|
NotifyPropertyChanged(nameof(Name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public string Description
|
||||||
|
{
|
||||||
|
get => _classroom.Description;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_classroom.Description != value)
|
||||||
|
{
|
||||||
|
_classroom.Description = value;
|
||||||
|
NotifyPropertyChanged(nameof(Description));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool IsCapacityLimited
|
||||||
|
{
|
||||||
|
get => _classroom.IsCapacityLimited;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_classroom.IsCapacityLimited != value)
|
||||||
|
{
|
||||||
|
_classroom.IsCapacityLimited = value;
|
||||||
|
NotifyPropertyChanged(nameof(IsCapacityLimited));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public uint Capacity
|
||||||
|
{
|
||||||
|
get => _classroom.Capacity;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_classroom.Capacity != value)
|
||||||
|
{
|
||||||
|
_classroom.Capacity = value;
|
||||||
|
NotifyPropertyChanged(nameof(Capacity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public ClassroomViewModel(Classroom classroom)
|
||||||
|
{
|
||||||
|
_classroom = classroom;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
111
TimetableDesigner/ViewModels/Models/ProjectViewModel.cs
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels.Models
|
||||||
|
{
|
||||||
|
public class ProjectViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private Project _project;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public Project Project => _project;
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get => Project.Name;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (Project.Name != value)
|
||||||
|
{
|
||||||
|
Project.Name = value;
|
||||||
|
NotifyPropertyChanged(nameof(Name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public string Author
|
||||||
|
{
|
||||||
|
get => Project.Author;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (Project.Author != value)
|
||||||
|
{
|
||||||
|
Project.Author = value;
|
||||||
|
NotifyPropertyChanged(nameof(Author));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public string Description
|
||||||
|
{
|
||||||
|
get => Project.Description;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (Project.Description != value)
|
||||||
|
{
|
||||||
|
Project.Description = value;
|
||||||
|
NotifyPropertyChanged(nameof(Description));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public TimetableTemplateViewModel TimetableTemplate { get; set; }
|
||||||
|
public ObservableCollection<ClassroomViewModel> Classrooms { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public ProjectViewModel(Project project)
|
||||||
|
{
|
||||||
|
_project = project;
|
||||||
|
|
||||||
|
TimetableTemplate = new TimetableTemplateViewModel(_project.TimetableTemplate);
|
||||||
|
|
||||||
|
Classrooms = new ObservableCollection<ClassroomViewModel>();
|
||||||
|
Classrooms.CollectionChanged += Classrooms_CollectionChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PRIVATE METHODS
|
||||||
|
|
||||||
|
private void Classrooms_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
IList<ClassroomViewModel>? added = e.NewItems as IList<ClassroomViewModel>;
|
||||||
|
IList<ClassroomViewModel>? removed = e.OldItems as IList<ClassroomViewModel>;
|
||||||
|
|
||||||
|
if (removed is not null)
|
||||||
|
{
|
||||||
|
foreach (ClassroomViewModel vm in removed)
|
||||||
|
{
|
||||||
|
_project.Classrooms.Remove(vm.Classroom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (added is not null)
|
||||||
|
{
|
||||||
|
foreach (ClassroomViewModel vm in added)
|
||||||
|
{
|
||||||
|
_project.Classrooms.Add(vm.Classroom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
63
TimetableDesigner/ViewModels/Models/TeacherViewModel.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels.Models
|
||||||
|
{
|
||||||
|
public class TeacherViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private Teacher _teacher;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public Teacher Teacher => _teacher;
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get => _teacher.Name;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_teacher.Name != value)
|
||||||
|
{
|
||||||
|
_teacher.Name = value;
|
||||||
|
NotifyPropertyChanged(nameof(Name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public string Description
|
||||||
|
{
|
||||||
|
get => _teacher.Description;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_teacher.Description != value)
|
||||||
|
{
|
||||||
|
_teacher.Description = value;
|
||||||
|
NotifyPropertyChanged(nameof(Description));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public TeacherViewModel(Teacher teacher)
|
||||||
|
{
|
||||||
|
_teacher = teacher;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels.Models
|
||||||
|
{
|
||||||
|
public class TimetableTemplateViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private TimetableTemplate _timetableTemplate;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public TimetableTemplate TimetableTemplate => _timetableTemplate;
|
||||||
|
|
||||||
|
public ObservableCollection<TimetableDay> Days => new ObservableCollection<TimetableDay>(_timetableTemplate.Days);
|
||||||
|
public ObservableCollection<TimetableSlot> Slots => new ObservableCollection<TimetableSlot>(_timetableTemplate.Slots);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public TimetableTemplateViewModel(TimetableTemplate timetableTemplate)
|
||||||
|
{
|
||||||
|
_timetableTemplate = timetableTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
public void AddDay(TimetableDay day)
|
||||||
|
{
|
||||||
|
_timetableTemplate.AddDay(day);
|
||||||
|
NotifyPropertyChanged(nameof(Days));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveDay(TimetableDay day)
|
||||||
|
{
|
||||||
|
_timetableTemplate.RemoveDay(day);
|
||||||
|
NotifyPropertyChanged(nameof(Days));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddSlot(TimetableSlot slot)
|
||||||
|
{
|
||||||
|
_timetableTemplate.AddSlot(slot);
|
||||||
|
NotifyPropertyChanged(nameof(Slots));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveSlot(TimetableSlot slot)
|
||||||
|
{
|
||||||
|
_timetableTemplate.RemoveSlot(slot);
|
||||||
|
NotifyPropertyChanged(nameof(Slots));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
140
TimetableDesigner/ViewModels/ProjectSettingsTabViewModel.cs
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using TimetableDesigner.Commands;
|
||||||
|
using TimetableDesigner.Core;
|
||||||
|
using TimetableDesigner.MessageBox;
|
||||||
|
using TimetableDesigner.Properties;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
using TimetableDesigner.ViewModels.Models;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels
|
||||||
|
{
|
||||||
|
public class ProjectSettingsTabViewModel : BaseTabViewModel
|
||||||
|
{
|
||||||
|
#region FIELDS
|
||||||
|
|
||||||
|
private string _newDayName;
|
||||||
|
private DateTime? _newSlotFrom;
|
||||||
|
private DateTime? _newSlotTo;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PROPERTIES
|
||||||
|
|
||||||
|
public ICommand AddDayCommand { get; set; }
|
||||||
|
public ICommand AddSlotCommand { get; set; }
|
||||||
|
public ICommand RemoveDayCommand { get; set; }
|
||||||
|
public ICommand RemoveSlotCommand { get; set; }
|
||||||
|
|
||||||
|
public ProjectViewModel? Project { get; set; }
|
||||||
|
|
||||||
|
public string NewDayName
|
||||||
|
{
|
||||||
|
get => _newDayName;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_newDayName = value;
|
||||||
|
NotifyPropertyChanged(nameof(NewDayName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime? NewSlotFrom
|
||||||
|
{
|
||||||
|
get => _newSlotFrom;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_newSlotFrom = value;
|
||||||
|
NotifyPropertyChanged(nameof(NewSlotFrom));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public DateTime? NewSlotTo
|
||||||
|
{
|
||||||
|
get => _newSlotTo;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_newSlotTo = value;
|
||||||
|
NotifyPropertyChanged(nameof(NewSlotTo));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public ProjectSettingsTabViewModel()
|
||||||
|
{
|
||||||
|
Project = new ProjectViewModel(new Project());
|
||||||
|
|
||||||
|
AddDayCommand = new RelayCommand<object>(param => AddDay());
|
||||||
|
AddSlotCommand = new RelayCommand<object>(param => AddSlot());
|
||||||
|
RemoveDayCommand = new RelayCommand<TimetableDay>(RemoveDay);
|
||||||
|
RemoveSlotCommand = new RelayCommand<TimetableSlot>(RemoveSlot);
|
||||||
|
|
||||||
|
_newDayName = string.Empty;
|
||||||
|
_newSlotFrom = new DateTime(1, 1, 1, 8, 0, 0);
|
||||||
|
_newSlotTo = new DateTime(1, 1, 1, 9, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region PRIVATE METHODS
|
||||||
|
|
||||||
|
private void AddDay()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(NewDayName))
|
||||||
|
{
|
||||||
|
Project.TimetableTemplate.AddDay(new TimetableDay(NewDayName));
|
||||||
|
NewDayName = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveDay(TimetableDay day) => Project.TimetableTemplate.RemoveDay(day);
|
||||||
|
|
||||||
|
private void AddSlot()
|
||||||
|
{
|
||||||
|
if (NewSlotFrom.HasValue && NewSlotTo.HasValue)
|
||||||
|
{
|
||||||
|
TimeOnly from = new TimeOnly(NewSlotFrom.Value.Hour, NewSlotFrom.Value.Minute);
|
||||||
|
TimeOnly to = new TimeOnly(NewSlotTo.Value.Hour, NewSlotTo.Value.Minute);
|
||||||
|
if (from >= to)
|
||||||
|
{
|
||||||
|
MessageBoxService.ShowError(Resources.ProjectSettings_Message_FromHigherThanTo);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Project.TimetableTemplate.AddSlot(new TimetableSlot(from, to));
|
||||||
|
|
||||||
|
double delta = (to - from).TotalMinutes;
|
||||||
|
DateTime newFrom = NewSlotTo.Value;
|
||||||
|
DateTime newTo = NewSlotTo.Value.AddMinutes(delta);
|
||||||
|
NewSlotFrom = newFrom;
|
||||||
|
NewSlotTo = newTo;
|
||||||
|
}
|
||||||
|
catch (ArgumentException)
|
||||||
|
{
|
||||||
|
MessageBoxService.ShowError(Resources.ProjectSettings_Message_SlotCollision);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveSlot(TimetableSlot slot) => Project.TimetableTemplate.RemoveSlot(slot);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
13
TimetableDesigner/ViewModels/TeacherEditTabViewModel.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels
|
||||||
|
{
|
||||||
|
public class TeacherEditTabViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
19
TimetableDesigner/ViewModels/WelcomeTabViewModel.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TimetableDesigner.ViewModels.Base;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.ViewModels
|
||||||
|
{
|
||||||
|
public class WelcomeTabViewModel : BaseTabViewModel
|
||||||
|
{
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public WelcomeTabViewModel()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
35
TimetableDesigner/Views/ClassroomEditTabView.xaml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<UserControl x:Class="TimetableDesigner.Views.ClassroomEditTabView"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:p = "clr-namespace:TimetableDesigner.Properties"
|
||||||
|
xmlns:vm="clr-namespace:TimetableDesigner.ViewModels"
|
||||||
|
xmlns:local="clr-namespace:TimetableDesigner.Views"
|
||||||
|
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
d:DesignHeight="450" d:DesignWidth="800">
|
||||||
|
<UserControl.DataContext>
|
||||||
|
<vm:ClassroomEditTabViewModel/>
|
||||||
|
</UserControl.DataContext>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Label Grid.Column="0" Grid.Row="0" Content="{x:Static p:Resources.ClassroomEdit_Name}"/>
|
||||||
|
<TextBox Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" Margin="5" Text="{Binding Classroom.Name}" MaxLines="1"/>
|
||||||
|
<Label Grid.Column="0" Grid.Row="1" Content="{x:Static p:Resources.ClassroomEdit_Description}"/>
|
||||||
|
<TextBox Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1" Margin="5" MinLines="3" Text="{Binding Classroom.Description}"/>
|
||||||
|
<Label Grid.Column="0" Grid.Row="2" Content="{x:Static p:Resources.ClassroomEdit_Capacity}"/>
|
||||||
|
<xctk:IntegerUpDown Grid.Column="1" Grid.Row="2" Margin="5" Minimum="1" IsEnabled="{Binding Classroom.IsCapacityLimited}" Value="{Binding Classroom.Capacity}"/>
|
||||||
|
<CheckBox Grid.Column="2" Grid.Row="2" Margin="5" Content="{x:Static p:Resources.ClassroomEdit_CapacityIsLimited}" IsChecked="{Binding Classroom.IsCapacityLimited}" VerticalAlignment="Center"/>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
28
TimetableDesigner/Views/ClassroomEditTabView.xaml.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Views
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for ClassroomEditTabView.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class ClassroomEditTabView : UserControl
|
||||||
|
{
|
||||||
|
public ClassroomEditTabView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
131
TimetableDesigner/Views/MainWindow.xaml
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
<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"
|
||||||
|
xmlns:vmm="clr-namespace:TimetableDesigner.ViewModels.Models"
|
||||||
|
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="Project.Name" FallbackValue="{x:Static p:Resources.Global_NoProjectLoadedTitle}"/>
|
||||||
|
</MultiBinding>
|
||||||
|
</rib:RibbonWindow.Title>
|
||||||
|
<rib:RibbonWindow.DataContext>
|
||||||
|
<vm:MainViewModel/>
|
||||||
|
</rib:RibbonWindow.DataContext>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition/>
|
||||||
|
</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_NewOpen}">
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_NewOpen_New}" Icon="{StaticResource NewImage}" Command="{Binding NewProjectCommand}"/>
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_NewOpen_Open}" Icon="{StaticResource OpenImage}" Command="{Binding OpenProjectCommand}"/>
|
||||||
|
<rib:DropDownButton Header="{x:Static p:Resources.Main_Ribbon_File_NewOpen_OpenRecent}" Icon="{StaticResource OpenRecentImage}"/>
|
||||||
|
</rib:RibbonGroupBox>
|
||||||
|
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_File_Save}" IsEnabled="{Binding Project, Converter={StaticResource IsNotNullToBooleanConverter}}">
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_Save}" Icon="{StaticResource SaveImage}"/>
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_SaveAs}" Icon="{StaticResource SaveAsImage}"/>
|
||||||
|
</rib:RibbonGroupBox>
|
||||||
|
</rib:RibbonTabItem>
|
||||||
|
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Project}" IsEnabled="{Binding Project, 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}"/>
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewGroup}"/>
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewSubgroup}"/>
|
||||||
|
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewClass}"/>
|
||||||
|
</rib:RibbonGroupBox>
|
||||||
|
</rib:RibbonTabItem>
|
||||||
|
</rib:Ribbon>
|
||||||
|
<TreeView Grid.Row="1" Grid.Column="0" DataContext="{Binding Project}" Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext.Project, 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.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TreeViewItem Header="{Binding Name}" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext}">
|
||||||
|
<TreeViewItem.InputBindings>
|
||||||
|
<MouseBinding Gesture="LeftDoubleClick"
|
||||||
|
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=rib:RibbonWindow}, Path=DataContext.EditClassroomCommand}"
|
||||||
|
CommandParameter="{Binding}"/>
|
||||||
|
</TreeViewItem.InputBindings>
|
||||||
|
<TreeViewItem.ContextMenu>
|
||||||
|
<ContextMenu>
|
||||||
|
<MenuItem Header="{x:Static p:Resources.Main_Treeview_ContextMenu_EditTimetable}"/>
|
||||||
|
<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>
|
||||||
|
</TreeViewItem.ContextMenu>
|
||||||
|
</TreeViewItem>
|
||||||
|
</DataTemplate>
|
||||||
|
</TreeViewItem.ItemTemplate>
|
||||||
|
</TreeViewItem>
|
||||||
|
</TreeViewItem>
|
||||||
|
</TreeView>
|
||||||
|
<GridSplitter Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Stretch" ShowsPreview="True" Width="2"/>
|
||||||
|
<TabControl Grid.Row="1" Grid.Column="2" ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}">
|
||||||
|
<TabControl.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Image Source="{Binding TabImage}"
|
||||||
|
Visibility="{Binding TabImage, Converter={StaticResource IsNullToVisibilityConverter}}"
|
||||||
|
Width="15"
|
||||||
|
Height="15"/>
|
||||||
|
<TextBlock Text="{Binding TabTitle}"/>
|
||||||
|
<Button BorderThickness="0"
|
||||||
|
Background="Transparent"
|
||||||
|
Margin="5,0,0,0"
|
||||||
|
Visibility="{Binding IsTabClosable, Converter={StaticResource boolToVisibilityConverter}}"
|
||||||
|
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=DataContext.CloseTabCommand}"
|
||||||
|
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}">
|
||||||
|
<Image Source="{StaticResource CloseImage}"
|
||||||
|
Width="15"
|
||||||
|
Height="15"/>
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</TabControl.ItemTemplate>
|
||||||
|
<TabControl.ContentTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ContentControl Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=DataContext.SelectedTab, UpdateSourceTrigger = PropertyChanged, Converter={StaticResource ViewModelToViewConverter}}"/>
|
||||||
|
</DataTemplate>
|
||||||
|
</TabControl.ContentTemplate>
|
||||||
|
</TabControl>
|
||||||
|
</Grid>
|
||||||
|
</rib:RibbonWindow>
|
||||||
26
TimetableDesigner/Views/MainWindow.xaml.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using Fluent;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Views
|
||||||
|
{
|
||||||
|
public partial class MainWindow : RibbonWindow
|
||||||
|
{
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
124
TimetableDesigner/Views/ProjectSettingsTabView.xaml
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
<UserControl x:Class="TimetableDesigner.Views.ProjectSettingsTabView"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:vm="clr-namespace:TimetableDesigner.ViewModels"
|
||||||
|
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
|
||||||
|
xmlns:p = "clr-namespace:TimetableDesigner.Properties"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
d:DesignHeight="450" d:DesignWidth="800">
|
||||||
|
<UserControl.DataContext>
|
||||||
|
<vm:ProjectSettingsTabViewModel/>
|
||||||
|
</UserControl.DataContext>
|
||||||
|
<ScrollViewer>
|
||||||
|
<StackPanel>
|
||||||
|
<GroupBox Header="{x:Static p:Resources.ProjectSettings_Basics}">
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition/>
|
||||||
|
<RowDefinition/>
|
||||||
|
<RowDefinition/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Label Grid.Row="0" Grid.Column="0" Content="{x:Static p:Resources.ProjectSettings_Name}"/>
|
||||||
|
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Project.Name}" VerticalAlignment="Center"/>
|
||||||
|
<Label Grid.Row="1" Grid.Column="0" Content="{x:Static p:Resources.ProjectSettings_Author}"/>
|
||||||
|
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Project.Author}" VerticalAlignment="Center"/>
|
||||||
|
<Label Grid.Row="2" Grid.Column="0" Content="{x:Static p:Resources.ProjectSettings_Description}"/>
|
||||||
|
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Project.Description}" VerticalAlignment="Center" MinLines="5"/>
|
||||||
|
</Grid>
|
||||||
|
</GroupBox>
|
||||||
|
<GroupBox Header="{x:Static p:Resources.ProjectSettings_TimetableModel}">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Label Content="{x:Static p:Resources.ProjectSettings_Days}"/>
|
||||||
|
<Border Grid.Row="1" Grid.Column="0" Margin="5" BorderThickness="1" BorderBrush="DarkGray">
|
||||||
|
<ItemsControl ItemsSource="{Binding Project.TimetableTemplate.Days}" HorizontalContentAlignment="Stretch" MinHeight="100">
|
||||||
|
<ItemsControl.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Grid HorizontalAlignment="Stretch" Margin="5">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Label Grid.Column="0" HorizontalAlignment="Stretch" Content="{Binding Name}"/>
|
||||||
|
<Button Grid.Column="1"
|
||||||
|
Width="26"
|
||||||
|
Height="26"
|
||||||
|
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=DataContext.RemoveDayCommand}"
|
||||||
|
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}">
|
||||||
|
<Image Source="{StaticResource RemoveImage}" Width="20" Height="20"/>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</Border>
|
||||||
|
<Grid Grid.Row="2" Grid.Column="0">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TextBox x:Name="AddDayTextBox" Grid.Column="0" Margin="5" Text="{Binding NewDayName}" MaxLines="1"/>
|
||||||
|
<Button Grid.Column="1" Margin="5" Command="{Binding AddDayCommand}" Width="26" Height="26">
|
||||||
|
<Image Source="{StaticResource AddImage}" Width="20" Height="20"/>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
<Label Grid.Row="0" Grid.Column="1" Content="{x:Static p:Resources.ProjectSettings_Hours}"/>
|
||||||
|
<Border Grid.Row="1" Grid.Column="1" Margin="5" BorderThickness="1" BorderBrush="DarkGray">
|
||||||
|
<ItemsControl ItemsSource="{Binding Project.TimetableTemplate.Slots}" HorizontalContentAlignment="Stretch" MinHeight="100">
|
||||||
|
<ItemsControl.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Grid HorizontalAlignment="Stretch" Margin="5">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<StackPanel Grid.Column="0" HorizontalAlignment="Stretch" Orientation="Horizontal">
|
||||||
|
<Label Content="{Binding From}"/>
|
||||||
|
<Label Content=" - "/>
|
||||||
|
<Label Content="{Binding To}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<Button Grid.Column="1"
|
||||||
|
Width="26"
|
||||||
|
Height="26"
|
||||||
|
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=DataContext.RemoveSlotCommand}"
|
||||||
|
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}">
|
||||||
|
<Image Source="{StaticResource RemoveImage}" Width="20" Height="20"/>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</Border>
|
||||||
|
<Grid Grid.Row="2" Grid.Column="1">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<xctk:DateTimeUpDown Grid.Column="0" Margin="5" Format="ShortTime" Value="{Binding NewSlotFrom}"/>
|
||||||
|
<Label Grid.Column="1" Margin="5" Content="-"/>
|
||||||
|
<xctk:DateTimeUpDown Grid.Column="2" Margin="5" Format="ShortTime" Value="{Binding NewSlotTo}"/>
|
||||||
|
<Button Grid.Column="3" Margin="5" Command="{Binding AddSlotCommand}" Width="26" Height="26">
|
||||||
|
<Image Source="{StaticResource AddImage}" Width="20" Height="20"/>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</GroupBox>
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
|
</UserControl>
|
||||||
25
TimetableDesigner/Views/ProjectSettingsTabView.xaml.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Views
|
||||||
|
{
|
||||||
|
public partial class ProjectSettingsTabView : UserControl
|
||||||
|
{
|
||||||
|
public ProjectSettingsTabView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
12
TimetableDesigner/Views/TeacherEditTabView.xaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<UserControl x:Class="TimetableDesigner.Views.TeacherEditTabView"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:TimetableDesigner.Views"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
d:DesignHeight="450" d:DesignWidth="800">
|
||||||
|
<Grid>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
28
TimetableDesigner/Views/TeacherEditTabView.xaml.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Views
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for TeacherEditTabView.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class TeacherEditTabView : UserControl
|
||||||
|
{
|
||||||
|
public TeacherEditTabView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
14
TimetableDesigner/Views/WelcomeTabView.xaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<UserControl x:Class="TimetableDesigner.Views.WelcomeTabView"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:vm="clr-namespace:TimetableDesigner.ViewModels"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<UserControl.DataContext>
|
||||||
|
<vm:WelcomeTabViewModel/>
|
||||||
|
</UserControl.DataContext>
|
||||||
|
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||||
|
<Label Content="Open or create new project to begin"/>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
||||||
28
TimetableDesigner/Views/WelcomeTabView.xaml.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace TimetableDesigner.Views
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for WelcomeTabView.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class WelcomeTabView : UserControl
|
||||||
|
{
|
||||||
|
public WelcomeTabView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||