Advertisement
Guest User

Untitled

a guest
Apr 18th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function CodeRunnerController()
  2. {
  3.     var outer = this;
  4.         // latest code run statuses
  5.     var CODE_NOT_RUN = -1, CODE_RUN_SUCCESS = 0, CODE_RUN_ERROR = 1;
  6.         // the status of the latest run code:
  7.     this.codeRunStatus = CODE_NOT_RUN;
  8.             // if codeRunStatus is set to 1, this will hold the latest error message
  9.     this.errorMessage = null;
  10.  
  11.     this.worker = null;
  12.     this.outputFromLatestRun = null;
  13.     this.userDefinedVariablesFromLatestRun = null;
  14.     this.userDefinedVariableValuesFromLatestRun = null;
  15.  
  16.     this.NO_OUTPUT_MESSAGE = "Inget att visa";
  17.     $("#run-output").text(this.noOutputMsg);
  18.  
  19.     // in case we will use our canvas stuff in other classes
  20.     this.context = null;
  21.  
  22.  
  23.     this.runCode = function() {
  24.  
  25.         if (editorController.codeHasErrors()) {
  26.             alert("Du måste fixa felen (röda kryss) i koden innan du kan köra den.");
  27.             outer.codeRunStatus = outer.CODE_NOT_RUN;
  28.             return;
  29.         }
  30.    
  31.         $("#run-output").text(outer.NO_OUTPUT_MESSAGE);
  32.         // disable run button while running
  33.         $("#stop-code-button").prop('disabled', false);
  34.         $("#run-code-button").prop('disabled', true);
  35.  
  36.         outer.userDefinedVariablesFromLatestRun = null;
  37.         outer.userDefinedVariableValuesFromLatestRun = null;
  38.  
  39.         // reset the canvas when the code is run
  40.         var canvas = document.createElement("canvas");
  41.         var canvasJQuery = $(canvas);
  42.         outer.context = canvas.getContext("2d");
  43.         canvasJQuery.attr({
  44.             width: 1000,
  45.             height: 1000
  46.         });
  47.         $("#canvas-tab").empty();
  48.         $("#canvas-tab").append(canvasJQuery);
  49.  
  50.         var userCode = editor.getValue();
  51.         // append functions and variables for drawing on Canvas
  52.         var codeWithMessages = '\n\
  53.    function print  (data) { postMessage(["print", data.toString()]); } \n\
  54.    function println(data) { postMessage(["print", data.toString() + "\\n"]); } \n\
  55.    function alert  (data) { postMessage(["alert", data.toString()]); } \n\
  56.    function confirm(data) { postMessage(["confirm", data.toString()]); } \n\
  57.    function prompt (data) { postMessage(["prompt", data.toString()]); } \n\
  58.    \n\
  59.    var CanvasRenderingContext2D = function() { \n\
  60.        this.fillStyle   = "black"; \n\
  61.        this.font = "10px sans-serif"; \n\
  62.        this.globalAlpha = 1.0; \n\
  63.        this.lineCap = "butt"; \n\
  64.        this.lineJoin = "miter"; \n\
  65.        this.lineWidth = 1.0; \n\
  66.        this.miterLimit = 10; \n\
  67.        this.shadowBlur = 0; \n\
  68.        this.shadowOffsetX = 0; \n\
  69.        this.shadowOffsetY = 0; \n\
  70.        this.strokeStyle = "black"; \n\
  71.        this.textAlign = "start"; \n\
  72.        this.textBaseline = "alphabetic"; \n\
  73.    }; \n\
  74.    ["arc", "arcTo", "beginPath", "bezierCurveTo", "clearRect", "clip", "closePath", "createLinearGradient", \n\
  75.    "createPattern", "drawCustomFocusRing", "drawSystemFocusRing", "fill", "fillRect", "fillStyle", "fillText", "getLineDash", \n\
  76.    "isPointInPath", "isPointInStroke", "lineTo", "moveTo", "quadraticCurveTo", "rect", "restore", "save", "scale", \n\
  77.    "scrollPathIntoView", "setLineDash", "setTransform", "stroke", "strokeRect", "strokeText", "transform", "translate"] \n\
  78.    .forEach(function(methodName) { \n\
  79.        CanvasRenderingContext2D.prototype[methodName] = function() { \n\
  80.             var self = this; \n\
  81.             postMessage(["canvas", {called: methodName, args: Array.prototype.slice.call(arguments), currentObjectAttributes: this}]); \n\
  82.         };\n\
  83.    });\n\
  84.     var myCanvas = new CanvasRenderingContext2D(); \n\
  85. ' + userCode;
  86.         var codeWithMessagesAndExitValues = codeWithMessages + "\n\n\ \
  87. var userDefinedVariables = Object.keys(self); \n\
  88. var userDefinedVariableValues = Object.keys(self).map(function (key) { \n\
  89.    return self[key]; \n\
  90. });\n\
  91. \n\
  92.         postMessage(['exit', userDefinedVariables, JSON.stringify(userDefinedVariableValues)]);";
  93.  
  94.         console.log("Running code:");
  95.         console.log(codeWithMessagesAndExitValues);
  96.  
  97.         var blob = new Blob([codeWithMessagesAndExitValues], {type: 'application/javascript'});
  98.         // Obtain a blob URL reference to our worker 'file'.
  99.         var blobURL = window.URL.createObjectURL(blob);
  100.         outer.worker = new Worker(blobURL);
  101.         outer.worker.onerror = function(e) {
  102.             var error = sprintf("<span class='red'>\nProgrammets körning avbröts med följande felmeddelande:\n%s</span>", e.message);
  103.             outer.errorMessage = e.message;
  104.  
  105.             if ($("#run-output").text() == editorController.noOutputMsg)
  106.                 $("#run-output").text("");
  107.             $("#run-output").append(error);
  108.             outer.codeRunStatus = outer.CODE_RUN_ERROR;
  109.  
  110.             this.outputFromLatestRun = null;
  111.             outer.worker.terminate();
  112.             outer.worker = null;
  113.  
  114.             enableButtons();
  115.         }
  116.         // handle messages by "printing" to the run-output element, or display
  117.         // a success message when finishing
  118.         outer.worker.addEventListener('message', function (event) {
  119.             var method = event.data[0] || null;
  120.             var data   = event.data[1] || null;
  121.  
  122.             if (method == "canvas") {
  123.                 // Refreshing context attributes
  124.                 var attributes = data.currentObjectAttributes;
  125.                 for(var k in attributes) {
  126.                     outer.context[k] = attributes[k];
  127.                 }
  128.                  // Calling method
  129.                 var method = outer.context[data.called];
  130.                 method.apply(outer.context, data.args);
  131.             }
  132.             else if(method == "exit") {
  133.                 outer.worker.terminate();
  134.                 outer.worker = null;
  135.  
  136.                 outer.codeRunStatus = outer.CODE_RUN_SUCCESS;
  137.                 outer.errorMessage = null;
  138.                 outer.outputFromLatestRun = $("#run-output").text();
  139.                 $("#run-output").append("<span class='code-run-success'>\nKörning klar</span>");
  140.  
  141.                 outer.userDefinedVariablesFromLatestRun = event.data[1];
  142.                 console.log("Variables in latest run: ");
  143.                 console.log(outer.userDefinedVariablesFromLatestRun);
  144.                 outer.userDefinedVariableValuesFromLatestRun = JSON.parse(event.data[2]);
  145.                 console.log("Values in latest run: ");
  146.                 console.log(outer.userDefinedVariableValuesFromLatestRun);
  147.                 enableButtons();
  148.             }
  149.             else if(method == "alert") {
  150.                 alert(data);
  151.             }
  152.             else if(method == "confirm") {
  153.                 confirm(data);
  154.             }
  155.             else if(method == "prompt") {
  156.                 prompt(data);
  157.             }
  158.             else if(method == "print") {
  159.                 if ($("#run-output").text() == editorController.noOutputMsg)
  160.                     $("#run-output").text("");
  161.                 $("#run-output").append(data);
  162.             }
  163.             else {
  164.                 $("#run-output").append(event.data);
  165.             }
  166.         }, false);
  167.         // start the worker
  168.         outer.worker.postMessage();
  169.     }
  170.  
  171.  
  172.     this.stopCode = function() {
  173.         if (outer.worker == null) {
  174.             alert("Ingen kod körs just nu.");
  175.         }
  176.         else {
  177.             $("#run-output").append("<span class='code-error'>\nKörning avbruten</span>");
  178.             outer.worker.terminate();
  179.             outer.worker = null;
  180.             enableButtons();
  181.         }
  182.     }
  183.  
  184.     this.getOutputFromLatestRun = function() {
  185.         return outer.outputFromLatestRun;
  186.     }
  187.  
  188.     this.getUserVariableIndexFromLatestRun = function(variableName) {
  189.         for (var i in outer.userDefinedVariablesFromLatestRun)
  190.             if (outer.userDefinedVariablesFromLatestRun[i] == variableName)
  191.                 return parseInt(i);
  192.         return -1;
  193.     }
  194.  
  195.     this.getUserVariableValueFromLatestRun = function(variableName) {
  196.         var foundIndex = outer.getUserVariableIndexFromLatestRun(variableName);
  197.         return outer.userDefinedVariableValuesFromLatestRun[foundIndex];
  198.     }
  199.  
  200.     function enableButtons() {
  201.         $("#stop-code-button").prop('disabled', true);
  202.         $("#run-code-button").prop('disabled', false);
  203.     }
  204.  
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement