/* * Copyright (C) 2012 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @constructor * @extends {WebInspector.SourceFrame} * @param {WebInspector.UISourceCode} uiSourceCode */ WebInspector.UISourceCodeFrame = function(uiSourceCode) { this._uiSourceCode = uiSourceCode; WebInspector.SourceFrame.call(this, this._uiSourceCode); this.textEditor.setCompletionDictionary(new WebInspector.SampleCompletionDictionary()); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.FormattedChanged, this._onFormattedChanged, this); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._onWorkingCopyChanged, this); this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyCommitted, this); this._updateStyle(); } WebInspector.UISourceCodeFrame.prototype = { wasShown: function() { WebInspector.SourceFrame.prototype.wasShown.call(this); this._boundWindowFocused = this._windowFocused.bind(this); window.addEventListener("focus", this._boundWindowFocused, false); this._checkContentUpdated(); }, willHide: function() { WebInspector.SourceFrame.prototype.willHide.call(this); window.removeEventListener("focus", this._boundWindowFocused, false); delete this._boundWindowFocused; this._uiSourceCode.removeWorkingCopyGetter(); }, /** * @return {boolean} */ canEditSource: function() { return this._uiSourceCode.isEditable(); }, _windowFocused: function(event) { this._checkContentUpdated(); }, _checkContentUpdated: function() { if (!this.loaded || !this.isShowing()) return; this._uiSourceCode.checkContentUpdated(); }, /** * @param {string} text */ commitEditing: function(text) { if (!this._uiSourceCode.isDirty()) return; this._muteSourceCodeEvents = true; this._uiSourceCode.commitWorkingCopy(this._didEditContent.bind(this)); delete this._muteSourceCodeEvents; }, onTextChanged: function(oldRange, newRange) { WebInspector.SourceFrame.prototype.onTextChanged.call(this, oldRange, newRange); if (this._isSettingContent) return; this._muteSourceCodeEvents = true; if (this._textEditor.isClean()) this._uiSourceCode.resetWorkingCopy(); else this._uiSourceCode.setWorkingCopyGetter(this._textEditor.text.bind(this._textEditor)); delete this._muteSourceCodeEvents; }, _didEditContent: function(error) { if (error) { WebInspector.log(error, WebInspector.ConsoleMessage.MessageLevel.Error, true); return; } }, /** * @param {WebInspector.Event} event */ _onFormattedChanged: function(event) { var content = /** @type {string} */ (event.data.content); this._textEditor.setReadOnly(this._uiSourceCode.formatted()); this._innerSetContent(content); }, /** * @param {WebInspector.Event} event */ _onWorkingCopyChanged: function(event) { if (this._muteSourceCodeEvents) return; this._innerSetContent(this._uiSourceCode.workingCopy()); this.onUISourceCodeContentChanged(); }, /** * @param {WebInspector.Event} event */ _onWorkingCopyCommitted: function(event) { if (!this._muteSourceCodeEvents) { this._innerSetContent(this._uiSourceCode.workingCopy()); this.onUISourceCodeContentChanged(); } this._textEditor.markClean(); this._updateStyle(); }, _updateStyle: function() { this.element.enableStyleClass("source-frame-unsaved-committed-changes", this._uiSourceCode.hasUnsavedCommittedChanges()); }, onUISourceCodeContentChanged: function() { }, /** * @param {string} content */ _innerSetContent: function(content) { this._isSettingContent = true; this.setContent(content, false, this._uiSourceCode.mimeType()); delete this._isSettingContent; }, populateTextAreaContextMenu: function(contextMenu, lineNumber) { WebInspector.SourceFrame.prototype.populateTextAreaContextMenu.call(this, contextMenu, lineNumber); contextMenu.appendApplicableItems(this._uiSourceCode); contextMenu.appendSeparator(); }, dispose: function() { this.detach(); }, __proto__: WebInspector.SourceFrame.prototype }