check what is being written to our log files.
[Pman.Core] / Pman.Gnumeric.js
index 85e157d..d581916 100644 (file)
@@ -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);
                 //        <gmr:Objects>
@@ -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 image-type="jpeg" size-bytes="3900">......  < / 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,31 +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;
                 
-//                if(
-//                        typeof(g.styles.firstElementChild.attributes) != 'undefined' && 
-//                        typeof(g.styles.firstElementChild.attributes[12])
-//                ){
-//                    
-//                }
-                if(value == '01/Jan/2014'){
-                    Roo.log(g.styles[0].firstElementChild.attributes[12].value);
-                    Roo.log(value);
-                    Roo.log(typeof(value));
-                    Roo.log(typeof(g.styles[0].firstElementChild.attributes[12].value));
-                }
-                if(
-                        typeof(g.styles[0].firstElementChild.attributes[12].value) != 'undefined' && 
-                        g.styles[0].firstElementChild.attributes[12].value == "D-MMM-YYYY;@"
-                ){
-                    Roo.log(value);
-                    value = 'test';
+                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('<td colspan="{0}" rowspan="{1}"  class="{2}"><div style="{3}"><img src="data:image/{4};base64, {5}" width="{6}" height="{7}"></div></td>', 
+                        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('<td colspan="{0}" rowspan="{1}"  class="{4}"><div style="{3}">{2}</div></td>', 
                     g.colspan, g.rowspan, value,
@@ -1434,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");
+           }
         });
          
     }