ide.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. var editor = undefined;
  2. function startup()
  3. {
  4. var filesBox;
  5. editor = CodeMirror.fromTextArea("code", {
  6. parserfile: ["../contrib/python/js/parsepython.js"],
  7. path: "/ide/static/codemirror/js/",
  8. autoMatchParens: true,
  9. stylesheet: "/ide/static/codemirror/contrib/python/css/pythoncolors.css",
  10. lineNumbers: true,
  11. indentUnit: 4,
  12. height: "100%",
  13. saveFunction: function() { alert('saved'); },
  14. initCallback: function(e) {
  15. e.grabKeys(function(e) {
  16. if (e.ctrlKey && e.keyCode == 74)
  17. {
  18. filesBox.keyHandler_.element_.focus();
  19. }
  20. else if (e.keyIdentifier == "F8")
  21. {
  22. runCode();
  23. }
  24. }, function(kc, e) {
  25. return (kc == 74 && e.ctrlKey && !e.altKey && !e.shiftKey)
  26. || e.keyIdentifier == "F8";
  27. });
  28. e.focus();
  29. goog.net.XhrIo.send("/ide/static/default/__init__.py", function(e) {
  30. var xhr = e.target;
  31. var text = xhr.getResponseText();
  32. editor.setCode(text);
  33. });
  34. }
  35. });
  36. function makeMenu(name, items)
  37. {
  38. var m = new goog.ui.Menu();
  39. m.setId(name + "Menu");
  40. goog.array.forEach(items,
  41. function(data) {
  42. var item;
  43. var label = data[0];
  44. var cb = data[1];
  45. if (label)
  46. {
  47. item = new goog.ui.MenuItem(label);
  48. item.setId(label);
  49. item.setDispatchTransitionEvents(goog.ui.Component.ALL, true);
  50. }
  51. else
  52. {
  53. item = new goog.ui.MenuSeparator();
  54. }
  55. m.addItem(item);
  56. goog.events.listen(m, 'action', function(e)
  57. {
  58. if (e.target === item)
  59. cb();
  60. });
  61. });
  62. var b = new goog.ui.MenuButton(name, m);
  63. b.setDispatchTransitionEvents(goog.ui.Component.State.ALL, true);
  64. b.setId(name + "Button");
  65. b.render(goog.dom.getElement("menuButtons"));
  66. return m;
  67. }
  68. var fileMenu = makeMenu('File', [
  69. [ 'New Python File...', function() { alert('todo;'); } ],
  70. [ 'New Vertex Shader...', function() { alert('todo;'); } ],
  71. [ 'New Fragment Shader...', function() { alert('todo;'); } ],
  72. [ 'Save All', function() { alert('todo;'); } ],
  73. ]);
  74. var projectMenu = makeMenu('Project', [
  75. [ 'Save All and Run (F8)', function()
  76. {
  77. runCode();
  78. } ],
  79. [ null, null ],
  80. [ 'Delete...', function() { alert('delete'); } ],
  81. [ null, null ],
  82. [ 'Share...', function() { alert('todo;'); } ]
  83. ]);
  84. projectMenu.getChildAt(2).setEnabled(false); // since we start with only one item
  85. var el = goog.dom.getElement('filelist');
  86. filesBox = new goog.ui.ComboBox();
  87. filesBox.setMatchFunction(goog.string.contains);
  88. filesBox.setUseDropdownArrow(true);
  89. filesBox.setDefaultText('__init__.py');
  90. filesBox.addItem(new goog.ui.ComboBoxItem('__init__.py'));
  91. //filesBox.addItem(new goog.ui.ComboBoxItem('simple.vp'));
  92. //filesBox.addItem(new goog.ui.ComboBoxItem('simple.fp'));
  93. filesBox.render(el);
  94. var backToCodeButton = new goog.ui.CustomButton("Back to code");
  95. el = goog.dom.getElement("output_container");
  96. goog.events.listen(backToCodeButton, goog.ui.Component.EventType.ACTION, function(e) {
  97. goog.style.showElement(goog.dom.getElement('codeui'), true);
  98. goog.style.showElement(goog.dom.getElement('output_container'), false);
  99. goog.global.shutdownGLContext = true;
  100. setTimeout(function() { editor.focus(); }, 0);
  101. });
  102. backToCodeButton.render(el);
  103. var runOutput = goog.dom.getElement("runoutput");
  104. function runCode()
  105. {
  106. delete goog.global.shutdownGLContext;
  107. runoutput.innerHTML = "";
  108. goog.style.showElement(goog.dom.getElement('codeui'), false);
  109. goog.style.showElement(goog.dom.getElement('output_container'), true);
  110. var code = editor.getCode();
  111. Sk.configure({
  112. output: function(x) { runOutput.innerHTML += x.replace("<", "&lt;"); },
  113. debugout: function() { runOutput.innerHTML += "<font color='red'>" + Array.prototype.slice.call(arguments,0).join(' ') + "</font>\n"; },
  114. read: builtinRead,
  115. sysargv: [ '__init__.py' ],
  116. });
  117. try
  118. {
  119. Sk.importMainWithBody("__init__.py", false, code);
  120. }
  121. catch (e)
  122. {
  123. runOutput.innerHTML += e.toString();
  124. }
  125. }
  126. var toggleEdit = new goog.ui.CustomButton("Edit...");
  127. el = goog.dom.getElement("editbutton");
  128. goog.events.listen(toggleEdit, goog.ui.Component.EventType.ACTION, function(e) {
  129. goog.style.showElement(goog.dom.getElement('codeoroutput'), true);
  130. goog.style.showElement(el, false);
  131. });
  132. toggleEdit.render(el);
  133. var hideCodeButton = new goog.ui.CustomButton("Hide code");
  134. goog.events.listen(hideCodeButton, goog.ui.Component.EventType.ACTION, function(e) {
  135. goog.style.showElement(goog.dom.getElement('codeoroutput'), false);
  136. goog.style.showElement(goog.dom.getElement('editbutton'), true);
  137. });
  138. hideCodeButton.render(goog.dom.getElement('hidecode'));
  139. function builtinRead(x)
  140. {
  141. if (Sk.builtinFiles === undefined || Sk.builtinFiles[x] === undefined)
  142. throw "File not found: '" + x + "'";
  143. return Sk.builtinFiles[x];
  144. }
  145. }