X-Git-Url: http://git.roojs.org/?p=Pman.Core;a=blobdiff_plain;f=Pman.Gnumeric.js;h=d581916182fecf451e94a76e7267b087e806c801;hp=4fa3ba5cadbfafda6fb1217bf087053d41d48a54;hb=1524f8b36295809a3eedd6da3c6494f8aa0d86f5;hpb=9523c5da9732a8fb84403ddb683baf4093395f22 diff --git a/Pman.Gnumeric.js b/Pman.Gnumeric.js index 4fa3ba5c..d5819161 100644 --- a/Pman.Gnumeric.js +++ b/Pman.Gnumeric.js @@ -148,6 +148,13 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { rowOffset : 0, + /** + * @type {String} format - either XLSX (if images are used) or XLS - as ssconvert does not do images that well. + */ + + format : 'xlsx', + + /** * load: * run the connection, parse document and fire load event.. @@ -327,7 +334,6 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { } } - }); // read colinfo.. var ci = this.sheet.getElementsByTagNameNS('*','ColInfo'); @@ -380,7 +386,9 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { continue; } for (var c = s.c; c < s.c1;c++) { - if (c > _t.cmax) continue; + if (c > _t.cmax) { + continue; + } if (typeof(_t.grid[r][c]) == 'undefined') { _t.createCell(r,c); @@ -391,7 +399,9 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { g.cls = []; g.styles = []; } - if (g.cls.indexOf(s.name) > -1) continue; + if (g.cls.indexOf(s.name) > -1) { + continue; + } g.cls.push(s.name); g.styles.push(s.dom); @@ -421,23 +431,23 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { }, Fore : function(ent,v) { var col=[]; - Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); }) + Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); }); ent['color'] = 'rgb(' + col.join(',') + ')'; }, Back : function(ent,v) { var col=[]; - Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); }) + Roo.each(v.split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); }); ent['background-color'] = 'rgb(' + col.join(',') + ')'; }, FontUnit : function(ent,v) { ent['font-size'] = v + 'px'; }, FontBold : function(ent,v) { - if (v*1 < 1) return; + if (v*1 < 1) { return; } ent['font-weight'] = 'bold'; }, FontItalic : function(ent,v) { - if (v*0 < 1) return; + if (v*0 < 1) { return; } //ent['font-weight'] = 'bold'; }, FontName : function(ent,v) { @@ -451,10 +461,10 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { BorderColor : function(ent,v) { var vv = v.split('-'); var col=[]; - Roo.each(vv[1].split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); }) + Roo.each(vv[1].split(':'), function(c) { col.push(Math.round(parseInt(c,16)/256)); }); ent['border-'+vv[0]+'-color'] = 'rgb(' + col.join(',') + ')'; } - } + }; function add(e, k, v) { //Roo.log(k,v); e.gstyle[k] = v; @@ -696,7 +706,9 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { data = data || this.data; for (var r = 0; r < this.rmax;r++) { - if (typeof(this.grid[r]) == 'undefined') continue; + if (typeof(this.grid[r]) == 'undefined') { + continue; + } for (var c = 0; c < this.cmax;c++) { if (typeof(this.grid[r][c]) == 'undefined') { continue; @@ -828,14 +840,13 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { this.setRowHeight( row + yoff +1, Roo.get(rows[row]).getHeight()); } - var cols = rows[row].getElementsByTagName('td'); - for(var col=0;col < cols.length; col++) { - - + if (cols[col].getAttribute('xls:width')) { + this.setColumnWidth(col, 1 * cols[col].getAttribute('xls:width')); + } var colspan = cols[col].getAttribute('colspan'); colspan = colspan ? colspan *1 : 1; @@ -982,7 +993,7 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { } - } + }; var ent = { HAlign:"1", @@ -1025,14 +1036,18 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { ent['Unit'] = v.replace(/px/, ''); }, 'font-weight' : function(ent,v) { - if (v != 'bold') return; + if (v != 'bold') { + return; + } ent['Bold'] = 1; }, 'font-style' : function(ent,v) { - if (v != 'italic') return; + if (v != 'italic') { + return; + } ent['Italic'] = 1; } - } + }; var fent = { Unit:"10", @@ -1113,7 +1128,106 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { }, - + /** + * writeImageOld: + * write an image in old gnumberic format (needs base64 data to write it) + * + * + * @param {Number} row row to put it in (rows start at 0) + * @param {Number} col column to put it in + * @param {Number} data the base64 description of the images + * @param {Number} width image width + * @param {Number} width image height + * + */ + writeImageOld : function (row, col, data, width, height, type, size) + { + + if (!data) { + throw "write Image called with missing data"; + } + + row*=1; + col*=1; + height*=1; + width*=1; + var objs = this.sheet.getElementsByTagNameNS('*','Objects')[0]; + var soi = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:SheetObjectImage'); + + var colwidth = 0; + var endcol=col; + for ( endcol=col;endcol <100; endcol++) { + if (!this.colInfo[endcol]) { + this.colInfo[endcol] = 100; // eak fudge + } + colwidth += this.colInfo[endcol]; + if (colwidth > width) { + break; + } + } + + soi.setAttribute('ObjectBound', this.RCtoCell(row,col) + ':' + this.RCtoCell(row,endcol)); + + var ww = 0.01; // offset a bit... + var hh = 0.01; // + + var rowHeight = typeof(this.rowInfoDom[row]) == 'undefined' ? 100 : + this.rowInfoDom[row].getAttribute('Unit')*1; + + + var ww2 = 1 - ((colwidth - width) / this.colInfo[endcol]); + var hh2 = 1 - ((rowHeight - height) / rowHeight); + + var offset_str = ww + ' ' + hh + ' ' + ww2 + ' '+hh2; + + // offset string 0.01 0.01 0.01 0.392 << last one needs to be calculated based on proportions. + // so what are our dimentions.. + + + + + + //alert(offset_str); + soi.setAttribute('ObjectOffset', offset_str); + soi.setAttribute('ObjectAnchorType','16 16 16 16'); + soi.setAttribute('Direction','17'); + soi.setAttribute('crop-top','0.000000'); + soi.setAttribute('crop-bottom','0.000000'); + soi.setAttribute('crop-left','0.000000'); + soi.setAttribute('crop-right','0.000000'); + + + + + + var content = this.doc.createElement('Content'); + content.setAttribute('image-type', type ? type : 'jpeg'); + content.setAttribute('size-bytes', size); + content.appendChild( this.doc.createTextNode(data)); + soi.appendChild(content); + objs.appendChild(soi); + + if (typeof(this.grid[row]) == 'undefined') { + this.grid[row] = []; + } + if (typeof(this.grid[row][col]) == 'undefined') { + this.createCell(row,col); + } + + this.grid[row][col].value= data; + this.grid[row][col].valueFormat = 'image'; + this.grid[row][col].imageType = type; + this.grid[row][col].width = width; + this.grid[row][col].height = height; + + var godoc = this.doc.getElementsByTagNameNS('*','GODoc')[0]; + + if(godoc && godoc.parentNode) { + godoc.parentNode.removeChild(godoc); + } + + return true; + }, /** * writeImage: @@ -1128,10 +1242,12 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { * */ - - writeImage : function (row, col, data, width, height) + writeImage : function (row, col, data, width, height, type) { + if (!data) { + throw "write Image called with missing data"; + } // our default height width is 50/50 ?! //console.log('w='+width+',height='+height); // @@ -1174,7 +1290,6 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { break; } } - soi.setAttribute('ObjectBound', //gnumeric_colRowToName(row,col) + ':' + gnumeric_colRowToName(row+1,col+1)); @@ -1183,11 +1298,15 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { var ww = 0.01; // offset a bit... var hh = 0.01; // + var rowHeight = typeof(this.rowInfoDom[row]) == 'undefined' ? 100 : + this.rowInfoDom[row].getAttribute('Unit')*1; + + var ww2 = 1 - ((colwidth - width) / this.colInfo[endcol]); - var hh2 = 0.99; + var hh2 = 1 - ((rowHeight - height) / rowHeight); var offset_str = ww + ' ' + hh + ' ' + ww2 + ' '+hh2; - //console.log(offset_str ); + //alert(offset_str); soi.setAttribute('ObjectOffset', offset_str); soi.setAttribute('ObjectAnchorType','16 16 16 16'); @@ -1197,19 +1316,165 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { soi.setAttribute('crop-left','0.000000'); soi.setAttribute('crop-right','0.000000'); // ...... < / Content> + + var name = 'Image' + Math.random().toString(36).substring(2); var content = this.doc.createElement('Content'); - content.setAttribute('image-type','jpeg'); - //alert(imgsrc); - - content.setAttribute('size-bytes',data.length); - content.textContent = data; + content.setAttribute('image-type', type ? type : 'jpeg'); + content.setAttribute('name', name); soi.appendChild(content); objs.appendChild(soi); + + var godoc = this.doc.getElementsByTagNameNS('*','GODoc')[0]; + + var goimage = this.doc.createElement('GOImage'); + goimage.setAttribute('image-type', type ? type : 'jpeg'); + goimage.setAttribute('name', name); + goimage.setAttribute('type', 'GOPixbuf'); + goimage.setAttribute('width', width); + goimage.setAttribute('height', height); + goimage.textContent = data; + + godoc.appendChild(goimage); + + if (typeof(this.grid[row]) == 'undefined') { + this.grid[row] = []; + } + if (typeof(this.grid[row][col]) == 'undefined') { + this.createCell(row,col); + } + + this.grid[row][col].value= data; + this.grid[row][col].valueFormat = 'image'; + this.grid[row][col].imageType = type; + this.grid[row][col].width = width; + this.grid[row][col].height = height; + return true; //< /gnm:SheetObjectImage> // < /gnm:Objects> }, + + /** + * writeFixedImageOld: + * write an image in old gnumberic format (needs base64 data to write it) + */ + writeFixedImageOld : function (startCol, startRow, endCol, endRow, type, data, width, height, size) + { + if (!data) { + throw "write Image called with missing data"; + } + + startCol = startCol * 1; + startRow = startRow * 1; + endCol = endCol * 1; + endRow = endRow * 1; + width = width * 1; + height = height * 1; + + var objs = this.sheet.getElementsByTagNameNS('*','Objects')[0]; + var soi = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:SheetObjectImage'); + + soi.setAttribute('ObjectBound',this.RCtoCell(startRow, startCol) + ':' + this.RCtoCell(endRow, endCol)); + + soi.setAttribute('ObjectOffset', '0 0 0 0'); + soi.setAttribute('ObjectAnchorType','16 16 16 16'); + soi.setAttribute('Direction','17'); + soi.setAttribute('crop-top','0.000000'); + soi.setAttribute('crop-bottom','0.000000'); + soi.setAttribute('crop-left','0.000000'); + soi.setAttribute('crop-right','0.000000'); + + var content = this.doc.createElement('Content'); + content.setAttribute('image-type', type ? type : 'jpeg'); + content.setAttribute('size-bytes', size); + content.appendChild( this.doc.createTextNode(data)); + soi.appendChild(content); + objs.appendChild(soi); + + if (typeof(this.grid[startRow]) == 'undefined') { + this.grid[startRow] = []; + } + if (typeof(this.grid[startRow][startCol]) == 'undefined') { + this.createCell(startRow,startCol); + } + + this.grid[startRow][startCol].value= data; + this.grid[startRow][startCol].valueFormat = 'image'; + this.grid[startRow][startCol].imageType = type; + this.grid[startRow][startCol].width = width; + this.grid[startRow][startCol].height = height; + + var godoc = this.doc.getElementsByTagNameNS('*','GODoc')[0]; + + if(godoc && godoc.parentNode) { + godoc.parentNode.removeChild(godoc); + } + + return true; + }, + + writeFixedImage : function (startCol, startRow, endCol, endRow, type, data, width, height) + { + if (!data) { + throw "write Image called with missing data"; + } + + startCol = startCol * 1; + startRow = startRow * 1; + endCol = endCol * 1; + endRow = endRow * 1; + width = width * 1; + height = height * 1; + + var objs = this.sheet.getElementsByTagNameNS('*','Objects')[0]; + var soi = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:SheetObjectImage'); + + soi.setAttribute('ObjectBound',this.RCtoCell(startRow, startCol) + ':' + this.RCtoCell(endRow, endCol)); + + soi.setAttribute('ObjectOffset', '0 0 0 0'); + soi.setAttribute('ObjectAnchorType','16 16 16 16'); + soi.setAttribute('Direction','17'); + soi.setAttribute('crop-top','0.000000'); + soi.setAttribute('crop-bottom','0.000000'); + soi.setAttribute('crop-left','0.000000'); + soi.setAttribute('crop-right','0.000000'); + + var name = 'Image' + Math.random().toString(36).substring(2); + var content = this.doc.createElement('Content'); + content.setAttribute('image-type', type ? type : 'jpeg'); + content.setAttribute('name', name); + + soi.appendChild(content); + objs.appendChild(soi); + + var godoc = this.doc.getElementsByTagNameNS('*','GODoc')[0]; + + var goimage = this.doc.createElement('GOImage'); + goimage.setAttribute('image-type', type ? type : 'jpeg'); + goimage.setAttribute('name', name); + goimage.setAttribute('type', 'GOPixbuf'); + goimage.setAttribute('width', width); + goimage.setAttribute('height', height); + goimage.textContent = data; + + godoc.appendChild(goimage); + + if (typeof(this.grid[startRow]) == 'undefined') { + this.grid[startRow] = []; + } + if (typeof(this.grid[startRow][startCol]) == 'undefined') { + this.createCell(startRow,startCol); + } + + this.grid[startRow][startCol].value= data; + this.grid[startRow][startCol].valueFormat = 'image'; + this.grid[startRow][startCol].imageType = type; + this.grid[startRow][startCol].width = width; + this.grid[startRow][startCol].height = height; + + return true; + }, /** * mergeRegion: @@ -1329,7 +1594,7 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { column = column *1; width= width*1; if (typeof(this.colInfoDom[column]) == 'undefined') { - var cols = this.doc.getElementsByTagNameNS('*','Cols')[0]; + var cols = this.sheet.getElementsByTagNameNS('*','Cols')[0]; var ri = this.doc.createElementNS('http://www.gnumeric.org/v10.dtd', 'gnm:ColInfo'); ri.setAttribute('No', column); ri.setAttribute('Unit', width); @@ -1378,16 +1643,43 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { } var g = grid[r][c]; - if (typeof(g.cls) =='undefined') g.cls = []; + if (typeof(g.cls) =='undefined') { + g.cls = []; + } var w= calcWidth(c,g.colspan); var value = g.value[0] == '=' ? 'CALCULATED' : g.value; - var vv = new Date(value); - if(!isNaN(vv.getTime())){ - Roo.log(value); + try { + if( + g.styles[0].firstElementChild.getAttribute('Format') == "D\\-MMM\\-YYYY;@" && + g.value[0] != '=' && + !isNaN(value * 1) && + value != 0 + ){ + value = new Date(value * 24 * 60 * 60 * 1000 + new Date('1899-12-30').getTime()).format('d-M-Y'); + } + + } catch(e) { + } + if(g.valueFormat == 'image') { + + out+=String.format('
', + g.colspan, g.rowspan, g.cls.join(' '), + 'overflow:hidden;' + + 'width:'+g.width+'px;' + + + 'text-overflow:ellipsis;' + + 'white-space:nowrap;', + g.imageType, + value, g.width, g.height + + ); + c+=(g.colspan-1); + continue; + } out+=String.format('
{2}
', g.colspan, g.rowspan, value, @@ -1419,27 +1711,33 @@ Roo.extend(Pman.Gnumeric, Roo.util.Observable, { { name = name || "Missing_download_filename"; - if (this.downloadURL && this.downloadURL.charAt(this.downloadURL .length-1) != '/') { + if (this.downloadURL && this.downloadURL.charAt(this.downloadURL.length-1) != '/') { this.downloadURL += '/'; } var ser = new XMLSerializer(); + Roo.get(document.body).mask("Downloading"); var x = new Pman.Download({ method: 'POST', timeout : 120000, // quite a long wait.. 2 minutes. params : { xml : ser.serializeToString(this.doc), - format : 'xls', //xml + format : this.format, debug : 0 }, url : (this.downloadURL || (baseURL + '/GnumericToExcel/')) + name + '.xls', success : function() { + Roo.get(document.body).unmask(); Roo.MessageBox.alert("Alert", "File should have downloaded now"); if (callback) { callback(); } - } + }, + failure : function() { + Roo.get(document.body).unmask(); + Roo.MessageBox.alert("Alert", "Download failed"); + } }); }