@@ -74,6 +74,10 @@ public partial class ViewModelNodesCanvas
7474 public Command < List < ( int index , ViewModelConnector element ) > , List < ( int index , ViewModelConnector element ) > > CommandDeleteSelectedConnectors { get ; set ; }
7575 public Command < DeleteMode , DeleteMode > CommandDeleteSelectedElements { get ; set ; }
7676
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+
7781 #endregion commands with undo-redo
7882
7983 private void SetupCommands ( )
@@ -130,8 +134,9 @@ private void SetupCommands()
130134 CommandDeleteSelectedNodes = new Command < ElementsForDelete , ElementsForDelete > ( DeleteSelectedNodes , UnDeleteSelectedNodes , NotSaved ) ;
131135 CommandDeleteSelectedConnectors = new Command < List < ( int index , ViewModelConnector element ) > , List < ( int index , ViewModelConnector connector ) > > ( DeleteSelectedConnectors , UnDeleteSelectedConnectors , NotSaved ) ;
132136 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 ) ;
133139
134-
135140
136141 NotSavedSubscrube ( ) ;
137142 }
@@ -376,7 +381,10 @@ private void Save()
376381 }
377382 else
378383 {
379- Save ( SchemePath ) ;
384+ WithValidateScheme ( ( ) =>
385+ {
386+ Save ( SchemePath ) ;
387+ } ) ;
380388 }
381389 }
382390 private void Exit ( )
@@ -387,14 +395,18 @@ private void Exit()
387395 }
388396 private void SaveAs ( )
389397 {
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 ;
393403
394- Save ( Dialog . FileName ) ;
404+ Save ( Dialog . FileName ) ;
405+ } ) ;
395406 }
396407 private void Save ( string fileName )
397408 {
409+
398410 Mouse . OverrideCursor = Cursors . Wait ;
399411 XDocument xDocument = new XDocument ( ) ;
400412 XElement stateMachineXElement = new XElement ( "StateMachine" ) ;
@@ -424,7 +436,29 @@ private void Save(string fileName)
424436 Mouse . OverrideCursor = null ;
425437 LogDebug ( "Scheme was saved as \" {0}\" " , SchemePath ) ;
426438 }
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 ) ;
427454
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+ }
428462
429463 private void StartSelect ( Point point )
430464 {
@@ -481,8 +515,8 @@ private void ValidateNodeName((ViewModelNode objectForValidate, string newValue)
481515 if ( ! NodesExist ( obj . newValue ) )
482516 {
483517 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 ) ) ;
486520 }
487521 else
488522 {
@@ -501,7 +535,8 @@ private void ValidateConnectName((ViewModelConnector objectForValidate, string n
501535 if ( ! ConnectsExist ( obj . newValue ) )
502536 {
503537 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 ) ) ;
505540 }
506541 else
507542 {
@@ -674,6 +709,30 @@ private DeleteMode UnDeleteSelectedElements(DeleteMode parameter, DeleteMode res
674709
675710 return result ;
676711 }
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+ }
677736 private ElementsForDelete DeleteSelectedNodes ( ElementsForDelete parameter , ElementsForDelete result )
678737 {
679738 if ( result == null )
0 commit comments