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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1201 - (hide annotations)
Fri Jun 13 15:05:01 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 184164 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26