void KoChangeTracker::loadOdfChanges(const KoXmlElement& element) { if (element.namespaceURI() == KoXmlNS::text) { KoXmlElement tag; forEachElement(tag, element) { if (! tag.isNull()) { const QString localName = tag.localName(); if (localName == "changed-region") { KoChangeTrackerElement *changeElement = 0; KoXmlElement region; forEachElement(region, tag) { if (!region.isNull()) { if (region.localName() == "insertion") { changeElement = new KoChangeTrackerElement(kundo2_noi18n(tag.attributeNS(KoXmlNS::text,"id")),KoGenChange::InsertChange); } else if (region.localName() == "format-change") { changeElement = new KoChangeTrackerElement(kundo2_noi18n(tag.attributeNS(KoXmlNS::text,"id")),KoGenChange::FormatChange); } else if (region.localName() == "deletion") { changeElement = new KoChangeTrackerElement(kundo2_noi18n(tag.attributeNS(KoXmlNS::text,"id")),KoGenChange::DeleteChange); } KoXmlElement metadata = region.namedItemNS(KoXmlNS::office,"change-info").toElement(); if (!metadata.isNull()) { KoXmlElement date = metadata.namedItem("dc:date").toElement(); if (!date.isNull()) { changeElement->setDate(date.text()); } KoXmlElement creator = metadata.namedItem("dc:creator").toElement(); if (!date.isNull()) { changeElement->setCreator(creator.text()); } //TODO load comments /* KoXmlElement extra = metadata.namedItem("dc-").toElement(); if (!date.isNull()) { kDebug() << "creator: " << creator.text(); changeElement->setCreator(creator.text()); }*/ } changeElement->setEnabled(d->recordChanges); d->changes.insert( d->changeId, changeElement); d->loadedChanges.insert(tag.attributeNS(KoXmlNS::text,"id"), d->changeId++); } } } } }
bool GanttPrintingOptions::loadContext( const KoXmlElement &settings ) { KoXmlElement e = settings.namedItem( "print-options" ).toElement(); if ( ! e.isNull() ) { printRowLabels = (bool)( e.attribute( "print-rowlabels", "0" ).toInt() ); singlePage = (bool)( e.attribute( "print-singlepage", "0" ).toInt() ); } kDebug()<<"..........."<<printRowLabels<<singlePage; return true; }
bool ResourceAppointmentsTreeView::loadContext( const KoXmlElement &context ) { debugPlan; KoXmlElement e = context.namedItem( "common" ).toElement(); if ( ! e.isNull() ) { model()->setShowInternalAppointments( (bool)( e.attribute( "show-internal-appointments", "0" ).toInt() ) ); model()->setShowExternalAppointments( (bool)( e.attribute( "show-external-appointments", "0" ).toInt() ) ); } return true; }
// static bool PasteCommand::unknownShiftDirection(const QMimeData *mimeData) { if (!mimeData) { return false; } QByteArray byteArray; if (mimeData->hasFormat("application/x-kspread-snippet")) { byteArray = mimeData->data("application/x-kspread-snippet"); } else { return false; } QString errorMsg; int errorLine; int errorColumn; KoXmlDocument d; if (!d.setContent(byteArray, false, &errorMsg, &errorLine, &errorColumn)) { // an error occurred kDebug() << "An error occurred." << "line:" << errorLine << "col:" << errorColumn << errorMsg; return false; } KoXmlElement e = d.documentElement(); if (!e.namedItem("columns").toElement().isNull()) { return false; } if (!e.namedItem("rows").toElement().isNull()) { return false; } KoXmlElement c = e.firstChild().toElement(); for (; !c.isNull(); c = c.nextSibling().toElement()) { if (c.tagName() == "cell") { return true; } } return false; }
bool KoDocumentInfo::loadAuthorInfo(const KoXmlElement &e) { KoXmlNode n = e.namedItem("author").firstChild(); for (; !n.isNull(); n = n.nextSibling()) { KoXmlElement e = n.toElement(); if (e.isNull()) continue; if (e.tagName() == "full-name") setActiveAuthorInfo("creator", e.text().trimmed()); else setActiveAuthorInfo(e.tagName(), e.text().trimmed()); } return true; }
void Doc::loadPaper(KoXmlElement const & paper) { KoPageLayout pageLayout; pageLayout.format = KoPageFormat::formatFromString(paper.attribute("format")); pageLayout.orientation = (paper.attribute("orientation") == "Portrait") ? KoPageFormat::Portrait : KoPageFormat::Landscape; // <borders> KoXmlElement borders = paper.namedItem("borders").toElement(); if (!borders.isNull()) { pageLayout.leftMargin = MM_TO_POINT(borders.attribute("left").toFloat()); pageLayout.rightMargin = MM_TO_POINT(borders.attribute("right").toFloat()); pageLayout.topMargin = MM_TO_POINT(borders.attribute("top").toFloat()); pageLayout.bottomMargin = MM_TO_POINT(borders.attribute("bottom").toFloat()); } //apply to all sheet foreach(Sheet* sheet, map()->sheetList()) { sheet->printSettings()->setPageLayout(pageLayout); }
bool NodeGanttViewBase::loadContext( const KoXmlElement &settings ) { treeView()->loadContext( model()->columnMap(), settings ); KoXmlElement e = settings.namedItem( "ganttchart" ).toElement(); if ( ! e.isNull() ) { m_ganttdelegate->showTaskLinks = (bool)( e.attribute( "show-dependencies", "0" ).toInt() ); m_ganttdelegate->showTaskName = (bool)( e.attribute( "show-taskname", "0" ).toInt() ); m_ganttdelegate->showResources = (bool)( e.attribute( "show-resourcenames", "0" ).toInt() ); m_ganttdelegate->showProgress = (bool)( e.attribute( "show-completion", "0" ).toInt() ); m_ganttdelegate->showCriticalPath = (bool)( e.attribute( "show-criticalpath", "0" ).toInt() ); m_ganttdelegate->showCriticalTasks = (bool)( e.attribute( "show-criticaltasks", "0" ).toInt() ); m_ganttdelegate->showPositiveFloat = (bool)( e.attribute( "show-positivefloat", "0" ).toInt() ); m_ganttdelegate->showSchedulingError = (bool)( e.attribute( "show-schedulingerror", "0" ).toInt() ); m_ganttdelegate->showTimeConstraint = (bool)( e.attribute( "show-timeconstraint", "0" ).toInt() ); m_ganttdelegate->showNegativeFloat = (bool)( e.attribute( "show-negativefloat", "0" ).toInt() ); GanttViewBase::loadContext( e ); m_printOptions.loadContext( e ); } return true; }
bool Doc::loadXML(const KoXmlDocument& doc, KoStore*) { QPointer<KoUpdater> updater; if (progressUpdater()) { updater = progressUpdater()->startSubtask(1, "KSpread::Doc::loadXML"); updater->setProgress(0); } d->spellListIgnoreAll.clear(); // <spreadsheet> KoXmlElement spread = doc.documentElement(); if (spread.attribute("mime") != "application/x-kspread" && spread.attribute("mime") != "application/vnd.kde.kspread") { setErrorMessage(i18n("Invalid document. Expected mimetype application/x-kspread or application/vnd.kde.kspread, got %1" , spread.attribute("mime"))); return false; } bool ok = false; int version = spread.attribute("syntaxVersion").toInt(&ok); map()->setSyntaxVersion(ok ? version : 0); if (map()->syntaxVersion() > CURRENT_SYNTAX_VERSION) { int ret = KMessageBox::warningContinueCancel( 0, i18n("This document was created with a newer version of Calligra Sheets (syntax version: %1)\n" "When you open it with this version of Calligra Sheets, some information may be lost.", map()->syntaxVersion()), i18n("File Format Mismatch"), KStandardGuiItem::cont()); if (ret == KMessageBox::Cancel) { setErrorMessage("USER_CANCELED"); return false; } } // <locale> KoXmlElement loc = spread.namedItem("locale").toElement(); if (!loc.isNull()) static_cast<Localization*>(map()->calculationSettings()->locale())->load(loc); if (updater) updater->setProgress(5); KoXmlElement defaults = spread.namedItem("defaults").toElement(); if (!defaults.isNull()) { double dim = defaults.attribute("row-height").toDouble(&ok); if (!ok) return false; map()->setDefaultRowHeight(dim); dim = defaults.attribute("col-width").toDouble(&ok); if (!ok) return false; map()->setDefaultColumnWidth(dim); } KoXmlElement ignoreAll = spread.namedItem("SPELLCHECKIGNORELIST").toElement(); if (!ignoreAll.isNull()) { KoXmlElement spellWord = spread.namedItem("SPELLCHECKIGNORELIST").toElement(); spellWord = spellWord.firstChild().toElement(); while (!spellWord.isNull()) { if (spellWord.tagName() == "SPELLCHECKIGNOREWORD") { d->spellListIgnoreAll.append(spellWord.attribute("word")); } spellWord = spellWord.nextSibling().toElement(); } } if (updater) updater->setProgress(40); // In case of reload (e.g. from konqueror) qDeleteAll(map()->sheetList()); map()->sheetList().clear(); KoXmlElement styles = spread.namedItem("styles").toElement(); if (!styles.isNull()) { if (!map()->styleManager()->loadXML(styles)) { setErrorMessage(i18n("Styles cannot be loaded.")); return false; } } // <map> KoXmlElement mymap = spread.namedItem("map").toElement(); if (mymap.isNull()) { setErrorMessage(i18n("Invalid document. No map tag.")); return false; } if (!map()->loadXML(mymap)) { return false; } // named areas const KoXmlElement areaname = spread.namedItem("areaname").toElement(); if (!areaname.isNull()) map()->namedAreaManager()->loadXML(areaname); //Backwards compatibility with older versions for paper layout if (map()->syntaxVersion() < 1) { KoXmlElement paper = spread.namedItem("paper").toElement(); if (!paper.isNull()) { loadPaper(paper); } } if (updater) updater->setProgress(85); KoXmlElement element(spread.firstChild().toElement()); while (!element.isNull()) { QString tagName(element.tagName()); if (tagName != "locale" && tagName != "map" && tagName != "styles" && tagName != "SPELLCHECKIGNORELIST" && tagName != "areaname" && tagName != "paper") { // belongs to a plugin, load it and save it for later use QDomDocument doc; KoXml::asQDomElement(doc, element); d->savedDocParts[ tagName ] = doc; } element = element.nextSibling().toElement(); } if (updater) updater->setProgress(90); initConfig(); if (updater) updater->setProgress(100); return true; }
bool PasteCommand::processXmlData(Element *element, KoXmlDocument *data) { const QRect pasteArea = element->rect(); Sheet *const sheet = element->sheet(); Q_ASSERT(sheet == m_sheet); Map *const map = sheet->map(); const KoXmlElement root = data->documentElement(); // "spreadsheet-snippet" if (root.hasAttribute("cut")) { const Region cutRegion(root.attribute("cut"), map, sheet); if (cutRegion.isValid()) { const Cell destination(sheet, pasteArea.topLeft()); map->dependencyManager()->regionMoved(cutRegion, destination); } } const int sourceHeight = root.attribute("rows").toInt(); const int sourceWidth = root.attribute("columns").toInt(); // Find size of rectangle that we want to paste to (either clipboard size or current selection) const bool noRowsInClipboard = root.namedItem("rows").toElement().isNull(); const bool noColumnsInClipboard = root.namedItem("columns").toElement().isNull(); const bool noRowsSelected = !Region::Range(pasteArea).isRow(); const bool noColumnsSelected = !Region::Range(pasteArea).isColumn(); const bool biggerSelectedWidth = pasteArea.width() >= sourceWidth; const bool biggerSelectedHeight = pasteArea.height() >= sourceHeight; const int pasteWidth = biggerSelectedWidth && noRowsSelected && noRowsInClipboard ? pasteArea.width() : sourceWidth; const int pasteHeight = biggerSelectedHeight && noColumnsSelected && noColumnsInClipboard ? pasteArea.height() : sourceHeight; const int xOffset = noRowsInClipboard ? pasteArea.left() - 1 : 0; const int yOffset = noColumnsInClipboard ? pasteArea.top() - 1 : 0; kDebug(36005) << "selected size (col x row):" << pasteArea.width() << 'x' << pasteArea.height(); kDebug(36005) << "source size (col x row):" << sourceWidth << 'x' << sourceHeight; kDebug(36005) << "paste area size (col x row):" << pasteWidth << 'x' << pasteHeight; kDebug(36005) << "xOffset:" << xOffset << "yOffset:" << yOffset; // Determine the shift direction, if needed. if (m_insertMode == ShiftCells) { if (!noColumnsInClipboard && !noRowsInClipboard) { // There are columns and rows in the source data. m_insertMode = ShiftCellsRight; // faster than down } else if (!noColumnsInClipboard) { // There are columns in the source data. m_insertMode = ShiftCellsRight; } else if (!noRowsInClipboard) { // There are rows in the source data. m_insertMode = ShiftCellsDown; } else { // Should not happen. // ShiftCells should only be set, if the data contains columns/rows. Q_ASSERT(false); m_insertMode = ShiftCellsRight; // faster than down } } const bool noColumns = noColumnsInClipboard && noColumnsSelected; const bool noRows = noRowsInClipboard && noRowsSelected; // Shift cells down. if (m_insertMode == ShiftCellsDown) { // Cases: // 1. Columns AND rows are contained in either source or selection // 1.a Columns in source and rows in selection // I.e. yOffset=0 // Clear everything. // Taking the column data/style and fill all columns. // 1.b Columns and rows in source, but not in selection // I.e. xOffset=0,yOffset=0 // Leave everything as is? No, data from different sheet is possible! // Clear everything. // Fill with the source column/row data/style, // i.e. the sheet data becomes equal to the source data. // Same procedure as in 1.e // 1.c Columns and rows in selection, but not in source // Clear everything. // Fill with the source data. Tiling -> HUGE task! // 1.d Rows in source and columns in selection // I.e. xOffset=0 // Clear everything. // Taking the row data/style and fill all rows. // 1.e Columns AND rows in both // I.e. xOffset=0,yOffset=0 // Leave everything as is? No, data from different sheet is possible! // Clear everything. // Fill with the source column/row data/style, // i.e. the sheet data becomes equal to the source data. // Same procedure as in 1.b // 2. Columns are present in either source or selection, but no rows // 2a Columns in source // I.e. yOffset=0 // Clear the appropriate columns in the paste area. // Fill them with the source data. // 2b Columns in selection // Clear the selected columns. // Fill them with the source data. Tiling -> HUGE task! // 2c Columns in both // I.e. yOffset=0 // Clear the selected columns. // Fill them with the source column data/style. // 3. Rows are present in either source or selection, but no columns // 3a Rows in source // I.e. xOffset=0 // Insert rows. // Fill in data. // 3b Rows in selection // Insert rows. // Fill in data. Tiling -> HUGE task! // 3c Rows in both // I.e. xOffset=0 // Insert rows. // Fill in data/style from source rows. // 4. Neither column, nor rows are present // Shift the cell down. // Fill in data. if ((!noColumns && !noRows) || (!noColumns && noRows)) { // Everything or only columns present. DeleteCommand *const command = new DeleteCommand(this); command->setSheet(m_sheet); command->add(Region(pasteArea.x(), pasteArea.y(), pasteWidth, pasteHeight, sheet)); command->setMode(DeleteCommand::OnlyCells); } else if (noColumns && !noRows) { // Rows present. InsertDeleteRowManipulator *const command = new InsertDeleteRowManipulator(this); command->setSheet(sheet); command->add(Region(pasteArea.x(), pasteArea.y(), pasteWidth, pasteHeight, sheet)); } else { // Neither columns, nor rows present. ShiftManipulator *const command = new ShiftManipulator(this); command->setSheet(sheet); command->add(Region(pasteArea.x(), pasteArea.y(), pasteWidth, pasteHeight, sheet)); command->setDirection(ShiftManipulator::ShiftBottom); } } // Shift cells right. if (m_insertMode == ShiftCellsRight) { // Cases: // Same as for ShiftCellsDown, // except that clearing and inserting are exchanged for cases 2 and 3. // Shifting a column to the right is the same as column insertion. // Shifting a row to the right is the same as clearing the row. if ((!noColumns && !noRows) || (noColumns && !noRows)) { // Everything or only rows present. DeleteCommand *const command = new DeleteCommand(this); command->setSheet(m_sheet); command->add(Region(pasteArea.x(), pasteArea.y(), pasteWidth, pasteHeight, sheet)); command->setMode(DeleteCommand::OnlyCells); } else if (!noColumns && noRows) { // Columns present. InsertDeleteColumnManipulator *const command = new InsertDeleteColumnManipulator(this); command->setSheet(sheet); command->add(Region(pasteArea.x(), pasteArea.y(), pasteWidth, pasteHeight, sheet)); } else { // Neither columns, nor rows present. ShiftManipulator *const command = new ShiftManipulator(this); command->setSheet(sheet); command->add(Region(pasteArea.x(), pasteArea.y(), pasteWidth, pasteHeight, sheet)); command->setDirection(ShiftManipulator::ShiftRight); } } // This command will collect as many cell loads as possible in the iteration. PasteCellCommand *pasteCellCommand = 0; KoXmlElement e = root.firstChild().toElement(); // "columns", "rows" or "cell" for (; !e.isNull(); e = e.nextSibling().toElement()) { // If the element is not a cell, unset the pasteCellCommand pointer. // If existing, it is attached as child commnand, so no leaking here. if (e.tagName() != "cell") { pasteCellCommand = 0; } // entire columns given if (e.tagName() == "columns" && !sheet->isProtected()) { const int number = e.attribute("count").toInt(); if (m_insertMode == NoInsertion) { // Clear the existing content; not the column style. DeleteCommand *const command = new DeleteCommand(this); command->setSheet(m_sheet); const int col = e.attribute("column").toInt(); const int cols = qMax(pasteArea.width(), number); const Region region(col + xOffset, 1, cols, KS_rowMax, m_sheet); command->add(region); command->setMode(DeleteCommand::OnlyCells); } // Set the column style. ColumnFormat columnFormat; columnFormat.setSheet(sheet); KoXmlElement c = e.firstChild().toElement(); for (; !c.isNull(); c = c.nextSibling().toElement()) { if (c.tagName() != "column") { continue; } if (columnFormat.load(c, xOffset, m_pasteMode)) { const int col = columnFormat.column(); const int cols = qMax(pasteArea.width(), number); for (int coff = 0; col - xOffset + coff <= cols; coff += number) { ColumnStyleCommand *const command = new ColumnStyleCommand(this); command->setSheet(m_sheet); command->add(Region(col + coff, 1, 1, 1, m_sheet)); command->setTemplate(columnFormat); } } } } // entire rows given if (e.tagName() == "rows" && !sheet->isProtected()) { const int number = e.attribute("count").toInt(); if (m_insertMode == NoInsertion) { // Clear the existing content; not the row style. DeleteCommand *const command = new DeleteCommand(this); command->setSheet(m_sheet); const int row = e.attribute("row").toInt(); const int rows = qMax(pasteArea.height(), number); const Region region(1, row + yOffset, KS_colMax, rows, m_sheet); command->add(region); command->setMode(DeleteCommand::OnlyCells); } // Set the row style. RowFormat rowFormat; rowFormat.setSheet(sheet); KoXmlElement c = e.firstChild().toElement(); for (; !c.isNull(); c = c.nextSibling().toElement()) { if (c.tagName() != "row") { continue; } if (rowFormat.load(c, yOffset, m_pasteMode)) { const int row = rowFormat.row(); const int rows = qMax(pasteArea.height(), number); for (int roff = 0; row - yOffset + roff <= rows; roff += number) { RowStyleCommand *const command = new RowStyleCommand(this); command->setSheet(m_sheet); command->add(Region(1, rowFormat.row(), 1, 1, m_sheet)); command->setTemplate(rowFormat); } } } } if (e.tagName() == "cell") { // Create a new PasteCellCommand, if necessary. if (!pasteCellCommand) { pasteCellCommand = new PasteCellCommand(this); pasteCellCommand->setSheet(m_sheet); pasteCellCommand->m_pasteMode = m_pasteMode; pasteCellCommand->m_pasteOperation = m_operation; pasteCellCommand->m_pasteFC = m_pasteFC; } // Source cell location: const int row = e.attribute("row").toInt(); const int col = e.attribute("column").toInt(); // tile the selection with the clipboard contents for (int roff = 0; row + roff <= pasteHeight; roff += sourceHeight) { for (int coff = 0; col + coff <= pasteWidth; coff += sourceWidth) { kDebug(36005) << "cell at" << (col + xOffset + coff) << ',' << (row + yOffset + roff) << " with roff,coff=" << roff << ',' << coff << ", xOffset:" << xOffset << ", yOffset:" << yOffset << endl; // Destination cell: const Cell cell(sheet, col + xOffset + coff, row + yOffset + roff); // Do nothing, if the sheet and the cell are protected. if (sheet->isProtected() && !cell.style().notProtected()) { continue; } // Add the destination cell and the XML element itself. pasteCellCommand->addXmlElement(cell, e); } } } } return true; }
bool Validity::loadXML(Cell* const cell, const KoXmlElement& validityElement) { ValueParser *const parser = cell->sheet()->map()->parser(); bool ok = false; KoXmlElement param = validityElement.namedItem("param").toElement(); if (!param.isNull()) { if (param.hasAttribute("cond")) { d->cond = (Conditional::Type) param.attribute("cond").toInt(&ok); if (!ok) return false; } if (param.hasAttribute("action")) { d->action = (Action) param.attribute("action").toInt(&ok); if (!ok) return false; } if (param.hasAttribute("allow")) { d->restriction = (Restriction) param.attribute("allow").toInt(&ok); if (!ok) return false; } if (param.hasAttribute("valmin")) { d->minValue = parser->tryParseNumber(param.attribute("valmin"), &ok); if (!ok) return false; } if (param.hasAttribute("valmax")) { d->maxValue = parser->tryParseNumber(param.attribute("valmax"), &ok); if (!ok) return false; } if (param.hasAttribute("displaymessage")) { d->displayMessage = (bool)param.attribute("displaymessage").toInt(); } if (param.hasAttribute("displayvalidationinformation")) { d->displayValidationInformation = (bool)param.attribute("displayvalidationinformation").toInt(); } if (param.hasAttribute("allowemptycell")) { d->allowEmptyCell = (bool)param.attribute("allowemptycell").toInt(); } if (param.hasAttribute("listvalidity")) { d->listValidity = param.attribute("listvalidity").split(';', QString::SkipEmptyParts); } } KoXmlElement inputTitle = validityElement.namedItem("inputtitle").toElement(); if (!inputTitle.isNull()) { d->titleInfo = inputTitle.text(); } KoXmlElement inputMessage = validityElement.namedItem("inputmessage").toElement(); if (!inputMessage.isNull()) { d->messageInfo = inputMessage.text(); } KoXmlElement titleElement = validityElement.namedItem("title").toElement(); if (!titleElement.isNull()) { d->title = titleElement.text(); } KoXmlElement messageElement = validityElement.namedItem("message").toElement(); if (!messageElement.isNull()) { d->message = messageElement.text(); } KoXmlElement timeMinElement = validityElement.namedItem("timemin").toElement(); if (!timeMinElement.isNull()) { d->minValue = parser->tryParseTime(timeMinElement.text()); } KoXmlElement timeMaxElement = validityElement.namedItem("timemax").toElement(); if (!timeMaxElement.isNull()) { d->maxValue = parser->tryParseTime(timeMaxElement.text()); } KoXmlElement dateMinElement = validityElement.namedItem("datemin").toElement(); if (!dateMinElement.isNull()) { d->minValue = parser->tryParseTime(dateMinElement.text()); } KoXmlElement dateMaxElement = validityElement.namedItem("datemax").toElement(); if (!dateMaxElement.isNull()) { d->maxValue = parser->tryParseTime(dateMaxElement.text()); } return true; }