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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1175 - (hide annotations)
Thu Jun 12 13:37:39 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 179839 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26