--- test/html-whatpm/table-script.js 2007/05/27 10:00:48 1.2
+++ test/html-whatpm/table-script.js 2008/05/06 07:50:28 1.7
@@ -1,6 +1,6 @@
-function tableToCanvas (table) {
+function tableToCanvas (table, parent, idPrefix) {
var canvas = document.createElement ('canvas');
- document.body.appendChild (canvas);
+ parent.appendChild (canvas);
if (window.G_vmlCanvasManager) {
canvas = G_vmlCanvasManager.initElement (canvas);
}
@@ -16,9 +16,10 @@
rowHeight: 20,
rowSpacing: 5,
rowGroupLeft: 10,
+ rowGroupFillLeft: 20, /* Must be same as columnLeft */
rowLeft: 15,
cellTop: 20,
- cellLeft: 20,
+ cellLeft: 20, /* Must be same as columnLeft */
cellBottom: 20,
cellRight: 20,
explicitColumnGroupStrokeStyle: 'black',
@@ -37,13 +38,16 @@
dataCellFillStyle: 'rgba(0, 0, 0, 0)',
dataCellStrokeStyle: 'black',
overlappingCellFillStyle: 'red',
- overlappingCellStrokeStyle: 'rgba(0, 0, 0, 0)'
+ overlappingCellStrokeStyle: 'rgba(0, 0, 0, 0)',
+ highlightCellFillStyle: 'yellow'
};
+ canvas.drawTable = function () {
+
var columnNumber = table.column.length;
if (columnNumber < table.cell.length) columnNumber = table.cell.length;
var rowNumber = 0;
-for (var i = 1; i < table.cell.length; i++) {
+for (var i = 0; i < table.cell.length; i++) {
if (table.cell[i] && rowNumber < table.cell[i].length) {
rowNumber = table.cell[i].length;
}
@@ -60,7 +64,7 @@
+ param.cellBottom;
var y = param.rowTop;
-for (var i = 1; i < table.row_group.length; i++) {
+for (var i = 0; i < table.row_group.length; i++) {
var rg = table.row_group[i];
c2d.beginPath ();
if (rg.type == 'thead') {
@@ -79,7 +83,7 @@
c2d.stroke ();
c2d.closePath ();
c2d.beginPath ();
- c2d.rect (param.rowGroupLeft,
+ c2d.rect (param.rowGroupFillLeft,
y,
(param.columnWidth + param.columnSpacing) * columnNumber - param.columnSpacing,
dy - param.rowSpacing);
@@ -92,7 +96,7 @@
c2d.beginPath ();
c2d.strokeStyle = param.explicitColumnGroupStrokeStyle;
var x = param.columnLeft;
-for (var i = 1; i < table.column_group.length; i++) {
+for (var i = 0; i < table.column_group.length; i++) {
var cg = table.column_group[i];
c2d.moveTo (x, param.columnGroupTop);
x += (param.columnWidth + param.columnSpacing) * cg.width;
@@ -103,7 +107,7 @@
c2d.closePath ();
var x = param.columnLeft;
-for (var i = 1; i < columnNumber; i++) {
+for (var i = 0; i < columnNumber; i++) {
var c = table.column[i];
c2d.beginPath ();
c2d.moveTo (x, param.columnTop);
@@ -118,11 +122,12 @@
c2d.closePath ();
}
+var map = document.createElement ('map');
var x = param.cellLeft;
-for (var i = 1; i < table.cell.length; i++) {
+for (var i = 0; i < table.cell.length; i++) {
var y = param.cellTop;
if (!table.cell[i]) continue;
- for (var j = 1; j < table.cell[i].length; j++) {
+ for (var j = 0; j < table.cell[i].length; j++) {
var c = table.cell[i][j];
if (c && ((c[0].x == i && c[0].y == j) || c.length > 1)) {
c2d.beginPath ();
@@ -136,6 +141,20 @@
? param.headerCellFillStyle : param.dataCellFillStyle;
c2d.strokeStyle = c[0].is_header
? param.headerCellStrokeStyle : param.dataCellStrokeStyle;
+ if (c[0].id) {
+ var area = document.createElement ('area');
+ area.shape = 'rect';
+ area.coords = [x, y, x + width, y + height].join (',');
+ area.alt = 'Cell (' + c[0].x + ', ' + c[0].y + ')';
+ area.href = '#' + idPrefix + 'node-' + c[0].id;
+ area.id = idPrefix + 'cell-' + c[0].id;
+ area.onmouseover = (function (v) {
+ return function () {
+ canvas.highlightCells (v);
+ };
+ }) (c[0].header);
+ map.appendChild (area);
+ }
} else {
c2d.rect (x, y, param.columnWidth, param.rowHeight);
c2d.fillStyle = param.overlappingCellFillStyle;
@@ -151,7 +170,7 @@
}
var y = param.rowTop;
-for (var i = 1; i < rowNumber; i++) {
+for (var i = 0; i < rowNumber; i++) {
c2d.beginPath ();
c2d.moveTo (param.rowLeft, y);
y += param.rowHeight + param.rowSpacing;
@@ -164,14 +183,65 @@
c2d.stroke ();
c2d.closePath ();
}
+
+ return map;
+ }; // canvas.drawTable
+
+ canvas.highlightCells = function (cells) {
+ var c2d = this.getContext ('2d');
+
+ for (var x in cells) {
+ for (var y in cells[x]) {
+ if (cells[x][y]) {
+ var cell = table.cell[x][y][0];
+ c2d.beginPath ();
+ c2d.rect
+ (param.cellLeft + (param.columnWidth + param.columnSpacing) * x,
+ param.cellTop + (param.rowHeight + param.rowSpacing) * y,
+ (param.columnWidth + param.columnSpacing) * cell.width - param.columnSpacing,
+ (param.rowHeight + param.rowSpacing) * cell.height - param.rowSpacing);
+ c2d.fillStyle = param.highlightCellFillStyle;
+ c2d.fill ();
+ c2d.stroke ();
+ c2d.closePath ();
+ }
+ }
+ }
+ this.updateImgElement ();
+ } // canvas.highlightCells
+
+ var map = canvas.drawTable ();
+ if (map.hasChildNodes ()) {
+ var mapid = /* idPrefix + */ 'table-map-' + ++document.TableMapId;
+ map.name = mapid;
+ parent.appendChild (map);
+ var img = document.createElement ('img');
+ img.useMap = '#' + mapid;
+ canvas.updateImgElement = function () {
+ img.src = this.toDataURL ();
+ };
+ img.onmouseover = function (e) {
+ if (e.target == e.currentTarget) {
+ canvas.drawTable ();
+ canvas.updateImgElement ();
+ }
+ };
+ canvas.updateImgElement ();
+ parent.appendChild (img);
+ canvas.style.display = 'none';
+ } else {
+ canvas.updateImgElement = function () {};
+ }
} // tableToCanvas
+if (!document.TableMapId) document.TableMapId = 0;
+
/*
-Copyright 2007 Wakaba
+Copyright 2007-2008 Wakaba
This library is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
*/
-/* $Date: 2007/05/27 10:00:48 $ */
+/* $Date: 2008/05/06 07:50:28 $ */