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