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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1565 - (hide annotations)
Thu Aug 7 19:20:05 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 248755 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26