Patch for MsgBase was [jsword-devel] MsgBase bug

DM Smith jsword-devel@crosswire.org
Wed, 07 Apr 2004 16:49:26 -0400


This is a multi-part message in MIME format.

------=_NextPart_000_23b2_66c6_4efd
Content-Type: text/plain; format=flowed

I have fixed the MsgBase bug and design flaw (which I was going to do after 
vaction, but I had a "light bulb" experience and did it because it was so 
simple.)

I also found and fixed a few other small bugs.

Here are the changes:
The static MsgBase.init is gone and it is removed from all the derived Msg 
classes. For this reason there are a lot of files that are in the patch.

MsgBase constructor now gets its resources for the derived class and 
maintains them in a static map. The static map was the "Ah ha!" I am using 
CWClassLoader to do the finding of resources just like in ActionFactory.

I made a minor change to how the parameterized string is handled if there 
are resources, but it is not found. What it did do was return the key that 
was used to do the lookup without calling MessageFormat.format. Now it calls 
MessageFormat.

I added a toString(Object singleParam) to MsgBase. Most paramaterized 
messages only take one argument if any. I changed all the places that called 
toString with a single element Object array to use this.

I also added Reporter.invoke(..., MsgBase msg, Object singleParam) and 
changed all the places that called it wiith a single element Object array.

I found a design flaw in what I had done earlier for ActionFactory. I wanted 
to be able to derive from it and have the CWClassLoader use the derived 
class to do the lookup. It did not. Turns out I needed to add a constructor 
to CWClassLoader that takes a Class object for the derived class.

In doing this I split out the inner class to a stand alone and made it a bit 
more general. (Many times I start with a specific implementation as an inner 
class and then break it out when I have another use.) In this case the other 
use turned out to not be needed.

I also externalized the messages in desktop.Msg to a ResourceBundle. (This 
is was what triggered the changes above.

I created the DesktopActionFactory and used it as I described in another 
note.

I modified AboutPane to replace "OK" with a CWAction. This required adding a 
method to DesktopActions to handle the action.

_________________________________________________________________
FREE pop-up blocking with the new MSN Toolbar – get it now! 
http://toolbar.msn.com/go/onm00200415ave/direct/01/

------=_NextPart_000_23b2_66c6_4efd
Content-Type: application/x-zip-compressed; name="patchmsg.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="patchmsg.zip"

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
AAABAAEAOgAAAMI5AAAAAA==


------=_NextPart_000_23b2_66c6_4efd--