App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/socialcalctableeditor.js view on Meta::CPAN
/* Text Paste: In IE, \t is transformed into , so replace them with U+FFFC. */
ha.innerHTML = html.replace(
/&[Nn][Bb][Ss][Pp];/g,
_ObjectReplacementCharacter_
);
}
value = ha.innerText.replace(new RegExp(_ObjectReplacementCharacter_, 'g'), '\t');
ha.innerHTML = '';
ha.blur();
ha.style.visibility = "hidden";
}
else {
var ta = editor.pasteTextarea;
value = ta.value;
ta.blur();
ta.style.display = "none";
}
value = value.replace(/\r\n/g, "\n").replace(/\n?$/, '\n');
var clipstr = SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "tab");
if (value == clipstr || (value.length-clipstr.length==1 && value.substring(0,value.length-1)==clipstr)) {
isPasteSameAsClipboard = true;
}
var cmd = "";
// pastes SocialCalc clipboard if did a Ctrl-C and contents still the same
// Webkit adds an extra blank line, so need to allow for that
if (!isPasteSameAsClipboard) {
cmd = "loadclipboard "+
SocialCalc.encodeForSave(SocialCalc.ConvertOtherFormatToSave(value, "tab")) + "\n";
}
var cr;
if (editor.range.hasrange) {
cr = SocialCalc.crToCoord(editor.range.left, editor.range.top);
}
else {
cr = editor.ecell.coord;
}
cmd += "paste "+cr+" formulas";
editor.EditorScheduleSheetCommands(cmd, true, false);
SocialCalc.KeyboardFocus();
}, 200);
return true;
case "[ctrl-z]":
editor.EditorScheduleSheetCommands("undo", true, false);
return false;
case "[ctrl-s]": // !!!! temporary hack
window.setTimeout(
function() {
if (!SocialCalc.GetSpreadsheetControlObject) return;
var s = SocialCalc.GetSpreadsheetControlObject();
if (!s) return;
var editor = s.editor;
var sheet = editor.context.sheetobj;
var cell = sheet.GetAssuredCell(editor.ecell.coord);
var ntvf = cell.nontextvalueformat ? sheet.valueformats[cell.nontextvalueformat-0] || "" : "";
var newntvf = window.prompt("Advanced Feature:\n\nCustom Numeric Format or Command", ntvf);
if (newntvf != null) { // not cancelled
if (newntvf.match(/^cmd:/)) {
cmd = newntvf.substring(4); // execute as command
}
else if (newntvf.match(/^edit:/)) {
cmd = newntvf.substring(5); // execute as command
if (SocialCalc.CtrlSEditor) {
SocialCalc.CtrlSEditor(cmd);
}
return;
}
else {
if (editor.range.hasrange) {
sel = SocialCalc.crToCoord(editor.range.left, editor.range.top)+
":"+SocialCalc.crToCoord(editor.range.right, editor.range.bottom);
}
else {
sel = editor.ecell.coord;
}
cmd = "set "+sel+" nontextvalueformat "+newntvf;
}
editor.EditorScheduleSheetCommands(cmd, true, false);
}
},
200);
return false;
default:
break;
}
return true;
};
// Set sheet's status callback:
context.sheetobj.statuscallback = SocialCalc.EditorSheetStatusCallback;
context.sheetobj.statuscallbackparams = this; // this object: the table editor object
// StatusCallback: all values are called at appropriate times, add with unique name, delete when done
//
// Each value must be an object in the form of:
//
// func: function(editor, status, arg, params) {...},
// params: params value to call func with
//
// The values for status and arg are:
//
// all the SocialCalc RecalcSheet statuscallbacks, including:
//
// calccheckdone, calclist length
// calcorder, {coord: coord, total: celllist length, count: count}
// calcstep, {coord: coord, total: calclist length, count: count}
// calcfinished, time in milliseconds
//
// the command callbacks, like cmdstart and cmdend
// cmdendnorender
//
// calcstart, null
// moveecell, new ecell coord
socialcalc/socialcalctableeditor.js view on Meta::CPAN
wval.partialexpr = "";
wval.ecoord = editor.ecell.coord;
wval.erow = editor.ecell.row;
wval.ecol = editor.ecell.col;
};
//
// SocialCalc.InputBoxOnMouseDown(e)
//
// This is called when the input box gets the focus. It then responds to keystrokes
// and pass them off to SocialCalc.ProcessKey, but in a different editing state.
//
SocialCalc.InputBoxOnMouseDown = function(e) {
var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff
if (!editor) return true; // we're not handling it -- let browser do default
var wval = editor.workingvalues;
switch (editor.state) {
case "start":
editor.state="inputboxdirect";
wval.partialexpr = "";
wval.ecoord = editor.ecell.coord;
wval.erow = editor.ecell.row;
wval.ecol = editor.ecell.col;
editor.inputEcho.ShowInputEcho(true);
break;
case "input":
wval.partialexpr = ""; // make sure not pointing
editor.MoveECell(wval.ecoord);
editor.state="inputboxdirect";
SocialCalc.KeyboardFocus(); // may have come here from outside of grid
break;
case "inputboxdirect":
break;
}
}
// *************************************
//
// InputEcho class:
//
// This object creates and controls an element that echos what's in the InputBox during editing
// It is draggable.
//
// *************************************
SocialCalc.InputEcho = function(editor) {
var scc = SocialCalc.Constants;
this.editor = editor; // the TableEditor this belongs to
this.text = ""; // current value of what is displayed
this.interval = null; // timer handle
this.container = null; // element containing main echo as well as prompt line
this.main = null; // main echo area
this.prompt = null;
this.functionbox = null; // function chooser dialog
this.container = document.createElement("div");
SocialCalc.setStyles(this.container, "display:none;position:absolute;zIndex:10;");
this.main = document.createElement("div");
if (scc.defaultInputEchoClass) this.main.className = scc.defaultInputEchoClass;
if (scc.defaultInputEchoStyle) SocialCalc.setStyles(this.main, scc.defaultInputEchoStyle);
this.main.innerHTML = " ";
this.container.appendChild(this.main);
this.prompt = document.createElement("div");
if (scc.defaultInputEchoPromptClass) this.prompt.className = scc.defaultInputEchoPromptClass;
if (scc.defaultInputEchoPromptStyle) SocialCalc.setStyles(this.prompt, scc.defaultInputEchoPromptStyle);
this.prompt.innerHTML = "";
this.container.appendChild(this.prompt);
SocialCalc.DragRegister(this.main, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition,
MouseUp: SocialCalc.DragFunctionPosition,
Disabled: null, positionobj: this.container});
editor.toplevel.appendChild(this.container);
}
// Methods:
SocialCalc.InputEcho.prototype.ShowInputEcho = function(show) {return SocialCalc.ShowInputEcho(this, show);};
SocialCalc.InputEcho.prototype.SetText = function(str) {return SocialCalc.SetInputEchoText(this, str);};
// Functions:
SocialCalc.ShowInputEcho = function(inputecho, show) {
var cell, position;
var editor = inputecho.editor;
if (!editor) return;
if (show) {
editor.cellhandles.ShowCellHandles(false);
cell=SocialCalc.GetEditorCellElement(editor, editor.ecell.row, editor.ecell.col);
if (cell) {
position = SocialCalc.GetElementPosition(cell.element);
inputecho.container.style.left = (position.left-1)+"px";
inputecho.container.style.top = (position.top-1)+"px";
}
inputecho.container.style.display = "block";
if (inputecho.interval) window.clearInterval(inputecho.interval); // just in case
inputecho.interval = window.setInterval(SocialCalc.InputEchoHeartbeat, 50);
}
else {
if (inputecho.interval) window.clearInterval(inputecho.interval);
inputecho.container.style.display = "none";
}
}
SocialCalc.SetInputEchoText = function(inputecho, str) {
var scc = SocialCalc.Constants;
var fname, fstr;
var newstr = SocialCalc.special_chars(str);
newstr = newstr.replace(/\n/g,"<br>");
if (inputecho.text != newstr) {
inputecho.main.innerHTML = newstr;
inputecho.text = newstr;
}
var parts = str.match(/.*[\+\-\*\/\&\^\<\>\=\,\(]([A-Za-z][A-ZA-z]\w*?)\([^\)]*$/);
if (str.charAt(0)=="=" && parts) {
fname = parts[1].toUpperCase();
if (SocialCalc.Formula.FunctionList[fname]) {
SocialCalc.Formula.FillFunctionInfo(); // make sure filled
fstr = SocialCalc.special_chars(fname+"("+SocialCalc.Formula.FunctionArgString(fname)+")");
}
else {
fstr = scc.ietUnknownFunction+fname;
}
if (inputecho.prompt.innerHTML != fstr) {
inputecho.prompt.innerHTML = fstr;
inputecho.prompt.style.display = "block";
}
}
else if (inputecho.prompt.style.display != "none") {
inputecho.prompt.innerHTML = "";
inputecho.prompt.style.display = "none";
}
}
SocialCalc.InputEchoHeartbeat = function() {
var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff
if (!editor) return true; // we're not handling it -- let browser do default
editor.inputEcho.SetText(editor.inputBox.GetText()+"_");
}
SocialCalc.InputEchoMouseDown = function(e) {
var event = e || window.event;
var editor = SocialCalc.Keyboard.focusTable; // get TableEditor doing keyboard stuff
if (!editor) return true; // we're not handling it -- let browser do default
// if (event.stopPropagation) event.stopPropagation(); // DOM Level 2
// else event.cancelBubble = true; // IE 5+
// if (event.preventDefault) event.preventDefault(); // DOM Level 2
// else event.returnValue = false; // IE 5+
editor.inputBox.element.focus();
// return false;
};
// *************************************
//
// CellHandles class:
//
// This object creates and controls the elements around the cursor cell for dragging, etc.
//
// *************************************
SocialCalc.CellHandles = function(editor) {
var scc = SocialCalc.Constants;
var functions;
if (editor.noEdit) return; // leave us with nothing
this.editor = editor; // the TableEditor this belongs to
this.noCursorSuffix = false;
this.movedmouse = false; // used to detect no-op
this.draghandle = document.createElement("div");
SocialCalc.setStyles(this.draghandle, "display:none;position:absolute;zIndex:8;border:1px solid white;width:4px;height:4px;fontSize:1px;backgroundColor:#0E93D8;cursor:default;");
this.draghandle.innerHTML = ' ';
editor.toplevel.appendChild(this.draghandle);
SocialCalc.AssignID(editor, this.draghandle, "draghandle");
var imagetype = "png";
if (navigator.userAgent.match(/MSIE 6\.0/)) {
imagetype = "gif";
( run in 1.071 second using v1.01-cache-2.11-cpan-6aa56a78535 )