[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-06-21 20:48:23
Message-ID: 20100621204823.7F1DCAC8DA () svn ! kde ! org
[Download RAW message or body]

SVN commit 1140938 by mkruisselbrink:

add support for grouped rows and columns to the xls filter; kspread itself does not \
support this yet


 M  +42 -6     import/excelimport.cc  
 M  +6 -2      sidewinder/records.xml  
 M  +52 -2     sidewinder/sheet.cpp  
 M  +10 -0     sidewinder/sheet.h  
 M  +4 -0      sidewinder/worksheetsubstreamhandler.cpp  


--- trunk/koffice/filters/kspread/excel/import/excelimport.cc #1140937:1140938
@@ -185,9 +185,9 @@
     void processSheetForStyle(Sheet* sheet, KoXmlWriter* xmlWriter);
     void processSheetForHeaderFooter ( Sheet* sheet, KoXmlWriter* writer);
     void processHeaderFooterStyle (UString text, KoXmlWriter* xmlWriter);
-    void processColumnForBody(Sheet* sheet, int columnIndex, KoXmlWriter* \
xmlWriter); +    void processColumnForBody(Sheet* sheet, int columnIndex, \
                KoXmlWriter* xmlWriter, unsigned& outlineLevel);
     void processColumnForStyle(Sheet* sheet, int columnIndex, KoXmlWriter* \
                xmlWriter);
-    int processRowForBody(KoOdfWriteStore* store, Sheet* sheet, int rowIndex, \
KoXmlWriter* xmlWriter); +    int processRowForBody(KoOdfWriteStore* store, Sheet* \
                sheet, int rowIndex, KoXmlWriter* xmlWriter, unsigned& outlineLevel);
     int processRowForStyle(Sheet* sheet, int rowIndex, KoXmlWriter* xmlWriter);
     void processCellForBody(KoOdfWriteStore* store, Cell* cell, int rowsRepeat, \
KoXmlWriter* xmlWriter);  void processCellForStyle(Cell* cell, KoXmlWriter* \
xmlWriter); @@ -752,9 +752,14 @@
     }
 
     const unsigned columnCount = qMin(maximalColumnCount, sheet->maxColumn());
+    unsigned outlineLevel = 0;
     for (unsigned i = 0; i <= columnCount; ++i) {
-        processColumnForBody(sheet, i, xmlWriter);
+        processColumnForBody(sheet, i, xmlWriter, outlineLevel);
     }
+    while (outlineLevel > 0) {
+        xmlWriter->endElement(); // table:table-column-group
+        outlineLevel--;
+    }
 
     // in odf default-cell-style's only apply to cells/rows/columns that are present \
                in the file while in Excel
     // row/column styles should apply to all cells in that row/column. So, try to \
fake that behavior by writting @@ -769,8 +774,12 @@
     // add rows
     const unsigned rowCount = qMin(maximalRowCount, sheet->maxRow());
     for (unsigned i = 0; i <= rowCount;) {
-        i += processRowForBody(store, sheet, i, xmlWriter);
+        i += processRowForBody(store, sheet, i, xmlWriter, outlineLevel);
     }
+    while (outlineLevel > 0) {
+        xmlWriter->endElement(); // table:table-row-group
+        outlineLevel--;
+    }
 
     // same we did above with columns is also needed for rows.
     if(rowCount < maximalRowCount-1) {
@@ -930,11 +939,24 @@
 }
 
 // Processes a column in a sheet.
-void ExcelImport::Private::processColumnForBody(Sheet* sheet, int columnIndex, \
KoXmlWriter* xmlWriter) +void ExcelImport::Private::processColumnForBody(Sheet* \
sheet, int columnIndex, KoXmlWriter* xmlWriter, unsigned& outlineLevel)  {
     Column* column = sheet->column(columnIndex, false);
 
     if (!xmlWriter) return;
+
+    int newOutlineLevel = column ? column->outlineLevel() : 0;
+    while (newOutlineLevel > outlineLevel) {
+        xmlWriter->startElement("table:table-column-group");
+        outlineLevel++;
+        if (outlineLevel == newOutlineLevel && column->collapsed())
+            xmlWriter->addAttribute("table:display", "false");
+    }
+    while (newOutlineLevel < outlineLevel) {
+        xmlWriter->endElement(); // table:table-column-group
+        outlineLevel--;
+    }
+
     if (!column) {
         xmlWriter->startElement("table:table-column");
         Q_ASSERT(defaultColumnStyleIndex < defaultColumnStyles.count());
@@ -977,12 +999,26 @@
 }
 
 // Processes a row in a sheet.
-int ExcelImport::Private::processRowForBody(KoOdfWriteStore* store, Sheet* sheet, \
int rowIndex, KoXmlWriter* xmlWriter) +int \
ExcelImport::Private::processRowForBody(KoOdfWriteStore* store, Sheet* sheet, int \
rowIndex, KoXmlWriter* xmlWriter, unsigned& outlineLevel)  {
     int repeat = 1;
 
     if (!xmlWriter) return repeat;
     Row *row = sheet->row(rowIndex, false);
+
+    int newOutlineLevel = row ? row->outlineLevel() : 0;
+    while (newOutlineLevel > outlineLevel) {
+        xmlWriter->startElement("table:table-row-group");
+        outlineLevel++;
+        if (outlineLevel == newOutlineLevel && row->collapsed())
+            xmlWriter->addAttribute("table:display", "false");
+    }
+    while (newOutlineLevel < outlineLevel) {
+        xmlWriter->endElement(); // table:table-row-group
+        outlineLevel--;
+    }
+
+
     if (!row) {
         xmlWriter->startElement("table:table-row");
         xmlWriter->endElement();
--- trunk/koffice/filters/kspread/excel/sidewinder/records.xml #1140937:1140938
@@ -162,10 +162,12 @@
   <field name="reserved0"                    size="7" />
   <field name="outlineLevel" type="unsigned" size="3" />
   <field name="reserved1"                    size="1" />
-  <field name="collapsed"    type="bool"     size="1" />
+  <field name="notCollapsed" type="bool"     size="1" />
   <field name="reserved2"                    size="3" />
 
   <field name="reserved3"                    size="16" />
+
+  <computedField name="isCollapsed" ctype="bool" value="!isNotCollapsed()" />
 </record>
 
 <record name="DataTable" id="0x0236">
@@ -381,12 +383,14 @@
   <field name="reserved1"                       size="16" />
   <field name="outlineLevel"    type="unsigned" size="3" />
   <field name="reserved2"                       size="1" />
-  <field name="collapsed"       type="bool"     size="1" />
+  <field name="notCollapsed"    type="bool"     size="1" />
   <field name="hidden"          type="bool"     size="1" />
   <field name="reserved3"                       size="2" />
   <field name="reserved4"                       size="8" />
   <field name="xfIndex"         type="unsigned" size="12" />
   <field name="reserved5"                       size="4" />
+
+  <computedField name="isCollapsed" ctype="bool" value="!isNotCollapsed()" />
 </record>
 
 <!-- TODO: RString -->
--- trunk/koffice/filters/kspread/excel/sidewinder/sheet.cpp #1140937:1140938
@@ -477,6 +477,8 @@
     double width;
     Format format;
     bool visible;
+    unsigned outlineLevel;
+    bool collapsed;
 };
 
 Column::Column(Sheet* sheet, unsigned index)
@@ -486,6 +488,8 @@
     d->index   = index;
     d->width   = 0.0;
     d->visible = true;
+    d->outlineLevel = 0;
+    d->collapsed = false;
 }
 
 Column::~Column()
@@ -536,11 +540,32 @@
     d->visible = b;
 }
 
+unsigned Column::outlineLevel() const
+{
+    return d->outlineLevel;
+}
+
+void Column::setOutlineLevel(unsigned level)
+{
+    d->outlineLevel = level;
+}
+
+bool Column::collapsed() const
+{
+    return d->collapsed;
+}
+
+void Column::setCollapsed(bool collapsed)
+{
+    d->collapsed = collapsed;
+}
+
 bool Column::operator==(const Column &other) const
 {
     return width() == other.width() &&
            visible() == other.visible() &&
-           format() == other.format();
+           format() == other.format() &&
+           outlineLevel() == other.outlineLevel();
 }
 
 bool Column::operator!=(const Column &other) const
@@ -575,6 +600,8 @@
     double height;
     Format format;
     bool visible;
+    unsigned outlineLevel;
+    bool collapsed;
 };
 
 Row::Row(Sheet* sheet, unsigned index)
@@ -584,6 +611,8 @@
     d->index   = index;
     d->height  = 12;
     d->visible = true;
+    d->outlineLevel = 0;
+    d->collapsed = false;
 }
 
 Row::~Row()
@@ -631,11 +660,32 @@
     d->visible = b;
 }
 
+unsigned Row::outlineLevel() const
+{
+    return d->outlineLevel;
+}
+
+void Row::setOutlineLevel(unsigned level)
+{
+    d->outlineLevel = level;
+}
+
+bool Row::collapsed() const
+{
+    return d->collapsed;
+}
+
+void Row::setCollapsed(bool collapsed)
+{
+    d->collapsed = collapsed;
+}
+
 bool Row::operator==(const Row &other) const
 {
     return height() == other.height() &&
            visible() == other.visible() &&
-           format() == other.format();
+           format() == other.format() &&
+           outlineLevel() == other.outlineLevel();
 }
 
 bool Row::operator!=(const Row &other) const
--- trunk/koffice/filters/kspread/excel/sidewinder/sheet.h #1140937:1140938
@@ -218,6 +218,11 @@
     bool visible() const;
     void setVisible(bool v);
 
+    unsigned outlineLevel() const;
+    void setOutlineLevel(unsigned level);
+    bool collapsed() const;
+    void setCollapsed(bool collapsed);
+
     bool operator==(const Column &other) const;
     bool operator!=(const Column &other) const;
 
@@ -251,6 +256,11 @@
     bool visible() const;
     void setVisible(bool v);
 
+    unsigned outlineLevel() const;
+    void setOutlineLevel(unsigned level);
+    bool collapsed() const;
+    void setCollapsed(bool collapsed);
+
     bool operator==(const Row &other) const;
     bool operator!=(const Row &other) const;
 
--- trunk/koffice/filters/kspread/excel/sidewinder/worksheetsubstreamhandler.cpp \
#1140937:1140938 @@ -446,6 +446,8 @@
             column->setWidth( Column::columnUnitsToPts((double)width) );
             column->setFormat(d->globals->convertedFormat(xfIndex));
             column->setVisible(!hidden);
+            column->setOutlineLevel(record->outlineLevel());
+            column->setCollapsed(record->isCollapsed());
         }
     }
 }
@@ -797,6 +799,8 @@
         row->setHeight(height / 20.0);
         row->setFormat(d->globals->convertedFormat(xfIndex));
         row->setVisible(!hidden);
+        row->setOutlineLevel(record->outlineLevel());
+        row->setCollapsed(record->isCollapsed());
     }
 }
 


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

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