App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/socialcalctableeditor.js view on Meta::CPAN
SocialCalc.CreateTableEditor = function(editor, width, height) {
var scc = SocialCalc.Constants;
var AssignID = SocialCalc.AssignID;
editor.toplevel = document.createElement("div");
editor.width = width;
editor.height = height;
editor.griddiv = document.createElement("div");
editor.tablewidth = Math.max(0, width - scc.defaultTableControlThickness);
editor.tableheight = Math.max(0, height - scc.defaultTableControlThickness);
editor.griddiv.style.width=editor.tablewidth+"px";
editor.griddiv.style.height=editor.tableheight+"px";
editor.griddiv.style.overflow="hidden";
editor.griddiv.style.cursor="default";
if (scc.cteGriddivClass) editor.griddiv.className = scc.cteGriddivClass;
AssignID(editor, editor.griddiv, "griddiv");
editor.FitToEditTable();
editor.EditorRenderSheet();
editor.griddiv.appendChild(editor.fullgrid);
editor.verticaltablecontrol = new SocialCalc.TableControl(editor, true, editor.tableheight);
editor.verticaltablecontrol.CreateTableControl();
AssignID(editor, editor.verticaltablecontrol.main, "tablecontrolv");
editor.horizontaltablecontrol = new SocialCalc.TableControl(editor, false, editor.tablewidth);
editor.horizontaltablecontrol.CreateTableControl();
AssignID(editor, editor.horizontaltablecontrol.main, "tablecontrolh");
var table, tbody, tr, td, img, anchor, ta, ha;
table = document.createElement("table");
editor.layouttable = table;
table.cellSpacing = 0;
table.cellPadding = 0;
AssignID(editor, table, "layouttable");
tbody = document.createElement("tbody");
table.appendChild(tbody);
tr = document.createElement("tr");
tbody.appendChild(tr);
td = document.createElement("td");
td.appendChild(editor.griddiv);
tr.appendChild(td);
td = document.createElement("td");
td.appendChild(editor.verticaltablecontrol.main);
tr.appendChild(td);
tr = document.createElement("tr");
tbody.appendChild(tr);
td = document.createElement("td");
td.appendChild(editor.horizontaltablecontrol.main);
tr.appendChild(td);
td = document.createElement("td"); // logo display: Required by CPAL License for this code!
td.style.background="url("+editor.imageprefix+"logo.gif) no-repeat center center";
td.innerHTML = "<div style='cursor:pointer;font-size:1px;'><img src='"+editor.imageprefix+"1x1.gif' border='0' width='18' height='18'></div>";
tr.appendChild(td);
editor.logo = td;
AssignID(editor, editor.logo, "logo");
SocialCalc.TooltipRegister(td.firstChild.firstChild, "SocialCalc", null);
editor.toplevel.appendChild(editor.layouttable);
if (!editor.noEdit) {
editor.inputEcho = new SocialCalc.InputEcho(editor);
AssignID(editor, editor.inputEcho.main, "inputecho");
}
editor.cellhandles = new SocialCalc.CellHandles(editor);
ta = document.createElement("textarea"); // used for ctrl-c/ctrl-v where an invisible text area is needed
SocialCalc.setStyles(ta, "display:none;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);");
ta.value = "";
editor.pasteTextarea = ta;
AssignID(editor, editor.pasteTextarea, "pastetextarea");
if (navigator.userAgent.match(/Safari\//) &&!navigator.userAgent.match(/Chrome\//)) { // special code for Safari 5 change
window.removeEventListener('beforepaste', SocialCalc.SafariPasteFunction, false);
window.addEventListener('beforepaste', SocialCalc.SafariPasteFunction, false);
window.removeEventListener('beforecopy', SocialCalc.SafariPasteFunction, false);
window.addEventListener('beforecopy', SocialCalc.SafariPasteFunction, false);
window.removeEventListener('beforecut', SocialCalc.SafariPasteFunction, false);
window.addEventListener('beforecut', SocialCalc.SafariPasteFunction, false);
}
editor.toplevel.appendChild(editor.pasteTextarea);
var div = document.createElement("div");
div.innerHTML = ' <br/>';
if (div.firstChild.nodeType == 1) {
/* We are running in IE -- Using HTML-based area for Ctrl-V */
ha = document.createElement("div"); // used for ctrl-v where an invisible html area is needed
editor.pasteHTMLarea = ha;
editor.toplevel.appendChild(editor.pasteHTMLarea);
ha.contentEditable = true;
AssignID(editor, editor.pasteHTMLarea, "pastehtmlarea");
SocialCalc.setStyles(ha, "display:block;visibility:hidden;position:absolute;height:1px;width:1px;opacity:0;filter:alpha(opacity=0);overflow:hidden");
}
SocialCalc.MouseWheelRegister(editor.toplevel, {WheelMove: SocialCalc.EditorProcessMouseWheel, editor: editor});
if (editor.inputBox) { // this seems to fix an obscure bug with Firefox 2 Mac where Ctrl-V doesn't get fired right
if (editor.inputBox.element) {
editor.inputBox.element.focus();
editor.inputBox.element.blur();
}
}
SocialCalc.KeyboardSetFocus(editor);
// do status reporting things
SocialCalc.EditorSheetStatusCallback(null, "startup", null, editor);
// done
socialcalc/socialcalctableeditor.js view on Meta::CPAN
if (!result) return;
if (!result.coord) result.coord = editor.ecell.coord;
if (editor.range.hasrange) {
editor.MoveECell(result.coord);
editor.RangeExtend();
}
else if (result.coord && result.coord!=mouseinfo.mousedowncoord) {
editor.RangeAnchor(mouseinfo.mousedowncoord);
editor.MoveECell(result.coord);
editor.RangeExtend();
}
editor.EditorMouseRange(result.coord);
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+
if (document.removeEventListener) { // DOM Level 2
document.removeEventListener("mousemove", SocialCalc.ProcessEditorMouseMove, true);
document.removeEventListener("mouseup", SocialCalc.ProcessEditorMouseUp, true);
}
else if (element.detachEvent) { // IE
element.detachEvent("onlosecapture", SocialCalc.ProcessEditorMouseUp);
element.detachEvent("onmouseup", SocialCalc.ProcessEditorMouseUp);
element.detachEvent("onmousemove", SocialCalc.ProcessEditorMouseMove);
element.releaseCapture();
}
mouseinfo.editor = null;
return false;
}
SocialCalc.ProcessEditorColsizeMouseDown = function(e, ele, result) {
var event = e || window.event;
var mouseinfo = SocialCalc.EditorMouseInfo;
var editor = mouseinfo.editor;
var viewport = SocialCalc.GetViewportInfo();
var clientX = event.clientX + viewport.horizontalScroll;
mouseinfo.mouseresizecolnum = result.coltoresize; // remember col being resized
mouseinfo.mouseresizecol = SocialCalc.rcColname(result.coltoresize);
mouseinfo.mousedownclientx = clientX;
var sizedisplay = document.createElement("div");
mouseinfo.mouseresizedisplay = sizedisplay;
sizedisplay.style.width = "auto";
sizedisplay.style.position = "absolute";
sizedisplay.style.zIndex = 100;
sizedisplay.style.top = (editor.headposition.top+0)+"px";
sizedisplay.style.left = editor.colpositions[result.coltoresize]+"px";
sizedisplay.innerHTML = '<table cellpadding="0" cellspacing="0"><tr><td style="height:100px;'+
'border:1px dashed black;background-color:white;width:' +
(editor.context.colwidth[mouseinfo.mouseresizecolnum]-2) + 'px;"> </td>'+
'<td><div style="font-size:small;color:white;background-color:gray;padding:4px;">'+
editor.context.colwidth[mouseinfo.mouseresizecolnum] + '</div></td></tr></table>';
SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter
editor.toplevel.appendChild(sizedisplay);
// Event code from JavaScript, Flanagan, 5th Edition, pg. 422
if (document.addEventListener) { // DOM Level 2 -- Firefox, et al
document.addEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true); // capture everywhere
document.addEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true); // capture everywhere
}
else if (editor.toplevel.attachEvent) { // IE 5+
editor.toplevel.setCapture();
editor.toplevel.attachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove);
editor.toplevel.attachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp);
editor.toplevel.attachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp);
}
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+
return;
}
SocialCalc.ProcessEditorColsizeMouseMove = function(e) {
var event = e || window.event;
var mouseinfo = SocialCalc.EditorMouseInfo;
var editor = mouseinfo.editor;
if (!editor) return; // not us, ignore
var viewport = SocialCalc.GetViewportInfo();
var clientX = event.clientX + viewport.horizontalScroll;
var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx);
if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth;
var sizedisplay = mouseinfo.mouseresizedisplay;
// sizedisplay.firstChild.lastChild.firstChild.childNodes[1].firstChild.innerHTML = newsize+"";
// sizedisplay.firstChild.lastChild.firstChild.childNodes[0].firstChild.style.width = (newsize-2)+"px";
sizedisplay.innerHTML = '<table cellpadding="0" cellspacing="0"><tr><td style="height:100px;'+
'border:1px dashed black;background-color:white;width:' + (newsize-2) + 'px;"> </td>'+
'<td><div style="font-size:small;color:white;background-color:gray;padding:4px;">'+
newsize + '</div></td></tr></table>';
SocialCalc.setStyles(sizedisplay.firstChild.lastChild.firstChild.childNodes[0], "filter:alpha(opacity=85);opacity:.85;"); // so no warning msg with Firefox about filter
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+
return;
}
SocialCalc.ProcessEditorColsizeMouseUp = function(e) {
var event = e || window.event;
var mouseinfo = SocialCalc.EditorMouseInfo;
var editor = mouseinfo.editor;
if (!editor) return; // not us, ignore
element = mouseinfo.element;
var viewport = SocialCalc.GetViewportInfo();
var clientX = event.clientX + viewport.horizontalScroll;
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+
if (document.removeEventListener) { // DOM Level 2
document.removeEventListener("mousemove", SocialCalc.ProcessEditorColsizeMouseMove, true);
document.removeEventListener("mouseup", SocialCalc.ProcessEditorColsizeMouseUp, true);
}
else if (editor.toplevel.detachEvent) { // IE
editor.toplevel.detachEvent("onlosecapture", SocialCalc.ProcessEditorColsizeMouseUp);
editor.toplevel.detachEvent("onmouseup", SocialCalc.ProcessEditorColsizeMouseUp);
editor.toplevel.detachEvent("onmousemove", SocialCalc.ProcessEditorColsizeMouseMove);
editor.toplevel.releaseCapture();
}
var newsize = (editor.context.colwidth[mouseinfo.mouseresizecolnum]-0) + (clientX - mouseinfo.mousedownclientx);
if (newsize < SocialCalc.Constants.defaultMinimumColWidth) newsize = SocialCalc.Constants.defaultMinimumColWidth;
editor.EditorScheduleSheetCommands("set "+mouseinfo.mouseresizecol+" width "+newsize, true, false);
if (editor.timeout) window.clearTimeout(editor.timeout);
editor.timeout = window.setTimeout(SocialCalc.FinishColsize, 1); // wait - Firefox 2 has a bug otherwise with next mousedown
return false;
}
SocialCalc.FinishColsize = function() {
var mouseinfo = SocialCalc.EditorMouseInfo;
var editor = mouseinfo.editor;
if (!editor) return;
editor.toplevel.removeChild(mouseinfo.mouseresizedisplay);
mouseinfo.mouseresizedisplay = null;
socialcalc/socialcalctableeditor.js view on Meta::CPAN
needed = editor.tableheight - totalrows * context.pixelsPerRow; // estimate amount needed
context.rowpanes[rowpane].last = context.rowpanes[rowpane].first + Math.floor(needed / context.pixelsPerRow) + 1;
}
//
// CalculateEditorPositions(editor)
//
// Calculate the screen positions and other values of various editing elements
// These values change and need to be recomputed when the pane first/last or cell contents change,
// as well as new column widths, etc.
//
// Note: Only call this after the grid has been rendered! You may have to wait for a timeout...
//
SocialCalc.CalculateEditorPositions = function(editor) {
var rowpane, colpane, i;
editor.gridposition = SocialCalc.GetElementPosition(editor.griddiv);
editor.headposition =
SocialCalc.GetElementPosition(editor.griddiv.firstChild.lastChild.childNodes[2].childNodes[1]); // 3rd tr 2nd td
editor.rowpositions = [];
for (rowpane=0; rowpane<editor.context.rowpanes.length; rowpane++) {
editor.CalculateRowPositions(rowpane, editor.rowpositions, editor.rowheight);
}
for (i=0; i<editor.rowpositions.length; i++) {
if (editor.rowpositions[i]>editor.gridposition.top+editor.tableheight) break;
}
editor.lastvisiblerow = i-1;
editor.colpositions = [];
for (colpane=0; colpane<editor.context.colpanes.length; colpane++) {
editor.CalculateColPositions(colpane, editor.colpositions, editor.colwidth);
}
for (i=0; i<editor.colpositions.length; i++) {
if (editor.colpositions[i]>editor.gridposition.left+editor.tablewidth) break;
}
editor.lastvisiblecol = i-1;
editor.firstscrollingrow = editor.context.rowpanes[editor.context.rowpanes.length-1].first;
editor.firstscrollingrowtop = editor.rowpositions[editor.firstscrollingrow] || editor.headposition.top;
editor.lastnonscrollingrow = editor.context.rowpanes.length-1 > 0 ?
editor.context.rowpanes[editor.context.rowpanes.length-2].last : 0;
editor.firstscrollingcol = editor.context.colpanes[editor.context.colpanes.length-1].first;
editor.firstscrollingcolleft = editor.colpositions[editor.firstscrollingcol] || editor.headposition.left;
editor.lastnonscrollingcol = editor.context.colpanes.length-1 > 0 ?
editor.context.colpanes[editor.context.colpanes.length-2].last : 0;
// Now do the table controls
editor.verticaltablecontrol.ComputeTableControlPositions();
editor.horizontaltablecontrol.ComputeTableControlPositions();
}
//
// ScheduleRender(editor)
//
// Do a series of timeouts to render the sheet, wait for background layout and
// rendering by the browser, and then update editor visuals, sliders, etc.
//
SocialCalc.ScheduleRender = function(editor) {
if (editor.timeout) window.clearTimeout(editor.timeout); // in case called more than once, just use latest
SocialCalc.EditorSheetStatusCallback(null, "schedrender", null, editor);
SocialCalc.EditorStepInfo.editor = editor;
editor.timeout = window.setTimeout(SocialCalc.DoRenderStep, 1);
}
// DoRenderStep()
//
SocialCalc.DoRenderStep = function() {
var editor = SocialCalc.EditorStepInfo.editor;
editor.timeout = null;
editor.EditorRenderSheet();
SocialCalc.EditorSheetStatusCallback(null, "renderdone", null, editor);
SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor);
editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1);
}
//
// SocialCalc.SchedulePositionCalculations(editor)
//
SocialCalc.SchedulePositionCalculations = function(editor) {
SocialCalc.EditorStepInfo.editor = editor;
SocialCalc.EditorSheetStatusCallback(null, "schedposcalc", null, editor);
editor.timeout = window.setTimeout(SocialCalc.DoPositionCalculations, 1);
}
// DoPositionCalculations(editor)
//
// Update editor visuals, sliders, etc.
//
// Note: Only call this after the DOM objects have been modified and rendered!
//
SocialCalc.DoPositionCalculations = function() {
var editor = SocialCalc.EditorStepInfo.editor;
editor.timeout = null;
var ok = false;
socialcalc/socialcalctableeditor.js view on Meta::CPAN
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";
}
this.dragpalette = document.createElement("div");
SocialCalc.setStyles(this.dragpalette, "display:none;position:absolute;zIndex:8;width:90px;height:90px;fontSize:1px;textAlign:center;cursor:default;"+
"backgroundImage:url("+SocialCalc.Constants.defaultImagePrefix+"drag-handles."+imagetype+");");
this.dragpalette.innerHTML = ' ';
editor.toplevel.appendChild(this.dragpalette);
SocialCalc.AssignID(editor, this.dragpalette, "dragpalette");
this.dragtooltip = document.createElement("div");
SocialCalc.setStyles(this.dragtooltip, "display:none;position:absolute;zIndex:9;border:1px solid black;width:100px;height:auto;fontSize:10px;backgroundColor:#FFFFFF;");
this.dragtooltip.innerHTML = ' ';
editor.toplevel.appendChild(this.dragtooltip);
SocialCalc.AssignID(editor, this.dragtooltip, "dragtooltip");
this.fillinghandle = document.createElement("div");
SocialCalc.setStyles(this.fillinghandle, "display:none;position:absolute;zIndex:9;border:1px solid black;width:auto;height:14px;fontSize:10px;backgroundColor:#FFFFFF;");
this.fillinghandle.innerHTML = ' ';
editor.toplevel.appendChild(this.fillinghandle);
SocialCalc.AssignID(editor, this.fillinghandle, "fillinghandle");
if (this.draghandle.addEventListener) { // DOM Level 2 -- Firefox, et al
this.draghandle.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false);
this.dragpalette.addEventListener("mousedown", SocialCalc.CellHandlesMouseDown, false);
this.dragpalette.addEventListener("mousemove", SocialCalc.CellHandlesMouseMoveOnHandle, false);
}
else if (this.draghandle.attachEvent) { // IE 5+
this.draghandle.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle);
this.dragpalette.attachEvent("onmousedown", SocialCalc.CellHandlesMouseDown);
this.dragpalette.attachEvent("onmousemove", SocialCalc.CellHandlesMouseMoveOnHandle);
}
else { // don't handle this
throw "Browser not supported";
}
}
// Methods:
SocialCalc.CellHandles.prototype.ShowCellHandles = function(show, moveshow) {return SocialCalc.ShowCellHandles(this, show, moveshow);};
// Functions:
SocialCalc.ShowCellHandles = function(cellhandles, show, moveshow) {
var cell, cell2, position, position2;
var editor = cellhandles.editor;
var doshow = false;
var row, col, viewport;
if (!editor) return;
do { // a block that can you can "break" out of easily
if (!show) break;
row = editor.ecell.row;
col = editor.ecell.col;
if (editor.state != "start") break;
if (row >= editor.lastvisiblerow) break;
if (col >= editor.lastvisiblecol) break;
if (row < editor.firstscrollingrow) break;
if (col < editor.firstscrollingcol) break;
if (editor.rowpositions[row+1]+20>editor.horizontaltablecontrol.controlborder) {
break;
}
if (editor.rowpositions[row+1]-10<editor.headposition.top) {
break;
}
if (editor.colpositions[col+1]+20>editor.verticaltablecontrol.controlborder) {
break;
}
if (editor.colpositions[col+1]-30<editor.headposition.left) {
break;
}
socialcalc/socialcalctableeditor.js view on Meta::CPAN
this.main = null; // main element containing all the others
this.endcap = null; // the area at the top/left between the end and the pane slider
this.paneslider = null; // the slider to adjust the pane split
this.lessbutton = null; // the top/left scroll button
this.morebutton = null; // the bottom/right scroll button
this.scrollarea = null; // the area between the scroll buttons
this.thumb = null; // the sliding thing in the scrollarea
// computed position values:
this.controlborder = null; // left or top screen position for vertical or horizontal control
this.endcapstart = null; // top or left screen position for vertical or horizontal control
this.panesliderstart = null;
this.lessbuttonstart = null;
this.morebuttonstart = null;
this.scrollareastart = null;
this.scrollareaend = null;
this.scrollareasize = null;
this.thumbpos = null;
// constants:
this.controlthickness = scc.defaultTableControlThickness; // other dimension of complete control in pixels
this.sliderthickness = scc.defaultTCSliderThickness;
this.buttonthickness = scc.defaultTCButtonThickness;
this.thumbthickness = scc.defaultTCThumbThickness;
this.minscrollingpanesize = this.buttonthickness+this.buttonthickness+this.thumbthickness+20; // the 20 is to leave a little space
}
// Methods:
SocialCalc.TableControl.prototype.CreateTableControl = function() {return SocialCalc.CreateTableControl(this);};
SocialCalc.TableControl.prototype.PositionTableControlElements = function() {SocialCalc.PositionTableControlElements(this);};
SocialCalc.TableControl.prototype.ComputeTableControlPositions = function() {SocialCalc.ComputeTableControlPositions(this);};
// Functions:
SocialCalc.CreateTableControl = function(control) {
var s, functions, params;
var AssignID = SocialCalc.AssignID;
var setStyles = SocialCalc.setStyles;
var scc = SocialCalc.Constants;
var TooltipRegister = function(element, etype, vh) {
if (scc["s_"+etype+"Tooltip"+vh]) {
SocialCalc.TooltipRegister(element, scc["s_"+etype+"Tooltip"+vh], null);
}
}
var imageprefix = control.editor.imageprefix;
var vh = control.vertical ? "v" : "h";
control.main = document.createElement("div");
s = control.main.style;
s.height = (control.vertical ? control.size : control.controlthickness)+"px";
s.width = (control.vertical ? control.controlthickness : control.size)+"px";
s.zIndex = 0;
setStyles(control.main, scc.TCmainStyle);
s.backgroundImage="url("+imageprefix+"main-"+vh+".gif)";
if (scc.TCmainClass) control.main.className = scc.TCmainClass;
control.main.style.display="none"; // wait for layout
control.endcap = document.createElement("div");
s = control.endcap.style;
s.height = control.controlthickness+"px";
s.width = control.controlthickness+"px";
s.zIndex = 1;
s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this
s.position = "absolute";
setStyles(control.endcap, scc.TCendcapStyle);
s.backgroundImage="url("+imageprefix+"endcap-"+vh+".gif)";
if (scc.TCendcapClass) control.endcap.className = scc.TCendcapClass;
AssignID(control.editor, control.endcap, "endcap"+vh);
control.main.appendChild(control.endcap);
control.paneslider = document.createElement("div");
s = control.paneslider.style;
s.height = (control.vertical ? control.sliderthickness : control.controlthickness)+"px";
s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this
s.width = (control.vertical ? control.controlthickness : control.sliderthickness)+"px";
s.position = "absolute";
s[control.vertical?"top":"left"] = "4px";
s.zIndex = 3;
setStyles(control.paneslider, scc.TCpanesliderStyle);
s.backgroundImage="url("+imageprefix+"paneslider-"+vh+".gif)";
if (scc.TCpanesliderClass) control.paneslider.className = scc.TCpanesliderClass;
AssignID(control.editor, control.paneslider, "paneslider"+vh);
TooltipRegister(control.paneslider, "paneslider", vh);
functions = {MouseDown:SocialCalc.TCPSDragFunctionStart,
MouseMove: SocialCalc.TCPSDragFunctionMove,
MouseUp: SocialCalc.TCPSDragFunctionStop,
Disabled: function() {return control.editor.busy;}};
functions.control = control; // make sure this is there
SocialCalc.DragRegister(control.paneslider, control.vertical, !control.vertical, functions);
control.main.appendChild(control.paneslider);
control.lessbutton = document.createElement("div");
s = control.lessbutton.style;
s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px";
s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px";
s.zIndex = 2;
s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this
s.position = "absolute";
setStyles(control.lessbutton, scc.TClessbuttonStyle);
s.backgroundImage="url("+imageprefix+"less-"+vh+"n.gif)"
if (scc.TClessbuttonClass) control.lessbutton.className = scc.TClessbuttonClass;
AssignID(control.editor, control.lessbutton, "lessbutton"+vh);
params = {repeatwait:scc.TClessbuttonRepeatWait, repeatinterval:scc.TClessbuttonRepeatInterval,
normalstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"n.gif);",
downstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"d.gif);",
hoverstyle: "backgroundImage:url("+imageprefix+"less-"+vh+"h.gif);"};
functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);},
Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, -1);},
Disabled: function() {return control.editor.busy;}};
SocialCalc.ButtonRegister(control.lessbutton, params, functions);
control.main.appendChild(control.lessbutton);
control.morebutton = document.createElement("div");
s = control.morebutton.style;
s.height = (control.vertical ? control.buttonthickness : control.controlthickness)+"px";
s.width = (control.vertical ? control.controlthickness : control.buttonthickness)+"px";
s.zIndex = 2;
s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this
s.position = "absolute";
setStyles(control.morebutton, scc.TCmorebuttonStyle);
s.backgroundImage="url("+imageprefix+"more-"+vh+"n.gif)"
if (scc.TCmorebuttonClass) control.morebutton.className = scc.TCmorebuttonClass;
AssignID(control.editor, control.morebutton, "morebutton"+vh);
params = {repeatwait:scc.TCmorebuttonRepeatWait, repeatinterval:scc.TCmorebuttonRepeatInterval,
normalstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"n.gif);",
downstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"d.gif);",
hoverstyle: "backgroundImage:url("+imageprefix+"more-"+vh+"h.gif);"};
functions = {MouseDown:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);},
Repeat:function(){if(!control.editor.busy) control.editor.ScrollRelative(control.vertical, +1);},
Disabled: function() {return control.editor.busy;}};
SocialCalc.ButtonRegister(control.morebutton, params, functions);
control.main.appendChild(control.morebutton);
control.scrollarea = document.createElement("div");
s = control.scrollarea.style;
s.height = control.controlthickness+"px";
s.width = control.controlthickness+"px";
s.zIndex = 1;
s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this
s.position = "absolute";
setStyles(control.scrollarea, scc.TCscrollareaStyle);
s.backgroundImage="url("+imageprefix+"scrollarea-"+vh+".gif)";
if (scc.TCscrollareaClass) control.scrollarea.className = scc.TCscrollareaClass;
AssignID(control.editor, control.scrollarea, "scrollarea"+vh);
params = {repeatwait:scc.TCscrollareaRepeatWait, repeatinterval:scc.TCscrollareaRepeatWait};
functions = {MouseDown:SocialCalc.ScrollAreaClick, Repeat:SocialCalc.ScrollAreaClick,
Disabled: function() {return control.editor.busy;}};
functions.control = control;
SocialCalc.ButtonRegister(control.scrollarea, params, functions);
control.main.appendChild(control.scrollarea);
control.thumb = document.createElement("div");
s = control.thumb.style;
s.height = (control.vertical ? control.thumbthickness : control.controlthickness)+"px";
s.width = (control.vertical ? control.controlthickness : control.thumbthickness)+"px";
s.zIndex = 2;
s.overflow = "hidden"; // IE will make the DIV at least font-size height...so use this
s.position = "absolute";
setStyles(control.thumb, scc.TCthumbStyle);
control.thumb.style.backgroundImage="url("+imageprefix+"thumb-"+vh+"n.gif)";
if (scc.TCthumbClass) control.thumb.className = scc.TCthumbClass;
AssignID(control.editor, control.thumb, "thumb"+vh);
functions = {MouseDown:SocialCalc.TCTDragFunctionStart,
MouseMove: SocialCalc.TCTDragFunctionMove,
MouseUp: SocialCalc.TCTDragFunctionStop,
Disabled: function() {return control.editor.busy;}};
functions.control = control; // make sure this is there
SocialCalc.DragRegister(control.thumb, control.vertical, !control.vertical, functions);
params = {normalstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"n.gif)", name:"Thumb",
downstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"d.gif)",
hoverstyle: "backgroundImage:url("+imageprefix+"thumb-"+vh+"h.gif)"};
SocialCalc.ButtonRegister(control.thumb, params, null); // give it button-like visual behavior
control.main.appendChild(control.thumb);
return control.main;
}
//
// ScrollAreaClick - Button function to process pageup/down clicks
//
SocialCalc.ScrollAreaClick = function(e, buttoninfo, bobj) {
var control = bobj.functionobj.control;
var bposition = SocialCalc.GetElementPosition(bobj.element);
var clickpos = control.vertical ? buttoninfo.clientY : buttoninfo.clientX;
if (control.editor.busy) { // ignore if busy - wait for next repeat
return;
}
control.editor.PageRelative(control.vertical, clickpos > control.thumbpos ? 1 : -1);
return;
}
//
// PositionTableControlElements
//
SocialCalc.PositionTableControlElements = function(control) {
var border, realend, thumbpos;
var editor = control.editor;
if (control.vertical) {
border = control.controlborder+"px";
control.endcap.style.top = control.endcapstart+"px";
control.endcap.style.left = border;
control.paneslider.style.top = control.panesliderstart+"px";
control.paneslider.style.left = border
control.lessbutton.style.top = control.lessbuttonstart+"px";
control.lessbutton.style.left = border;
control.morebutton.style.top = control.morebuttonstart+"px";
control.morebutton.style.left = border;
control.scrollarea.style.top = control.scrollareastart+"px";
control.scrollarea.style.left = border;
control.scrollarea.style.height = control.scrollareasize+"px";
realend = Math.max(editor.context.sheetobj.attribs.lastrow, editor.firstscrollingrow+1);
thumbpos = ((editor.firstscrollingrow-(editor.lastnonscrollingrow+1))*(control.scrollareasize-3*control.thumbthickness))/
(realend-(editor.lastnonscrollingrow+1))+control.scrollareastart-1;
thumbpos = Math.floor(thumbpos);
control.thumb.style.top = thumbpos+"px";
control.thumb.style.left = border;
}
else {
border = control.controlborder+"px";
control.endcap.style.left = control.endcapstart+"px";
control.endcap.style.top = border;
socialcalc/socialcalctableeditor.js view on Meta::CPAN
control.thumbpos = thumbpos;
control.main.style.display="block";
}
//
// ComputeTableControlPositions
//
// This routine computes the screen positions and other values needed for laying out
// the table control elements.
//
SocialCalc.ComputeTableControlPositions = function(control) {
var editor = control.editor;
if (!editor.gridposition || !editor.headposition) throw("Can't compute table control positions before editor positions");
if (control.vertical) {
control.controlborder = editor.gridposition.left+editor.tablewidth; // border=left position
control.endcapstart = editor.gridposition.top; // start=top position
control.panesliderstart = editor.firstscrollingrowtop-control.sliderthickness;
control.lessbuttonstart = editor.firstscrollingrowtop-1;
control.morebuttonstart = editor.gridposition.top+editor.tableheight-control.buttonthickness;
control.scrollareastart = editor.firstscrollingrowtop-1+control.buttonthickness;
control.scrollareaend = control.morebuttonstart-1;
control.scrollareasize = control.scrollareaend-control.scrollareastart+1;
}
else {
control.controlborder = editor.gridposition.top+editor.tableheight; // border=top position
control.endcapstart = editor.gridposition.left; // start=left position
control.panesliderstart = editor.firstscrollingcolleft-control.sliderthickness;
control.lessbuttonstart = editor.firstscrollingcolleft-1;
control.morebuttonstart = editor.gridposition.left+editor.tablewidth-control.buttonthickness;
control.scrollareastart = editor.firstscrollingcolleft-1+control.buttonthickness;
control.scrollareaend = control.morebuttonstart-1;
control.scrollareasize = control.scrollareaend-control.scrollareastart+1;
}
}
////// TCPS - TableControl Pan Slider methods
//
// TCPSDragFunctionStart(event, draginfo, dobj)
//
// TableControlPaneSlider function for starting drag
//
SocialCalc.TCPSDragFunctionStart = function(event, draginfo, dobj) {
var editor = dobj.functionobj.control.editor;
var scc = SocialCalc.Constants;
SocialCalc.DragFunctionStart(event, draginfo, dobj);
draginfo.trackingline = document.createElement("div");
draginfo.trackingline.style.height = dobj.vertical ? scc.TCPStrackinglineThickness :
(editor.tableheight-(editor.headposition.top-editor.gridposition.top))+"px";
draginfo.trackingline.style.width = dobj.vertical ?
(editor.tablewidth-(editor.headposition.left-editor.gridposition.left))+"px" : scc.TCPStrackinglineThickness;
draginfo.trackingline.style.backgroundImage="url("+editor.imageprefix+"trackingline-"+(dobj.vertical?"v":"h")+".gif)";;
if (scc.TCPStrackinglineClass) draginfo.trackingline.className = scc.TCPStrackinglineClass;
SocialCalc.setStyles(draginfo.trackingline, scc.TCPStrackinglineStyle);
if (dobj.vertical) {
row = SocialCalc.Lookup(draginfo.clientY+dobj.functionobj.control.sliderthickness, editor.rowpositions);
draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px";
draginfo.trackingline.style.left = editor.headposition.left+"px";
if (editor.context.rowpanes.length-1) { // has 2 already
editor.context.SetRowPaneFirstLast(1, editor.context.rowpanes[0].last+1, editor.context.rowpanes[0].last+1);
editor.FitToEditTable();
editor.ScheduleRender();
}
}
else {
col = SocialCalc.Lookup(draginfo.clientX+dobj.functionobj.control.sliderthickness, editor.colpositions);
draginfo.trackingline.style.top = editor.headposition.top+"px";
draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px";
if (editor.context.colpanes.length-1) { // has 2 already
editor.context.SetColPaneFirstLast(1, editor.context.colpanes[0].last+1, editor.context.colpanes[0].last+1);
editor.FitToEditTable();
editor.ScheduleRender();
}
}
editor.griddiv.appendChild(draginfo.trackingline);
}
//
// TCPSDragFunctionMove(event, draginfo, dobj)
//
SocialCalc.TCPSDragFunctionMove = function(event, draginfo, dobj) {
var row, col, max, min;
var control = dobj.functionobj.control;
var sliderthickness = control.sliderthickness;
var editor = control.editor;
if (dobj.vertical) {
max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetY; // restrict movement
if (draginfo.clientY > max) draginfo.clientY = max;
min = editor.headposition.top - sliderthickness - draginfo.offsetY;
if (draginfo.clientY < min) draginfo.clientY = min;
row = SocialCalc.Lookup(draginfo.clientY+sliderthickness, editor.rowpositions);
draginfo.trackingline.style.top = (editor.rowpositions[row] || editor.headposition.top)+"px";
}
else {
max = control.morebuttonstart - control.minscrollingpanesize - draginfo.offsetX;
if (draginfo.clientX > max) draginfo.clientX = max;
min = editor.headposition.left - sliderthickness - draginfo.offsetX;
if (draginfo.clientX < min) draginfo.clientX = min;
col = SocialCalc.Lookup(draginfo.clientX+sliderthickness, editor.colpositions);
draginfo.trackingline.style.left = (editor.colpositions[col] || editor.headposition.left)+"px";
}
SocialCalc.DragFunctionPosition(event, draginfo, dobj);
( run in 0.861 second using v1.01-cache-2.11-cpan-f56aa216473 )