/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1191 - (hide annotations)
Thu Jun 12 17:01:45 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 181176 byte(s)
updated ChangeLog

1 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
2 jonathan 1175
3 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
4     user directory if it doesn't exist on a posix system.
5    
6     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7     called to get_application_dir here, so that the directory
8     will only be called if this method is invoked.
9    
10     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
11     the projfilepath if no projection is selected.
12    
13     2003-06-12 Jonathan Coles <[email protected]>
14    
15 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
16     the scalebar if the current map has no projection set.
17    
18     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
19     projfilepath label to just the basename of the projection file
20     rather than include the entire path.
21    
22     * Thuban/Model/resource.py: Fix missed proj functions that
23     needed to be renamed.
24    
25     2003-06-12 Jonathan Coles <[email protected]>
26    
27 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
28     tested if the variable was an instance of Color.
29    
30     * Thuban/Model/color.py (Color): Remove commented code that isn't
31     used.
32     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
33     Fixes RTbug #1835.
34     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
35     Needed now that the class doesn't inherit from Color.
36    
37     2003-06-12 Jonathan Coles <[email protected]>
38    
39 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
40     check unicode strings.
41    
42     * test/test_layer.py: Check for existence of gdal.
43    
44     2003-06-12 Jonathan Coles <[email protected]>
45 jonathan 1172
46     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
47     that was in load.py
48 jonathan 1169
49 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
50     that was in save.py
51    
52     2003-06-12 Jonathan Coles <[email protected]>
53    
54 jonathan 1169 This is largely a collection of bug fixes. We also handle the
55     case where gdal is not on the system. The XMLReader and XMLWriter
56     classes were moved into there own files to resolve some circular
57     import references and because they shouldn't really be in the
58     file that is dediciated to reading/writing session files since
59     they are also used elsewhere.
60    
61     * Thuban/Model/classgen.py: Renamed functions to follow the
62     function_names_with_underscores style. Fixes RTbug #1903.
63     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
64    
65     * Thuban/Model/layer.py: Import gdal only if it available.
66     (RasterLayer): Handle the case where the gdal library is unavailable.
67     Addresses RTbug #1877.
68    
69     * Thuban/Model/load.py (XMLReader): Moved into seperate file
70     xmlreader.py.
71    
72 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
73    
74     This is largely a collection of bug fixes. We also handle the
75     case where gdal is not on the system. The XMLReader and XMLWriter
76     classes were moved into there own files to resolve some circular
77     import references and because they shouldn't really be in the
78     file that is dediciated to reading/writing session files since
79     they are also used elsewhere.
80    
81     * Thuban/Model/classgen.py: Renamed functions to follow the
82     function_names_with_underscores style. Fixes RTbug #1903.
83     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
84    
85     * Thuban/Model/layer.py: Import gdal only if it available.
86     (RasterLayer): Handle the case where the gdal library is unavailable.
87     Addresses RTbug #1877.
88    
89     * Thuban/Model/load.py (XMLReader): Moved into seperate file
90     xmlreader.py.
91    
92 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
93     file xmlwriter.py.
94    
95     * Thuban/Model/resource.py: Renamed functions to following the
96     function_names_with_underscores style.
97     (has_gdal_support): New function that returns true if the gdal
98     library is available. Addresses RTbug #1877.
99    
100     * Thuban/UI/application.py (ThubanApplication.OpenSession):
101     Display a message box if the gdal library is not available, but
102     only if there are any layers that would use it. Addresses RTbug #1877.
103    
104     * Thuban/UI/classgen.py: Use renamed projection resource functions.
105     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
106     when using integers versus floats.
107    
108     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
109     determine if the "Add Image Layer" menu option should be
110     greyed out or not. Addresses RTbug #1877.
111    
112     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
113    
114     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
115     optimize if a raster layer is visible. Fixes RTbug #1931.
116     Only draw the raster layer if the gdal library is available.
117     Addresses RTbug #1877.
118    
119     * test/test_classgen.py: Add tests for generate_singletons,
120     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
121     (test_calculate_quantiles): Fix some tests to catch the new
122     ValueError that is raised.
123    
124     * test/test_proj.py: Use renamed projection resource functions.
125    
126     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
127     test for saving classified layers. Fixes RTbug #1902.
128     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
129    
130 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
131    
132     Fix for http://intevation.de/rt/webrt?serial_num=1900.
133    
134     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
135    
136     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
137     multiplechoicedialog.py rather than from the wxPython library.
138    
139 frank 1151 2003-06-11 Frank Koormann <[email protected]>
140    
141 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
142     update.
143    
144     2003-06-11 Frank Koormann <[email protected]>
145    
146 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
147     determine the absolute .thuban/thuban directory under
148     "posix" (os.expanduser) and "nt" (read AppData registry key).
149    
150     * Thuban/Model/resource.py: Use get_application_dir
151    
152     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
153     Use get_application_dir.
154    
155 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
156    
157 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
158     the messages MAP_LAYERS_REMOVED messages
159     (LayerTableFrame.OnClose): Unsubscribe from it.
160     (LayerTableFrame.map_layers_removed): New. Receiver for
161     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
162     dialog is showing is removed.
163    
164     2003-06-10 Bernhard Herzog <[email protected]>
165    
166 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
167     of the receivers list so that unsubscribing in a receiver doesn't
168     modify it while iterating over it.
169    
170     * test/test_connector.py
171     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
172     unsubscribing in a receiver works correctly. See docstring for
173     details
174    
175     2003-06-10 Bernhard Herzog <[email protected]>
176    
177 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
178     message.
179    
180     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
181     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
182     LAYER_CHANGED will still be sent if the classification changes.
183    
184     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
185     parameter so we can subscribe to some of its messages
186     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
187     and the layer's LAYER_SHAPESTORE_REPLACED
188     (Classifier.unsubscribe_messages): New. Unsubscribe from message
189     subscribed to in __init__
190     (Classifier.map_layers_removed)
191     (Classifier.layer_shapestore_replaced): receivers for the messages
192     subscribed to in __init__. Unsubscribe and close the dialog
193    
194     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
195     the map to the Classifier dialog
196    
197     * test/test_layer.py (SetShapeStoreTests): Derive from
198     SubscriberMixin as well so we can test messages
199     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
200     messages
201     (SetShapeStoreTests.tearDown): Clear the messages again
202     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
203     for the modified flag too
204     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
205     to check whether SetShapeStore sets the modified flag
206     (SetShapeStoreTests.test_set_shape_store_different_field_name)
207     (SetShapeStoreTests.test_set_shape_store_same_field)
208     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
209     Add tests for the messages. This checks both the new
210     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
211    
212 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
213    
214     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
215     the menu items.
216    
217 frank 1134 2003-06-05 Frank Koormann <[email protected]>
218    
219 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
220     Layout reimplemented without panel. Make life easier to fit the list
221     in the dialog.
222    
223     2003-06-05 Frank Koormann <[email protected]>
224    
225 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
226     once on initialisation (Former implementation resulted in multiple
227     entries for each projection).
228     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
229     if set, select the projection found under the specified name. This
230     overwrites any other selection estimate.
231     Removed projchoice filling from this method.
232     (ProjFrame._OnSave, ProjFrame._OnAddToList):
233     Updated call of ProjFrame.__FillAvailList
234     (LCCPanel._DoLayout): Moved parameter controls in more common order.
235    
236     * Resources/Projections/defaults.proj: Extended defaults representing
237     various common European projections.
238    
239     2003-06-05 Frank Koormann <[email protected]>
240    
241 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
242     Use ListCtrl instead of GridCtrl
243    
244     * Thuban/Model/resource.py:
245     Guess location of .thuban directory from tempdir parent directory.
246    
247     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
248     Guess location of .thuban directory from tempdir parent directory.
249    
250 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
251    
252     Do not cache the values returned by the tree widget's
253     GetFirstChild and GetNextChild methods because it led to lots of
254     segfaults. The new way requires more brute force but is more
255     reliable.
256    
257     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
258     variable layer2id
259     (LegendTree.find_layer): New method to do with brute force what
260     layer2id tried to accomplish
261     (LegendTree._OnMsgLayerChanged)
262     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
263     Use find_layer instead of layer2id
264     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
265     update layer2id anymore
266     (LegendTree._OnMsgMapLayersRemoved)
267     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
268    
269 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
270    
271     * Thuban/Model/classgen.py (GenQuantiles0): New function.
272    
273 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
274    
275 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
276     New commands.
277     (main_menu): Add the new commands.
278     (MainWindow.TableRename): New. Implementation of the table_rename
279     command.
280     (MainWindow.RenameLayer): New. Implementation of the layer_rename
281     command.
282    
283     * Thuban/Model/session.py (Session.AddTable): call self.changed to
284     set the modified flag
285    
286     * test/test_session.py (TestSessionSimple.test_add_table): Test
287     whether the modified flag is set properly
288    
289     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
290     instead of issue so that the modified flags get updated.
291    
292     * test/test_base.py (SomeTitledObject): Derive from Modifiable
293     instead of Publisher to reflect reality better and to accomodate
294     the fact that SetTitle now calls changed instead of issue
295    
296     2003-06-02 Bernhard Herzog <[email protected]>
297    
298     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
299     acquisition has to happen before the try in a try-finally.
300    
301     2003-06-02 Bernhard Herzog <[email protected]>
302    
303 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
304     possible that a layer is removed that is not currently selected in
305     the legend so don't check for this.
306    
307 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
308    
309 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
310     variables to None that have direct or indirect references to
311     shapefiles or dbf files to make sure that they do go away and the
312     files are closed.
313    
314     2003-05-30 Bernhard Herzog <[email protected]>
315    
316 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
317     availImgListIndices when a new image list is created
318    
319     2003-05-30 Bernhard Herzog <[email protected]>
320    
321 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
322     changing_selection to indicate whether the LegendTree code itself
323     is currently changing the selection
324     (LegendTree.normalize_selection): New method to normalize the
325     selection by selecting the layer item even if the user clicked on
326     the classification.
327     (LegendTree._OnSelChanged): normalize the selection. This works
328     around a bug in wx which doesn't keep track of the selection
329     properly when subtrees are deleted.
330    
331     2003-05-30 Bernhard Herzog <[email protected]>
332    
333 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
334     maximum and minimum scale factors.
335    
336     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
337     changes in classgen.py
338    
339 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
340    
341     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
342     all the methods functions. Fixes RTBug #1903.
343    
344     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
345     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
346     RTBug #1907.
347    
348     * Thuban/UI/classgen.py: Use classgen functions that were part
349     of the ClassGenerator class. Put try/finally blocks around
350     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
351     RTBug #1904.
352    
353     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
354    
355     * Thuban/UI/legend.py: The legend was cleared and repopulated any
356     time something changed which caused some state to be lost such
357     as which children were expanded or collapsed. Fixes RTBug #1901.
358     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
359     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
360     the legend but not in the map.
361     (LegendTree.__FillTree): Move main functionality out into smaller
362     methods that can be used by other methods.
363     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
364     if they are available.
365     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
366     that we override the wxTreeCtrl method. Iterate over children
367     and call __RemoveLayer.
368     (LegendTree.__AddLayer): New. Add a new layer to the legend.
369     (LegendTree.__RemoveLayer): Remove a layer from the legend.
370     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
371     Should only be called with the id of a layer branch.
372     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
373     Returns the root item or creates one if necessary.
374    
375     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
376     ProjectRasterFile with tuple arguments instead of strings.
377    
378     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
379     with try/finally. Fixes RTBug #1904.
380    
381     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
382     with try/finally. Fixes RTBug #1904.
383     (MapCanvas.FitSelectedToWindow): If a single point is selected
384     simply center it on the display. Fixes RTBug #1849.
385    
386     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
387     to be compiled as a standalone app. Now the code can only be
388     called from Python which simplifies the parameter passing.
389     (ProjectRasterFile): Handle Python arguments. Remove code that
390     checks for a destination dataset. Add more clean up code.
391    
392     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
393     TestMapWithContents.test_lower_layer_bottom):
394     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
395     Fixes RTBug #1907.
396    
397     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
398     extent to the map when the legend is toggled. Fixes RTBug #1881.
399    
400 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
401    
402     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
403     unsubscribes all that is subcribed in __init__.
404    
405 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
406    
407 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
408     (MainWindow.CanDuplicateLayer): New methods to implement the
409     Layer/Duplicate command.
410     (layer_duplicate command): New.
411     (main_menu): Add layer_duplicate to the Layer menu.
412    
413     2003-05-28 Bernhard Herzog <[email protected]>
414    
415 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
416     renderer so that NULL/None values get displayed differently (by a
417     gray rectangle).
418     (TableGrid.__init__): Override the default renderers
419    
420     2003-05-28 Bernhard Herzog <[email protected]>
421    
422 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
423     classification to "None" if the type of the field has changed.
424    
425     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
426     test for the Layer.SetShapeStore method
427    
428 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
429 jan 1085
430 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
431     does not necessarily have a filename).
432    
433     2003-05-28 Jan-Oliver Wagner <[email protected]>
434    
435 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
436     sort the selection list for the dialog.
437    
438 frank 1083 2003-05-28 Frank Koormann <[email protected]>
439    
440     * extensions/thuban/wxproj.cpp
441     (project_point): Removed cast to int for projected point coordinates.
442     (shape_centroid): Return last point if all polygon vertices fall
443     to one point.
444    
445 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
446    
447 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
448     with layers that don't have shapestores, i.e. raster layers.
449    
450     2003-05-28 Bernhard Herzog <[email protected]>
451    
452 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
453     when determining the title from the filename.
454    
455     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
456     reflect changes in the way the title is derived from the filename
457    
458 frank 1077 2003-05-28 Frank Koormann <[email protected]>
459    
460     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
461     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
462    
463 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
464    
465 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
466     delegate SelectedLayer.
467     (MainWindow.LayerUnjoinTable): Implement.
468     (_can_unjoin): New. Helper function for the sensitivity of the
469     layer/unjoin command.
470    
471     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
472     (DerivedShapeStore.OrigShapeStore): New. Return the original
473     shapestore. Used to figure out how to unjoin.
474     (DerivedShapeStore.Shapefile): Fix a typo.
475    
476     2003-05-27 Bernhard Herzog <[email protected]>
477    
478 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
479     well
480     (JoinDialog.__init__): Use the layer parameter and only build the
481     left choice when a layer is given
482     (JoinDialog.OnJoin): Handle layer joins as well
483     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
484     that the user selects the "Select..." item. The sensitivitly
485     updating is now in update_sensitivity
486     (JoinDialog.y): New method to refactor the sensitivity update of
487     the join button into its own method.
488    
489     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
490    
491     2003-05-27 Bernhard Herzog <[email protected]>
492    
493 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
494     iff there are unreferenced tables in the session
495    
496     2003-05-27 Bernhard Herzog <[email protected]>
497    
498 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
499    
500     * Thuban/Model/session.py (Session.UnreferencedTables): New method
501     to return tables that are not referenced by other tables or shape
502     stores and can be removed.
503     (Session.RemoveTable): Issue a TABLE_REMOVED message after
504     removing the table
505    
506     * Thuban/UI/mainwindow.py: Remove unused imports
507     (MainWindow.TableClose): Implement.
508    
509     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
510     messages so that the frame will be automatically closed when a new
511     session is opened or the table is removed.
512     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
513     __init__
514     (TableFrame.close_on_session_replaced)
515     (TableFrame.close_on_table_removed): New. Subscribers that close
516     the window
517    
518     * test/test_session.py (TestSessionMessages.test_remove_table)
519     (TestSessionSimple.test_remove_table): Move the test to
520     TestSessionSimple and add test for the TABLE_REMOVED message
521     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
522     (TestSessionSimple.test_unreferenced_tables) New. Test for the
523     UnreferencedTables method.
524     (UnreferencedTablesTests): New. Class with some more sophisticated
525     tests for UnreferencedTables.
526    
527 frank 1065 2003-05-27 Frank Koormann <[email protected]>
528    
529 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
530     display has some unwanted side effects. Removed again.
531    
532     2003-05-27 Frank Koormann <[email protected]>
533    
534 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
535    
536     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
537    
538 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
539    
540 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
541     Menu.RemoveItem().
542 jan 1062
543 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
544     the menu.
545 jan 1062
546 frank 1059 2003-05-27 Frank Koormann <[email protected]>
547    
548     Nonmodal dialogs without parent (i.e. they can fall behind the main
549     window)
550    
551     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
552     all dialogs in the dialogs dictionary and the canvas.
553    
554     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
555     parent, i.e. can fall behind other windows.
556     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
557     dictionary before removing it.
558    
559     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
560    
561     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
562     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
563     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
564    
565 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
566    
567 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
568     tableview dialog
569     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
570     Also, don't use the table's titles as the dialog names. The titles
571     aren't guaranteed to be unique.
572     (MainWindow.TableOpen): Open a table view dialog after opening the
573     table
574    
575     2003-05-27 Bernhard Herzog <[email protected]>
576    
577 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
578     effect can be achieved by simply closing the window showing the
579     table.
580     (MainWindow.TableHide): Removed.
581     (main_menu): Removed "table_hide"
582    
583 frank 1051 2003-05-27 Frank Koormann <[email protected]>
584    
585     Fix legend tree display problems under Win32
586    
587     * Thuban/UI/legend.py: BMP_SIZE_W = 15
588     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
589     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
590    
591     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
592    
593 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
594    
595     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
596     'after' now allows to insert separators almost anywhere in the menu.
597    
598 frank 1046 2003-05-27 Frank Koormann <[email protected]>
599    
600     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
601     "S" of selection box label to hint on hot key (Alt-S). Works under
602     Win32 but is ignored under GTK.
603    
604     2003-05-26 Frank Koormann <[email protected]>
605    
606     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
607     Center Choices.
608    
609 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
610    
611 bh 1044 Remove the Precision methods again. They're too DBF specific to be
612     part of the table interface and they're only used in table_to_dbf
613     anyway.
614    
615     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
616     fixed precision of 12 for doubles.
617     (TransientTableBase.Precision): Removed
618     (AutoTransientTable.Width): Delegate to self.table.
619    
620     * Thuban/Model/table.py (DBFTable.Precision)
621     (MemoryTable.Precision): Removed.
622     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
623     (table_to_dbf): Use a fixed precision of 12 for floats unless the
624     column object specifies something else.
625    
626     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
627     test for table_to_dbf
628    
629     2003-05-26 Bernhard Herzog <[email protected]>
630    
631     * test/test_transientdb.py
632     (TestTransientTable.run_iceland_political_tests): Fix a comment.
633    
634     2003-05-26 Bernhard Herzog <[email protected]>
635    
636 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
637     implementation. Mark parts of the file format strings for
638     localization.
639    
640     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
641     file and add the table to the tables managed by the session
642    
643 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
644     New. test case for OpenTableFile
645    
646 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
647    
648 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
649     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
650     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
651     Replace the true/false of wxWindows by True/False of Python 2.2.1.
652    
653     2003-05-26 Jan-Oliver Wagner <[email protected]>
654    
655 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
656     already a selection present, update the grid accordingly.
657 jan 1033
658     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
659     resizeable and increase its initial size.
660    
661 frank 1030 2003-05-26 Frank Koormann <[email protected]>
662    
663     Table export functionality
664    
665     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
666     Return width (in characters) for a column.
667     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
668     (table_to_dbf): Write table to dbf file.
669     (table_to_csv): Write table to csv file.
670    
671     * Thuban/Model/transientdb.py (TransientTableBase.Width,
672     TransientTableBase.Precision): Return column width and precision.
673    
674     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
675     or table_to_csv depending on file selection.
676    
677     * test/test_dbf_table.py:
678     Test table_to_dbf (extension of former part of test).
679    
680     * test/test_csv_table.py:
681     Test table_to_csv.
682    
683 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
684    
685 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
686     Use QueryTableFrame instead of TableFrame.
687 jan 1021
688 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
689     table window with 'Layer Table:' instead of 'Table:'.
690    
691     2003-05-23 Jan-Oliver Wagner <[email protected]>
692    
693     Give all tables a title via mix-in TitledObject.LayerShowTable
694    
695 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
696     only if it exists.
697    
698     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
699     and call its init-method with a default title. Remove Title() method.
700    
701     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
702     AutoTransientTable): mix-in TitledObject and call its init-method with
703     a default title. Remove Title() method.
704    
705 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
706    
707     * Thuban/Model/session.py (Session.AddShapeStore): Define
708     AddShapeStore analogously to AddTable.
709    
710     * test/test_session.py (TestSessionSimple.test_add_shapestore):
711     New. Test for AddShapeStore
712    
713 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
714    
715     Introducing QueryTableFrame and a very coarse ShowTable implementation.
716    
717     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
718     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
719     The latter implements the selection GUI without dependency on a layer.
720     LayerTableFrame now is derived from QueryTableFrame and connects
721     to a layer.
722    
723     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
724     implementation that still needs work.
725    
726     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
727    
728 frank 1011 2003-05-22 Frank Koormann <[email protected]>
729    
730     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
731     Added "outer_join = False" as optional parameter.
732     (TransientJoinedTable.create): If outer join is true, perform a
733     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
734     the left table. Records not matching are filled with 0 / None.
735    
736     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
737     (JoinDialog.OnJoin): Consider outer join check box.
738    
739 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
740    
741 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
742     somewhat safer way. Storing the traceback in a local variable can
743     lead to memory leaks
744    
745     2003-05-22 Bernhard Herzog <[email protected]>
746    
747 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
748     the wxMessageDialog's Destroy() method.
749    
750 frank 1004 2003-05-22 Frank Koormann <[email protected]>
751    
752     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
753     TransientTable.Title()
754    
755     2003-05-22 Frank Koormann <[email protected]>
756    
757     Join Dialog, initial version.
758    
759     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
760    
761     * Thuban/UI/join.py (JoinDialog): Functional implementation of
762     former framework. Renamed Table1/Table2 to LeftTable/RightTable
763     in all occurences.
764    
765     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
766     Typo fixed.
767    
768 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
769    
770 bh 999 Give the tables titles so that the GUI can display more meaningful
771     names. For now the titles are fixed but depend on e.g. filenames
772     or the titles of the joined tables.
773    
774     * Thuban/Model/transientdb.py (TransientTable.Title)
775     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
776    
777     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
778    
779     * test/test_transientdb.py
780     (TestTransientTable.test_auto_transient_table_title): New. Test
781     for the Title method
782     (TestTransientTable.test_transient_joined_table)
783     (TestTransientTable.test_transient_table): Add test for the Title
784     methods
785    
786     * test/test_memory_table.py (TestMemoryTable.test_title): New.
787     Test for the Title method
788    
789     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
790     the Title method
791    
792     2003-05-22 Bernhard Herzog <[email protected]>
793    
794 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
795     Provide a better way to destroy the layers
796     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
797     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
798     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
799     the new way to destroy the layers.
800     (TestLayer.test_derived_store): New. Test for using a layer with a
801     DerivedShapeStore
802    
803     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
804     filename if the shape store actually has one.
805    
806     2003-05-22 Bernhard Herzog <[email protected]>
807    
808 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
809     for the filename
810    
811     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
812     for the FileName method
813     (TestDBFTableWriting.test_write): Fix spelling of filename
814    
815 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
816    
817     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
818     from SciParam that now really is immutable.
819    
820 frank 992 2003-05-22 Frank Koormann <[email protected]>
821    
822     Layer Top/Bottom placement added to legend.
823    
824     * Thuban/UI/legend.py
825     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
826     bound to tool events.
827     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
828     New, methods binding the event methods with the map methods.
829    
830     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
831     layer at top/bottom of layer stack.
832    
833     * Resources/Bitmaps/top_layer.xpm: New button icon.
834    
835     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
836    
837 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
838    
839     * Thuban/Model/session.py (Session.RemoveTable): New method to
840     remove tables
841    
842     * test/test_session.py (TestSessionSimple.test_remove_table): New.
843     Test for RemoveTable
844    
845 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
846    
847     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
848     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
849    
850 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
851    
852 bh 985 Implement a way to discover dependencies between tables and
853     shapestores.
854    
855     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
856     (TransientJoinedTable.Dependencies)
857     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
858     interface
859     (TransientJoinedTable.__init__): Keep tack of the original table
860     objects in addition to the corresponding transient tables.
861    
862     * Thuban/Model/table.py (DBFTable.Dependencies)
863     (MemoryTable.Dependencies): New. Implement the dependencies
864     interface
865    
866     * Thuban/Model/data.py (ShapeTable): New. Helper class for
867     ShapefileStore
868     (ShapefileStore.__init__): Use ShapeTable instead of
869     AutoTransientTable
870     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
871     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
872     methods for filename and type
873     (ShapefileStore.Dependencies): New. Implement the dependencies
874     interface
875     (DerivedShapeStore): New class to replace SimpleStore. The main
876     difference to SimpleStore is that it depends not on a shapefile
877     but another shapestore which expresses the dependencies a bit
878     better
879     (SimpleStore.__init__): Add deprecation warning.
880    
881     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
882     Test for the Dependencies method.
883    
884     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
885     New. Test for the Dependencies method.
886    
887     * test/test_transientdb.py
888     (TestTransientTable.test_auto_transient_table_dependencies): New.
889     Test for the Dependencies method.
890     (TestTransientTable.test_transient_joined_table): Add test for the
891     Dependencies method.
892    
893     * test/test_session.py (TestSessionSimple.setUp)
894     (TestSessionSimple.tearDown): New. Implement a better way to
895     destroy the sessions.
896     (TestSessionSimple.test_initial_state)
897     (TestSessionSimple.test_add_table): Bind session to self.session
898     so that it's destroyed by tearDown
899     (TestSessionSimple.test_open_shapefile): New. Test for
900     OpenShapefile and the object it returns
901    
902     2003-05-22 Bernhard Herzog <[email protected]>
903    
904 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
905     register tables with the session.
906     (Session.Tables): Return the tables registered with AddTable too.
907    
908     * test/test_session.py (TestSessionSimple.test_add_table): New.
909     Test case for the AddTable method
910    
911 frank 981 2003-05-22 Frank Koormann <[email protected]>
912    
913     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
914     lower right corner, center labels for selections, initialize controls
915     in reasonable order for keyboard navigation.
916    
917     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
918     (ProjFrame.__DoOnProjAvail): Determine position of current projection
919     using the wxListBox.FindString() method. Still a problem (#1886)
920    
921     * Thuban/UI/classifier.py
922     (Classifier.__init__, SelectPropertiesDialog.__init__)
923    
924     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
925     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
926     different classification types from here to __init__.
927     (GenUniquePanel.__init__): Set the column width of the first field
928     in the Field ListCtrl to the full width.
929    
930     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
931     Button to 'Export'. Center Buttons in Selection Box, set Focus to
932     Grid.
933     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
934     changes focus to the Selection when pressing "Alt-S".
935    
936     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
937     the text if not visible. The italic font sometimes exceeds the
938     rendering area.
939    
940 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
941 jonathan 971
942 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
943     to OnClose so that Thuban closes correctly.
944    
945     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
946     DockFrame.OnClose, not DockFrame._OnClose.
947    
948     2003-05-21 Jonathan Coles <[email protected]>
949    
950 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
951     references to 'inf' and use new Range __init__ to pass floats
952     directly rather than converting them to strings first.
953     Fixes RTBug #1876.
954    
955     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
956     Use new Range ___init__ to pass floats.
957    
958     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
959     filename is a valid image file. Throw IOError otherwise.
960    
961     * Thuban/Model/range.py: Brought over new Range from SciParam that
962     is immutable and has an __init__ which can accept floats.
963    
964     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
965     into try block. AddLayer doesn't throw any exceptions anymore.
966     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
967     try block.
968    
969     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
970     the first item in choices. Fixes RTBug #1882.
971    
972     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
973     has gone to 0 which is a serious problem. abort.
974     (MapRenderer.draw_raster_layer): Catch IOError seperately and
975     print the error from GDAL.
976    
977     * Thuban/UI/tableview.py (TableGrid.__init__): Call
978     ToggleEventListeners to turn on listening.
979     (TableGrid.ToggleEventListeners): New. Turns event listening on
980     and off so as to prevent excessive messages.
981     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
982     to suppress excessive messages when selecting many rows.
983     Fixes RTBug #1880.
984    
985     * Thuban/UI/view.py: Added checks against if scale == 0. This
986     is a serious problem that can occur when an image without
987     geo data is loading and causes the map projection bounds to
988     go to infinity. Right now, the solution is to simply try
989     to recover.
990    
991     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
992     to set the MFILEReceiver attributes even if the data is NULL.
993    
994     * extensions/thuban/gdalwarp.cpp: Improved the error handling
995     and passed GDAL messages back up to the Python layer. Also
996     tried to fix some memory leaks that were present in the original
997     utility but didn't matter because the program aborted.
998    
999     * test/test_range.py: Copied over tests from SciParam. Removed
1000     tests against importing. Fixes RTBug #1867.
1001    
1002 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
1003    
1004     * test/test_load.py: Remove unused imports and restructure the
1005     test code
1006     (LoadSessionTest): Split into one class for each test and turn
1007     LoadSessionTest itself into the base class for all such session
1008     tests.
1009     (ClassificationTest): New base class for load tests that test
1010     classifications
1011     (TestSingleLayer, TestLayerVisibility, TestClassification)
1012     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1013     for the individual tests
1014    
1015     * test/support.py (FileLoadTestCase.filename): New base class for
1016     file loading tests
1017    
1018 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
1019    
1020     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1021     Mercator' to 'UTM Zone 32' as a more convenient example.
1022     Added 'Gauss Krueger Zone 6'.
1023    
1024     * Data/iceland_sample_raster.thuban: political polygon now
1025     filled transparent to have the raster image visible at once.
1026    
1027 frank 952 2003-05-21 Frank Koormann <[email protected]>
1028    
1029     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1030     OnClose() to keep in sync with extensions. Internally Thuban
1031     still uses "underscored" names.
1032    
1033 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
1034    
1035     This puts back Raster layer support. These layers support projections
1036     through the GDAL library. Currently, the CVS version is being used.
1037     There are no Debian packages available although this may change soon.
1038     A GDAL driver was extended to support writing to memory rather to
1039     files.
1040    
1041     There is still some work that needs to be done, such as some error
1042     handling when loading invalid images or when there is a problem
1043     projecting the image. This putback simply checks in the majority
1044     of the work.
1045    
1046     * setup.py: Add gdalwarp library extension.
1047    
1048     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1049     Defaults to False, but can be overridden by subclasses if they
1050     support classification.
1051     (RasterLayer): New. Defines a new layer that represents an
1052     image.
1053    
1054     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1055     tag handler.
1056     (SessionLoader.start_layer): Encode the filename.
1057     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1058     New. Supports reading a rasterlayer tag.
1059    
1060     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1061    
1062     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1063     get a string in Latin1. If we get such as string convert it to
1064     unicode first, otherwise leave if alone before encoding.
1065     (SessionSaver.write_layer): Add support for writing both Layers
1066     and RasterLayers.
1067    
1068     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1069     The right argument may not be a string, it could also be a Column.
1070    
1071     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1072     Make initial window size 600x400. Fixes RTBug #1872.
1073    
1074     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1075     the dialog is constructed so that we can support layers that
1076     do not have classifications.
1077     (Classifier._OnTry): Only build a classification if the layer
1078     supports one.
1079    
1080     * Thuban/UI/legend.py: Change all checks that a layer is an
1081     instance of Layer into checks against BaseLayer.
1082     (LegendTree.__FillTreeLayer): Only add children to a branch if
1083     the layer supports classification.
1084    
1085     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1086     MainWindow.OpenSession): Don't proceed with an action if the
1087     user chooses Cancel when they are asked to save changes.
1088     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1089     user to select an image file. Create a new RasterLayer and add
1090     it to the map.
1091    
1092     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1093     for rendering RasterLayer layers.
1094     (MapRenderer.draw_raster_layer): Actually method that calls
1095     the GDALWarp python wrapper and constructs an image from the
1096     data returned.
1097    
1098     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1099     Choices symbols to match those used in the table query method.
1100     Replace deprecated method calls on table with new method names.
1101    
1102     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1103     how small the scale can get. This still needs more testing.
1104    
1105     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1106     Provides a driver to output in .bmp format.
1107    
1108     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1109     New. Provides IO routines which write to memory, rather than a file.
1110    
1111     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1112     of the gdalwarp utility provided in GDAL. Added function calls
1113     that can be accessed from python.
1114    
1115     * Data/iceland_sample_raster.thuban: New. Sample file that uses
1116     a raster layer.
1117    
1118     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1119     layer image data.
1120    
1121     * Doc/thuban.dtd: Added rasterlayer attribute definition.
1122    
1123     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1124     tests associated with the raster layer code.
1125    
1126     * test/test_transientdb.py
1127     (TestTransientTable.test_auto_transient_table_query): Added a test
1128     for using a Column object as the "right" parameter to a query.
1129    
1130 frank 924 2003-05-19 Frank Koormann <[email protected]>
1131    
1132 frank 927 * Thuban/version.py (get_changelog_date):
1133     Catch exceptions if ChangeLog does not exist.
1134    
1135     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1136    
1137     2003-05-19 Frank Koormann <[email protected]>
1138    
1139 frank 924 Extended version information for Thuban
1140    
1141     * Thuban/version.py: New, version information for Thuban: Last
1142     modification date and last ChangeLog entry date.
1143    
1144     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1145     information: Display Thuban, wxPython and Python version.
1146    
1147 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
1148    
1149 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
1150     __future__ import for nested_scopes as Thuban relies on Python 2.2
1151     now.
1152     (XMLWriter.encode): Remove the special case for a None argument.
1153     In the saver encode is always called with a string argument.
1154    
1155     2003-05-16 Bernhard Herzog <[email protected]>
1156    
1157 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1158     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1159     of the bug was that e.g. float("1.2") would fail. Thuban now
1160     requires 2.4.x.
1161    
1162 frank 917 2003-05-16 Frank Koormann <[email protected]>
1163    
1164     Printing enhancement and WMF export (under Win32)
1165    
1166     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1167     ScreenRenderer. Renders Map, Legend and Scalebar for export.
1168     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1169     PrintRender.
1170    
1171     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1172     to fullfil information needed for PrinterRenderer.
1173     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1174     (MapCanvas.Print): Adapted to new MapPrintout.
1175     (OutputTransform): General calculations to transform from canvas
1176     coordinates to export/printing devices.
1177    
1178     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1179     new method_command to call ExportMap, with platform dependency (only
1180     __WXMSW__)
1181    
1182     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1183     of scalebar drawing area as new parameters.
1184    
1185     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1186    
1187     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1188     Update to extended scalebar.DrawScalebar header.
1189    
1190     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1191    
1192     * test/test_scalebar.py: Made test executable as standalone.
1193    
1194 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
1195    
1196     * Thuban/Model/table.py (Table): Remove this compatibility alias
1197     for DBFTable.
1198    
1199     * test/test_table.py: Import DBFTable as Table because that alias
1200     doesn't exist anymore.
1201    
1202     * Thuban/UI/classgen.py: Remove some unused imports
1203    
1204 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
1205    
1206     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1207     Fix docstring.
1208     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1209     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1210     values of the supplied range to determine the beginning and end
1211     bounds of the generated classes.
1212    
1213     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1214     do not have a leading 0 (.5 is now accepted as well as 0.5).
1215    
1216     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1217     call to ClassGenerator.GenUniformDistribution.
1218    
1219     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1220     layout bug with the 'Projection' label.
1221    
1222     * test/support.py (FloatTestCase): New. Needed for the Range tests.
1223    
1224     * test/test_range.py: New. Imported from SciParam.
1225    
1226 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
1227    
1228 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1229     to table.UniqueValues() with calls that retrieve all the values
1230     from the table. This will need to be replaced by a method on table
1231     which can simply return the list (perhaps more efficiently).
1232    
1233     2003-05-12 Jonathan Coles <[email protected]>
1234    
1235 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
1236     Refer to the documentation for details.
1237    
1238     * test/test_classgen.py: Modified Quantile tests to use the
1239     new return values.
1240    
1241     * Thuban/Model/classgen.py
1242     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1243     use new return values from CalculateQuantiles to produce the correct
1244     range bounds in the Classification.
1245     (ClassGenerator.CalculateQuantiles): Add more comments describing
1246     the return values and parameters. Make minor adjustments to improve
1247     the legibility of the code. Fix problem with adjusted not being set
1248     in most cases.
1249    
1250 frank 893 2003-05-12 Frank Koormann <[email protected]>
1251    
1252     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1253     and latin1. Fixes #1851 finally.
1254    
1255 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
1256    
1257 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
1258    
1259     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1260     Clean up debugging statement, add comments, fix a small bug in the
1261     returned adjusted percentiles.
1262    
1263     2003-05-09 Jonathan Coles <[email protected]>
1264    
1265 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
1266     and such ranges can now be saved and loaded from disk.
1267    
1268     Quantiles are now available in the Classification Generator.
1269    
1270     Initial support for building Queries on a table. Doesn't do anything
1271     but run some tests.
1272    
1273     * Thuban/Model/classification.py: Explicit imports.
1274     (ClassGroupRange): Use the Range class to store the underlying
1275     range information. The interface remains the same, except for
1276     GetRange(), and you can also supply a Range object as the min
1277     parameter to SetRange or __init__.
1278    
1279     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1280     string appropriately for use in Thuban. Fixes RTbug #1851.
1281     (SessionLoader.end_projection): Handle the context of the
1282     projection tag a bit better by looking at what objects are not
1283     None. There was an assumption that a projection tag for a map
1284     could occur before any layers.
1285     (SessionLoader.start_clrange): Provide backward compatibility for
1286     reading min/max values as well as the new range parameter.
1287    
1288     * Thuban/Model/map.py: Explicit imports.
1289    
1290     * Thuban/Model/resource.py: Import _.
1291     (ProjFileSaver.write): write header using projfile.dtd.
1292    
1293     * Thuban/Model/save.py: Explicit imports.
1294     (XMLWriter.encode): New. Encode the given string from a format
1295     used by Thuban into UTF-8. Fixes RTbug #1851.
1296    
1297     * Thuban/UI/classgen.py: Explicit imports.
1298     (ClassGenDialog.__init__): Clean up the code and add support
1299     for Quantiles.
1300     (ClassGenDialog.OnOK): Add support for Quantiles.
1301     (GenQuantilesPanel): New. Input panel for Quantiles.
1302     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1303     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1304    
1305     * Thuban/Model/classgen.py: New. Contains all the classes named above.
1306    
1307     * Thuban/UI/classifier.py: Explicit imports.
1308     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1309     ClassTable.SetValueAsCustom): Reworked to use new Range class.
1310    
1311     * Thuban/UI/legend.py: Explicit imports.
1312    
1313     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1314     a Table menu and associated method calls.
1315     (MainWindow.choose_color): Removed. No longer needed.
1316    
1317     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1318     should be disabled if no projection is selected in the available
1319     list.
1320    
1321     * Thuban/UI/renderer.py: Explicit imports.
1322    
1323     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1324     with correctly selecting the rows and issuing the right events.
1325     Be sure to call Skip() to allow the grid to do some of its own
1326     handling which allows the rows to actually be selected.
1327     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1328     selecting multiple shapes.
1329     (LayerTableFrame): Support for building Queries.
1330     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1331    
1332     * Thuban/UI/tree.py: Explicit imports.
1333    
1334     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1335     table view can call it.
1336    
1337     * test/test_classification.py: Explicit imports.
1338     (TestClassification.test_ClassGroupRange): Fix test for new
1339     Range class.
1340    
1341     * Doc/thuban.dtd: Add range parameter for clrange.
1342    
1343     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1344     object in ClassGroupRange, and also uesd for inputting ranges in
1345     the classifer table and elsewhere.
1346    
1347     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1348     yet.
1349    
1350 frank 872 2003-05-09 Frank Koormann <[email protected]>
1351    
1352     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1353    
1354 frank 860 2003-05-08 Frank Koormann <[email protected]>
1355    
1356 frank 870 Coding style updates
1357    
1358     * test/test_scalebar.py: Replaced tab indentation by spaces.
1359    
1360     * Thuban/UI/scalebar.py: Explicit imports.
1361    
1362     2003-05-08 Frank Koormann <[email protected]>
1363    
1364 frank 867 * Thuban/UI/scalebar.py
1365     (ScaleBar.DrawScalebar): Format string bug fixed.
1366    
1367     2003-05-08 Frank Koormann <[email protected]>
1368    
1369 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
1370    
1371     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1372     (deriveInterval):
1373     Calculate scalebar interval and unit which fits in width for scale.
1374     (roundInterval): Round float.
1375    
1376     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1377    
1378     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1379    
1380     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1381    
1382     2003-05-08 Frank Koormann <[email protected]>
1383    
1384 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1385     Initialize ScaleBar with canvas.map
1386    
1387     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1388     round intervals to display smarter lengths
1389     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1390     layer. If the maps has no projection applied grey the scalebar.
1391    
1392 frank 857 2003-05-07 Frank Koormann <[email protected]>
1393    
1394     Basic Scalebar features added.
1395    
1396     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1397    
1398     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1399     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1400     and the renderer.
1401    
1402     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1403    
1404     * Thuban/UI/messages.py: SCALE_CHANGED added.
1405    
1406 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
1407    
1408 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
1409     variable shapestores to hold a list of all open shapestore objects
1410     (Session.ShapeStores): New. Accessor method for the shapestores
1411     list.
1412     (Session._add_shapestore, Session._clean_weak_store_refs): New.
1413     Internal methods to maintain the shapestores list.
1414     (Session.Tables): New. Return all tables open in the session.
1415     (Session.OpenShapefile): Insert the new ShapeStore into the
1416     shapestores list.
1417    
1418     * test/test_session.py (TestSessionSimple.test_initial_state): Add
1419     tests for ShapeStores and Tables
1420     (TestSessionWithContent.test_shape_stores)
1421     (TestSessionWithContent.test_tables): New. Test cases for
1422     ShapeStores and Tables
1423    
1424     2003-05-07 Bernhard Herzog <[email protected]>
1425    
1426 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1427     Add comments about the optimizations used.
1428     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1429     Implement the ReadValue table interface method.
1430    
1431     * test/test_transientdb.py
1432     (TestTransientTable.run_iceland_political_tests)
1433     (TestTransientTable.test_transient_joined_table): Add tests for
1434     ReadValue
1435    
1436 frank 848 2003-05-07 Frank Koormann <[email protected]>
1437    
1438     * Resources/Bitmaps/fulllayerextent.xpm,
1439     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1440     new icons.
1441    
1442 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
1443    
1444 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1445     New. Simply delegate to the transient table's version.
1446    
1447     * test/test_transientdb.py
1448     (TestTransientTable.test_auto_transient_table_query): New. Test
1449     case for AutoTransientTable's SimpleQuery
1450    
1451     2003-05-06 Bernhard Herzog <[email protected]>
1452    
1453 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1454     Implement a simple query method for the query dialog
1455     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1456     the row index or shapeid.
1457     (TransientTable.create): Insert the right value of the row index
1458     (TransientJoinedTable.create): Copy the row index of the left
1459     table to the joined result table
1460    
1461     * test/test_transientdb.py
1462     (TestTransientTable.test_transient_table_read_twice): Fix
1463     doc-string
1464     (TestTransientTable.test_transient_table_query): New. Test for the
1465     SimpleQuery method
1466    
1467     2003-05-06 Bernhard Herzog <[email protected]>
1468    
1469 bh 840 Convert all table users to use the new table interface. This only
1470     covers Thuban itself, not GREAT-ER or other applications built on
1471     Thuban yet, so the compatibility interface stays in place for the
1472     time being but it now issues DeprecationWarnings.
1473    
1474     Finally, the new Table interface has a new method, HasColumn.
1475    
1476     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1477     issue deprecation warnings when they're. The warnings refer to the
1478     caller of the method.
1479     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1480     for the deprecation warnings
1481    
1482     * test/test_table.py: Ignore the deprecation warnings for the old
1483     table in the tests in this module. The purpose of the tests is to
1484     test the old interface, after all.
1485    
1486     * test/test_transientdb.py
1487     (TestTransientTable.run_iceland_political_tests): Use the
1488     constants for the types. Add a test for HasColumn
1489     (TestTransientTable.test_transient_joined_table): Adapt to new
1490     table interface. Add a test for HasColumn
1491     (TestTransientTable.test_transient_table_read_twice): Adapt to new
1492     table interface
1493    
1494     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1495     Adapt to new table interface
1496    
1497     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1498     new table interface
1499    
1500     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1501     (RecordTable.SetTable): Adapt to new table interface
1502    
1503     * Thuban/UI/classifier.py (Classifier.__init__)
1504     (Classifier.__init__): Adapt to new table interface
1505    
1506     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1507     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1508     to new table interface
1509    
1510     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1511     (AutoTransientTable.HasColumn): Implement the new table interface
1512     method
1513     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1514     (AutoTransientTable.UniqueValues): Adapt to new table interface
1515    
1516     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1517     Adapt to new table interface
1518    
1519     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1520     simplify opening shapefiles a bit easier.
1521     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1522     (TestLayer.test_point_layer): Use the new helper method
1523     (TestLayer.test_get_field_type): New. Test for the GetFieldType
1524     method
1525    
1526     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1527     the new table method
1528    
1529     * test/test_memory_table.py (TestMemoryTable.test_has_column):
1530     Test for the new table method HasColumn
1531    
1532 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
1533    
1534     Addresses the "Selection Extent" wish of RTbug #1787.
1535    
1536     * Resources/Bitmaps/fulllayerextent.xpm,
1537     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1538     extent. These are just place holders for the real bitmaps.
1539    
1540     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1541     calculate the bounding box once (the first time compute_bbox() is
1542     called).
1543     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1544     the bounding box for the shapes in lat/long coordinates.
1545    
1546     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1547     option.
1548     (MainWindow.has_selected_shapes): New. Returns true if there are
1549     any selected shapes.
1550     (MainWindow.FullSelectionExtent): New. Calls
1551     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1552     (_has_selected_shapes): New. Returns true if there are any
1553     selected shapes.
1554    
1555     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1556     true if there are any selected shapes.
1557    
1558     * Thuban/UI/view.py (MapCanvas): Added delegated method
1559     HasSelectedShapes.
1560     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1561     shapes on the canvas using the map projection (if any).
1562    
1563     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1564     for Layer.ShapesBoundingBox().
1565    
1566 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
1567    
1568     * Resources/Projections/defaults.proj: Fix spelling of Mercator
1569    
1570 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
1571    
1572     Addresses the "Full Layer Extent" wish of RTbug #1787.
1573    
1574     * Resources/Projections/defaults.proj: Added UK National Grid.
1575    
1576     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1577     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1578     when the user selects the menu option.
1579    
1580     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1581     scales the given layer on the canvas using the map projection.
1582    
1583 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
1584    
1585     Convert the table implementations to a new table interface. All
1586     tables use a common mixin class to provide backwards compatibility
1587     until all table users have been updated.
1588    
1589     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1590     provide backwards compatibility for table classes implementing the
1591     new interface
1592     (DBFTable, MemoryTable): Implement the new table interface. Use
1593     OldTableInterfaceMixin as base for compatibility
1594     (DBFColumn, MemoryColumn): New. Column description for DBFTable
1595     and MemoryTable resp.
1596    
1597     * test/test_dbf_table.py: New. Test cases for the DBFTable with
1598     the new table interface.
1599    
1600     * test/test_memory_table.py: New. Test cases for the MemoryTable
1601     with the new table interface.
1602    
1603     * test/test_table.py: Document the all tests in this file as only
1604     for backwards compatibility. The equivalent tests for the new
1605     interface are in test_memory_table.py and test_dbf_table.py
1606     (MemoryTableTest.test_read): field_info should be returning tuples
1607     with four items
1608     (MemoryTableTest.test_write): Make doc-string a more precise.
1609    
1610     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1611     table interface. Derive from from OldTableInterfaceMixin for
1612     compatibility.
1613     (TransientTableBase.create): New intance variable column_map to
1614     map from names and indices to column objects
1615     (TransientTable.create): Use the new table interface of the input
1616     table
1617     (AutoTransientTable): Convert to new table interface. Derive from
1618     from OldTableInterfaceMixin for compatibility.
1619     (AutoTransientTable.write_record): Removed. It's not implemented
1620     yet and we still have to decide how to handle writing with the new
1621     table and data framework.
1622    
1623     * test/test_transientdb.py
1624     (TestTransientTable.run_iceland_political_tests)
1625     (TestTransientTable.test_transient_joined_table): Use the new
1626     table interface
1627    
1628 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
1629    
1630     This is namely a collection of UI updates to improve user interactivity.
1631     Tabbing between controls now exists and you can use ESC to close dialog
1632     boxes; ENTER will active the default button.
1633    
1634     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1635     order that the controls are created so that tabbing works correctly.
1636     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1637     wxDialog can handle the default button correctly.
1638     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1639     same reasons as for OnOK.
1640     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1641     when we ask the table for the maximum/minimum values of a field
1642     which could take a very long time.
1643    
1644     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1645     order that the controls are created so that tabbing works correctly.
1646     (SelectPropertiesDialog.__init__): Rearrange the order that the
1647     controls are created so that tabbing works correctly.
1648    
1649     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1650     to derive from a wxDialog but behave like the original implementation
1651     which was derived from a wxFrame. wxDialog provides useful key
1652     handling functionality like ESC calling OnCancel and ENTER calling
1653     OnOK which is lost with wxFrame.
1654    
1655     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1656     new dialogs.
1657    
1658     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1659     order that the controls are created so that tabbing works correctly.
1660     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1661     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1662     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1663     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1664     can provide the "UK National Grid" as a default projection.
1665     (UTMPanel.__init__): Rearrange the order that the controls are
1666     created so that tabbing works correctly.
1667    
1668 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
1669    
1670 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
1671     (project_point): If a map projection but no layer projection is
1672     given, convert degrees to radians before applying the map
1673     projection.
1674    
1675 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1676     (TableGrid.allow_messages): New methods to make it possible to
1677     inhibit message sending.
1678     (TableGrid.issue): Only send the message if not inhibited.
1679     (LayerTableGrid.select_shape): Use the new methods to make sure
1680     that no ROW_SELECTED message is sent while we're updating the
1681     selected rows to match the selected shapes.
1682    
1683 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
1684    
1685     Implementation of MemoryTable.
1686    
1687     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1688     implementation that operates on a list of tuples. All of the data
1689     are kept in the memory.
1690    
1691     * test/test_table.py (MemoryTableTest): New.
1692    
1693     * test/test_transientdb.py (SimpleTable): Removed.
1694     (TestTransientTable.test_transient_joined_table,
1695     (TestTransientTable.test_transient_table_read_twice): Replaced
1696     SimpleTable by MemoryTable.
1697    
1698 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
1699    
1700 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
1701     for each of the layers.
1702    
1703     * Resources/Projections/defaults.proj: Geographic projection
1704     contains unit conversion parameter.
1705    
1706     2003-04-30 Jonathan Coles <[email protected]>
1707    
1708 jonathan 793 The most important part of this putback is the projection changes.
1709     It should now be possible to specify the projection that a layer
1710     is in and then specify a different projection for the map. The
1711     projection dialog has an extra parameter for a geographic projection
1712     which lets the user select if the input is in degrees or radians.
1713    
1714     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1715     to say that the parameter is a tuple of unprojected
1716     points (which is what the callers to this method were assuming).
1717     Also, since the points are unprojected we need to projected them.
1718    
1719     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1720     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1721     groups are selected, move the layer up/down. Fixes RTbug #1833.
1722    
1723     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1724    
1725     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1726     parameter in call to SetClientData.
1727     (GeoPanel): Add support for selecting the units that the
1728     source data is in (Radians or Degrees).
1729    
1730     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1731     the rendering loop by reducing the number of if's, removing the
1732     unnecessary try/except block, and checking if the old group
1733     is the same as the new one (which happens a lot if there is
1734     no classification, or lots of shapes are in the same group).
1735    
1736     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1737     around the redraw routine to try to catch problems that the user
1738     may create by selecting invalid projections for the data set and
1739     map. Clears the display if there are any problems and prints the
1740     error.
1741     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1742     rectangle.
1743    
1744     * extensions/thuban/wxproj.cpp (project_point): First invert the
1745     supplied point (which should be in projected coordinates) using
1746     the layer's projection and then project the point using the
1747     map's projection.
1748     (project_points): Use project_point() to project each point.
1749    
1750 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
1751    
1752     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1753     don't set the Classification to None if the classfication field
1754     is None (ie only a DEFAULT).
1755    
1756 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
1757    
1758 bh 790 * Thuban/UI/view.py: Fix some typos.
1759    
1760 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1761     not pop up the dialog if the selection becomes empty (this could
1762     happen if e.g. a new selection is opened while the identify tool
1763     is active and dialog had been closed)
1764    
1765     2003-04-30 Bernhard Herzog <[email protected]>
1766    
1767 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1768     instance variable read_record_last_result
1769     (TransientTableBase.read_record): Make sure reading the same
1770     record twice works. The implementation uses the new instance
1771     variable read_record_last_result
1772    
1773     * test/test_transientdb.py
1774     (TestTransientTable.test_transient_table_read_twice): New test
1775     case for the above bug-fix.
1776    
1777 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
1778    
1779     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1780    
1781     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1782    
1783     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1784     (ClassTable.SetValueAsCustom): Rename keyword argument in
1785     ClassGroup* constructors to match argument name.
1786    
1787 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
1788    
1789     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1790     transient DB if it exists to make sure it doesn't leave a journal
1791     file in the temp directory.
1792    
1793     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1794     self.conn to None after closing the connection to make sure it's
1795     not closed twice
1796    
1797 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
1798    
1799 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
1800     "true". If anything other than "false" is specified we also assume
1801 jonathan 776 "true". Addresses RTbug #1025.
1802 jonathan 769
1803     * Doc/thuban.dtd: Add visible parameter to a layer.
1804    
1805     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1806     of visible from 1 to True.
1807     (Layer.__init__): Change default value of visible from 1 to True.
1808    
1809     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1810     parameter.
1811    
1812     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1813     parameter.
1814    
1815     * test/test_load.py: Add new test data contents_test_visible.
1816     (LoadSessionTest.setUp): save test data.
1817     (LoadSessionTest.testLayerVisibility): Test if the visible flag
1818     is loaded correctly.
1819    
1820     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1821     for saving an invisible layer.
1822    
1823     2003-04-29 Jonathan Coles <[email protected]>
1824    
1825 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1826     legend dialog box and tell it to change its map to the one
1827     supplied to SetMap(). Fixes RTbug #1770.
1828    
1829 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
1830    
1831 bh 766 Next step of table implementation. Introduce a transient database
1832     using SQLite that some of the data is copied to on demand. This
1833     allows us to do joins and other operations that require an index
1834     for good performance with reasonable efficiency. Thuban now needs
1835     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1836     haven't tested that.
1837    
1838     * Thuban/Model/transientdb.py: New. Transient database
1839     implementation.
1840    
1841     * test/test_transientdb.py: New. Tests for the transient DB
1842     classes.
1843    
1844     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1845     classes to help automatically remove temporary files and
1846     directories.
1847     (Session.__init__): New instance variables temp_dir for the
1848     temporary directory and transient_db for the SQLite database
1849     (Session.temp_directory): New. Create a temporary directory if not
1850     yet done and return its name. Use AutoRemoveDir to have it
1851     automatically deleted
1852     (Session.TransientDB): Instantiate the transient database if not
1853     done yet and return it.
1854    
1855     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1856     AutoTransientTable so that data is copied to the transient DB on
1857     demand.
1858     (SimpleStore): New class that simply combines a table and a
1859     shapefile
1860    
1861     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1862     DBFTable and update its doc-string to reflect the fact that this
1863     is only the table interface to a DBF file. Table is now an alias
1864     for DBFTable for temporary backwards compatibility.
1865    
1866     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1867     the last reference to the session goes away so that the temporary
1868     files are removed properly.
1869    
1870     * test/test_load.py (LoadSessionTest.tearDown): Remove the
1871     reference to the session to make sure the temporary files are
1872     removed.
1873    
1874     2003-04-29 Bernhard Herzog <[email protected]>
1875    
1876 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1877     the __parser instance variable into a normal local variable in
1878     read. It's only used there and read will never be called more than
1879     once. Plus it introduces a reference cycle that keeps can keep the
1880     session object alive for a long time.
1881    
1882 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
1883 jonathan 735
1884 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1885     Projection an immutable item. Fixes RTbug #1825.
1886     (Projection.__init__): Initialize instance variables here.
1887     (ProjFile.Replace): New. Replace the given projection object with
1888     the new projection object. This solves the problem of needing the
1889     mutator Projection.SetProjection() in the ProjFrame class and
1890     allows a projection to change parameters without changing its
1891     location in the file.
1892    
1893     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1894     be of type wxSAVE and should verify overwriting a file.
1895    
1896     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1897     ProjFile.Replace() method instead of the mutator
1898     Projection.SetProjection(). Also requires that we reassign the
1899     client data to the new projection.
1900    
1901     * test/test_proj.py (TestProjection.test): Test GetName() and
1902     GetAllParameters()
1903     (TestProjFile.test): Remove tests for Set*() methods. Add tests
1904     for Replace().
1905    
1906     2003-04-25 Jonathan Coles <[email protected]>
1907    
1908 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
1909     to save the name of the projection.
1910    
1911     * test/test_save.py (SaveSessionTest.testLayerProjection): New
1912     test to verify layer projections are saved correctly.
1913    
1914     2003-04-25 Jonathan Coles <[email protected]>
1915    
1916 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
1917     to "Unknown" if name is None.
1918     (Projection.SetAllParameters): New. Set the projection's
1919     parameter list to the one supplied.
1920     (Projection.SetProjection): New. Set the projection's
1921     properties to those of the supplied Projection.
1922    
1923     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
1924     the dialog title to include the map's title.
1925     (MainWindow.LayerProjection): Set the dialog title to include
1926     the layer's title.
1927    
1928     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
1929     error dialogs into a single method call.
1930     (ProjFrame.__VerifyButtons): Add more states to check.
1931     (ProjFrame.__GetProjection): Return the current state of an
1932     edited projection or None.
1933     (ProjFrame.__FillAvailList): Remove checks for states that
1934     shouldn't exist.
1935     (ProjFrame._OnNew): Clear all selected items and supply
1936     a projection panel if necessary.
1937    
1938     * test/test_proj.py (TestProjFile.test): Add tests for
1939     ProjFile.SetAllParameters, ProjFile.SetProjection,
1940     ProjFile.SetName.
1941    
1942     2003-04-25 Jonathan Coles <[email protected]>
1943    
1944 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
1945     takes an optional argument to select the current projection.
1946     This does not guarantee that the item is visible due to
1947     limited wxWindows functionality. Fixes RTBug #1821.
1948    
1949     2003-04-25 Jonathan Coles <[email protected]>
1950    
1951 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
1952     the projection name and use it when constructing the Projection
1953     object.
1954    
1955     * Thuban/Model/proj.py (Projection.__init__): Change the default
1956     value for 'name' to None and then test if name is equal to None
1957     in the body of the constructor. This way the caller doesn't have to
1958     know what the default value should be. Namely, useful in load.py
1959     where we have to pick a default value if the 'name' parameter
1960     doesn't exist in the XML file.
1961    
1962     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
1963     Tests a file where a layer has a projection.
1964    
1965     2003-04-25 Jonathan Coles <[email protected]>
1966    
1967 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
1968     tree for projection information.
1969    
1970     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
1971     XMLReader.GetFileName.
1972     (SessionLoader): Added support for loading projection tags that
1973     appear inside a layer.
1974    
1975     * Thuban/Model/proj.py (ProjFile): Document the class. Move
1976     back to using a list because the order of the projections in
1977     the file is important to maintain. Fixes RTbug #1817.
1978    
1979     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
1980     to ProjFile.GetFilename.
1981    
1982     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
1983     information.
1984    
1985     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
1986     ProjFrame._OnSaveAs. Removed old dead code from previous
1987     implementation.
1988     (ProjFrame._OnExport): Add support for exporting more than one
1989     projection to a single file.
1990     (ProjFrame.__FillAvailList): use string formatting (% operator)
1991     to build strings that are (partly) translated. Fixes RTbug #1818.
1992    
1993     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
1994     class.
1995    
1996 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
1997    
1998     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
1999    
2000     * po/fr.po: New. French translation by Daniel Calvelo Aros
2001    
2002     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2003     empty strings.
2004    
2005 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
2006 jonathan 724
2007     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2008     implement the interface that the ProjFrame dialog expects.
2009    
2010     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2011     name of the projection to be changed.
2012     (ProjFile): Use a dictionary instead of a list so that removing
2013     projections is easier and we are sure about uniqueness.
2014     (ProjFile.Remove): Remove the given projection object.
2015    
2016     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2017     Return a list with only one projection file instead of searching for
2018     any projection file. This simplifies many things if the user can
2019     only have one system file and one user file.
2020    
2021     * Thuban/UI/classgen.py: Change all references to
2022     genCombo to genChoice.
2023    
2024     * Thuban/UI/mainwindow.py: Add a Projection option under the
2025     layer menu.
2026     (MainWindow.LayerProjection): New. Open up a projection window
2027     for a layer.
2028    
2029     * Thuban/UI/projdialog.py: Large changes to how the dialog is
2030     laid out. Use three panels instead of one. One for the list of
2031     projections, one for the edit controls, and one for the buttons.
2032     Fixed resizing problems so that the dialog resizes correctly
2033     when the projection panel changes. Added import/export, save, and
2034     new buttons/functionality.
2035    
2036 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
2037    
2038     First step towards table management. Introduce a simple data
2039     abstraction so that we replace the data a layer uses more easily
2040     in the next step.
2041    
2042     * Thuban/Model/data.py: New file with a simple data abstraction
2043     that bundles shapefile and dbffile into one object.
2044    
2045     * Thuban/Model/session.py (Session.OpenShapefile): New method to
2046     open shapefiles and return a shape store object
2047    
2048     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2049     object instead of a shapefile filename. This introduces a new
2050     instance variable store holding the datastore. For intermediate
2051     backwards compatibility keep the old instance variables.
2052     (open_shapefile): Removed. No longer needed with the shape store.
2053     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2054     get the shape store used by a layer.
2055     (Layer.Destroy): No need to explicitly destroy the shapefile or
2056     table anymore.
2057    
2058     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2059     (MainWindow.AddLayer): Use the session's OpenShapefile method to
2060     open shapefiles
2061    
2062     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2063     session's OpenShapefile method to open shapefiles
2064    
2065     * test/test_classification.py
2066     (TestClassification.test_classification): Use the session's
2067     OpenShapefile method to open shapefiles and build the filename in
2068     a more platform independed way
2069    
2070     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2071     Implement to have a session to use in the tests
2072     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2073     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2074     session's OpenShapefile method to open shapefiles
2075     (TestLayerLegend.setUp): Instantiate a session so that we can use
2076     it to open shapefiles.
2077     (TestLayerLegend.tearDown): Make sure that all references to
2078     layers and session are removed otherwise we may get a resource
2079     leak
2080    
2081     * test/test_map.py (TestMapAddLayer.test_add_layer)
2082     (TestMapWithContents.setUp): Instantiate a session so that we can
2083     use it to open shapefiles.
2084     (TestMapWithContents.tearDown): Make sure that all references to
2085     layers, maps and sessions are removed otherwise we may get a
2086     resource leak
2087     ("__main__"): use support.run_tests() so that more info about
2088     uncollected garbage is printed
2089    
2090     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2091     session's OpenShapefile method to open shapefiles
2092     ("__main__"): use support.run_tests() so that more info about
2093     uncollected garbage is printed
2094    
2095     * test/test_selection.py (TestSelection.tearDown): Make sure that
2096     all references to the session and the selection are removed
2097     otherwise we may get a resource leak
2098     (TestSelection.get_layer): Instantiate a session so that we can
2099     use it to open shapefiles.
2100     ("__main__"): use support.run_tests() so that more info about
2101     uncollected garbage is printed
2102    
2103     * test/test_session.py (TestSessionBase.tearDown)
2104     (TestSessionWithContent.tearDown): Make sure that all references
2105     to the session and layers are removed otherwise we may get a
2106     resource leak
2107     (TestSessionWithContent.setUp): Use the session's OpenShapefile
2108     method to open shapefiles
2109    
2110 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
2111    
2112     * Thuban/Model/load.py (XMLReader.read): Should have been checking
2113     if the file_or_filename object had the 'read' attribute.
2114    
2115 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
2116    
2117 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
2118     (ReadProjFile): Add documentation about which exceptions are raised.
2119     Always pass the exceptions up to the caller.
2120     (GetProjFiles): If the directory can't be read return an empty list.
2121     If any of the proj files can't be read skip that file and go
2122     on to the next one.
2123    
2124     * test/test_proj.py: Added test cases to handle nonexistent files,
2125     unreadable files, and files that don't parse correctly.
2126    
2127     2003-04-23 Jonathan Coles <[email protected]>
2128    
2129 jonathan 716 Projection dialog. Allows the user to select from a list
2130     of projection templates and optionally edit them and save new ones.
2131    
2132     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2133     (ProjPanel): Base class for projection specific panels.
2134     (TMPanel): Projection panel for Transverse Mercartor.
2135     (UTMPanel): Projection panel for Universal Transverse Mercartor.
2136     (LCCPanel): Projection panel for Lambert Conic Conformal.
2137     (GeoPanel): Projetion panel for Geographic Projection.
2138    
2139     2003-04-23 Jonathan Coles <[email protected]>
2140    
2141 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2142     promote symmetry. There now exists XMLReader and XMLWriter.
2143     (XMLReader.read): New. Call to read the given file descriptor or
2144     filename.
2145     (XMLReader.close): New. Make sure the file is closed.
2146     (XMLReader.GetFileName): New. Return just the file name that is being
2147     read from.
2148     (XMLReader.GetDirectory): New. Return just the directory of the file
2149     that is being read.
2150     (XMLReader.AddDispatchers): New. Take a dictionary which contains
2151     the names of functions to call as the XML tree is parsed.
2152     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2153     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2154     (SessionLoader): Removed class variables start_dispatcher and
2155     end_dispatcher since this functionality is now part of a class
2156     instance. Fixes RTbug #1808.
2157     (SessionLoader.__init__): Add dispatcher functions.
2158     (load_xmlfile): Code was moved into the XMLReader.read().
2159     (load_session): Use modified SessionLoader.
2160    
2161     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2162     map's projection.
2163    
2164     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2165     GetAllParameters.
2166     (Projection.GetParameter): Returns the value for the given parameter.
2167    
2168     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2169     (GetProjFiles): Renamed from GetProjections. Now returns a list
2170     of ProjFile objects.
2171     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2172     a list of ProjFile objects whose files are not user defined.
2173     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2174     list of ProjFile objects whose files are user defined.
2175     (ProjFileReader): Extend new XMLReader.
2176    
2177     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2178     promote symmetry.
2179    
2180     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2181     control instead of a wxComboBox. wxChoice controls do not generate
2182     events as the uses highlights possible choices which fixes problems
2183     with resizing the dialog when the use selects an option.
2184    
2185     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2186     control instead of a wxComboBox.
2187    
2188     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2189     dialog.
2190    
2191     * test/test_proj.py (TestProjection.test): New tests for GetParameter
2192     method.
2193    
2194 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
2195    
2196 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
2197     constants
2198    
2199 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2200     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2201    
2202 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
2203    
2204 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2205     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2206     anymore.
2207     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2208     (Layer.ShapeType, Layer.Shape): No need to call
2209     self.open_shapefile since it's always called in __init__
2210    
2211 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2212     In wxPython 2.4 there's no need to extend MainLoop anymore since
2213     wxPython itself makes sure OnExit is called.
2214    
2215 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
2216    
2217 jonathan 693 Initial putback of projection management code. Includes new
2218     classes to read and write projection files. The current load
2219     and save classes were abstracted a bit so they could be reused.
2220     The Projection class was extended to provide new methods and
2221     have a name.
2222    
2223     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2224     general XML reading methods that were part of ProcessSession.
2225    
2226     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2227     name.
2228     (ProjFile): New. Represents a file that contains projection
2229     information.
2230    
2231     * Thuban/Model/resource.py: New. Contains general utilities
2232     for read and writing projection files.
2233    
2234     * Thuban/Model/save.py (XMLSaver): New. Contains all the
2235     general XML writing methods that were part of SessionSaver.
2236     (SessionSaver): Renamed from Saver.
2237    
2238     * test/test_proj.py: New test cases for the projection
2239     file read and write functions.
2240    
2241     2003-04-16 Jonathan Coles <[email protected]>
2242    
2243 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
2244     in the ClassGroup*.__repr__() methods so it is clearer when
2245     a value is a string and when it is a number.
2246    
2247     * test/test_load.py: Rework the classification test to test
2248     that we can load old files.
2249     (testLabels): Test a file where the groups have labels.
2250    
2251 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
2252    
2253     Safer implementation of the performance enhancements of the
2254     low-level renderer:
2255    
2256     * extensions/thuban/wxproj.cpp (extract_projection)
2257     (extract_pointer): Rename extract_projection to extract_pointer
2258     and redefine its purpose to return the pointer stored in a CObject
2259     returned by the object's cobject method. Update all callers.
2260     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2261     handling of these low-level parameters so that each s_draw_info
2262     instance is handled as a CObject at python level that also
2263     contains real references to the actual python objects which
2264     contain the values in the struct. Add free_draw_info as the
2265     destructor.
2266     (draw_polygon_shape): Add the py_draw_info parameter which must a
2267     cobject containing an s_draw_info pointer.
2268    
2269     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2270     method to instantiat the low-level render parameter
2271     (MapRenderer.draw_shape_layer): Use the new method. Remove some
2272     commented out code.
2273     (MapRenderer.draw_polygon_shape): Make the first parameter not the
2274     layer but the low-level render parameter
2275     (ScreenRenderer.draw_shape_layer): Use the low-level render
2276     parameter.
2277    
2278 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
2279    
2280 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
2281     the ClassGroup* classes to make debugging a bit easier.
2282     (ClassGroup.SetLabel): Check that the string is an instance
2283     of StringTypes not StringType. Accounts for Unicode strings.
2284    
2285     * Thuban/Model/color.py: Implemented __repr__ to make
2286     debugging a bit easier.
2287    
2288     * Thuban/Model/save.py (Saver.write_classification): Need to
2289     save the group label.
2290    
2291     * test/test_load.py (testClassification): New. Loads the
2292     iceland_sample_test.thuban file and checks if it was loaded
2293     correctly.
2294    
2295     2003-04-15 Jonathan Coles <[email protected]>
2296    
2297 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2298     to improve rendering performance by initializing the variables
2299     that are not change each time draw_polygon_shape() is called.
2300     The values are stored in a global struct draw_info.
2301     (draw_polygon_shape): Removed initialization code that is
2302     now in draw_polygon_init().
2303    
2304     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2305 jonathan 674 drawing initialization call to draw_polygon_init()
2306     (MapRenderer.draw_polygon_shape): Use new signature of
2307     draw_polygon_shape.
2308 jonathan 673
2309 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2310     weirdness by setting the range to (1, maxint).
2311 jonathan 673
2312 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
2313     instance variables private and optimize comparison operator
2314     by first checking if the color references are the same.
2315     (ClassGroupSingleton): Make instance variables private.
2316     (ClassGroupRange): Make instance variables private.
2317 jonathan 673
2318 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
2319    
2320 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
2321    
2322     First stab at internationalized messages:
2323    
2324     * Thuban/__init__.py (_): Implement the translation function for
2325     real using the python gettext module.
2326    
2327     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2328     translate empty strings.
2329    
2330     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2331     Add a missing space to a warning message
2332    
2333     * po/README: New. Notes about the management of the translation
2334     files.
2335    
2336     * po/Makefile: New. Makefile to help manage the translation files.
2337    
2338     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2339    
2340     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2341     translations and support files in po/
2342    
2343     * setup.py (data_files): Add the *.mo files to the data_files too
2344    
2345     * README: Add note about the translations when building from CVS
2346    
2347 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
2348    
2349     * Thuban/UI/dock.py: Fixes some window resizing problems most
2350     noticable under windows. Always assume the button bitmaps will
2351     be there. Code clean up.
2352     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2353     images for the dock/undock button to the same images.
2354     Work around for RTbug #1801.
2355    
2356     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2357     be allowed to grow within the sizer. Fixes a bug under Windows
2358     where the toolbar wasn't being drawn.
2359    
2360 frank 664 2003-04-14 Frank Koormann <[email protected]>
2361    
2362     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2363     Updated design to try to make the button functionality more
2364     transparent.
2365    
2366 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
2367    
2368     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2369     finalize the intialization of the panel.
2370    
2371     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2372     creation of the panel. Should be the last thing called in the
2373     initializer of a subclass.
2374    
2375     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2376     set the current selections in the combo boxes. This is needed
2377     under Windows.
2378    
2379     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2380     level panel to the dialog so that the background colors are
2381     consistent under Windows.
2382    
2383 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
2384    
2385 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
2386     not black.
2387    
2388     * Thuban/UI/legend.py: Enable/disable the legend buttons when
2389     the legend changes. Fixes RTbug #1793.
2390    
2391     * test/test_classification.py: Added test for copying of
2392     classifications.
2393    
2394     2003-04-11 Jonathan Coles <[email protected]>
2395    
2396 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
2397     such as bitmaps.
2398    
2399     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2400     added images to the move buttons, added 'reverse' button.
2401     (CustomRampPanel.__init__): Added images to the move buttons.
2402     (GreyRamp): New. Generates a ramp from white to black.
2403     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2404    
2405     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2406     ID_PROPERTY_*.
2407     (Classifier.__init__): Minor changes to the layout.
2408     (Classifier._OnTitleChanged): Listen for when the user edits the
2409     title and update the dialog's title and the layer's title.
2410    
2411     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2412    
2413     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2414     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2415     if the layer's title changes.
2416    
2417     * Thuban/UI/mainwindow.py: Added new menu item and associated code
2418     to open a dialog to rename the map.
2419     (MainWindow): Use new resource class to import bitmaps.
2420    
2421     2003-04-11 Jonathan Coles <[email protected]>
2422    
2423 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2424 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2425     Resources/Bitmaps/group_use_none.xpm,
2426     Resources/Bitmaps/group_use_not.xpm,
2427     Resources/Bitmaps/hide_layer.xpm,
2428     Resources/Bitmaps/layer_properties.xpm,
2429     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2430     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2431     New.
2432 jonathan 646
2433 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
2434    
2435 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2436     Should pass group to ClassGroup constructor.
2437    
2438     2003-04-10 Jonathan Coles <[email protected]>
2439    
2440 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
2441     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2442     here. Implement SetVisible(), IsVisible().
2443     (ClassGroup.__init__): Add group parameter which acts as a copy
2444     constructor.
2445    
2446     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2447     "Visible" check boxes.
2448     (Classifier): Rename the buttons and refactor the code to match
2449     the new labels.
2450    
2451     * Thuban/UI/legend.py: Classify button is now called "Properties".
2452     Refactored the code to change variable names.
2453     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2454    
2455     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2456     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2457     renamed to MainWindow.LayerEditProperties.
2458     (MainWindow.ToggleLegend): Don't include map name in legend title.
2459     (MainWindow.SetMap): Added the map name to the window title.
2460     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2461     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2462     Functionality is found in the layer properties dialog.
2463    
2464     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2465     draw visible groups.
2466    
2467 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
2468    
2469 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
2470     addition and selection of new color schemes.
2471     (MonochromaticRamp): New. Generates a ramp between two colors.
2472     (RedRamp): New. Generates a ramp of all red.
2473     (GreenRamp): New. Generates a ramp of all green.
2474     (BlueRamp): New. Generates a ramp of all blue.
2475    
2476     2003-04-09 Jonathan Coles <[email protected]>
2477    
2478 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
2479     Need to copy over field and fieldType attributes.
2480    
2481     * Thuban/Model/table.py (Table.field_range): New. Retrive the
2482     maximum and minimum values over the entire table for a given
2483     field.
2484     (Table.GetUniqueValues): New. Retrieve all the unique values
2485     in the table for a given field.
2486    
2487     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
2488     (GenUniquePanel): New. Controls to allow the user to select
2489     which unique field values they would like in the classification.
2490     (CustomRampPanel): Code that was in ClassGenDialog that allows
2491     the user to select the properties for a custom ramp.
2492     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
2493    
2494     * Thuban/UI/classifier.py: Removed a lot of debugging code.
2495     (Classifier._SetClassification): Callback method so that the
2496     class generator can set the classification in the grid.
2497     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
2498     editing of a group properties class into a wxWindows control.
2499    
2500     * Thuban/UI/dock.py: It was decided that if the user closes
2501     a dockable window the window should simply hide itself. That
2502     way if the user wants to show the dock again it appears in the
2503     same place as it was when it was closed.
2504     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
2505     (DockableWindow._OnButtonClose): Hide the window instead of
2506     destroying it.
2507     (DockableWindow._OnClose): Hide the window instead of
2508     destroying it.
2509    
2510     * Thuban/UI/legend.py (LegendTree): Use a private method to
2511     consistently set the font and style of the text. Fixes RTbug #1786.
2512    
2513     * Thuban/UI/mainwindow.py: Import just the Classifier class.
2514    
2515 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
2516    
2517 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
2518     to the map module
2519    
2520     2003-04-07 Bernhard Herzog <[email protected]>
2521    
2522 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
2523     favor of ToggleSessionTree
2524     (MainWindow.ToggleSessionTree): New method to toggle visibility of
2525     the session tree.
2526     (MainWindow.SessionTreeShown): New method to return whether the
2527     session tree is currently shown.
2528     (MainWindow.ToggleLegend): New method to toggle visibility of the
2529     legend
2530     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
2531     LegendShown
2532     (MainWindow.LegendShown): New method to return whether the legend
2533     is currently shown.
2534     (_method_command): Add checked parameter so we can define check
2535     menu items
2536     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
2537     mainwindow methods.
2538     (show_session_tree, show_legend commands): Removed.
2539     (toggle_session_tree, toggle_legend commands): New commands to
2540     toggle the visibility of the dialogs
2541    
2542 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
2543    
2544 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
2545    
2546     * Thuban/UI/dock.py: Fix Windows problem.
2547    
2548     * Thuban/UI/mainwindow.py: Use False instead of false.
2549     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2550    
2551     2003-04-07 Jonathan Coles <[email protected]>
2552    
2553 jonathan 612 Since we now say that the order of the groups in a classification
2554     matters, it makes sense to be able to manipulate that order. Most
2555     of the changes to Thuban/Model/classification.py are to that end.
2556    
2557     * Thuban/Model/classification.py (Classification.AppendGroup,
2558     Classification.InsertGroup, Classification.ReplaceGroup,
2559     Classification.RemoveGroup, Classification.GetGroup): Do as the
2560     names imply.
2561     (Classification.FindGroup): This was called GetGroup, but GetGroup
2562     takes an index, while FindGroup takes a value.
2563     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2564     REFERENCE. Currently there is a cyclic reference between the layer
2565     and its classification. If the classification doesn't need to know
2566     its owning layer we can change this, since it may make sense to be
2567     able to use the same classification with different layers.
2568    
2569     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2570    
2571     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2572     not AddGroup()
2573    
2574     * Thuban/UI/classifier.py: Now that we can depend on the order in
2575     a Classification and have methods to manipulate that order we don't
2576     need to use our own data structures in the grid. We can simply make
2577     the grid/table access the information they need from a copy of
2578     the classification object.
2579     (Classifier._OnCloseBtn): Event handler for when the user clicks
2580     'Close'. This is needed so if the user applies changes and then
2581     continues to change the table the user has the option of discarding
2582     the most recent changes and keeping what they applied.
2583    
2584     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2585     into the same group.
2586    
2587     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2588     with a really old version of proj, PJ_VERSION won't even be defined.
2589     If it isn't defined then just compile so that the function always
2590     returns Py_False.
2591    
2592     * test/test_classification.py: Fix tests to use the renamed methods.
2593     Still need to write tests for the new methods.
2594    
2595 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
2596 jonathan 608
2597 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2598     call to SetSelection out of the method and before the call
2599     to __SelectField in __init__. This prevents a recursion of events
2600     when _OnFieldSelect is triggered by the user.
2601    
2602     2003-04-04 Jonathan Coles <[email protected]>
2603    
2604 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
2605     Color.Transparent.
2606     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2607     Don't bother copying the color, since Colors are immutable.
2608    
2609     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2610     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2611     Thuban/UI/renderer.py, Thuban/UI/view.py:
2612     Rename Color.None to Color.Transparent.
2613    
2614     * test/test_classification.py, test/test_load.py: Rename Color.None
2615     to Color.Transparent.
2616    
2617     2003-04-04 Jonathan Coles <[email protected]>
2618 jonathan 603
2619     * Thuban/Model/classification.py: Fix assert calls.
2620     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2621     Copy the color parameter rather than hold onto a reference.
2622 jonathan 601
2623 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2624     the color object.
2625     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2626     are sure there exists only one refernce to Color.None in the system.
2627     This allows us to use 'is' rather than the comparision functions.
2628    
2629     * Thuban/Model/save.py: Fix assert calls.
2630    
2631     * Thuban/UI/classifier.py: Fix assert calls.
2632     (ClassGrid._OnCellDClick): Call up to the classifier to open the
2633     dialog to edit the groups properties.
2634     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2635     correctly if a cell is resized.
2636     (ClassTable.SetClassification): New. Changes the classification
2637     that is in the table.
2638     (ClassTable.__SetRow): Allow groups to be prepended.
2639     (Classifier): New code for opening the EditProperties and
2640     GenerateRanges dialogs.
2641     (SelectPropertiesDialog.__GetColor): Only set the color in the
2642     color dialog if the current color is not None.
2643    
2644     * Thuban/UI/dock.py: Fix assert calls.
2645    
2646     * Thuban/UI/legend.py: Fix assert calls.
2647    
2648     * Thuban/UI/renderer.py: Fix assert calls.
2649    
2650     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2651     classifications.
2652     (GenRangePanel): Panel specific to range generation.
2653     (GenSingletonPanel): Panel specific to singleton generation.
2654     (ClassGenerator): Class responsible for actually generating
2655     the classification from the data gathered in the dialog box.
2656     (PropertyRamp): Generates properties whose values range from
2657     a starting property to an ending property.
2658 jonathan 601
2659 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
2660    
2661     * test/support.py (print_garbage_information): New function that
2662     prints information about still connected messages and memory
2663     leaks.
2664     (run_suite): Removed.
2665     (run_tests): New function for use as a replacement of
2666     unittest.main in the test_* files. This one calls
2667     print_garbage_information at the end.
2668    
2669     * test/runtests.py (main): Use support.print_garbage_information
2670    
2671     * test/test_layer.py: Use support.run_tests instead of
2672     unittest.main so we get memory leak information
2673     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2674     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2675     (TestLayerLegend.test_visibility): Call the layer's Destroy method
2676     to fix a memory leak.
2677    
2678     * test/test_classification.py: Use support.run_tests instead of
2679     unittest.main so we get memory leak information
2680     (TestClassification.test_classification): Call the layer's Destroy
2681     method to fix a memory leak.
2682    
2683 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
2684    
2685 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2686     Handle the reference counts of the return value and errors in
2687     PyArg_ParseTuple correctly.
2688    
2689 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2690     sure the filename is absolute to avoid problems when saving the
2691     session again
2692    
2693 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2694    
2695 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
2696    
2697 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2698 jonathan 587 that there actually are points in the returned list of points
2699     before trying to index into the list. The list may be empty if
2700     the shape is a Null Shape.
2701    
2702 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
2703    
2704     * test/test_map.py: Don't use from <module> import *
2705    
2706 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
2707    
2708     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2709     LAYER_LEGEND_CHANGED
2710    
2711     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2712     self.Destroy() to close the window after yesterday's changes.
2713    
2714     * test/test_map.py, test/test_session.py: Fix messages that
2715     are sent from maps and layers.
2716    
2717 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
2718    
2719     * Thuban/UI/classifier.py: Commented out some debugging statements.
2720     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2721     RTbug #1769.
2722    
2723     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2724     position (although position doesn't work yet under GTK).
2725     (DockableWindow.Destroy): New. Called when the window must be
2726     closed. Namely needed when the DockFrame closes and must close
2727     its children.
2728     (DockFrame): Listen for EVT_CLOSE and destroy all children.
2729    
2730     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2731     when then window is told to close.
2732     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2733     comment in source for more info.
2734    
2735     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2736    
2737     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2738     symmetry with other such methods.
2739     (MainWindow.ShowLegend): Show the legend docked by default.
2740    
2741 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
2742    
2743     * Thuban/UI/classifier.py: Support for highlighting a specific
2744     group within the grid when the classification dialog is opened.
2745     Also contains a lot of debugging printouts which will later
2746     be removed.
2747    
2748     * Thuban/UI/dock.py: Complete rework on the dock code so that
2749     that it is fairly removed from the rest of the Thuban application.
2750     It is easy to add new docks which the rest of the program having
2751     to be aware of them.
2752    
2753     * Thuban/UI/legend.py: Modifications to support selecting a
2754     specific group in the classification dialog. Changed how layers
2755     are drawn when the layer is visible/invisible.
2756    
2757     * Thuban/UI/mainwindow.py: Removed legend specific code and
2758     replaced it with calls to the new dock code.
2759    
2760     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2761     to check if scale > 0. Trying to track down a divide by zero.
2762    
2763 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
2764    
2765 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2766     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2767     now part of DockableWindow.
2768     (LegendPanel.DoOnSelChanged): Select the current layer in the
2769     map.
2770     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2771     with the selected layer and/or group.
2772    
2773     2003-03-26 Jonathan Coles <[email protected]>
2774    
2775 jonathan 557 This putback contains the code for dockable windows. There is
2776     no support in wxWindows as of this date for windows that can
2777     attach themselves to other windows.
2778    
2779     The current model contains a DockableWindow which has a parent
2780     window for when it is detached and a dock window that it puts
2781     its contents in when it is docked. The contents of a DockableWindow
2782     must be a DockPanel. DockPanel itself derives from wxPanel.
2783    
2784     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2785     message, not a LAYER_LEGEND_CHANGED message.
2786    
2787     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2788    
2789     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2790     as one of the style properties for the fieldTypeText item to
2791     be sure that its size is correct when the text changes.
2792    
2793     * Thuban/UI/dock.py: New. Classes for the DockPanel and
2794     DockableWindow.
2795    
2796     * Thuban/UI/legend.py: Added some more buttons and made the
2797     LegendPanel a DockPanel.
2798    
2799     * Thuban/UI/mainwindow.py: Added sash windows to the main window
2800     and supporting functions for manipulating the sashes.
2801     (MainWindow.ShowLegend): Create a DockableWindow with the
2802     LegendPanel as the contents.
2803    
2804     * Thuban/UI/messages.py: Added DOCKABLE_* messages
2805    
2806     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2807     not LAYER_LEGEND_CHANGED, messages.
2808    
2809 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
2810    
2811     * setup.py: Added custom script bdist_rpm_build_script so that
2812     when the rpm is built the path to wx-config is correct.
2813    
2814     * setup.cfg: Added line saying to use the custom build script
2815    
2816 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
2817    
2818     Initial implementation of the Legend.
2819    
2820     * Thuban/UI/legend.py: New. Creates a window that shows the map's
2821     Legend information and allows the user to add/modify classifications
2822     and how the layers are drawn on the map.
2823    
2824     * setup.py: New command 'build_docs' which currently uses
2825     happydoc to generate html documentation for Thuban.
2826    
2827     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
2828     Returns a string which is appropriately describes the group.
2829    
2830     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
2831     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
2832    
2833     * Thuban/Model/map.py (Map): Rename messages and use new, more
2834     specific, messages.
2835    
2836     * Thuban/Model/messages.py: New message to indicate that a layer's
2837     data has changed (LAYER_CHANGED). New map messages to indicate
2838     when layers have been added/removed/changed or if the stacking order
2839     of the layers has changed.
2840    
2841     * Thuban/Model/session.py: Rename and use new messages.
2842    
2843     * Thuban/UI/classifier.py: Remember if any changes have actually
2844     been applied so that if the dialog is cancelled without an application
2845     of changes we don't have to set a new classification.
2846     (ClassDataPreviewer): Pulled out the window specific code and put it
2847     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
2848     symbols on any DC.
2849    
2850     * Thuban/UI/mainwindow.py: New code to open the legend.
2851    
2852     * Thuban/UI/view.py: Use new message names.
2853    
2854 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
2855    
2856     * Thuban/UI/main.py (verify_versions): New. Checks the versions
2857     of Python, wxPython, and some other libraries.
2858    
2859     * extensions/thuban/wxproj.cpp (check_version): Checks the given
2860     version against what wxproj was compiled with.
2861     (check_version_gtk): If wxproj was compiled with gtk then check
2862     the given version against the version of the gtk library
2863     currently being used.
2864    
2865 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
2866    
2867     * test/test_command.py: Run the tests when the module is run as a
2868     script
2869    
2870     2003-03-14 Bernhard Herzog <[email protected]>
2871    
2872     Implement selection of multiple selected shapes in the same layer:
2873    
2874     - Introduce a new class to hold the selection. This basically
2875     replaces the interactor which was nothing more than the
2876     selection anyway. A major difference is of course that the new
2877     selection class supports multiple selected shapes in one layer
2878    
2879     - Move the object that represents the selection from the
2880     application to the canvas. The canvas is a better place than the
2881     application because the selection represents which shapes and
2882     layer of the map displayed by the canvas are selected and
2883     affects how the map is drawn.
2884    
2885     - Make the selection and its messages publicly available through
2886     the mainwindow.
2887    
2888     - The non-modal dialogs do not get a reference to the interactor
2889     anymore as they can simply refer to their parent, the
2890     mainwindow, for the what the interactor had to offer.
2891    
2892     * Thuban/UI/selection.py: New module with a class to represent the
2893     selection.
2894    
2895     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
2896     these unused messages
2897    
2898     * Thuban/UI/application.py (ThubanApplication.OnInit)
2899     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
2900     interactor is gone now.
2901     (ThubanApplication.CreateMainWindow): There is no interactor
2902     anymore so we pass None as the interactor argument for now for
2903     compatibility.
2904    
2905     * Thuban/UI/view.py (MapCanvas.delegated_messages)
2906     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
2907     Unsubscribe, delegate messages according to the delegated_messages
2908     class variable.
2909     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
2910     attributes from instance variables as described with the
2911     delegated_methods class variable.
2912     (MapCanvas.__init__): New instance variable selection holding the
2913     current selection
2914     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
2915     pass them on to the renderer
2916     (MapCanvas.SetMap): Clear the selection when a different map is
2917     selected.
2918     (MapCanvas.shape_selected): Simple force a complete redraw. The
2919     selection class now takes care of only issueing SHAPES_SELECTED
2920     messages when the set of selected shapes actually does change.
2921     (MapCanvas.SelectShapeAt): The selection is now managed in
2922     self.selection
2923    
2924     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
2925     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
2926     Unsubscribe, delegate messages according to the delegated_messages
2927     class variable.
2928     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
2929     attributes from instance variables as described with the
2930     delegated_methods class variable.
2931     (MainWindow.__init__): The interactor as ivar is gone. The
2932     parameter is still there for compatibility. The selection messages
2933     now come from the canvas.
2934     (MainWindow.current_layer, MainWindow.has_selected_layer):
2935     Delegate to the the canvas.
2936     (MainWindow.LayerShowTable, MainWindow.Classify)
2937     (MainWindow.identify_view_on_demand): The dialogs don't need the
2938     interactor parameter anymore.
2939    
2940     * Thuban/UI/tableview.py (TableFrame.__init__)
2941     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
2942     (LayerTableFrame.row_selected): The interactor is gone. It's job
2943     from the dialog's point of view is now done by the mainwindow,
2944     i.e. the parent. Subscribe to SHAPES_SELECTED instead
2945     of SELECTED_SHAPE
2946    
2947     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
2948     is gone. It's job from the dialog's point of view is now done by
2949     the mainwindow, i.e. the parent.
2950    
2951     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
2952     gone. It's job from the dialog's point of view is now done by the
2953     mainwindow, i.e. the parent.
2954    
2955     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
2956     gone. It's job from the dialog's point of view is now done by the
2957     mainwindow, i.e. the parent.
2958     (SessionTreeCtrl.__init__): New parameter mainwindow which is
2959     stored as self.mainwindow. The mainwindow is need so that the tree
2960     can still subscribe to the selection messages.
2961     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
2962     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
2963     selection is now accessible through the mainwindow. Subscribe to
2964     SHAPES_SELECTED instead of SELECTED_SHAPE
2965    
2966     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
2967     SHAPES_SELECTED message now.
2968     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
2969     so deal with multiple shapes
2970     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
2971     gone. It's job from the dialog's point of view is now done by the
2972     mainwindow, i.e. the parent.
2973    
2974     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
2975     parameter is now a list of shape ids.
2976     (RecordTable.SetTable): The second parameter is now a list of
2977     indices.
2978    
2979     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
2980     selected_shape parameter and ivar to selected_shapes. It's now a
2981     list of shape ids.
2982     (MapRenderer.draw_label_layer): Deal with multiple selected
2983     shapes. Rearrange the code a bit so that the setup and shape type
2984     distinctions are only executed once.
2985    
2986     * test/test_selection.py: Test cases for the selection class
2987    
2988 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
2989    
2990     * Thuban/Model/load.py: Temporary fix so that the xml reader
2991     doesn't cause Thuban to crash.
2992    
2993     * Thuban/Model/layer.py: Handle the cyclic references between
2994     a layer and its classification better, and be sure to disconnect
2995     the classification from the layer when the layer is destroyed
2996     so that we don't maintain a cyclic reference that may not be
2997     garbage collected.
2998    
2999     * Thuban/Model/classification.py: See comment for layer.py.
3000    
3001 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
3002    
3003     * HOWTO-Release: New. Information on the steps for releasing
3004     a new version of Thuban.
3005    
3006 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
3007    
3008     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3009     Use True instead of true.
3010     (Classifier): Should have a single panel in which all the controls lie.
3011    
3012     * Thuban/UI/proj4dialog.py: Add normal border.
3013    
3014     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3015    
3016     * Thuban/UI/mainwindow.py: Use True instead of true.
3017    
3018     * setup.py: Update some definitions to use wxWindows2.4 files
3019    
3020     * Data/iceland_sample_class.thuban: Fixed file so that the
3021     field_type information is present.
3022    
3023 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
3024    
3025 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
3026     field type label grow so that when the text changes the
3027     size is updated correctly. This may be a wxWindows bug.
3028    
3029     2003-03-10 Jonathan Coles <[email protected]>
3030    
3031 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
3032     SESSION_REPLACED.
3033    
3034     * Thuban/UI/classifier.py: Wrap text with _().
3035     (ClassGrid.CreateTable): Set dimensions and size hints here,
3036     instead of in Reset, so we only set the size once.
3037    
3038     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3039    
3040     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3041     Call Close() instead of Shutdown().
3042    
3043     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3044    
3045     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3046     Go back to using OnClose() instead of Shutdown().
3047    
3048     2003-03-10 Jonathan Coles <[email protected]>
3049    
3050 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
3051     to know the old field index as well as the new one.
3052    
3053     2003-03-10 Jonathan Coles <[email protected]>
3054    
3055 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3056     to correctly set the table information and call this from
3057     __init__ and from _OnFieldSelect so that all the information
3058     is up to date when the dialog opens and when a field is changed.
3059    
3060     2003-03-10 Jonathan Coles <[email protected]>
3061    
3062 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
3063     layer's message function directly, use the ClassChanged() method
3064     when then classification changes. SetField/SetFieldType/SetLayer
3065     must keep the information about field name and field type in
3066     sync when an owning layer is set or removed.
3067    
3068     * Thuban/Model/layer.py: Added ClassChanged() so that the
3069     classification can tell the layer when its data has changed.
3070     (Layer.SetClassification): Accepts None as an arguement to
3071     remove the current classification and correctly handles
3072     adding a new classification.
3073    
3074     * Thuban/Model/load.py: Comment out print statement
3075    
3076     * test/test_classification.py, test/test_save.py: New and
3077     improved tests.
3078    
3079 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
3080    
3081     * Thuban/Model/classification.py: Implemented __copy__ and
3082     __deepcopy__ for ClassGroup* and ClassGroupProperites so
3083     they can easily be copied by the classifier dialog.
3084     (ClassGroupProperites.__init__): The default line color should
3085     have been Color.Black.
3086    
3087     * Thuban/UI/classifier.py: Setting and Getting table values now
3088     uses a consistent set of functions.
3089     (Classifier): Now non-modal. Has field type label which changes
3090     as the field changes. Keep track of buttons in a list so that
3091     we can enable/disable the buttons when the None field is selected.
3092     (SelectPropertiesDialog): Add buttons to make the colors transparent.
3093    
3094     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3095     does what OnClose did, but can be called by the application to
3096     close a window. Needed when a session changes, and we have to
3097     close the classifier windows.
3098    
3099     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3100     Shuts down open dialogs. Used when a new session is created
3101     or a session is opened.
3102     (MainWindow.SaveSession): Should only call application.SaveSession()
3103     if we don't call SaveSessionAs first.
3104     (MainWindow.Classify): Allow different classifier dialogs for
3105     different layers.
3106    
3107     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3108     the parent class handle it. Add Shutdown() to unsubscibe from
3109     event notification and call the parent Shutdown(). This was
3110     necessary so the application can close the tree window.
3111    
3112 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
3113    
3114     * Thuban/Model/classification.py: Minor documentation changes,
3115     Addition of __eq__ and __ne__ methods.
3116     (Classification.SetLayer): prevent recursion between this method
3117     and Layer.SetClassification().
3118    
3119     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3120    
3121     * Thuban/Model/layer.py (SetClassification): prevent recursion
3122     between this method and Classification.SetLayer().
3123    
3124     * test/test_classification.py, test/test_load.py,
3125     test/test_session.py: Fixed and added tests for the classification
3126     classes.
3127    
3128 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
3129    
3130     * Thuban/UI/classifier.py (ClassGrid.__init__)
3131     (ClassGrid.CreateTable): Move the SetSelectionMode call to
3132     CreateTable because otherwise it triggers an assertion in
3133     wxPython/wxGTK 2.4.
3134    
3135 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
3136    
3137 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3138 jonathan 471
3139 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
3140 jonathan 471
3141 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3142 jonathan 471
3143 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
3144 jonathan 471
3145     2003-03-05 Jonathan Coles <[email protected]>
3146    
3147 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
3148     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3149     Store just the groups in the table and generate the other
3150     column information when it is requested. Add "None" field
3151     to pull-down to select no classification.
3152    
3153     * Thuban/common.py: Moved FIELDTYPE constants from table.py
3154     (Str2Num): Only catch ValueError exceptions.
3155    
3156     * Thuban/Model/classification.py: Class documentation. Renaming
3157     of methods with Stroke to Line. Groups are stored in a single
3158     list with the default as the first element. Groups are searched
3159     in the order they appear in the list.
3160    
3161     * Thuban/Model/color.py: Documentation.
3162    
3163     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3164     the kind of data represented by a field.
3165    
3166     * Thuban/Model/load.py (ProcessSession): Use proper string
3167     conversion function; fixes RTbug #1713.
3168    
3169     * Thuban/Model/save.py (Saver): Store field type information.
3170    
3171     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3172     (Table): Add field_info_by_name() to retrieve field information
3173     by specifying the field name, not the number.
3174    
3175     * Thuban/UI/mainwindow.py: Function name changes.
3176    
3177     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3178     get the layer classification once. Don't try to classify
3179     values when the field is None: just use the default properties.
3180    
3181     * Thuban/UI/view.py: Function name changes.
3182    
3183     * Doc/thuban.dtd: Add field_type attribute to a classification.
3184    
3185 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
3186    
3187 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3188     the fill and stroke layer attributes optional with suitable
3189     default values. Add the stroke_width layer attribute. Use correct
3190     syntax for empty elements. Make the attribute list for labels
3191     refer to the label element.
3192    
3193     2003-03-04 Bernhard Herzog <[email protected]>
3194    
3195 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
3196     Python 2.3 containing some of the functionality we implement in
3197     setup.py ourselves.
3198    
3199     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3200     before the selection mode. Doing it the other way round triggers
3201     an assertion in wxWindows.
3202    
3203     * Thuban/Model/save.py (escape): Fix typo in doc-string
3204    
3205     * Thuban/Model/classification.py: Remove unnecessary wxPython
3206     import
3207    
3208 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
3209    
3210     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3211     Parameter 'value' should default to None.
3212    
3213     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3214     the class attribute __classification is now private.
3215    
3216     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3217     Classifier to ClassGrid. Added support for removing selected rows,
3218     which including code for keeping track of when cells are selected,
3219     and deselected.
3220     (ClassTable): Support for added/removing rows. Fixed a problem
3221     with __ParseInput whereby it would not allow strings (only numbers)
3222     to be entered.
3223     (Classifier): Added button and supporting code for removing
3224     selected rows.
3225    
3226 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
3227 jonathan 434
3228     * Thuban/common.py: Moved color conversion functions into
3229     Thuban/UI/common.py.
3230     (Str2Num): Now converts the float (not the string) to a long/int
3231     so that an exception isn't thrown.
3232    
3233     * Thuban/UI/common.py: Common functions used in several UI modules
3234    
3235     * Thuban/Model/classification.py: Changed the class hierarchy
3236     so that a Classification consists of Groups which return
3237     Properties when a value matches a Group.
3238    
3239     * Thuban/Model/layer.py: Fixed name resolution problem.
3240    
3241     * Thuban/Model/load.py: Use new Classification and Group functions.
3242    
3243     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
3244     failure.
3245     (Saver.write_classification): Use new Classification and Group
3246     functions.
3247    
3248     * Thuban/UI/classifier.py: Changes to use new Classification and Group
3249 jonathan 445 functions. Fix to create a tuple with a single value instead of
3250     simply returning the value.
3251 jonathan 434
3252     * Thuban/UI/renderer.py: Use new Classification and Group functions.
3253     Use common.py functions.
3254    
3255 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
3256 jonathan 447
3257     * test/test_classification.py: Use new Classification and Group
3258     classes.
3259 jonathan 434
3260 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
3261    
3262     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
3263     functions from Thuban color objects to wxWindow colour objects.
3264    
3265     * Thuban/Model/classification.py (Classification): Renamed
3266     GetProperties() to GetClassData(). Used the new iterator
3267     in TreeInfo().
3268     (ClassIterator): Iterator implementation to iterate over the
3269     ClassData objects in a classification object.
3270    
3271     * Thuban/Model/save.py (Saver.write_classificaton): Uses
3272     the new iterator to save the classification information.
3273    
3274     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
3275     for changing the stroke and fill colors and previewing the
3276     changes.
3277    
3278     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
3279     MainWindow.SaveSessionAs): Text string changes so the dialogs
3280     have more meaningful titles.
3281    
3282     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
3283     Classification method name from GetProperties to GetClassData.
3284    
3285     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
3286     instead of accessing now non-existent class variables.
3287    
3288 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
3289    
3290     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
3291     unneeded Shape() call. Rendering is substantially faster without
3292     it and it avoids some problems with broken shape files.
3293    
3294 frank 423 2003-02-20 Frank Koormann <[email protected]>
3295    
3296     Force minimal size of identify and label dialogs. The autosizing
3297     looked too ugly.
3298    
3299     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
3300     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
3301     Set size of listctrl.
3302     * Thuban/UI/identifyview.py (IdentifyView.__init__):
3303     Set size of dialog.
3304    
3305 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
3306    
3307     * test/test_classification.py, test/test_layer.py,
3308     test/test_load.py, test/test_map.py, test/test_session.py:
3309     Updated the tests to use the new functions that are in the
3310     respective classes.
3311    
3312     * Thuban/Model/classification.py (Classification):
3313     Uses the new ClassData* classes. Modification messages are
3314     passed up to the parent layer (if it exists).
3315     (ClassData): New class to encapsulate the common data in each
3316     classification property.
3317     (ClassDataDefault): Represents the Default class. data.
3318     (ClassDataPoint): Represents a single class. data point
3319     (ClassDataRange): Represents a class. range
3320     (ClassDataMap): Represents a class. map (unused).
3321    
3322     * Thuban/Model/color.py: Added Color.None to represent something
3323     with no color. Color.Black represents the color black.
3324     (NoColor): Helper class derived from Color to represent something
3325     with no color.
3326    
3327     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3328     stroke_width attributes. Made the 'classification' attribute private.
3329     New methods for setting/getting the classification.
3330    
3331     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3332     to get the classifcation and use the new ClassData* classes to
3333     hold the classification data. Use Str2Num to convert numbers
3334     properly.
3335    
3336     * Thuban/Model/save.py (Saver): Use new Color and Classification
3337     methods
3338    
3339     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3340     custom grid.
3341     (ClassTable): Support for editing Values and Labels and for
3342     changing what type (point or range) of data is stored in each
3343     property based on how the user enters the data.
3344     (Classifier): Support for saving the new classifications and
3345     launching the dialog to edit a property.
3346     (SelectPropertiesDialog): New class for editing the visual
3347     properties of a classification (stroke color, width, and fill color)
3348     (ClassPreviewer): Took the Draw method from ClassRenderer and
3349     made most of it into this new class. Intend to use this class in
3350     the SelectPropertiesDialog for previewing changes.
3351    
3352     * Thuban/UI/renderer.py: Use new Color and Classification methods.
3353    
3354     * Thuban/UI/tree.py: Formatting changes.
3355    
3356     * Doc/thuban.dtd: Add 'label' element
3357    
3358     * Thuban/common.py: New. Contains common routines used throughout
3359     the code.
3360     (Str2Num): Takes a string and converts it to the "best" type of
3361     number.
3362    
3363 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
3364    
3365     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3366     dragging flag is always set to 0 even when the tool implementation
3367     raises an exception
3368    
3369 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
3370    
3371     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
3372     method to create a splash screen.
3373     (ThubanApplication.ShowMainWindow): New. Show the main window.
3374     Needed so the splash screen can display the mainwindow
3375     (ThubanApplication.OnInit): Call the
3376     new splash_screen method to determine whether the application
3377     should display a splash screen. If it displays a splash screen do
3378     not immediately show the main window.
3379    
3380 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
3381    
3382     * Thuban/Model/classification.py: Added import line to fix
3383     feature conflicts between running on python2.2 and python2.1.
3384    
3385     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
3386     onto the clinfo parameter, so removed the deepcopy().
3387    
3388 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
3389    
3390 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
3391 jonathan 396 Added element_open variable to track opening and closing of tags
3392     so that tags that don't span more than one line are closed with
3393     /> instead of </tag_name>. Use the GetDefault*() methods of
3394     the Classification class.
3395    
3396     * Thuban/Model/classification.py (Classificaton): Added set and
3397     get methods for the default data. The class also takes a layer
3398     reference so that modification messages can be sent. Fixed the
3399     methods to use the new ClassData class.
3400     (ClassData): New class to encapsulate the classification data
3401    
3402     * Thuban/Model/layer.py (Layer): Remove the
3403 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3404 jonathan 396 SetDefault*() methods on the layer's classification object.
3405 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
3406 jonathan 396 Classification class.
3407    
3408     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3409     object instead of a dictionary.
3410    
3411 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
3412 jonathan 396 draw the classifications in the dialog box's table.
3413     (Classifier): Modified to use the ClassRenderer class.
3414    
3415 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3416     methods of the Classification class.
3417 jonathan 396
3418     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
3419     of the ClassData class.
3420    
3421     * test/test_classification.py, test/test_layer.py,
3422     test/test_map.py, test/test_session.py: Fix the tests to work
3423     with the above code changes.
3424    
3425 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
3426    
3427     * Thuban/Model/classification.py (Classification): Added getNull()
3428     to return the NullData reference
3429    
3430     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
3431     Layer.SetStrokeWidth): Modified these functions to change the
3432     null data in the classification rather than keep these values
3433     directly in the Layer class. Menu options to change these values
3434     work again.
3435    
3436 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
3437    
3438 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3439 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
3440 jonathan 380 classification data.
3441    
3442 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
3443     Colors in the tree view.
3444    
3445     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
3446     the tree info for classifications. Commented out unnecessary lines.
3447    
3448     * Thuban/Model/classification.py (Classification.TreeInfo): New
3449     function to add information about the classification into the
3450     tree view.
3451    
3452 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
3453 jan 375
3454 tkoester 403 * Thuban/__init__.py (_): New.
3455 jan 375
3456     * Thuban/Model/classification.py, Thuban/Model/extension.py,
3457     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3458 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
3459     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
3460     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
3461     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
3462     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
3463     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
3464 jan 375
3465 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
3466    
3467 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
3468 jonathan 370
3469 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
3470     a layer classification. Supports specific data points and
3471     ranges.
3472 jonathan 370
3473 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
3474     information.
3475 jonathan 370
3476 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
3477     information.
3478 jonathan 370
3479 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
3480     specifying classification information.
3481 jonathan 370
3482 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
3483     dialog.
3484 jonathan 370
3485 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
3486     classification information.
3487 jonathan 370
3488 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
3489     classification data.
3490 jonathan 370
3491 tkoester 403 * test/test_classification: Tests for the Classification class.
3492 jonathan 370
3493 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
3494    
3495 bh 361 * test/test_command.py: New. Tests for the command classes.
3496    
3497 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
3498     (Command.IsTool): New method to distinguish between command
3499     switching tools and other commands.
3500    
3501     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
3502     the tool to avoid direct assignments to instance variables
3503     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
3504     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
3505     change the tool
3506    
3507     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
3508     active tool's command turns insensitive, disable the tool.
3509     (_tool_command): Use the new ToolCommand class
3510    
3511     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
3512     SelectTool method to change the tool
3513     (iconfile): Use the ToolCommand class
3514    
3515 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
3516    
3517     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
3518     the case of selected items that are not children of Layers or Maps
3519     properly. Previously this bug would trigger an assertion in
3520     wxWindows.
3521    
3522 frank 352 2002-11-06 Frank Koormann <[email protected]>
3523    
3524 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
3525     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
3526     Full Extent).
3527 tkoester 403
3528 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
3529    
3530     * setup.py (setup call): version now 0.1.3
3531    
3532     * MANIFEST.in: Add the files in test/
3533    
3534     * test/README: Add note about tests requiring the iceland data
3535    
3536     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
3537     copyright notice.
3538    
3539 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
3540    
3541     * test/test_map.py
3542     (TestMapWithContents.test_projected_bounding_box): Use an explicit
3543     epsilon.
3544    
3545     * test/support.py (FloatComparisonMixin.assertFloatEqual)
3546     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
3547     message if the assertion fails and don't return the return value
3548     of self.assert_. In assertFloatSeqEqual the return meant that not
3549     all items of the sequence were compared.
3550    
3551 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
3552    
3553 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
3554    
3555     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
3556    
3557 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
3558     the string with the bounding box on the fly because of platform
3559     differences in the way %g is handled.
3560    
3561     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
3562     DBFfile too because Thuban layers can't yet cope missing DBF
3563     files.
3564    
3565     2002-09-20 Bernhard Herzog <[email protected]>
3566    
3567 bh 326 * test/test_menu.py: Use initthuban instead of
3568     add_thuban_dir_to_path to initialize Thuban.
3569    
3570     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
3571     Mixin class for float comparisons
3572     (SubscriberMixin): New. Mixin class to test messages sent through
3573     the Connector class
3574    
3575     * test/README: Fix a typo and add the -v flag to the command for
3576     individual tests
3577    
3578 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
3579    
3580     * test/test_proj.py: New. Test cases for Thuban.Model.proj
3581    
3582     * test/test_map.py: New. Test cases for Thuban.Model.map
3583    
3584     * test/test_layer.py: New. Test cases for Thuban.Model.layer
3585    
3586     * test/test_label.py: New. Test cases for Thuban.Model.label
3587    
3588     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
3589    
3590     * test/test_color.py: New. Test cases for Thuban.Model.color
3591    
3592     * test/test_base.py: New. Test cases for Thuban.Model.base
3593    
3594 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
3595    
3596     * Thuban/Model/session.py (Session.forwarded_channels): Forward
3597     the CHANGED channel too.
3598    
3599     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
3600     CHANGED channel too.
3601     (Map.__init__): Call the Modifiable constructor as well.
3602    
3603     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
3604     event if the modified flag changes.
3605     (Modifiable.changed): Tweak the doc-string.
3606    
3607     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
3608     (MainWindow.set_position_text): Put the code that puts the text
3609     with the mouse position into the status bar into the new method
3610     set_position_text so that it can overwritten in derived classes.
3611    
3612 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
3613    
3614     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
3615     message box on the main window.
3616    
3617 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
3618    
3619     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
3620     the 'E' because it's less likely to interfere with other menu
3621     entries.
3622 bh 315 (MainWindow.build_menu): remove an incorrect comment.
3623 bh 313
3624 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
3625    
3626     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
3627     (_tool_command): Add sensitive parameter
3628     (_has_visible_map): Sensitivity callback to tools and other
3629     commands that require a visible map. Use it in map_zoom_in_tool,
3630     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
3631     and map_full_extent
3632    
3633 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
3634    
3635     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
3636     VIEW_POSITION
3637    
3638 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
3639 frank 306
3640     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
3641    
3642 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
3643    
3644 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
3645     wxWindows already and our implementation doesn't work correctly
3646     with wxGTK 2.3:
3647     (MapCanvas.__init__): Remove the instance variable
3648     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
3649     be drawin
3650     (MapCanvas.OnIdle): Removed.
3651    
3652 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
3653     a parameter to determine the size of the rectangle.
3654     (MapCanvas.find_shape_at): Create the box around the point on a
3655     layer by layer basis and make the size depend on the shape type.
3656     This solves a problem with the selection of point shapes at the
3657     border of the layer's bounding box
3658    
3659 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
3660    
3661 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
3662     for the sensitivity of remove layer.
3663     (_can_remove_layer): New. Sensitivity callback for remove layer
3664     (Command layer_remove): Use _can_remove_layer
3665    
3666     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
3667     determine whether a given layer can be deleted.
3668    
3669 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
3670     (MapCanvas.do_redraw): Get rid of the unused update_region
3671     instance variable
3672    
3673 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
3674    
3675 bh 292 * test/: new subdirectory with a bunch of unit tests.
3676    
3677     * test/README, test/test_table.py, test/test_save.py,
3678     test/test_menu.py, test/test_load.py: Initial set of tests and
3679     brief instructions on how to run them
3680    
3681 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
3682    
3683 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
3684     arcs with multiple parts.
3685    
3686 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
3687     Handle degenrate rectangles.
3688    
3689 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
3690     (Table.__init__): Keep track of whether the DBF is open for
3691     writing
3692     (Table.write_record): Open the DBF file for writing when necessary
3693    
3694 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
3695    
3696     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
3697     dbf files only for reading by default. Use a new writable dbf
3698     object for writing.
3699    
3700 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
3701    
3702 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
3703     (MainWindow.Context): New method to return a context
3704     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
3705     new method
3706    
3707 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
3708     layer table specific code from TableGrid into LayerTableGrid
3709     (TableFrame, LayerTableFrame): Split the layer table specific code
3710     from TableFrame into LayerTableFrame
3711 bh 280 (LayerTableGrid.select_shape): Remove a debug print
3712 bh 278
3713     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
3714     LayerTableFrame
3715    
3716 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
3717    
3718     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
3719     absolute filename.
3720    
3721 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
3722    
3723 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
3724     records.
3725 tkoester 403 (Table.__init__): Open the DBF file for writing too.
3726 bh 275
3727     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
3728     into the underlying table.
3729    
3730     * extensions/shapelib/shapefil.h (DBFCommit),
3731     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
3732     commit any changes made to the DBF file.
3733    
3734 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
3735     (_tool_command): Put the code that generates the "checked"
3736     callback into a separate function so that we can reuse it
3737     elsewhere
3738    
3739 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
3740     session into an XML file. The main reason to introduce a class is
3741     that applications built on Thuban can derive from it so that they
3742     can save additional information in a session file.
3743     (save_session): Delegate almost all the work to the Saver class.
3744     Rename the filename argument to file because it may be a file like
3745     object now.
3746    
3747     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
3748     code. Remove the little test code which would be executed when the
3749     module is run as a script which didn't work anymore since it can't
3750     import the other Thuban modules.
3751     (ProcessSession, load_session): Refactor the ProcessSession to
3752     have one method for each element start and end tag so that derived
3753     classes can easily override the processing of individual tags.
3754     Also, always parse with namespaces enabled because applications
3755     built on top of Thuban will likely use namespaces if they extend
3756     the session file format.
3757    
3758 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
3759    
3760     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
3761     because thubaninit_contents will do it for us.
3762    
3763 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
3764 jan 265
3765     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3766     tree window already open
3767    
3768 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
3769    
3770 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
3771     with self.
3772    
3773     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
3774     when we have actually captured it.
3775    
3776 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
3777     shapefile and destroy the table.
3778    
3779     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
3780    
3781 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
3782    
3783 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
3784     instance variable columns
3785     (RecordTable.GetTypeName): row and col may be negative in some
3786     cases.
3787    
3788 bh 254 * setup.py (InstallLocal.initialize_options)
3789     (InstallLocal.finalize_options, InstallLocal.user_options): New
3790     option create-init-file to build a thubaninit.py when running
3791     install_local
3792     (InstallLocal.run): Create the thubaninit.py module when requested
3793     (thubaninit_contents): Split the template into several parts and
3794     create a new function thubaninit_contents that creates the
3795     contents of a thubaninit module.
3796     (ThubanInstall.run): Use the new function to create the thubaninit
3797     module.
3798    
3799 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
3800    
3801     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
3802     cleanup.
3803     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
3804    
3805     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
3806     direct base class' Destroy method.
3807    
3808     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
3809     layers.
3810     (Map.Destroy): Destroy the label_layer as well and call the
3811     inherited Desatroymethod first so that no more messages are
3812     issued.
3813     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
3814     message if the stacking order actually has changed. Add
3815     doc-strings.
3816     (Map.BoundingBox): Correct the doc-string.
3817     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
3818     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
3819    
3820     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
3821     all labels.
3822    
3823 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
3824    
3825     * Thuban/Model/map.py (Map.subscribe_layer_channels)
3826     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
3827     to a layer's channels into separate methods.
3828     (Map.RemoveLayer, Map.AddLayer): Call the new methods
3829     (Map.Destroy): Unsubscribe from a layer's channels before
3830     destroying it.
3831    
3832     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
3833     selected_layer parameter to searched_layer which is the layer to
3834     search in.
3835     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
3836     search to that layer. Return the selected layer and shape.
3837    
3838     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
3839     typo
3840    
3841 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
3842    
3843 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
3844     Extend the doc string.
3845     (ThubanApplication.subscribe_session)
3846     (ThubanApplication.unsubscribe_session): New methods to
3847     subscribe/unsubscribe to/from session channels.
3848     (ThubanApplication.SetSession): Call the new methods here.
3849     (ThubanApplication.maps_changed, ThubanApplication.set_map):
3850     Renamed set_map to maps_changed. Its now a subscriber for
3851     MAPS_CHANGED.
3852    
3853     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
3854     x-coordinate in case of simple clicks
3855    
3856     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
3857     don't pass it as a parameter
3858    
3859     * Thuban/Model/session.py (Session.RemoveMap): New
3860    
3861 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
3862     window size into a parameter.
3863    
3864 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
3865    
3866 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
3867     just commands.
3868    
3869 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
3870     parameter list a bit to allow setting the window title and the
3871     initial message in the status bar. Update the callers.
3872    
3873     * Thuban/UI/application.py (ThubanApplication.OnInit)
3874     (ThubanApplication.CreateMainWindow): Put the mainwindow
3875     instantiation into a separate method so that it can be overridden
3876     by a subclass.
3877    
3878 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
3879    
3880 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
3881     another changed message is issued to make it easier to get
3882     notified of changes.
3883     (Session): Update the doc string
3884     (Session.forward): Issue changed-events as CHANGED as well.
3885     (Session.changed): Overwrite the inherited version to issue
3886     CHANGED events as well.
3887    
3888     * Thuban/UI/tree.py: We can now simply subscribe to the session's
3889     CHANGED channel to be informed of changes.
3890     (SessionTreeCtrl.session_channels): Not needed any longer.
3891 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
3892 bh 234 Only have to (un)subscribe CHANGED
3893    
3894     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
3895    
3896 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
3897     for the wxPython locale bug to __init__.py so that it's
3898     automatically executed by anybody using UI code from Thuban.
3899    
3900 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
3901    
3902 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
3903    
3904     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
3905     as parameter and store it in an instance variable
3906     (MainWindow.invoke_command, MainWindow.update_command_ui)
3907     (MainWindow.save_modified_session, MainWindow.NewSession)
3908     (MainWindow.OpenSession, MainWindow.SaveSession)
3909     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
3910     application object.
3911    
3912     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
3913     the main window with self.
3914    
3915 bh 225 * Thuban/UI/context.py: New module with the context class
3916    
3917     * Thuban/UI/command.py (Command): Update doc string.
3918    
3919     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
3920     MainWindow.update_command_ui): Pass an instance of the context
3921     class to the command's methods
3922     (check_current_tool, call_method): Handle the new context
3923     implementation
3924    
3925     * Examples/simple_extensions/simple_tool.py (simple_tool,
3926     check_simple_tool): Handle the new context implementation
3927    
3928     * Examples/simple_extensions/simple_command.py (simple_command):
3929     Handle the new context implementation. Update the comments about
3930     the context.
3931    
3932     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
3933     doc-string
3934     (ThubanApplication.Session): New method to return the session
3935     object
3936    
3937     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
3938     interactor's selected_layer may not be a layer of the current
3939     session when the tree is updated while a new session is being set.
3940    
3941 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
3942    
3943     * Thuban/UI/tree.py (color_string): Removed. No longer used.
3944     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
3945     update_tree into update_tree and add_items. The tree now uses a
3946     more generic way to display the contents of the tree.
3947     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
3948    
3949     * Thuban/Model/layer.py (Layer.TreeInfo),
3950     Thuban/Model/extension.py (Extension.TreeInfo),
3951     Thuban/Model/map.py (Map.TreeInfo),
3952 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
3953 bh 217 Add TreeInfo methods to implement the new tree view update scheme
3954    
3955 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
3956    
3957     * Thuban/UI/application.py: Don't use "import from" for the
3958     MainWindow. It can't always be resolved.
3959     (ThubanApplication.OnInit): change reference to MainWindow
3960     accordingly.
3961    
3962     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
3963     completely
3964    
3965 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
3966    
3967     * setup.py (create_init_module): New configurable variable whose
3968     default depends on the platform we're running on.
3969     (ThubanInstall.initialize_options): Initialize
3970     self.create_init_module from the global create_init_module
3971     (ThubanInstall.user_options): indictate that the options
3972     create-init-module and init-module-dir have arguments.
3973    
3974     * setup.py: In the setup call change the version number to include
3975     cvs.
3976    
3977     * MANIFEST.in: Add the files in Examples
3978    
3979 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
3980    
3981 bh 210 * setup.py: In the setup call, use the thuban homepage as the
3982     value of the url parameter.
3983    
3984 bh 208 * Examples: New subdirectory for examples.
3985    
3986     * Examples/simple_extensions/simple_tool.xpm,
3987     Examples/simple_extensions/simple_tool.py,
3988     Examples/simple_extensions/simple_command.py,
3989     Examples/simple_extensions/README: Simple examples showing how to
3990     add new commands and tools.
3991    
3992 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
3993     bdist_rpm that we also have an install script.
3994     (bdist_inno): Add 2002 to the copyright notice.
3995    
3996 bh 205 * setup.py: Create a file in python's site-packages directory to
3997     make installation of Thuban as a library easier.
3998     (ThubanInstall.user_options): Add two new options,
3999     create-init-module and init-module-dir
4000     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
4001     filenames for installation in the default directories.
4002     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
4003     the inherited methods to capture some filenames before they're
4004     transformed too much by distutils.
4005     (ThubanInstall.run): Create the init module if requested.
4006     (ThubanInstall.thuban_init_filename): New method to return the
4007     full name of the init module.
4008     (ThubanInstall.get_outputs): Append the filename of the init
4009     module.
4010    
4011 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
4012    
4013 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
4014     handle the prefix properly which means that the default for the
4015     installation prefix should be /usr for RPMs and /usr/local when
4016     doing a normal source install.
4017     (bdist_rpm_install_script): Script to override the default install
4018     commands in the specfile generated by the bdist_rpm command.
4019     (thuban_bdist_rpm.user_options): Add a prefix option
4020     (thuban_bdist_rpm.initialize_options): Init the prefix option.
4021     Create the script files for the spec files as empty files here
4022     (thuban_bdist_rpm._make_spec_file): Override the inherited method
4023     to fill the script files with content.
4024    
4025 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
4026     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
4027     argument. save_session now automatically uses this version,
4028     solving a problem when saving to a relative filename.
4029    
4030     * setup.py: In the setup call, make sure that the library
4031     directories are under $prefix/lib not directly under $prefix.
4032    
4033 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
4034 jan 199
4035     * Thuban/Model/extension.py: new module to handle extension objects.
4036     * Thuban/Model/messages.py: new messages for extensions.
4037     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
4038     Session.AddExtension): new for handling extensions.
4039     Also some other minor changes to round up extension handling.
4040     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
4041     of Extension titles and title and names of its objects.
4042    
4043 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
4044    
4045     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
4046 bh 202 the events for a command.
4047 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
4048     Call bind_command_events to bind the events. add_toolbar_command
4049     can now bind events too so that it's possible to have commands
4050     that are only available through the toolbar.
4051     (MainWindow.init_ids): New instance variable events_bound to keep
4052     track of for which commands events have been bound.
4053    
4054 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
4055    
4056     * Thuban/UI/menu.py: New module to build and manage menus.
4057    
4058     * Thuban/UI/mainwindow.py: Remove some unused imports.
4059     (MainWindow.__init__, main_menu): move the definition of the main
4060     menu from __init__ to the Menu instance main_menu.
4061     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
4062     build the menu bar and sub-menus from a menu description.
4063    
4064     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
4065     startup file
4066     (ThubanApplication.read_startup_files): New method to run
4067     ~/.thuban/thubanstart.py
4068    
4069 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
4070     Move the toolbar definition to the Menu instance main_toolbar.
4071     (MainWindow.build_toolbar): New method to build the toolbar
4072     similar to the build_menu methods
4073    
4074 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
4075    
4076 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
4077     layer_outline_color. Fix it in the definition of the command too.
4078    
4079 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
4080    
4081 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
4082    
4083     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
4084     in the docstring
4085    
4086 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
4087    
4088 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
4089     when the shapefile is empty.
4090     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
4091     now return None for empty shapefiles. Update doc-strings.
4092    
4093     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
4094     the layer's bbox being None.
4095    
4096     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
4097     layer's bbox being None.
4098    
4099 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
4100     necessary.
4101     (MapCanvas.__init__): New instance variables, last_selected_layer
4102     and last_selected_shape to determine how the selection has
4103     changed.
4104    
4105     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
4106     AutoSizeColumns because it will cause a traversal of the entire
4107     table which for large .dbf files will take a very long time.
4108    
4109 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
4110    
4111     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
4112     maximum depth for the tree than shapelib does by default.
4113    
4114 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
4115    
4116     * setup.py (py_modules): The shptree modules doesn't have a
4117     wrapper, so don't include it in the py_modules
4118    
4119 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
4120    
4121     * extensions/shapelib/shptree.c (compare_ints): Make arguments
4122     const void * as in the qsort prototype
4123     (SHPTreeFindLikelyShapes): Remove some unused variables.
4124    
4125     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
4126     maintains to redraw the window during a drag.
4127     (MapCanvas.unprojected_rect_around_point): New method to determine
4128     a small region around a point for hit-testing.
4129     (MapCanvas.find_shape_at): Only test the shapes in a small region
4130     around the point.
4131    
4132     * setup.py: Increment the version to 0.1.2
4133    
4134     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
4135     debug print and set session to None after unsubscribing
4136    
4137 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
4138    
4139 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
4140     the file to have a .thuban extension.
4141    
4142 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
4143     all the session channels to subscribe to to update the tree
4144     (SessionTreeCtrl.session_changed): Remember the session so that we
4145     can unsubscribe properly. Use the new class constant to
4146     unsubscribe from the old session and subscribe to the new one.
4147     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
4148     subscriptions of the SessionTreeCtrl.
4149     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
4150    
4151     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
4152     Session Tree" command to the file menu.
4153    
4154     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
4155     as update_region to the renderer.
4156    
4157     * Thuban/UI/renderer.py
4158     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
4159     update box is now directly a tuple, not a wxRect anymore.
4160    
4161     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
4162     prints.
4163    
4164     2002-05-07 Bernhard Herzog <[email protected]>
4165    
4166 bh 146 * setup.py: Add the shptree extension module. See
4167     extensions/pyshapelib/ChangeLog for more details.
4168    
4169     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
4170     extensions/shapelib/dbfopen.c: Really update to the versions of
4171     shapelib 1.2.9. For some reason it wasn't really done on
4172     2002-04-11.
4173    
4174     * extensions/shapelib/shptree.c: Modified version of shptree.c of
4175     shapelib 1.2.9. The only real difference is the use of qsort
4176     instead of a bubble sort implementation
4177    
4178     * Thuban/Model/layer.py (Layer.__init__): New instance variable
4179     shapetree to hold the shapelib quadtree for the shapefile
4180     (Layer.open_shapefile): Create the quad tree.
4181     (Layer.ShapesInRegion): New method to return the ids of shapes in
4182     a given region using the quad tree.
4183    
4184     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
4185     comment
4186     (draw_polygon_shape): Accept both arcs and polygons.
4187     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
4188     the api.
4189    
4190     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
4191     return the shape ids to be rendered in a given layer.
4192     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
4193     ids. Use draw_polygon_shape to draw arc shapes as well.
4194     (ScreenRenderer.RenderMap): New parameter for the rectangle that
4195     has to be updated
4196     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
4197     calling it's ShapesInRegion method.
4198    
4199     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4200     update_region for the update region.
4201     (MapCanvas.OnPaint): Maintain the update region
4202     (MapCanvas.do_redraw): Pass the bounding box of the update_region
4203     to the renderer when drawing the bitmap. Reset the update_region.
4204    
4205 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
4206    
4207 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
4208     MainWindow.OpenSession): Change the file extension of the session
4209     files to .thuban
4210    
4211 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
4212     Move the map channels to be forwarded by the session into the
4213 bh 146 class constant with forwarded_channels. Also add
4214     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
4215     forwarded_channels
4216 bh 129
4217     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
4218     typo and some rewording).
4219    
4220 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
4221    
4222     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
4223     around to speed up most redraws:
4224     (MapCanvas.__init__): New instance variable bitmap which holds the
4225     bitmap
4226     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
4227     self.bitmap to draw.
4228     (MapCanvas.full_redraw): New method to force a full redraw
4229     including the bitmap
4230     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
4231     make sure the bitmap is redrawn.
4232     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
4233     MapCanvas.shape_selected): Call full_redraw instead of readraw to
4234     make sure the bitmap is redrawn.
4235     (MapCanvas.OnSize): New method to handle size events so that the
4236     bitmap can be redrawn.
4237    
4238 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
4239    
4240     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4241     canvas' VIEW_POSITION event
4242     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
4243     Update the text in the status-bar accordingly.
4244    
4245     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
4246     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
4247     called.
4248     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
4249     current_position
4250     (MapCanvas.set_current_position): New method to set
4251     current_position. Issue a VIEW_POSITION event
4252     (MapCanvas.CurrentPosition): New public method to return the value
4253     of current_position. Should be called when the VIEW_POSITION event
4254     is processed.
4255     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
4256     Update the position.
4257     (MapCanvas.OnLeaveWindow): Set the position to None.
4258    
4259     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
4260     position in the statusbar
4261    
4262 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
4263 frank 120
4264     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
4265    
4266 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
4267    
4268 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
4269    
4270     * Resources/Bitmaps/fullextent.xpm: new
4271 jan 116
4272 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
4273 jan 116
4274 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
4275     box
4276 jan 114
4277 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
4278    
4279 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
4280    
4281     * Thuban/UI/tree.py (update_tree): added added map extent
4282    
4283     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
4284 tkoester 403 icon; added map_full_extend as tool
4285 jan 114
4286 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
4287 jan 107
4288     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
4289     saving _new_ sessions
4290    
4291     * Thuban/Model/session.py (create_empty_session): new session
4292     don't have a filename (set to None)
4293    
4294     * Thuban/UI/tree.py (update_tree): added filename and modified flag
4295    
4296     * Thuban/Model/load.py (ProcessSession): convert projection
4297     parameters from unicode to regular string
4298    
4299     * Data/iceland_sample.session: Added UTM Zone 26 projection.
4300    
4301 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
4302    
4303     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
4304     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
4305     1.2.9
4306    
4307     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
4308     the pyshapelib directoy into the list of include dirs, so that
4309     pyshapelib_api.h can be found.
4310    
4311     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
4312     holds the pyshapelib C-API
4313     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
4314     pyshapelib_api to access the shapelib functions.
4315     (initwxproj): Import the c_api from the shapelib module and
4316     initialize pyshapelib_api.
4317    
4318 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
4319    
4320 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
4321     initialize_options to create the scripts for the rpm.
4322    
4323 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
4324    
4325 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
4326    
4327 bh 87 * setup.py: Increment version to 0.1.1
4328    
4329 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
4330     Layer" and "Remove Layer" commands from the layer menu to the map
4331     menu
4332    
4333 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
4334    
4335     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
4336     argument (python <= 1.5.2 erroneously accepted multiuple
4337     arguments)
4338    
4339 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
4340    
4341     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
4342     RecordGrid in the identifyview.
4343     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
4344     IdentifyListCtrl. The grid allows editing of the values.
4345    
4346     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
4347     implementing a grid for a single row of a thuban table.
4348    
4349     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
4350     layers by default. Easier to use than the previous default of only
4351     searching through the select layer which meant that if no layer
4352     was selected, you couldn't select a shape.
4353    
4354     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
4355    
4356     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
4357     stroke_width attribute
4358    
4359     * Thuban/Model/save.py (save_session): Write the new stroke_width
4360     attribute
4361    
4362     * Thuban/Model/load.py (ProcessSession.startElement): Read the
4363     stroke_width attribute
4364    
4365     * Thuban/Model/layer.py (Layer.__init__): New parameter and
4366     instance variable stroke_width
4367     (Layer.SetStrokeWidth): Set the stroke_width.
4368    
4369 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
4370    
4371     * extensions/thuban/wxproj.cpp (project_points): Fix two
4372     off-by-one errors in the last loop that joins the various parts
4373     together.
4374    
4375 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
4376    
4377     * setup.py (data_dist.make_distribution): Fix some typos
4378    
4379 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
4380    
4381     * README: Slight tweaking in preparation for the 0.1 release
4382    
4383     * setup.cfg: Add section for sdist to create both tgz and zip
4384     archives
4385    
4386     * setup.py: increase version number to 0.1
4387     (data_dist): New command class for data distribution
4388    
4389 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
4390    
4391 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
4392     Handle the case of no layer (i.e. layer is None) properly.
4393    
4394 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
4395 bh 70 Set the initial selection of the combo boxes to reflect the
4396     projection we're starting with in a way that works on windows,
4397     too.
4398    
4399 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
4400     puiblisher's ids in hex to make it easier to compare them to the
4401     standard repr of python methods
4402    
4403     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
4404     messages
4405    
4406 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
4407    
4408 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
4409     deselect the layer if no layer is selected
4410    
4411 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
4412     idle time when there actually is something to draw. If there's
4413     nothing to draw simply clear the window
4414     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
4415     (MapCanvas.SetMap): force a redraw in all cases because
4416     FitMapToWindow doesn't always do it.
4417     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
4418     specify the point to move into the center of the window
4419     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
4420     dragged, zoon in/out by a factor of 2
4421 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
4422     index, i.e. reversed drawing order) so that objects appearing to
4423     be in from of others are selected first. This is probably mostly
4424     relevant for point shapes where the symbols used may overlap
4425 bh 59
4426     * Thuban/Model/session.py (create_empty_session): Unset the
4427     modified bit before returning it
4428    
4429     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
4430     create_empty_session session to create the new, empty session.
4431    
4432     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
4433     the tool bitmaps.
4434     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
4435     the code that asks whether the session should be saved into the
4436     new method save_modified_session.
4437     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
4438     method to save modified session here too.
4439    
4440 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
4441    
4442     * setup.py (InnoIconItem): fix typo
4443    
4444     (thuban_bdist_inno.run):
4445     (bdist_inno.run): Move the decision not to create symlinks on
4446     non-nt platforms to thuban_bdist_inno and do it unconditinally
4447     since we never want to create the symlinks here
4448    
4449 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
4450    
4451 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
4452     identify view immediately
4453    
4454     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
4455     and SelectableRecordListCtrl that implement the code shared by the
4456     identify view and the label dialog
4457    
4458     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
4459     new class RecordListCtrl
4460    
4461     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
4462     return value of GetValue is None instead of using it as a boolean
4463     directly so that Zero numbers are handled properly.
4464     (LabelListCtrl): Derive from the new class
4465     SelectableRecordListCtrl
4466    
4467 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
4468     (Proj4Dialog.dialogLayout): Make the window resizable and set the
4469     size of the text control explicitly to make the sizers work on
4470     both Windows and X.
4471    
4472 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
4473    
4474     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
4475     that can limit the search to the currently selected layer.
4476     (MapCanvas.SelectShapeAt): Make sure that the currently selected
4477     layer stays selected even when no shape is found
4478 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
4479     height do nothing (avoids zero division errors)
4480 bh 44
4481 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
4482    
4483 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
4484     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
4485     convenient :-)
4486     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
4487     a new instvar layer_to_item to map layers to tree items
4488     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
4489     to match the current selection in the interactor
4490    
4491 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
4492     (Interactor.HasSelectedLayer): New methods to query the current
4493     selection
4494    
4495     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
4496     (MainWindow.has_selected_layer): Simply call the appropriate
4497     interactor method
4498    
4499     * Thuban/UI/mainwindow.py (MainWindow.__init__):
4500     (MainWindow.LayerShowTable):
4501     (MainWindow.identify_view_on_demand): Store the interactor in an
4502     instvar and use that reference instead of going through main.app
4503    
4504 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
4505     * Thuban/UI/application.py (ThubanApplication.OnInit):
4506 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
4507     with the new mainwindow method ShowSessionTree and not directly
4508     the application's OnInit method
4509    
4510     * Thuban/UI/tree.py (myTreeCtrlPanel):
4511     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
4512     TreeCtrl isntead of a panel. This affects most method since we now
4513     refer to self instead of self.tree
4514     (SessionTreeView): New class implementing a non-modal dialog
4515     showing the session tree.
4516    
4517 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
4518     layer to the tableview dialog.
4519    
4520     * Thuban/UI/tableview.py: Add some doc-strings
4521 tkoester 403 (TableGrid):
4522 bh 35 (TableGrid.OnRangeSelect):
4523     (TableGrid.OnSelectCell):
4524     (TableFrame.__init__):
4525     (TableFrame.row_selected):
4526     Selecting rows in the grid view now updates the selected shapes
4527     through the TableFrame. To achieve this we derive TableGrid from
4528     Publisher and introduce the message type ROW_SELECTED which the
4529     TableFrame subscribes to and which is issued by OnRangeSelect and
4530     OnSelectCell
4531    
4532     (DataTable.SelectRow): Removed because it's no longer needed in
4533     the row/shape selection scheme
4534    
4535 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
4536     dialogs
4537    
4538     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
4539     the SELECTED_SHAPE message anymore. This is now handled by the
4540     parent.
4541     (TableGrid.select_shape): Only update the selection if the shape
4542     is not None.
4543     (TableFrame): Inherit from the new NonModalDialog class.
4544     (TableFrame.__init__, TableFrame.select_shape): Handle the
4545     SELECT_SHAPE message.
4546     (TableFrame.OnClose): Extend the inherited method to unsubscribe
4547     SELECT_SHAPE
4548    
4549     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
4550     (MainWindow.add_dialog):
4551     (MainWindow.dialog_open):
4552     (MainWindow.remove_dialog):
4553     (MainWindow.get_open_dialog): New methods to maintain a dictionary
4554     of opened non-modal dialogs.
4555    
4556     (MainWindow.__init__): Initialize the new non-modal dictionary
4557     management code
4558     (MainWindow.LayerShowTable): maintain separate dialogs for each
4559     table using the non-modal dialog management code to only open a
4560     view once for each table.
4561    
4562     (MainWindow.IdentifyTool):
4563     (MainWindow.__init__):
4564     (MainWindow.identify_view_on_demand): Don't open the identify view
4565     in IdentifyTool anymore. This will be done automatically by the
4566     new method identify_view_on_demand which handles the
4567     SELECTED_SHAPE message so that the identify view will be opened on
4568     demand
4569    
4570     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
4571     the interactor argument. The SELECTED_SHAPE message is now handled
4572     by the parent.
4573     (IdentifyView.__init__): Add the interactor argument so that we
4574     can handle the SELECTED_SHAPE message here
4575     (IdentifyView.selected_shape): New method to handle the
4576     SELECTED_SHAPE messages
4577    
4578     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
4579     NonModalDialog class
4580     (IdentifyView.OnClose): Extend the inherited version to
4581     unsubscribe SELECT_SHAPE
4582    
4583     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
4584    
4585 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
4586    
4587     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
4588 tkoester 403
4589 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
4590     interactor to pass through to the MapCanvas
4591 tkoester 403
4592 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
4593     argument to the MainWindow constructor to get rid of the ugly hack
4594     that made main.app available early just so that the mapcanvas
4595     could access the interactor object.
4596    
4597 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
4598    
4599 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
4600     that runs a modal message box
4601     (MainWindow.OnClose): Use the new method
4602     (MainWindow.RemoveLayer): Just do nothing in case no layer is
4603     selected. The command should be grayed out anyway, so there's no
4604     need to pop up a message box.
4605     (MainWindow.AddLayer): Pop up a message box with an error message
4606     if the shape file can't be opened
4607    
4608     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
4609     immediately. This will cause an exception in case the file can't
4610     be opened and we can display an appropriate message.
4611    
4612 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
4613    
4614     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
4615     specific bdist_rpm command.
4616    
4617     * Thuban/UI/main.py: Catch ImportError exceptions when importing
4618     the locale module because it may not be available on some
4619     installations.
4620    
4621     * extensions/pyprojection/LICENSE: Copy of the license text in
4622     Projection.i. Having it in a separate file makes it easier to
4623     refer to license text in e.g. RPMs
4624    
4625 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
4626    
4627 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
4628     more generic
4629    
4630     * setup.py (ThubanInstall.get_outputs): Add the symlink in
4631     <prefix>/bin to the outputs
4632     (ThubanInstall.link_file): New method to link files. We need this
4633     because the standard copy_files refuses to link non-existing
4634     files.
4635     (ThubanInstall.run): Remove the leading install root from the
4636     script filename if an install root was specified and use the new
4637     link_file method
4638 tkoester 403
4639 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
4640     the window when the first layer is added to the map.
4641    
4642     * setup.py (ThubanInstall.run): Honor the build root (self.root)
4643     when linking thuban.py to <prefix>/bin
4644    
4645 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
4646    
4647     * setup.py: In the setup call, the install parameters shouldn't
4648     have trailing slashes because distutils on non-posix platforms
4649     doesn't like that. The same applies to other directories like
4650     "Resources/Bitmaps"
4651    
4652     In the configuration section for nt, move the wxWindows directory
4653     optins into the part clearly marked as editable.
4654    
4655     (InstallLocal.initialize_options):
4656     (InstallLocal.user_options): remove the currently unused debug
4657     flag
4658     (thuban_build_py.find_all_modules): Add this method so that it
4659     works for our case of having packages and modules in one
4660     distribution as well.
4661     (ThubanInstall.initialize_options):
4662     (ThubanInstall.finalize_options):
4663     (ThubanInstall.user_options):
4664     (ThubanInstall.boolean_options): Add new options, do-symlink and
4665     extra files. Since these are the first ThubanInstall specific
4666     options, override user_options and boolean_options
4667     (ThubanInstall.run): Honor the new do-symlink and extra-files
4668     options.
4669     (ThubanInstall.get_outputs): Add to override the base-class's
4670     version and add the extra-files to the outputs
4671     (bdist_inno): New class for windows distributions with Inno Setup
4672     (InnoIconItem): Helper class for bdist_inno
4673     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
4674     this together with the appropriate parameters, to the setup call.
4675 tkoester 403
4676 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
4677     installer
4678    
4679     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
4680     changing_selection to avoid recursive selection events when
4681     modifying the selection in response to a selection event.
4682     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
4683     changing the tree's selection.
4684     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
4685     we're not being called indirectly from normalize_selection.
4686    
4687     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
4688     event.Check only if the command is actuall checkable.
4689     (MainWindow.__init__): Call the toolbar's Realize method to make
4690     sure that the items are actually shown
4691    
4692 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
4693    
4694 bh 9 * setup.py: Fix some doc strings
4695    
4696 bh 7 * ChangeLog: started
4697    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26