scsolver code documentation

Inspired by the on-line OOo code documentation that Thorsten put together, I have decided to do the same for my humble scsolver project. I’m pleasantly surprised how good of class diagram that doxygen generates with GraphViz, since the last time I tried doxygen the diagram was very minimalistic only because I didn’t have GraphViz available on my system. Still the digram looks a little too noisy for my taste, but it’s very impressive.

OOo class diagram

For those of you who missed my announcement on the go-oo development list, here is the OOo class diagram that I’ve been working on ever since I started hacking the OOo code base who know how many years ago. It’s an Draw document, so you should be able to open this in OOo. I’ve also made a pdf version of it as well.

It’s loosely UML-like, with my own conventions and notes thrown in. I started this to supplement my code-reading process, as drawing a digram helps me to digest the code I’ve just read, and also to refresh my memory on the second visit of the same code. Each page represents an individual module, although I had to break up the sc module into several pages as it grew too large to fit into a single page. Styles are used to classify each drawing objects.

Anyway, I’ve decided to make it publicly available in hopes that someone else will find it useful. Admittedly it’s no way near being complete since I have not visited every corner of OOo’s code base (no one has), but I’m constantly expanding this diagram as I read more and more OOo code.

Want a sneak peak? Here is a screenshot of the sc module class diagram (click on the image to see it at a larger scale):
sc module diagram (thumbnail)

How to (pretend to) write an export filter

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /homepages/7/d105059906/htdocs/ on line 383

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /homepages/7/d105059906/htdocs/ on line 383

It turns out that pretending to write an export filter, at least adding a new entry to the Export dialog, is quite easy. In fact, you don’t even have to write a single line of code. Here is what to do.

Suppose you do your own build, and you have installed the OO.o that you have built. Now, go back to your build tree, and change directory into the following location


and add the following two new files relative to this location:


You can name your files anyway you want, of course. ;-) Anyway, put the following XML fragments into these files:

<!-- calc_Kohei_SDF_Filter.xcu -->
<node oor:name="calc_Kohei_SDF_Filter" oor:op="replace">
  <prop oor:name="Flags"><value>EXPORT ALIEN 3RDPARTYFILTER</value></prop>
  <prop oor:name="UIComponent"/>
  <prop oor:name="FilterService"><value></value></prop>
  <prop oor:name="UserData"/>
  <prop oor:name="FileFormatVersion"/>
  <prop oor:name="Type"><value>Kohei_SDF</value></prop>
  <prop oor:name="TemplateName"/>
  <prop oor:name="DocumentService"><value></value></prop>
<!-- calc_Kohei_SDF_Filter_ui.xcu -->
<node oor:name="calc_Kohei_SDF_Filter">
  <prop oor:name="UIName"><value xml:lang="x-default">Kohei Super Duper File Format</value>
    <value xml:lang="en-US">Kohei Super Duper File Format</value>
    <value xml:lang="de">Kohei Super Duper File Format</value>

Likewise, create another file:


with the following content

<!-- Kohei_SDF.xcu -->
<node oor:name="Kohei_SDF" oor:op="replace" >
  <prop oor:name="DetectService"/>
  <prop oor:name="URLPattern"/>
  <prop oor:name="Extensions"><value>koheisdf</value></prop>
  <prop oor:name="MediaType"/>
  <prop oor:name="Preferred"><value>false</value></prop>
  <prop oor:name="PreferredFilter"><value>calc_Kohei_SDF_Filter</value></prop>
  <prop oor:name="UIName"><value xml:lang="x-default">Kohei Super Duper File Format</value></prop>
  <prop oor:name="ClipboardFormat"><value>doctype:Workbook</value></prop>

Once these new files are in place, add these files to so that the build process can find them. To add, open and add Kohei_SDF to the end of T4_CALC, calc_Kohei_SDF_Filter to F4_CALC, and calc_Kohei_SDF_Filter_ui to F4_UI_CALC. Save the file and rebuild the module. This should rebuild the following configuration files (build done on Linux):


One note: the language pack zip package should contain the file named Filter.xcu with the new UI string you just put in. If you don’t see that, remove the whole directory and build the module again.

Now it’s time to update your installation. You need to update the following files:


with the new ones you just rebuilt. Next, unpack the langpack zip file and extract Filter.xcu. Place this file in


to replace the old one.

Ok so far? There is one more thing you need to do to complete the process. Since these configuration files are cached, in order for the updated configuration files to take effect, the cached data must be removed. The cached data is in the user configuration directory, so you need to locate and delete the following directory:

rm -rf <user_config_dir>/user/registry/cache

That’s it! Now, fire up Calc and launch the Export dialog. You see the new file format entry you just put in. :-)

Export dialog with new export filter entry

Just try not to export your file using this new filter for real, because that will utterly fail. ;-)

Hacking Calc – The First Step

I’m happy to announce that the article I submitted to the Developer Article Contest has been selected as June’s winner! You can read my article here. Though this article attempts to cover the hard topic of hacking the core part of OO.o’s code base, I tried to keep it somewhat of an easy read.

I hope this article will help lower the initial barrier to entry, because hacking OO.o, though it admittedly comes with a steep learning curve, is quite fun once you set your foot in the door. So, even if you are a little intimidated by the sheer size of the code base, come and try with your hand a little. You might actually like it. :-)

Interested in writing your own article for the contest? Cool. Go read the guideline and submit your own!