App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/socialcalc-3.js view on Meta::CPAN
this.tos += 1;
return true;
}
else {
return false;
}
}
// *************************************
//
// Clipboard Object:
//
// This is a single object.
// Stores the clipboard, which is shared by all active sheets.
// Like the undo stack, it does not persist from one editing session to another.
//
// *************************************
SocialCalc.Clipboard = {
// properties:
clipboard: "" // empty or string in save format with "copiedfrom:" set to a range
}
// *************************************
//
// RenderContext class:
//
// *************************************
SocialCalc.RenderContext = function(sheetobj) {
var parts, num, s;
var attribs = sheetobj.attribs;
var scc = SocialCalc.Constants;
// properties:
this.sheetobj = sheetobj;
this.hideRowsCols = false; // Rendering with panes only works with "false"
// !!!! Note: not implemented yet in rendering, just saved as an attribute
this.showGrid = false;
this.showRCHeaders = false;
this.rownamewidth = scc.defaultRowNameWidth;
this.pixelsPerRow = scc.defaultAssumedRowHeight;
this.cellskip = {}; // if present, coord of cell covering this cell
this.coordToCR = {}; // for cells starting spans, coordToCR[coord]={row:row, col:col}
this.colwidth = []; // precomputed column widths, taking into account defaults
this.totalwidth = 0; // precomputed total table width
this.rowpanes = []; // for each pane, {first: firstrow, last: lastrow}
this.colpanes = []; // for each pane, {first: firstrow, last: lastrow}
this.maxcol=0; // max col and row to display, adding long spans, etc.
this.maxrow=0;
this.highlights = {}; // for each cell with special display: coord:highlightType (see this.highlightTypes)
this.cursorsuffix = ""; // added to highlights[cr]=="cursor" to get type to lookup
this.highlightTypes = // attributes to change when highlit
{
cursor: {style: scc.defaultHighlightTypeCursorStyle, className: scc.defaultHighlightTypeCursorClass},
range: {style: scc.defaultHighlightTypeRangeStyle, className: scc.defaultHighlightTypeRangeClass},
cursorinsertup: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-x;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertup.gif);", className: scc.defaultHighlightTypeCursorClass},
cursorinsertleft: {style: "color:#FFF;backgroundColor:#A6A6A6;backgroundRepeat:repeat-y;backgroundPosition:top left;backgroundImage:url("+scc.defaultImagePrefix+"cursorinsertleft.gif);", className: scc.defaultHighlightTypeCursorClass},
range2: {style: "color:#000;backgroundColor:#FFF;backgroundImage:url("+scc.defaultImagePrefix+"range2.gif);", className: ""}
}
this.cellIDprefix = scc.defaultCellIDPrefix; // if non-null, each cell will render with an ID
this.defaultlinkstyle = null; // default linkstyle object (allows you to pass values to link renderer)
this.defaultHTMLlinkstyle = {type: "html"}; // default linkstyle for standalone HTML
// constants:
this.defaultfontstyle = scc.defaultCellFontStyle;
this.defaultfontsize = scc.defaultCellFontSize;
this.defaultfontfamily = scc.defaultCellFontFamily;
this.defaultlayout = scc.defaultCellLayout;
this.defaultpanedividerwidth = scc.defaultPaneDividerWidth;
this.defaultpanedividerheight = scc.defaultPaneDividerHeight;
this.gridCSS = scc.defaultGridCSS;
this.commentClassName = scc.defaultCommentClass; // for cells with non-blank comments when this.showGrid is true
this.commentCSS = scc.defaultCommentStyle; // any combination of classnames and styles may be used
this.commentNoGridClassName = scc.defaultCommentNoGridClass; // for cells when this.showGrid is false
this.commentNoGridCSS = scc.defaultCommentNoGridStyle; // any combination of classnames and styles may be used
this.classnames = // any combination of classnames and explicitStyles can be used
{
colname: scc.defaultColnameClass,
rowname: scc.defaultRownameClass,
selectedcolname: scc.defaultSelectedColnameClass,
selectedrowname: scc.defaultSelectedRownameClass,
upperleft: scc.defaultUpperLeftClass,
skippedcell: scc.defaultSkippedCellClass,
panedivider: scc.defaultPaneDividerClass
};
this.explicitStyles = // these may be used so you won't need a stylesheet with the classnames
{
colname: scc.defaultColnameStyle,
rowname: scc.defaultRownameStyle,
selectedcolname: scc.defaultSelectedColnameStyle,
selectedrowname: scc.defaultSelectedRownameStyle,
upperleft: scc.defaultUpperLeftStyle,
skippedcell: scc.defaultSkippedCellStyle,
panedivider: scc.defaultPaneDividerStyle
};
// processed info about cell skipping
this.cellskip = null;
this.needcellskip = true;
// precomputed values, filling in defaults indicated by "*"
this.fonts=[]; // for each fontnum, {style: fs, weight: fw, size: fs, family: ff}
this.layouts=[]; // for each layout, "padding:Tpx Rpx Bpx Lpx;vertical-align:va;"
this.needprecompute = true; // need to call PrecomputeSheetFontsAndLayouts
socialcalc/socialcalc-3.js view on Meta::CPAN
}
else {
stylestr+="text-align:right;";
}
}
else stylestr+="text-align:left;";
}
num=cell.bt;
if (num) stylestr+="border-top:"+sheetobj.borderstyles[num]+";";
num=cell.br;
if (num) stylestr+="border-right:"+sheetobj.borderstyles[num]+";";
else if (context.showGrid) {
if (context.CellInPane(rownum, colnum+(cell.colspan || 1), rowpane, colpane))
t=SocialCalc.crToCoord(colnum+(cell.colspan || 1), rownum);
else t="nomatch";
if (context.cellskip[t]) t=context.cellskip[t];
if (!sheetobj.cells[t] || !sheetobj.cells[t].bl)
stylestr+="border-right:"+context.gridCSS;
}
num=cell.bb;
if (num) stylestr+="border-bottom:"+sheetobj.borderstyles[num]+";";
else if (context.showGrid) {
if (context.CellInPane(rownum+(cell.rowspan || 1), colnum, rowpane, colpane))
t=SocialCalc.crToCoord(colnum, rownum+(cell.rowspan || 1));
else t="nomatch";
if (context.cellskip[t]) t=context.cellskip[t];
if (!sheetobj.cells[t] || !sheetobj.cells[t].bt)
stylestr+="border-bottom:"+context.gridCSS;
}
num=cell.bl;
if (num) stylestr+="border-left:"+sheetobj.borderstyles[num]+";";
if (cell.comment) {
if (context.showGrid) {
if (context.commentClassName) {
result.className = (result.className ? result.className+" " : "") + context.commentClassName;
}
stylestr+=context.commentCSS;
}
else {
if (context.commentNoGridClassName) {
result.className = (result.className ? result.className+" " : "") + context.commentNoGridClassName;
}
stylestr+=context.commentNoGridCSS;
}
}
result.style.cssText=stylestr;
//!!!!!!!!!
// NOTE: csss and cssc are not supported yet.
// csss needs to be parsed into pieces to override just the attributes specified, not all with assignment to cssText.
// cssc just needs to set the className.
t = context.highlights[coord];
if (t) { // this is a highlit cell: Override style appropriately
if (t=="cursor") t += context.cursorsuffix; // cursor can take alternative forms
if (context.highlightTypes[t].className) {
result.className = (result.className ? result.className+" " : "") + context.highlightTypes[t].className;
}
SocialCalc.setStyles(result, context.highlightTypes[t].style);
}
return result;
}
SocialCalc.CoordInPane = function(context, coord, rowpane, colpane) {
var coordToCR = context.coordToCR[coord];
if (!coordToCR || !coordToCR.row || !coordToCR.col) throw "Bad coordToCR for "+coord;
return context.CellInPane(coordToCR.row, coordToCR.col, rowpane, colpane);
}
SocialCalc.CellInPane = function(context, row, col, rowpane, colpane) {
var panerowlimits = context.rowpanes[rowpane];
var panecollimits = context.colpanes[colpane];
if (!panerowlimits || !panecollimits) throw "CellInPane called with unknown panes "+rowpane+"/"+colpane;
if (row < panerowlimits.first || row > panerowlimits.last) return false;
if (col < panecollimits.first || col > panecollimits.last) return false;
return true;
}
SocialCalc.CreatePseudoElement = function() {
return {style:{cssText:""}, innerHTML: "", className: ""};
}
// *************************************
//
// Misc. functions:
//
// *************************************
SocialCalc.rcColname = function(c) {
if (c > 702) c = 702; // maximum number of columns - ZZ
if (c < 1) c = 1;
var collow = (c - 1) % 26 + 65;
var colhigh = Math.floor((c - 1) / 26);
if (colhigh)
return String.fromCharCode(colhigh + 64) + String.fromCharCode(collow);
else
return String.fromCharCode(collow);
}
SocialCalc.letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
SocialCalc.crToCoord = function(c, r) {
var result;
if (c < 1) c = 1;
if (c > 702) c = 702; // maximum number of columns - ZZ
if (r < 1) r = 1;
var collow = (c - 1) % 26;
var colhigh = Math.floor((c - 1) / 26);
if (colhigh)
result = SocialCalc.letters[colhigh-1] + SocialCalc.letters[collow] + r;
else
( run in 2.784 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )