App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/socialcalcviewer.js view on Meta::CPAN
SocialCalc.CurrentSpreadsheetViewerObject = null; // right now there can only be one active at a time
// Constructor:
SocialCalc.SpreadsheetViewer = function() {
var scc = SocialCalc.Constants;
// Properties:
this.parentNode = null;
this.spreadsheetDiv = null;
this.requestedHeight = 0;
this.requestedWidth = 0;
this.requestedSpaceBelow = 0;
this.height = 0;
this.width = 0;
this.viewheight = 0; // calculated amount for views below toolbar, etc.
// Dynamic properties:
this.sheet = null;
this.context = null;
this.editor = null;
this.spreadsheetDiv = null;
this.editorDiv = null;
this.sortrange = ""; // remembered range for sort tab
// Constants:
this.idPrefix = "SocialCalc-"; // prefix added to element ids used here, should end in "-"
this.imagePrefix = scc.defaultImagePrefix; // prefix added to img src
this.statuslineheight = scc.SVStatuslineheight; // in pixels
this.statuslineCSS = scc.SVStatuslineCSS;
// Callbacks:
// Initialization Code:
this.sheet = new SocialCalc.Sheet();
this.context = new SocialCalc.RenderContext(this.sheet);
this.context.showGrid=true;
this.context.showRCHeaders=true;
this.editor = new SocialCalc.TableEditor(this.context);
this.editor.noEdit = true;
this.editor.StatusCallback.statusline =
{func: SocialCalc.SpreadsheetViewerStatuslineCallback,
params: {}};
this.hasStatusLine = true; // default
// this.statuslineHTML = '<table cellspacing="0" cellpadding="0"><tr><td width="100%" style="overflow:hidden;">{status}</td><td><a href="">Will be link</a></td></tr></table>';
this.statuslineHTML = '<table cellspacing="0" cellpadding="0"><tr><td width="100%" style="overflow:hidden;">{status}</td><td> </td></tr></table>';
this.statuslineFull = true;
this.noRecalc = true; // don't do a recalc when loaded, so no need for external sheet routines
// Repeating macro info
this.repeatingMacroTimer = null;
this.repeatingMacroInterval = 60; // default to 60 seconds
this.repeatingMacroCommands = ""; // what to execute
SocialCalc.CurrentSpreadsheetViewerObject = this; // remember this for rendezvousing on events
return;
}
// Methods:
SocialCalc.SpreadsheetViewer.prototype.InitializeSpreadsheetViewer =
function(node, height, width, spacebelow) {return SocialCalc.InitializeSpreadsheetViewer(this, node, height, width, spacebelow);};
SocialCalc.SpreadsheetViewer.prototype.LoadSave = function(str) {return SocialCalc.SpreadsheetViewerLoadSave(this, str);};
SocialCalc.SpreadsheetViewer.prototype.DoOnResize = function() {return SocialCalc.DoOnResize(this);};
SocialCalc.SpreadsheetViewer.prototype.SizeSSDiv = function() {return SocialCalc.SizeSSDiv(this);};
SocialCalc.SpreadsheetViewer.prototype.DecodeSpreadsheetSave =
function(str) {return SocialCalc.SpreadsheetViewerDecodeSpreadsheetSave(this, str);};
// Sheet Methods to make things a little easier:
SocialCalc.SpreadsheetViewer.prototype.ParseSheetSave = function(str) {return this.sheet.ParseSheetSave(str);};
// Functions:
//
// InitializeSpreadsheetViewer(spreadsheet, node, height, width, spacebelow)
//
// Creates the control elements and makes them the child of node (string or element).
// If present, height and width specify size.
// If either is 0 or null (missing), the maximum that fits on the screen
// (taking spacebelow into account) is used.
//
// You should do a redisplay or recalc (which redisplays) after running this.
//
SocialCalc.InitializeSpreadsheetViewer = function(spreadsheet, node, height, width, spacebelow) {
var scc = SocialCalc.Constants;
var SCLoc = SocialCalc.LocalizeString;
var SCLocSS = SocialCalc.LocalizeSubstrings;
var html, child, i, vname, v, style, button, bele;
var tabs = spreadsheet.tabs;
var views = spreadsheet.views;
spreadsheet.requestedHeight = height;
spreadsheet.requestedWidth = width;
spreadsheet.requestedSpaceBelow = spacebelow;
if (typeof node == "string") node = document.getElementById(node);
if (node == null) {
alert("SocialCalc.SpreadsheetControl not given parent node.");
}
spreadsheet.parentNode = node;
// create node to hold spreadsheet view
socialcalc/socialcalcviewer.js view on Meta::CPAN
for (child=node.firstChild; child!=null; child=node.firstChild) {
node.removeChild(child);
}
node.appendChild(spreadsheet.spreadsheetDiv);
// create sheet div
spreadsheet.nonviewheight = spreadsheet.hasStatusLine ? spreadsheet.statuslineheight : 0;
spreadsheet.viewheight = spreadsheet.height-spreadsheet.nonviewheight;
spreadsheet.editorDiv=spreadsheet.editor.CreateTableEditor(spreadsheet.width, spreadsheet.viewheight);
spreadsheet.spreadsheetDiv.appendChild(spreadsheet.editorDiv);
// create statusline
if (spreadsheet.hasStatusLine) {
spreadsheet.statuslineDiv = document.createElement("div");
spreadsheet.statuslineDiv.style.cssText = spreadsheet.statuslineCSS;
spreadsheet.statuslineDiv.style.height = spreadsheet.statuslineheight -
(spreadsheet.statuslineDiv.style.paddingTop.slice(0,-2)-0) -
(spreadsheet.statuslineDiv.style.paddingBottom.slice(0,-2)-0) + "px";
spreadsheet.statuslineDiv.id = spreadsheet.idPrefix+"statusline";
spreadsheet.spreadsheetDiv.appendChild(spreadsheet.statuslineDiv);
spreadsheet.editor.StatusCallback.statusline =
{func: SocialCalc.SpreadsheetViewerStatuslineCallback,
params: {spreadsheetobj:spreadsheet}};
}
// done - refresh screen needed
return;
}
SocialCalc.SpreadsheetViewerLoadSave = function(spreadsheet, savestr) {
var rmstr, pos, t, t2;
var parts = spreadsheet.DecodeSpreadsheetSave(savestr);
if (parts) {
if (parts.sheet) {
spreadsheet.sheet.ResetSheet();
spreadsheet.sheet.ParseSheetSave(savestr.substring(parts.sheet.start, parts.sheet.end));
}
if (parts.edit) {
spreadsheet.editor.LoadEditorSettings(savestr.substring(parts.edit.start, parts.edit.end));
}
if (parts.startupmacro) { // executed now
spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true);
}
if (parts.repeatingmacro) { // first line tells how many seconds before first execution. Last cmd must be "cmdextension repeatmacro delay" to continue repeating.
rmstr = savestr.substring(parts.repeatingmacro.start, parts.repeatingmacro.end);
rmstr = rmstr.replace("\r", ""); // make sure no CR, only LF
pos = rmstr.indexOf("\n");
if (pos > 0) {
t = rmstr.substring(0, pos)-0; // get number
t2 = t;
// if (!(t > 0)) t = 60; // handles NAN, too
spreadsheet.repeatingMacroInterval = t;
spreadsheet.repeatingMacroCommands = rmstr.substring(pos+1);
if (t2 > 0) { // zero means don't start yet
spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000);
}
}
}
}
if (spreadsheet.editor.context.sheetobj.attribs.recalc=="off" || spreadsheet.noRecalc) {
spreadsheet.editor.ScheduleRender();
}
else {
spreadsheet.editor.EditorScheduleSheetCommands("recalc");
}
}
//
// SocialCalc.SpreadsheetViewerDoRepeatingMacro
//
// Called by a timer. Executes repeatingMacroCommands once.
// Use the "startcmdextension repeatmacro delay" command last to schedule this again.
//
SocialCalc.SpreadsheetViewerDoRepeatingMacro = function() {
var spreadsheet = SocialCalc.GetSpreadsheetViewerObject();
var editor = spreadsheet.editor;
spreadsheet.repeatingMacroTimer = null;
SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.repeatmacro = {func:SocialCalc.SpreadsheetViewerRepeatMacroCommand, data:null};
editor.EditorScheduleSheetCommands(spreadsheet.repeatingMacroCommands);
}
SocialCalc.SpreadsheetViewerRepeatMacroCommand = function(name, data, sheet, cmd, saveundo) {
var spreadsheet = SocialCalc.GetSpreadsheetViewerObject();
var rest = cmd.RestOfString();
var t = rest-0; // get number
if (!(t > 0)) t = spreadsheet.repeatingMacroInterval; // handles NAN, too, using last value
spreadsheet.repeatingMacroInterval = t;
spreadsheet.repeatingMacroTimer = window.setTimeout(SocialCalc.SpreadsheetViewerDoRepeatingMacro, spreadsheet.repeatingMacroInterval * 1000);
}
SocialCalc.SpreadsheetViewerStopRepeatingMacro = function() {
var spreadsheet = SocialCalc.GetSpreadsheetViewerObject();
if (spreadsheet.repeatingMacroTimer) {
window.clearTimeout(spreadsheet.repeatingMacroTimer);
spreadsheet.repeatingMacroTimer = null;
}
}
//
// SocialCalc.SpreadsheetViewerDoButtonCmd(e, buttoninfo, bobj)
//
// xxx
//
SocialCalc.SpreadsheetViewerDoButtonCmd = function(e, buttoninfo, bobj) {
var obj = bobj.element;
var which = bobj.functionobj.command;
var spreadsheet = SocialCalc.GetSpreadsheetViewerObject();
var editor = spreadsheet.editor;
switch (which) {
case "recalc":
editor.EditorScheduleSheetCommands("recalc");
break;
default:
break;
}
if (obj && obj.blur) obj.blur();
SocialCalc.KeyboardFocus();
}
//
// outstr = SocialCalc.LocalizeString(str)
//
// SocialCalc function to make localization easier.
// If str is "Text to localize", it returns
// SocialCalc.Constants.s_loc_text_to_localize if
// it exists, or else with just "Text to localize".
// Note that spaces are replaced with "_" and other special
// chars with "X" in the name of the constant (e.g., "A & B"
// would look for SocialCalc.Constants.s_loc_a_X_b.
//
SocialCalc.LocalizeString = function(str) {
var cstr = SocialCalc.LocalizeStringList[str]; // found already this session?
if (!cstr) { // no - look up
cstr = SocialCalc.Constants["s_loc_"+str.toLowerCase().replace(/\s/g, "_").replace(/\W/g, "X")] || str;
SocialCalc.LocalizeStringList[str] = cstr;
}
return cstr;
}
SocialCalc.LocalizeStringList = {}; // a list of strings to localize accumulated by the routine
//
// outstr = SocialCalc.LocalizeSubstrings(str)
//
// SocialCalc function to make localization easier using %loc and %scc.
//
( run in 1.759 second using v1.01-cache-2.11-cpan-97f6503c9c8 )