[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/filters/kspread/excel
From:       Marijn Kruisselbrink <m.kruisselbrink () student ! tue ! nl>
Date:       2010-08-29 20:54:08
Message-ID: 20100829205408.6FDF0AC887 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1169649 by mkruisselbrink:

save dimensions and column width information

 M  +44 -2     export/ExcelExport.cpp  
 M  +5 -2      sidewinder/records.xml  


--- trunk/koffice/filters/kspread/excel/export/ExcelExport.cpp #1169648:1169649
@@ -20,16 +20,21 @@
 #include <ExcelExport.h>
 #include <ExcelExport.moc>
 
+#include <QFont>
+#include <QFontMetricsF>
 #include <QMap>
 
 #include <kdebug.h>
 #include <kgenericfactory.h>
 
 #include <KoFilterChain.h>
+#include <KoPostscriptPaintDevice.h>
 
 #include <part/Doc.h>
 #include <Map.h>
 #include <Sheet.h>
+#include <RowColumnFormat.h>
+#include <kspread_limits.h>
 
 #include <swinder.h>
 #include <XlsRecordOutputStream.h>
@@ -191,6 +196,20 @@
     return KoFilter::OK;
 }
 
+static unsigned convertColumnWidth(qreal width)
+{
+    static qreal factor = -1;
+    if (factor == -1) {
+        QFont f("Arial", 10);
+        KoPostscriptPaintDevice pd;
+        QFontMetricsF fm(f, &pd);
+        for (char c = '0'; c <= '9'; c++) {
+            factor = qMax(factor, fm.width(c));
+        }
+    }
+    return width / factor * 256;
+}
+
 void ExcelExport::convertSheet(KSpread::Sheet* sheet)
 {
     XlsRecordOutputStream& o = *d->out;
@@ -227,11 +246,34 @@
     o.writeRecord(VCenterRecord(0));
     o.writeRecord(SetupRecord(0));
 
-    o.writeRecord(DefaultColWidthRecord(0));
-    // ColInfo
+    QRect area = sheet->usedArea();
 
+    o.writeRecord(DefaultColWidthRecord(0)); // TODO: real defaultColWidthRecord
     {
+        ColInfoRecord cir(0);
+        for (int i = 1; i <= area.right(); ++i) {
+            const KSpread::ColumnFormat* column = sheet->columnFormat(i);
+            unsigned w = convertColumnWidth(column->width());
+            if (w != cir.width() || column->isHidden() != cir.isHidden() || \
column->isDefault() != !cir.isNonDefaultWidth()) { +                if (i > 1) {
+                    o.writeRecord(cir);
+                }
+                cir.setFirstColumn(i-1);
+                cir.setWidth(w);
+                cir.setHidden(column->isHidden());
+                cir.setNonDefaultWidth(!column->isDefault());
+            }
+            cir.setLastColumn(i-1);
+        }
+        o.writeRecord(cir);
+    }
+
+    {
         DimensionRecord dr(0);
+        dr.setFirstRow(area.top()-1);
+        dr.setFirstColumn(area.left()-1);
+        dr.setLastRowPlus1(area.bottom());
+        dr.setLastColumnPlus1(area.right());
         o.writeRecord(dr);
     }
 
--- trunk/koffice/filters/kspread/excel/sidewinder/records.xml #1169648:1169649
@@ -209,7 +209,10 @@
   <field name="xfIndex"      type="unsigned" size="16" />
 
   <field name="hidden"       type="bool"     size="1" />
-  <field name="reserved0"                    size="7" />
+  <field name="nonDefaultWidth" type="bool"  size="1" />
+  <field name="bestFit"      type="bool"     size="1" />
+  <field name="showPhonetic" type="bool"     size="1" />
+  <field name="reserved0"                    size="4" />
   <field name="outlineLevel" type="unsigned" size="3" />
   <field name="reserved1"                    size="1" />
   <field name="notCollapsed" type="bool"     size="1" />
@@ -634,7 +637,7 @@
 </record>
 
 <record name="DefaultColWidth" id="0x55">
-  <field name="cchdefColWidth"   type="unsigned" size="16" />
+  <field name="cchdefColWidth"   type="unsigned" size="16" default="8" />
 </record>
 
 <record name="HCenter" id="0x0083">


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic