phrebejk@460: // 'use strict'; phrebejk@460: phrebejk@460: // Declare app level module which depends on filters, and services phrebejk@460: angular.module('bck2brwsr', []). phrebejk@460: directive('uiCodemirror', ['$timeout', function($timeout) { phrebejk@460: 'use strict'; phrebejk@460: phrebejk@460: var events = ["cursorActivity", "viewportChange", "gutterClick", "focus", "blur", "scroll", "update"]; phrebejk@460: return { phrebejk@460: restrict: 'A', phrebejk@460: require: 'ngModel', phrebejk@460: link: function(scope, elm, attrs, ngModel) { phrebejk@460: var options, opts, onChange, deferCodeMirror, codeMirror, timeoutId, val; phrebejk@460: phrebejk@460: if (elm[0].type !== 'textarea') { phrebejk@460: throw new Error('uiCodemirror3 can only be applied to a textarea element'); phrebejk@460: } phrebejk@460: phrebejk@460: options = /* uiConfig.codemirror || */ {}; phrebejk@460: opts = angular.extend({}, options, scope.$eval(attrs.uiCodemirror)); phrebejk@460: phrebejk@460: onChange = function(instance, changeObj) { phrebejk@460: val = instance.getValue(); phrebejk@460: $timeout.cancel(timeoutId); phrebejk@460: timeoutId = $timeout(function() { phrebejk@460: ngModel.$setViewValue(val); phrebejk@460: }, 500); phrebejk@460: }; phrebejk@460: phrebejk@460: deferCodeMirror = function() { phrebejk@460: codeMirror = CodeMirror.fromTextArea(elm[0], opts); phrebejk@460: // codeMirror.on("change", onChange(opts.onChange)); phrebejk@460: codeMirror.on("change", onChange); phrebejk@460: phrebejk@460: for (var i = 0, n = events.length, aEvent; i < n; ++i) { phrebejk@460: aEvent = opts["on" + events[i].charAt(0).toUpperCase() + events[i].slice(1)]; phrebejk@460: if (aEvent === void 0) phrebejk@460: continue; phrebejk@460: if (typeof aEvent !== "function") phrebejk@460: continue; phrebejk@460: phrebejk@460: var bound = _.bind( aEvent, scope ); phrebejk@460: phrebejk@460: codeMirror.on(events[i], bound); phrebejk@460: } phrebejk@460: phrebejk@460: // CodeMirror expects a string, so make sure it gets one. phrebejk@460: // This does not change the model. phrebejk@460: ngModel.$formatters.push(function(value) { phrebejk@460: if (angular.isUndefined(value) || value === null) { phrebejk@460: return ''; phrebejk@460: } phrebejk@460: else if (angular.isObject(value) || angular.isArray(value)) { phrebejk@460: throw new Error('ui-codemirror cannot use an object or an array as a model'); phrebejk@460: } phrebejk@460: return value; phrebejk@460: }); phrebejk@460: phrebejk@460: // Override the ngModelController $render method, which is what gets called when the model is updated. phrebejk@460: // This takes care of the synchronizing the codeMirror element with the underlying model, in the case that it is changed by something else. phrebejk@460: ngModel.$render = function() { phrebejk@460: codeMirror.setValue(ngModel.$viewValue); phrebejk@460: }; phrebejk@460: phrebejk@460: }; phrebejk@460: phrebejk@460: $timeout(deferCodeMirror); phrebejk@460: phrebejk@460: } phrebejk@460: }; phrebejk@460: }]); phrebejk@460: phrebejk@461: function DevCtrl( $scope, $http ) { jaroslav@466: var templateHtml = "\n" jaroslav@466: + " \n" jaroslav@466: + "
\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + "\n" jaroslav@466: + " \n" jaroslav@466: + " \n" jaroslav@466: + "\n"; jaroslav@466: var templateJava = "package bck2brwsr.demo;\n" jaroslav@466: + "import org.apidesign.bck2brwsr.htmlpage.api.*;\n" jaroslav@469: + "import static org.apidesign.bck2brwsr.htmlpage.api.OnEvent.*;\n" jaroslav@466: + "@Page(xhtml=\"index.html\", className=\"Index\")\n" jaroslav@466: + "class YourFirstHTML5PageInRealLanguage {\n" jaroslav@469: + " @On(event=CLICK, id=\"btn\") static void clcs() {\n" jaroslav@469: + " Element.alert(\"Hello World!\");\n" jaroslav@470: + " Index.BTN.setDisabled(true);\n" jaroslav@466: + " }\n" jaroslav@466: + "}\n"; jaroslav@466: phrebejk@460: phrebejk@461: $scope.reload= function() { phrebejk@461: var frame = document.getElementById("result"); phrebejk@461: frame.src = "result.html"; phrebejk@461: frame.contentDocument.location.reload(true); phrebejk@461: frame.contentWindow.location.reload(); phrebejk@461: }; phrebejk@461: phrebejk@461: $scope.post = function(html, java) { phrebejk@461: return $http({url: ".", phrebejk@461: method: "POST", phrebejk@461: //headers: this.headers, phrebejk@461: data: { html : $scope.html, java : $scope.java} phrebejk@461: }).success( $scope.reload ); phrebejk@460: }; phrebejk@460: phrebejk@460: $scope.tab = "html"; jaroslav@466: $scope.html= templateHtml; jaroslav@466: $scope.java = templateJava; phrebejk@460: phrebejk@460: $scope.tabActive = function( tab ) { phrebejk@460: return tab === $scope.tab ? "active" : ""; phrebejk@460: }; phrebejk@460: phrebejk@461: // $scope.$watch( "html", htmlChange ); jaroslav@466: $scope.post(); phrebejk@460: phrebejk@460: }