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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1220 - (hide annotations)
Mon Jun 16 17:43:09 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 187644 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26