1c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)/* 2c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 3c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * 4c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 5c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * modification, are permitted provided that the following conditions are 6c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * met: 7c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * 8c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * * Redistributions of source code must retain the above copyright 9c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 10c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * * Redistributions in binary form must reproduce the above 11c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 12c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * in the documentation and/or other materials provided with the 13c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * distribution. 14c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 15c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * contributors may be used to endorse or promote products derived from 16c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * this software without specific prior written permission. 17c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * 18c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) */ 30c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @constructor 3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @extends {WebInspector.InplaceEditor} 3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.CodeMirrorUtils = function() 3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebInspector.InplaceEditor.call(this); 3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/** 416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * @param {!WebInspector.TextRange} range 426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * @return {!{start: !CodeMirror.Pos, end: !CodeMirror.Pos}} 436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */ 446f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebInspector.CodeMirrorUtils.toPos = function(range) 456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return { 476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch start: new CodeMirror.Pos(range.startLine, range.startColumn), 486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch end: new CodeMirror.Pos(range.endLine, range.endColumn) 496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/** 536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * @param {!CodeMirror.Pos} start 546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * @param {!CodeMirror.Pos} end 556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * @return {!WebInspector.TextRange} 566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */ 576f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebInspector.CodeMirrorUtils.toRange = function(start, end) 586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return new WebInspector.TextRange(start.line, start.ch, end.line, end.ch); 605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.CodeMirrorUtils.prototype = { 6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @return {string} 6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editorContent: function(editingContext) { 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return editingContext.codeMirror.getValue(); 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!Event} e 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) _consumeCopy: function(e) 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) e.consume(); 7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setUpEditor: function(editingContext) 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) var element = editingContext.element; 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) var config = editingContext.config; 8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editingContext.cssLoadView = new WebInspector.CodeMirrorCSSLoadView(); 8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editingContext.cssLoadView.show(element); 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) WebInspector.setCurrentFocusElement(element); 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) element.addEventListener("copy", this._consumeCopy, false); 865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) var codeMirror = new window.CodeMirror(element, { 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) mode: config.mode, 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lineWrapping: config.lineWrapping, 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) smartIndent: config.smartIndent, 9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) autofocus: true, 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) theme: config.theme, 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) value: config.initialValue 9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }); 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) codeMirror.getWrapperElement().classList.add("source-code"); 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) codeMirror.on("cursorActivity", function(cm) { 96aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch cm.display.cursorDiv.scrollIntoViewIfNeeded(false); 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }); 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editingContext.codeMirror = codeMirror; 9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) closeEditor: function(editingContext) 10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editingContext.element.removeEventListener("copy", this._consumeCopy, false); 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editingContext.cssLoadView.detach(); 10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) cancelEditing: function(editingContext) 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) editingContext.codeMirror.setValue(editingContext.oldText); 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) augmentEditingHandle: function(editingContext, handle) 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) function setWidth(editingContext, width) 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) var padding = 30; 11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) var codeMirror = editingContext.codeMirror; 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) codeMirror.getWrapperElement().style.width = (width - codeMirror.getWrapperElement().offsetLeft - padding) + "px"; 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) codeMirror.refresh(); 12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) handle.codeMirror = editingContext.codeMirror; 12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) handle.setWidth = setWidth.bind(null, editingContext); 12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) __proto__: WebInspector.InplaceEditor.prototype 12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 13009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @constructor 13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @implements {WebInspector.TokenizerFactory} 13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.CodeMirrorUtils.TokenizerFactory = function() { } 13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.CodeMirrorUtils.TokenizerFactory.prototype = { 136c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) /** 137c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * @param {string} mimeType 13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @return {function(string, function(string, ?string, number, number))} 139c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) */ 140c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) createTokenizer: function(mimeType) 141c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) { 142c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) var mode = CodeMirror.getMode({indentUnit: 2}, mimeType); 143c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) var state = CodeMirror.startState(mode); 144c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) function tokenize(line, callback) 145c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) { 146c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) var stream = new CodeMirror.StringStream(line); 147c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) while (!stream.eol()) { 148c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) var style = mode.token(stream, state); 149c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) var value = stream.current(); 150c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) callback(value, style, stream.start, stream.start + value.length); 151c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) stream.start = stream.pos; 152c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) } 153c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) } 154c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) return tokenize; 155c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) } 156c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 157c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 15909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * This bogus view is needed to load/unload CodeMirror-related CSS on demand. 16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * 16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @constructor 162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox} 16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.CodeMirrorCSSLoadView = function() 16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WebInspector.VBox.call(this); 16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this.element.classList.add("hidden"); 16809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) this.registerRequiredCSS("cm/codemirror.css"); 169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch this.registerRequiredCSS("cmdevtools.css"); 17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.CodeMirrorCSSLoadView.prototype = { 173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) __proto__: WebInspector.VBox.prototype 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 175