behavioursc_inputbar.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /* This file is part of AToMPM - A Tool for Multi-Paradigm Modelling
  2. * Copyright 2011 by the AToMPM team and licensed under the LGPL
  3. * See COPYING.lesser and README.md in the root of this project for full details
  4. */
  5. /**
  6. * This object defines my DummyStateChart formalism. It has
  7. * State and Transition methods.
  8. */
  9. var DummyStateChart = function(){
  10. var states = new Array();
  11. var transitions = new Array();
  12. var currentState = null;
  13. this.State = function(name){
  14. var out = new Array();
  15. this.addTransition = function( transition ){
  16. out.push( transition );
  17. };
  18. this.fire = function( trigger ){
  19. for(var i=0; i<out.length; i++){
  20. if( out[i].isTrigger( trigger ) ){
  21. return out[i];
  22. }
  23. }
  24. return false;
  25. };
  26. this.onEntry = function(){
  27. //console.debug("OnEntry: " + name);
  28. };
  29. this.onExit = function(){
  30. //console.debug("OnExit: " + name);
  31. };
  32. return this;
  33. };
  34. this.Transition = function(trigger, from, to){
  35. this.fire = function(){
  36. return to;
  37. };
  38. this.getTrigger = function(){
  39. return trigger;
  40. };
  41. this.isTrigger = function( input ){
  42. return input == trigger;
  43. };
  44. from.addTransition( this );
  45. return this;
  46. };
  47. this.addState = function( state ){
  48. states.push( state );
  49. };
  50. this.addTransition = function( transition ){
  51. transitions.push( transition );
  52. };
  53. this.fireEvent = function( event ){
  54. var transition = currentState.fire( event );
  55. if( transition ){
  56. // Fire the on exit event
  57. currentState.onExit();
  58. // Move to the new state and
  59. // fire the entry event
  60. currentState = transition.fire( event );
  61. currentState.onEntry();
  62. }
  63. };
  64. this.getCurrentState = function(){
  65. return currentState;
  66. };
  67. this.setInitialState = function( index ){
  68. currentState = states[index];
  69. currentState.onEntry();
  70. };
  71. return this;
  72. };
  73. var DummyBNF = function(){
  74. };
  75. InputBarStateChart = function(){
  76. var sc = new DummyStateChart();
  77. var storage = null;
  78. var triggers = new Array(
  79. "inputEntered",
  80. "validInput",
  81. "invalidInput",
  82. "errorDisplayed",
  83. "noCommandFound",
  84. "commandFound",
  85. "executedCommand");
  86. ////////////////////////////////////////
  87. // STATES
  88. ////////////////////////////////////////
  89. var STATE_WAIT = new sc.State( "Wait" );
  90. var STATE_PROCESS_INPUT = new sc.State( "ProcessInput" );
  91. var STATE_SHOW_ERROR = new sc.State( "ShowError" );
  92. var STATE_MATCH_COMMAND = new sc.State( "MatchCommand" );
  93. var STATE_EXECUTE_COMMAND = new sc.State( "ExecuteCommand" );
  94. STATE_PROCESS_INPUT.onEntry = function(){
  95. // split on any amount of whitespace
  96. storage = $('#mainInput').value.split(/[ ]+/);
  97. $('#mainInput').className.replace("error", "");
  98. // always return valid, since we don't yet have
  99. // a BNF to define what is good/bad input
  100. return sc.fireEvent( triggers[1] );
  101. };
  102. STATE_SHOW_ERROR.onEntry = function(){
  103. $('#mainInput').className += " error";
  104. return sc.fireEvent( triggers[3] );
  105. };
  106. STATE_MATCH_COMMAND.onEntry = function(){
  107. // No BNF, no command matching
  108. return sc.fireEvent( triggers[5] );
  109. };
  110. STATE_EXECUTE_COMMAND.onEntry = function(){
  111. // Stop gap measure until the BNF is implemented
  112. eval( $('#mainInput').value );
  113. $('#mainInput').value = "";
  114. return sc.fireEvent( triggers[6] );
  115. };
  116. ////////////////////////////////////////
  117. // TRANSITIONS
  118. ////////////////////////////////////////
  119. var TRANS_INPUT_ENTERED = new sc.Transition( triggers[0], STATE_WAIT, STATE_PROCESS_INPUT);
  120. var TRANS_VALID_INPUT = new sc.Transition( triggers[1], STATE_PROCESS_INPUT, STATE_MATCH_COMMAND);
  121. var TRANS_INVALID_INPUT = new sc.Transition( triggers[2], STATE_PROCESS_INPUT, STATE_SHOW_ERROR);
  122. var TRANS_ERROR_DISPLAYED = new sc.Transition( triggers[3], STATE_SHOW_ERROR, STATE_WAIT);
  123. var TRANS_NO_COMMAND_FOUND = new sc.Transition( triggers[4], STATE_PROCESS_INPUT, STATE_SHOW_ERROR);
  124. var TRANS_COMMAND_FOUND = new sc.Transition( triggers[5], STATE_MATCH_COMMAND, STATE_EXECUTE_COMMAND);
  125. var TRANS_EXECUTE_COMMAND = new sc.Transition( triggers[6], STATE_EXECUTE_COMMAND, STATE_WAIT);
  126. ////////////////////////////////////////
  127. // ADD ELEMENTS
  128. ////////////////////////////////////////
  129. sc.addState(STATE_WAIT);
  130. sc.addState(STATE_PROCESS_INPUT);
  131. sc.addState(STATE_SHOW_ERROR);
  132. sc.addState(STATE_MATCH_COMMAND);
  133. sc.addState(STATE_EXECUTE_COMMAND);
  134. sc.addTransition(TRANS_INPUT_ENTERED);
  135. sc.addTransition(TRANS_VALID_INPUT);
  136. sc.addTransition(TRANS_INVALID_INPUT);
  137. sc.addTransition(TRANS_ERROR_DISPLAYED);
  138. sc.addTransition(TRANS_NO_COMMAND_FOUND);
  139. sc.addTransition(TRANS_COMMAND_FOUND);
  140. sc.addTransition(TRANS_EXECUTE_COMMAND);
  141. sc.setInitialState(0);
  142. this.fireEvent = function( trigger ){
  143. sc.fireEvent( trigger );
  144. };
  145. return this;
  146. }();