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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1584 - (hide annotations)
Tue Aug 12 16:13:59 2003 UTC (21 years, 6 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 250746 byte(s)
update of about-info

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26