mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-14 16:59:55 +09:00
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@4968 201d5d3c-b55e-5fd7-737f-ddc643e51545
215 lines
No EOL
5.4 KiB
JavaScript
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;
|
|
} |