openoffice-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ariel Constenla-Haile <arie...@apache.org>
Subject Re: Help finding word count bug in source
Date Thu, 26 Mar 2015 09:58:52 GMT
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

Mime
View raw message