Slide 1

Slide 1 text

InteropGrabBag in LibreOffice Writer Miklos Vajna 2014­02­01

Slide 2

Slide 2 text

Filter problems

Slide 3

Slide 3 text

3 / 15 FOSDEM 2014 | Miklos Vajna What is a filter problem? ● Filters map between an input/output stream and the document model ● A given filter: given file format ● If a feature in a file format is not roundtripped perfectly through the document model

Slide 4

Slide 4 text

4 / 15 FOSDEM 2014 | Miklos Vajna Case #0: feature is already in core ● RTF import, groupshape support

Slide 5

Slide 5 text

5 / 15 FOSDEM 2014 | Miklos Vajna Case #1: Implement the feature in core

Slide 6

Slide 6 text

6 / 15 FOSDEM 2014 | Miklos Vajna Case #2: Import the result of the feature in the filter ● E.g. Table styles, document themes ● SmartArt import ● On import, apply the result of that as direct formatting ● Better, than nothing, but no real editing can be performed

Slide 7

Slide 7 text

InteropGrabBag

Slide 8

Slide 8 text

8 / 15 FOSDEM 2014 | Miklos Vajna Case #3: Just preserve it ● If a feature is completely unsupported by core, it makes sense to first just preserve it ● Use case: ● Long document ● Full of complicated features ● Just want to correct a typo

Slide 9

Slide 9 text

9 / 15 FOSDEM 2014 | Miklos Vajna We do it for ODF already ● css::xml::ParaUserDefinedAttributesSupplier ● css::xml::TextUserDefinedAttributesSupplier ● css::xml::UserDefinedAttributesSupplier ● “The idea behind this property is that a parser can throw away all attributes that it cannot handle by itself […] can be written back without loss.” ● WW8 as well: SwTOXBase::maMSTOCExpression

Slide 10

Slide 10 text

10 / 15 FOSDEM 2014 | Miklos Vajna Why a new API? ● Need separate storage ● ODF foreign format → – Would need manual mapping anyway ● Need a more flexible data structure ● UserDefinedAttributes is just a string­string map ● We want to store nested structures as well

Slide 11

Slide 11 text

11 / 15 FOSDEM 2014 | Miklos Vajna The InteropGrabBag API ● New SfxPoolItem: SfxGrabBagItem ● Writer: RES_{CHR,PAR}ATR_GRABBAG, etc. ● UNO: InteropGrabBag property ● Type: css::beans::PropertyValues – Effectively a string­any map

Slide 12

Slide 12 text

12 / 15 FOSDEM 2014 | Miklos Vajna A set of bags ● Each UNO object may implement it, currently supported: ● css::document::OfficeDocument ● css::drawing::Shape ● css::style::CharacterProperties ● css::style::ParagraphProperties ● css::style::Style ● css::text::BaseFrameProperties

Slide 13

Slide 13 text

13 / 15 FOSDEM 2014 | Miklos Vajna The danger of hidden properties ● Problem: e.g. paragraph border is not supported, hidden “big black border” property ● User copy&pastes it elsewhere ● Result: pasted paragraph still has that property, probably not wanted ● Solution: clear InteropGrabBag on copying / when object is altered

Slide 14

Slide 14 text

14 / 15 FOSDEM 2014 | Miklos Vajna Just for Writer? ● The API is generic to be used in Calc, Impress, etc. ● Currently mostly implemented for Writer only ● Just for OOXML? ● It's the only user ATM ● Different properties can happy co­exist – Most of current keys are prefixed with OOX anyway

Slide 15

Slide 15 text

15 / 15 FOSDEM 2014 | Miklos Vajna Conclusions ● The end result: much improved OOXML roundtrip ● Now perfect roundtrip examples (incomplete list): ● Document themes ● SmartArt ● Table styles