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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1586 - (hide annotations)
Fri Aug 15 10:27:06 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 251194 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26