[jsword-devel] SwordBookMetaData

DM Smith jsword-devel@crosswire.org
Mon, 29 Mar 2004 14:34:23 -0500


This is a multi-part message in MIME format.

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

Fixed the bug, made a few more changes and tested:

I undid the line wrap as it did not work fully. The problem was that the 
computation of a cell's height was static based upon initial content and not 
on the content and the current width of the cell. I think it can be managed 
with listeners, but I left it as a future todo.

I modified MapTableModel some more:

Because Map keys can be objects, I called toString().trim() on them.

I made "" an invalid key and null an invalid value.

I copied the map into a list for direct access. The getValueAt used an 
iterator over the map, once per cell to find the content and assumed that it 
would always return the same data in the same order. This required a trivial 
helper class, StringPair.

I eliminated getMap as it was being used badly by MapField (violated 
information hiding) to directly modify the map without causing and added 
methods to provide the needed behavior. I modified MapField to use these new 
MapTableModel methods. I don't think MapField is being used anywhere, so I 
could not figure out how to test the changes.

I made getColumnCount return 0 if the map was null, 2 otherwise. This fixed 
problems with code like
for (int c = 0; c < getColumnCount(); c++) { do something on the column; } 
when the map was null, which is the case between a default TableModel 
constructor call and a call to setModel().

I removed setValueAt since it was a bit buggy, in that if a key were 
changed, the order of the cells in the table would change and it did not 
fire changes to listeners. Also, because editing was turned off.

DM Smith" wrote:
>The patch has a fatal bug. Dumb last minute change. I will fix and resend.
>
>DM Smith wrote:
>>
>>Attached is a patch for BookMetaData and its display.
>>Here is a summary of the changes I made:
>>MapTableModel returns a string of the object held in the iterator. This 
>>allows it to be used by any map and not just Properties.
>>
>>BookMetaData used to return Properties from getProperties. Now it returns 
>>Map. Perhaps the named should be changed as well.
>>
>>SwordBookMetadata:
>>When a line ended with \, I concatenated the next line with \n as a 
>>separator. I added the method getContinuation as a helper.
>>
>>When creating the props map, which has strings for values, I use \n to 
>>separate elements in the list.
>>
>>Changed props from a Properties to a LinkedHashMap. This required changing 
>>from setProperty to put.
>>
>>In parseLine, I trimed the value. (The key was already trimmed.)
>>
>>There is still an opportunity to eliminate duplicate input lines. But that 
>>probably should be a cleanup in the input.
>>
>>Modified getFullName to output parts only if they existed. This eliminated 
>>the trailing ','.
>>
>>Removed BOOK and DRIVER from the props since they were objects and not 
>>strings. Nothing was using it. They could be added back in as strings.
>>
>>Changed "table" from a HashMap to a LinkedHashMap to preserve the input 
>>order. This allows for save to lossless wrt order.
>>
>>To DefaultBookMetaData
>>The properties member variable was used to store both strings and objects 
>>for the same key. I changed it that it only stored strings. For each pair 
>>of set functions setX(Object x) and setX(String x), I made the second call 
>>the first and the first set the member variable and stored the field in 
>>the map.
>>
>>I changed getFullName to be the same as for SwordBookMetaData.
>>
>>I changed props from a Properties to a LinkedHashMap to preserve insertion 
>>order.
>>
>>I added two new classes: MapTable and MapCellRenderer. The MapTable works 
>>with a MapTableModel to present multiline data in rows that are tall 
>>enough to show the entire contents. The MapCellRenderer differs from the 
>>DefaultTableCellRenderer in that it uses a JTextArea to render text 
>>instead of a JLabel. This allows for it to render html, if we ever decide 
>>to go there. JLabel's support for html is really weak. I set it up to wrap 
>>text if the column is too narrow.
>>
>>I modified SitePane to use MapTable rather than JTable. It might make 
>>sense to use it where ever MapTableModel is used. I only used it here.

_________________________________________________________________
MSN Toolbar provides one-click access to Hotmail from any Web page – FREE 
download! http://toolbar.msn.com/go/onm00200413ave/direct/01/

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

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


------=_NextPart_000_4081_6e22_4044--