behavioursc_canvas.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  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. __canvasBehaviourStatechart = {
  6. '__STATE_IDLE' : 0,
  7. '__STATE_CANVAS_SELECTING' : 1,
  8. '__STATE_SOMETHING_SELECTED' : 2,
  9. '__STATE_DRAGGING_SELECTION' : 3,
  10. '__STATE_DRAWING_EDGE' : 4,
  11. '__STATE_EDITING_CONNECTION_PATHS' : 5,
  12. '__STATE_DRAGGING_CONNECTION_PATH_CTRL_POINT': 6,
  13. '__currentState' : undefined,
  14. '__entryActions':{
  15. 1:
  16. function(event)
  17. {
  18. GUIUtils.disableDock();
  19. __initCanvasSelectionOverlay(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  20. },
  21. 3:
  22. function(event)
  23. {
  24. GUIUtils.disableDock();
  25. GeometryUtils.initSelectionTransformationPreviewOverlay(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  26. },
  27. 4:
  28. function(event)
  29. {
  30. GUIUtils.disableDock();
  31. ConnectionUtils.initConnectionPath(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event),event.target);
  32. },
  33. 6:
  34. function(event)
  35. {
  36. GUIUtils.disableDock();
  37. }
  38. },
  39. '__exitActions' :{
  40. 1:
  41. function(event)
  42. {
  43. GUIUtils.enableDock();
  44. },
  45. 3:
  46. function(event)
  47. {
  48. GUIUtils.enableDock();
  49. },
  50. 4:
  51. function(event)
  52. {
  53. GUIUtils.enableDock();
  54. },
  55. 6:
  56. function(event)
  57. {
  58. GUIUtils.enableDock();
  59. }
  60. },
  61. /* transition to specified state */
  62. '__T' :
  63. function(s,event)
  64. {
  65. if( this.__currentState in this.__exitActions )
  66. this.__exitActions[this.__currentState](event);
  67. this.__currentState = s;
  68. if( s in this.__entryActions )
  69. this.__entryActions[s](event);
  70. },
  71. /* initialise the statechart */
  72. 'init':
  73. function()
  74. {
  75. this.__currentState = this.__STATE_IDLE;
  76. },
  77. /* handle an event... only discarded events are allowed to propagate to parent
  78. HTML element
  79. name: internal name of the event
  80. event: the javascript event */
  81. 'handleUserEvent':
  82. function(name,event)
  83. {
  84. if( this.__currentState == this.__STATE_IDLE )
  85. {
  86. if( name == __EVENT_RIGHT_RELEASE_CANVAS )
  87. DataUtils.create(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  88. else if( name == __EVENT_LEFT_PRESS_CANVAS )
  89. this.__T(this.__STATE_CANVAS_SELECTING,event);
  90. else if( name == __EVENT_MIDDLE_RELEASE_ICON )
  91. {
  92. __select( event.target );
  93. WindowManagement.openDialog(_ENTITY_EDITOR);
  94. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  95. }
  96. else if( name == __EVENT_SHIFT_MIDDLE_RELEASE_ICON )
  97. WindowManagement.openDialog(__SVG_TEXT_EDITOR, event.target);
  98. else if( name == __EVENT_LEFT_RELEASE_ICON )
  99. {
  100. __select( event.target );
  101. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  102. }
  103. else if( name == __EVENT_SHIFT_LEFT_RELEASE_ICON )
  104. {
  105. __select( event.target, true );
  106. WindowManagement.openDialog(_ENTITY_EDITOR);
  107. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  108. }
  109. else if( name == __EVENT_CODED_SELECTION )
  110. {
  111. __select(event);
  112. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  113. }
  114. else if( name == __EVENT_RIGHT_PRESS_ICON )
  115. this.__T(this.__STATE_DRAWING_EDGE,event);
  116. else if( name == __EVENT_SHIFT_WHEEL_ICON )
  117. {
  118. if( event.wheelDelta > 0 )
  119. __iconToFront(event.target);
  120. else
  121. __iconToBack(event.target);
  122. }
  123. else
  124. return;
  125. if( event && event.stopPropagation )
  126. {
  127. event.stopPropagation();
  128. event.preventDefault();
  129. }
  130. }
  131. else if( this.__currentState == this.__STATE_CANVAS_SELECTING )
  132. {
  133. if( name == __EVENT_MOUSE_MOVE ){
  134. __updateCanvasSelectionOverlay(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  135. }
  136. else if( name == __EVENT_LEFT_RELEASE_CANVAS ||
  137. name == __EVENT_LEFT_RELEASE_ICON )
  138. {
  139. if( ! __selectSelection() )
  140. this.__T(this.__STATE_IDLE,event);
  141. else
  142. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  143. }
  144. else
  145. return;
  146. if( event && event.stopPropagation )
  147. {
  148. event.stopPropagation();
  149. event.preventDefault();
  150. }
  151. }
  152. else if( this.__currentState == this.__STATE_SOMETHING_SELECTED )
  153. {
  154. if( name == __EVENT_KEYUP_DEL )
  155. {
  156. DataUtils.del();
  157. __select();
  158. this.__T(this.__STATE_IDLE,event);
  159. }
  160. else if( name == __EVENT_KEYUP_ESC ||
  161. name == __EVENT_LEFT_PRESS_CANVAS ||
  162. name == __EVENT_LEFT_PRESS_ICON ||
  163. name == __EVENT_CODED_CANVAS_EDIT ||
  164. name == __EVENT_MIDDLE_RELEASE_CANVAS ||
  165. name == __EVENT_MIDDLE_RELEASE_ICON ||
  166. name == __EVENT_SHIFT_MIDDLE_RELEASE_ICON ||
  167. name == __EVENT_RIGHT_RELEASE_CANVAS ||
  168. name == __EVENT_RIGHT_RELEASE_ICON )
  169. {
  170. __select();
  171. this.__T(this.__STATE_IDLE,event);
  172. }
  173. else if( name == __EVENT_LEFT_PRESS_SELECTION )
  174. {
  175. if( ! GeometryUtils.areTransformationsAllowed() )
  176. console.warn('the selection dragging mode can only be activated if '+
  177. 'all of the ends of selected edges are also selected, '+
  178. 'and if the geometry controls are inactive');
  179. else
  180. this.__T(this.__STATE_DRAGGING_SELECTION,event);
  181. }
  182. else if( name == __EVENT_KEYUP_CTRL )
  183. {
  184. if( ! GeometryUtils.areTransformationsAllowed() )
  185. console.warn('the geometry controls can only be activated if all '+
  186. 'of the ends of selected edges are also selected, and'+
  187. 'if the geometry controls aren\'t already active');
  188. else
  189. GeometryUtils.showGeometryControlsOverlay();
  190. }
  191. else if( name == __EVENT_KEYUP_ALT )
  192. {
  193. GeometryUtils.hideGeometryControlsOverlay();
  194. GeometryUtils.hideTransformationPreviewOverlay();
  195. }
  196. else if( name == __EVENT_KEYUP_SHIFT &&
  197. __selectionContainsType(__EDGETYPE) )
  198. {
  199. ConnectionUtils.showConnectionPathEditingOverlay();
  200. __select();
  201. this.__T(this.__STATE_EDITING_CONNECTION_PATHS);
  202. }
  203. else if( name == __EVENT_KEYUP_INS ||
  204. name == __EVENT_KEYUP_COMMAND )
  205. {
  206. WindowManagement.openDialog(_ENTITY_EDITOR);
  207. }
  208. else if( name == __EVENT_CODED_SELECTION )
  209. {
  210. __select(event);
  211. }
  212. else if( name == __EVENT_KEYUP_TAB )
  213. {
  214. if( ! GeometryUtils.areTransformationsAllowed() )
  215. console.warn('selection snapping is only enabled if all of '+
  216. 'the ends of selected edges are also selected, '+
  217. 'and if the geometry controls are inactive');
  218. else
  219. GeometryUtils.snapSelectionToGrid();
  220. }
  221. else
  222. return;
  223. if( event && event.stopPropagation )
  224. {
  225. event.stopPropagation();
  226. event.preventDefault();
  227. }
  228. }
  229. else if( this.__currentState == this.__STATE_DRAGGING_SELECTION )
  230. {
  231. if( name == __EVENT_MOUSE_MOVE )
  232. GeometryUtils.previewSelectionTranslation(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  233. else if( name == __EVENT_KEYUP_ESC )
  234. {
  235. GeometryUtils.hideTransformationPreviewOverlay();
  236. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  237. }
  238. else if( name == __EVENT_LEFT_RELEASE_CANVAS ||
  239. name == __EVENT_LEFT_RELEASE_SELECTION )
  240. {
  241. GeometryUtils.transformSelection(__SELECTION_DRAG);
  242. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  243. }
  244. else if( name == __EVENT_LEFT_RELEASE_ICON )
  245. {
  246. DataUtils.getInsertConnectionType(
  247. event.target,
  248. undefined,
  249. function(connectionType)
  250. {
  251. if( connectionType )
  252. GeometryUtils.transformSelection(
  253. __SELECTION_DRAG,
  254. {'dropTarget':event.target,
  255. 'connectionType':connectionType});
  256. else
  257. {
  258. console.warn('no containment relationship was created');
  259. GeometryUtils.transformSelection(__SELECTION_DRAG);
  260. }
  261. });
  262. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  263. }
  264. else
  265. return;
  266. if( event && event.stopPropagation )
  267. {
  268. event.stopPropagation();
  269. event.preventDefault();
  270. }
  271. }
  272. else if( this.__currentState == this.__STATE_DRAWING_EDGE )
  273. {
  274. if( name == __EVENT_MOUSE_MOVE ){
  275. ConnectionUtils.updateConnectionSegment(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  276. }
  277. else if( name == __EVENT_KEYUP_ESC ||
  278. name == __EVENT_RIGHT_RELEASE_CANVAS )
  279. {
  280. ConnectionUtils.hideConnectionPath();
  281. this.__T(this.__STATE_IDLE,event);
  282. }
  283. else if( name == __EVENT_LEFT_RELEASE_CANVAS ||
  284. name == __EVENT_LEFT_RELEASE_ICON ||
  285. name == __EVENT_KEYUP_CTRL )
  286. ConnectionUtils.addConnectionSegment();
  287. else if( name == __EVENT_MIDDLE_RELEASE_CANVAS ||
  288. name == __EVENT_MIDDLE_RELEASE_ICON ||
  289. name == __EVENT_KEYUP_ALT )
  290. ConnectionUtils.deleteConnectionSegment();
  291. else if( name == __EVENT_KEYUP_TAB )
  292. ConnectionUtils.snapConnectionSegment();
  293. else if( name == __EVENT_RIGHT_RELEASE_ICON )
  294. {
  295. if( ConnectionUtils.getConnectionPath().getTotalLength() <= 5 )
  296. console.warn('to avoid accidental path creations, paths must '+
  297. 'measure at least 5px');
  298. else
  299. DataUtils.connect(event.target);
  300. this.__T(this.__STATE_IDLE,event);
  301. }
  302. else
  303. return;
  304. if( event && event.stopPropagation )
  305. {
  306. event.stopPropagation();
  307. event.preventDefault();
  308. }
  309. }
  310. else if( this.__currentState == this.__STATE_EDITING_CONNECTION_PATHS )
  311. {
  312. if( name == __EVENT_KEYUP_ESC ||
  313. name == __EVENT_LEFT_RELEASE_CANVAS ||
  314. name == __EVENT_LEFT_RELEASE_ICON ||
  315. name == __EVENT_CODED_CANVAS_EDIT )
  316. {
  317. ConnectionUtils.hideConnectionPathEditingOverlay();
  318. this.__T(this.__STATE_IDLE,event);
  319. }
  320. else if( name == __EVENT_LEFT_PRESS_CTRL_POINT )
  321. {
  322. ConnectionUtils.initControlPointTranslation(event.target);
  323. this.__T(this.__STATE_DRAGGING_CONNECTION_PATH_CTRL_POINT,event);
  324. }
  325. else if( name == __EVENT_MIDDLE_RELEASE_CTRL_POINT )
  326. ConnectionUtils.deleteControlPoint(event.target);
  327. else if( name == __EVENT_RIGHT_RELEASE_CTRL_POINT ) {
  328. ConnectionUtils.addControlPoint(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event), event.target);
  329. }
  330. else if( name == __EVENT_KEYUP_TAB )
  331. ConnectionUtils.snapControlPoint();
  332. else if( name == __EVENT_CODED_SELECTION )
  333. {
  334. ConnectionUtils.hideConnectionPathEditingOverlay();
  335. __select(event);
  336. this.__T(this.__STATE_SOMETHING_SELECTED,event);
  337. }
  338. else
  339. return;
  340. if( event && event.stopPropagation )
  341. {
  342. event.stopPropagation();
  343. event.preventDefault();
  344. }
  345. }
  346. else if( this.__currentState == this.__STATE_DRAGGING_CONNECTION_PATH_CTRL_POINT )
  347. {
  348. if( name == __EVENT_MOUSE_MOVE ) {
  349. ConnectionUtils.previewControlPointTranslation(GUIUtils.convertToCanvasX(event), GUIUtils.convertToCanvasY(event));
  350. }
  351. else if( name == __EVENT_LEFT_RELEASE_CTRL_POINT )
  352. {
  353. ConnectionUtils.updateConnectionPath();
  354. this.__T(this.__STATE_EDITING_CONNECTION_PATHS,event);
  355. }
  356. else
  357. return;
  358. if( event && event.stopPropagation )
  359. {
  360. event.stopPropagation();
  361. event.preventDefault();
  362. }
  363. }
  364. }
  365. };