rhymix/modules/editor/skins/xquared/javascripts/RichTable.js
haneul 7c3b336e41 17223554 : xquared upgrade to 0.7
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@4968 201d5d3c-b55e-5fd7-737f-ddc643e51545
2008-11-24 08:52:19 +00:00

215 lines
No EOL
5.4 KiB
JavaScript

/**
* @requires Xquared.js
* @requires rdom/Base.js
*/
xq.RichTable = xq.Class(/** @lends xq.RichTable.prototype */{
/**
* TODO: Add description
*
* @constructs
*/
initialize: function(rdom, table) {
xq.addToFinalizeQueue(this);
this.rdom = rdom;
this.table = table;
},
insertNewRowAt: function(tr, where) {
var row = this.rdom.createElement("TR");
var cells = tr.cells;
for(var i = 0; i < cells.length; i++) {
var cell = this.rdom.createElement(cells[i].nodeName);
this.rdom.correctEmptyElement(cell);
row.appendChild(cell);
}
return this.rdom.insertNodeAt(row, tr, where);
},
insertNewCellAt: function(cell, where) {
// collect cells;
var cells = [];
var x = this.getXIndexOf(cell);
var y = 0;
while(true) {
var cur = this.getCellAt(x, y);
if(!cur) break;
cells.push(cur);
y++;
}
// insert new cells
for(var i = 0; i < cells.length; i++) {
var cell = this.rdom.createElement(cells[i].nodeName);
this.rdom.correctEmptyElement(cell);
this.rdom.insertNodeAt(cell, cells[i], where);
}
},
deleteRow: function(tr) {
return this.rdom.removeBlock(tr);
},
deleteCell: function(cell) {
if(!cell.previousSibling && !cell.nextSibling) {
this.rdom.deleteNode(this.table);
return;
}
// collect cells;
var cells = [];
var x = this.getXIndexOf(cell);
var y = 0;
while(true) {
var cur = this.getCellAt(x, y);
if(!cur) break;
cells.push(cur);
y++;
}
for(var i = 0; i < cells.length; i++) {
this.rdom.deleteNode(cells[i]);
}
},
getPreviousCellOf: function(cell) {
if(cell.previousSibling) return cell.previousSibling;
var adjRow = this.getPreviousRowOf(cell.parentNode);
if(adjRow) return adjRow.lastChild;
return null;
},
getNextCellOf: function(cell) {
if(cell.nextSibling) return cell.nextSibling;
var adjRow = this.getNextRowOf(cell.parentNode);
if(adjRow) return adjRow.firstChild;
return null;
},
getPreviousRowOf: function(row) {
if(row.previousSibling) return row.previousSibling;
var rowContainer = row.parentNode;
if(rowContainer.previousSibling && rowContainer.previousSibling.lastChild) return rowContainer.previousSibling.lastChild;
return null;
},
getNextRowOf: function(row) {
if(row.nextSibling) return row.nextSibling;
var rowContainer = row.parentNode;
if(rowContainer.nextSibling && rowContainer.nextSibling.firstChild) return rowContainer.nextSibling.firstChild;
return null;
},
getAboveCellOf: function(cell) {
var row = this.getPreviousRowOf(cell.parentNode);
if(!row) return null;
var x = this.getXIndexOf(cell);
return row.cells[x];
},
getBelowCellOf: function(cell) {
var row = this.getNextRowOf(cell.parentNode);
if(!row) return null;
var x = this.getXIndexOf(cell);
return row.cells[x];
},
getXIndexOf: function(cell) {
var row = cell.parentNode;
for(var i = 0; i < row.cells.length; i++) {
if(row.cells[i] === cell) return i;
}
return -1;
},
getYIndexOf: function(cell) {
var y = -1;
// find y
var group = row.parentNode;
for(var i = 0; i <group.rows.length; i++) {
if(group.rows[i] === row) {
y = i;
break;
}
}
if(this.hasHeadingAtTop() && group.nodeName === "TBODY") y = y + 1;
return y;
},
/**
* TODO: Not used. Delete or not?
*/
getLocationOf: function(cell) {
var x = this.getXIndexOf(cell);
var y = this.getYIndexOf(cell);
return {x:x, y:y};
},
getCellAt: function(col, row) {
var row = this.getRowAt(row);
return (row && row.cells.length > col) ? row.cells[col] : null;
},
getRowAt: function(index) {
if(this.hasHeadingAtTop()) {
return index === 0 ? this.table.tHead.rows[0] : this.table.tBodies[0].rows[index - 1];
} else {
var rows = this.table.tBodies[0].rows;
return (rows.length > index) ? rows[index] : null;
}
},
getDom: function() {
return this.table;
},
hasHeadingAtTop: function() {
return !!(this.table.tHead && this.table.tHead.rows[0]);
},
hasHeadingAtLeft: function() {
return this.table.tBodies[0].rows[0].cells[0].nodeName === "TH";
},
correctEmptyCells: function() {
var cells = xq.$A(this.table.getElementsByTagName("TH"));
var tds = xq.$A(this.table.getElementsByTagName("TD"));
for(var i = 0; i < tds.length; i++) {
cells.push(tds[i]);
}
for(var i = 0; i < cells.length; i++) {
if(this.rdom.isEmptyBlock(cells[i])) this.rdom.correctEmptyElement(cells[i])
}
}
});
xq.RichTable.create = function(rdom, cols, rows, headerPositions) {
if(["t", "tl", "lt"].indexOf(headerPositions) !== -1) var headingAtTop = true
if(["l", "tl", "lt"].indexOf(headerPositions) !== -1) var headingAtLeft = true
var sb = []
sb.push('<table class="datatable">')
// thead
if(headingAtTop) {
sb.push('<thead><tr>')
for(var i = 0; i < cols; i++) sb.push('<th></th>')
sb.push('</tr></thead>')
rows -= 1
}
// tbody
sb.push('<tbody>')
for(var i = 0; i < rows; i++) {
sb.push('<tr>')
for(var j = 0; j < cols; j++) {
if(headingAtLeft && j === 0) {
sb.push('<th></th>')
} else {
sb.push('<td></td>')
}
}
sb.push('</tr>')
}
sb.push('</tbody>')
sb.push('</table>')
// create DOM element
var container = rdom.createElement("div");
container.innerHTML = sb.join("");
// correct empty cells and return
var rtable = new xq.RichTable(rdom, container.firstChild);
rtable.correctEmptyCells();
return rtable;
}