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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.55  
changed lines
  Added in v.1571

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26