<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="Generator" content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        line-height:150%;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        line-height:150%;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
.MsoPapDefault
        {mso-style-type:export-only;
        line-height:150%;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:495847262;
        mso-list-type:hybrid;
        mso-list-template-ids:1672086210 493384130 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-weight:bold;
        mso-bidi-font-weight:bold;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style></head><body lang="EN-US" link="#0563C1" vlink="#954F72"><div class="WordSection1"><p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Hi,</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Thanks for the pointers.</span></p><p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">I've now come around to start working on this.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">After analyzing - I've noticed that normal 'tabs' in Word work like this:</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"><img width="779" height="500" id="Picture_x0020_1" src="cid:image001.jpg@01CE9201.1C26F1E0"></span><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">You have a '<w:tabs>' node that holds inside a series of 'w:tab' nodes that give information about TabStops.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">This is translated to an 'SvxTabStopItem' that holds a list of 'TabStopItem' objects.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Each of them has different properties than what I need for the new 'SvxPositionalTabItem' class that I need.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">So I've decided to create a new class that holds the properties.</span></p><p class="MsoNormal">
<span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"><br>I have a few rather simple questions:</span></p><p class="MsoListParagraph" style><b><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"><span style>1.<span style="font:7.0pt "Times New Roman"">       </span></span></span></b><span dir="LTR"></span><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">I see that some classes in '/editeng/source/items' have a 'QueryValue' and 'PutValue' and some don't.<br>
What is the logic for deciding if an 'SfxPoolItem' should or should not implement these 2 functions?<br>AFAIK - these 2 functions are mandatory if you want be able to use UNO mapping with these classes, no?<br>So how come there are classes that don't implement these 2 functions?</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"> </span></p><p class="MsoListParagraph" style><b><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"><span style>2.<span style="font:7.0pt "Times New Roman"">       </span></span></span></b><span dir="LTR"></span><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">I see that there is a function called 'GetPresentation'.<br>
I am not sure what is the logic in the function and how I am supposed to implement it for a 'Positional Tab'.<br>Can someone shed some light on this?</span></p><p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"> </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Once I get the 'SvxPositionalTabItem' nailed down - what would be the obvious next step to do ?</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Add some UNO mapping logic ?</span></p><p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Add rendering logic for the positional tab item ?</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Add import \ export from DOCX ? (that’s where it all started)</span></p><p class="MsoNormal">
<span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d"> </span></p><p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">Best,</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;line-height:150%;font-family:"Calibri","sans-serif";color:#1f497d">       Adam Fyne</span></p><p class="MsoPlainText">       </p><p class="MsoPlainText">
-----Original Message-----<br>From: Miklos Vajna [mailto:<a href="mailto:vmiklos@suse.cz">vmiklos@suse.cz</a>] <br>Sent: Monday, July 1, 2013 11:44 AM<br>To: Adam Fyne<br>Cc: <a href="mailto:libreoffice@lists.freedesktop.org">libreoffice@lists.freedesktop.org</a><br>
Subject: Re: Guidance on 'Paragraph Tab' bug</p><p class="MsoPlainText"> </p><p class="MsoPlainText">Hi Adam,</p><p class="MsoPlainText"> </p><p class="MsoPlainText">On Thu, Jun 27, 2013 at 06:18:09PM +0300, Adam Fyne <<a href="mailto:Adam.Fyne@cloudon.com"><span style="color:windowtext;text-decoration:none">Adam.Fyne@cloudon.com</span></a>> wrote:</p>
<p class="MsoPlainText">> I didn't post this on the IRC because it is too long and too specific, </p><p class="MsoPlainText">> and I feel it will be lost there…</p><p class="MsoPlainText"> </p><p class="MsoPlainText">
Sure, for some kind of discussions the mailing list is a better place.</p><p class="MsoPlainText"> </p><p class="MsoPlainText">> I want to fix a bug with import \ export of a 'Paragraph Tab'.</p><p class="MsoPlainText">
> </p><p class="MsoPlainText">> I've attached a really simple DOCX with such a paragraph tab.</p><p class="MsoPlainText">> </p><p class="MsoPlainText">> The XML node is 'w:ptab' inside a 'run' node.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">I see. Indeed, looks like this is not imported (correctly).</p><p class="MsoPlainText"> </p><p class="MsoPlainText">> When it goes through Writer – it is transformed to a simple tab.</p>
<p class="MsoPlainText">> </p><p class="MsoPlainText">> I would like to fix this so that the 'ptab' is:</p><p class="MsoPlainText">> </p><p class="MsoPlainText">> 1.       Import 'ptab' from DOCX</p>
<p class="MsoPlainText">> </p><p class="MsoPlainText">> 2.       Store the 'ptab' attributes in the Writer's core</p><p class="MsoPlainText">> </p><p class="MsoPlainText">> 3.       Render correctly on the screen (2nd run will be aligned to the</p>
<p class="MsoPlainText">> right)</p><p class="MsoPlainText">> </p><p class="MsoPlainText">> 4.       Export 'ptab' back to DOCX</p><p class="MsoPlainText"> </p><p class="MsoPlainText">Hmm, this sounds like a new feature -- doing that would be great, but I would suggest to finish your previous feature first (the character shading one), where the ODF filters are not yet updated.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">> After doing some digging, I found this in 'model.xml':</p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22530  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22530"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22530</span></a>></p>
<p class="MsoPlainText">>    <resource *name=*"CT_PTab" *resource=*"Stream" *tag=*"paragraph"></p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22531  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22531"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22531</span></a>></p>
<p class="MsoPlainText">>      <attribute *name=*"alignment"</p><p class="MsoPlainText">> *tokenid=*"ooxml:CT_PTab_alignment"/></p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22532  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22532"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22532</span></a>></p>
<p class="MsoPlainText">>      <attribute *name=*"relativeTo"</p><p class="MsoPlainText">> *tokenid=*"ooxml:CT_PTab_relativeTo"/></p><p class="MsoPlainText">> </p><p class="MsoPlainText">
>    22533  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22533"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22533</span></a>></p>
<p class="MsoPlainText">>      <attribute *name=*"leader" *tokenid=*"ooxml:CT_PTab_leader"/></p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22534  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22534"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22534</span></a>></p>
<p class="MsoPlainText">>      <action *name=*"end" *action=*"tab"/></p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22535  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22535"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22535</span></a>></p>
<p class="MsoPlainText">>    </resource></p><p class="MsoPlainText">> </p><p class="MsoPlainText">> </p><p class="MsoPlainText">> </p><p class="MsoPlainText">> And also found this:</p><p class="MsoPlainText">
> </p><p class="MsoPlainText">>    22574  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22574"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22574</span></a>></p>
<p class="MsoPlainText">>    <resource *name=*"CT_Tab" *resource=*"Stream" *tag=*"content"></p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22575  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22575"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22575</span></a>></p>
<p class="MsoPlainText">>      <action *name=*"end" *action=*"tab"/></p><p class="MsoPlainText">> </p><p class="MsoPlainText">>    22576  <<a href="http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22576"><span style="color:windowtext;text-decoration:none">http://opengrok.libreoffice.org/xref/core/writerfilter/source/ooxml/model.xml#22576</span></a>></p>
<p class="MsoPlainText">>    </resource></p><p class="MsoPlainText">> </p><p class="MsoPlainText">> </p><p class="MsoPlainText">> </p><p class="MsoPlainText">> I have a few questions:</p><p class="MsoPlainText">
> </p><p class="MsoPlainText">> 1.       Shouldn't "CT_PTab" call "ptab" instead of "tab"?</p><p class="MsoPlainText"> </p><p class="MsoPlainText">That's right, except that writerfilter::ooxml::OOXMLFastContextHandler</p>
<p class="MsoPlainText">has a tab() method, but no ptab() method, that will be one thing you need to implement first.</p><p class="MsoPlainText"> </p><p class="MsoPlainText">> 2.       What is the meaning of the 'tag' attribute of the 'resource' node?</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">As far as I know, the <action .. action="name"/> is always a method call.</p><p class="MsoPlainText"> </p><p class="MsoPlainText">> 3.       The way information is stored in 'model.xml' is so confusing.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">You're not alone, writerfilter/documentation/ooxml/model.xml is what we found out so far, feel free to extend that if you manage to decode some more detail.</p><p class="MsoPlainText">
 </p><p class="MsoPlainText">In short, whenever you add support for new XML tags, you typically need to extend the file at two places:</p><p class="MsoPlainText"> </p><p class="MsoPlainText">- the new tag is a child of some existing tag, so extend the parent's</p>
<p class="MsoPlainText">  definition</p><p class="MsoPlainText">- you also need to add a matching <resource> tag in model.xml</p><p class="MsoPlainText"> </p><p class="MsoPlainText">Once those two definitions match, you get new tokens in dmapper.</p>
<p class="MsoPlainText">363dafefad14411a16f6ea9d2ee0d55b67bc9c8d is hopefully a good example.</p><p class="MsoPlainText">(Though your case is easier, as you add a new token in an existing</p><p class="MsoPlainText">namespace.)</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">> Some of the info is stored like this (resource + attributes + action), </p><p class="MsoPlainText">> some are stored as 'define' + 'attribute' + 'ref', some are stored as </p>
<p class="MsoPlainText">> 'resource' + 'value's.</p><p class="MsoPlainText">> This is more of a general question, but – what is the difference </p><p class="MsoPlainText">> between these nodes?</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">First probably it makes sense to see how RELAX NG works, e.g. have a look at the RELAX NG definition of the ODF format. ref/define is just a way to avoid copy&paste, you define something first, then you can refer to it (by name, using "ref") multiple times. If I'm not mistaken, the only non-RELAX NG tag you need in model.xml is the <resource> one, as explained above.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">> From the code – I understood that 'action' calls a function in </p><p class="MsoPlainText">> "OOXMLFastContextHandler".</p><p class="MsoPlainText">
> </p><p class="MsoPlainText">> When do we need such actions? Why is this done on some nodes and on </p><p class="MsoPlainText">> other nodes (like 'run', 'paragraph', 'brush' etc) not done?</p>
<p class="MsoPlainText">> </p><p class="MsoPlainText">> </p><p class="MsoPlainText">> So – say I need to add a new function called 'ptab' to </p><p class="MsoPlainText">> 'OOXMLFastContextHandler' – Do I simply copy the logic of 'tab()' ?</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">I think it's all about where do you want to handle the input. Normally, the tokenizer just generates these tokens, and dmapper does the mapping.</p><p class="MsoPlainText">
 </p><p class="MsoPlainText">However, in case of tabs, other (RTF, WW8) formats handle the tab as a normal character, so in case of DOCX, an action is used, that converts the OOXML tokens to a simple character, so in dmapper you always get a tab character. So actions are used to generate these "fake tokens".</p>
<p class="MsoPlainText">Other example: w:hyperlink is also handled in the tokenizer, and it generates a HYPERLINK field from it, and dmapper handles only that.</p><p class="MsoPlainText"> </p><p class="MsoPlainText">> What does the 'utext' function do?</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">Apart from logging, see</p><p class="MsoPlainText">writerfilter::dmapper::DomainMapper::lcl_utext(). That's where dmapper recieves all the unicode text input.</p><p class="MsoPlainText">
 </p><p class="MsoPlainText">> Where do I parse the attributes themselves of the 'ptab'?</p><p class="MsoPlainText"> </p><p class="MsoPlainText">If you handle ptab as a normal element in model.xml, you'll have the usual way to get all its attributes. I would recommend going that way, as ptab is not a character (tab is), but an element with attributes.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">> So I hope after I read your advice from this email – I will implement </p><p class="MsoPlainText">> the 'DOCX importer' for the 'ptab'.</p><p class="MsoPlainText">
> </p><p class="MsoPlainText">> Should I then create a *new* core object for the 'Paragraph Tab' or </p><p class="MsoPlainText">> should I add it as properties to some existing object of the core?</p><p class="MsoPlainText">
 </p><p class="MsoPlainText">I would check how existing similar features are implement, and do something similar. Normal tabs are not a good example, as those are stored as a \t character inside SwTxtNode, but page break may be a good example.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">> This email is too long, so I won't burden you now with 'rendering' and </p><p class="MsoPlainText">> 'exporter' questions…</p><p class="MsoPlainText">
 </p><p class="MsoPlainText">Sure, so -- as usual, the first step would be to design how the document model should store these paragraph tabs, then either do the UNO API or some UI, so you can test it. Then you can continue with filters and layout, etc.</p>
<p class="MsoPlainText"> </p><p class="MsoPlainText">Hope this helps,</p><p class="MsoPlainText"> </p><p class="MsoPlainText">Miklos</p></div></body></html>