c9-core/plugins/c9.ide.ace.repl/repl_cell.js

154 wiersze
4.9 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2010, Ajax.org B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name of Ajax.org B.V. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 AJAX.ORG B.V. 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.
*
* ***** END LICENSE BLOCK ***** */
define(function(require, exports, module) {
"use strict";
var Anchor = require("ace/anchor").Anchor;
var Range = require("ace/range").Range;
var comparePoints = Range.comparePoints;
var lang = require("ace/lib/lang");
var ReplCell = function(options, session) {
this.session = session;
this.type = options.type;
};
(function() {
this.insert = function(pos, text) {
if (typeof pos == "string") {
text = pos;
pos = this.getRange().end;
}
this.session.insert(pos, text);
};
this.setPlaceholder = function(str) {
this.placeholder = str;
};
this.setMode = function() {
};
this.setWaiting = function(val) {
this.waiting = val;
this.session.repl.$updateSession();
};
this.prompt = "";
this.promptType = null;
this.setPrompt = function(str, type) {
if (this.prompt == str)
return;
this.promptType = type;
this.prompt = (str || "") + " ";
this.session.maxPromptLength = Math.max(this.session.maxPromptLength || 0, this.prompt.length);
};
this.setValue = function(val, selection) {
if (!this.session)
return;
if (val == null)
return this.remove();
if (this.lineWidget && val.trim())
this.removeWidget();
this.$updateRange();
var pos = this.session.doc.replace(this.range, val);
this.range.setEnd(pos);
if (selection == 1)
this.session.selection.setRange({ start: this.range.end, end: this.range.end });
else if (selection == -1)
this.session.selection.setRange({ start: this.range.start, end: this.range.start });
};
this.getValue = function() {
if (!this.session)
return "";
return this.session.doc.getTextRange(this.range);
};
this.getRange = function() {
this.$updateRange();
return this.range;
};
this.$updateRange = function(row) {
var cells = this.session.replCells;
if (row == null)
row = cells.indexOf(this);
for (i = row; i > 0; i--) {
if (cells[i])
break;
}
var cell = cells[i];
if (!cell)
return;
cell.row = i;
for (var i = row + 1; i < this.session.getLength(); i++) {
if (cells[i])
break;
}
cell.endRow = i - 1;
cell.range = new Range(cell.row, 0, cell.endRow, Number.MAX_VALUE);
return this.range;
};
this.removeWidget = function() {
if (this.lineWidget) {
var w = this.lineWidget;
this.lineWidget = null;
this.session.repl.removeLineWidget(w);
}
};
this.addWidget = function(options) {
if (this.lineWidget)
this.removeWidget();
this.setValue("");
options.row = this.range.end.row;
this.lineWidget = options;
this.session.repl.addLineWidget(this.lineWidget);
};
this.destroy = function() {
this.removeWidget();
this.session = null;
};
this.remove = function() {
if (this.session)
this.session.repl.removeCell(this);
};
}).call(ReplCell.prototype);
exports.ReplCell = ReplCell;
});