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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1548 - (hide annotations)
Tue Aug 5 12:39:16 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 243075 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26