Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions AutomataConstructor/Properties/Langs/Lang.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions AutomataConstructor/Properties/Langs/Lang.resx
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,7 @@
<data name="saveTestsAs" xml:space="preserve">
<value>Save tests as...</value>
</data>
<data name="saveSelectedArea" xml:space="preserve">
<value>Save selected area</value>
</data>
</root>
3 changes: 3 additions & 0 deletions AutomataConstructor/Properties/Langs/Lang.ru.resx
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,7 @@
<data name="saveTestsAs" xml:space="preserve">
<value>Сохранить тесты как...</value>
</data>
<data name="saveSelectedArea" xml:space="preserve">
<value>Сохранить выбранную область</value>
</data>
</root>
2 changes: 2 additions & 0 deletions AutomataConstructor/View/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:MainWindow.SaveAutomatonAsCommand}" CanExecute="CanSaveAutomatonAsCommandExecute" Executed="OnSaveAutomatonAsCommandExecuted" />
<CommandBinding Command="{x:Static local:MainWindow.SaveAutomatonCommand}" CanExecute="CanSaveAutomatonCommandExecute" Executed="OnSaveAutomatonCommandExecuted" />
<CommandBinding Command="{x:Static local:MainWindow.SaveSelectedAreaCommand}" CanExecute="CanSaveSelectedAreaCommandExecute" Executed="OnSaveSelectedAreaCommandExecute" />
<CommandBinding Command="{x:Static local:MainWindow.OpenAutomatonCommand}" CanExecute="CanOpenAutomatonCommandExecute" Executed="OnOpenAutomatonCommandExecuted" />
<CommandBinding Command="{x:Static local:MainWindow.SaveTestsAsCommand}" CanExecute="CanSaveTestsAsCommandExecute" Executed="OnSaveTestsAsCommandExecuted" />
<CommandBinding Command="{x:Static local:MainWindow.OpenTestsCommand}" CanExecute="CanOpenTestsCommandExecute" Executed="OnOpenTestsCommandExecuted" />
Expand Down Expand Up @@ -46,6 +47,7 @@
<MenuItem Header="{x:Static language:Lang.file}">
<MenuItem Header="{x:Static language:Lang.saveAutomatAs}" Command="{x:Static local:MainWindow.SaveAutomatonAsCommand}" InputGestureText="Ctrl+Shift+S" />
<MenuItem Header="{x:Static language:Lang.saveAutomat}" Command="{x:Static local:MainWindow.SaveAutomatonCommand}" InputGestureText="Ctrl+S" />
<MenuItem Header="{x:Static language:Lang.saveSelectedArea}" Command="{x:Static local:MainWindow.SaveSelectedAreaCommand}" />
<MenuItem Header="{x:Static language:Lang.openAutomat}" Command="{x:Static local:MainWindow.OpenAutomatonCommand}" InputGestureText="Ctrl+O" />
<MenuItem Header="{x:Static language:Lang.saveTestsAs}" Command="{x:Static local:MainWindow.SaveTestsAsCommand}" />
<MenuItem Header="{x:Static language:Lang.openTests}" Command="{x:Static local:MainWindow.OpenTestsCommand}" />
Expand Down
18 changes: 18 additions & 0 deletions AutomataConstructor/View/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,24 @@ private void CanSaveAutomatonCommandExecute(object sender, CanExecuteRoutedEvent
=> e.CanExecute = savePath != null && File.Exists(savePath) && scene != null && scene.CanSave();

#endregion SaveAutomatonCommand

#region SaveSelectedAreaCommand

public static RoutedCommand SaveSelectedAreaCommand { get; set; } = new RoutedCommand("SaveSelectedArea", typeof(MainWindow));

private void OnSaveSelectedAreaCommandExecute(object sender, ExecutedRoutedEventArgs e)
{
var dialog = new SaveFileDialog { Filter = "All files|*.xml", Title = Lang.Saves_SelectAutomatonFileName, FileName = "automaton.xml" };
if (dialog.ShowDialog() == true)
{
scene.SaveSelectedArea(dialog.FileName);
}
}

private void CanSaveSelectedAreaCommandExecute(object sender, CanExecuteRoutedEventArgs e)
=> e.CanExecute = savePath != null && scene.CanSelectedAreaBeSaved();

#endregion SaveSelectedAreaCommand

#region OpenAutomatonCommand

Expand Down
92 changes: 92 additions & 0 deletions ControlsLibrary.Tests/SceneSaveSelectedAreaTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using System.Linq;
using System.Threading;
using ControlsLibrary.Controls.ErrorReporter;
using ControlsLibrary.Controls.Scene;
using ControlsLibrary.ViewModel;
using NUnit.Framework;

namespace ControlsLibrary.Tests.Files
{
public class SceneSaveSelectedAreaTests
{
[Test]
public void SceneSaveSelectedAreaTest()
{
var newWindowThread = new Thread(new ThreadStart(() =>
{
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
var scene = new Scene();
var help = new ErrorReporterViewModel();
scene.ErrorReporter = help;
const string path = "../../../Files/NotEmptyScene.xml";
var state1 = new NodeViewModel { Name = "S1", IsInitial = true };
var state2 = new NodeViewModel { Name = "S2", IsFinal = true };
var state3 = new NodeViewModel { Name = "S3"};
var state4 = new NodeViewModel { Name = "S4"};
var state5 = new NodeViewModel { Name = "S5"};
help.Graph.AddVertex(state1);
help.Graph.AddVertex(state2);
help.Graph.AddVertex(state3);
help.Graph.AddVertex(state4);
help.Graph.AddVertex(state5);
var transition1 = new EdgeViewModel(state1, state2) { IsEpsilon = true, TransitionTokensString = "1" };
var transition2 = new EdgeViewModel(state1, state1) { TransitionTokensString = "0" };
var transition3 = new EdgeViewModel(state2, state3) { TransitionTokensString = "23" };
var transition4 = new EdgeViewModel(state3, state4) { TransitionTokensString = "34" };
var transition5 = new EdgeViewModel(state4, state2) { TransitionTokensString = "42" };
var transition6 = new EdgeViewModel(state5, state1) { TransitionTokensString = "51" };
var transition7 = new EdgeViewModel(state2, state5) { TransitionTokensString = "25" };
help.Graph.AddEdge(transition1);
help.Graph.AddEdge(transition2);
help.Graph.AddEdge(transition3);
help.Graph.AddEdge(transition4);
help.Graph.AddEdge(transition5);
help.Graph.AddEdge(transition6);
help.Graph.AddEdge(transition7);
scene.SetVertexSelected(scene.GetVertexControl(state1), true);
scene.SetVertexSelected(scene.GetVertexControl(state2), true);
scene.SetVertexSelected(scene.GetVertexControl(state5), true);
scene.SaveSelectedArea(path);
FreeHelp(help);
scene.Open(path);
Assert.True(help.Graph.VertexCount == 3 && help.Graph.EdgeCount == 4);
Assert.True(help.Graph.Vertices.FirstOrDefault(v => v.Name == "S1").IsInitial);
Assert.True(help.Graph.Vertices.FirstOrDefault(v => v.Name == "S2").IsFinal);
Assert.False(help.Graph.Vertices.Any(v => v.Name == "S3"));
Assert.False(help.Graph.Vertices.Any(v => v.Name == "S4"));
Assert.False(help.Graph.Vertices.Any(v => v.Name == "S5"));
Assert.True(help.Graph.Edges.FirstOrDefault(v => v.TransitionTokensString == "1").IsEpsilon);
Assert.True(help.Graph.Edges.Any(v => v.TransitionTokensString == "0"));
Assert.True(help.Graph.Edges.Any(v => v.TransitionTokensString == "51"));
Assert.True(help.Graph.Edges.Any(v => v.TransitionTokensString == "25"));
Assert.False(help.Graph.Edges.Any(v => v.TransitionTokensString == "23"));
Assert.False(help.Graph.Edges.Any(v => v.TransitionTokensString == "34"));
Assert.False(help.Graph.Edges.Any(v => v.TransitionTokensString == "42"));
// start the Dispatcher processing
System.Windows.Threading.Dispatcher.Run();
}));

// set the apartment state
newWindowThread.SetApartmentState(ApartmentState.STA);

// make the thread a background thread
newWindowThread.IsBackground = true;

// start the thread
newWindowThread.Start();
}

private void FreeHelp(ErrorReporterViewModel help)
{
foreach (var vertex in help.Graph.Vertices)
{
help.Graph.RemoveVertex(vertex);
}

foreach (var edge in help.Graph.Edges)
{
help.Graph.RemoveEdge(edge);
}
}
}
}
29 changes: 29 additions & 0 deletions ControlsLibrary/Controls/Scene/AdornerSelectedArea.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

namespace ControlsLibrary.Controls.Scene
{
public class AdornerSelectedArea : Adorner
{
private SolidColorBrush renderBrush;
private Pen renderPen;
public AdornerSelectedArea(UIElement adornedElement)
: base(adornedElement)
{
SelectedRect = new Rect(new Size(0, 0));
renderBrush = new SolidColorBrush(Colors.Blue);
renderBrush.Opacity = 0.2;
renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
}

public Rect SelectedRect { get; set; }

protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawRectangle(renderBrush, renderPen, SelectedRect);
}
}
}

16 changes: 16 additions & 0 deletions ControlsLibrary/Controls/Scene/CustomEdgeControl.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using GraphX.Controls;
using System;

namespace ControlsLibrary.Controls.Scene
{
class CustomEdgeControl: EdgeControl
{
//standart constructor is to be override?
public CustomEdgeControl(VertexControl source, VertexControl target, object edge, bool showArrows = true)
:base(source, target, edge, showArrows)
{

}
public bool IsSelected { get; set; }
}
}
15 changes: 15 additions & 0 deletions ControlsLibrary/Controls/Scene/CustomVertexControl.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using GraphX.Controls;
using System;

namespace ControlsLibrary.Controls.Scene
{
public class CustomVertexControl: VertexControl
{
public CustomVertexControl(object vertexData, bool tracePositionChange = true, bool bindToDataObject = true)
: base(vertexData, tracePositionChange, bindToDataObject)
{

}
public bool IsSelected { get; set; }
}
}
Loading