// era: encode references absolutely QDomDocument CopyCommand::saveAsXml(const Region& region, bool era) { QDomDocument xmlDoc("spreadsheet-snippet"); xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"")); QDomElement root = xmlDoc.createElement("spreadsheet-snippet"); xmlDoc.appendChild(root); // find the upper left corner of the selection const QRect boundingRect = region.boundingRect(); int left = boundingRect.left(); int top = boundingRect.top(); // for tiling the clipboard content in the selection root.setAttribute("rows", QString::number(boundingRect.height())); root.setAttribute("columns", QString::number(boundingRect.width())); const Region::ConstIterator end(region.constEnd()); for (Region::ConstIterator it = region.constBegin(); it != end; ++it) { Sheet *const sheet = (*it)->sheet(); const QRect range = (*it)->rect(); CellStorage *const storage = sheet->cellStorage(); // // Entire rows selected? // if ((*it)->isRow()) { QDomElement rows = xmlDoc.createElement("rows"); rows.setAttribute("count", QString::number(range.height())); rows.setAttribute("row", QString::number(range.top() - top + 1)); root.appendChild(rows); // Save all cells. for (int row = range.top(); row <= range.bottom(); ++row) { Cell cell = storage->firstInRow(row); for (; !cell.isNull(); cell = storage->nextInRow(cell.column(), cell.row())) { if (!cell.isPartOfMerged()) { root.appendChild(cell.save(xmlDoc, 0, top - 1, era)); } } } // TODO Stefan: Inefficient, use cluster functionality // Save the row formats if there are any //const RowFormat* format; for (int row = range.top(); row <= range.bottom(); ++row) { if (!sheet->rowFormats()->isDefaultRow(row)) { QDomElement e = RowFormat(sheet->rowFormats(), row).save(xmlDoc, top - 1); if (!e.isNull()) { rows.appendChild(e); } } } continue; } // // Entire columns selected? // if ((*it)->isColumn()) { QDomElement columns = xmlDoc.createElement("columns"); columns.setAttribute("count", QString::number(range.width())); columns.setAttribute("column", QString::number(range.left() - left + 1)); root.appendChild(columns); // Save all cells. for (int col = range.left(); col <= range.right(); ++col) { Cell cell = storage->firstInColumn(col); for (; !cell.isNull(); cell = storage->nextInColumn(cell.column(), cell.row())) { if (!cell.isPartOfMerged()) { root.appendChild(cell.save(xmlDoc, left - 1, 0, era)); } } } // TODO Stefan: Inefficient, use the cluster functionality // Save the column formats if there are any const ColumnFormat* format; for (int col = range.left(); col <= range.right(); ++col) { format = sheet->columnFormat(col); if (format && !format->isDefault()) { QDomElement e = format->save(xmlDoc, left - 1); if (!e.isNull()) { columns.appendChild(e); } } } continue; } // Save all cells. Cell cell; for (int row = range.top(); row <= range.bottom(); ++row) { if (range.left() == 1) { cell = storage->firstInRow(row); } else { cell = storage->nextInRow(range.left() - 1, row); } while (!cell.isNull() && cell.column() >= range.left() && cell.column() <= range.right()) { if (!cell.isPartOfMerged()) { root.appendChild(cell.save(xmlDoc, left - 1, top - 1, era)); } cell = storage->nextInRow(cell.column(), cell.row()); } } } return xmlDoc; }
void CanvasItem::handleDamages(const QList<Damage*>& damages) { QRegion paintRegion; enum { Nothing, Everything, Clipped } paintMode = Nothing; QList<Damage*>::ConstIterator end(damages.end()); for (QList<Damage*>::ConstIterator it = damages.begin(); it != end; ++it) { Damage* damage = *it; if (!damage) continue; if (damage->type() == Damage::Cell) { CellDamage* cellDamage = static_cast<CellDamage*>(damage); kDebug(36007) << "Processing\t" << *cellDamage; Sheet* const damagedSheet = cellDamage->sheet(); if (cellDamage->changes() & CellDamage::Appearance) { const Region& region = cellDamage->region(); sheetView(damagedSheet)->invalidateRegion(region); paintMode = Everything; } continue; } if (damage->type() == Damage::Sheet) { SheetDamage* sheetDamage = static_cast<SheetDamage*>(damage); kDebug(36007) << *sheetDamage; const SheetDamage::Changes changes = sheetDamage->changes(); if (changes & (SheetDamage::Name | SheetDamage::Shown)) { // d->tabBar->setTabs(doc()->map()->visibleSheets()); paintMode = Everything; } if (changes & (SheetDamage::Shown | SheetDamage::Hidden)) { // updateShowSheetMenu(); paintMode = Everything; } // The following changes only affect the active sheet. if (sheetDamage->sheet() != d->activeSheet) { continue; } if (changes.testFlag(SheetDamage::ContentChanged)) { update(); paintMode = Everything; } if (changes.testFlag(SheetDamage::PropertiesChanged)) { sheetView(d->activeSheet)->invalidate(); paintMode = Everything; } if (sheetDamage->changes() & SheetDamage::ColumnsChanged) columnHeader()->update(); if (sheetDamage->changes() & SheetDamage::RowsChanged) rowHeader()->update(); continue; } if (damage->type() == Damage::Selection) { SelectionDamage* selectionDamage = static_cast<SelectionDamage*>(damage); kDebug(36007) << "Processing\t" << *selectionDamage; const Region region = selectionDamage->region(); if (paintMode == Clipped) { const QRectF rect = cellCoordinatesToView(region.boundingRect()); paintRegion += rect.toRect().adjusted(-3, -3, 4, 4); } else { paintMode = Everything; } continue; } kDebug(36007) << "Unhandled\t" << *damage; } // At last repaint the dirty cells. if (paintMode == Clipped) { update(paintRegion.boundingRect()); } else if (paintMode == Everything) { update(); } }