241
240
// 3) frames that are not anchored but freely positioned somewhere on the page.
242
241
// in ODF terms those frames are page-anchored.
244
if (fs->frameCount() == 1 && fs->frames().first()->shape()->parent())
245
continue; // is a frame that is anchored to text, don't save those here.
243
if (fs->frameCount() == 1) {
244
KoShape *shape = fs->frames().first()->shape();
245
// may be a frame that is anchored to text, don't save those here.
246
// but first check since clipped shapes look similar, but are not anchored to text
247
if (shape->parent() && !shape->parent()->isClipped(shape))
247
251
KWTextFrameSet *tfs = dynamic_cast<KWTextFrameSet*>(fs);
269
272
const QList<KWFrame*> frames = fs->frames();
270
273
for (int i = 0; i < frames.count(); ++i) {
271
274
KWFrame *frame = frames.at(i);
272
KoShape *shape = frame->shape();
273
// frame properties first
274
shape->setAdditionalStyleAttribute("fo:margin", QString::number(frame->runAroundDistance()) + "pt");
275
shape->setAdditionalStyleAttribute("style:horizontal-pos", "from-left");
276
shape->setAdditionalStyleAttribute("style:horizontal-rel", "page");
277
shape->setAdditionalStyleAttribute("style:vertical-pos", "from-top");
278
shape->setAdditionalStyleAttribute("style:vertical-rel", "page");
280
switch (frame->textRunAround()) {
281
case KWord::RunAround:
282
switch (frame->runAroundSide()) {
283
case KWord::BiggestRunAroundSide: value = "biggest"; break;
284
case KWord::LeftRunAroundSide: value = "left"; break;
285
case KWord::RightRunAroundSide: value = "right"; break;
286
case KWord::AutoRunAroundSide: value = "dynamic"; break;
287
case KWord::BothRunAroundSide: value = "parallel"; break;
290
case KWord::RunThrough:
291
value = "run-through";
293
case KWord::NoRunAround:
297
shape->setAdditionalStyleAttribute("style:wrap", value);
299
switch (frame->frameBehavior()) {
300
case KWord::AutoCreateNewFrameBehavior:
301
value = "auto-create-new-frame";
303
case KWord::IgnoreContentFrameBehavior:
306
case KWord::AutoExtendFrameBehavior:
307
// the third case, AutoExtendFrame is handled by min-height
309
KWTextFrame *tf = dynamic_cast<KWTextFrame*>(frame);
310
if (tf && tf->minimumFrameHeight() > 1)
311
shape->setAdditionalAttribute("fo:min-height", QString::number(tf->minimumFrameHeight()) + "pt");
314
if (!value.isEmpty())
315
shape->setAdditionalStyleAttribute("style:overflow-behavior", value);
317
if (frame->frameBehavior() != KWord::IgnoreContentFrameBehavior) {
318
switch (frame->newFrameBehavior()) {
319
case KWord::ReconnectNewFrame: value = "followup"; break;
320
case KWord::NoFollowupFrame: value.clear(); break; // "none" is the default
321
case KWord::CopyNewFrame: value = "copy"; break;
323
if (!value.isEmpty()) {
324
shape->setAdditionalStyleAttribute("koffice:frame-behavior-on-new-page", value);
325
if (! frame->frameOnBothSheets())
326
shape->setAdditionalAttribute("koffice:frame-copy-to-facing-pages", "true");
330
if (frame->isCopy()) {
331
Q_ASSERT(lastNonCopyFrame);
332
shape->setAdditionalAttribute("draw:copy-of", lastNonCopyFrame->shape()->name());
334
lastNonCopyFrame = frame;
338
KWPage page = m_document->pageManager()->page(shape);
339
const qreal pagePos = page.offsetInDocument();
341
const int effectiveZIndex = shape->zIndex() + m_zIndexOffsets.value(page);
342
shape->setAdditionalAttribute("draw:z-index", QString::number(effectiveZIndex));
343
shape->setAdditionalAttribute("text:anchor-type", "page");
344
shape->setAdditionalAttribute("text:anchor-page-number", QString::number(page.pageNumber()));
345
context.addShapeOffset(shape, QMatrix(1, 0, 0 , 1, 0, -pagePos));
346
shape->saveOdf(context);
347
context.removeShapeOffset(shape);
348
shape->removeAdditionalAttribute("draw:copy-of");
349
shape->removeAdditionalAttribute("draw:z-index");
350
shape->removeAdditionalAttribute("fo:min-height");
351
shape->removeAdditionalAttribute("koffice:frame-copy-to-facing-pages");
352
shape->removeAdditionalAttribute("text:anchor-page-number");
353
shape->removeAdditionalAttribute("text:anchor-page-number");
354
shape->removeAdditionalAttribute("text:anchor-type");
275
KWPage page = m_document->pageManager()->page(frame->shape());
276
frame->saveOdf(context, page, m_zIndexOffsets.value(page));
383
305
tmpChangeFile.close();
384
306
bodyWriter->addCompleteElement(&tmpChangeFile);
386
bodyWriter->startElement("text:page-sequence");
387
foreach (KWPage page, m_document->pageManager()->pages()) {
388
Q_ASSERT(m_masterPages.contains(page.pageStyle()));
389
bodyWriter->startElement("text:page");
390
bodyWriter->addAttribute("text:master-page-name", m_masterPages.value(page.pageStyle()));
391
bodyWriter->endElement(); // text:page
308
// Do not write out text:page-sequence, if there is a maintTextFrame
309
// The ODF specification does not allow text:page-sequence in office:text
310
// if there is e.g. text:p or text:h there
311
if (!mainTextFrame) {
312
bodyWriter->startElement("text:page-sequence");
313
foreach (KWPage page, m_document->pageManager()->pages()) {
314
Q_ASSERT(m_masterPages.contains(page.pageStyle()));
315
bodyWriter->startElement("text:page");
316
bodyWriter->addAttribute("text:master-page-name",
317
m_masterPages.value(page.pageStyle()));
318
bodyWriter->endElement(); // text:page
320
bodyWriter->endElement(); // text:page-sequence
393
bodyWriter->endElement(); // text:page-sequence
395
323
delete tmpBodyWriter;
396
324
tmpBodyWriter = 0;