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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26