@@ -74,6 +74,10 @@ public partial class ViewModelNodesCanvas
74
74
public Command < List < ( int index , ViewModelConnector element ) > , List < ( int index , ViewModelConnector element ) > > CommandDeleteSelectedConnectors { get ; set ; }
75
75
public Command < DeleteMode , DeleteMode > CommandDeleteSelectedElements { get ; set ; }
76
76
77
+
78
+ public Command < ( ViewModelNode node , string newName ) , ( ViewModelNode node , string oldName ) > CommandChangeNodeName { get ; set ; }
79
+ public Command < ( ViewModelConnector connector , string newName ) , ( ViewModelConnector connector , string oldName ) > CommandChangeConnectName { get ; set ; }
80
+
77
81
#endregion commands with undo-redo
78
82
79
83
private void SetupCommands ( )
@@ -130,8 +134,9 @@ private void SetupCommands()
130
134
CommandDeleteSelectedNodes = new Command < ElementsForDelete , ElementsForDelete > ( DeleteSelectedNodes , UnDeleteSelectedNodes , NotSaved ) ;
131
135
CommandDeleteSelectedConnectors = new Command < List < ( int index , ViewModelConnector element ) > , List < ( int index , ViewModelConnector connector ) > > ( DeleteSelectedConnectors , UnDeleteSelectedConnectors , NotSaved ) ;
132
136
CommandDeleteSelectedElements = new Command < DeleteMode , DeleteMode > ( DeleteSelectedElements , UnDeleteSelectedElements ) ;
137
+ CommandChangeNodeName = new Command < ( ViewModelNode node , string newName ) , ( ViewModelNode node , string oldName ) > ( ChangeNodeName , UnChangeNodeName ) ;
138
+ CommandChangeConnectName = new Command < ( ViewModelConnector connector , string newName ) , ( ViewModelConnector connector , string oldName ) > ( ChangeConnectName , UnChangeConnectName ) ;
133
139
134
-
135
140
136
141
NotSavedSubscrube ( ) ;
137
142
}
@@ -376,7 +381,10 @@ private void Save()
376
381
}
377
382
else
378
383
{
379
- Save ( SchemePath ) ;
384
+ WithValidateScheme ( ( ) =>
385
+ {
386
+ Save ( SchemePath ) ;
387
+ } ) ;
380
388
}
381
389
}
382
390
private void Exit ( )
@@ -387,14 +395,18 @@ private void Exit()
387
395
}
388
396
private void SaveAs ( )
389
397
{
390
- Dialog . ShowSaveFileDialog ( "XML-File | *.xml" , SchemeName ( ) , "Save scheme as..." ) ;
391
- if ( Dialog . Result != DialogResult . Ok )
392
- return ;
398
+ WithValidateScheme ( ( ) =>
399
+ {
400
+ Dialog . ShowSaveFileDialog ( "XML-File | *.xml" , SchemeName ( ) , "Save scheme as..." ) ;
401
+ if ( Dialog . Result != DialogResult . Ok )
402
+ return ;
393
403
394
- Save ( Dialog . FileName ) ;
404
+ Save ( Dialog . FileName ) ;
405
+ } ) ;
395
406
}
396
407
private void Save ( string fileName )
397
408
{
409
+
398
410
Mouse . OverrideCursor = Cursors . Wait ;
399
411
XDocument xDocument = new XDocument ( ) ;
400
412
XElement stateMachineXElement = new XElement ( "StateMachine" ) ;
@@ -424,7 +436,29 @@ private void Save(string fileName)
424
436
Mouse . OverrideCursor = null ;
425
437
LogDebug ( "Scheme was saved as \" {0}\" " , SchemePath ) ;
426
438
}
439
+ private void WithValidateScheme ( Action action )
440
+ {
441
+ var unReachable = ValidateScheme ( ) ;
442
+ if ( unReachable . Count < 1 )
443
+ {
444
+ action . Invoke ( ) ;
445
+ }
446
+ else
447
+ {
448
+ LogError ( "Nodes without connects: {0}" , string . Join ( ',' , unReachable ) ) ;
449
+ }
450
+ }
451
+ private List < string > ValidateScheme ( )
452
+ {
453
+ Dictionary < string , bool > forValidate = Nodes . Where ( x=> x != StartState ) . ToDictionary ( x => x . Name , x=> false ) ;
427
454
455
+ foreach ( var connect in Connects )
456
+ {
457
+ forValidate [ connect . ToConnector . Node . Name ] = true ;
458
+ }
459
+
460
+ return forValidate . Where ( x => ! x . Value ) . Select ( x=> x . Key ) . ToList ( ) ;
461
+ }
428
462
429
463
private void StartSelect ( Point point )
430
464
{
@@ -481,8 +515,8 @@ private void ValidateNodeName((ViewModelNode objectForValidate, string newValue)
481
515
if ( ! NodesExist ( obj . newValue ) )
482
516
{
483
517
LogDebug ( "Node \" {0}\" has been renamed . New name is \" {1}\" " , obj . objectForValidate . Name , obj . newValue ) ;
484
- obj . objectForValidate . Name = obj . newValue ;
485
-
518
+
519
+ CommandChangeNodeName . Execute ( ( obj . objectForValidate , obj . newValue ) ) ;
486
520
}
487
521
else
488
522
{
@@ -501,7 +535,8 @@ private void ValidateConnectName((ViewModelConnector objectForValidate, string n
501
535
if ( ! ConnectsExist ( obj . newValue ) )
502
536
{
503
537
LogDebug ( "Transition \" {0}\" has been renamed . New name is \" {1}\" " , obj . objectForValidate . Name , obj . newValue ) ;
504
- obj . objectForValidate . Name = obj . newValue ;
538
+
539
+ CommandChangeConnectName . Execute ( ( obj . objectForValidate , obj . newValue ) ) ;
505
540
}
506
541
else
507
542
{
@@ -674,6 +709,30 @@ private DeleteMode UnDeleteSelectedElements(DeleteMode parameter, DeleteMode res
674
709
675
710
return result ;
676
711
}
712
+ private ( ViewModelConnector connector , string oldName ) ChangeConnectName ( ( ViewModelConnector connector , string newName ) parameter , ( ViewModelConnector connector , string oldName ) result )
713
+ {
714
+ string oldName = parameter . connector . Name ;
715
+ parameter . connector . Name = parameter . newName ;
716
+ return ( parameter . connector , oldName ) ;
717
+ }
718
+ private ( ViewModelConnector connector , string oldName ) UnChangeConnectName ( ( ViewModelConnector connector , string newName ) parameter , ( ViewModelConnector connector , string oldName ) result )
719
+ {
720
+ result . connector . Name = result . oldName ;
721
+ return result ;
722
+ }
723
+
724
+
725
+ private ( ViewModelNode node , string oldName ) ChangeNodeName ( ( ViewModelNode node , string newName ) parameter , ( ViewModelNode node , string oldName ) result )
726
+ {
727
+ string oldName = parameter . node . Name ;
728
+ parameter . node . Name = parameter . newName ;
729
+ return ( parameter . node , oldName ) ;
730
+ }
731
+ private ( ViewModelNode node , string oldName ) UnChangeNodeName ( ( ViewModelNode node , string newName ) parameter , ( ViewModelNode node , string oldName ) result )
732
+ {
733
+ result . node . Name = result . oldName ;
734
+ return result ;
735
+ }
677
736
private ElementsForDelete DeleteSelectedNodes ( ElementsForDelete parameter , ElementsForDelete result )
678
737
{
679
738
if ( result == null )
0 commit comments