You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openoffice.apache.org by Erik Engstrom <en...@g.cofc.edu> on 2015/03/24 03:55:00 UTC
Help finding word count bug in source
Hey developers,
I'd like to work on a fix for issue #121672, but I'm not sure where to look
in the source code for the word count function. Could anyone give me a hint
as to where to look?
Thank you,
Erik
Re: Help finding word count bug in source
Posted by Erik Engstrom <en...@g.cofc.edu>.
Ariel,
Wow, I really appreciate your thoughtful reply!
Thank you,
Erik
On Thu, Mar 26, 2015 at 5:58 AM, Ariel Constenla-Haile <ar...@apache.org>
wrote:
> Hi Erik,
>
> On Mon, Mar 23, 2015 at 10:55:00PM -0400, Erik Engstrom wrote:
> > Hey developers,
> >
> > I'd like to work on a fix for issue #121672, but I'm not sure where to
> look
> > in the source code for the word count function. Could anyone give me a
> hint
> > as to where to look?
>
> I only know a little about application framework, not Writer code; but
> this is what I'd do to find the code. There are different approaches,
> but I will search the UNO command (you could also search the dialog
> title in src files):
>
> - Start from the UI. The menu that triggers the Word Count dialog has
> the text "Word Count". All commands in toolbars and menus are
> identified by a single string named the UNO command; this command is
> bound to a string describing the feature in the UI, this binding is made
> in configuration files under
> main/officecfg/registry/data/org/openoffice/Office/UI/
> Let's find the UNO command for this string:
> http://opengrok.adfinis-sygroup.org/source/search
> Full Search: "Word Count"
> File Path: xcu
> In Project(s): aoo-trunk
>
> http://opengrok.adfinis-sygroup.org/source/search?q=%22Word+Count%22&defs=&refs=&path=xcu&hist=&project=aoo-trunk
> The string is here:
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu#1668
> The command is ".uno:WordCountDialog"
>
> - the UNO command represents a feature that has states (can be
> enabled/disabled, checked/unchecked, etc.) and can be executed
> ("dispatched"). Every item in a toolbar/menu/statusbar is managed in
> the application framework by a controller that listens for status
> updates at a dispatch object, which is also responsible of execute the
> feature.
> Once you have the UNO command, find where is the code that dispatches
> the command and/or provides its state.
> In applications based on the application framework (chart2, dbaccess,
> reportdesign), this would be rather straight-forward. The other
> applications are based on the old SFX2 framework, and is more
> complicated to understand. You can find a technical explanation here
>
> https://wiki.openoffice.org/wiki/Framework/Article/Implementation_of_the_Dispatch_API_In_SFX2
> and some examples in this message
> http://markmail.org/message/w2hhxnectkeehdvg
>
> In the sfx2 world you need to find the slot definition and the shell
> interface(s) that has(have) the methods that provide the state and
> execution.
> We search the UNO command without the protocol part:
> Full Search: WordCountDialog
> File Path: sdi
>
> http://opengrok.adfinis-sygroup.org/source/search?q=WordCountDialog&defs=&refs=&path=sdi&hist=&project=aoo-trunk
> The slot is defined in main/sw/sdi/swriter.sdi
> SfxVoidItem WordCountDialog FN_WORDCOUNT_DIALOG
>
> With the ID, FN_WORDCOUNT_DIALOG you can search the shell interfaces:
>
> http://opengrok.adfinis-sygroup.org/source/search?q=FN_WORDCOUNT_DIALOG&defs=&refs=&path=sdi&hist=&project=aoo-trunk
> and the implementation:
>
> http://opengrok.adfinis-sygroup.org/source/search?q=FN_WORDCOUNT_DIALOG&defs=&refs=&path=cxx&hist=&project=aoo-trunk
>
> The code does basically the same in the different shells:
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/textsh1.cxx#1357
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/annotsh.cxx#452
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/frmsh.cxx#273
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/drwtxtex.cxx#416
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/drawsh.cxx#338
>
> You can set a break point in any of them, they lead you to:
>
> void SwDoc::CountWords( const SwPaM& rPaM, SwDocStat& rStat ) const
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/core/doc/docedt.cxx#2787
>
> void SwTxtNode::CountWords( SwDocStat& rStat, xub_StrLen nStt, xub_StrLen
> nEnd ) const
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/core/txtnode/txtedt.cxx#1939
>
> It seams that
>
> a) word counting is done on a text node basis; this
> information is cached on the text node, that is, when you insert a new
> word the whole document isn't counted again and again (look for
> SetWordCountDirty, it will tell you when this information is
> invalidated)
>
> b) in the end, Writer uses the break iterator API. I do the same in this
> extension:
> http://extensions.openoffice.org/en/project/word-count-statusbar-controller
> I get the word count for the whole document from the document
> statistics, so the bug is there too. But for the selection I use the
> break iterator manually, and you'll see that the bug isn't reproducible
> in the statusbar control (unfortunately there is no way to cache word
> count using the API, so the selection word count is limited to a certain
> amount of text). In short, I guess that the bug is not in the break
> iterator
> code but in Writer.
>
> ------
>
> If you wanted to take the other approach, search the dialog title:
>
> - dialogs are defined in .src files, so search the following:
>
> http://opengrok.adfinis-sygroup.org/source/search?q=%22Word+Count%22&defs=&refs=&path=src&hist=&project=aoo-trunk
> the result is
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/wordcountdialog.src#32
>
> - Get the ID of the dialog and search it in the source:
> ModalDialog DLG_WORDCOUNT
>
>
> http://opengrok.adfinis-sygroup.org/source/search?q=DLG_WORDCOUNT&defs=&refs=&path=cxx&hist=&project=aoo-trunk
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/wordcountdialog.cxx#50
>
> - SwWordCountDialog will lead you to the dialog factory:
>
> http://opengrok.adfinis-sygroup.org/source/s?refs=SwWordCountDialog&project=aoo-trunk
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/swdlgfact.hxx#78
>
> http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/swdlgfact.cxx#661
> which creates a AbstractSwWordCountDialog
>
> - search that dialog, you'll get the shells:
>
> http://opengrok.adfinis-sygroup.org/source/search?q=AbstractSwWordCountDialog&defs=&refs=&path=cxx&hist=&project=aoo-trunk
>
> ------
>
> Hope this helps you getting started.
>
>
> Regards
> --
> Ariel Constenla-Haile
> La Plata, Argentina
>
Re: Help finding word count bug in source
Posted by Ariel Constenla-Haile <ar...@apache.org>.
Hi Erik,
On Mon, Mar 23, 2015 at 10:55:00PM -0400, Erik Engstrom wrote:
> Hey developers,
>
> I'd like to work on a fix for issue #121672, but I'm not sure where to look
> in the source code for the word count function. Could anyone give me a hint
> as to where to look?
I only know a little about application framework, not Writer code; but
this is what I'd do to find the code. There are different approaches,
but I will search the UNO command (you could also search the dialog
title in src files):
- Start from the UI. The menu that triggers the Word Count dialog has
the text "Word Count". All commands in toolbars and menus are
identified by a single string named the UNO command; this command is
bound to a string describing the feature in the UI, this binding is made
in configuration files under
main/officecfg/registry/data/org/openoffice/Office/UI/
Let's find the UNO command for this string:
http://opengrok.adfinis-sygroup.org/source/search
Full Search: "Word Count"
File Path: xcu
In Project(s): aoo-trunk
http://opengrok.adfinis-sygroup.org/source/search?q=%22Word+Count%22&defs=&refs=&path=xcu&hist=&project=aoo-trunk
The string is here:
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu#1668
The command is ".uno:WordCountDialog"
- the UNO command represents a feature that has states (can be
enabled/disabled, checked/unchecked, etc.) and can be executed
("dispatched"). Every item in a toolbar/menu/statusbar is managed in
the application framework by a controller that listens for status
updates at a dispatch object, which is also responsible of execute the
feature.
Once you have the UNO command, find where is the code that dispatches
the command and/or provides its state.
In applications based on the application framework (chart2, dbaccess,
reportdesign), this would be rather straight-forward. The other
applications are based on the old SFX2 framework, and is more
complicated to understand. You can find a technical explanation here
https://wiki.openoffice.org/wiki/Framework/Article/Implementation_of_the_Dispatch_API_In_SFX2
and some examples in this message
http://markmail.org/message/w2hhxnectkeehdvg
In the sfx2 world you need to find the slot definition and the shell
interface(s) that has(have) the methods that provide the state and execution.
We search the UNO command without the protocol part:
Full Search: WordCountDialog
File Path: sdi
http://opengrok.adfinis-sygroup.org/source/search?q=WordCountDialog&defs=&refs=&path=sdi&hist=&project=aoo-trunk
The slot is defined in main/sw/sdi/swriter.sdi
SfxVoidItem WordCountDialog FN_WORDCOUNT_DIALOG
With the ID, FN_WORDCOUNT_DIALOG you can search the shell interfaces:
http://opengrok.adfinis-sygroup.org/source/search?q=FN_WORDCOUNT_DIALOG&defs=&refs=&path=sdi&hist=&project=aoo-trunk
and the implementation:
http://opengrok.adfinis-sygroup.org/source/search?q=FN_WORDCOUNT_DIALOG&defs=&refs=&path=cxx&hist=&project=aoo-trunk
The code does basically the same in the different shells:
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/textsh1.cxx#1357
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/annotsh.cxx#452
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/frmsh.cxx#273
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/drwtxtex.cxx#416
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/shells/drawsh.cxx#338
You can set a break point in any of them, they lead you to:
void SwDoc::CountWords( const SwPaM& rPaM, SwDocStat& rStat ) const
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/core/doc/docedt.cxx#2787
void SwTxtNode::CountWords( SwDocStat& rStat, xub_StrLen nStt, xub_StrLen nEnd ) const
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/core/txtnode/txtedt.cxx#1939
It seams that
a) word counting is done on a text node basis; this
information is cached on the text node, that is, when you insert a new
word the whole document isn't counted again and again (look for
SetWordCountDirty, it will tell you when this information is
invalidated)
b) in the end, Writer uses the break iterator API. I do the same in this
extension:
http://extensions.openoffice.org/en/project/word-count-statusbar-controller
I get the word count for the whole document from the document
statistics, so the bug is there too. But for the selection I use the
break iterator manually, and you'll see that the bug isn't reproducible
in the statusbar control (unfortunately there is no way to cache word
count using the API, so the selection word count is limited to a certain
amount of text). In short, I guess that the bug is not in the break iterator
code but in Writer.
------
If you wanted to take the other approach, search the dialog title:
- dialogs are defined in .src files, so search the following:
http://opengrok.adfinis-sygroup.org/source/search?q=%22Word+Count%22&defs=&refs=&path=src&hist=&project=aoo-trunk
the result is
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/wordcountdialog.src#32
- Get the ID of the dialog and search it in the source:
ModalDialog DLG_WORDCOUNT
http://opengrok.adfinis-sygroup.org/source/search?q=DLG_WORDCOUNT&defs=&refs=&path=cxx&hist=&project=aoo-trunk
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/wordcountdialog.cxx#50
- SwWordCountDialog will lead you to the dialog factory:
http://opengrok.adfinis-sygroup.org/source/s?refs=SwWordCountDialog&project=aoo-trunk
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/swdlgfact.hxx#78
http://opengrok.adfinis-sygroup.org/source/xref/aoo-trunk/main/sw/source/ui/dialog/swdlgfact.cxx#661
which creates a AbstractSwWordCountDialog
- search that dialog, you'll get the shells:
http://opengrok.adfinis-sygroup.org/source/search?q=AbstractSwWordCountDialog&defs=&refs=&path=cxx&hist=&project=aoo-trunk
------
Hope this helps you getting started.
Regards
--
Ariel Constenla-Haile
La Plata, Argentina